Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ jobs:
tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v1
- uses: actions/checkout@main
- uses: actions/setup-python@main
with:
python-version: "3.10"
python-version: "3.11"
architecture: x64
- run: pip install nox
- run: nox -p "3.10" -f noxfile_lint.py
- run: pip install ruff
- run: ruff check .
17 changes: 12 additions & 5 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,19 @@ jobs:
strategy:
matrix:
python: ["3.8", "3.9", "3.10", "3.11", "3.12"]
name: Python ${{ matrix.python }}
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v1
- name: Checkout
uses: actions/checkout@main

- name: Setup Python ${{ matrix.python }}
uses: actions/setup-python@main
with:
python-version: ${{ matrix.python }}
architecture: x64
- run: pip install nox
- run: nox -p ${{ matrix.python }}

- name: Install
run: |
pip install uv
uv pip install --system .[test] "coverage[toml]"
- name: Tests
run: pytest --cov
10 changes: 5 additions & 5 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
repos:
- repo: https://github.com/ayasyrev/nbmetaclean
rev: 0.0.8
rev: 0.1.3
hooks:
- id: nbclean
name: nbclean
entry: nbclean
args: [ --not_ec ]


- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.5.0
rev: v5.0.0
hooks:
- id: check-added-large-files
- id: check-ast
Expand All @@ -34,7 +34,7 @@ repos:
- id: requirements-txt-fixer
- repo: https://github.com/astral-sh/ruff-pre-commit
# Ruff version.
rev: v0.3.5
rev: v0.8.1
hooks:
# Run the linter.
- id: ruff
Expand Down
2 changes: 1 addition & 1 deletion Nbs/README.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@
"outputs": [],
"source": [
"# hide\n",
"from argparse_pydantic.test_tools import parsers_equal, parsers_equal_typed\n",
"from argparse_pydantic.test_tools import parsers_equal_typed\n",
"\n",
"parser_base = argparse.ArgumentParser(prog=\"MyApp\")\n",
"parser_base.add_argument(\"echo\")\n",
Expand Down
7 changes: 5 additions & 2 deletions noxfile.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import nox


nox.options.default_venv_backend = "uv|virtualenv"
nox.options.reuse_existing_virtualenvs = True


@nox.session(python=["3.8", "3.9", "3.10", "3.11", "3.12"])
def tests(session: nox.Session) -> None:
args = session.posargs or ["--cov"]
session.install("-r", "requirements_test.txt")
session.install(".")
session.install("-e", ".[test]")
session.run("pytest", *args)
9 changes: 6 additions & 3 deletions noxfile_conda.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import nox

nox.options.default_venv_backend = "mamba|conda"
nox.options.reuse_existing_virtualenvs = True

@nox.session(python=["3.8", "3.9", "3.10", "3.11", "3.12"], venv_backend="mamba")

@nox.session(python=["3.8", "3.9", "3.10", "3.11", "3.12"])
def conda_tests(session: nox.Session) -> None:
args = session.posargs or ["--cov"]
session.install("-r", "requirements_test.txt")
session.install(".")
session.conda_install("uv")
session.run("uv", "pip", "install", "-e", ".[test]")
session.run("pytest", *args)
13 changes: 0 additions & 13 deletions noxfile_conda_example.py

This file was deleted.

10 changes: 6 additions & 4 deletions noxfile_conda_lint.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import nox

locations = "src/argparse_pydantic", "tests", "noxfile.py"
locations = "."
nox.options.default_venv_backend = "mamba|conda"
nox.options.reuse_existing_virtualenvs = True


@nox.session(python=["3.8", "3.9", "3.10", "3.11", "3.12"], venv_backend="mamba")
@nox.session(python=["3.8", "3.9", "3.10", "3.11", "3.12"])
def conda_lint(session: nox.Session) -> None:
args = session.posargs or locations
session.conda_install("flake8")
session.run("flake8", *args)
session.conda_install("ruff")
session.run("ruff", "check", *args)
17 changes: 0 additions & 17 deletions noxfile_cov.py

This file was deleted.

8 changes: 5 additions & 3 deletions noxfile_lint.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import nox

locations = "src/argparse_pydantic", "tests", "noxfile.py"
locations = "."
nox.options.default_venv_backend = "uv|virtualenv"
nox.options.reuse_existing_virtualenvs = True


@nox.session(python=["3.8", "3.9", "3.10", "3.11", "3.12"])
def lint(session: nox.Session) -> None:
args = session.posargs or locations
session.install("flake8")
session.run("flake8", *args)
session.install("ruff")
session.run("ruff", "check", *args)
3 changes: 3 additions & 0 deletions requirements_dev.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
black
black[jupyter]
coverage[toml]
flake8
isort
mypy
nbmetaclean
nox
pre-commit
ruff
2 changes: 0 additions & 2 deletions requirements_test_extra.txt

This file was deleted.

31 changes: 19 additions & 12 deletions setup.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,31 @@
from typing import List
from setuptools import setup


REQUIREMENTS_FILENAME = "requirements.txt"
REQUIREMENTS_TEST_FILENAME = "requirements_test.txt"
REQUIREMENTS_DEV_FILENAME = "requirements_dev.txt"


def load_requirements(filename: str) -> List[str]:
"""Load requirements from file"""
try:
with open(filename, encoding="utf-8") as fh:
return fh.read().splitlines()
except FileNotFoundError:
return []


# Requirements
try:
with open(REQUIREMENTS_FILENAME, encoding="utf-8") as fh:
REQUIRED = fh.read().split("\n")
except FileNotFoundError:
REQUIRED = []
REQUIRED = load_requirements(REQUIREMENTS_FILENAME)
TEST_REQUIRED = load_requirements(REQUIREMENTS_TEST_FILENAME)
DEV_REQUIRED = load_requirements(REQUIREMENTS_DEV_FILENAME)

try:
with open(REQUIREMENTS_TEST_FILENAME, encoding="utf-8") as fh:
TEST_REQUIRED = fh.read().split("\n")
except FileNotFoundError:
TEST_REQUIRED = []

# What packages are optional?
EXTRAS = {"test": TEST_REQUIRED}
EXTRAS = {
"test": TEST_REQUIRED,
"dev": DEV_REQUIRED + TEST_REQUIRED,
}


setup(
Expand Down
22 changes: 12 additions & 10 deletions src/argparse_pydantic/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

class Arg(NamedTuple):
name: str
model: BaseModel
model: Type[BaseModel]


def get_args(func: Callable[..., Any]) -> List[Arg]:
Expand All @@ -29,7 +29,7 @@ def get_args(func: Callable[..., Any]) -> List[Arg]:
return params


def get_models(args: List[Arg]) -> List[BaseModel]:
def get_models(args: List[Arg]) -> List[Type[BaseModel]]:
"""get list models from args"""
return [arg.model for arg in args]

Expand All @@ -40,7 +40,7 @@ def app(
usage: str | None = None,
description: str | None = None,
epilog: str | None = None,
parents: Sequence[ArgumentParser] = None,
parents: Sequence[ArgumentParser] | None = None,
formatter_class: Type[HelpFormatter] = HelpFormatter,
prefix_chars: str = "-",
fromfile_prefix_chars: str | None = None,
Expand Down Expand Up @@ -72,7 +72,7 @@ def app(

# Create app.
# Simple variant - expecting function with one argument.
def create_app(func: Callable[[Type[Any]], None]):
def create_app(func: Callable[..., Any]):
args = get_args(func)
app_cfg = args[0].model

Expand Down Expand Up @@ -102,7 +102,7 @@ def __init__(
usage: str | None = None,
description: str | None = None,
epilog: str | None = None,
parents: Sequence[ArgumentParser] = None,
parents: Sequence[ArgumentParser] | None = None,
formatter_class: Type[HelpFormatter] = HelpFormatter,
prefix_chars: str = "-",
fromfile_prefix_chars: str | None = None,
Expand Down Expand Up @@ -138,7 +138,9 @@ def main(self, func: Callable[[Type[Any]], None]):
self.commands["main"] = func
self.configs["main"] = get_args(func)

def command(self, func: Callable[[Type[Any]], None] = None, *, name: str = ""):
def command(
self, func: Callable[[Type[Any]], None] | str | None = None, *, name: str = ""
):
if func is None:
return partial(self.command, name=name)
if isinstance(func, str):
Expand Down Expand Up @@ -189,14 +191,14 @@ def __call__(self, args: Optional[Sequence[str]] = None) -> None:


def run(
func: Callable[[BaseModel], None],
*args: Callable[[BaseModel], None],
**kwargs: Callable[[BaseModel], None],
func: Callable[[Type[BaseModel]], None],
*args: Callable[[Type[BaseModel]], None],
**kwargs: Callable[[Type[BaseModel]], None] | ArgumentParserCfg,
) -> None:
"""Parse command line arguments and run function.
Pass ArgumentParser Cfg as `parser_cfg=parser_cfg`.
Pass command functions as arguments or `command=func`."""
parser_cfg = kwargs.pop("parser_cfg", None)
parser_cfg: ArgumentParserCfg | None = kwargs.pop("parser_cfg", None)
run_app = App(parser_cfg=parser_cfg)
run_app.main(func)
if args:
Expand Down
Loading
Loading