Skip to content

Commit e16dc8e

Browse files
authored
Merge pull request #9 from ArchiveBox/type-fixes
Type fixes
2 parents 3a80284 + e4957cf commit e16dc8e

22 files changed

Lines changed: 463 additions & 361 deletions

.pre-commit-config.yaml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,12 @@ repos:
3838
name: ty-check
3939
entry: uv run ty check
4040
language: system
41-
files: ^(abx_pkg/|tests.py|django_example_project/)
42-
pass_filenames: false
41+
files: ^(abx_pkg/|tests\.py$|django_example_project/project/(?!migrations/).+\.py$)
4342
- id: pyright
4443
name: pyright
4544
entry: uv run pyright
4645
language: system
47-
files: ^(abx_pkg/|tests.py|django_example_project/)
48-
pass_filenames: false
46+
files: ^(abx_pkg/|tests\.py$|django_example_project/project/(?!migrations/).+\.py$)
4947
# see pyproject.toml for more details on ruff config
5048

5149
- repo: https://github.com/pre-commit/pre-commit-hooks

abx_pkg/__init__.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,18 @@ def __getattr__(name: str):
144144
"DEFAULT_ENV_PATH",
145145
"PYTHON_BIN_DIR",
146146
# BinProviders (classes)
147-
*ALL_PROVIDER_CLASS_NAMES,
147+
"EnvProvider",
148+
"AptProvider",
149+
"BrewProvider",
150+
"CargoProvider",
151+
"GemProvider",
152+
"GoGetProvider",
153+
"NixProvider",
154+
"DockerProvider",
155+
"PipProvider",
156+
"NpmProvider",
157+
"AnsibleProvider",
158+
"PyinfraProvider",
148159
# Note: provider singleton names (apt, pip, brew, etc.) are intentionally
149160
# excluded from __all__ so that `from abx_pkg import *` does not eagerly
150161
# instantiate every provider. Use explicit imports instead:

abx_pkg/admin.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from types import MethodType
2+
13
from django.contrib import admin
24

35

@@ -11,20 +13,21 @@ def register_admin_views(admin_site: admin.AdminSite):
1113
get_urls,
1214
)
1315

14-
CustomAdminCls = admin_site.__class__
15-
16-
admin_site.get_app_list = get_app_list.__get__(admin_site, CustomAdminCls)
17-
admin_site.admin_data_index_view = admin_data_index_view.__get__(
16+
setattr(admin_site, "get_app_list", MethodType(get_app_list, admin_site))
17+
setattr(
1818
admin_site,
19-
CustomAdminCls,
19+
"admin_data_index_view",
20+
MethodType(admin_data_index_view, admin_site),
2021
)
21-
admin_site.get_admin_data_urls = get_admin_data_urls.__get__(
22+
setattr(
2223
admin_site,
23-
CustomAdminCls,
24+
"get_admin_data_urls",
25+
MethodType(get_admin_data_urls, admin_site),
2426
)
25-
admin_site.get_urls = get_urls(admin_site.get_urls).__get__(
27+
setattr(
2628
admin_site,
27-
CustomAdminCls,
29+
"get_urls",
30+
MethodType(get_urls(admin_site.get_urls), admin_site),
2831
)
2932

3033
return admin_site

abx_pkg/base_types.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
__package__ = "abx_pkg"
22

3+
import inspect
34
import os
45
import shutil
56

@@ -49,11 +50,17 @@ def validate_PATH(PATH: str | list[str]) -> str:
4950

5051
def func_takes_args_or_kwargs(lambda_func: Callable[..., Any]) -> bool:
5152
"""returns True if a lambda func takes args/kwargs of any kind, otherwise false if it's pure/argless"""
52-
code = lambda_func.__code__
53-
has_args = code.co_argcount > 0
54-
has_varargs = code.co_flags & 0x04 != 0
55-
has_varkw = code.co_flags & 0x08 != 0
56-
return has_args or has_varargs or has_varkw
53+
signature = inspect.signature(lambda_func)
54+
return any(
55+
parameter.kind
56+
in (
57+
inspect.Parameter.POSITIONAL_ONLY,
58+
inspect.Parameter.POSITIONAL_OR_KEYWORD,
59+
inspect.Parameter.VAR_POSITIONAL,
60+
inspect.Parameter.VAR_KEYWORD,
61+
)
62+
for parameter in signature.parameters.values()
63+
)
5764

5865

5966
# @validate_call

abx_pkg/binary.py

Lines changed: 29 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
HostBinPath,
3333
BinProviderName,
3434
PATHStr,
35-
Sha256,
3635
)
3736

3837
DEFAULT_PROVIDER = EnvProvider()
@@ -43,7 +42,7 @@ class Binary(ShallowBinary):
4342
model_config = ConfigDict(
4443
extra="allow",
4544
populate_by_name=True,
46-
validate_defaults=True,
45+
validate_default=True,
4746
validate_assignment=True,
4847
from_attributes=True,
4948
revalidate_instances="always",
@@ -59,22 +58,15 @@ class Binary(ShallowBinary):
5958
)
6059
overrides: BinaryOverrides = Field(default_factory=dict)
6160

62-
loaded_binprovider: InstanceOf[BinProvider] | None = Field(
63-
default=None,
64-
alias="binprovider",
65-
)
66-
loaded_abspath: HostBinPath | None = Field(default=None, alias="abspath")
6761
min_version: SemVer | None = None
68-
loaded_version: SemVer | None = Field(default=None, alias="version")
69-
loaded_sha256: Sha256 | None = Field(default=None, alias="sha256")
7062

7163
# bin_filename: see below
7264
# is_executable: see below
7365
# is_script
7466
# is_valid: see below
7567

7668
@model_validator(mode="after")
77-
def validate(self):
69+
def validate_model(self) -> Self:
7870
# assert self.name, 'Binary.name must not be empty'
7971
# self.description = self.description or self.name
8072

@@ -239,16 +231,13 @@ def install(
239231
installed_bin = provider.install(self.name)
240232
if installed_bin is not None and installed_bin.loaded_abspath:
241233
# print('INSTALLED', self.name, installed_bin)
242-
return self.__class__(
243-
**{
244-
**self.model_dump(exclude_computed_fields=True),
245-
**installed_bin.model_dump(
246-
exclude={"binproviders_supported"},
247-
exclude_computed_fields=True,
248-
),
234+
return self.model_copy(
235+
deep=True,
236+
update={
249237
"loaded_binprovider": provider,
250-
"binproviders_supported": self.binproviders_supported,
251-
"overrides": self.overrides,
238+
"loaded_abspath": installed_bin.loaded_abspath,
239+
"loaded_version": installed_bin.loaded_version,
240+
"loaded_sha256": installed_bin.loaded_sha256,
252241
},
253242
)
254243
except Exception as err:
@@ -300,16 +289,13 @@ def load(
300289
installed_bin = provider.load(self.name, nocache=nocache)
301290
if installed_bin is not None and installed_bin.loaded_abspath:
302291
# print('LOADED', binprovider, self.name, installed_bin)
303-
return self.__class__(
304-
**{
305-
**self.model_dump(exclude_computed_fields=True),
306-
**installed_bin.model_dump(
307-
exclude={"binproviders_supported"},
308-
exclude_computed_fields=True,
309-
),
292+
return self.model_copy(
293+
deep=True,
294+
update={
310295
"loaded_binprovider": provider,
311-
"binproviders_supported": self.binproviders_supported,
312-
"overrides": self.overrides,
296+
"loaded_abspath": installed_bin.loaded_abspath,
297+
"loaded_version": installed_bin.loaded_version,
298+
"loaded_sha256": installed_bin.loaded_sha256,
313299
},
314300
)
315301
else:
@@ -364,16 +350,13 @@ def load_or_install(
364350
installed_bin = provider.load_or_install(self.name, nocache=nocache)
365351
if installed_bin is not None and installed_bin.loaded_abspath:
366352
# print('LOADED_OR_INSTALLED', self.name, installed_bin)
367-
return self.__class__(
368-
**{
369-
**self.model_dump(exclude_computed_fields=True),
370-
**installed_bin.model_dump(
371-
exclude={"binproviders_supported"},
372-
exclude_computed_fields=True,
373-
),
353+
return self.model_copy(
354+
deep=True,
355+
update={
374356
"loaded_binprovider": provider,
375-
"binproviders_supported": self.binproviders_supported,
376-
"overrides": self.overrides,
357+
"loaded_abspath": installed_bin.loaded_abspath,
358+
"loaded_version": installed_bin.loaded_version,
359+
"loaded_sha256": installed_bin.loaded_sha256,
377360
},
378361
)
379362
else:
@@ -420,16 +403,13 @@ def update(
420403
)
421404
updated_bin = provider.update(self.name)
422405
if updated_bin is not None and updated_bin.loaded_abspath:
423-
return self.__class__(
424-
**{
425-
**self.model_dump(exclude_computed_fields=True),
426-
**updated_bin.model_dump(
427-
exclude={"binproviders_supported"},
428-
exclude_computed_fields=True,
429-
),
406+
return self.model_copy(
407+
deep=True,
408+
update={
430409
"loaded_binprovider": provider,
431-
"binproviders_supported": self.binproviders_supported,
432-
"overrides": self.overrides,
410+
"loaded_abspath": updated_bin.loaded_abspath,
411+
"loaded_version": updated_bin.loaded_version,
412+
"loaded_sha256": updated_bin.loaded_sha256,
433413
},
434414
)
435415
except Exception as err:
@@ -473,15 +453,13 @@ def uninstall(
473453
)
474454
uninstalled = provider.uninstall(self.name)
475455
if uninstalled:
476-
return self.__class__(
477-
**{
478-
**self.model_dump(exclude_computed_fields=True),
456+
return self.model_copy(
457+
deep=True,
458+
update={
479459
"loaded_binprovider": None,
480460
"loaded_abspath": None,
481461
"loaded_version": None,
482462
"loaded_sha256": None,
483-
"binproviders_supported": self.binproviders_supported,
484-
"overrides": self.overrides,
485463
},
486464
)
487465
except Exception as err:

0 commit comments

Comments
 (0)