Changeset e165b7d in rtems-central


Ignore:
Timestamp:
Dec 1, 2020, 11:07:29 AM (12 months ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
master
Children:
0500b9a
Parents:
7b864b7
git-author:
Sebastian Huber <sebastian.huber@…> (12/01/20 11:07:29)
git-committer:
Sebastian Huber <sebastian.huber@…> (12/01/20 13:08:48)
Message:

items: Enable custom get value for lists

Location:
rtemsspec
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • rtemsspec/applconfig.py

    r7b864b7 re165b7d  
    322322
    323323
    324 def _get_value_none(_ctx: ItemGetValueContext) -> Any:
    325     return None
    326 
    327 
    328324def _sphinx_ref(ref: str) -> str:
    329325    return f":ref:`{ref}`"
     
    355351
    356352
    357 def _get_value_sphinx_reference(ctx: ItemGetValueContext) -> Any:
    358     return _SPHINX_DOC_REFS[ctx.key]
     353def _get_value_sphinx_reference(_ctx: ItemGetValueContext) -> Any:
     354    return _SPHINX_DOC_REFS
    359355
    360356
    361357def _add_sphinx_get_values(mapper: ItemMapper) -> None:
    362     for key in _SPHINX_DOC_REFS:
    363         for opt in ["feature-enable", "feature", "initializer", "integer"]:
    364             doc_ref = f"interface/appl-config-option/{opt}:/document-reference"
    365             mapper.add_get_value(doc_ref, _get_value_none)
    366             mapper.add_get_value(f"{doc_ref}/{key}",
    367                                  _get_value_sphinx_reference)
     358    for opt in ["feature-enable", "feature", "initializer", "integer"]:
     359        doc_ref = f"interface/appl-config-option/{opt}:/document-reference"
     360        mapper.add_get_value(doc_ref, _get_value_sphinx_reference)
    368361
    369362
     
    428421
    429422
    430 def _get_value_doxygen_reference(ctx: ItemGetValueContext) -> Any:
    431     return _DOXYGEN_DOC_REFS[ctx.key]
     423def _get_value_doxygen_reference(_ctx: ItemGetValueContext) -> Any:
     424    return _DOXYGEN_DOC_REFS
    432425
    433426
     
    449442
    450443def _add_doxygen_get_values(mapper: ItemMapper) -> None:
    451     for key in _DOXYGEN_DOC_REFS:
    452         for opt in ["feature-enable", "feature", "initializer", "integer"]:
    453             doc_ref = f"interface/appl-config-option/{opt}:/document-reference"
    454             mapper.add_get_value(doc_ref, _get_value_none)
    455             mapper.add_get_value(f"{doc_ref}/{key}",
    456                                  _get_value_doxygen_reference)
    457             name = f"interface/appl-config-option/{opt}:/name"
    458             mapper.add_get_value(name, get_value_hash)
     444    for opt in ["feature-enable", "feature", "initializer", "integer"]:
     445        doc_ref = f"interface/appl-config-option/{opt}:/document-reference"
     446        mapper.add_get_value(doc_ref, _get_value_doxygen_reference)
     447        name = f"interface/appl-config-option/{opt}:/name"
     448        mapper.add_get_value(name, get_value_hash)
    459449    mapper.add_get_value("interface/define:/name", get_value_hash)
    460450    mapper.add_get_value("interface/function:/name",
  • rtemsspec/interface.py

    r7b864b7 re165b7d  
    3232    ExpressionMapper, get_value_double_colon, get_value_doxygen_function, \
    3333    get_value_hash
    34 from rtemsspec.items import Item, ItemCache, ItemGetValueContext, ItemMapper
     34from rtemsspec.items import Item, ItemCache, ItemGetValueContext, \
     35    ItemGetValueMap, ItemMapper
    3536
    3637ItemMap = Dict[str, Item]
     
    6465        self._node = node
    6566        self._code_or_doc = "doc"
    66         self.add_get_value("interface/forward-declaration:code:/name",
     67        self.add_get_value("interface/forward-declaration/code:/name",
    6768                           _get_value_forward_declaration)
    68         self.add_get_value("interface/forward-declaration:doc:/name",
     69        self.add_get_value("interface/forward-declaration/doc:/name",
    6970                           _get_value_forward_declaration)
    70         self.add_get_value("interface/function:doc:/name",
     71        self.add_get_value("interface/function/doc:/name",
    7172                           get_value_doxygen_function)
    72         self.add_get_value("interface/enumerator:doc:/name",
     73        self.add_get_value("interface/enumerator/doc:/name",
    7374                           get_value_double_colon)
    74         self.add_get_value("interface/typedef:doc:/name",
     75        self.add_get_value("interface/typedef/doc:/name",
    7576                           get_value_double_colon)
    76         self.add_get_value("interface/define:doc:/name", get_value_hash)
    77         self.add_get_value("interface/enum:doc:/name", get_value_hash)
    78         self.add_get_value("interface/macro:doc:/name",
     77        self.add_get_value("interface/define/doc:/name", get_value_hash)
     78        self.add_get_value("interface/enum/doc:/name", get_value_hash)
     79        self.add_get_value("interface/macro/doc:/name",
    7980                           get_value_doxygen_function)
    80         self.add_get_value("interface/variable:doc:/name", get_value_hash)
     81        self.add_get_value("interface/variable/doc:/name", get_value_hash)
    8182        for opt in ["feature-enable", "feature", "initializer", "integer"]:
    82             name = f"interface/appl-config-option/{opt}:doc:/name"
     83            name = f"interface/appl-config-option/{opt}/doc:/name"
    8384            self.add_get_value(name, get_value_hash)
    84         self.add_get_value("interface/unspecified-function:doc:/name",
     85        self.add_get_value("interface/unspecified-function/doc:/name",
    8586                           get_value_doxygen_function)
    8687
     
    9394        self._code_or_doc = code_or_doc
    9495
    95     def get_value(self, ctx: ItemGetValueContext) -> Any:
    96         if self._code_or_doc == "code" and ctx.item["type"] == "interface":
     96    def get_value_map(self, item: Item) -> ItemGetValueMap:
     97        if self._code_or_doc == "code" and item["type"] == "interface":
    9798            node = self._node
    9899            header_file = node.header_file
    99             if ctx.item["interface-type"] == "enumerator":
    100                 for child in ctx.item.children("interface-enumerator"):
     100            if item["interface-type"] == "enumerator":
     101                for child in item.children("interface-enumerator"):
    101102                    header_file.add_includes(child)
    102103            else:
    103                 header_file.add_includes(ctx.item)
    104             header_file.add_dependency(node, ctx.item)
    105         return super().get_value(
    106             ItemGetValueContext(ctx.item, f"{self._code_or_doc}:{ctx.path}",
    107                                 ctx.value, ctx.key, ctx.index))
     104                header_file.add_includes(item)
     105            header_file.add_dependency(node, item)
     106        return self._get_value_map.get(f"{item.type}/{self._code_or_doc}", {})
    108107
    109108    def enabled_by_to_defined(self, enabled_by: str) -> str:
  • rtemsspec/items.py

    r7b864b7 re165b7d  
    4343    index: Any  # should be int, but this triggers a mypy error
    4444
    45     @property
    46     def type_path_key(self) -> str:
    47         """ Returns the item type followed the path to the key. """
    48         return f"{self.item.type}:{os.path.join(self.path, self.key)}"
    49 
    5045
    5146ItemMap = Dict[str, "Item"]
    5247ItemGetValue = Callable[[ItemGetValueContext], Any]
     48ItemGetValueMap = Dict[str, Tuple[ItemGetValue, Any]]
    5349
    5450
     
    186182        return self._data.get(key, default)
    187183
    188     def get_by_normalized_key_path(
    189             self,
    190             normalized_key_path: str,
    191             get_value: ItemGetValue = _get_value) -> Any:
     184    def get_by_normalized_key_path(self, normalized_key_path: str,
     185                                   get_value_map: ItemGetValueMap) -> Any:
    192186        """
    193187        Gets the attribute value corresponding to the normalized key path.
     
    202196                index = -1
    203197            ctx = ItemGetValueContext(self, path, value, parts[0], index)
    204             try:
    205                 value = get_value(ctx)
    206             except KeyError:
    207                 value = _get_value(ctx)
     198            get_value, get_value_map = get_value_map.get(
     199                parts[0], (_get_value, {}))
     200            value = get_value(ctx)
    208201            path = os.path.join(path, key)
    209202        return value
    210203
    211     def get_by_key_path(self,
    212                         key_path: str,
    213                         prefix: str = "",
    214                         get_value: ItemGetValue = _get_value) -> Any:
     204    def get_by_key_path(self, key_path: str, prefix: str = "") -> Any:
    215205        """ Gets the attribute value corresponding to the key path. """
    216206        return self.get_by_normalized_key_path(
    217             normalize_key_path(key_path, prefix), get_value)
     207            normalize_key_path(key_path, prefix), {})
    218208
    219209    @property
     
    379369        self._recursive = recursive
    380370        self._prefix = [""]
    381         self._get_value = {}  # type: Dict[str, ItemGetValue]
     371        self._get_value_map = {}  # type: Dict[str, ItemGetValueMap]
    382372
    383373    @property
     
    396386        Adds a get value for the specified type and key path.
    397387        """
    398         self._get_value[type_path_key] = get_value
     388        type_name, path_key = type_path_key.split(":")
     389        keys = path_key.strip("/").split("/")
     390        get_value_map = self._get_value_map.setdefault(type_name, {})
     391        for key in keys[:-1]:
     392            _, get_value_map = get_value_map.setdefault(key, (_get_value, {}))
     393        get_value_map[keys[-1]] = (get_value, {})
    399394
    400395    def push_prefix(self, prefix: str) -> None:
     
    412407        yield
    413408        self.pop_prefix()
     409
     410    def get_value_map(self, item: Item) -> ItemGetValueMap:
     411        """ Returns the get value map for the item. """
     412        return self._get_value_map.get(item.type, {})
    414413
    415414    def map(self, identifier: str) -> Tuple[Item, str, Any]:
     
    430429            prefix = ""
    431430        key_path = normalize_key_path(key_path, prefix)
    432         value = item.get_by_normalized_key_path(key_path, self.get_value)
     431        value = item.get_by_normalized_key_path(key_path,
     432                                                self.get_value_map(item))
    433433        for func in pipes:
    434434            value = getattr(self, func)(value)
     
    472472        with self.prefix(prefix):
    473473            return ItemTemplate(text).substitute(self)
    474 
    475     def get_value(self, ctx: ItemGetValueContext) -> Any:
    476         """ Gets a value by key and optional index. """
    477         return self._get_value[ctx.type_path_key](ctx)
    478474
    479475
  • rtemsspec/tests/test_items_itemcache.py

    r7b864b7 re165b7d  
    9797
    9898
     99def get_x_to_b_value(ctx):
     100    assert ctx.key == "x-to-b"
     101    return ctx.value["b"]
     102
     103
    99104class Mapper(ItemMapper):
    100105    def __init__(self, item):
     
    109114    def dup(self, value):
    110115        return value + value
    111 
    112     def get_value(self, ctx):
    113         if ctx.key == "x-to-b":
    114             return ctx.value["b"]
    115         raise KeyError
    116116
    117117
     
    142142    assert mapper["d/c:a/b"] == "e"
    143143    assert mapper["d/c:a/b|u"] == "ue"
     144    mapper.add_get_value(":/a/x-to-b", get_x_to_b_value)
    144145    assert mapper["d/c:a/x-to-b|u|v"] == "vue"
    145146    assert mapper["d/c:a/f[1]"] == 2
Note: See TracChangeset for help on using the changeset viewer.