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 | # |
martin f. krafft | 7c64f9c | 2013-06-25 13:26:23 +0200 | [diff] [blame] | 9 | from reclass import datatypes |
martin f. krafft | f37f068 | 2013-06-14 16:36:20 +0200 | [diff] [blame] | 10 | import yaml |
martin f. krafft | 729481c | 2013-06-24 12:24:49 +0200 | [diff] [blame] | 11 | import os |
martin f. krafft | 90015d0 | 2013-06-26 18:44:02 +0200 | [diff] [blame] | 12 | from reclass.errors import NotFoundError |
martin f. krafft | f37f068 | 2013-06-14 16:36:20 +0200 | [diff] [blame] | 13 | |
Andrew Pickford | 71ec18b | 2017-04-13 13:09:30 +0200 | [diff] [blame^] | 14 | class YamlData(object): |
martin f. krafft | f37f068 | 2013-06-14 16:36:20 +0200 | [diff] [blame] | 15 | |
Andrew Pickford | 71ec18b | 2017-04-13 13:09:30 +0200 | [diff] [blame^] | 16 | @classmethod |
| 17 | def from_file(cls, path): |
| 18 | ''' Initialise yaml data from a local file ''' |
martin f. krafft | 90015d0 | 2013-06-26 18:44:02 +0200 | [diff] [blame] | 19 | if not os.path.isfile(path): |
martin f. krafft | c43c60d | 2013-07-04 16:08:23 +0200 | [diff] [blame] | 20 | raise NotFoundError('No such file: %s' % path) |
martin f. krafft | 90015d0 | 2013-06-26 18:44:02 +0200 | [diff] [blame] | 21 | if not os.access(path, os.R_OK): |
martin f. krafft | c43c60d | 2013-07-04 16:08:23 +0200 | [diff] [blame] | 22 | raise NotFoundError('Cannot open: %s' % path) |
Andrew Pickford | 71ec18b | 2017-04-13 13:09:30 +0200 | [diff] [blame^] | 23 | y = cls('yaml_fs://{0}'.format(path)) |
| 24 | fp = file(path) |
martin f. krafft | 00e6a81 | 2013-06-15 15:40:41 +0200 | [diff] [blame] | 25 | data = yaml.safe_load(fp) |
| 26 | if data is not None: |
Andrew Pickford | 71ec18b | 2017-04-13 13:09:30 +0200 | [diff] [blame^] | 27 | y._data = data |
martin f. krafft | f37f068 | 2013-06-14 16:36:20 +0200 | [diff] [blame] | 28 | fp.close() |
Andrew Pickford | 71ec18b | 2017-04-13 13:09:30 +0200 | [diff] [blame^] | 29 | 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. krafft | f37f068 | 2013-06-14 16:36:20 +0200 | [diff] [blame] | 45 | |
Andrew Pickford | 10a167c | 2017-03-18 19:25:47 +0100 | [diff] [blame] | 46 | def get_data(self): |
| 47 | return self._data |
| 48 | |
martin f. krafft | d48a46e | 2014-01-03 14:32:49 +1300 | [diff] [blame] | 49 | def get_entity(self, name=None, default_environment=None): |
martin f. krafft | e497b75 | 2013-06-16 14:15:11 +0200 | [diff] [blame] | 50 | 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 Pickford | 8940402 | 2017-03-18 11:24:47 +0100 | [diff] [blame] | 65 | exports = self._data.get('exports') |
| 66 | if exports is None: |
| 67 | exports = {} |
Andrew Pickford | abe722a | 2017-03-22 18:17:17 +0100 | [diff] [blame] | 68 | exports = datatypes.Exports(exports) |
Andrew Pickford | 8940402 | 2017-03-18 11:24:47 +0100 | [diff] [blame] | 69 | |
martin f. krafft | 37b56b6 | 2013-12-10 16:04:52 +0100 | [diff] [blame] | 70 | if name is None: |
| 71 | name = self._path |
| 72 | |
Andrew Pickford | 10a167c | 2017-03-18 19:25:47 +0100 | [diff] [blame] | 73 | env = self._data.get('environment', default_environment) |
| 74 | |
Andrew Pickford | 8940402 | 2017-03-18 11:24:47 +0100 | [diff] [blame] | 75 | return datatypes.Entity(classes, applications, parameters, exports, |
Andrew Pickford | 71ec18b | 2017-04-13 13:09:30 +0200 | [diff] [blame^] | 76 | name=name, environment=env, uri=self.uri) |
martin f. krafft | f37f068 | 2013-06-14 16:36:20 +0200 | [diff] [blame] | 77 | |
| 78 | def __repr__(self): |
martin f. krafft | f7858a8 | 2013-06-15 15:33:28 +0200 | [diff] [blame] | 79 | return '<{0} {1}, {2}>'.format(self.__class__.__name__, self._path, |
martin f. krafft | f37f068 | 2013-06-14 16:36:20 +0200 | [diff] [blame] | 80 | self._data.keys()) |