frob 0.0.0__tar.gz → 0.0.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 (125) hide show
  1. {frob-0.0.0 → frob-0.0.2}/PKG-INFO +1 -1
  2. {frob-0.0.0 → frob-0.0.2}/pyproject.toml +3 -2
  3. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/pyproject.toml.j2 +3 -1
  4. frob-0.0.2/src/frob/init/data/python_shared.Makefile.j2 +73 -0
  5. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/python_shared.github.branch-protection.yml.j2 +1 -1
  6. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/python_shared.github.ci.yml.j2 +5 -8
  7. frob-0.0.2/src/frob/init/data/python_shared.scripts.bump_version.py.j2 +33 -0
  8. {frob-0.0.0 → frob-0.0.2}/src/frob/init/project.py +6 -0
  9. {frob-0.0.0 → frob-0.0.2}/src/frob/process/parsers/common.py +2 -0
  10. {frob-0.0.0 → frob-0.0.2}/src/frob.egg-info/PKG-INFO +1 -1
  11. {frob-0.0.0 → frob-0.0.2}/src/frob.egg-info/SOURCES.txt +1 -0
  12. frob-0.0.0/src/frob/init/data/python_shared.Makefile.j2 +0 -67
  13. {frob-0.0.0 → frob-0.0.2}/README.md +0 -0
  14. {frob-0.0.0 → frob-0.0.2}/setup.cfg +0 -0
  15. {frob-0.0.0 → frob-0.0.2}/src/frob/__init__.py +0 -0
  16. {frob-0.0.0 → frob-0.0.2}/src/frob/__main__.py +0 -0
  17. {frob-0.0.0 → frob-0.0.2}/src/frob/_compat.py +0 -0
  18. {frob-0.0.0 → frob-0.0.2}/src/frob/app/__init__.py +0 -0
  19. {frob-0.0.0 → frob-0.0.2}/src/frob/app/app.py +0 -0
  20. {frob-0.0.0 → frob-0.0.2}/src/frob/app/arch_runner.py +0 -0
  21. {frob-0.0.0 → frob-0.0.2}/src/frob/app/bind_runner.py +0 -0
  22. {frob-0.0.0 → frob-0.0.2}/src/frob/app/bundle_runner.py +0 -0
  23. {frob-0.0.0 → frob-0.0.2}/src/frob/app/config.py +0 -0
  24. {frob-0.0.0 → frob-0.0.2}/src/frob/app/cycle_runner.py +0 -0
  25. {frob-0.0.0 → frob-0.0.2}/src/frob/app/docs_runner.py +0 -0
  26. {frob-0.0.0 → frob-0.0.2}/src/frob/app/dup_runner.py +0 -0
  27. {frob-0.0.0 → frob-0.0.2}/src/frob/app/init_runner.py +0 -0
  28. {frob-0.0.0 → frob-0.0.2}/src/frob/app/inspect_runner.py +0 -0
  29. {frob-0.0.0 → frob-0.0.2}/src/frob/app/map_runner.py +0 -0
  30. {frob-0.0.0 → frob-0.0.2}/src/frob/app/outline_runner.py +0 -0
  31. {frob-0.0.0 → frob-0.0.2}/src/frob/app/parse_runner.py +0 -0
  32. {frob-0.0.0 → frob-0.0.2}/src/frob/app/stub_runner.py +0 -0
  33. {frob-0.0.0 → frob-0.0.2}/src/frob/app/tokens_runner.py +0 -0
  34. {frob-0.0.0 → frob-0.0.2}/src/frob/app/xref_runner.py +0 -0
  35. {frob-0.0.0 → frob-0.0.2}/src/frob/arch/__init__.py +0 -0
  36. {frob-0.0.0 → frob-0.0.2}/src/frob/ast/__init__.py +0 -0
  37. {frob-0.0.0 → frob-0.0.2}/src/frob/ast/avr.py +0 -0
  38. {frob-0.0.0 → frob-0.0.2}/src/frob/ast/common.py +0 -0
  39. {frob-0.0.0 → frob-0.0.2}/src/frob/ast/cpp.py +0 -0
  40. {frob-0.0.0 → frob-0.0.2}/src/frob/ast/python.py +0 -0
  41. {frob-0.0.0 → frob-0.0.2}/src/frob/bind/__init__.py +0 -0
  42. {frob-0.0.0 → frob-0.0.2}/src/frob/bundle/__init__.py +0 -0
  43. {frob-0.0.0 → frob-0.0.2}/src/frob/cycle/__init__.py +0 -0
  44. {frob-0.0.0 → frob-0.0.2}/src/frob/cycle/graph.py +0 -0
  45. {frob-0.0.0 → frob-0.0.2}/src/frob/docs/__init__.py +0 -0
  46. {frob-0.0.0 → frob-0.0.2}/src/frob/dup/__init__.py +0 -0
  47. {frob-0.0.0 → frob-0.0.2}/src/frob/init/__init__.py +0 -0
  48. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/README.md.j2 +0 -0
  49. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/cpp_library.CMakeLists.txt.j2 +0 -0
  50. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/cpp_library.cmake.Config.cmake.in.j2 +0 -0
  51. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/cpp_library.include.h.j2 +0 -0
  52. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/cpp_library.src.cpp.j2 +0 -0
  53. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/cpp_library.tests.CMakeLists.txt.j2 +0 -0
  54. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/cpp_library.tests.cpp.j2 +0 -0
  55. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/cpp_shared.Makefile.j2 +0 -0
  56. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/cpp_shared.README.md.j2 +0 -0
  57. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/cpp_shared.cmake.toolchain-linux-arm64.cmake.j2 +0 -0
  58. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/cpp_shared.docs.index.md.j2 +0 -0
  59. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/cpp_shared.github.branch-protection.yml.j2 +0 -0
  60. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/cpp_shared.github.ci.yml.j2 +0 -0
  61. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/cpp_shared.github.release.yml.j2 +0 -0
  62. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/cpp_shared.gitignore.j2 +0 -0
  63. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/cpp_shared.tests.CMakeLists.txt.j2 +0 -0
  64. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/cpp_tool.CMakeLists.txt.j2 +0 -0
  65. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/cpp_tool.include.h.j2 +0 -0
  66. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/cpp_tool.src.cpp.j2 +0 -0
  67. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/cpp_tool.src.main.cpp.j2 +0 -0
  68. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/cpp_tool.tests.CMakeLists.txt.j2 +0 -0
  69. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/cpp_tool.tests.cpp.j2 +0 -0
  70. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/pybind11_library.CMakeLists.txt.j2 +0 -0
  71. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/pybind11_library.Makefile.j2 +0 -0
  72. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/pybind11_library.github.ci.yml.j2 +0 -0
  73. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/pybind11_library.include.h.j2 +0 -0
  74. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/pybind11_library.pyproject.toml.j2 +0 -0
  75. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/pybind11_library.python.__init__.py.j2 +0 -0
  76. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/pybind11_library.src.bindings.cpp.j2 +0 -0
  77. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/pybind11_library.src.cpp.j2 +0 -0
  78. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/pybind11_library.tests.test_bindings.py.j2 +0 -0
  79. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/pybind11_shared.gitignore.j2 +0 -0
  80. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/pyo3_library.Cargo.toml.j2 +0 -0
  81. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/pyo3_library.Makefile.j2 +0 -0
  82. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/pyo3_library.github.ci.yml.j2 +0 -0
  83. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/pyo3_library.pyproject.toml.j2 +0 -0
  84. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/pyo3_library.python.__init__.py.j2 +0 -0
  85. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/pyo3_library.src.lib.rs.j2 +0 -0
  86. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/pyo3_library.tests.test_bindings.py.j2 +0 -0
  87. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/pyo3_shared.gitignore.j2 +0 -0
  88. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/python_lib.__init__.py.j2 +0 -0
  89. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/python_shared.docs.index.md.j2 +0 -0
  90. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/python_shared.gitignore.j2 +0 -0
  91. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/python_shared.logging.__init__.py.j2 +0 -0
  92. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/python_shared.logging.config.toml.j2 +0 -0
  93. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/python_shared.logging.filter.py.j2 +0 -0
  94. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/python_shared.logging.formatter.py.j2 +0 -0
  95. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/python_shared.logging.logger.py.j2 +0 -0
  96. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/python_shared.tests.conftest.py.j2 +0 -0
  97. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/python_shared.tests.system.test_build.py.j2 +0 -0
  98. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/python_shared.tests.unit.test_placeholder.py.j2 +0 -0
  99. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/python_tool.__init__.py.j2 +0 -0
  100. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/python_tool.__main__.py.j2 +0 -0
  101. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/python_tool.app.py.j2 +0 -0
  102. {frob-0.0.0 → frob-0.0.2}/src/frob/init/data/python_tool.config.py.j2 +0 -0
  103. {frob-0.0.0 → frob-0.0.2}/src/frob/inspect/__init__.py +0 -0
  104. {frob-0.0.0 → frob-0.0.2}/src/frob/logging/__init__.py +0 -0
  105. {frob-0.0.0 → frob-0.0.2}/src/frob/logging/config.toml +0 -0
  106. {frob-0.0.0 → frob-0.0.2}/src/frob/logging/filter.py +0 -0
  107. {frob-0.0.0 → frob-0.0.2}/src/frob/logging/formatter.py +0 -0
  108. {frob-0.0.0 → frob-0.0.2}/src/frob/logging/handler.py +0 -0
  109. {frob-0.0.0 → frob-0.0.2}/src/frob/logging/logger.py +0 -0
  110. {frob-0.0.0 → frob-0.0.2}/src/frob/map/__init__.py +0 -0
  111. {frob-0.0.0 → frob-0.0.2}/src/frob/outline/__init__.py +0 -0
  112. {frob-0.0.0 → frob-0.0.2}/src/frob/process/__init__.py +0 -0
  113. {frob-0.0.0 → frob-0.0.2}/src/frob/process/parsers/__init__.py +0 -0
  114. {frob-0.0.0 → frob-0.0.2}/src/frob/process/parsers/clang.py +0 -0
  115. {frob-0.0.0 → frob-0.0.2}/src/frob/process/parsers/junit.py +0 -0
  116. {frob-0.0.0 → frob-0.0.2}/src/frob/process/parsers/pycharm.py +0 -0
  117. {frob-0.0.0 → frob-0.0.2}/src/frob/process/parsers/pytest.py +0 -0
  118. {frob-0.0.0 → frob-0.0.2}/src/frob/process/parsers/ruff.py +0 -0
  119. {frob-0.0.0 → frob-0.0.2}/src/frob/process/parsers/ty.py +0 -0
  120. {frob-0.0.0 → frob-0.0.2}/src/frob/stub/__init__.py +0 -0
  121. {frob-0.0.0 → frob-0.0.2}/src/frob/tokens/__init__.py +0 -0
  122. {frob-0.0.0 → frob-0.0.2}/src/frob/xref/__init__.py +0 -0
  123. {frob-0.0.0 → frob-0.0.2}/src/frob.egg-info/dependency_links.txt +0 -0
  124. {frob-0.0.0 → frob-0.0.2}/src/frob.egg-info/requires.txt +0 -0
  125. {frob-0.0.0 → frob-0.0.2}/src/frob.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: frob
3
- Version: 0.0.0
3
+ Version: 0.0.2
4
4
  Summary: These are tools that I use in my development workflow.
5
5
  Author-email: Logan Dapp <logan@logand.app>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "frob"
7
- version = "0.0.0"
7
+ version = "0.0.2"
8
8
  description = "These are tools that I use in my development workflow."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -35,6 +35,7 @@ dev = [
35
35
  "packaging",
36
36
  "pytest>=8",
37
37
  "pytest-testmon>=2",
38
+ "pytest-xdist>=3",
38
39
  "ruff>=0.8",
39
40
  "ty>=0.0.1a8",
40
41
  ]
@@ -61,5 +62,5 @@ line-length = 88
61
62
 
62
63
  [tool.pytest.ini_options]
63
64
  testpaths = ["tests"]
64
- addopts = "-q"
65
+ addopts = "-q -n auto"
65
66
  pythonpath = ["."]
@@ -20,6 +20,7 @@ dev = [
20
20
  "packaging",
21
21
  "pytest>=8",
22
22
  "pytest-testmon>=2",
23
+ "pytest-xdist>=3",
23
24
  "ruff>=0.8",
24
25
  "ty>=0.0.1a8",
25
26
  ]
@@ -35,7 +36,8 @@ packages = { find = { where = ["src"] } }
35
36
 
36
37
  [tool.pytest.ini_options]
37
38
  testpaths = ["tests"]
38
- addopts = "-q"
39
+ addopts = "-q -n auto"
40
+ pythonpath = ["."]
39
41
 
40
42
  [tool.ruff]
41
43
  line-length = 88
@@ -0,0 +1,73 @@
1
+ # Stamp file: uv sync runs only when pyproject.toml changes.
2
+ STAMP := .venv/.install-stamp
3
+
4
+ .PHONY: all check install format lint lint-fix typecheck test test-fast clean upload
5
+
6
+ PYPI_NAME := {{ project.name }}
7
+ SRC := src
8
+ TESTS := tests
9
+
10
+ # ---------- default ----------
11
+
12
+ # Runs each tool exactly once: format, lint, typecheck, test.
13
+ all: $(STAMP)
14
+ uv run black $(SRC)/ $(TESTS)/
15
+ uv run ruff check $(SRC)/ $(TESTS)/ --fix --select I
16
+ uv run ruff format $(SRC)/ $(TESTS)/
17
+ uv run ty check $(SRC)/
18
+ uv run pytest $(TESTS)/ -q -n auto
19
+
20
+ # Read-only gate (no auto-fix). Safe to run in CI.
21
+ check: $(STAMP)
22
+ uv run ruff check $(SRC)/ $(TESTS)/
23
+ uv run ty check $(SRC)/
24
+ uv run pytest $(TESTS)/ -q -n auto
25
+
26
+ # ---------- install (stamp-guarded) ----------
27
+
28
+ $(STAMP): pyproject.toml
29
+ uv sync --all-extras
30
+ @touch $(STAMP)
31
+
32
+ install: $(STAMP)
33
+
34
+ # ---------- formatting & linting ----------
35
+
36
+ format: $(STAMP)
37
+ uv run black $(SRC)/ $(TESTS)/
38
+ uv run ruff check $(SRC)/ $(TESTS)/ --fix --select I
39
+ uv run ruff format $(SRC)/ $(TESTS)/
40
+
41
+ lint: $(STAMP)
42
+ uv run ruff check $(SRC)/ $(TESTS)/
43
+ uv run ty check $(SRC)/
44
+
45
+ lint-fix: $(STAMP)
46
+ uv run ruff check $(SRC)/ $(TESTS)/ --fix
47
+ uv run black $(SRC)/ $(TESTS)/
48
+ uv run ruff format $(SRC)/ $(TESTS)/
49
+
50
+ typecheck: $(STAMP)
51
+ uv run ty check $(SRC)/
52
+
53
+ # ---------- tests ----------
54
+
55
+ test: $(STAMP)
56
+ uv run pytest $(TESTS)/ -q -n auto
57
+
58
+ test-fast: $(STAMP)
59
+ uv run pytest $(TESTS)/ -q --testmon
60
+
61
+ # ---------- build & publish ----------
62
+
63
+ clean:
64
+ rm -rf dist/ build/ .pytest_cache/ .ruff_cache/ .testmondata
65
+ find . -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null; true
66
+ find . -type d -name "*.egg-info" -exec rm -rf {} + 2>/dev/null; true
67
+
68
+ upload: clean
69
+ @NEW=$$(uv run python scripts/bump_version.py); \
70
+ git add pyproject.toml; \
71
+ git commit -m "chore: bump version to $$NEW"; \
72
+ git push; \
73
+ uv build && uv publish
@@ -29,4 +29,4 @@ jobs:
29
29
 
30
30
  - run: uv sync --all-extras
31
31
 
32
- - run: uv run pytest tests/ -q
32
+ - run: uv run pytest tests/ -q -n auto
@@ -29,11 +29,8 @@ jobs:
29
29
  - name: Install dependencies
30
30
  run: uv sync --all-extras
31
31
 
32
- - name: Lint
33
- run: uv run ruff check src/ tests/
34
-
35
- - name: Type check
36
- run: uv run ty check src/
37
-
38
- - name: Test
39
- run: uv run pytest tests/ -q
32
+ - name: Check
33
+ run: |
34
+ uv run ruff check src/ tests/
35
+ uv run ty check src/
36
+ uv run pytest tests/ -q -n auto
@@ -0,0 +1,33 @@
1
+ """
2
+ Bump the patch version in pyproject.toml unconditionally.
3
+ Prints the new version to stdout. Edits pyproject.toml in place.
4
+ """
5
+
6
+ import re
7
+ import sys
8
+ from pathlib import Path
9
+
10
+ try:
11
+ import tomllib
12
+ except ImportError:
13
+ try:
14
+ import tomli as tomllib # type: ignore[no-redef]
15
+ except ImportError:
16
+ import toml as tomllib # type: ignore[no-redef,import-not-found]
17
+
18
+ PYPROJECT = Path("pyproject.toml")
19
+
20
+ with PYPROJECT.open("rb") as f:
21
+ data = tomllib.load(f)
22
+
23
+ current = data["project"]["version"]
24
+ parts = current.split(".")
25
+ parts[-1] = str(int(parts[-1]) + 1)
26
+ new = ".".join(parts)
27
+
28
+ text = PYPROJECT.read_text()
29
+ text = re.sub(r'^version = "[^"]+"', f'version = "{new}"', text, flags=re.M)
30
+ PYPROJECT.write_text(text)
31
+
32
+ print(f"bumped {current} -> {new}", file=sys.stderr)
33
+ print(new)
@@ -32,6 +32,9 @@ _MANIFESTS: dict[str, list[_ManifestEntry]] = {
32
32
  _ManifestEntry("README.md.j2", "README.md"),
33
33
  _ManifestEntry("python_shared.gitignore.j2", ".gitignore"),
34
34
  _ManifestEntry("python_shared.Makefile.j2", "Makefile"),
35
+ _ManifestEntry(
36
+ "python_shared.scripts.bump_version.py.j2", "scripts/bump_version.py"
37
+ ),
35
38
  _ManifestEntry("pyproject.toml.j2", "pyproject.toml"),
36
39
  _ManifestEntry(
37
40
  "python_lib.__init__.py.j2", "src/{{ project.name }}/__init__.py"
@@ -75,6 +78,9 @@ _MANIFESTS: dict[str, list[_ManifestEntry]] = {
75
78
  _ManifestEntry("README.md.j2", "README.md"),
76
79
  _ManifestEntry("python_shared.gitignore.j2", ".gitignore"),
77
80
  _ManifestEntry("python_shared.Makefile.j2", "Makefile"),
81
+ _ManifestEntry(
82
+ "python_shared.scripts.bump_version.py.j2", "scripts/bump_version.py"
83
+ ),
78
84
  _ManifestEntry("pyproject.toml.j2", "pyproject.toml"),
79
85
  _ManifestEntry(
80
86
  "python_tool.__init__.py.j2", "src/{{ project.name }}/__init__.py"
@@ -41,6 +41,8 @@ class Diagnostic(BaseModel):
41
41
  class TestCase(BaseModel):
42
42
  """A single test case result."""
43
43
 
44
+ __test__: bool = False
45
+
44
46
  suite: str = ""
45
47
  name: str
46
48
  passed: bool
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: frob
3
- Version: 0.0.0
3
+ Version: 0.0.2
4
4
  Summary: These are tools that I use in my development workflow.
5
5
  Author-email: Logan Dapp <logan@logand.app>
6
6
  License: MIT
@@ -91,6 +91,7 @@ src/frob/init/data/python_shared.logging.config.toml.j2
91
91
  src/frob/init/data/python_shared.logging.filter.py.j2
92
92
  src/frob/init/data/python_shared.logging.formatter.py.j2
93
93
  src/frob/init/data/python_shared.logging.logger.py.j2
94
+ src/frob/init/data/python_shared.scripts.bump_version.py.j2
94
95
  src/frob/init/data/python_shared.tests.conftest.py.j2
95
96
  src/frob/init/data/python_shared.tests.system.test_build.py.j2
96
97
  src/frob/init/data/python_shared.tests.unit.test_placeholder.py.j2
@@ -1,67 +0,0 @@
1
- .PHONY: all install build lint lint-fix format typecheck test test-fast clean upload
2
-
3
- PYPI_NAME := {{ project.name }}
4
- SRC := src
5
- TESTS := tests
6
-
7
- all: format lint typecheck test
8
-
9
- install:
10
- uv sync --all-extras
11
-
12
- # ---------- formatting & linting ----------
13
-
14
- format: install
15
- uv run black $(SRC)/ $(TESTS)/
16
- uv run ruff check $(SRC)/ $(TESTS)/ --fix --select I
17
- uv run ruff format $(SRC)/ $(TESTS)/
18
-
19
- lint: install
20
- uv run ruff check $(SRC)/ $(TESTS)/
21
- uv run ty check $(SRC)/
22
-
23
- lint-fix: install
24
- uv run ruff check $(SRC)/ $(TESTS)/ --fix
25
- uv run black $(SRC)/ $(TESTS)/
26
- uv run ruff format $(SRC)/ $(TESTS)/
27
-
28
- typecheck: install
29
- uv run ty check $(SRC)/
30
-
31
- # ---------- tests ----------
32
-
33
- test: install
34
- uv run pytest $(TESTS)/ -q
35
-
36
- test-fast: install
37
- uv run pytest $(TESTS)/ -q --testmon
38
-
39
- # ---------- build & publish ----------
40
-
41
- clean:
42
- rm -rf dist/ build/ .pytest_cache/ .ruff_cache/
43
- find . -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null; true
44
- find . -type d -name "*.egg-info" -exec rm -rf {} + 2>/dev/null; true
45
-
46
- upload: clean
47
- @LOCAL=$$(python -c "import tomllib; t=tomllib.load(open('pyproject.toml','rb')); print(t['project']['version'])"); \
48
- PYPI=$$(curl -s https://pypi.org/pypi/$(PYPI_NAME)/json 2>/dev/null \
49
- | python -c "import sys,json; print(json.load(sys.stdin)['info']['version'])" 2>/dev/null \
50
- || echo "0.0.0"); \
51
- BUMP=$$(python -c " \
52
- from packaging.version import Version; \
53
- l, p = Version('$$LOCAL'), Version('$$PYPI'); \
54
- print('yes' if l <= p else 'no')"); \
55
- if [ "$$BUMP" = "yes" ]; then \
56
- NEW=$$(python -c " \
57
- v = '$$LOCAL'.split('.'); v[-1] = str(int(v[-1])+1); print('.'.join(v))"); \
58
- python -c " \
59
- import re, pathlib; \
60
- p = pathlib.Path('pyproject.toml'); \
61
- p.write_text(re.sub(r'^version = .+', 'version = \"$$NEW\"', p.read_text(), flags=re.M))"; \
62
- echo "Bumped $$LOCAL -> $$NEW"; \
63
- git add pyproject.toml; \
64
- git commit -m "chore: bump version to $$NEW"; \
65
- git push; \
66
- fi; \
67
- uv build && uv publish
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes