blob: a8611548b874abdfed14869b34a1d6e51457ec65 [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#
Petr Michalec2e012232018-06-18 09:42:40 +02009from __future__ import absolute_import
10from __future__ import division
11from __future__ import print_function
12from __future__ import unicode_literals
13
martin f. krafft7c64f9c2013-06-25 13:26:23 +020014from reclass import datatypes
martin f. krafftf37f0682013-06-14 16:36:20 +020015import yaml
martin f. krafft729481c2013-06-24 12:24:49 +020016import os
martin f. krafft90015d02013-06-26 18:44:02 +020017from reclass.errors import NotFoundError
martin f. krafftf37f0682013-06-14 16:36:20 +020018
Alexandru Avadanii2d12f7a2018-02-21 20:14:21 +010019_SafeLoader = yaml.CSafeLoader if yaml.__with_libyaml__ else yaml.SafeLoader
20
Andrew Pickford71ec18b2017-04-13 13:09:30 +020021class YamlData(object):
martin f. krafftf37f0682013-06-14 16:36:20 +020022
Andrew Pickford71ec18b2017-04-13 13:09:30 +020023 @classmethod
24 def from_file(cls, path):
25 ''' Initialise yaml data from a local file '''
Andrew Pickford2224af42017-08-06 09:12:21 +020026 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 Chifor3048be22018-04-05 08:56:49 +020032 with open(abs_path) as fp:
Alexandru Avadanii2d12f7a2018-02-21 20:14:21 +010033 data = yaml.load(fp, Loader=_SafeLoader)
Adrian Chifor3048be22018-04-05 08:56:49 +020034 if data is not None:
35 y._data = data
Andrew Pickford71ec18b2017-04-13 13:09:30 +020036 return y
37
38 @classmethod
39 def from_string(cls, string, uri):
40 ''' Initialise yaml data from a string '''
41 y = cls(uri)
Alexandru Avadanii2d12f7a2018-02-21 20:14:21 +010042 data = yaml.load(string, Loader=_SafeLoader)
Andrew Pickford71ec18b2017-04-13 13:09:30 +020043 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. krafftf37f0682013-06-14 16:36:20 +020052
Andrew Pickford10a167c2017-03-18 19:25:47 +010053 def get_data(self):
54 return self._data
55
Andrew Pickford000ecf12017-08-08 14:42:12 +020056 def get_entity(self, name, settings):
57 #if name is None:
58 # name = self._uri
Andrew Pickford2224af42017-08-06 09:12:21 +020059
martin f. kraffte497b752013-06-16 14:15:11 +020060 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 Pickford000ecf12017-08-08 14:42:12 +020073 parameters = datatypes.Parameters(parameters, settings, self._uri)
martin f. kraffte497b752013-06-16 14:15:11 +020074
Andrew Pickford89404022017-03-18 11:24:47 +010075 exports = self._data.get('exports')
76 if exports is None:
77 exports = {}
Andrew Pickford000ecf12017-08-08 14:42:12 +020078 exports = datatypes.Exports(exports, settings, self._uri)
martin f. krafft37b56b62013-12-10 16:04:52 +010079
Andrew Pickford3b3681b2017-04-16 11:53:24 +020080 env = self._data.get('environment', None)
Andrew Pickford10a167c2017-03-18 19:25:47 +010081
Andrew Pickford000ecf12017-08-08 14:42:12 +020082 return datatypes.Entity(settings, classes=classes, applications=applications, parameters=parameters,
83 exports=exports, name=name, environment=env, uri=self.uri)
martin f. krafftf37f0682013-06-14 16:36:20 +020084
Andrew Pickford8980ad92017-04-18 11:18:18 +020085 def __str__(self):
86 return '<{0} {1}, {2}>'.format(self.__class__.__name__, self._uri,
87 self._data)
88
martin f. krafftf37f0682013-06-14 16:36:20 +020089 def __repr__(self):
Andrew Pickford8980ad92017-04-18 11:18:18 +020090 return '<{0} {1}, {2}>'.format(self.__class__.__name__, self._uri,
martin f. krafftf37f0682013-06-14 16:36:20 +020091 self._data.keys())