Skip to content

Commit 51ddd3a

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

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(frozen=True)
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+
object.__setattr__(self, "type", type)
280+
object.__setattr__(self, "url", url)
281+
object.__setattr__(self, "path", path)
282+
object.__setattr__(self, "requested_revision", requested_revision)
283+
object.__setattr__(self, "commit_id", commit_id)
284+
object.__setattr__(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(frozen=True)
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+
object.__setattr__(self, "path", path)
315+
object.__setattr__(self, "editable", editable)
316+
object.__setattr__(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(frozen=True)
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+
object.__setattr__(self, "url", url)
348+
object.__setattr__(self, "path", path)
349+
object.__setattr__(self, "size", size)
350+
object.__setattr__(self, "upload_time", upload_time)
351+
object.__setattr__(self, "hashes", hashes)
352+
object.__setattr__(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(frozen=True)
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+
object.__setattr__(self, "name", name)
390+
object.__setattr__(self, "upload_time", upload_time)
391+
object.__setattr__(self, "url", url)
392+
object.__setattr__(self, "path", path)
393+
object.__setattr__(self, "size", size)
394+
object.__setattr__(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(frozen=True)
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+
object.__setattr__(self, "name", name)
432+
object.__setattr__(self, "upload_time", upload_time)
433+
object.__setattr__(self, "url", url)
434+
object.__setattr__(self, "path", path)
435+
object.__setattr__(self, "size", size)
436+
object.__setattr__(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(frozen=True)
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+
object.__setattr__(self, "name", name)
489+
object.__setattr__(self, "version", version)
490+
object.__setattr__(self, "marker", marker)
491+
object.__setattr__(self, "requires_python", requires_python)
492+
object.__setattr__(self, "dependencies", dependencies)
493+
object.__setattr__(self, "vcs", vcs)
494+
object.__setattr__(self, "directory", directory)
495+
object.__setattr__(self, "archive", archive)
496+
object.__setattr__(self, "index", index)
497+
object.__setattr__(self, "sdist", sdist)
498+
object.__setattr__(self, "wheels", wheels)
499+
object.__setattr__(self, "attestation_identities", attestation_identities)
500+
object.__setattr__(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(frozen=True)
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+
object.__setattr__(self, "lock_version", lock_version)
563+
object.__setattr__(self, "environments", environments)
564+
object.__setattr__(self, "requires_python", requires_python)
565+
object.__setattr__(self, "extras", extras or [])
566+
object.__setattr__(self, "dependency_groups", dependency_groups or [])
567+
object.__setattr__(self, "default_groups", default_groups or [])
568+
object.__setattr__(self, "created_by", created_by)
569+
object.__setattr__(self, "packages", packages)
570+
object.__setattr__(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)