martin f. krafft | f37f068 | 2013-06-14 16:36:20 +0200 | [diff] [blame] | 1 | # |
| 2 | # -*- coding: utf-8 -*- |
| 3 | # |
| 4 | # This file is part of reclass (http://github.com/madduck/reclass) |
| 5 | # |
martin f. krafft | 1ba35c5 | 2014-01-02 11:10:58 +1300 | [diff] [blame] | 6 | # Copyright © 2007–14 martin f. krafft <madduck@madduck.net> |
martin f. krafft | f37f068 | 2013-06-14 16:36:20 +0200 | [diff] [blame] | 7 | # Released under the terms of the Artistic Licence 2.0 |
| 8 | # |
Petr Michalec | 2e01223 | 2018-06-18 09:42:40 +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 | |
martin f. krafft | 7c64f9c | 2013-06-25 13:26:23 +0200 | [diff] [blame] | 14 | from reclass import datatypes |
martin f. krafft | f37f068 | 2013-06-14 16:36:20 +0200 | [diff] [blame] | 15 | import yaml |
martin f. krafft | 729481c | 2013-06-24 12:24:49 +0200 | [diff] [blame] | 16 | import os |
martin f. krafft | 90015d0 | 2013-06-26 18:44:02 +0200 | [diff] [blame] | 17 | from reclass.errors import NotFoundError |
martin f. krafft | f37f068 | 2013-06-14 16:36:20 +0200 | [diff] [blame] | 18 | |
Alexandru Avadanii | 2d12f7a | 2018-02-21 20:14:21 +0100 | [diff] [blame] | 19 | _SafeLoader = yaml.CSafeLoader if yaml.__with_libyaml__ else yaml.SafeLoader |
| 20 | |
Andrew Pickford | 71ec18b | 2017-04-13 13:09:30 +0200 | [diff] [blame] | 21 | class YamlData(object): |
martin f. krafft | f37f068 | 2013-06-14 16:36:20 +0200 | [diff] [blame] | 22 | |
Andrew Pickford | 71ec18b | 2017-04-13 13:09:30 +0200 | [diff] [blame] | 23 | @classmethod |
| 24 | def from_file(cls, path): |
| 25 | ''' Initialise yaml data from a local file ''' |
Andrew Pickford | 2224af4 | 2017-08-06 09:12:21 +0200 | [diff] [blame] | 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)) |
Adrian Chifor | 3048be2 | 2018-04-05 08:56:49 +0200 | [diff] [blame] | 32 | with open(abs_path) as fp: |
Alexandru Avadanii | 2d12f7a | 2018-02-21 20:14:21 +0100 | [diff] [blame] | 33 | data = yaml.load(fp, Loader=_SafeLoader) |
Adrian Chifor | 3048be2 | 2018-04-05 08:56:49 +0200 | [diff] [blame] | 34 | if data is not None: |
| 35 | y._data = data |
Andrew Pickford | 71ec18b | 2017-04-13 13:09:30 +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) |
Alexandru Avadanii | 2d12f7a | 2018-02-21 20:14:21 +0100 | [diff] [blame] | 42 | data = yaml.load(string, Loader=_SafeLoader) |
Andrew Pickford | 71ec18b | 2017-04-13 13:09:30 +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) |
martin f. krafft | f37f068 | 2013-06-14 16:36:20 +0200 | [diff] [blame] | 52 | |
Andrew Pickford | 10a167c | 2017-03-18 19:25:47 +0100 | [diff] [blame] | 53 | def get_data(self): |
| 54 | return self._data |
| 55 | |
Andrew Pickford | 000ecf1 | 2017-08-08 14:42:12 +0200 | [diff] [blame] | 56 | def get_entity(self, name, settings): |
| 57 | #if name is None: |
| 58 | # name = self._uri |
Andrew Pickford | 2224af4 | 2017-08-06 09:12:21 +0200 | [diff] [blame] | 59 | |
martin f. krafft | e497b75 | 2013-06-16 14:15:11 +0200 | [diff] [blame] | 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 = {} |
Andrew Pickford | 000ecf1 | 2017-08-08 14:42:12 +0200 | [diff] [blame] | 73 | parameters = datatypes.Parameters(parameters, settings, self._uri) |
martin f. krafft | e497b75 | 2013-06-16 14:15:11 +0200 | [diff] [blame] | 74 | |
Andrew Pickford | 8940402 | 2017-03-18 11:24:47 +0100 | [diff] [blame] | 75 | exports = self._data.get('exports') |
| 76 | if exports is None: |
| 77 | exports = {} |
Andrew Pickford | 000ecf1 | 2017-08-08 14:42:12 +0200 | [diff] [blame] | 78 | exports = datatypes.Exports(exports, settings, self._uri) |
martin f. krafft | 37b56b6 | 2013-12-10 16:04:52 +0100 | [diff] [blame] | 79 | |
Andrew Pickford | 3b3681b | 2017-04-16 11:53:24 +0200 | [diff] [blame] | 80 | env = self._data.get('environment', None) |
Andrew Pickford | 10a167c | 2017-03-18 19:25:47 +0100 | [diff] [blame] | 81 | |
Andrew Pickford | 000ecf1 | 2017-08-08 14:42:12 +0200 | [diff] [blame] | 82 | return datatypes.Entity(settings, classes=classes, applications=applications, parameters=parameters, |
| 83 | exports=exports, name=name, environment=env, uri=self.uri) |
martin f. krafft | f37f068 | 2013-06-14 16:36:20 +0200 | [diff] [blame] | 84 | |
Andrew Pickford | 8980ad9 | 2017-04-18 11:18:18 +0200 | [diff] [blame] | 85 | def __str__(self): |
| 86 | return '<{0} {1}, {2}>'.format(self.__class__.__name__, self._uri, |
| 87 | self._data) |
| 88 | |
martin f. krafft | f37f068 | 2013-06-14 16:36:20 +0200 | [diff] [blame] | 89 | def __repr__(self): |
Andrew Pickford | 8980ad9 | 2017-04-18 11:18:18 +0200 | [diff] [blame] | 90 | return '<{0} {1}, {2}>'.format(self.__class__.__name__, self._uri, |
martin f. krafft | f37f068 | 2013-06-14 16:36:20 +0200 | [diff] [blame] | 91 | self._data.keys()) |