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.
- {sflkit-0.2.7/src/SFLKit.egg-info → sflkit-0.2.9}/PKG-INFO +1 -1
- {sflkit-0.2.7 → sflkit-0.2.9}/pyproject.toml +4 -1
- {sflkit-0.2.7 → sflkit-0.2.9/src/SFLKit.egg-info}/PKG-INFO +1 -1
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/__init__.py +1 -1
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/language/python/factory.py +3 -1
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/runners/run.py +6 -2
- {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_suggestions.py +23 -1
- {sflkit-0.2.7 → sflkit-0.2.9}/LICENSE +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/README.md +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/setup.cfg +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/setup.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/SFLKit.egg-info/SOURCES.txt +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/SFLKit.egg-info/dependency_links.txt +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/SFLKit.egg-info/entry_points.txt +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/SFLKit.egg-info/requires.txt +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/SFLKit.egg-info/top_level.txt +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/analysis/__init__.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/analysis/analysis_type.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/analysis/analyzer.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/analysis/factory.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/analysis/mapping.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/analysis/predicate.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/analysis/similarity.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/analysis/spectra.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/analysis/suggestion.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/cli.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/color.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/config.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/instrumentation/__init__.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/instrumentation/dir_instrumentation.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/instrumentation/file_instrumentation.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/language/__init__.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/language/extract.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/language/finder.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/language/language.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/language/meta.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/language/python/__init__.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/language/python/extract.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/language/python/finder.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/language/python/visitor.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/language/visitor.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/model/__init__.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/model/event_file.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/model/model.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/model/scope.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/src/sflkit/runners/__init__.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_analysis_objects.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_cli.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_color.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_config.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_events.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_execution.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_instrumentation.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_language.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_predicates.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_runner.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_scope.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_spectra.py +0 -0
- {sflkit-0.2.7 → sflkit-0.2.9}/tests/test_visitors.py +0 -0
|
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
|
|
|
7
7
|
|
|
8
8
|
[project]
|
|
9
9
|
name = "sflkit"
|
|
10
|
-
version = "0.2.
|
|
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']
|
|
@@ -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.
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|