Skip to content

Commit

Permalink
Store only the direct parent of a feature (#25)
Browse files Browse the repository at this point in the history
  • Loading branch information
DoctorJohn authored Sep 13, 2024
1 parent 29f9d98 commit 30d9cb1
Show file tree
Hide file tree
Showing 14 changed files with 275 additions and 298 deletions.
6 changes: 1 addition & 5 deletions cfmtoolbox/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class Feature:
instance_cardinality: Cardinality
group_type_cardinality: Cardinality
group_instance_cardinality: Cardinality
parents: list["Feature"]
parent: "Feature | None"
children: list["Feature"]

def __str__(self) -> str:
Expand All @@ -44,10 +44,6 @@ def __str__(self) -> str:
def is_required(self) -> bool:
return self.instance_cardinality.intervals[0].lower != 0

def add_parent(self, parent: "Feature"):
if parent not in self.parents:
self.parents.append(parent)

def add_child(self, child: "Feature"):
if child not in self.children:
self.children.append(child)
Expand Down
2 changes: 1 addition & 1 deletion cfmtoolbox/plugins/debugging.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ def stringify_cfm(cfm: CFM | None) -> str:

for feature in cfm.features:
formatted_cfm += f"{feature}: instance [{feature.instance_cardinality}], group type [{feature.group_type_cardinality}], group instance [{feature.group_instance_cardinality}]\n"
formatted_cfm += stringify_list("parents", feature.parents)
formatted_cfm += f"- parent: {feature.parent}\n"
formatted_cfm += stringify_list("children", feature.children) + "\n"

formatted_cfm += stringify_list("Require constraints", cfm.require_constraints)
Expand Down
4 changes: 2 additions & 2 deletions cfmtoolbox/plugins/featureide_import.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ def parse_feature(feature: Element) -> Feature:
instance_cardinality=feature_cardinality,
group_instance_cardinality=group_cardinality,
group_type_cardinality=group_cardinality,
parents=[],
parent=None,
children=[],
)

Expand All @@ -84,7 +84,7 @@ def traverse_xml(element: Element | None, cfm: CFM) -> list[Feature]:

for child in element:
feature = parse_feature(child)
feature.add_parent(parent)
feature.parent = parent
parent.add_child(feature)
cfm.add_feature(feature)
traverse_xml(child, cfm)
Expand Down
8 changes: 4 additions & 4 deletions cfmtoolbox/plugins/json_import.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ def parse_cfm(serialized_cfm: JSON) -> CFM:


def parse_root(serialized_root: JSON) -> list[Feature]:
root = parse_feature(serialized_root, parents=[])
root = parse_feature(serialized_root, parent=None)

features = [root]

Expand All @@ -48,7 +48,7 @@ def parse_root(serialized_root: JSON) -> list[Feature]:
return features


def parse_feature(serialized_feature: JSON, /, parents: list[Feature]) -> Feature:
def parse_feature(serialized_feature: JSON, /, parent: Feature | None) -> Feature:
if not isinstance(serialized_feature, dict):
raise TypeError(f"Feature must be an object: {serialized_feature}")

Expand Down Expand Up @@ -77,12 +77,12 @@ def parse_feature(serialized_feature: JSON, /, parents: list[Feature]) -> Featur
instance_cardinality=instance_cardinality,
group_type_cardinality=group_type_cardinality,
group_instance_cardinality=group_instance_cardinality,
parents=parents,
parent=parent,
children=[],
)

feature.children = [
parse_feature(serialized_child, parents=[feature])
parse_feature(serialized_child, parent=feature)
for serialized_child in serialized_feature["children"]
]

Expand Down
14 changes: 7 additions & 7 deletions cfmtoolbox/plugins/uvl_import.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ def exitFeature(self, ctx: UVLPythonParser.FeatureContext):
instance_cardinality,
group_type_cardinality,
group_instance_cardinality,
[],
None,
[],
)
self.feature_map[name] = feature
Expand All @@ -158,7 +158,7 @@ def exitFeature(self, ctx: UVLPythonParser.FeatureContext):
instance_cardinality,
Cardinality([Interval(0, new_groups)]),
Cardinality([]),
[],
None,
[],
)
min_cardinality = 0
Expand Down Expand Up @@ -200,7 +200,7 @@ def exitFeature(self, ctx: UVLPythonParser.FeatureContext):
Cardinality([Interval(0, None)]),
group_type_cardinality,
group_instance_cardinality,
[],
None,
features,
)
parent_feature.children.append(feature)
Expand All @@ -214,7 +214,7 @@ def exitFeature(self, ctx: UVLPythonParser.FeatureContext):
)
)
for child in features:
child.parents = [feature]
child.parent = feature
if len(child.instance_cardinality.intervals) > 0:
min_cardinality += child.instance_cardinality.intervals[
0
Expand All @@ -225,7 +225,7 @@ def exitFeature(self, ctx: UVLPythonParser.FeatureContext):
else:
max_cardinality = None
for child in parent_feature.children:
child.parents = [parent_feature]
child.parent = parent_feature
parent_feature.group_instance_cardinality = Cardinality(
[
Interval(
Expand Down Expand Up @@ -275,11 +275,11 @@ def exitFeature(self, ctx: UVLPythonParser.FeatureContext):
instance_cardinality,
group_type_cardinality,
group_instance_cardinality,
[],
None,
features,
)
for child in feature.children:
child.parents = [feature]
child.parent = feature
self.feature_map[name] = feature
self.features.append(feature)
self.cfm.features.append(feature)
Expand Down
8 changes: 4 additions & 4 deletions tests/plugins/test_big_m.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,30 +40,30 @@ def test_replace_infinite_upper_bound_with_global_upper_bound():
Cardinality([Interval(1, 1)]),
Cardinality([Interval(1, 3)]),
Cardinality([Interval(1, None)]),
[],
None,
[
Feature(
"Tomato",
Cardinality([Interval(0, None)]),
Cardinality([]),
Cardinality([]),
[],
None,
[],
),
Feature(
"Lettuce",
Cardinality([Interval(0, None)]),
Cardinality([]),
Cardinality([]),
[],
None,
[],
),
Feature(
"Onion",
Cardinality([Interval(0, 3)]),
Cardinality([]),
Cardinality([]),
[],
None,
[],
),
],
Expand Down
26 changes: 13 additions & 13 deletions tests/plugins/test_debugging.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,47 +19,47 @@ def test_debug(capsys):
expected_output = dedent("""\
CFM:
Sandwich: instance [1..1], group type [1..3], group instance [1..3]
- parents:
- parent: None
- children: Bread, CheeseMix, Veggies
Bread: instance [1..1], group type [1..1], group instance [1..1]
- parents: Sandwich
- parent: Sandwich
- children: Sourdough, Wheat
Sourdough: instance [0..1], group type [], group instance []
- parents: Bread
- parent: Bread
- children:
Wheat: instance [0..1], group type [], group instance []
- parents: Bread
- parent: Bread
- children:
CheeseMix: instance [0..1], group type [1..3], group instance [1..3]
- parents: Sandwich
- parent: Sandwich
- children: Cheddar, Swiss, Gouda
Cheddar: instance [0..1], group type [], group instance []
- parents: CheeseMix
- parent: CheeseMix
- children:
Swiss: instance [0..1], group type [], group instance []
- parents: CheeseMix
- parent: CheeseMix
- children:
Gouda: instance [0..1], group type [], group instance []
- parents: CheeseMix
- parent: CheeseMix
- children:
Veggies: instance [0..1], group type [1..2], group instance [1..2]
- parents: Sandwich
- parent: Sandwich
- children: Lettuce, Tomato
Lettuce: instance [0..1], group type [], group instance []
- parents: Veggies
- parent: Veggies
- children:
Tomato: instance [0..1], group type [], group instance []
- parents: Veggies
- parent: Veggies
- children:
- Require constraints: Sourdough => Cheddar, Tomato => Gouda, Swiss => Lettuce
Expand Down Expand Up @@ -91,7 +91,7 @@ def test_stringify_cfm():
cfm_str = dedent("""\
CFM:
Sandwich: instance [1..0], group type [1..3], group instance [2..2]
- parents:
- parent: None
- children:
- Require constraints: Sandwich => Sandwich
Expand All @@ -103,7 +103,7 @@ def test_stringify_cfm():
Cardinality([Interval(1, 0)]),
Cardinality([Interval(1, 3)]),
Cardinality([Interval(2, 2)]),
[],
None,
[],
)

Expand Down
Loading

0 comments on commit 30d9cb1

Please sign in to comment.