blob: affd94410b2a890376818c0187bc6f32edaec182 [file] [log] [blame]
Andrew Pickfordaa49bc82017-03-09 17:08:32 +01001#
2# -*- coding: utf-8 -*-
3#
4# This file is part of reclass
5#
Petr Michalec2e012232018-06-18 09:42:40 +02006from __future__ import absolute_import
7from __future__ import division
8from __future__ import print_function
9from __future__ import unicode_literals
Andrew Pickfordaa49bc82017-03-09 17:08:32 +010010
Adrian Chifor3048be22018-04-05 08:56:49 +020011from .parser import Parser
12from .dictitem import DictItem
13from .listitem import ListItem
14from .scaitem import ScaItem
Andrew Pickforddec210a2017-08-09 17:27:02 +020015from reclass.errors import InterpolationError
Andrew Pickford69e77822017-03-20 16:44:55 +010016
Petr Michalec2e012232018-06-18 09:42:40 +020017from six import string_types
18
Andrew Pickfordaa49bc82017-03-09 17:08:32 +010019class Value(object):
20
Andrew Pickford2f6e9f52017-03-22 11:22:26 +010021 _parser = Parser()
Andrew Pickfordaa49bc82017-03-09 17:08:32 +010022
Andrew Pickfordf1aaff52018-04-25 14:14:44 +020023 def __init__(self, value, settings, uri, parse_string=True):
Andrew Pickford000ecf12017-08-08 14:42:12 +020024 self._settings = settings
Andrew Pickford2224af42017-08-06 09:12:21 +020025 self._uri = uri
Alexey Ovchinnikovaeea6882018-07-19 16:03:34 +040026 self.overwrite = False
Andrew Pickford34d14452018-07-18 15:46:11 +020027 self._constant = False
Petr Michalec2e012232018-06-18 09:42:40 +020028 if isinstance(value, string_types):
Andrew Pickfordf1aaff52018-04-25 14:14:44 +020029 if parse_string:
30 try:
31 self._item = self._parser.parse(value, self._settings)
32 except InterpolationError as e:
33 e.uri = self._uri
34 raise
35 else:
36 self._item = ScaItem(value, self._settings)
Andrew Pickfordb712f6b2017-03-23 11:38:23 +010037 elif isinstance(value, list):
Andrew Pickford000ecf12017-08-08 14:42:12 +020038 self._item = ListItem(value, self._settings)
Andrew Pickfordb712f6b2017-03-23 11:38:23 +010039 elif isinstance(value, dict):
Andrew Pickford000ecf12017-08-08 14:42:12 +020040 self._item = DictItem(value, self._settings)
Andrew Pickfordb712f6b2017-03-23 11:38:23 +010041 else:
Andrew Pickford000ecf12017-08-08 14:42:12 +020042 self._item = ScaItem(value, self._settings)
Andrew Pickfordaa49bc82017-03-09 17:08:32 +010043
Andrew Pickford6f20a1a2018-04-20 10:26:49 +020044 @property
Alexey Ovchinnikovaeea6882018-07-19 16:03:34 +040045 def uri(self):
46 return self._uri
Andrew Pickford6f20a1a2018-04-20 10:26:49 +020047
Andrew Pickford902c6b62018-06-25 14:57:48 +020048 @property
Andrew Pickford34d14452018-07-18 15:46:11 +020049 def constant(self):
50 return self._constant
Andrew Pickfordfa991d92018-06-26 15:18:59 +020051
Andrew Pickford34d14452018-07-18 15:46:11 +020052 @constant.setter
53 def constant(self, constant):
54 self._constant = constant
Andrew Pickfordfa991d92018-06-26 15:18:59 +020055
Andrew Pickford902c6b62018-06-25 14:57:48 +020056 def item_type(self):
57 return self._item.type
58
59 def item_type_str(self):
60 return self._item.type_str()
61
Andrew Pickfordaa49bc82017-03-09 17:08:32 +010062 def is_container(self):
Andrew Pickford2f6e9f52017-03-22 11:22:26 +010063 return self._item.is_container()
Andrew Pickfordaa49bc82017-03-09 17:08:32 +010064
Alexey Ovchinnikov21d62382018-07-19 13:17:43 +040065 @property
Andrew Pickfordaa49bc82017-03-09 17:08:32 +010066 def allRefs(self):
Alexey Ovchinnikov21d62382018-07-19 13:17:43 +040067 return self._item.allRefs
Andrew Pickfordaa49bc82017-03-09 17:08:32 +010068
Alexey Ovchinnikov21d62382018-07-19 13:17:43 +040069 @property
Andrew Pickfordaa49bc82017-03-09 17:08:32 +010070 def has_references(self):
Alexey Ovchinnikov21d62382018-07-19 13:17:43 +040071 return self._item.has_references
Andrew Pickfordaa49bc82017-03-09 17:08:32 +010072
Alexey Ovchinnikov21d62382018-07-19 13:17:43 +040073 @property
Andrew Pickford92a50192017-03-26 10:20:14 +020074 def has_inv_query(self):
Alexey Ovchinnikov21d62382018-07-19 13:17:43 +040075 return self._item.has_inv_query
Andrew Pickford89404022017-03-18 11:24:47 +010076
Alexey Ovchinnikovaeea6882018-07-19 16:03:34 +040077 @property
Andrew Pickforddec210a2017-08-09 17:27:02 +020078 def needs_all_envs(self):
Alexey Ovchinnikov21d62382018-07-19 13:17:43 +040079 if self._item.has_inv_query:
Alexey Ovchinnikovaeea6882018-07-19 16:03:34 +040080 return self._item.needs_all_envs
Andrew Pickforddec210a2017-08-09 17:27:02 +020081 else:
82 return False
83
84 def ignore_failed_render(self):
Alexey Ovchinnikovaeea6882018-07-19 16:03:34 +040085 return self._item.ignore_failed_render
Andrew Pickforddec210a2017-08-09 17:27:02 +020086
Alexey Ovchinnikov21d62382018-07-19 13:17:43 +040087 @property
Andrew Pickford17dc7fb2017-03-18 13:07:04 +010088 def is_complex(self):
Alexey Ovchinnikov21d62382018-07-19 13:17:43 +040089 return self._item.is_complex
Andrew Pickford17dc7fb2017-03-18 13:07:04 +010090
Andrew Pickfordaa49bc82017-03-09 17:08:32 +010091 def get_references(self):
Andrew Pickford2f6e9f52017-03-22 11:22:26 +010092 return self._item.get_references()
93
Andrew Pickforddec210a2017-08-09 17:27:02 +020094 def get_inv_references(self):
95 return self._item.get_inv_references()
96
Andrew Pickford2f6e9f52017-03-22 11:22:26 +010097 def assembleRefs(self, context):
Alexey Ovchinnikov21d62382018-07-19 13:17:43 +040098 if self._item.has_references:
Andrew Pickford2f6e9f52017-03-22 11:22:26 +010099 self._item.assembleRefs(context)
Andrew Pickfordaa49bc82017-03-09 17:08:32 +0100100
Andrew Pickford000ecf12017-08-08 14:42:12 +0200101 def render(self, context, inventory):
Andrew Pickford2224af42017-08-06 09:12:21 +0200102 try:
103 return self._item.render(context, inventory)
Andrew Pickforddec210a2017-08-09 17:27:02 +0200104 except InterpolationError as e:
Andrew Pickford2224af42017-08-06 09:12:21 +0200105 e.uri = self._uri
Andrew Pickforddec210a2017-08-09 17:27:02 +0200106 raise
Andrew Pickfordaa49bc82017-03-09 17:08:32 +0100107
Alexey Ovchinnikov21d62382018-07-19 13:17:43 +0400108 @property
Andrew Pickfordaa49bc82017-03-09 17:08:32 +0100109 def contents(self):
Alexey Ovchinnikov21d62382018-07-19 13:17:43 +0400110 return self._item.contents
Andrew Pickfordaa49bc82017-03-09 17:08:32 +0100111
Andrew Pickford000ecf12017-08-08 14:42:12 +0200112 def merge_over(self, value):
113 self._item = self._item.merge_over(value._item)
Andrew Pickfordc6416e12017-03-09 20:20:24 +0100114 return self
Andrew Pickfordaa49bc82017-03-09 17:08:32 +0100115
116 def __repr__(self):
Andrew Pickfordc6416e12017-03-09 20:20:24 +0100117 return 'Value(%r)' % self._item
Andrew Pickford8e415252018-03-15 11:44:39 +0100118
119 def __str__(self):
120 return str(self._item)