Skip to content

Commit

Permalink
Make dict representation of enum members more explicit
Browse files Browse the repository at this point in the history
Rationale: This will make controlling the order of enumerators a lot
easier when loading the dict representation from a file.
  • Loading branch information
jasujm committed May 5, 2020
1 parent 4bdfca1 commit 770d1d4
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 25 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ Changed
- Introduce tox to manage Python unit tests
- More explicit call signatures in Python API (more type
annotations, less catch-all keyword arguments)
- Changed the format of ``dict`` representation of enumerators to
have more explicit ordering of members

Version 0.3
-----------
Expand Down
25 changes: 15 additions & 10 deletions docs/enumecglib.rst
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,20 @@ file using general purpose serialization format like JSON or YAML.

>>> status = {
... "typename": "Status",
... "members": {
... "INITIALIZING": "initializing",
... "WAITING_FOR_INPUT": "waitingForInput",
... "BUSY": "busy",
... }
... "members": [
... {
... "name": "INITIALIZING",
... "value": "initializing",
... },
... {
... "name": "WAITING_FOR_INPUT",
... "value": "waitingForInput",
... },
... {
... "name": "BUSY",
... "value": "busy",
... },
... ]
... }
>>> import enumecg
>>> enumecg.generate(status)
Expand All @@ -66,11 +75,7 @@ The supported keys are:

- ``typename``: The enum typename.

- ``members``: Mapping between enumerator names and values. The
enumerators appear in the same order as they appear in the
definition. Note that in CPython ``dict`` type is ordered by
default, but to be more explicit, :class:`collections.OrderedDict` might
be preferred.
- ``members``: Mapping between enumerator names and values.

- ``docstring``: An optional documentation for the generated enum
definition. See :ref:`enumecg-documentation-generation` for details.
Expand Down
17 changes: 8 additions & 9 deletions python/enumecg/definitions.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
enum definition.
"""

import collections
import collections.abc as cabc
import enum as py_enum
import dataclasses
Expand Down Expand Up @@ -51,7 +50,7 @@ def _make_definition_from_dict(enum_dict, *, primary_type, value_type):
typename = enum_dict["typename"]
members = enum_dict["members"]
formatter = utils.NameFormatter(typename)
member_formatter = utils.NameFormatter(*members.keys())
member_formatter = utils.NameFormatter(*(member["name"] for member in members))
label_enum_typename = (
formatter.join(formatter.parts[0] + ["label"])
if primary_type != "label"
Expand All @@ -62,7 +61,9 @@ def _make_definition_from_dict(enum_dict, *, primary_type, value_type):
if primary_type != "enhanced"
else typename
)
type_deducer = utils.CppTypeDeducer(*members.values(), type_name=value_type)
type_deducer = utils.CppTypeDeducer(
*(member["value"] for member in members), type_name=value_type
)
unparsed_docstring = enum_dict.get("docstring")
if unparsed_docstring:
parsed_docstring = docstring_parser.parse(unparsed_docstring)
Expand All @@ -78,15 +79,15 @@ def _make_definition_from_dict(enum_dict, *, primary_type, value_type):
value_type_typename=type_deducer.type_name,
members=[
EnumMemberDefinition(
enumerator_name=member_name,
enumerator_name=member["name"],
enumerator_value_constant_name=member_formatter.join(
member_formatter.parts[n] + ["value"]
),
enumerator_value_initializers=type_deducer.get_initializer(
member_value
member["value"]
),
)
for (n, (member_name, member_value)) in enumerate(members.items())
for (n, member) in enumerate(members)
],
associate_namespace_name=formatter.join(formatter.parts[0], pluralize=True),
label_enum_documentation=documentation if primary_type == "label" else None,
Expand All @@ -99,9 +100,7 @@ def _make_definition_from_dict(enum_dict, *, primary_type, value_type):
def _extract_python_enum_attrs(enum):
return {
"typename": enum.__name__,
"members": collections.OrderedDict(
(member.name, member.value) for member in enum
),
"members": [{"name": member.name, "value": member.value} for member in enum],
"docstring": enum.__doc__,
}

Expand Down
12 changes: 6 additions & 6 deletions python/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,11 @@ class Status(enum.Enum):
STATUS_DEFINITION_DICT = {
"typename": "Status",
"docstring": Status.__doc__,
"members": {
"INITIALIZING": "initializing",
"WAITING_FOR_INPUT": "waitingForInput",
"BUSY": "busy",
},
"members": [
{"name": "INITIALIZING", "value": "initializing",},
{"name": "WAITING_FOR_INPUT", "value": "waitingForInput",},
{"name": "BUSY", "value": "busy",},
],
}


Expand All @@ -67,7 +67,7 @@ class Status(enum.Enum):
"""
NESTED_ENUM_DEFINITION_DICT = {
"typename": "NestedEnum",
"members": {"enumerator": (0, ("string", True))},
"members": [{"name": "enumerator", "value": (0, ("string", True))}],
}


Expand Down

0 comments on commit 770d1d4

Please sign in to comment.