Skip to content

Commit

Permalink
fix: solving minnor issue with uvl'
Browse files Browse the repository at this point in the history
  • Loading branch information
jagalindo committed Aug 22, 2024
2 parents d8f020d + ecc876b commit 7082054
Show file tree
Hide file tree
Showing 15 changed files with 139 additions and 34 deletions.
39 changes: 21 additions & 18 deletions flamapy/metamodels/fm_metamodel/operations/__init__.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,24 @@
from .fm_core_features import FMCoreFeatures, get_core_features
from .fm_count_leafs import FMCountLeafs, count_leaf_features
from .fm_leaf_features import FMLeafFeatures, get_leaf_features
from .fm_average_branching_factor import FMAverageBranchingFactor, average_branching_factor
from .fm_feature_ancestors import FMFeatureAncestors, get_feature_ancestors
from .fm_max_depth_tree import FMMaxDepthTree, max_depth_tree
from .fm_estimated_configurations_number import FMEstimatedConfigurationsNumber, \
count_configurations
from .fm_atomic_sets import FMAtomicSets, get_atomic_sets
from .fm_core_features import FMCoreFeatures
from .fm_count_leafs import FMCountLeafs
from .fm_leaf_features import FMLeafFeatures
from .fm_average_branching_factor import FMAverageBranchingFactor
from .fm_feature_ancestors import FMFeatureAncestors
from .fm_max_depth_tree import FMMaxDepthTree
from .fm_estimated_configurations_number import FMEstimatedConfigurationsNumber
from .fm_atomic_sets import FMAtomicSets
from .fm_metrics import FMMetrics
from .fm_generate_random_attribute import GenerateRandomAttribute
from .fm_variation_points import FMVariationPoints

__all__ = ['FMCoreFeatures', 'get_core_features',
'FMCountLeafs', 'count_leaf_features',
'FMLeafFeatures', 'get_leaf_features',
'FMAverageBranchingFactor', 'average_branching_factor',
'FMFeatureAncestors', 'get_feature_ancestors',
'FMMaxDepthTree', 'max_depth_tree',
'count_configurations',
'FMAtomicSets', 'get_atomic_sets', 'FMMetrics',
'GenerateRandomAttribute', 'FMEstimatedConfigurationsNumber']

__all__ = ['FMCoreFeatures',
'FMCountLeafs',
'FMLeafFeatures',
'FMAverageBranchingFactor',
'FMFeatureAncestors',
'FMMaxDepthTree',
'FMAtomicSets',
'FMMetrics',
'GenerateRandomAttribute',
'FMEstimatedConfigurationsNumber',
'FMVariationPoints']
14 changes: 11 additions & 3 deletions flamapy/metamodels/fm_metamodel/operations/fm_metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from flamapy.core.models.variability_model import VariabilityModel
from flamapy.core.operations.metrics_operation import Metrics
from flamapy.metamodels.fm_metamodel.models import FeatureModel, Feature
from flamapy.metamodels.fm_metamodel import operations as fm_operations
from flamapy.metamodels.fm_metamodel.operations import FMAverageBranchingFactor


def metric_method(func: Callable[..., dict[str, Any]]) -> Callable[..., dict[str, Any]]:
Expand All @@ -30,7 +30,7 @@ def __init__(self) -> None:
super().__init__()
self.model: Optional[FeatureModel] = None
self.result: list[dict[str, Any]] = []
self.model_type_extension = "fm"
self._model_type_extension = "fm"
self._features: list[Feature] = []
self._features_by_name: dict[str, Feature] = {}
self._abstract_features: dict[str, Feature] = {}
Expand All @@ -39,6 +39,14 @@ def __init__(self) -> None:
self._constraints_per_features: list[int] = []
self._feature_ancestors: list[int] = []

@property
def model_type_extension(self) -> str:
return self._model_type_extension

@model_type_extension.setter
def model_type_extension(self, ext: str) -> None:
self._model_type_extension = ext

def get_result(self) -> list[dict[str, Any]]:
return self.result

Expand Down Expand Up @@ -516,7 +524,7 @@ def branching_factor(self) -> dict[str, Any]:
raise FlamaException("Feature model is not defined.")

name = "Branching factor"
_avg_branching_factor = fm_operations.average_branching_factor(self.model)
_avg_branching_factor = FMAverageBranchingFactor().execute(self.model).get_result()
result = self.construct_result(
name=name, doc=self.branching_factor.__doc__, result=_avg_branching_factor
)
Expand Down
37 changes: 37 additions & 0 deletions flamapy/metamodels/fm_metamodel/operations/fm_variation_points.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
from typing import cast

from flamapy.core.models import VariabilityModel
from flamapy.metamodels.fm_metamodel.operations.interfaces import VariationPoints
from flamapy.metamodels.fm_metamodel.models import FeatureModel, Feature


class FMVariationPoints(VariationPoints):

def __init__(self) -> None:
self.result: dict[Feature, list[Feature]] = {}

def get_result(self) -> dict[Feature, list[Feature]]:
return self.result

def execute(self, model: VariabilityModel) -> 'FMVariationPoints':
fm_model = cast(FeatureModel, model)
self.result = variation_points(fm_model)
return self

def variation_points(self) -> dict[Feature, list[Feature]]:
return self.get_result()


def variation_points(feature_model: FeatureModel) -> dict[Feature, list[Feature]]:
vps: dict[Feature, list[Feature]] = {}
features = [feature_model.root]
while features:
feature = features.pop()
variants = []
for relation in feature.get_relations():
if not relation.is_mandatory():
variants.extend(relation.children)
if variants:
vps[feature] = variants
features.extend(feature.get_children())
return vps
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from .variation_points import VariationPoints


__all__ = ['VariationPoints']
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from abc import abstractmethod

from flamapy.core.operations import Operation

from flamapy.metamodels.fm_metamodel.models import Feature


class VariationPoints(Operation):
"""The variation points of a feature model are those features that require to make a choice
(i.e., select a variant).
This operation returns the variation points and the variants of each variation point.
"""

@abstractmethod
def __init__(self) -> None:
pass

@abstractmethod
def variation_points(self) -> dict[Feature, list[Feature]]:
pass
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,4 @@
'XMLReader',
'GlencoeReader',
'GlencoeWriter',
'ClaferWriter']
'ClaferWriter']
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import re
import string
from enum import Enum
from typing import Any, Optional

Expand Down Expand Up @@ -152,4 +153,8 @@ def parse_type_value(value: Any) -> str:


def safename(name: str) -> str:
return f'"{name}"' if ' ' in name else name
return f'"{name}"' if any(char not in safecharacters() for char in name) else name


def safecharacters() -> str:
return string.ascii_letters + string.digits + '_'
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import string
from xml.etree import ElementTree
from xml.etree.ElementTree import Element
from xml.dom import minidom
Expand Down Expand Up @@ -139,4 +140,8 @@ def prettify(xml: str) -> bytes:


def safename(name: str) -> str:
return f'"{name}"' if ' ' in name else name
return f'"{name}"' if any(char not in safecharacters() for char in name) else name


def safecharacters() -> str:
return string.ascii_letters + string.digits + '_'
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import json
import string
from typing import Any

from flamapy.core.models.ast import Node, ASTOperation
Expand Down Expand Up @@ -106,4 +107,8 @@ def _get_ctc_info(ast_node: Node) -> dict[str, Any]:


def safename(name: str) -> str:
return f'"{name}"' if ' ' in name else name
return f'"{name}"' if any(char not in safecharacters() for char in name) else name


def safecharacters() -> str:
return string.ascii_letters + string.digits + '_'
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import json
import string
from enum import Enum
from typing import Any, Dict, List

Expand Down Expand Up @@ -126,4 +127,8 @@ def get_ctc_info(ast_node: Node) -> Dict[str, Any]:


def safename(name: str) -> str:
return f'"{name}"' if ' ' in name else name
return f'"{name}"' if any(char not in safecharacters() for char in name) else name


def safecharacters() -> str:
return string.ascii_letters + string.digits + '_'
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import string

from flamapy.core.transformations import ModelToText
from flamapy.metamodels.fm_metamodel.models import (
FeatureModel,
Expand Down Expand Up @@ -83,4 +85,8 @@ def add_constraints(constraints: list[Constraint]) -> list[str]:


def safename(name: str) -> str:
return f'"{name}"' if ' ' in name else name
return f'"{name}"' if any(char not in safecharacters() for char in name) else name


def safecharacters() -> str:
return string.ascii_letters + string.digits + '_'
9 changes: 5 additions & 4 deletions flamapy/metamodels/fm_metamodel/transformations/uvl_reader.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ def process_attributes(
constraint_attribute = attribute_context.constraintAttribute()

if value_attribute:
key = value_attribute.key().getText()
key = value_attribute.key().getText().replace('"', '')
if value_attribute.value():
value = self.process_value(value_attribute.value())
else:
Expand All @@ -95,9 +95,10 @@ def process_attributes(
logging.warning("This attributes are not yet supported in flama.")
else:
# Handle unexpected case
raise ValueError(
f"Unknown attribute type for: {attribute_context.getText()}"
)
cleaned_text = attribute_context.getText().replace('"', '')

# Raise the ValueError with the cleaned text
raise ValueError(f"Unknown attribute type for: {cleaned_text}")

attributes_dict[key] = value
return attributes_dict
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import re
import string

from flamapy.core.models.ast import ASTOperation
from flamapy.core.transformations import ModelToText
Expand Down Expand Up @@ -135,4 +136,8 @@ def serialize_constraint(ctc: Constraint) -> str:


def safename(name: str) -> str:
return f'"{name}"' if ' ' in name else name
return f'"{name}"' if any(char not in safecharacters() for char in name) else name


def safecharacters() -> str:
return string.ascii_letters + string.digits + '_'
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
flamapy-fw~=2.0.0
flamapy-fw~=2.0.1
uvlparser~=2.0.1
afmparser~=1.0.3
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ def read_requirements(file):

setuptools.setup(
name="flamapy-fm",
version="2.0.0",
version="2.0.1",
author="Flamapy",
author_email="[email protected]",
description="flamapy-fm is a plugin to Flamapy module",
Expand Down

0 comments on commit 7082054

Please sign in to comment.