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.
Files changed (38) hide show
  1. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/PKG-INFO +1 -1
  2. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/clafer_writer.py +7 -3
  3. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/featureide_writer.py +6 -2
  4. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/glencoe_writer.py +8 -4
  5. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/json_writer.py +7 -3
  6. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/splot_writer.py +17 -6
  7. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/uvl_reader.py +3 -3
  8. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/uvl_writer.py +6 -2
  9. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy_fm.egg-info/PKG-INFO +1 -1
  10. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy_fm.egg-info/requires.txt +1 -1
  11. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/setup.py +1 -1
  12. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/README.md +0 -0
  13. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/__init__.py +0 -0
  14. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/models/__init__.py +0 -0
  15. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/models/feature_model.py +0 -0
  16. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/operations/__init__.py +0 -0
  17. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/operations/fm_atomic_sets.py +0 -0
  18. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/operations/fm_average_branching_factor.py +0 -0
  19. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/operations/fm_core_features.py +0 -0
  20. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/operations/fm_count_leafs.py +0 -0
  21. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/operations/fm_estimated_configurations_number.py +0 -0
  22. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/operations/fm_feature_ancestors.py +0 -0
  23. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/operations/fm_generate_random_attribute.py +0 -0
  24. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/operations/fm_leaf_features.py +0 -0
  25. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/operations/fm_max_depth_tree.py +0 -0
  26. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/operations/fm_metrics.py +0 -0
  27. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/__init__.py +0 -0
  28. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/afm_reader.py +0 -0
  29. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/afm_writer.py +0 -0
  30. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/featureide_reader.py +0 -0
  31. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/glencoe_reader.py +0 -0
  32. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/json_reader.py +0 -0
  33. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/pysat_to_fm.py +0 -0
  34. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy/metamodels/fm_metamodel/transformations/xml_reader.py +0 -0
  35. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy_fm.egg-info/SOURCES.txt +0 -0
  36. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy_fm.egg-info/dependency_links.txt +0 -0
  37. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/flamapy_fm.egg-info/top_level.txt +0 -0
  38. {flamapy-fm-2.0.0.dev6 → flamapy-fm-2.0.0.dev8}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flamapy-fm
3
- Version: 2.0.0.dev6
3
+ Version: 2.0.0.dev8
4
4
  Summary: flamapy-fm is a plugin to Flamapy module
5
5
  Home-page: https://github.com/flamapy/fm_metamodel
6
6
  Author: Flamapy
@@ -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
- lines.append(f'<feature_model name="{model.root.name}">')
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(indentation + TAB + f': {child.name} ({child.name})')
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 = ['~' + t[1:] if t.startswith('-') else t for t in clause]
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flamapy-fm
3
- Version: 2.0.0.dev6
3
+ Version: 2.0.0.dev8
4
4
  Summary: flamapy-fm is a plugin to Flamapy module
5
5
  Home-page: https://github.com/flamapy/fm_metamodel
6
6
  Author: Flamapy
@@ -1,4 +1,4 @@
1
- flamapy-fw==2.0.0.dev6
1
+ flamapy-fw==2.0.0.dev7
2
2
  uvlparser==2.0.1
3
3
  afmparser==1.0.3
4
4
 
@@ -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.dev6",
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",