Jiri Broulik | 30e05a6 | 2018-06-14 13:31:24 +0200 | [diff] [blame] | 1 | # |
| 2 | # -*- coding: utf-8 -*- |
| 3 | # |
| 4 | # This file is part of reclass (http://github.com/madduck/reclass) |
| 5 | # |
| 6 | # Copyright © 2007–14 martin f. krafft <madduck@madduck.net> |
| 7 | # Released under the terms of the Artistic Licence 2.0 |
| 8 | # |
Jiri Broulik | 2f68e97 | 2018-06-21 17:28:36 +0200 | [diff] [blame] | 9 | from __future__ import absolute_import |
| 10 | from __future__ import division |
| 11 | from __future__ import print_function |
| 12 | from __future__ import unicode_literals |
| 13 | |
Jiri Broulik | 30e05a6 | 2018-06-14 13:31:24 +0200 | [diff] [blame] | 14 | from reclass import datatypes |
| 15 | import yaml |
| 16 | import os |
| 17 | from reclass.errors import NotFoundError |
| 18 | |
Jiri Broulik | d326461 | 2018-06-14 17:06:40 +0200 | [diff] [blame] | 19 | _SafeLoader = yaml.CSafeLoader if yaml.__with_libyaml__ else yaml.SafeLoader |
| 20 | |
Jiri Broulik | 30e05a6 | 2018-06-14 13:31:24 +0200 | [diff] [blame] | 21 | class YamlData(object): |
| 22 | |
| 23 | @classmethod |
| 24 | def from_file(cls, path): |
| 25 | ''' Initialise yaml data from a local file ''' |
| 26 | abs_path = os.path.abspath(path) |
| 27 | if not os.path.isfile(abs_path): |
| 28 | raise NotFoundError('No such file: %s' % abs_path) |
| 29 | if not os.access(abs_path, os.R_OK): |
| 30 | raise NotFoundError('Cannot open: %s' % abs_path) |
| 31 | y = cls('yaml_fs://{0}'.format(abs_path)) |
Jiri Broulik | d326461 | 2018-06-14 17:06:40 +0200 | [diff] [blame] | 32 | with open(abs_path) as fp: |
| 33 | data = yaml.load(fp, Loader=_SafeLoader) |
| 34 | if data is not None: |
| 35 | y._data = data |
Jiri Broulik | 30e05a6 | 2018-06-14 13:31:24 +0200 | [diff] [blame] | 36 | return y |
| 37 | |
| 38 | @classmethod |
| 39 | def from_string(cls, string, uri): |
| 40 | ''' Initialise yaml data from a string ''' |
| 41 | y = cls(uri) |
Jiri Broulik | d326461 | 2018-06-14 17:06:40 +0200 | [diff] [blame] | 42 | data = yaml.load(string, Loader=_SafeLoader) |
Jiri Broulik | 30e05a6 | 2018-06-14 13:31:24 +0200 | [diff] [blame] | 43 | if data is not None: |
| 44 | y._data = data |
| 45 | return y |
| 46 | |
| 47 | def __init__(self, uri): |
| 48 | self._uri = uri |
| 49 | self._data = dict() |
| 50 | |
| 51 | uri = property(lambda self: self._uri) |
| 52 | |
| 53 | def get_data(self): |
| 54 | return self._data |
| 55 | |
| 56 | def get_entity(self, name, settings): |
| 57 | #if name is None: |
| 58 | # name = self._uri |
| 59 | |
| 60 | classes = self._data.get('classes') |
| 61 | if classes is None: |
| 62 | classes = [] |
| 63 | classes = datatypes.Classes(classes) |
| 64 | |
| 65 | applications = self._data.get('applications') |
| 66 | if applications is None: |
| 67 | applications = [] |
| 68 | applications = datatypes.Applications(applications) |
| 69 | |
| 70 | parameters = self._data.get('parameters') |
| 71 | if parameters is None: |
| 72 | parameters = {} |
| 73 | parameters = datatypes.Parameters(parameters, settings, self._uri) |
| 74 | |
| 75 | exports = self._data.get('exports') |
| 76 | if exports is None: |
| 77 | exports = {} |
| 78 | exports = datatypes.Exports(exports, settings, self._uri) |
| 79 | |
| 80 | env = self._data.get('environment', None) |
| 81 | |
| 82 | return datatypes.Entity(settings, classes=classes, applications=applications, parameters=parameters, |
| 83 | exports=exports, name=name, environment=env, uri=self.uri) |
| 84 | |
| 85 | def __str__(self): |
| 86 | return '<{0} {1}, {2}>'.format(self.__class__.__name__, self._uri, |
| 87 | self._data) |
| 88 | |
| 89 | def __repr__(self): |
| 90 | return '<{0} {1}, {2}>'.format(self.__class__.__name__, self._uri, |
| 91 | self._data.keys()) |