sflkit 0.2.7__tar.gz → 0.2.9__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 (59) hide show
  1. {sflkit-0.2.7/src/SFLKit.egg-info → sflkit-0.2.9}/PKG-INFO +1 -1
  2. {sflkit-0.2.7 → sflkit-0.2.9}/pyproject.toml +4 -1
  3. {sflkit-0.2.7 → sflkit-0.2.9/src/SFLKit.egg-info}/PKG-INFO +1 -1
  4. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/__init__.py +1 -1
  5. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/language/python/factory.py +3 -1
  6. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/runners/run.py +6 -2
  7. {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_suggestions.py +23 -1
  8. {sflkit-0.2.7 → sflkit-0.2.9}/LICENSE +0 -0
  9. {sflkit-0.2.7 → sflkit-0.2.9}/README.md +0 -0
  10. {sflkit-0.2.7 → sflkit-0.2.9}/setup.cfg +0 -0
  11. {sflkit-0.2.7 → sflkit-0.2.9}/setup.py +0 -0
  12. {sflkit-0.2.7 → sflkit-0.2.9}/src/SFLKit.egg-info/SOURCES.txt +0 -0
  13. {sflkit-0.2.7 → sflkit-0.2.9}/src/SFLKit.egg-info/dependency_links.txt +0 -0
  14. {sflkit-0.2.7 → sflkit-0.2.9}/src/SFLKit.egg-info/entry_points.txt +0 -0
  15. {sflkit-0.2.7 → sflkit-0.2.9}/src/SFLKit.egg-info/requires.txt +0 -0
  16. {sflkit-0.2.7 → sflkit-0.2.9}/src/SFLKit.egg-info/top_level.txt +0 -0
  17. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/analysis/__init__.py +0 -0
  18. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/analysis/analysis_type.py +0 -0
  19. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/analysis/analyzer.py +0 -0
  20. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/analysis/factory.py +0 -0
  21. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/analysis/mapping.py +0 -0
  22. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/analysis/predicate.py +0 -0
  23. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/analysis/similarity.py +0 -0
  24. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/analysis/spectra.py +0 -0
  25. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/analysis/suggestion.py +0 -0
  26. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/cli.py +0 -0
  27. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/color.py +0 -0
  28. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/config.py +0 -0
  29. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/instrumentation/__init__.py +0 -0
  30. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/instrumentation/dir_instrumentation.py +0 -0
  31. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/instrumentation/file_instrumentation.py +0 -0
  32. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/language/__init__.py +0 -0
  33. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/language/extract.py +0 -0
  34. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/language/finder.py +0 -0
  35. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/language/language.py +0 -0
  36. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/language/meta.py +0 -0
  37. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/language/python/__init__.py +0 -0
  38. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/language/python/extract.py +0 -0
  39. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/language/python/finder.py +0 -0
  40. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/language/python/visitor.py +0 -0
  41. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/language/visitor.py +0 -0
  42. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/model/__init__.py +0 -0
  43. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/model/event_file.py +0 -0
  44. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/model/model.py +0 -0
  45. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/model/scope.py +0 -0
  46. {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/runners/__init__.py +0 -0
  47. {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_analysis_objects.py +0 -0
  48. {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_cli.py +0 -0
  49. {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_color.py +0 -0
  50. {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_config.py +0 -0
  51. {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_events.py +0 -0
  52. {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_execution.py +0 -0
  53. {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_instrumentation.py +0 -0
  54. {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_language.py +0 -0
  55. {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_predicates.py +0 -0
  56. {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_runner.py +0 -0
  57. {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_scope.py +0 -0
  58. {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_spectra.py +0 -0
  59. {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_visitors.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sflkit
3
- Version: 0.2.7
3
+ Version: 0.2.9
4
4
  Summary: SFLKit: : A Workbench for Statistical Fault Localization
5
5
  Home-page: https://github.com/uds-se/sflkit
6
6
  Author: Marius Smytzek & Andreas Zeller
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
7
7
 
8
8
  [project]
9
9
  name = "sflkit"
10
- version = "0.2.7"
10
+ version = "0.2.9"
11
11
  authors = [
12
12
  { name = "Marius Smytzek", email = "marius.smytzek@cispa.de" },
13
13
  ]
@@ -27,6 +27,9 @@ classifiers = [
27
27
  "Homepage" = "https://github.com/uds-se/sflkit/"
28
28
  "Bug Tracker" = "https://github.com/uds-se/sflkit/issues"
29
29
 
30
+ [project.scripts]
31
+ sflkit = "sflkit.cli:main"
32
+
30
33
  [tool.black]
31
34
  line-length = 88
32
35
  target-version = ['py310']
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sflkit
3
- Version: 0.2.7
3
+ Version: 0.2.9
4
4
  Summary: SFLKit: : A Workbench for Statistical Fault Localization
5
5
  Home-page: https://github.com/uds-se/sflkit
6
6
  Author: Marius Smytzek & Andreas Zeller
@@ -6,7 +6,7 @@ from sflkit.analysis.predicate import Predicate
6
6
  from sflkit.config import Config, parse_config
7
7
  from sflkit.instrumentation.dir_instrumentation import DirInstrumentation
8
8
 
9
- __version__ = "0.2.7"
9
+ __version__ = "0.2.9"
10
10
 
11
11
 
12
12
  def instrument_config(conf: Config, event_dump: str = None):
@@ -839,7 +839,9 @@ class ConditionEventFactory(PythonEventFactory):
839
839
  return Injection(pre=[var_assign], assign=var_use, events=events)
840
840
 
841
841
  def visit_While(self, node: While) -> Injection:
842
- return self.visit_condition(node)
842
+ injection = self.visit_condition(node)
843
+ injection.body_last = injection.pre
844
+ return injection
843
845
 
844
846
  def visit_If(self, node: If) -> Injection:
845
847
  return self.visit_condition(node)
@@ -91,7 +91,11 @@ class PytestTree:
91
91
  def parse(self, output: str, directory: Path = None):
92
92
  current_level = 0
93
93
  current_node = None
94
+ root_dir = Path.cwd() if directory is None else directory
95
+ directory = None if directory is None else directory.absolute()
94
96
  for line in output.split("\n"):
97
+ if line.startswith("rootdir: ") and directory is not None:
98
+ root_dir = Path(line.replace("rootdir: ", "")).absolute()
95
99
  match = PYTEST_COLLECT_PATTERN.search(line)
96
100
  if match:
97
101
  level = self._count_spaces(line) // 2
@@ -99,11 +103,11 @@ class PytestTree:
99
103
  if match.group("kind") == "Package":
100
104
  node_class = Package
101
105
  if directory:
102
- name = os.path.relpath(name, directory)
106
+ name = str((root_dir / name).relative_to(directory))
103
107
  elif match.group("kind") == "Module":
104
108
  node_class = Module
105
109
  if directory:
106
- name = os.path.relpath(name, directory)
110
+ name = str((root_dir / name).relative_to(directory))
107
111
  elif match.group("kind") in ("Class", "UnitTestCase"):
108
112
  node_class = Class
109
113
  elif match.group("kind") in ("Function", "TestCaseFunction"):
@@ -168,7 +168,6 @@ class SuggestionsFromPredicatesTypesTest(BaseTest):
168
168
 
169
169
  class SuggestionsFromPredicatesTest3(BaseTest):
170
170
  def _analyze_tests(self, analysis, relevant, irrelevant):
171
-
172
171
  return self.run_analysis(
173
172
  self.TEST_SPECIAL_VALUES,
174
173
  "def",
@@ -262,3 +261,26 @@ class SuggestionsFromPredicatesLoopTest(BaseTest):
262
261
  self.assertEqual(2, len(suggestions[0].lines))
263
262
  self.assertIn(Location("main.py", 7), suggestions[0].lines)
264
263
  self.assertIn(Location("main.py", 8), suggestions[0].lines)
264
+
265
+
266
+ class SuggestionsFromConditionsLoopTest(BaseTest):
267
+ @classmethod
268
+ def setUpClass(cls):
269
+ cls.analyzer = cls.run_analysis(
270
+ cls.TEST_LOOP,
271
+ "",
272
+ "condition",
273
+ relevant=[["00"]],
274
+ irrelevant=[["z"], ["123"]],
275
+ )
276
+ cls.original_dir = os.path.join(cls.TEST_RESOURCES, cls.TEST_LOOP)
277
+
278
+ def test_loop_suggestions(self):
279
+ suggestions = self.analyzer.get_sorted_suggestions(
280
+ base_dir=self.original_dir,
281
+ type_=AnalysisType.CONDITION,
282
+ metric=Spectrum.Tarantula,
283
+ )
284
+ self.assertAlmostEqual(0.5, suggestions[0].suspiciousness, delta=self.DELTA)
285
+ self.assertEqual(1, len(suggestions[0].lines))
286
+ self.assertIn(Location("main.py", 7), suggestions[0].lines)
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