From 10d39176b11d33ea2fcda71eadcfe5d2e37af455 Mon Sep 17 00:00:00 2001 From: Lev Gorodetskiy Date: Mon, 27 Jan 2025 15:09:48 -0300 Subject: [PATCH 1/2] DipDup package structure validation --- CHANGELOG.md | 6 ++++++ docs/9.release-notes/_8.0_changelog.md | 4 ++++ src/dipdup/cli.py | 2 ++ src/dipdup/package.py | 14 ++++++++++++++ 4 files changed, 26 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 811a72e32..9d0e09547 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ The format is based on [Keep a Changelog], and this project adheres to [Semantic Releases prior to 7.0 has been removed from this file to declutter search results; see the [archived copy](https://github.com/dipdup-io/dipdup/blob/8.0.0b5/CHANGELOG.md) for the full list. +## [Unreleased] + +### Deprecated + +- package: DipDup packages are expected to have `pyproject.toml` and `dipdup.yaml` files in the root directory. This will become a requirement in 9.0. + ## [8.2.0rc1] - 2025-01-24 ### Added diff --git a/docs/9.release-notes/_8.0_changelog.md b/docs/9.release-notes/_8.0_changelog.md index e0555feed..b6125f70f 100644 --- a/docs/9.release-notes/_8.0_changelog.md +++ b/docs/9.release-notes/_8.0_changelog.md @@ -64,6 +64,10 @@ - performance: All time intervals are now measured in seconds. - performance: Several metrics have been renamed and new ones have been added. +### Deprecated + +- package: DipDup packages are expected to have `pyproject.toml` and `dipdup.yaml` files in the root directory. This will become a requirement in 9.0. + ### Removed - config: Removed `advanced.skip_version_check` flag; use `DIPDUP_NO_VERSION_CHECK` environment variable. diff --git a/src/dipdup/cli.py b/src/dipdup/cli.py index e897f02b8..bfa3ab575 100644 --- a/src/dipdup/cli.py +++ b/src/dipdup/cli.py @@ -928,6 +928,7 @@ async def self_install( editable=editable, with_pdm=replay is not None and replay['package_manager'] == 'pdm', with_poetry=replay is not None and replay['package_manager'] == 'poetry', + with_uv=replay is not None and replay['package_manager'] == 'uv', ) @@ -972,6 +973,7 @@ async def self_update( update=True, with_pdm=replay is not None and replay['package_manager'] == 'pdm', with_poetry=replay is not None and replay['package_manager'] == 'poetry', + with_uv=replay is not None and replay['package_manager'] == 'uv', ) diff --git a/src/dipdup/package.py b/src/dipdup/package.py index 39a76129c..a177f095e 100644 --- a/src/dipdup/package.py +++ b/src/dipdup/package.py @@ -62,6 +62,10 @@ def __init__(self, root: Path, quiet: bool = False) -> None: self.root = root self.name = root.name + # NOTE: Paths expected to exist in package root + self.pyproject = root.parent / 'pyproject.toml' + self.root_config = root.parent / 'dipdup.yaml' + # NOTE: Package sections with .keep markers self.abi = root / 'abi' self.configs = root / 'configs' @@ -164,6 +168,16 @@ def _pre_init(self) -> None: if self.root.exists() and not self.root.is_dir(): raise ProjectPackageError(f'`{self.root}` exists and not a directory') + # TODO: Remove in 9.0 + def act(x): + if env.NEXT: + raise ProjectPackageError(x) + _logger.warning(x) + + for path in (self.root_config, self.pyproject): + if not path.is_file(): + act(f'`{path}` not found. Have you created a project with `dipdup new` command?') + def _post_init(self) -> None: # NOTE: Allows plain package structure to be imported if self.root != Path.cwd() or env.NO_SYMLINK: From 1685c1777fb7e033efab80f8bdfdb19881176a80 Mon Sep 17 00:00:00 2001 From: Lev Gorodetskiy Date: Mon, 27 Jan 2025 15:12:50 -0300 Subject: [PATCH 2/2] mypy --- src/dipdup/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dipdup/package.py b/src/dipdup/package.py index a177f095e..a96c55aa9 100644 --- a/src/dipdup/package.py +++ b/src/dipdup/package.py @@ -169,7 +169,7 @@ def _pre_init(self) -> None: raise ProjectPackageError(f'`{self.root}` exists and not a directory') # TODO: Remove in 9.0 - def act(x): + def act(x: str) -> None: if env.NEXT: raise ProjectPackageError(x) _logger.warning(x)