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.
Files changed (83) hide show
  1. {sflkit-0.5.1/src/sflkit.egg-info → sflkit-0.5.3}/PKG-INFO +1 -1
  2. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/__init__.py +1 -1
  3. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/analysis/factory.py +39 -32
  4. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/analysis/spectra.py +1 -1
  5. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/features/handler.py +16 -13
  6. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/features/vector.py +1 -1
  7. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/model/parallel.py +6 -4
  8. {sflkit-0.5.1 → sflkit-0.5.3/src/sflkit.egg-info}/PKG-INFO +1 -1
  9. {sflkit-0.5.1 → sflkit-0.5.3}/LICENSE +0 -0
  10. {sflkit-0.5.1 → sflkit-0.5.3}/README.md +0 -0
  11. {sflkit-0.5.1 → sflkit-0.5.3}/pyproject.toml +0 -0
  12. {sflkit-0.5.1 → sflkit-0.5.3}/setup.cfg +0 -0
  13. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/analysis/__init__.py +0 -0
  14. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/analysis/analysis_type.py +0 -0
  15. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/analysis/analyzer.py +0 -0
  16. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/analysis/mapping.py +0 -0
  17. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/analysis/predicate.py +0 -0
  18. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/analysis/similarity.py +0 -0
  19. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/analysis/suggestion.py +0 -0
  20. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/cli.py +0 -0
  21. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/color.py +0 -0
  22. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/config.py +0 -0
  23. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/evaluation.py +0 -0
  24. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/events/__init__.py +0 -0
  25. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/events/event_file.py +0 -0
  26. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/events/mapping.py +0 -0
  27. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/features/__init__.py +0 -0
  28. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/features/value.py +0 -0
  29. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/instrumentation/__init__.py +0 -0
  30. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/instrumentation/dir_instrumentation.py +0 -0
  31. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/instrumentation/file_instrumentation.py +0 -0
  32. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/__init__.py +0 -0
  33. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/extract.py +0 -0
  34. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/finder.py +0 -0
  35. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/java/__init__.py +0 -0
  36. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/java/extract.py +0 -0
  37. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/java/factory.py +0 -0
  38. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/java/finder.py +0 -0
  39. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/java/visitor.py +0 -0
  40. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/language.py +0 -0
  41. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/meta.py +0 -0
  42. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/python/__init__.py +0 -0
  43. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/python/extract.py +0 -0
  44. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/python/factory.py +0 -0
  45. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/python/finder.py +0 -0
  46. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/python/visitor.py +0 -0
  47. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/language/visitor.py +0 -0
  48. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/logger.py +0 -0
  49. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/model/__init__.py +0 -0
  50. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/model/model.py +0 -0
  51. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/model/scope.py +0 -0
  52. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/runners/__init__.py +0 -0
  53. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/runners/run.py +0 -0
  54. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/weights/__init__.py +0 -0
  55. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/weights/analyzer.py +0 -0
  56. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit/weights/models.py +0 -0
  57. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit.egg-info/SOURCES.txt +0 -0
  58. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit.egg-info/dependency_links.txt +0 -0
  59. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit.egg-info/entry_points.txt +0 -0
  60. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit.egg-info/requires.txt +0 -0
  61. {sflkit-0.5.1 → sflkit-0.5.3}/src/sflkit.egg-info/top_level.txt +0 -0
  62. {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_analysis_objects.py +0 -0
  63. {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_analyzer.py +0 -0
  64. {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_cli.py +0 -0
  65. {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_color.py +0 -0
  66. {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_config.py +0 -0
  67. {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_coverage.py +0 -0
  68. {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_dependency_weights.py +0 -0
  69. {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_evaluation.py +0 -0
  70. {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_events.py +0 -0
  71. {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_execution.py +0 -0
  72. {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_features.py +0 -0
  73. {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_instrumentation.py +0 -0
  74. {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_language.py +0 -0
  75. {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_parallelization.py +0 -0
  76. {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_predicates.py +0 -0
  77. {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_runner.py +0 -0
  78. {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_runner_parallel.py +0 -0
  79. {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_runner_pytest_versions.py +0 -0
  80. {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_scope.py +0 -0
  81. {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_spectra.py +0 -0
  82. {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_suggestions.py +0 -0
  83. {sflkit-0.5.1 → sflkit-0.5.3}/tests/test_visitors.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sflkit
3
- Version: 0.5.1
3
+ Version: 0.5.3
4
4
  Summary: SFLKit: : A Workbench for Statistical Fault Localization
5
5
  Author-email: Marius Smytzek <marius.smytzek@cispa.de>
6
6
  Project-URL: Homepage, https://github.com/smythi93/sflkit/
@@ -6,7 +6,7 @@ from sflkit.config import Config, parse_config
6
6
  from sflkit.instrumentation.dir_instrumentation import DirInstrumentation
7
7
 
8
8
 
9
- __version__ = "0.5.1"
9
+ __version__ = "0.5.3"
10
10
 
11
11
 
12
12
  def instrument_config(conf: Config):
@@ -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.id_to_def[event_file] = dict()
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.id_to_def[event_file][(event.var, event.var_id)] = event
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
- if (event.var, event.var_id) in self.id_to_def[event_file]:
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
- self.id_to_def[event_file][(event.var, event.var_id)].file,
194
- self.id_to_def[event_file][(event.var, event.var_id)].line,
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.var != event.var:
269
- if variable.type_ in types:
270
- for comp in self.comparators:
271
- key = (
272
- ScalarPair.analysis_type(),
273
- event.file,
274
- event.line,
275
- event.var,
276
- variable.var,
277
- comp,
278
- types[0],
279
- )
280
- with self._lock:
281
- if key not in self.objects:
282
- self.objects[key] = ScalarPair(
283
- event, comp, variable.var
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
- objects.append(self.objects[key])
369
- if event.type_ == "NoneType":
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
- if key in self.objects:
398
- objects.append(self.objects[key])
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.function_mapping[event.function_id] = event.line
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
- line = self.function_mapping.get(event.function_id, event.line)
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].appent(event.length)
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(analysis: Spectrum, id_: EventFile, thread_id: Optional[int] = None):
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(
@@ -9,7 +9,7 @@ from sflkit.runners.run import TestResult
9
9
  class FeatureVector:
10
10
  def __init__(
11
11
  self,
12
- run_id: EventFile,
12
+ run_id: EventFile | int,
13
13
  result: TestResult,
14
14
  ):
15
15
  self.run_id = run_id
@@ -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(event.thread_id, self.variables),
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):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sflkit
3
- Version: 0.5.1
3
+ Version: 0.5.3
4
4
  Summary: SFLKit: : A Workbench for Statistical Fault Localization
5
5
  Author-email: Marius Smytzek <marius.smytzek@cispa.de>
6
6
  Project-URL: Homepage, https://github.com/smythi93/sflkit/
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