flamapy-fm 2.0.0.dev6__tar.gz → 2.0.0.dev8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/PKG-INFO +1 -1
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/clafer_writer.py +7 -3
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/featureide_writer.py +6 -2
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/glencoe_writer.py +8 -4
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/json_writer.py +7 -3
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/splot_writer.py +17 -6
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/uvl_reader.py +3 -3
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/uvl_writer.py +6 -2
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy_fm.egg-info/PKG-INFO +1 -1
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy_fm.egg-info/requires.txt +1 -1
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/setup.py +1 -1
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/README.md +0 -0
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/__init__.py +0 -0
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/models/__init__.py +0 -0
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/models/feature_model.py +0 -0
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/operations/__init__.py +0 -0
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/operations/fm_atomic_sets.py +0 -0
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/operations/fm_average_branching_factor.py +0 -0
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/operations/fm_core_features.py +0 -0
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/operations/fm_count_leafs.py +0 -0
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/operations/fm_estimated_configurations_number.py +0 -0
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/operations/fm_feature_ancestors.py +0 -0
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/operations/fm_generate_random_attribute.py +0 -0
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/operations/fm_leaf_features.py +0 -0
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/operations/fm_max_depth_tree.py +0 -0
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/operations/fm_metrics.py +0 -0
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/__init__.py +0 -0
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/afm_reader.py +0 -0
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/afm_writer.py +0 -0
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/featureide_reader.py +0 -0
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/glencoe_reader.py +0 -0
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/json_reader.py +0 -0
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/pysat_to_fm.py +0 -0
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/xml_reader.py +0 -0
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy_fm.egg-info/SOURCES.txt +0 -0
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy_fm.egg-info/dependency_links.txt +0 -0
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy_fm.egg-info/top_level.txt +0 -0
- {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/setup.cfg +0 -0
|
@@ -46,7 +46,7 @@ def fm_to_clafer(feature_model: FeatureModel) -> str:
|
|
|
46
46
|
for ctc in feature_model.get_constraints():
|
|
47
47
|
result += read_constraints(ctc)
|
|
48
48
|
# Create an instance
|
|
49
|
-
result += f'\n\n{INSTANCE} : {feature_model.root.name}\n'
|
|
49
|
+
result += f'\n\n{INSTANCE} : {safename(feature_model.root.name)}\n'
|
|
50
50
|
return result
|
|
51
51
|
|
|
52
52
|
|
|
@@ -60,7 +60,7 @@ def read_features(feature: Feature, tab_count: int) -> str:
|
|
|
60
60
|
result += f'{group_type} '
|
|
61
61
|
|
|
62
62
|
# Feature
|
|
63
|
-
result += feature.name
|
|
63
|
+
result += safename(feature.name)
|
|
64
64
|
if feature.get_attributes():
|
|
65
65
|
result += f' : {ATTRIBUTED_FEATURE}'
|
|
66
66
|
if feature.is_optional():
|
|
@@ -89,7 +89,7 @@ def read_feature_attributes(feature: Feature, tab_count: int) -> str:
|
|
|
89
89
|
attribute_value = f"{str(attribute.default_value).lower()}"
|
|
90
90
|
else:
|
|
91
91
|
attribute_value = f"{attribute.default_value}"
|
|
92
|
-
result += f'\n{tabs}[{attribute.get_name()} = {attribute_value}]'
|
|
92
|
+
result += f'\n{tabs}[{safename(attribute.get_name())} = {attribute_value}]'
|
|
93
93
|
return result
|
|
94
94
|
|
|
95
95
|
|
|
@@ -149,3 +149,7 @@ def parse_type_value(value: Any) -> str:
|
|
|
149
149
|
if isinstance(value, str):
|
|
150
150
|
return ClaferAttributeType.STRING.value
|
|
151
151
|
return ''
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def safename(name: str) -> str:
|
|
155
|
+
return f'"{name}"' if ' ' in name else name
|
|
@@ -70,7 +70,7 @@ def _get_attributes(feature: Feature) -> dict[str, str]:
|
|
|
70
70
|
atributes['mandatory'] = 'true'
|
|
71
71
|
if feature.is_abstract:
|
|
72
72
|
atributes['abstract'] = 'true'
|
|
73
|
-
atributes['name'] = feature.name
|
|
73
|
+
atributes['name'] = safename(feature.name)
|
|
74
74
|
return atributes
|
|
75
75
|
|
|
76
76
|
|
|
@@ -119,7 +119,7 @@ def _get_ctc_info(ast_node: Node) -> dict[str, Any]:
|
|
|
119
119
|
ctc_info: dict[str, Any] = {}
|
|
120
120
|
if ast_node.is_term():
|
|
121
121
|
ctc_info['type'] = FeatureIDEReader.TAG_VAR
|
|
122
|
-
ctc_info['operands'] = [ast_node.data]
|
|
122
|
+
ctc_info['operands'] = [safename(str(ast_node.data))]
|
|
123
123
|
else:
|
|
124
124
|
ctc_info['type'] = FeatureIDEWriter.CTC_TYPES[ast_node.data]
|
|
125
125
|
operands = []
|
|
@@ -136,3 +136,7 @@ def prettify(xml: str) -> bytes:
|
|
|
136
136
|
"""Return a pretty-printed XML string for the Element."""
|
|
137
137
|
reparsed = minidom.parseString(xml)
|
|
138
138
|
return reparsed.toprettyxml(indent="\t", encoding='UTF-8')
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def safename(name: str) -> str:
|
|
142
|
+
return f'"{name}"' if ' ' in name else name
|
|
@@ -36,8 +36,8 @@ class GlencoeWriter(ModelToText):
|
|
|
36
36
|
|
|
37
37
|
def _to_json(feature_model: FeatureModel) -> dict[str, Any]:
|
|
38
38
|
result: dict[str, Any] = {}
|
|
39
|
-
result["id"] = f"FM_{feature_model.root.name}"
|
|
40
|
-
result["name"] = f"FM_{feature_model.root.name}"
|
|
39
|
+
result["id"] = f"FM_{feature_model.root.name.replace(' ', '')}"
|
|
40
|
+
result["name"] = f"FM_{feature_model.root.name.replace(' ', '')}"
|
|
41
41
|
result["features"] = _get_features_info(feature_model.get_features())
|
|
42
42
|
result["tree"] = _get_tree_info(feature_model.root)
|
|
43
43
|
result["constraints"] = _get_constraints_info(feature_model.get_constraints())
|
|
@@ -71,7 +71,7 @@ def _get_features_info(features: list[Feature]) -> dict[str, Any]:
|
|
|
71
71
|
|
|
72
72
|
def _get_tree_info(feature: Feature) -> dict[str, Any]:
|
|
73
73
|
feature_info: dict[str, Any] = {}
|
|
74
|
-
feature_info["id"] = feature.name
|
|
74
|
+
feature_info["id"] = safename(feature.name)
|
|
75
75
|
children = [
|
|
76
76
|
_get_tree_info(child)
|
|
77
77
|
for child in sorted(feature.get_children(), key=lambda f: f.name)
|
|
@@ -92,7 +92,7 @@ def _get_ctc_info(ast_node: Node) -> dict[str, Any]:
|
|
|
92
92
|
ctc_info: dict[str, Any] = {}
|
|
93
93
|
if ast_node.is_term():
|
|
94
94
|
ctc_info["type"] = "FeatureTerm"
|
|
95
|
-
ctc_info["operands"] = [ast_node.data]
|
|
95
|
+
ctc_info["operands"] = [safename(str(ast_node.data))]
|
|
96
96
|
else:
|
|
97
97
|
ctc_info["type"] = GlencoeWriter.CTC_TYPES[ast_node.data]
|
|
98
98
|
operands = []
|
|
@@ -103,3 +103,7 @@ def _get_ctc_info(ast_node: Node) -> dict[str, Any]:
|
|
|
103
103
|
operands.append(right)
|
|
104
104
|
ctc_info["operands"] = operands
|
|
105
105
|
return ctc_info
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def safename(name: str) -> str:
|
|
109
|
+
return f'"{name}"' if ' ' in name else name
|
|
@@ -49,7 +49,7 @@ def to_json(feature_model: FeatureModel) -> Dict[str, Any]:
|
|
|
49
49
|
|
|
50
50
|
def get_tree_info(feature: Feature) -> Dict[str, Any]:
|
|
51
51
|
feature_info: Dict[str, Any] = {}
|
|
52
|
-
feature_info['name'] = feature.name
|
|
52
|
+
feature_info['name'] = safename(feature.name)
|
|
53
53
|
feature_info['abstract'] = str(feature.is_abstract)
|
|
54
54
|
|
|
55
55
|
relations: List[Dict[str, Any]] = []
|
|
@@ -90,7 +90,7 @@ def get_attributes_info(attributes: List[Attribute]) -> List[Dict[str, Any]]:
|
|
|
90
90
|
attributes_info: List[Dict[str, Any]] = []
|
|
91
91
|
for attribute in attributes:
|
|
92
92
|
attr_info: Dict[str, Any] = {}
|
|
93
|
-
attr_info['name'] = attribute.name
|
|
93
|
+
attr_info['name'] = safename(attribute.name)
|
|
94
94
|
if attribute.default_value is not None:
|
|
95
95
|
attr_info['value'] = attribute.default_value
|
|
96
96
|
attributes_info.append(attr_info)
|
|
@@ -112,7 +112,7 @@ def get_ctc_info(ast_node: Node) -> Dict[str, Any]:
|
|
|
112
112
|
ctc_info: Dict[str, Any] = {}
|
|
113
113
|
if ast_node.is_term():
|
|
114
114
|
ctc_info['type'] = JSONFeatureType.FEATURE.value
|
|
115
|
-
ctc_info['operands'] = [ast_node.data]
|
|
115
|
+
ctc_info['operands'] = [safename(str(ast_node.data))]
|
|
116
116
|
else:
|
|
117
117
|
ctc_info['type'] = ast_node.data.value
|
|
118
118
|
operands: List[Dict[str, Any]] = []
|
|
@@ -123,3 +123,7 @@ def get_ctc_info(ast_node: Node) -> Dict[str, Any]:
|
|
|
123
123
|
operands.append(right)
|
|
124
124
|
ctc_info['operands'] = operands
|
|
125
125
|
return ctc_info
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def safename(name: str) -> str:
|
|
129
|
+
return f'"{name}"' if ' ' in name else name
|
|
@@ -29,9 +29,10 @@ class SPLOTWriter(ModelToText):
|
|
|
29
29
|
def fm_to_splot(model: FeatureModel) -> str:
|
|
30
30
|
lines = []
|
|
31
31
|
lines.append('<?xml version="1.0" encoding="UTF-8" standalone="no"?>')
|
|
32
|
-
|
|
32
|
+
model_name = model.root.name.replace(' ', '')
|
|
33
|
+
lines.append(f'<feature_model name="{model_name}">')
|
|
33
34
|
lines.append('<feature_tree>')
|
|
34
|
-
lines.append(f':r {model.root.name} ({model.root.name})')
|
|
35
|
+
lines.append(f':r {safename(model.root.name)} ({safename(model.root.name)})')
|
|
35
36
|
lines.extend(add_features(model.root, 1))
|
|
36
37
|
lines.append('</feature_tree>')
|
|
37
38
|
lines.append('<constraints>')
|
|
@@ -47,16 +48,18 @@ def add_features(feature: Feature, n_tabs: int) -> list[str]:
|
|
|
47
48
|
for relation in feature.get_relations():
|
|
48
49
|
if relation.is_optional():
|
|
49
50
|
child = relation.children[0]
|
|
50
|
-
lines.append(indentation + f':o {child.name} ({child.name})')
|
|
51
|
+
lines.append(indentation + f':o {safename(child.name)} ({safename(child.name)})')
|
|
51
52
|
lines.extend(add_features(child, n_tabs + 1))
|
|
52
53
|
elif relation.is_mandatory():
|
|
53
54
|
child = relation.children[0]
|
|
54
|
-
lines.append(indentation + f':m {child.name} ({child.name})')
|
|
55
|
+
lines.append(indentation + f':m {safename(child.name)} ({safename(child.name)})')
|
|
55
56
|
lines.extend(add_features(child, n_tabs + 1))
|
|
56
57
|
elif relation.is_alternative() or relation.is_or():
|
|
57
58
|
lines.append(indentation + f':g [{relation.card_min},{relation.card_max}]')
|
|
58
59
|
for child in relation.children:
|
|
59
|
-
lines.append(
|
|
60
|
+
lines.append(
|
|
61
|
+
indentation + TAB + f': {safename(child.name)} ({safename(child.name)})'
|
|
62
|
+
)
|
|
60
63
|
lines.extend(add_features(child, n_tabs + 2))
|
|
61
64
|
return lines
|
|
62
65
|
|
|
@@ -68,8 +71,16 @@ def add_constraints(constraints: list[Constraint]) -> list[str]:
|
|
|
68
71
|
for ctc in constraints:
|
|
69
72
|
cnf_clauses = ctc.ast.get_clauses()
|
|
70
73
|
for clause in cnf_clauses:
|
|
71
|
-
clause_list_str = [
|
|
74
|
+
clause_list_str = [
|
|
75
|
+
'~' + safename(t[1:]) if t.startswith('-')
|
|
76
|
+
else safename(t)
|
|
77
|
+
for t in clause
|
|
78
|
+
]
|
|
72
79
|
clause_str = ' or '.join(clause_list_str)
|
|
73
80
|
lines.append(indentation + f'C{index}: {clause_str}')
|
|
74
81
|
index += 1
|
|
75
82
|
return lines
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def safename(name: str) -> str:
|
|
86
|
+
return f'"{name}"' if ' ' in name else name
|
|
@@ -200,7 +200,7 @@ class UVLReader(TextToModel):
|
|
|
200
200
|
) -> list[Feature]:
|
|
201
201
|
list_features = []
|
|
202
202
|
for feature_context in group_spec_node.feature():
|
|
203
|
-
feature_name = feature_context.reference().getText()
|
|
203
|
+
feature_name = feature_context.reference().getText().replace('"', '')
|
|
204
204
|
feature = Feature(feature_name, [])
|
|
205
205
|
self.process_feature(feature, feature_context)
|
|
206
206
|
list_features.append(feature)
|
|
@@ -253,7 +253,7 @@ class UVLReader(TextToModel):
|
|
|
253
253
|
) -> Node:
|
|
254
254
|
"""Process a literal constraint."""
|
|
255
255
|
literal = literal_context.reference()
|
|
256
|
-
return Node(literal.getText())
|
|
256
|
+
return Node(literal.getText().replace('"', ''))
|
|
257
257
|
|
|
258
258
|
def process_parenthesis_constraint(
|
|
259
259
|
self, parenthesis_context: UVLPythonParser.ParenthesisConstraintContext
|
|
@@ -407,7 +407,7 @@ class UVLReader(TextToModel):
|
|
|
407
407
|
# Find ParseTree node of root feature
|
|
408
408
|
root_feature_ast = self.parse_tree.features().feature()
|
|
409
409
|
# Get the root and process it
|
|
410
|
-
feature_text = root_feature_ast.reference().getText()
|
|
410
|
+
feature_text = root_feature_ast.reference().getText().replace('"', '')
|
|
411
411
|
feature = Feature(feature_text, [])
|
|
412
412
|
root = self.process_feature(feature, root_feature_ast)
|
|
413
413
|
|
|
@@ -38,7 +38,7 @@ class UVLWriter(ModelToText):
|
|
|
38
38
|
result
|
|
39
39
|
+ "\n"
|
|
40
40
|
+ tab_count * "\t"
|
|
41
|
-
+ feature.name
|
|
41
|
+
+ safename(feature.name)
|
|
42
42
|
+ " "
|
|
43
43
|
+ self.read_attributes(feature)
|
|
44
44
|
)
|
|
@@ -56,7 +56,7 @@ class UVLWriter(ModelToText):
|
|
|
56
56
|
if feature.is_abstract:
|
|
57
57
|
attributes.append("abstract")
|
|
58
58
|
for attribute in feature.get_attributes():
|
|
59
|
-
attribute_str = attribute.name
|
|
59
|
+
attribute_str = safename(attribute.name)
|
|
60
60
|
if attribute.default_value is not None:
|
|
61
61
|
if isinstance(attribute.default_value, str):
|
|
62
62
|
attribute_str += f" '{attribute.default_value}'"
|
|
@@ -132,3 +132,7 @@ class UVLWriter(ModelToText):
|
|
|
132
132
|
),
|
|
133
133
|
)
|
|
134
134
|
)
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def safename(name: str) -> str:
|
|
138
|
+
return f'"{name}"' if ' ' in name else name
|
|
@@ -16,7 +16,7 @@ dev_requirements = read_requirements("requirements-dev.txt")
|
|
|
16
16
|
|
|
17
17
|
setuptools.setup(
|
|
18
18
|
name="flamapy-fm",
|
|
19
|
-
version="2.0.0.
|
|
19
|
+
version="2.0.0.dev8",
|
|
20
20
|
author="Flamapy",
|
|
21
21
|
author_email="flamapy@us.es",
|
|
22
22
|
description="flamapy-fm is a plugin to Flamapy module",
|
|
File without changes
|
|
File without changes
|
{flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/models/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|