sampling-mining-workflows-dsl 0.0.1__tar.gz → 0.0.4__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.
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/PKG-INFO +6 -4
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/README.md +4 -2
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/pyproject.toml +1 -1
- sampling_mining_workflows_dsl-0.0.4/src/sampling_mining_workflows_dsl/element/Loader.py +42 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/element/loader/CsvLoader.py +0 -20
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/element/loader/JsonLoader.py +0 -21
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/element/writer/WriterFactory.py +1 -1
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/exec_visualizer/WorkflowVisualizer.py +8 -2
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/Operator.py +5 -5
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/test/Workflow_simple.py +2 -2
- sampling_mining_workflows_dsl-0.0.1/src/sampling_mining_workflows_dsl/element/Loader.py +0 -17
- sampling_mining_workflows_dsl-0.0.1/src/sampling_mining_workflows_dsl/github_seart/loader.py +0 -17
- sampling_mining_workflows_dsl-0.0.1/src/sampling_mining_workflows_dsl/github_seart/metadata.py +0 -106
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/.github/workflows/publish.yml +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/.gitignore +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/.logo.png +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/.vscode/launch.json +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/.vscode/settings.json +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/LICENSE.txt +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/out.json +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/ __init__.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/CompleteWorkflow.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/Workflow.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/WorkflowBuilder.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/analysis/ChiSquareAnalysis.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/analysis/CochranTest.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/analysis/CochranWorkflowAnalysis.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/analysis/CoverageTest.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/analysis/DistributionWorkflowAnalysis.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/analysis/HistAnalysis.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/analysis/HistWorkflowAnalysis.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/analysis/KSWorkflowAnalysis.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/analysis/WorkflowAnalysis.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/analysis/YamaneTest.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/analysis/YamaneWorkflowAnalysis.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/analysis/kolmogorov_smirnov.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/constraint/BoolComparator.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/constraint/BoolConstraint.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/constraint/BoolConstraintString.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/constraint/Comparator.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/constraint/Constraint.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/constraint/NaturalComparator.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/element/Element.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/element/Repository.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/element/Set.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/element/Writer.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/element/loader/LoaderFactory.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/element/writer/CsvWriter.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/element/writer/JsonWriter.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/metadata/Metadata.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/metadata/MetadataBoolean.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/metadata/MetadataDate.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/metadata/MetadataDict.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/metadata/MetadataList.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/metadata/MetadataNumber.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/metadata/MetadataString.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/metadata/MetadataValue.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/OperatorBuilder.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/OperatorFactory.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/clustering/GroupingOperator.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/clustering/SubWorkflowOperatorBuilder.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/selection/SelectionOperator.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/selection/filter/FilterOperator.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/selection/sampling/SamplingOperator.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/selection/sampling/automatic/AutomaticSamplingOperator.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/selection/sampling/automatic/RandomSelectionOperator.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/selection/sampling/automatic/RandomSelectionPartitionOperator.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/selection/sampling/automatic/SystematicRandomSelectionOperator.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/selection/sampling/automatic/SystematicSelectionOperator.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/selection/sampling/manual/InteractiveManualSamplingOperator.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/selection/sampling/manual/ManualSamplingOperator.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/set_algebra/ExternalSetOperator.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/set_algebra/InternalSetOperator.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/set_algebra/SetOperator.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/set_algebra/external_set_operator/DifferenceOperator.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/set_algebra/external_set_operator/IntersectionOperator.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/set_algebra/external_set_operator/UnionOperator.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/set_algebra/internal_set_operator/DifferenceOperator.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/set_algebra/internal_set_operator/IntersectionOperator.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/set_algebra/internal_set_operator/UnionOperator.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/set_algebra/set_operator/DifferenceOperator.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/set_algebra/set_operator/IntersectionOperator.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/set_algebra/set_operator/UnionOperator.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/test/ __init__.py +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/test/input.json +0 -0
- {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/toolbox.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: sampling-mining-workflows-dsl
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.4
|
|
4
4
|
Summary: A python internal DSL to specify, execute and analyse mining software repositories sampling workflows.
|
|
5
5
|
Author: Maïwenn Le Goasteller
|
|
6
6
|
Author-email: Romain Lefeuvre <contact@romainlefeuvre.com>
|
|
@@ -87,8 +87,6 @@ PythonWorkflowDSL/
|
|
|
87
87
|
│ └── writer/ # Data writer implementations
|
|
88
88
|
├── exec_visualizer/ # Execution visualization
|
|
89
89
|
│ └── ... # Local server and visualization tools
|
|
90
|
-
├── github_seart/ # GitHub SEART integration
|
|
91
|
-
│ └── ... # SEART data loader and metadata
|
|
92
90
|
├── metadata/ # Metadata system
|
|
93
91
|
│ └── ... # Boolean, date, string metadata types
|
|
94
92
|
├── operator/ # Workflow operators
|
|
@@ -113,6 +111,10 @@ Recommended: install and use [`uv`](https://github.com/astral-sh/uv)
|
|
|
113
111
|
|
|
114
112
|
1. ```uv init```
|
|
115
113
|
2. ```uv pip install https://github.com/RomainLefeuvre/samplingMiningWorkflowDSL.git```
|
|
114
|
+
|
|
115
|
+
you can also use the published version on pypi
|
|
116
|
+
1. ```pip install sampling-mining-workflows-dsl```
|
|
117
|
+
|
|
116
118
|
### Template Repository
|
|
117
119
|
|
|
118
120
|
A complete template with examples is available at:
|
|
@@ -70,8 +70,6 @@ PythonWorkflowDSL/
|
|
|
70
70
|
│ └── writer/ # Data writer implementations
|
|
71
71
|
├── exec_visualizer/ # Execution visualization
|
|
72
72
|
│ └── ... # Local server and visualization tools
|
|
73
|
-
├── github_seart/ # GitHub SEART integration
|
|
74
|
-
│ └── ... # SEART data loader and metadata
|
|
75
73
|
├── metadata/ # Metadata system
|
|
76
74
|
│ └── ... # Boolean, date, string metadata types
|
|
77
75
|
├── operator/ # Workflow operators
|
|
@@ -96,6 +94,10 @@ Recommended: install and use [`uv`](https://github.com/astral-sh/uv)
|
|
|
96
94
|
|
|
97
95
|
1. ```uv init```
|
|
98
96
|
2. ```uv pip install https://github.com/RomainLefeuvre/samplingMiningWorkflowDSL.git```
|
|
97
|
+
|
|
98
|
+
you can also use the published version on pypi
|
|
99
|
+
1. ```pip install sampling-mining-workflows-dsl```
|
|
100
|
+
|
|
99
101
|
### Template Repository
|
|
100
102
|
|
|
101
103
|
A complete template with examples is available at:
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "sampling-mining-workflows-dsl"
|
|
7
|
-
version = "0.0.
|
|
7
|
+
version = "0.0.4"
|
|
8
8
|
description = "A python internal DSL to specify, execute and analyse mining software repositories sampling workflows."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.13"
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
from typing import TYPE_CHECKING, Any
|
|
3
|
+
|
|
4
|
+
from sampling_mining_workflows_dsl.element.Set import Set
|
|
5
|
+
from sampling_mining_workflows_dsl.metadata.Metadata import Metadata
|
|
6
|
+
from sampling_mining_workflows_dsl.element.Repository import Repository
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from sampling_mining_workflows_dsl.metadata.MetadataValue import MetadataValue
|
|
10
|
+
|
|
11
|
+
class Loader(ABC):
|
|
12
|
+
def __init__(self, *metadatas: Metadata | None):
|
|
13
|
+
# Assuming the first metadata is the ID, store its name for further use
|
|
14
|
+
self.metadata_id_name = metadatas[0].name
|
|
15
|
+
self.metadatas: dict[str, Metadata] = {}
|
|
16
|
+
for metadata in metadatas:
|
|
17
|
+
self.metadatas[metadata.name] = metadata
|
|
18
|
+
|
|
19
|
+
@abstractmethod
|
|
20
|
+
def load_set(self) -> Set:
|
|
21
|
+
pass
|
|
22
|
+
|
|
23
|
+
def create_repository_from_map(self, map_object: dict[str, Any]) -> Repository:
|
|
24
|
+
id_metadata_value = map_object.get(self.metadata_id_name)
|
|
25
|
+
|
|
26
|
+
if id_metadata_value is None or id_metadata_value == "":
|
|
27
|
+
raise ValueError(f"Invalid ID {self.metadata_id_name}")
|
|
28
|
+
|
|
29
|
+
repo = Repository(self.metadatas.get(self.metadata_id_name))
|
|
30
|
+
|
|
31
|
+
metadata_values: list[MetadataValue] = []
|
|
32
|
+
for metadata in self.metadatas.values():
|
|
33
|
+
try:
|
|
34
|
+
metadata_value = metadata.create_metadata_value(map_object.get(metadata.name))
|
|
35
|
+
metadata_values.append(metadata_value)
|
|
36
|
+
except Exception as e:
|
|
37
|
+
raise ValueError(
|
|
38
|
+
f"Error creating metadata value for '{metadata.name}' with value '{map_object.get(metadata.name)}'",
|
|
39
|
+
) from e
|
|
40
|
+
|
|
41
|
+
repo.add_metadata_values(metadata_values)
|
|
42
|
+
return repo
|
|
@@ -45,23 +45,3 @@ class CsvLoader(Loader):
|
|
|
45
45
|
except OSError as e:
|
|
46
46
|
raise RuntimeError("Error reading the CSV file", e) from e
|
|
47
47
|
|
|
48
|
-
def create_repository_from_map(self, csv_row: dict[str, Any]) -> Repository:
|
|
49
|
-
id_metadata_value = csv_row.get(self.metadata_id_name)
|
|
50
|
-
|
|
51
|
-
if id_metadata_value is None or id_metadata_value == "":
|
|
52
|
-
raise ValueError(f"Invalid ID {self.metadata_id_name}")
|
|
53
|
-
|
|
54
|
-
repo = Repository(self.metadatas.get(self.metadata_id_name))
|
|
55
|
-
|
|
56
|
-
metadata_values: list[MetadataValue] = []
|
|
57
|
-
for metadata in self.metadatas.values():
|
|
58
|
-
try:
|
|
59
|
-
metadata_value = metadata.create_metadata_value(csv_row.get(metadata.name))
|
|
60
|
-
metadata_values.append(metadata_value)
|
|
61
|
-
except Exception as e:
|
|
62
|
-
raise ValueError(
|
|
63
|
-
f"Error creating metadata value for '{metadata.name}' with value '{csv_row.get(metadata.name)}'",
|
|
64
|
-
) from e
|
|
65
|
-
|
|
66
|
-
repo.add_metadata_values(metadata_values)
|
|
67
|
-
return repo
|
|
@@ -45,27 +45,6 @@ class JsonLoader(Loader):
|
|
|
45
45
|
except OSError as e:
|
|
46
46
|
raise RuntimeError("Error reading the JSON file", e) from e
|
|
47
47
|
|
|
48
|
-
def create_repository_from_map(self, json_object: dict[str, Any]) -> Repository:
|
|
49
|
-
id_metadata_value = json_object.get(self.metadata_id_name)
|
|
50
|
-
|
|
51
|
-
if id_metadata_value is None or id_metadata_value == "":
|
|
52
|
-
raise ValueError(f"Invalid ID {self.metadata_id_name}")
|
|
53
|
-
|
|
54
|
-
repo = Repository(self.metadatas.get(self.metadata_id_name))
|
|
55
|
-
|
|
56
|
-
metadata_values: list[MetadataValue] = []
|
|
57
|
-
for metadata in self.metadatas.values():
|
|
58
|
-
try:
|
|
59
|
-
metadata_value = metadata.create_metadata_value(json_object.get(metadata.name))
|
|
60
|
-
metadata_values.append(metadata_value)
|
|
61
|
-
except Exception as e:
|
|
62
|
-
raise ValueError(
|
|
63
|
-
f"Error creating metadata value for '{metadata.name}' with value '{json_object.get(metadata.name)}'",
|
|
64
|
-
) from e
|
|
65
|
-
|
|
66
|
-
repo.add_metadata_values(metadata_values)
|
|
67
|
-
return repo
|
|
68
|
-
|
|
69
48
|
@staticmethod
|
|
70
49
|
def parse_args(args: list[str]) -> dict[str, str]:
|
|
71
50
|
import argparse
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import os
|
|
2
|
+
import re
|
|
2
3
|
from typing import cast
|
|
3
4
|
|
|
4
5
|
from graphviz import Digraph
|
|
@@ -11,9 +12,10 @@ from sampling_mining_workflows_dsl.operator.selection.filter.FilterOperator impo
|
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
class WorkflowVisualizer:
|
|
14
|
-
def __init__(self, workflow,output_dir: str = "output_workflow_graph"):
|
|
15
|
+
def __init__(self, workflow, output_dir: str = "output_workflow_graph", wrap_constraint_operators: bool = False):
|
|
15
16
|
self.workflow = workflow
|
|
16
17
|
self.global_set_counter = 0 # Global counter shared across all levels
|
|
18
|
+
self.wrap_constraint_operators = wrap_constraint_operators
|
|
17
19
|
if output_dir:
|
|
18
20
|
self.output_dir = output_dir
|
|
19
21
|
os.makedirs(self.output_dir, exist_ok=True)
|
|
@@ -51,8 +53,10 @@ class WorkflowVisualizer:
|
|
|
51
53
|
dot.edge(node, "OutputSet")
|
|
52
54
|
|
|
53
55
|
# Render
|
|
54
|
-
dot.
|
|
56
|
+
dot_path = dot.save(f"{svg_path}.dot")
|
|
57
|
+
dot.render(svg_path, format="svg", cleanup=False)
|
|
55
58
|
print(f"Workflow graph saved to {svg_path}")
|
|
59
|
+
print(f"Editable Graphviz source saved to {dot_path}")
|
|
56
60
|
|
|
57
61
|
# HTML wrapper
|
|
58
62
|
self.create_html_page(svg_path)
|
|
@@ -86,6 +90,8 @@ class WorkflowVisualizer:
|
|
|
86
90
|
constraint = cast(
|
|
87
91
|
"BoolConstraintString", op.get_constraint()
|
|
88
92
|
).get_string_constraint()
|
|
93
|
+
if self.wrap_constraint_operators:
|
|
94
|
+
constraint = re.sub(r'\s+(and|or)\s+', r'\n\1 ', constraint, flags=re.IGNORECASE)
|
|
89
95
|
formatted_size = f"{output_set.flatten_set().size():,}".replace(',', ' ')
|
|
90
96
|
label = f"Filter Operator\n{constraint}\n\nSET#{self.global_set_counter}\n Size : {formatted_size}"
|
|
91
97
|
elif isinstance(op.get_constraint(), BoolConstraint):
|
|
@@ -16,7 +16,7 @@ class Operator(ABC):
|
|
|
16
16
|
self.workflow = worflow
|
|
17
17
|
self._input: Set | None = None
|
|
18
18
|
self._output: Set | None = None
|
|
19
|
-
self.
|
|
19
|
+
self._output_writer: Writer | None = None
|
|
20
20
|
self._next_operator: Operator | None = None
|
|
21
21
|
self._previous_operator: Operator | None = None
|
|
22
22
|
# Loader to add metadata on output during the execution
|
|
@@ -68,8 +68,8 @@ class Operator(ABC):
|
|
|
68
68
|
if self._next_operator:
|
|
69
69
|
self._next_operator._input = self._output
|
|
70
70
|
self._next_operator.execute()
|
|
71
|
-
elif self.
|
|
72
|
-
self.
|
|
71
|
+
elif self._output_writer:
|
|
72
|
+
self._output_writer.write_set(self._output)
|
|
73
73
|
return self
|
|
74
74
|
|
|
75
75
|
def get_workflow_root_operator(self) -> "Operator":
|
|
@@ -99,8 +99,8 @@ class Operator(ABC):
|
|
|
99
99
|
result.add_element(element)
|
|
100
100
|
return result
|
|
101
101
|
|
|
102
|
-
def output(self,
|
|
103
|
-
self.
|
|
102
|
+
def output(self, writer: Writer) -> "Operator":
|
|
103
|
+
self._output_writer = writer
|
|
104
104
|
return self
|
|
105
105
|
|
|
106
106
|
def input_set(self, input_set: Set) -> "Operator":
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from sampling_mining_workflows_dsl.element.loader.LoaderFactory import LoaderFactory
|
|
2
|
-
from sampling_mining_workflows_dsl.element.writer.WriterFactory import
|
|
2
|
+
from sampling_mining_workflows_dsl.element.writer.WriterFactory import WriterFactory
|
|
3
3
|
from sampling_mining_workflows_dsl.exec_visualizer.WorkflowVisualizer import WorkflowVisualizer
|
|
4
4
|
from sampling_mining_workflows_dsl.metadata.Metadata import Metadata
|
|
5
5
|
from sampling_mining_workflows_dsl.operator.clustering.SubWorkflowOperatorBuilder import (
|
|
@@ -8,7 +8,7 @@ from sampling_mining_workflows_dsl.operator.clustering.SubWorkflowOperatorBuilde
|
|
|
8
8
|
from sampling_mining_workflows_dsl.WorkflowBuilder import WorkflowBuilder
|
|
9
9
|
|
|
10
10
|
json_loader = LoaderFactory.json_loader
|
|
11
|
-
json_writer =
|
|
11
|
+
json_writer = WriterFactory.json_writer
|
|
12
12
|
filter_operator = SubWorkflowOperatorBuilder.filter_operator
|
|
13
13
|
|
|
14
14
|
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
from abc import ABC, abstractmethod
|
|
2
|
-
|
|
3
|
-
from sampling_mining_workflows_dsl.element import Set
|
|
4
|
-
from sampling_mining_workflows_dsl.metadata.Metadata import Metadata
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class Loader(ABC):
|
|
8
|
-
def __init__(self, *metadatas: Metadata | None):
|
|
9
|
-
# Assuming the first metadata is the ID, store its name for further use
|
|
10
|
-
self.metadata_id_name = metadatas[0].name
|
|
11
|
-
self.metadatas: dict[str, Metadata] = {}
|
|
12
|
-
for metadata in metadatas:
|
|
13
|
-
self.metadatas[metadata.name] = metadata
|
|
14
|
-
|
|
15
|
-
@abstractmethod
|
|
16
|
-
def load_set(self) -> Set:
|
|
17
|
-
pass
|
sampling_mining_workflows_dsl-0.0.1/src/sampling_mining_workflows_dsl/github_seart/loader.py
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
from pathlib import Path
|
|
2
|
-
from typing import TYPE_CHECKING, Any
|
|
3
|
-
|
|
4
|
-
from sampling_mining_workflows_dsl.element.loader.CsvLoader import CsvLoader
|
|
5
|
-
from sampling_mining_workflows_dsl.element.Repository import Repository
|
|
6
|
-
from sampling_mining_workflows_dsl.element.Set import Set
|
|
7
|
-
from sampling_mining_workflows_dsl.github_seart.metadata import all_metadatas
|
|
8
|
-
|
|
9
|
-
if TYPE_CHECKING:
|
|
10
|
-
from sampling_mining_workflows_dsl.metadata.MetadataValue import MetadataValue
|
|
11
|
-
|
|
12
|
-
class SEARTGithubLoader(CsvLoader):
|
|
13
|
-
def __init__(self, set_path: Path):
|
|
14
|
-
super().__init__(*all_metadatas)
|
|
15
|
-
self.set_path = set_path
|
|
16
|
-
self.set = Set()
|
|
17
|
-
|
sampling_mining_workflows_dsl-0.0.1/src/sampling_mining_workflows_dsl/github_seart/metadata.py
DELETED
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import json
|
|
3
|
-
from typing import TypedDict
|
|
4
|
-
|
|
5
|
-
from sampling_mining_workflows_dsl.metadata.Metadata import Metadata
|
|
6
|
-
from sampling_mining_workflows_dsl.metadata.MetadataValue import MetadataValue
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class LanguageMetrics(TypedDict):
|
|
10
|
-
commentLines: int
|
|
11
|
-
codeLines: int
|
|
12
|
-
blankLines: int
|
|
13
|
-
|
|
14
|
-
class MetadataMetrics(Metadata[dict[str, LanguageMetrics]]):
|
|
15
|
-
def __init__(self, name: str):
|
|
16
|
-
super().__init__(name, dict[str, LanguageMetrics])
|
|
17
|
-
|
|
18
|
-
def create_metadata_value(self, value):
|
|
19
|
-
# the raw value is list[dict[str, str|int]], convert it to dict[str, LanguageMetrics]
|
|
20
|
-
typed_value = {}
|
|
21
|
-
for item in json.loads(value):
|
|
22
|
-
lang = item["language"]
|
|
23
|
-
metrics = LanguageMetrics(
|
|
24
|
-
commentLines=item.get("commentLines", 0),
|
|
25
|
-
codeLines=item.get("codeLines", 0),
|
|
26
|
-
blankLines=item.get("blankLines", 0),
|
|
27
|
-
)
|
|
28
|
-
typed_value[lang] = metrics
|
|
29
|
-
|
|
30
|
-
return MetadataValue(self, typed_value)
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
id = Metadata.of_string("id")
|
|
35
|
-
name = Metadata.of_string("name")
|
|
36
|
-
isFork = Metadata.of_boolean("isFork")
|
|
37
|
-
commits = Metadata.of_integer("commits")
|
|
38
|
-
branches = Metadata.of_integer("branches")
|
|
39
|
-
releases = Metadata.of_integer("releases")
|
|
40
|
-
forks = Metadata.of_integer("forks")
|
|
41
|
-
mainLanguage = Metadata.of_string("mainLanguage")
|
|
42
|
-
defaultBranch = Metadata.of_string("defaultBranch")
|
|
43
|
-
license = Metadata.of_string("license")
|
|
44
|
-
homepage = Metadata.of_string("homepage")
|
|
45
|
-
watchers = Metadata.of_integer("watchers")
|
|
46
|
-
stargazers = Metadata.of_integer("stargazers")
|
|
47
|
-
contributors = Metadata.of_integer("contributors")
|
|
48
|
-
size = Metadata.of_integer("size")
|
|
49
|
-
createdAt = Metadata.of_date("createdAt")
|
|
50
|
-
pushedAt = Metadata.of_date("pushedAt")
|
|
51
|
-
updatedAt = Metadata.of_date("updatedAt")
|
|
52
|
-
totalIssues = Metadata.of_integer("totalIssues")
|
|
53
|
-
openIssues = Metadata.of_integer("openIssues")
|
|
54
|
-
totalPullRequests = Metadata.of_integer("totalPullRequests")
|
|
55
|
-
openPullRequests = Metadata.of_integer("openPullRequests")
|
|
56
|
-
blankLines = Metadata.of_integer("blankLines")
|
|
57
|
-
codeLines = Metadata.of_integer("codeLines")
|
|
58
|
-
commentLines = Metadata.of_integer("commentLines")
|
|
59
|
-
metrics = MetadataMetrics("metrics")
|
|
60
|
-
lastCommit = Metadata.of_date("lastCommit")
|
|
61
|
-
lastCommitSHA = Metadata.of_string("lastCommitSHA")
|
|
62
|
-
hasWiki = Metadata.of_boolean("hasWiki")
|
|
63
|
-
isArchived = Metadata.of_boolean("isArchived")
|
|
64
|
-
isDisabled = Metadata.of_boolean("isDisabled")
|
|
65
|
-
isLocked = Metadata.of_boolean("isLocked")
|
|
66
|
-
languages = Metadata.of_dict("languages", str, int, lambda s: json.loads(s) if s else {})
|
|
67
|
-
labels = Metadata.of_list("labels", list[str], lambda s: s.split(";") if s else [])
|
|
68
|
-
topics = Metadata.of_list("topics", list[str], lambda s: s.split(";") if s else [])
|
|
69
|
-
|
|
70
|
-
all_metadatas = [
|
|
71
|
-
id,
|
|
72
|
-
name,
|
|
73
|
-
isFork,
|
|
74
|
-
commits,
|
|
75
|
-
branches,
|
|
76
|
-
releases,
|
|
77
|
-
forks,
|
|
78
|
-
mainLanguage,
|
|
79
|
-
defaultBranch,
|
|
80
|
-
license,
|
|
81
|
-
homepage,
|
|
82
|
-
watchers,
|
|
83
|
-
stargazers,
|
|
84
|
-
contributors,
|
|
85
|
-
size,
|
|
86
|
-
createdAt,
|
|
87
|
-
pushedAt,
|
|
88
|
-
updatedAt,
|
|
89
|
-
totalIssues,
|
|
90
|
-
openIssues,
|
|
91
|
-
totalPullRequests,
|
|
92
|
-
openPullRequests,
|
|
93
|
-
blankLines,
|
|
94
|
-
codeLines,
|
|
95
|
-
commentLines,
|
|
96
|
-
metrics,
|
|
97
|
-
lastCommit,
|
|
98
|
-
lastCommitSHA,
|
|
99
|
-
hasWiki,
|
|
100
|
-
isArchived,
|
|
101
|
-
isDisabled,
|
|
102
|
-
isLocked,
|
|
103
|
-
languages,
|
|
104
|
-
labels,
|
|
105
|
-
topics
|
|
106
|
-
]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/.vscode/launch.json
RENAMED
|
File without changes
|
{sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/.vscode/settings.json
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
|
|
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
|
|
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
|