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.
Files changed (86) hide show
  1. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/PKG-INFO +6 -4
  2. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/README.md +4 -2
  3. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/pyproject.toml +1 -1
  4. sampling_mining_workflows_dsl-0.0.4/src/sampling_mining_workflows_dsl/element/Loader.py +42 -0
  5. {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
  6. {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
  7. {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
  8. {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
  9. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/Operator.py +5 -5
  10. {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
  11. sampling_mining_workflows_dsl-0.0.1/src/sampling_mining_workflows_dsl/element/Loader.py +0 -17
  12. sampling_mining_workflows_dsl-0.0.1/src/sampling_mining_workflows_dsl/github_seart/loader.py +0 -17
  13. sampling_mining_workflows_dsl-0.0.1/src/sampling_mining_workflows_dsl/github_seart/metadata.py +0 -106
  14. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/.github/workflows/publish.yml +0 -0
  15. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/.gitignore +0 -0
  16. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/.logo.png +0 -0
  17. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/.vscode/launch.json +0 -0
  18. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/.vscode/settings.json +0 -0
  19. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/LICENSE.txt +0 -0
  20. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/out.json +0 -0
  21. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/ __init__.py +0 -0
  22. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/CompleteWorkflow.py +0 -0
  23. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/Workflow.py +0 -0
  24. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/WorkflowBuilder.py +0 -0
  25. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/analysis/ChiSquareAnalysis.py +0 -0
  26. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/analysis/CochranTest.py +0 -0
  27. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/analysis/CochranWorkflowAnalysis.py +0 -0
  28. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/analysis/CoverageTest.py +0 -0
  29. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/analysis/DistributionWorkflowAnalysis.py +0 -0
  30. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/analysis/HistAnalysis.py +0 -0
  31. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/analysis/HistWorkflowAnalysis.py +0 -0
  32. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/analysis/KSWorkflowAnalysis.py +0 -0
  33. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/analysis/WorkflowAnalysis.py +0 -0
  34. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/analysis/YamaneTest.py +0 -0
  35. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/analysis/YamaneWorkflowAnalysis.py +0 -0
  36. {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
  37. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/constraint/BoolComparator.py +0 -0
  38. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/constraint/BoolConstraint.py +0 -0
  39. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/constraint/BoolConstraintString.py +0 -0
  40. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/constraint/Comparator.py +0 -0
  41. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/constraint/Constraint.py +0 -0
  42. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/constraint/NaturalComparator.py +0 -0
  43. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/element/Element.py +0 -0
  44. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/element/Repository.py +0 -0
  45. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/element/Set.py +0 -0
  46. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/element/Writer.py +0 -0
  47. {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
  48. {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
  49. {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
  50. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/metadata/Metadata.py +0 -0
  51. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/metadata/MetadataBoolean.py +0 -0
  52. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/metadata/MetadataDate.py +0 -0
  53. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/metadata/MetadataDict.py +0 -0
  54. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/metadata/MetadataList.py +0 -0
  55. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/metadata/MetadataNumber.py +0 -0
  56. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/metadata/MetadataString.py +0 -0
  57. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/metadata/MetadataValue.py +0 -0
  58. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/OperatorBuilder.py +0 -0
  59. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/operator/OperatorFactory.py +0 -0
  60. {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
  61. {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
  62. {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
  63. {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
  64. {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
  65. {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
  66. {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
  67. {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
  68. {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
  69. {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
  70. {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
  71. {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
  72. {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
  73. {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
  74. {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
  75. {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
  76. {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
  77. {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
  78. {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
  79. {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
  80. {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
  81. {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
  82. {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
  83. {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
  84. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/test/ __init__.py +0 -0
  85. {sampling_mining_workflows_dsl-0.0.1 → sampling_mining_workflows_dsl-0.0.4}/src/sampling_mining_workflows_dsl/test/input.json +0 -0
  86. {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.4
1
+ Metadata-Version: 2.5
2
2
  Name: sampling-mining-workflows-dsl
3
- Version: 0.0.1
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.1"
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,7 +1,7 @@
1
1
  from sampling_mining_workflows_dsl.element.writer.JsonWriter import JsonWriter
2
2
 
3
3
 
4
- class WritterFactory:
4
+ class WriterFactory:
5
5
  @staticmethod
6
6
  def json_writer(path: str):
7
7
  return JsonWriter(path)
@@ -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.render(svg_path, format="svg", cleanup=True)
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._output_writter: Writer | None = None
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._output_writter:
72
- self._output_writter.write_set(self._output)
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, writter: Writer) -> "Operator":
103
- self._output_writter = writter
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 WritterFactory
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 = WritterFactory.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
@@ -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
-
@@ -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
- ]