blob: 8d8363ad8b7ee1b0eca46f09ab62262b43d2f066 [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 '''
martin f. krafft90015d02013-06-26 18:44:02 +020019 if not os.path.isfile(path):
martin f. krafftc43c60d2013-07-04 16:08:23 +020020 raise NotFoundError('No such file: %s' % path)
martin f. krafft90015d02013-06-26 18:44:02 +020021 if not os.access(path, os.R_OK):
martin f. krafftc43c60d2013-07-04 16:08:23 +020022 raise NotFoundError('Cannot open: %s' % path)
Andrew Pickford71ec18b2017-04-13 13:09:30 +020023 y = cls('yaml_fs://{0}'.format(path))
24 fp = file(path)
martin f. krafft00e6a812013-06-15 15:40:41 +020025 data = yaml.safe_load(fp)
26 if data is not None:
Andrew Pickford71ec18b2017-04-13 13:09:30 +020027 y._data = data
martin f. krafftf37f0682013-06-14 16:36:20 +020028 fp.close()
Andrew Pickford71ec18b2017-04-13 13:09:30 +020029 return y
30
31 @classmethod
32 def from_string(cls, string, uri):
33 ''' Initialise yaml data from a string '''
34 y = cls(uri)
35 data = yaml.safe_load(string)
36 if data is not None:
37 y._data = data
38 return y
39
40 def __init__(self, uri):
41 self._uri = uri
42 self._data = dict()
43
44 uri = property(lambda self: self._uri)
martin f. krafftf37f0682013-06-14 16:36:20 +020045
Andrew Pickford10a167c2017-03-18 19:25:47 +010046 def get_data(self):
47 return self._data
48
martin f. krafftd48a46e2014-01-03 14:32:49 +130049 def get_entity(self, name=None, default_environment=None):
martin f. kraffte497b752013-06-16 14:15:11 +020050 classes = self._data.get('classes')
51 if classes is None:
52 classes = []
53 classes = datatypes.Classes(classes)
54
55 applications = self._data.get('applications')
56 if applications is None:
57 applications = []
58 applications = datatypes.Applications(applications)
59
60 parameters = self._data.get('parameters')
61 if parameters is None:
62 parameters = {}
63 parameters = datatypes.Parameters(parameters)
64
Andrew Pickford89404022017-03-18 11:24:47 +010065 exports = self._data.get('exports')
66 if exports is None:
67 exports = {}
Andrew Pickfordabe722a2017-03-22 18:17:17 +010068 exports = datatypes.Exports(exports)
Andrew Pickford89404022017-03-18 11:24:47 +010069
martin f. krafft37b56b62013-12-10 16:04:52 +010070 if name is None:
71 name = self._path
72
Andrew Pickford10a167c2017-03-18 19:25:47 +010073 env = self._data.get('environment', default_environment)
74
Andrew Pickford89404022017-03-18 11:24:47 +010075 return datatypes.Entity(classes, applications, parameters, exports,
Andrew Pickford71ec18b2017-04-13 13:09:30 +020076 name=name, environment=env, uri=self.uri)
martin f. krafftf37f0682013-06-14 16:36:20 +020077
78 def __repr__(self):
martin f. krafftf7858a82013-06-15 15:33:28 +020079 return '<{0} {1}, {2}>'.format(self.__class__.__name__, self._path,
martin f. krafftf37f0682013-06-14 16:36:20 +020080 self._data.keys())