Skip to content

Commit

Permalink
Move HashManager to dedicated module, change test suite name
Browse files Browse the repository at this point in the history
  • Loading branch information
Secrus authored and abn committed Mar 3, 2024
1 parent 99ac313 commit 0d3f06a
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 59 deletions.
65 changes: 65 additions & 0 deletions src/poetry/publishing/hash_manager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
from __future__ import annotations

import hashlib
import io

from contextlib import suppress
from typing import TYPE_CHECKING
from typing import NamedTuple


if TYPE_CHECKING:
from pathlib import Path


class Hexdigest(NamedTuple):
md5: str | None
sha256: str | None
blake2_256: str | None


class HashManager:
def __init__(self) -> None:
self._sha2_hasher = hashlib.sha256()

self._md5_hasher = None
with suppress(ValueError):
# FIPS mode disables MD5
self._md5_hasher = hashlib.md5()

self._blake_hasher = None
with suppress(ValueError, TypeError):
# FIPS mode disables blake2
self._blake_hasher = hashlib.blake2b(digest_size=256 // 8)

def _md5_update(self, content: bytes) -> None:
if self._md5_hasher is not None:
self._md5_hasher.update(content)

def _md5_hexdigest(self) -> str | None:
if self._md5_hasher is not None:
return self._md5_hasher.hexdigest()
return None

def _blake_update(self, content: bytes) -> None:
if self._blake_hasher is not None:
self._blake_hasher.update(content)

def _blake_hexdigest(self) -> str | None:
if self._blake_hasher is not None:
return self._blake_hasher.hexdigest()
return None

def hash(self, file: Path) -> None:
with file.open("rb") as fp:
for content in iter(lambda: fp.read(io.DEFAULT_BUFFER_SIZE), b""):
self._md5_update(content)
self._sha2_hasher.update(content)
self._blake_update(content)

def hexdigest(self) -> Hexdigest:
return Hexdigest(
self._md5_hexdigest(),
self._sha2_hasher.hexdigest(),
self._blake_hexdigest(),
)
59 changes: 1 addition & 58 deletions src/poetry/publishing/uploader.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,8 @@
from __future__ import annotations

import hashlib
import io

from contextlib import suppress
from pathlib import Path
from typing import TYPE_CHECKING
from typing import Any
from typing import NamedTuple

import requests

Expand All @@ -20,6 +15,7 @@
from requests_toolbelt.multipart import MultipartEncoderMonitor

from poetry.__version__ import __version__
from poetry.publishing.hash_manager import HashManager
from poetry.utils.constants import REQUESTS_TIMEOUT
from poetry.utils.patterns import wheel_file_re

Expand Down Expand Up @@ -50,59 +46,6 @@ def __init__(self, error: ConnectionError | HTTPError | str) -> None:
super().__init__(message)


class Hexdigest(NamedTuple):
md5: str | None
sha256: str | None
blake2_256: str | None


class HashManager:
def __init__(self) -> None:
self._sha2_hasher = hashlib.sha256()

self._md5_hasher = None
with suppress(ValueError):
# FIPS mode disables MD5
self._md5_hasher = hashlib.md5()

self._blake_hasher = None
with suppress(ValueError, TypeError):
# FIPS mode disables blake2
self._blake_hasher = hashlib.blake2b(digest_size=256 // 8)

def _md5_update(self, content: bytes) -> None:
if self._md5_hasher is not None:
self._md5_hasher.update(content)

def _md5_hexdigest(self) -> str | None:
if self._md5_hasher is not None:
return self._md5_hasher.hexdigest()
return None

def _blake_update(self, content: bytes) -> None:
if self._blake_hasher is not None:
self._blake_hasher.update(content)

def _blake_hexdigest(self) -> str | None:
if self._blake_hasher is not None:
return self._blake_hasher.hexdigest()
return None

def hash(self, file: Path) -> None:
with file.open("rb") as fp:
for content in iter(lambda: fp.read(io.DEFAULT_BUFFER_SIZE), b""):
self._md5_update(content)
self._sha2_hasher.update(content)
self._blake_update(content)

def hexdigest(self) -> Hexdigest:
return Hexdigest(
self._md5_hexdigest(),
self._sha2_hasher.hexdigest(),
self._blake_hexdigest(),
)


class Uploader:
def __init__(self, poetry: Poetry, io: IO, dist_dir: Path | None = None) -> None:
self._poetry = poetry
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import pytest

from poetry.publishing.uploader import HashManager
from poetry.publishing.hash_manager import HashManager


if TYPE_CHECKING:
Expand Down

0 comments on commit 0d3f06a

Please sign in to comment.