fast-dev-cli 0.8.0__tar.gz → 0.8.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. {fast_dev_cli-0.8.0 → fast_dev_cli-0.8.2}/PKG-INFO +1 -1
  2. {fast_dev_cli-0.8.0 → fast_dev_cli-0.8.2}/fast_dev_cli/cli.py +34 -13
  3. {fast_dev_cli-0.8.0 → fast_dev_cli-0.8.2}/pyproject.toml +2 -2
  4. fast_dev_cli-0.8.2/scripts/test.sh +6 -0
  5. fast_dev_cli-0.8.2/tests/test_runserver.py +82 -0
  6. fast_dev_cli-0.8.0/scripts/test.sh +0 -4
  7. fast_dev_cli-0.8.0/tests/test_runserver.py +0 -37
  8. {fast_dev_cli-0.8.0 → fast_dev_cli-0.8.2}/LICENSE +0 -0
  9. {fast_dev_cli-0.8.0 → fast_dev_cli-0.8.2}/README.md +0 -0
  10. {fast_dev_cli-0.8.0 → fast_dev_cli-0.8.2}/fast_dev_cli/__init__.py +0 -0
  11. {fast_dev_cli-0.8.0 → fast_dev_cli-0.8.2}/fast_dev_cli/__main__.py +0 -0
  12. {fast_dev_cli-0.8.0 → fast_dev_cli-0.8.2}/fast_dev_cli/py.typed +0 -0
  13. {fast_dev_cli-0.8.0 → fast_dev_cli-0.8.2}/pdm_build.py +0 -0
  14. {fast_dev_cli-0.8.0 → fast_dev_cli-0.8.2}/scripts/check.sh +0 -0
  15. {fast_dev_cli-0.8.0 → fast_dev_cli-0.8.2}/scripts/format.sh +0 -0
  16. {fast_dev_cli-0.8.0 → fast_dev_cli-0.8.2}/tests/__init__.py +0 -0
  17. {fast_dev_cli-0.8.0 → fast_dev_cli-0.8.2}/tests/conftest.py +0 -0
  18. {fast_dev_cli-0.8.0 → fast_dev_cli-0.8.2}/tests/test_bump.py +0 -0
  19. {fast_dev_cli-0.8.0 → fast_dev_cli-0.8.2}/tests/test_fast_test.py +0 -0
  20. {fast_dev_cli-0.8.0 → fast_dev_cli-0.8.2}/tests/test_functions.py +0 -0
  21. {fast_dev_cli-0.8.0 → fast_dev_cli-0.8.2}/tests/test_import.py +0 -0
  22. {fast_dev_cli-0.8.0 → fast_dev_cli-0.8.2}/tests/test_lint.py +0 -0
  23. {fast_dev_cli-0.8.0 → fast_dev_cli-0.8.2}/tests/test_sync.py +0 -0
  24. {fast_dev_cli-0.8.0 → fast_dev_cli-0.8.2}/tests/test_tag.py +0 -0
  25. {fast_dev_cli-0.8.0 → fast_dev_cli-0.8.2}/tests/test_upgrade.py +0 -0
  26. {fast_dev_cli-0.8.0 → fast_dev_cli-0.8.2}/tests/test_upload.py +0 -0
  27. {fast_dev_cli-0.8.0 → fast_dev_cli-0.8.2}/tests/test_version.py +0 -0
  28. {fast_dev_cli-0.8.0 → fast_dev_cli-0.8.2}/tests/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fast-dev-cli
3
- Version: 0.8.0
3
+ Version: 0.8.2
4
4
  Summary: Python project development tool.
5
5
  Author-Email: Waket Zheng <waketzheng@gmail.com>>
6
6
  Classifier: Development Status :: 4 - Beta
@@ -12,15 +12,13 @@ from typing import TYPE_CHECKING, Literal, Optional, Type
12
12
 
13
13
  import typer
14
14
  from typer import Exit, Option, echo, secho
15
+ from typing_extensions import Annotated, Self
15
16
 
16
17
  if sys.version_info >= (3, 11):
17
18
  from enum import StrEnum
18
- from typing import Self
19
19
  else: # pragma: no cover
20
20
  from enum import Enum
21
21
 
22
- from typing_extensions import Self
23
-
24
22
  class StrEnum(str, Enum):
25
23
  __str__ = str.__str__
26
24
 
@@ -29,7 +27,7 @@ if TYPE_CHECKING: # pragma: no cover
29
27
  from typer.models import OptionInfo
30
28
 
31
29
 
32
- __version__ = "0.8.0"
30
+ __version__ = "0.8.2"
33
31
 
34
32
 
35
33
  def parse_files(args: list[str] | tuple[str, ...]) -> list[str]:
@@ -239,27 +237,33 @@ class Project:
239
237
  path_depth = 5
240
238
 
241
239
  @staticmethod
242
- def work_dir(name: str, parent: Path, depth: int) -> Path | None:
240
+ def work_dir(name: str, parent: Path, depth: int, be_file=False) -> Path | None:
243
241
  for _ in range(depth):
244
- if parent.joinpath(name).exists():
242
+ if (f := parent.joinpath(name)).exists():
243
+ if be_file:
244
+ return f
245
245
  return parent
246
246
  parent = parent.parent
247
247
  return None
248
248
 
249
249
  @classmethod
250
250
  def get_work_dir(
251
- cls: Type[Self], name=TOML_FILE, cwd: Path | None = None, allow_cwd=False
251
+ cls: Type[Self],
252
+ name=TOML_FILE,
253
+ cwd: Path | None = None,
254
+ allow_cwd=False,
255
+ be_file=False,
252
256
  ) -> Path:
253
257
  cwd = cwd or Path.cwd()
254
- if d := cls.work_dir(name, cwd, cls.path_depth):
258
+ if d := cls.work_dir(name, cwd, cls.path_depth, be_file):
255
259
  return d
256
260
  if allow_cwd:
257
261
  return cls.get_root_dir(cwd)
258
262
  raise EnvError(f"{name} not found! Make sure this is a poetry project.")
259
263
 
260
264
  @classmethod
261
- def load_toml_text(cls: Type[Self]) -> str:
262
- toml_file = cls.get_work_dir().resolve() / TOML_FILE # to be optimize
265
+ def load_toml_text(cls: Type[Self], name=TOML_FILE) -> str:
266
+ toml_file = cls.get_work_dir(name, be_file=True)
263
267
  return toml_file.read_text("utf8")
264
268
 
265
269
  @classmethod
@@ -662,10 +666,23 @@ def upload(
662
666
 
663
667
 
664
668
  def dev(
665
- port: int | None | "OptionInfo", host: str | None | "OptionInfo", dry=False
669
+ port: int | None | "OptionInfo",
670
+ host: str | None | "OptionInfo",
671
+ file: Optional[str] = None,
672
+ dry=False,
666
673
  ) -> None:
667
674
  cmd = "fastapi dev"
668
- if (port := getattr(port, "default", port)) and port != 8000:
675
+ no_port_yet = True
676
+ if file is not None:
677
+ try:
678
+ port = int(file) # type:ignore[arg-type]
679
+ except ValueError:
680
+ cmd += f" {file}"
681
+ else:
682
+ if port != 8000:
683
+ cmd += f" --{port=}"
684
+ no_port_yet = False
685
+ if no_port_yet and (port := getattr(port, "default", port)) and str(port) != "8000":
669
686
  cmd += f" --port={port}"
670
687
  if (host := getattr(host, "default", host)) and host not in (
671
688
  "localhost",
@@ -677,12 +694,16 @@ def dev(
677
694
 
678
695
  @cli.command(name="dev")
679
696
  def runserver(
697
+ file_or_port: Annotated[Optional[str], typer.Argument()] = None,
680
698
  port: Optional[int] = Option(None, "-p", "--port"),
681
699
  host: Optional[str] = Option(None, "-h", "--host"),
682
700
  dry: bool = Option(False, "--dry", help="Only print, not really run shell command"),
683
701
  ) -> None:
684
702
  """Start a fastapi server(only for fastapi>=0.111.0)"""
685
- dev(port, host, dry=dry)
703
+ if file_or_port:
704
+ dev(port, host, file=file_or_port, dry=dry)
705
+ else:
706
+ dev(port, host, dry=dry)
686
707
 
687
708
 
688
709
  if __name__ == "__main__": # pragma: no cover
@@ -38,7 +38,7 @@ dependencies = [
38
38
  "bumpversion >=0.6.0,<0.7",
39
39
  "pytest >=8.2.0,<9",
40
40
  ]
41
- version = "0.8.0"
41
+ version = "0.8.2"
42
42
 
43
43
  [project.urls]
44
44
  Homepage = "https://github.com/waketzheng/fast-dev-cli"
@@ -66,7 +66,7 @@ source-includes = [
66
66
 
67
67
  [tool.pdm.dev-dependencies]
68
68
  dev = [
69
- "-e file:///${PROJECT_ROOT}/#egg=fast-dev-cli[standard,all]",
69
+ "-e file:///${PROJECT_ROOT}/#egg=fast-dev-cli[all]",
70
70
  ]
71
71
 
72
72
  [tool.waketzheng._internal-slim-build.packages.fastdevcli-slim.project]
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -e
4
+ pdm run coverage run -m pytest
5
+ pdm run coverage combine .coverage*
6
+ pdm run coverage report -m
@@ -0,0 +1,82 @@
1
+ from fast_dev_cli.cli import dev, run_and_echo, runserver
2
+
3
+
4
+ def test_runserver(capsys):
5
+ runserver(dry=True)
6
+ out = capsys.readouterr().out.strip()
7
+ assert "fastapi dev" == out.replace("--> ", "")
8
+ runserver(port=8000, dry=True)
9
+ out = capsys.readouterr().out.strip()
10
+ assert "fastapi dev" == out.replace("--> ", "")
11
+ runserver(port=9000, dry=True)
12
+ out = capsys.readouterr().out.strip()
13
+ assert "fastapi dev --port=9000" == out.replace("--> ", "")
14
+ runserver(host="0.0.0.0", dry=True)
15
+ out = capsys.readouterr().out.strip()
16
+ assert "fastapi dev --host=0.0.0.0" == out.replace("--> ", "")
17
+ runserver(port=9000, host="0.0.0.0", dry=True)
18
+ out = capsys.readouterr().out.strip()
19
+ assert "fastapi dev --port=9000 --host=0.0.0.0" == out.replace("--> ", "")
20
+
21
+
22
+ def test_dev(capsys):
23
+ dev(None, None, dry=True)
24
+ out = capsys.readouterr().out.strip()
25
+ assert "fastapi dev" == out.replace("--> ", "")
26
+ dev(port=8000, host="", dry=True)
27
+ out = capsys.readouterr().out.strip()
28
+ assert "fastapi dev" == out.replace("--> ", "")
29
+ dev(port=9000, host=None, dry=True)
30
+ out = capsys.readouterr().out.strip()
31
+ assert "fastapi dev --port=9000" == out.replace("--> ", "")
32
+ dev(8000, host="0.0.0.0", dry=True)
33
+ out = capsys.readouterr().out.strip()
34
+ assert "fastapi dev --host=0.0.0.0" == out.replace("--> ", "")
35
+ dev(port=9000, host="0.0.0.0", dry=True)
36
+ out = capsys.readouterr().out.strip()
37
+ assert "fastapi dev --port=9000 --host=0.0.0.0" == out.replace("--> ", "")
38
+ dev(8001, host="0.0.0.0", dry=True)
39
+ out = capsys.readouterr().out.strip()
40
+ assert "fastapi dev --port=8001 --host=0.0.0.0" == out.replace("--> ", "")
41
+ dev(None, file="8001", host="0.0.0.0", dry=True)
42
+ out = capsys.readouterr().out.strip()
43
+ assert "fastapi dev --port=8001 --host=0.0.0.0" == out.replace("--> ", "")
44
+ dev(None, file="main.py", host="0.0.0.0", dry=True)
45
+ out = capsys.readouterr().out.strip()
46
+ assert "fastapi dev main.py --host=0.0.0.0" == out.replace("--> ", "")
47
+ dev(8001, file="main.py", host="0.0.0.0", dry=True)
48
+ out = capsys.readouterr().out.strip()
49
+ assert "fastapi dev main.py --port=8001 --host=0.0.0.0" == out.replace("--> ", "")
50
+
51
+
52
+ def test_fast_dev(tmp_path):
53
+ out = tmp_path / "a.txt"
54
+ run_and_echo(f"fast dev 9000 --dry > {out}", verbose=False)
55
+ assert "fastapi dev --port=9000" in out.read_text()
56
+ run_and_echo(f"fast dev main.py --dry > {out}", verbose=False)
57
+ assert "fastapi dev main.py" in out.read_text()
58
+ run_and_echo(f"fast dev main.py --port=9000 --dry > {out}", verbose=False)
59
+ assert "fastapi dev main.py --port=9000" in out.read_text()
60
+ run_and_echo(
61
+ f"fast dev main.py --port=9000 --host=0.0.0.0 --dry > {out}", verbose=False
62
+ )
63
+ assert "fastapi dev main.py --port=9000 --host=0.0.0.0" in out.read_text()
64
+ run_and_echo(f"fast dev 9000 --host=0.0.0.0 --dry > {out}", verbose=False)
65
+ assert "fastapi dev --port=9000 --host=0.0.0.0" in out.read_text()
66
+
67
+
68
+ def test_run_by_module(tmp_path):
69
+ out = tmp_path / "b.txt"
70
+ fast = "python -m fast_dev_cli"
71
+ run_and_echo(f"{fast} dev 9000 --dry > {out}", verbose=False)
72
+ assert "fastapi dev --port=9000" in out.read_text()
73
+ run_and_echo(f"{fast} dev main.py --dry > {out}", verbose=False)
74
+ assert "fastapi dev main.py" in out.read_text()
75
+ run_and_echo(f"{fast} dev main.py --port=9000 --dry > {out}", verbose=False)
76
+ assert "fastapi dev main.py --port=9000" in out.read_text()
77
+ run_and_echo(
78
+ f"{fast} dev main.py --port=9000 --host=0.0.0.0 --dry > {out}", verbose=False
79
+ )
80
+ assert "fastapi dev main.py --port=9000 --host=0.0.0.0" in out.read_text()
81
+ run_and_echo(f"{fast} dev 9000 --host=0.0.0.0 --dry > {out}", verbose=False)
82
+ assert "fastapi dev --port=9000 --host=0.0.0.0" in out.read_text()
@@ -1,4 +0,0 @@
1
- #!/usr/bin/env bash
2
-
3
- set -e
4
- pdm run fast test --ignore-script
@@ -1,37 +0,0 @@
1
- from fast_dev_cli.cli import dev, runserver
2
-
3
-
4
- def test_runserver(capsys):
5
- runserver(dry=True)
6
- out = capsys.readouterr().out.strip()
7
- assert "fastapi dev" == out.replace("--> ", "")
8
- runserver(port=8000, dry=True)
9
- out = capsys.readouterr().out.strip()
10
- assert "fastapi dev" == out.replace("--> ", "")
11
- runserver(port=9000, dry=True)
12
- out = capsys.readouterr().out.strip()
13
- assert "fastapi dev --port=9000" == out.replace("--> ", "")
14
- runserver(host="0.0.0.0", dry=True)
15
- out = capsys.readouterr().out.strip()
16
- assert "fastapi dev --host=0.0.0.0" == out.replace("--> ", "")
17
- runserver(port=9000, host="0.0.0.0", dry=True)
18
- out = capsys.readouterr().out.strip()
19
- assert "fastapi dev --port=9000 --host=0.0.0.0" == out.replace("--> ", "")
20
-
21
-
22
- def test_dev(capsys):
23
- dev(None, None, dry=True)
24
- out = capsys.readouterr().out.strip()
25
- assert "fastapi dev" == out.replace("--> ", "")
26
- dev(port=8000, host="", dry=True)
27
- out = capsys.readouterr().out.strip()
28
- assert "fastapi dev" == out.replace("--> ", "")
29
- dev(port=9000, host=None, dry=True)
30
- out = capsys.readouterr().out.strip()
31
- assert "fastapi dev --port=9000" == out.replace("--> ", "")
32
- dev(8000, host="0.0.0.0", dry=True)
33
- out = capsys.readouterr().out.strip()
34
- assert "fastapi dev --host=0.0.0.0" == out.replace("--> ", "")
35
- dev(port=9000, host="0.0.0.0", dry=True)
36
- out = capsys.readouterr().out.strip()
37
- assert "fastapi dev --port=9000 --host=0.0.0.0" == out.replace("--> ", "")
File without changes
File without changes
File without changes