ballpython 2.0.3__py3-none-any.whl → 2.0.4__py3-none-any.whl
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.
- {ballpython-2.0.3.dist-info → ballpython-2.0.4.dist-info}/METADATA +2 -2
- {ballpython-2.0.3.dist-info → ballpython-2.0.4.dist-info}/RECORD +9 -9
- pycleaner/__init__.py +1 -1
- pycleaner/cli.py +1 -1
- pycleaner/frameworks/__init__.py +2 -0
- pycleaner/frameworks/plugins.py +78 -4
- {ballpython-2.0.3.dist-info → ballpython-2.0.4.dist-info}/WHEEL +0 -0
- {ballpython-2.0.3.dist-info → ballpython-2.0.4.dist-info}/entry_points.txt +0 -0
- {ballpython-2.0.3.dist-info → ballpython-2.0.4.dist-info}/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ballpython
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.4
|
|
4
4
|
Summary: The Ultimate Static Python Intelligence, Healing, Type Verification, and Security Suite
|
|
5
5
|
Author: Developer
|
|
6
6
|
License-Expression: MIT
|
|
@@ -78,7 +78,7 @@ Add `ballpython` to your `.pre-commit-config.yaml`:
|
|
|
78
78
|
```yaml
|
|
79
79
|
repos:
|
|
80
80
|
- repo: https://github.com/moonrox420/ball-python
|
|
81
|
-
rev: v2.0.
|
|
81
|
+
rev: v2.0.4
|
|
82
82
|
hooks:
|
|
83
83
|
- id: pycleaner
|
|
84
84
|
args: ["check"]
|
|
@@ -2,11 +2,11 @@ ballpython/__init__.py,sha256=d8ONxgaz9jml_fHPVvg867Vt5jGRhGTqzWPtux3WJOc,206
|
|
|
2
2
|
ballpython/__main__.py,sha256=aCRr0vnZfKYHDrPHBsYSjX5xTxtFJpTTSPVUSZTBK-I,136
|
|
3
3
|
ballpython/cli.py,sha256=LllCLRAQQ-fRR_lIXwmd2e3Q7DLCIvf-5jHBXsAhJWs,125
|
|
4
4
|
ballpython/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
|
-
pycleaner/__init__.py,sha256=
|
|
5
|
+
pycleaner/__init__.py,sha256=AbIZyqCYVTi-fjqPCgWZmTeSth_8ma-8sYbl9SghNnQ,2894
|
|
6
6
|
pycleaner/__main__.py,sha256=8QBFrPyxId563F6cipPMNVEBTG8TIZUgxQfp8gk1VSI,135
|
|
7
7
|
pycleaner/baseline.py,sha256=DS32C8_G8khYYNJo42FVv6Cc58lJj7NUmPOzWNfQwlU,3856
|
|
8
8
|
pycleaner/cache.py,sha256=WhCiMkuL6ryWVr3l3XrYLLoI7A3bRF8jNxpOyedNW8M,10761
|
|
9
|
-
pycleaner/cli.py,sha256=
|
|
9
|
+
pycleaner/cli.py,sha256=MMK0U57pam-FuvB1UL7jwVk7m9Z_Cosuwuu5FIfrPp0,73029
|
|
10
10
|
pycleaner/complexity_analyzer.py,sha256=uGC40cHCcr1tshzfIUw56sodEDySMFR3kGmjo7nq_1c,14977
|
|
11
11
|
pycleaner/config.py,sha256=XhloyaY_9pdwbQuc3QaAPCerLeXz-i1da4xT50h-pjY,8514
|
|
12
12
|
pycleaner/dead_code_detector.py,sha256=1DwtBSZL1ug1OI9-6jcJyxkhqHmJ0F8ZR19POI2zO3c,26549
|
|
@@ -25,10 +25,10 @@ pycleaner/test_generator.py,sha256=TJsNJSojc6eIsaKZkwMlpnb-MKHuDpNLZCPnMlO-a8M,1
|
|
|
25
25
|
pycleaner/type_checker.py,sha256=h09QI_8MRHv83s23myjSYFdMTsWoQ900ffBJHtRuhmE,34087
|
|
26
26
|
pycleaner/typeshed_resolver.py,sha256=N-kWU_CI5DG59lQMkt7wMW9sHYjNCBdfFS42b4y2Kr4,12742
|
|
27
27
|
pycleaner/verifier.py,sha256=pOfSLRNHe4qDUYJG8mxDxjY6Ph8QKBdJZmqBtoJX87w,17937
|
|
28
|
-
pycleaner/frameworks/__init__.py,sha256
|
|
29
|
-
pycleaner/frameworks/plugins.py,sha256=
|
|
30
|
-
ballpython-2.0.
|
|
31
|
-
ballpython-2.0.
|
|
32
|
-
ballpython-2.0.
|
|
33
|
-
ballpython-2.0.
|
|
34
|
-
ballpython-2.0.
|
|
28
|
+
pycleaner/frameworks/__init__.py,sha256=-W24zqvug8eUkkwqla5oh7rFOqQR-WI4TohQhbXGYoo,3472
|
|
29
|
+
pycleaner/frameworks/plugins.py,sha256=sMhP9mZ82sx10OI3opgXIEPXNAWFZRe2I__6yh2Uq_E,11453
|
|
30
|
+
ballpython-2.0.4.dist-info/METADATA,sha256=vIeFxyxog9s1kF_UlbDp4yJg-UCiSho2HQe3qhC4odE,3466
|
|
31
|
+
ballpython-2.0.4.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
|
|
32
|
+
ballpython-2.0.4.dist-info/entry_points.txt,sha256=6ux-5UxoVSmlK5p9M-GDVt24sCdwTQq9wgRDkpMIYU8,81
|
|
33
|
+
ballpython-2.0.4.dist-info/top_level.txt,sha256=u6lmy8RWZ_saxCZAQTL7EijB4sunegOiVyk5fHjpwLk,21
|
|
34
|
+
ballpython-2.0.4.dist-info/RECORD,,
|
pycleaner/__init__.py
CHANGED
pycleaner/cli.py
CHANGED
pycleaner/frameworks/__init__.py
CHANGED
|
@@ -103,6 +103,7 @@ def get_default_registry() -> FrameworkRegistry:
|
|
|
103
103
|
FastAPIPlugin,
|
|
104
104
|
PydanticPlugin,
|
|
105
105
|
PytestPlugin,
|
|
106
|
+
PyTorchPlugin,
|
|
106
107
|
SQLAlchemyPlugin,
|
|
107
108
|
)
|
|
108
109
|
|
|
@@ -112,4 +113,5 @@ def get_default_registry() -> FrameworkRegistry:
|
|
|
112
113
|
reg.register(FastAPIPlugin())
|
|
113
114
|
reg.register(SQLAlchemyPlugin())
|
|
114
115
|
reg.register(DataclassPlugin())
|
|
116
|
+
reg.register(PyTorchPlugin())
|
|
115
117
|
return reg
|
pycleaner/frameworks/plugins.py
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
pycleaner.frameworks.plugins
|
|
3
3
|
============================
|
|
4
4
|
|
|
5
|
-
Concrete Framework Plugins for Pydantic, Pytest, FastAPI, SQLAlchemy, and
|
|
5
|
+
Concrete Framework Plugins for Pydantic, Pytest, FastAPI, SQLAlchemy, Dataclasses, and PyTorch.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
8
|
from __future__ import annotations
|
|
@@ -50,15 +50,18 @@ class PydanticPlugin:
|
|
|
50
50
|
for node in ast.walk(tree):
|
|
51
51
|
if isinstance(node, ast.Import):
|
|
52
52
|
for alias in node.names:
|
|
53
|
-
if alias.name.split(".")[0]
|
|
53
|
+
if alias.name.split(".")[0] in ("pydantic", "pydantic_settings"):
|
|
54
54
|
return True
|
|
55
55
|
elif isinstance(node, ast.ImportFrom):
|
|
56
|
-
if node.module and node.module.split(".")[0]
|
|
56
|
+
if node.module and node.module.split(".")[0] in (
|
|
57
|
+
"pydantic",
|
|
58
|
+
"pydantic_settings",
|
|
59
|
+
):
|
|
57
60
|
return True
|
|
58
61
|
return False
|
|
59
62
|
|
|
60
63
|
def get_protected_names(self, tree: ast.AST) -> set[str]:
|
|
61
|
-
return {"model_config", "Config", "ConfigDict"}
|
|
64
|
+
return {"model_config", "Config", "ConfigDict", "model_post_init"}
|
|
62
65
|
|
|
63
66
|
def get_protected_decorators(self) -> set[str]:
|
|
64
67
|
return self._VALIDATOR_DECORATORS
|
|
@@ -288,3 +291,74 @@ class DataclassPlugin:
|
|
|
288
291
|
tree: ast.AST,
|
|
289
292
|
) -> bool:
|
|
290
293
|
return name in self.get_protected_names(tree)
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
class PyTorchPlugin:
|
|
297
|
+
"""Understands PyTorch nn.Module, LightningModule, HuggingFace models, and datasets."""
|
|
298
|
+
|
|
299
|
+
name = "pytorch"
|
|
300
|
+
_MODULE_BASES = {
|
|
301
|
+
"Module",
|
|
302
|
+
"LightningModule",
|
|
303
|
+
"PreTrainedModel",
|
|
304
|
+
"Dataset",
|
|
305
|
+
"IterableDataset",
|
|
306
|
+
"Sampler",
|
|
307
|
+
}
|
|
308
|
+
_PROTECTED_METHODS = {
|
|
309
|
+
"forward",
|
|
310
|
+
"backward",
|
|
311
|
+
"training_step",
|
|
312
|
+
"validation_step",
|
|
313
|
+
"test_step",
|
|
314
|
+
"predict_step",
|
|
315
|
+
"configure_optimizers",
|
|
316
|
+
"optimizer_step",
|
|
317
|
+
"compute_loss",
|
|
318
|
+
"reset_parameters",
|
|
319
|
+
"extra_repr",
|
|
320
|
+
"state_dict",
|
|
321
|
+
"load_state_dict",
|
|
322
|
+
"collate_fn",
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
def is_applicable(self, tree: ast.AST, filepath: Path | str) -> bool:
|
|
326
|
+
torch_pkgs = {
|
|
327
|
+
"torch",
|
|
328
|
+
"torchvision",
|
|
329
|
+
"torchaudio",
|
|
330
|
+
"pytorch_lightning",
|
|
331
|
+
"lightning",
|
|
332
|
+
"transformers",
|
|
333
|
+
"accelerate",
|
|
334
|
+
"timm",
|
|
335
|
+
}
|
|
336
|
+
for node in ast.walk(tree):
|
|
337
|
+
if isinstance(node, ast.Import):
|
|
338
|
+
for alias in node.names:
|
|
339
|
+
if alias.name.split(".")[0] in torch_pkgs:
|
|
340
|
+
return True
|
|
341
|
+
elif isinstance(node, ast.ImportFrom):
|
|
342
|
+
if node.module and node.module.split(".")[0] in torch_pkgs:
|
|
343
|
+
return True
|
|
344
|
+
return False
|
|
345
|
+
|
|
346
|
+
def get_protected_names(self, tree: ast.AST) -> set[str]:
|
|
347
|
+
return self._PROTECTED_METHODS
|
|
348
|
+
|
|
349
|
+
def get_protected_decorators(self) -> set[str]:
|
|
350
|
+
return set()
|
|
351
|
+
|
|
352
|
+
def is_protected_field(self, node: ast.AST, class_node: ast.ClassDef) -> bool:
|
|
353
|
+
return _has_base_named(class_node, self._MODULE_BASES)
|
|
354
|
+
|
|
355
|
+
def should_ignore_definition(
|
|
356
|
+
self,
|
|
357
|
+
name: str,
|
|
358
|
+
kind: str,
|
|
359
|
+
node: ast.AST,
|
|
360
|
+
context: str,
|
|
361
|
+
tree: ast.AST,
|
|
362
|
+
) -> bool:
|
|
363
|
+
return name in self._PROTECTED_METHODS
|
|
364
|
+
|
|
File without changes
|
|
File without changes
|
|
File without changes
|