blob: 31cc8ff4b3d21d9da9f568664926c42f1edca4e0 [file] [log] [blame]
martin f. krafftf37f0682013-06-14 16:36:20 +02001#
2# -*- coding: utf-8 -*-
3#
4# This file is part of reclass (http://github.com/madduck/reclass)
5#
martin f. krafft1ba35c52014-01-02 11:10:58 +13006# Copyright © 2007–14 martin f. krafft <madduck@madduck.net>
martin f. krafftf37f0682013-06-14 16:36:20 +02007# Released under the terms of the Artistic Licence 2.0
8#
martin f. krafft7c64f9c2013-06-25 13:26:23 +02009from reclass import datatypes
martin f. krafftf37f0682013-06-14 16:36:20 +020010import yaml
martin f. krafft729481c2013-06-24 12:24:49 +020011import os
martin f. krafft90015d02013-06-26 18:44:02 +020012from reclass.errors import NotFoundError
martin f. krafftf37f0682013-06-14 16:36:20 +020013
Andrew Pickford71ec18b2017-04-13 13:09:30 +020014class YamlData(object):
martin f. krafftf37f0682013-06-14 16:36:20 +020015
Andrew Pickford71ec18b2017-04-13 13:09:30 +020016 @classmethod
17 def from_file(cls, path):
18 ''' Initialise yaml data from a local file '''
Andrew Pickford2224af42017-08-06 09:12:21 +020019 abs_path = os.path.abspath(path)
20 if not os.path.isfile(abs_path):
21 raise NotFoundError('No such file: %s' % abs_path)
22 if not os.access(abs_path, os.R_OK):
23 raise NotFoundError('Cannot open: %s' % abs_path)
24 y = cls('yaml_fs://{0}'.format(abs_path))
25 fp = file(abs_path)
martin f. krafft00e6a812013-06-15 15:40:41 +020026 data = yaml.safe_load(fp)
27 if data is not None:
Andrew Pickford71ec18b2017-04-13 13:09:30 +020028 y._data = data
martin f. krafftf37f0682013-06-14 16:36:20 +020029 fp.close()
Andrew Pickford71ec18b2017-04-13 13:09:30 +020030 return y
31
32 @classmethod
33 def from_string(cls, string, uri):
34 ''' Initialise yaml data from a string '''
35 y = cls(uri)
36 data = yaml.safe_load(string)
37 if data is not None:
38 y._data = data
39 return y
40
41 def __init__(self, uri):
42 self._uri = uri
43 self._data = dict()
44
45 uri = property(lambda self: self._uri)
martin f. krafftf37f0682013-06-14 16:36:20 +020046
Andrew Pickford10a167c2017-03-18 19:25:47 +010047 def get_data(self):
48 return self._data
49
Andrew Pickford3b3681b2017-04-16 11:53:24 +020050 def get_entity(self, name=None):
Andrew Pickford2224af42017-08-06 09:12:21 +020051 if name is None:
52 name = self._uri
53
martin f. kraffte497b752013-06-16 14:15:11 +020054 classes = self._data.get('classes')
55 if classes is None:
56 classes = []
57 classes = datatypes.Classes(classes)
58
59 applications = self._data.get('applications')
60 if applications is None:
61 applications = []
62 applications = datatypes.Applications(applications)
63
64 parameters = self._data.get('parameters')
65 if parameters is None:
66 parameters = {}
Andrew Pickford2224af42017-08-06 09:12:21 +020067 parameters = datatypes.Parameters(parameters, uri=self._uri)
martin f. kraffte497b752013-06-16 14:15:11 +020068
Andrew Pickford89404022017-03-18 11:24:47 +010069 exports = self._data.get('exports')
70 if exports is None:
71 exports = {}
Andrew Pickford2224af42017-08-06 09:12:21 +020072 exports = datatypes.Exports(exports, uri=self._uri)
martin f. krafft37b56b62013-12-10 16:04:52 +010073
Andrew Pickford3b3681b2017-04-16 11:53:24 +020074 env = self._data.get('environment', None)
Andrew Pickford10a167c2017-03-18 19:25:47 +010075
Andrew Pickford89404022017-03-18 11:24:47 +010076 return datatypes.Entity(classes, applications, parameters, exports,
Andrew Pickford71ec18b2017-04-13 13:09:30 +020077 name=name, environment=env, uri=self.uri)
martin f. krafftf37f0682013-06-14 16:36:20 +020078
Andrew Pickford8980ad92017-04-18 11:18:18 +020079 def __str__(self):
80 return '<{0} {1}, {2}>'.format(self.__class__.__name__, self._uri,
81 self._data)
82
martin f. krafftf37f0682013-06-14 16:36:20 +020083 def __repr__(self):
Andrew Pickford8980ad92017-04-18 11:18:18 +020084 return '<{0} {1}, {2}>'.format(self.__class__.__name__, self._uri,
martin f. krafftf37f0682013-06-14 16:36:20 +020085 self._data.keys())