diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 34c25b2..453bda2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -61,7 +61,7 @@ repos: entry: yamllint --strict --config-file .yamllint.yml - repo: "https://github.com/charliermarsh/ruff-pre-commit" - rev: "v0.0.256" + rev: "v0.0.257" hooks: - id: ruff args: ["--extend-ignore", "I001,D301,D401"] diff --git a/poetry.lock b/poetry.lock index 6bc20d5..1ee5701 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1087,29 +1087,29 @@ files = [ [[package]] name = "ruff" -version = "0.0.256" +version = "0.0.257" description = "An extremely fast Python linter, written in Rust." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.0.256-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:eb8e949f6e7fb16f9aa163fcc13318e2b7910577513468417e5b003b984410a1"}, - {file = "ruff-0.0.256-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:48a42f0ec4c5a3c3b062e947b2a5f8f7a4264761653fb0ee656a9b535ae6d8d7"}, - {file = "ruff-0.0.256-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36ca633cfc335869643a13e2006f13a63bc4cb94073aa9508ceb08a1e3afe3af"}, - {file = "ruff-0.0.256-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:80fa5d3a40dd0b65c6d6adea4f825984d5d3a215a25d90cc6139978cb22ea1cd"}, - {file = "ruff-0.0.256-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0f88839b886db3577136375865bd080b9ed6f9b85bb990d897780e5a30ca3c2"}, - {file = "ruff-0.0.256-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:fe6d77a43b2d52f45ee42f6f682198ed1c34cd0165812e276648981dfd50ad36"}, - {file = "ruff-0.0.256-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3878593507b281b2615702ece06426e8b27076e8fedf658bf0c5e1e5e2ad1b40"}, - {file = "ruff-0.0.256-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e052ec4d5c92663caa662b68fe1902ec10eddac2783229b1c5f20f3df62a865"}, - {file = "ruff-0.0.256-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2116bd67e52ade9f90e5a3a3aa511a9b179c699690221bdd5bb267dbf7e94b22"}, - {file = "ruff-0.0.256-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3c6e93d7818a75669328e49a0f7070c40e18676ca8e56ca9c566633bef4d8d05"}, - {file = "ruff-0.0.256-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7ebb7de4e62d751b65bb15418a83ac5d555afb3eaa3ad549dea21744da34ae86"}, - {file = "ruff-0.0.256-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f310bfc76c0404a487759c8904f57bf51653c46e686c800efc1ff1d165a59a04"}, - {file = "ruff-0.0.256-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:93a0cfec812b2ba57bff22b176901e0ddf44e4d42a9bd7da7ffb5e53df13fd6e"}, - {file = "ruff-0.0.256-py3-none-win32.whl", hash = "sha256:d63e5320bc2d91e94925cd1863e381a48edf087041035967faf2614bb36a6a0d"}, - {file = "ruff-0.0.256-py3-none-win_amd64.whl", hash = "sha256:859c8ffb1801895fe043a2b85a45cd0ff35667ddea4b465ba2a29d275550814a"}, - {file = "ruff-0.0.256-py3-none-win_arm64.whl", hash = "sha256:64b276149e86c3d234608d3fe1da77535865e03debd3a1d5d04576f7f5031bbb"}, - {file = "ruff-0.0.256.tar.gz", hash = "sha256:f9a96b34a4870ee8cf2f3779cd7854620d1788a83b52374771266cf800541bb7"}, + {file = "ruff-0.0.257-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:7280640690c1d0046b20e0eb924319a89d8e22925d7d232180ce31196e7478f8"}, + {file = "ruff-0.0.257-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:4582b73da61ab410ffda35b2987a6eacb33f18263e1c91810f0b9779ec4f41a9"}, + {file = "ruff-0.0.257-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5acae9878f1136893e266348acdb9d30dfae23c296d3012043816432a5abdd51"}, + {file = "ruff-0.0.257-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d9f0912d045eee15e8e02e335c16d7a7f9fb6821aa5eb1628eeb5bbfa3d88908"}, + {file = "ruff-0.0.257-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a9542c34ee5298b31be6c6ba304f14b672dcf104846ee65adb2466d3e325870"}, + {file = "ruff-0.0.257-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:3464f1ad4cea6c4b9325da13ae306bd22bf15d226e18d19c52db191b1f4355ac"}, + {file = "ruff-0.0.257-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a54bfd559e558ee0df2a2f3756423fe6a9de7307bc290d807c3cdf351cb4c24"}, + {file = "ruff-0.0.257-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3438fd38446e1a0915316f4085405c9feca20fe00a4b614995ab7034dbfaa7ff"}, + {file = "ruff-0.0.257-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:358cc2b547bd6451dcf2427b22a9c29a2d9c34e66576c693a6381c5f2ed3011d"}, + {file = "ruff-0.0.257-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:783390f1e94a168c79d7004426dae3e4ae2999cc85f7d00fdd86c62262b71854"}, + {file = "ruff-0.0.257-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:aaa3b5b6929c63a854b6bcea7a229453b455ab26337100b2905fae4523ca5667"}, + {file = "ruff-0.0.257-py3-none-musllinux_1_2_i686.whl", hash = "sha256:4ecd7a84db4816df2dcd0f11c5365a9a2cf4fa70a19b3ac161b7b0bfa592959d"}, + {file = "ruff-0.0.257-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3db8d77d5651a2c0d307102d717627a025d4488d406f54c2764b21cfbe11d822"}, + {file = "ruff-0.0.257-py3-none-win32.whl", hash = "sha256:d2c8755fa4f6c5e5ec032ad341ca3beeecd16786e12c3f26e6b0cc40418ae998"}, + {file = "ruff-0.0.257-py3-none-win_amd64.whl", hash = "sha256:3cec07d6fecb1ebbc45ea8eeb1047b929caa2f7dfb8dd4b0e1869ff789326da5"}, + {file = "ruff-0.0.257-py3-none-win_arm64.whl", hash = "sha256:352f1bdb9b433b3b389aee512ffb0b82226ae1e25b3d92e4eaf0e7be6b1b6f6a"}, + {file = "ruff-0.0.257.tar.gz", hash = "sha256:fedfd06a37ddc17449203c3e38fc83fb68de7f20b5daa0ee4e60d3599b38bab0"}, ] [[package]] @@ -1129,6 +1129,18 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-g testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +[[package]] +name = "sh" +version = "2.0.2" +description = "Python subprocess replacement" +category = "dev" +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "sh-2.0.2-py3-none-any.whl", hash = "sha256:a6208566c168a47ba46a3b5eeda0c9125091c2335f3cbb29f664519f90feb19f"}, + {file = "sh-2.0.2.tar.gz", hash = "sha256:364a25cd2380c3170c46718fe3cc6ffc94b36721e30196a064be508f9b3162f4"}, +] + [[package]] name = "shellingham" version = "1.5.0.post1" @@ -1337,4 +1349,4 @@ dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "038dc872197d153f7687200dfef7926602616dc609357e8f97600920c258e67d" +content-hash = "45e6b76d4b9d0851c885c86136e0721cc90506953bc8e4969b65496aa98587d9" diff --git a/pyproject.toml b/pyproject.toml index 543c180..3c589b6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,10 +43,11 @@ pdoc = "^13.0.0" poethepoet = "^0.18.1" pre-commit = "^3.2.0" - ruff = "^0.0.256" + ruff = "0.0.257" typeguard = "^3.0.1" types-python-dateutil = "^2.8.19.10" vulture = "^2.7" + sh = "^2.0.2" [tool.black] line-length = 100 diff --git a/scripts/update_dependencies.py b/scripts/update_dependencies.py new file mode 100755 index 0000000..fb00d30 --- /dev/null +++ b/scripts/update_dependencies.py @@ -0,0 +1,150 @@ +#!/usr/bin/env python +"""Script to update the pyproject.toml file with the latest versions of the dependencies.""" +from pathlib import Path +from textwrap import wrap + +try: + import tomllib +except ModuleNotFoundError: # pragma: no cover + import tomli as tomllib # type: ignore [no-redef] + +import sh +from rich.console import Console + +console = Console() + + +def dryrun(msg: str) -> None: + """Print a message if the dry run flag is set. + + Args: + msg: Message to print + """ + console.print(f"[cyan]DRYRUN | {msg}[/cyan]") + + +def success(msg: str) -> None: + """Print a success message without using logging. + + Args: + msg: Message to print + """ + console.print(f"[green]SUCCESS | {msg}[/green]") + + +def warning(msg: str) -> None: + """Print a warning message without using logging. + + Args: + msg: Message to print + """ + console.print(f"[yellow]WARNING | {msg}[/yellow]") + + +def error(msg: str) -> None: + """Print an error message without using logging. + + Args: + msg: Message to print + """ + console.print(f"[red]ERROR | {msg}[/red]") + + +def notice(msg: str) -> None: + """Print a notice message without using logging. + + Args: + msg: Message to print + """ + console.print(f"[bold]NOTICE | {msg}[/bold]") + + +def info(msg: str) -> None: + """Print a notice message without using logging. + + Args: + msg: Message to print + """ + console.print(f"INFO | {msg}") + + +def usage(msg: str, width: int = 80) -> None: + """Print a usage message without using logging. + + Args: + msg: Message to print + width (optional): Width of the message + """ + for _n, line in enumerate(wrap(msg, width=width)): + if _n == 0: + console.print(f"[dim]USAGE | {line}") + else: + console.print(f"[dim] | {line}") + + +def debug(msg: str) -> None: + """Print a debug message without using logging. + + Args: + msg: Message to print + """ + console.print(f"[blue]DEBUG | {msg}[/blue]") + + +def dim(msg: str) -> None: + """Print a message in dimmed color. + + Args: + msg: Message to print + """ + console.print(f"[dim]{msg}[/dim]") + + +# Load the pyproject.toml file +pyproject = Path(__file__).parents[1] / "pyproject.toml" + +if not pyproject.exists(): + console.print("pyproject.toml file not found") + raise SystemExit(1) + +with pyproject.open("rb") as f: + try: + data = tomllib.load(f) + except tomllib.TOMLDecodeError as e: + raise SystemExit(1) from e + + +# Get the latest versions of all dependencies +info("Getting latest versions of dependencies...") +packages: dict = {} +for line in sh.poetry("--no-ansi", "show", "--outdated").splitlines(): + package, current, latest = line.split()[:3] + packages[package] = {"current_version": current, "new_version": latest} + +if not packages: + success("All dependencies are up to date") + raise SystemExit(0) + + +dependencies = data["tool"]["poetry"]["dependencies"] +groups = data["tool"]["poetry"]["group"] + +for p in dependencies: + if p in packages: + notice( + f"Updating {p} from {packages[p]['current_version']} to {packages[p]['new_version']}" + ) + sh.poetry("add", f"{p}@latest", _fg=True) + + +for group in groups: + for p in groups[group]["dependencies"]: + if p in packages: + notice( + f"Updating {p} from {packages[p]['current_version']} to {packages[p]['new_version']}" + ) + sh.poetry("add", f"{p}@{packages[p]['new_version']}", "--group", group, _fg=True) + +sh.poetry("update", _fg=True) +success("All dependencies are up to date") +raise SystemExit(0) diff --git a/src/obsidian_metadata/models/application.py b/src/obsidian_metadata/models/application.py index 316431c..c51e1ad 100644 --- a/src/obsidian_metadata/models/application.py +++ b/src/obsidian_metadata/models/application.py @@ -73,7 +73,6 @@ class Application: break console.print("Done!") - return def application_add_metadata(self) -> None: """Add metadata.""" diff --git a/src/obsidian_metadata/models/notes.py b/src/obsidian_metadata/models/notes.py index 5f0c681..2433d42 100644 --- a/src/obsidian_metadata/models/notes.py +++ b/src/obsidian_metadata/models/notes.py @@ -354,7 +354,7 @@ class Note: self.file_content = re.sub(pattern, replacement, self.file_content, re.MULTILINE) - def transpose_metadata( # noqa: C901, PLR0912, PLR0911, PLR0913 + def transpose_metadata( # noqa: C901, PLR0912, PLR0911 self, begin: MetadataType, end: MetadataType, diff --git a/src/obsidian_metadata/models/vault.py b/src/obsidian_metadata/models/vault.py index 24169a2..4254d66 100644 --- a/src/obsidian_metadata/models/vault.py +++ b/src/obsidian_metadata/models/vault.py @@ -471,7 +471,7 @@ class Vault: return num_changed - def transpose_metadata( # noqa: PLR0913 + def transpose_metadata( self, begin: MetadataType, end: MetadataType,