Skip to content

Commit 8cad294

Browse files
committed
pylock: handwoven constructors
We can remove them when we drop support for Python 3.9
1 parent 643f66f commit 8cad294

File tree

1 file changed

+167
-33
lines changed

1 file changed

+167
-33
lines changed

src/pip/_internal/models/pylock.py

Lines changed: 167 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -256,16 +256,33 @@ class PylockUnsupportedVersionError(PylockValidationError):
256256
pass
257257

258258

259-
@dataclass(kw_only=True)
259+
@dataclass
260260
class PackageVcs:
261261
type: str
262-
url: Optional[str] = None
263-
path: Optional[str] = None
264-
requested_revision: Optional[str] = None
262+
url: Optional[str] # = None
263+
path: Optional[str] # = None
264+
requested_revision: Optional[str] # = None
265265
commit_id: str
266266
subdirectory: Optional[str] = None
267267

268-
def __post_init__(self) -> None:
268+
def __init__(
269+
self,
270+
*,
271+
type: str,
272+
commit_id: str,
273+
url: Optional[str] = None,
274+
path: Optional[str] = None,
275+
requested_revision: Optional[str] = None,
276+
subdirectory: Optional[str] = None,
277+
) -> None:
278+
# In Python 3.10+ make dataclass kw_only=True and remove __init__
279+
self.type = type
280+
self.url = url
281+
self.path = path
282+
self.requested_revision = requested_revision
283+
self.commit_id = commit_id
284+
self.subdirectory = subdirectory
285+
# __post_init__ in Python 3.10+
269286
_validate_path_url(self.path, self.url)
270287

271288
@classmethod
@@ -280,12 +297,24 @@ def from_dict(cls, d: Dict[str, Any]) -> "Self":
280297
)
281298

282299

283-
@dataclass(kw_only=True)
300+
@dataclass
284301
class PackageDirectory:
285302
path: str
286303
editable: Optional[bool] = None
287304
subdirectory: Optional[str] = None
288305

306+
def __init__(
307+
self,
308+
*,
309+
path: str,
310+
editable: Optional[bool] = None,
311+
subdirectory: Optional[str] = None,
312+
) -> None:
313+
# In Python 3.10+ make dataclass kw_only=True and remove __init__
314+
self.path = path
315+
self.editable = editable
316+
self.subdirectory = subdirectory
317+
289318
@classmethod
290319
def from_dict(cls, d: Dict[str, Any]) -> "Self":
291320
return cls(
@@ -295,16 +324,33 @@ def from_dict(cls, d: Dict[str, Any]) -> "Self":
295324
)
296325

297326

298-
@dataclass(kw_only=True)
327+
@dataclass
299328
class PackageArchive:
300-
url: Optional[str] = None
301-
path: Optional[str] = None
302-
size: Optional[int] = None
303-
upload_time: Optional[datetime] = None
329+
url: Optional[str] # = None
330+
path: Optional[str] # = None
331+
size: Optional[int] # = None
332+
upload_time: Optional[datetime] # = None
304333
hashes: Dict[str, str]
305334
subdirectory: Optional[str] = None
306335

307-
def __post_init__(self) -> None:
336+
def __init__(
337+
self,
338+
*,
339+
hashes: Dict[str, str],
340+
url: Optional[str] = None,
341+
path: Optional[str] = None,
342+
size: Optional[int] = None,
343+
upload_time: Optional[datetime] = None,
344+
subdirectory: Optional[str] = None,
345+
) -> None:
346+
# In Python 3.10+ make dataclass kw_only=True and remove __init__
347+
self.url = url
348+
self.path = path
349+
self.size = size
350+
self.upload_time = upload_time
351+
self.hashes = hashes
352+
self.subdirectory = subdirectory
353+
# __post_init__ in Python 3.10+
308354
_validate_path_url(self.path, self.url)
309355
_validate_hashes(self.hashes)
310356

@@ -320,16 +366,33 @@ def from_dict(cls, d: Dict[str, Any]) -> "Self":
320366
)
321367

322368

323-
@dataclass(kw_only=True)
369+
@dataclass
324370
class PackageSdist:
325371
name: str
326-
upload_time: Optional[datetime] = None
327-
url: Optional[str] = None
328-
path: Optional[str] = None
329-
size: Optional[int] = None
372+
upload_time: Optional[datetime] # = None
373+
url: Optional[str] # = None
374+
path: Optional[str] # = None
375+
size: Optional[int] # = None
330376
hashes: Dict[str, str]
331377

332-
def __post_init__(self) -> None:
378+
def __init__(
379+
self,
380+
*,
381+
name: str,
382+
hashes: Dict[str, str],
383+
upload_time: Optional[datetime] = None,
384+
url: Optional[str] = None,
385+
path: Optional[str] = None,
386+
size: Optional[int] = None,
387+
) -> None:
388+
# In Python 3.10+ make dataclass kw_only=True and remove __init__
389+
self.name = name
390+
self.upload_time = upload_time
391+
self.url = url
392+
self.path = path
393+
self.size = size
394+
self.hashes = hashes
395+
# __post_init__ in Python 3.10+
333396
_validate_path_url(self.path, self.url)
334397
_validate_hashes(self.hashes)
335398

@@ -345,16 +408,33 @@ def from_dict(cls, d: Dict[str, Any]) -> "Self":
345408
)
346409

347410

348-
@dataclass(kw_only=True)
411+
@dataclass
349412
class PackageWheel:
350413
name: str
351-
upload_time: Optional[datetime] = None
352-
url: Optional[str] = None
353-
path: Optional[str] = None
354-
size: Optional[int] = None
414+
upload_time: Optional[datetime] # = None
415+
url: Optional[str] # = None
416+
path: Optional[str] # = None
417+
size: Optional[int] # = None
355418
hashes: Dict[str, str]
356419

357-
def __post_init__(self) -> None:
420+
def __init__(
421+
self,
422+
*,
423+
name: str,
424+
hashes: Dict[str, str],
425+
upload_time: Optional[datetime] = None,
426+
url: Optional[str] = None,
427+
path: Optional[str] = None,
428+
size: Optional[int] = None,
429+
) -> None:
430+
# In Python 3.10+ make dataclass kw_only=True and remove __init__
431+
self.name = name
432+
self.upload_time = upload_time
433+
self.url = url
434+
self.path = path
435+
self.size = size
436+
self.hashes = hashes
437+
# __post_init__ in Python 3.10+
358438
_validate_path_url(self.path, self.url)
359439
_validate_hashes(self.hashes)
360440

@@ -371,7 +451,7 @@ def from_dict(cls, d: Dict[str, Any]) -> "Self":
371451
return wheel
372452

373453

374-
@dataclass(kw_only=True)
454+
@dataclass
375455
class Package:
376456
name: str
377457
version: Optional[Version] = None
@@ -387,7 +467,38 @@ class Package:
387467
attestation_identities: Optional[List[Dict[str, Any]]] = None
388468
tool: Optional[Dict[str, Any]] = None
389469

390-
def __post_init__(self) -> None:
470+
def __init__(
471+
self,
472+
*,
473+
name: str,
474+
version: Optional[Version] = None,
475+
marker: Optional[Marker] = None,
476+
requires_python: Optional[SpecifierSet] = None,
477+
dependencies: Optional[List[Dict[str, Any]]] = None,
478+
vcs: Optional[PackageVcs] = None,
479+
directory: Optional[PackageDirectory] = None,
480+
archive: Optional[PackageArchive] = None,
481+
index: Optional[str] = None,
482+
sdist: Optional[PackageSdist] = None,
483+
wheels: Optional[List[PackageWheel]] = None,
484+
attestation_identities: Optional[List[Dict[str, Any]]] = None,
485+
tool: Optional[Dict[str, Any]] = None,
486+
) -> None:
487+
# In Python 3.10+ make dataclass kw_only=True and remove __init__
488+
self.name = name
489+
self.version = version
490+
self.marker = marker
491+
self.requires_python = requires_python
492+
self.dependencies = dependencies
493+
self.vcs = vcs
494+
self.directory = directory
495+
self.archive = archive
496+
self.index = index
497+
self.sdist = sdist
498+
self.wheels = wheels
499+
self.attestation_identities = attestation_identities
500+
self.tool = tool
501+
# __post_init__ in Python 3.10+
391502
if self.sdist or self.wheels:
392503
if any([self.vcs, self.directory, self.archive]):
393504
raise PylockValidationError(
@@ -422,19 +533,42 @@ def from_dict(cls, d: Dict[str, Any]) -> "Self":
422533
return package
423534

424535

425-
@dataclass(kw_only=True)
536+
@dataclass
426537
class Pylock:
427538
lock_version: Version
428-
environments: Optional[List[Marker]] = None
429-
requires_python: Optional[SpecifierSet] = None
430-
extras: List[str] = dataclasses.field(default_factory=list)
431-
dependency_groups: List[str] = dataclasses.field(default_factory=list)
432-
default_groups: List[str] = dataclasses.field(default_factory=list)
539+
environments: Optional[List[Marker]] # = None
540+
requires_python: Optional[SpecifierSet] # = None
541+
extras: List[str] # = dataclasses.field(default_factory=list)
542+
dependency_groups: List[str] # = dataclasses.field(default_factory=list)
543+
default_groups: List[str] # = dataclasses.field(default_factory=list)
433544
created_by: str
434545
packages: List[Package]
435546
tool: Optional[Dict[str, Any]] = None
436547

437-
def __post_init__(self) -> None:
548+
def __init__(
549+
self,
550+
*,
551+
lock_version: Version,
552+
created_by: str,
553+
packages: List[Package],
554+
environments: Optional[List[Marker]] = None,
555+
requires_python: Optional[SpecifierSet] = None,
556+
extras: Optional[List[str]] = None,
557+
dependency_groups: Optional[List[str]] = None,
558+
default_groups: Optional[List[str]] = None,
559+
tool: Optional[Dict[str, Any]] = None,
560+
) -> None:
561+
# In Python 3.10+ make dataclass kw_only=True and remove __init__
562+
self.lock_version = lock_version
563+
self.environments = environments
564+
self.requires_python = requires_python
565+
self.extras = extras or []
566+
self.dependency_groups = dependency_groups or []
567+
self.default_groups = default_groups or []
568+
self.created_by = created_by
569+
self.packages = packages
570+
self.tool = tool
571+
# __post_init__ in Python 3.10+
438572
if self.lock_version < Version("1") or self.lock_version >= Version("2"):
439573
raise PylockUnsupportedVersionError(
440574
f"pylock version {self.lock_version} is not supported"

0 commit comments

Comments
 (0)