sflkit 0.5.1__tar.gz → 0.5.3__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.
- {sflkit-0.5.1/src/sflkit.egg-info → sflkit-0.5.3}/PKG-INFO +1 -1
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/__init__.py +1 -1
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/analysis/factory.py +39 -32
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/analysis/spectra.py +1 -1
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/features/handler.py +16 -13
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/features/vector.py +1 -1
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/model/parallel.py +6 -4
- {sflkit-0.5.1 → sflkit-0.5.3/src/sflkit.egg-info}/PKG-INFO +1 -1
- {sflkit-0.5.1 → sflkit-0.5.3}/LICENSE +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/README.md +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/pyproject.toml +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/setup.cfg +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/analysis/__init__.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/analysis/analysis_type.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/analysis/analyzer.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/analysis/mapping.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/analysis/predicate.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/analysis/similarity.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/analysis/suggestion.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/cli.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/color.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/config.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/evaluation.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/events/__init__.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/events/event_file.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/events/mapping.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/features/__init__.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/features/value.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/instrumentation/__init__.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/instrumentation/dir_instrumentation.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/instrumentation/file_instrumentation.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/__init__.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/extract.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/finder.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/java/__init__.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/java/extract.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/java/factory.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/java/finder.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/java/visitor.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/language.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/meta.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/python/__init__.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/python/extract.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/python/factory.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/python/finder.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/python/visitor.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/visitor.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/logger.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/model/__init__.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/model/model.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/model/scope.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/runners/__init__.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/runners/run.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/weights/__init__.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/weights/analyzer.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/weights/models.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit.egg-info/SOURCES.txt +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit.egg-info/dependency_links.txt +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit.egg-info/entry_points.txt +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit.egg-info/requires.txt +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit.egg-info/top_level.txt +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_analysis_objects.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_analyzer.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_cli.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_color.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_config.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_coverage.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_dependency_weights.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_evaluation.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_events.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_execution.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_features.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_instrumentation.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_language.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_parallelization.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_predicates.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_runner.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_runner_parallel.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_runner_pytest_versions.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_scope.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_spectra.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_suggestions.py +0 -0
- {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_visitors.py +0 -0
|
@@ -179,28 +179,30 @@ class DefUseFactory(AnalysisFactory):
|
|
|
179
179
|
self.id_to_def: dict[EventFile, dict[tuple[str, int], DefEvent]] = dict()
|
|
180
180
|
|
|
181
181
|
def reset(self, event_file: EventFile):
|
|
182
|
-
self.
|
|
182
|
+
with self._lock:
|
|
183
|
+
self.id_to_def[event_file] = dict()
|
|
183
184
|
|
|
184
185
|
def get_analysis(
|
|
185
186
|
self, event, event_file: EventFile, scope: Scope = None
|
|
186
187
|
) -> List[AnalysisObject]:
|
|
187
188
|
if event.event_type == EventType.DEF:
|
|
188
|
-
self.
|
|
189
|
+
with self._lock:
|
|
190
|
+
self.id_to_def[event_file][(event.var, event.var_id)] = event
|
|
189
191
|
elif event.event_type == EventType.USE:
|
|
190
|
-
|
|
192
|
+
with self._lock:
|
|
193
|
+
def_event = self.id_to_def[event_file].get((event.var, event.var_id))
|
|
194
|
+
if def_event:
|
|
191
195
|
key = (
|
|
192
196
|
DefUse.analysis_type(),
|
|
193
|
-
|
|
194
|
-
|
|
197
|
+
def_event.file,
|
|
198
|
+
def_event.line,
|
|
195
199
|
event.file,
|
|
196
200
|
event.line,
|
|
197
201
|
event.var,
|
|
198
202
|
)
|
|
199
203
|
with self._lock:
|
|
200
204
|
if key not in self.objects:
|
|
201
|
-
self.objects[key] = DefUse(
|
|
202
|
-
self.id_to_def[event_file][(event.var, event.var_id)], event
|
|
203
|
-
)
|
|
205
|
+
self.objects[key] = DefUse(def_event, event)
|
|
204
206
|
return [self.objects[key]]
|
|
205
207
|
return None
|
|
206
208
|
|
|
@@ -265,24 +267,23 @@ class ScalarPairFactory(ComparisonFactory):
|
|
|
265
267
|
for types in (["int", "float", "bool"], ["str"], ["bytes"]):
|
|
266
268
|
if event.type_ in types:
|
|
267
269
|
for variable in variables:
|
|
268
|
-
if variable.
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
objects.append(self.objects[key])
|
|
270
|
+
if variable.type_ in types:
|
|
271
|
+
for comp in self.comparators:
|
|
272
|
+
key = (
|
|
273
|
+
ScalarPair.analysis_type(),
|
|
274
|
+
event.file,
|
|
275
|
+
event.line,
|
|
276
|
+
event.var,
|
|
277
|
+
variable.var,
|
|
278
|
+
comp,
|
|
279
|
+
types[0],
|
|
280
|
+
)
|
|
281
|
+
with self._lock:
|
|
282
|
+
if key not in self.objects:
|
|
283
|
+
self.objects[key] = ScalarPair(
|
|
284
|
+
event, comp, variable.var
|
|
285
|
+
)
|
|
286
|
+
objects.append(self.objects[key])
|
|
286
287
|
else:
|
|
287
288
|
for variable in variables:
|
|
288
289
|
if variable.type_ == event.type_:
|
|
@@ -365,8 +366,8 @@ class ReturnFactory(ComparisonFactory):
|
|
|
365
366
|
self.objects[key] = ReturnPredicate(
|
|
366
367
|
event, comp, value=tr
|
|
367
368
|
)
|
|
368
|
-
|
|
369
|
-
|
|
369
|
+
objects.append(self.objects[key])
|
|
370
|
+
elif event.type_ == "NoneType":
|
|
370
371
|
for comp in Comp.EQ, Comp.NE:
|
|
371
372
|
if comp in self.comparators:
|
|
372
373
|
key = (
|
|
@@ -394,8 +395,12 @@ class ReturnFactory(ComparisonFactory):
|
|
|
394
395
|
comp,
|
|
395
396
|
"NoneType",
|
|
396
397
|
)
|
|
397
|
-
|
|
398
|
-
|
|
398
|
+
with self._lock:
|
|
399
|
+
if key not in self.objects:
|
|
400
|
+
self.objects[key] = ReturnPredicate(
|
|
401
|
+
event, comp, value=None
|
|
402
|
+
)
|
|
403
|
+
objects.append(self.objects[key])
|
|
399
404
|
return objects
|
|
400
405
|
return None
|
|
401
406
|
|
|
@@ -525,9 +530,11 @@ class FunctionErrorFactory(AnalysisFactory):
|
|
|
525
530
|
self, event, event_file: EventFile, scope: Scope = None
|
|
526
531
|
) -> List[AnalysisObject]:
|
|
527
532
|
if event.event_type == EventType.FUNCTION_ENTER:
|
|
528
|
-
self.
|
|
533
|
+
with self._lock:
|
|
534
|
+
self.function_mapping[event.function_id] = event.line
|
|
529
535
|
if event.event_type in (EventType.FUNCTION_ERROR, EventType.FUNCTION_EXIT):
|
|
530
|
-
|
|
536
|
+
with self._lock:
|
|
537
|
+
line = self.function_mapping.get(event.function_id, event.line)
|
|
531
538
|
key = (
|
|
532
539
|
FunctionErrorPredicate.analysis_type(),
|
|
533
540
|
event.file,
|
|
@@ -958,7 +958,7 @@ class Length(ModifiableSpectrum):
|
|
|
958
958
|
)
|
|
959
959
|
if id_ in self.hits:
|
|
960
960
|
if event.thread_id in self.hits[id_]:
|
|
961
|
-
self.hits[id_][event.thread_id].
|
|
961
|
+
self.hits[id_][event.thread_id].append(event.length)
|
|
962
962
|
else:
|
|
963
963
|
self.hits[id_][event.thread_id] = [event.length]
|
|
964
964
|
self.last_evaluation[id_][event.thread_id] = result
|
|
@@ -3,6 +3,7 @@ from concurrent.futures import ThreadPoolExecutor
|
|
|
3
3
|
from typing import List, Dict, Set, Optional
|
|
4
4
|
|
|
5
5
|
import pandas as pd
|
|
6
|
+
from sflkitlib.events.event import Event
|
|
6
7
|
|
|
7
8
|
from sflkit.analysis.analysis_type import AnalysisObject, EvaluationResult
|
|
8
9
|
from sflkit.analysis.factory import CombinationFactory, analysis_factory_mapping
|
|
@@ -15,10 +16,16 @@ from sflkit.model.model import Model
|
|
|
15
16
|
from sflkit.model.parallel import ParallelModel
|
|
16
17
|
from sflkit.model.scope import Scope
|
|
17
18
|
from sflkit.runners.run import TestResult
|
|
18
|
-
from sflkitlib.events.event import Event
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
class FeatureBuilder(CombinationFactory):
|
|
22
|
+
def __init__(self):
|
|
23
|
+
super().__init__(list(map(lambda f: f(), analysis_factory_mapping.values())))
|
|
24
|
+
self.analysis: dict[EventFile, list[AnalysisObject]] = dict()
|
|
25
|
+
self.feature_vectors: Dict[EventFile, FeatureVector] = dict()
|
|
26
|
+
self.all_features: Set[Feature] = set()
|
|
27
|
+
self.name_map: Dict[EventFile, str] = dict()
|
|
28
|
+
|
|
22
29
|
def __iter__(self) -> FeatureVector:
|
|
23
30
|
yield from self.feature_vectors.values()
|
|
24
31
|
|
|
@@ -44,22 +51,17 @@ class FeatureBuilder(CombinationFactory):
|
|
|
44
51
|
if run_id in self.feature_vectors:
|
|
45
52
|
del self.feature_vectors[run_id]
|
|
46
53
|
|
|
47
|
-
def __init__(self):
|
|
48
|
-
super().__init__(list(map(lambda f: f(), analysis_factory_mapping.values())))
|
|
49
|
-
self.analysis: List[AnalysisObject] = list()
|
|
50
|
-
self.feature_vectors: Dict[EventFile, FeatureVector] = dict()
|
|
51
|
-
self.all_features: Set[Feature] = set()
|
|
52
|
-
self.name_map: Dict[EventFile, str] = dict()
|
|
53
|
-
|
|
54
54
|
def get_analysis(
|
|
55
55
|
self, event, event_file: EventFile, scope: Scope = None
|
|
56
56
|
) -> List[AnalysisObject]:
|
|
57
|
-
self.analysis = super().get_analysis(event, event_file, scope)
|
|
58
|
-
self.analysis.append(self)
|
|
59
|
-
return self.analysis
|
|
57
|
+
self.analysis[event_file] = super().get_analysis(event, event_file, scope)
|
|
58
|
+
self.analysis[event_file].append(self)
|
|
59
|
+
return self.analysis[event_file]
|
|
60
60
|
|
|
61
61
|
@staticmethod
|
|
62
|
-
def map_evaluation(
|
|
62
|
+
def map_evaluation(
|
|
63
|
+
analysis: Spectrum, id_: EventFile, thread_id: Optional[int] = None
|
|
64
|
+
):
|
|
63
65
|
match analysis.get_last_evaluation(id_, thread_id):
|
|
64
66
|
case EvaluationResult.TRUE:
|
|
65
67
|
return FeatureValue.TRUE
|
|
@@ -73,12 +75,13 @@ class FeatureBuilder(CombinationFactory):
|
|
|
73
75
|
return FeatureValue.UNDEFINED
|
|
74
76
|
|
|
75
77
|
def prepare(self, event_file: EventFile, test_result: TestResult):
|
|
78
|
+
self.analysis[event_file] = list()
|
|
76
79
|
self.name_map[event_file] = os.path.basename(str(event_file.path))
|
|
77
80
|
self.feature_vectors[event_file] = FeatureVector(event_file, test_result)
|
|
78
81
|
|
|
79
82
|
# noinspection PyUnusedLocal
|
|
80
83
|
def hit(self, id_: EventFile, event: Event, *args, **kwargs):
|
|
81
|
-
for a in self.analysis:
|
|
84
|
+
for a in self.analysis[id_]:
|
|
82
85
|
if isinstance(a, Predicate):
|
|
83
86
|
feature = TertiaryFeature(str(a), a)
|
|
84
87
|
self.feature_vectors[id_].set_feature(
|
|
@@ -42,7 +42,7 @@ class ParallelModel(Model):
|
|
|
42
42
|
self.returns[event_file].add(
|
|
43
43
|
event.function, event.return_value, event.type_
|
|
44
44
|
)
|
|
45
|
-
self.handle_event(event, event_file, self.returns)
|
|
45
|
+
self.handle_event(event, event_file, self.returns[event_file])
|
|
46
46
|
else:
|
|
47
47
|
self.returns_map[event_file].setdefault(event.thread_id, Scope()).add(
|
|
48
48
|
event.function, event.return_value, event.type_
|
|
@@ -67,10 +67,10 @@ class ParallelModel(Model):
|
|
|
67
67
|
def handle_def_event(self, event: DefEvent, event_file: EventFile):
|
|
68
68
|
if event.thread_id is None:
|
|
69
69
|
self.variables[event_file].add(event.var, event.value, event.type_)
|
|
70
|
-
self.handle_event(event, event_file, self.variables)
|
|
70
|
+
self.handle_event(event, event_file, self.variables[event_file])
|
|
71
71
|
else:
|
|
72
72
|
self.variables_map[event_file].setdefault(
|
|
73
|
-
event.thread_id, self.variables
|
|
73
|
+
event.thread_id, self.variables[event_file]
|
|
74
74
|
).add(event.var, event.value, event.type_)
|
|
75
75
|
self.handle_event(
|
|
76
76
|
event, event_file, self.variables_map[event_file][event.thread_id]
|
|
@@ -83,7 +83,9 @@ class ParallelModel(Model):
|
|
|
83
83
|
self.handle_event(
|
|
84
84
|
event,
|
|
85
85
|
event_file,
|
|
86
|
-
self.variables_map[event_file].get(
|
|
86
|
+
self.variables_map[event_file].get(
|
|
87
|
+
event.thread_id, self.variables[event_file]
|
|
88
|
+
),
|
|
87
89
|
)
|
|
88
90
|
|
|
89
91
|
def enter_parallel_scope(self, thread_id: int, event_file: EventFile):
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|