Andrew Pickford | aa49bc8 | 2017-03-09 17:08:32 +0100 | [diff] [blame] | 1 | # |
| 2 | # -*- coding: utf-8 -*- |
| 3 | # |
| 4 | # This file is part of reclass |
| 5 | # |
Petr Michalec | 2e01223 | 2018-06-18 09:42:40 +0200 | [diff] [blame] | 6 | from __future__ import absolute_import |
| 7 | from __future__ import division |
| 8 | from __future__ import print_function |
| 9 | from __future__ import unicode_literals |
Andrew Pickford | aa49bc8 | 2017-03-09 17:08:32 +0100 | [diff] [blame] | 10 | |
Adrian Chifor | 3048be2 | 2018-04-05 08:56:49 +0200 | [diff] [blame] | 11 | from .parser import Parser |
| 12 | from .dictitem import DictItem |
| 13 | from .listitem import ListItem |
| 14 | from .scaitem import ScaItem |
Andrew Pickford | dec210a | 2017-08-09 17:27:02 +0200 | [diff] [blame] | 15 | from reclass.errors import InterpolationError |
Andrew Pickford | 69e7782 | 2017-03-20 16:44:55 +0100 | [diff] [blame] | 16 | |
Petr Michalec | 2e01223 | 2018-06-18 09:42:40 +0200 | [diff] [blame] | 17 | from six import string_types |
| 18 | |
Andrew Pickford | aa49bc8 | 2017-03-09 17:08:32 +0100 | [diff] [blame] | 19 | class Value(object): |
| 20 | |
Andrew Pickford | 2f6e9f5 | 2017-03-22 11:22:26 +0100 | [diff] [blame] | 21 | _parser = Parser() |
Andrew Pickford | aa49bc8 | 2017-03-09 17:08:32 +0100 | [diff] [blame] | 22 | |
Andrew Pickford | f1aaff5 | 2018-04-25 14:14:44 +0200 | [diff] [blame] | 23 | def __init__(self, value, settings, uri, parse_string=True): |
Andrew Pickford | 000ecf1 | 2017-08-08 14:42:12 +0200 | [diff] [blame] | 24 | self._settings = settings |
Andrew Pickford | 2224af4 | 2017-08-06 09:12:21 +0200 | [diff] [blame] | 25 | self._uri = uri |
Alexey Ovchinnikov | aeea688 | 2018-07-19 16:03:34 +0400 | [diff] [blame] | 26 | self.overwrite = False |
Andrew Pickford | 34d1445 | 2018-07-18 15:46:11 +0200 | [diff] [blame] | 27 | self._constant = False |
Petr Michalec | 2e01223 | 2018-06-18 09:42:40 +0200 | [diff] [blame] | 28 | if isinstance(value, string_types): |
Andrew Pickford | f1aaff5 | 2018-04-25 14:14:44 +0200 | [diff] [blame] | 29 | 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 Pickford | b712f6b | 2017-03-23 11:38:23 +0100 | [diff] [blame] | 37 | elif isinstance(value, list): |
Andrew Pickford | 000ecf1 | 2017-08-08 14:42:12 +0200 | [diff] [blame] | 38 | self._item = ListItem(value, self._settings) |
Andrew Pickford | b712f6b | 2017-03-23 11:38:23 +0100 | [diff] [blame] | 39 | elif isinstance(value, dict): |
Andrew Pickford | 000ecf1 | 2017-08-08 14:42:12 +0200 | [diff] [blame] | 40 | self._item = DictItem(value, self._settings) |
Andrew Pickford | b712f6b | 2017-03-23 11:38:23 +0100 | [diff] [blame] | 41 | else: |
Andrew Pickford | 000ecf1 | 2017-08-08 14:42:12 +0200 | [diff] [blame] | 42 | self._item = ScaItem(value, self._settings) |
Andrew Pickford | aa49bc8 | 2017-03-09 17:08:32 +0100 | [diff] [blame] | 43 | |
Andrew Pickford | 6f20a1a | 2018-04-20 10:26:49 +0200 | [diff] [blame] | 44 | @property |
Alexey Ovchinnikov | aeea688 | 2018-07-19 16:03:34 +0400 | [diff] [blame] | 45 | def uri(self): |
| 46 | return self._uri |
Andrew Pickford | 6f20a1a | 2018-04-20 10:26:49 +0200 | [diff] [blame] | 47 | |
Andrew Pickford | 902c6b6 | 2018-06-25 14:57:48 +0200 | [diff] [blame] | 48 | @property |
Andrew Pickford | 34d1445 | 2018-07-18 15:46:11 +0200 | [diff] [blame] | 49 | def constant(self): |
| 50 | return self._constant |
Andrew Pickford | fa991d9 | 2018-06-26 15:18:59 +0200 | [diff] [blame] | 51 | |
Andrew Pickford | 34d1445 | 2018-07-18 15:46:11 +0200 | [diff] [blame] | 52 | @constant.setter |
| 53 | def constant(self, constant): |
| 54 | self._constant = constant |
Andrew Pickford | fa991d9 | 2018-06-26 15:18:59 +0200 | [diff] [blame] | 55 | |
Andrew Pickford | 902c6b6 | 2018-06-25 14:57:48 +0200 | [diff] [blame] | 56 | def item_type(self): |
| 57 | return self._item.type |
| 58 | |
| 59 | def item_type_str(self): |
| 60 | return self._item.type_str() |
| 61 | |
Andrew Pickford | aa49bc8 | 2017-03-09 17:08:32 +0100 | [diff] [blame] | 62 | def is_container(self): |
Andrew Pickford | 2f6e9f5 | 2017-03-22 11:22:26 +0100 | [diff] [blame] | 63 | return self._item.is_container() |
Andrew Pickford | aa49bc8 | 2017-03-09 17:08:32 +0100 | [diff] [blame] | 64 | |
Alexey Ovchinnikov | 21d6238 | 2018-07-19 13:17:43 +0400 | [diff] [blame] | 65 | @property |
Andrew Pickford | aa49bc8 | 2017-03-09 17:08:32 +0100 | [diff] [blame] | 66 | def allRefs(self): |
Alexey Ovchinnikov | 21d6238 | 2018-07-19 13:17:43 +0400 | [diff] [blame] | 67 | return self._item.allRefs |
Andrew Pickford | aa49bc8 | 2017-03-09 17:08:32 +0100 | [diff] [blame] | 68 | |
Alexey Ovchinnikov | 21d6238 | 2018-07-19 13:17:43 +0400 | [diff] [blame] | 69 | @property |
Andrew Pickford | aa49bc8 | 2017-03-09 17:08:32 +0100 | [diff] [blame] | 70 | def has_references(self): |
Alexey Ovchinnikov | 21d6238 | 2018-07-19 13:17:43 +0400 | [diff] [blame] | 71 | return self._item.has_references |
Andrew Pickford | aa49bc8 | 2017-03-09 17:08:32 +0100 | [diff] [blame] | 72 | |
Alexey Ovchinnikov | 21d6238 | 2018-07-19 13:17:43 +0400 | [diff] [blame] | 73 | @property |
Andrew Pickford | 92a5019 | 2017-03-26 10:20:14 +0200 | [diff] [blame] | 74 | def has_inv_query(self): |
Alexey Ovchinnikov | 21d6238 | 2018-07-19 13:17:43 +0400 | [diff] [blame] | 75 | return self._item.has_inv_query |
Andrew Pickford | 8940402 | 2017-03-18 11:24:47 +0100 | [diff] [blame] | 76 | |
Alexey Ovchinnikov | aeea688 | 2018-07-19 16:03:34 +0400 | [diff] [blame] | 77 | @property |
Andrew Pickford | dec210a | 2017-08-09 17:27:02 +0200 | [diff] [blame] | 78 | def needs_all_envs(self): |
Alexey Ovchinnikov | 21d6238 | 2018-07-19 13:17:43 +0400 | [diff] [blame] | 79 | if self._item.has_inv_query: |
Alexey Ovchinnikov | aeea688 | 2018-07-19 16:03:34 +0400 | [diff] [blame] | 80 | return self._item.needs_all_envs |
Andrew Pickford | dec210a | 2017-08-09 17:27:02 +0200 | [diff] [blame] | 81 | else: |
| 82 | return False |
| 83 | |
| 84 | def ignore_failed_render(self): |
Alexey Ovchinnikov | aeea688 | 2018-07-19 16:03:34 +0400 | [diff] [blame] | 85 | return self._item.ignore_failed_render |
Andrew Pickford | dec210a | 2017-08-09 17:27:02 +0200 | [diff] [blame] | 86 | |
Alexey Ovchinnikov | 21d6238 | 2018-07-19 13:17:43 +0400 | [diff] [blame] | 87 | @property |
Andrew Pickford | 17dc7fb | 2017-03-18 13:07:04 +0100 | [diff] [blame] | 88 | def is_complex(self): |
Alexey Ovchinnikov | 21d6238 | 2018-07-19 13:17:43 +0400 | [diff] [blame] | 89 | return self._item.is_complex |
Andrew Pickford | 17dc7fb | 2017-03-18 13:07:04 +0100 | [diff] [blame] | 90 | |
Andrew Pickford | aa49bc8 | 2017-03-09 17:08:32 +0100 | [diff] [blame] | 91 | def get_references(self): |
Andrew Pickford | 2f6e9f5 | 2017-03-22 11:22:26 +0100 | [diff] [blame] | 92 | return self._item.get_references() |
| 93 | |
Andrew Pickford | dec210a | 2017-08-09 17:27:02 +0200 | [diff] [blame] | 94 | def get_inv_references(self): |
| 95 | return self._item.get_inv_references() |
| 96 | |
Andrew Pickford | 2f6e9f5 | 2017-03-22 11:22:26 +0100 | [diff] [blame] | 97 | def assembleRefs(self, context): |
Alexey Ovchinnikov | 21d6238 | 2018-07-19 13:17:43 +0400 | [diff] [blame] | 98 | if self._item.has_references: |
Andrew Pickford | 2f6e9f5 | 2017-03-22 11:22:26 +0100 | [diff] [blame] | 99 | self._item.assembleRefs(context) |
Andrew Pickford | aa49bc8 | 2017-03-09 17:08:32 +0100 | [diff] [blame] | 100 | |
Andrew Pickford | 000ecf1 | 2017-08-08 14:42:12 +0200 | [diff] [blame] | 101 | def render(self, context, inventory): |
Andrew Pickford | 2224af4 | 2017-08-06 09:12:21 +0200 | [diff] [blame] | 102 | try: |
| 103 | return self._item.render(context, inventory) |
Andrew Pickford | dec210a | 2017-08-09 17:27:02 +0200 | [diff] [blame] | 104 | except InterpolationError as e: |
Andrew Pickford | 2224af4 | 2017-08-06 09:12:21 +0200 | [diff] [blame] | 105 | e.uri = self._uri |
Andrew Pickford | dec210a | 2017-08-09 17:27:02 +0200 | [diff] [blame] | 106 | raise |
Andrew Pickford | aa49bc8 | 2017-03-09 17:08:32 +0100 | [diff] [blame] | 107 | |
Alexey Ovchinnikov | 21d6238 | 2018-07-19 13:17:43 +0400 | [diff] [blame] | 108 | @property |
Andrew Pickford | aa49bc8 | 2017-03-09 17:08:32 +0100 | [diff] [blame] | 109 | def contents(self): |
Alexey Ovchinnikov | 21d6238 | 2018-07-19 13:17:43 +0400 | [diff] [blame] | 110 | return self._item.contents |
Andrew Pickford | aa49bc8 | 2017-03-09 17:08:32 +0100 | [diff] [blame] | 111 | |
Andrew Pickford | 000ecf1 | 2017-08-08 14:42:12 +0200 | [diff] [blame] | 112 | def merge_over(self, value): |
| 113 | self._item = self._item.merge_over(value._item) |
Andrew Pickford | c6416e1 | 2017-03-09 20:20:24 +0100 | [diff] [blame] | 114 | return self |
Andrew Pickford | aa49bc8 | 2017-03-09 17:08:32 +0100 | [diff] [blame] | 115 | |
| 116 | def __repr__(self): |
Andrew Pickford | c6416e1 | 2017-03-09 20:20:24 +0100 | [diff] [blame] | 117 | return 'Value(%r)' % self._item |
Andrew Pickford | 8e41525 | 2018-03-15 11:44:39 +0100 | [diff] [blame] | 118 | |
| 119 | def __str__(self): |
| 120 | return str(self._item) |