Skip to content

Commit 456cf84

Browse files
authored
Merge pull request #138 from bckohan/v2.2.0
V2.2.0
2 parents d91e995 + a973608 commit 456cf84

31 files changed

+1478
-940
lines changed

.github/workflows/test.yml

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ jobs:
2323
django-version: 'Django~=3.2.0'
2424

2525
steps:
26-
- uses: actions/checkout@v3
26+
- uses: actions/checkout@v4
2727
- name: Set up Python ${{ matrix.python-version }}
28-
uses: actions/setup-python@v4
28+
uses: actions/setup-python@v5
2929
with:
3030
python-version: ${{ matrix.python-version }}
3131

@@ -46,11 +46,12 @@ jobs:
4646
poetry run black render_static --check
4747
poetry run pylint render_static
4848
poetry run mypy render_static
49-
poetry run doc8 -q doc
5049
poetry check
5150
poetry run pip check
5251
poetry export --without-hashes --format=requirements.txt | poetry run safety check --stdin
5352
poetry run python -m readme_renderer ./README.rst -o /tmp/README.html
53+
cd ./doc
54+
poetry run doc8 --ignore-path build --max-line-length 100
5455
5556
test:
5657
runs-on: ubuntu-latest
@@ -72,12 +73,12 @@ jobs:
7273
django-version: '5.0.0'
7374

7475
steps:
75-
- uses: actions/checkout@v3
76-
- uses: actions/setup-node@v3
76+
- uses: actions/checkout@v4
77+
- uses: actions/setup-node@v4
7778
with:
7879
node-version: 18
7980
- name: Set up Python ${{ matrix.python-version }}
80-
uses: actions/setup-python@v4
81+
uses: actions/setup-python@v5
8182
with:
8283
python-version: ${{ matrix.python-version }}
8384

@@ -95,8 +96,14 @@ jobs:
9596
- name: Run Unit Tests
9697
run: |
9798
poetry run pytest
99+
poetry run pip uninstall -y jinja2 pyyaml importlib-resources
100+
poetry run pytest --cov-append
98101
mv .coverage py${{ matrix.python-version }}-dj${{ matrix.django-version }}.coverage
99-
102+
# - name: Setup tmate session
103+
# uses: mxschmitt/action-tmate@v3
104+
# with:
105+
# detached: true
106+
# timeout-minutes: 60
100107
- name: Store coverage files
101108
uses: actions/upload-artifact@v4
102109
with:
@@ -108,8 +115,8 @@ jobs:
108115
runs-on: ubuntu-latest
109116

110117
steps:
111-
- uses: actions/checkout@v3
112-
- uses: actions/setup-python@v4
118+
- uses: actions/checkout@v4
119+
- uses: actions/setup-python@v5
113120
with:
114121
python-version: '3.12'
115122

@@ -137,7 +144,7 @@ jobs:
137144
- run: poetry run coverage xml
138145

139146
- name: Upload coverage to Codecov
140-
uses: codecov/codecov-action@v3
147+
uses: codecov/codecov-action@v4
141148
with:
142149
token: ${{ secrets.CODECOV_TOKEN }}
143150
file: ./coverage.xml

CONTRIBUTING.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ new feature PRs must provide updated documentation for the features added. To bu
4343
.. code-block::
4444
4545
cd ./doc
46+
poetry run doc8 --ignore-path build --max-line-length 100
4647
poetry run make html
4748
4849
@@ -60,7 +61,6 @@ or warnings where justified is acceptable:
6061
poetry run black render_static
6162
poetry run mypy render_static
6263
poetry run pylint render_static
63-
poetry run doc8 -q doc
6464
poetry check
6565
poetry run pip check
6666
poetry run python -m readme_renderer ./README.rst

doc/source/changelog.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22
Change Log
33
==========
44

5+
v2.2.0
6+
======
7+
8+
* Implemented `Refactor renderstatic command using TyperCommand <https://github.com/bckohan/django-render-static/issues/137>`_
9+
* Implemented `Allow enum class writer to_string parameter to be the name of a property to return from toString() <https://github.com/bckohan/django-render-static/issues/132>`_
10+
511
v2.1.3
612
======
713

doc/source/commands.rst

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,9 @@ renderstatic
1414
Usage
1515
~~~~~
1616

17-
.. argparse::
18-
:module: render_static.management.commands.renderstatic
19-
:func: get_parser
20-
:prog: manage.py
17+
.. typer:: render_static.management.commands.renderstatic.Command:typer_app
18+
:prog: manage.py renderstatic
19+
:width: 90
2120

2221
Example
2322
~~~~~~~

doc/source/conf.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
from datetime import datetime
22
import sys
3+
import os
34
from pathlib import Path
45
sys.path.append(str(Path(__file__).parent.parent.parent))
56
import render_static
7+
import django
8+
9+
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'render_static.tests.settings')
10+
django.setup()
611

712
# Configuration file for the Sphinx documentation builder.
813
#
@@ -40,8 +45,8 @@
4045
'sphinx_rtd_theme',
4146
'sphinx.ext.autodoc',
4247
'sphinx.ext.viewcode',
43-
'sphinxarg.ext',
4448
'sphinx.ext.todo',
49+
'sphinxcontrib.typer'
4550
# 'sphinx_js'
4651
]
4752

pyproject.toml

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "django-render-static"
3-
version = "2.1.3"
3+
version = "2.2.0"
44
description = "Use Django's template engine to render static files at deployment or package time. Includes transpilers for extending Django's url reversal and enums to JavaScript."
55
authors = ["Brian Kohan <[email protected]>"]
66
license = "MIT"
@@ -48,6 +48,7 @@ Django = ">=3.2,<6.0"
4848
importlib-resources = { version = ">=1.3.0", python = "<3.9" }
4949
Jinja2 = { version = ">=2.9,<4.0", optional = true }
5050
PyYAML = { version = ">=5.1,<7.0", optional = true }
51+
django-typer = "^1.0.0"
5152

5253
[tool.poetry.group.dev.dependencies]
5354
django-enum = "^1.1.0"
@@ -65,11 +66,9 @@ isort = "^5.13.0"
6566
doc8 = "^1.1.0"
6667
pytest-cov = "^4.1.0"
6768
pylint = "^3.0.0"
68-
sphinx-argparse = "^0.4.0"
6969
deepdiff = "^6.7.0"
7070
safety = "^2.3.0"
7171
readme-renderer = ">=42"
72-
pygount = "^1.6"
7372
types-PyYAML = "^6.0"
7473
coverage = "^7.3.0"
7574
importlib-metadata = "^7.0.0"
@@ -78,6 +77,7 @@ python-dateutil = "^2.8.2"
7877
ipdb = "^0.13.13"
7978
black = "^23.12.0"
8079
aiohttp = "^3.9.1"
80+
sphinxcontrib-typer = "^0.1.11"
8181

8282
[build-system]
8383
requires = ["poetry-core>=1.0.0"]
@@ -111,25 +111,17 @@ warn_no_return = true
111111
exclude = "tests"
112112

113113
[tool.doc8]
114-
ignore-path = "doc/_build"
114+
ignore-path = "doc/build"
115115
max-line-length = 100
116116
sphinx = true
117117

118118
[tool.isort]
119-
# isort configuration:
120-
# https://github.com/timothycrosley/isort/wiki/isort-Settings
121-
include_trailing_comma = true
122-
use_parentheses = true
123-
# See https://github.com/timothycrosley/isort#multi-line-output-modes
124-
multi_line_output = 3
125-
default_section = "FIRSTPARTY"
126-
line_length = 79
127-
119+
profile = "black"
128120

129121
[tool.pylint]
130122
output-format = "colorized"
131123
max-line-length = 88 # PEP 8
132-
max-args = 6
124+
max-args = 7
133125

134126
[tool.pylint.'MESSAGES CONTROL']
135127
disable = "R0903, R0801"
@@ -156,7 +148,9 @@ addopts = [
156148

157149
[tool.coverage.run]
158150
omit = [
159-
"render_static/tests/app1/static_jinja2/batch_test/**/*"
151+
"render_static/tests/app1/static_jinja2/batch_test/**/*",
152+
"render_static/tests/app1/static_jinja2/**/*",
153+
"render_static/tests/app2/static_jinja2/**/*"
160154
]
161155

162156
[tool.black]

render_static/__init__.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,29 @@
66
/_/ |_|\___/_/ /_/\__,_/\___/_/ /____/\__/\__,_/\__/_/\___/
77
88
"""
9-
from datetime import datetime
10-
119
from .context import resolve_context
1210
from .resource import resource
1311
from .transpilers.defines_to_js import DefaultDefineTranspiler
1412
from .transpilers.enums_to_js import EnumClassWriter
1513
from .transpilers.urls_to_js import ClassURLWriter, SimpleURLWriter
1614

17-
VERSION = (2, 1, 3)
15+
VERSION = (2, 2, 0)
1816

1917
__title__ = "Django Render Static"
2018
__version__ = ".".join(str(i) for i in VERSION)
2119
__author__ = "Brian Kohan"
2220
__license__ = "MIT"
23-
__copyright__ = f"Copyright 2020-{datetime.now().year} Brian Kohan"
21+
__copyright__ = "Copyright 2020-2024 Brian Kohan"
22+
23+
24+
__all__ = [
25+
"resource",
26+
"resolve_context",
27+
"DefaultDefineTranspiler",
28+
"EnumClassWriter",
29+
"ClassURLWriter",
30+
"SimpleURLWriter",
31+
]
2432

2533

2634
class Jinja2DependencyNeeded: # pylint: disable=R0903

render_static/backends.py

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,16 @@
55
"""
66
from os.path import normpath
77
from pathlib import Path
8-
from typing import Dict, List, Tuple
8+
from typing import Dict, Generator, List, Tuple
99

1010
from django.apps import apps
1111
from django.apps.config import AppConfig
12-
from django.template.backends.django import (
13-
DjangoTemplates,
14-
TemplateDoesNotExist,
15-
)
12+
from django.template import Template
13+
from django.template.backends.django import DjangoTemplates, TemplateDoesNotExist
14+
1615
from render_static import Jinja2DependencyNeeded
16+
from render_static.loaders.django import SearchableLoader
17+
from render_static.loaders.jinja2 import SearchableLoader as SearchableJinja2Loader
1718
from render_static.loaders.jinja2 import StaticFileSystemBatchLoader
1819
from render_static.origin import AppOrigin
1920
from render_static.templatetags import render_static
@@ -94,12 +95,25 @@ def select_templates(
9495
f"Template selector {selector} did not resolve to any template " f"names."
9596
)
9697

98+
def search_templates(
99+
self, prefix: str, first_loader: bool = False
100+
) -> Generator[Template, None, None]:
101+
"""
102+
Resolves a partial template selector into a list of template names from the
103+
loaders configured on this backend engine.
104+
105+
:param prefix: The template prefix to search for
106+
:param first_loader: Search only the first loader
107+
:return: The list of resolved template names
108+
"""
109+
for loader in self.engine.template_loaders[: 1 if first_loader else None]:
110+
if isinstance(loader, SearchableLoader):
111+
yield from loader.search(prefix)
112+
97113

98114
try:
99-
from django.template.backends.jinja2 import ( # pylint: disable=C0412
100-
Jinja2,
101-
Template,
102-
)
115+
from django.template.backends.jinja2 import Jinja2 # pylint: disable=C0412
116+
from django.template.backends.jinja2 import Template as Jinja2Template
103117
from jinja2 import Environment
104118

105119
def default_env(**options):
@@ -159,7 +173,7 @@ def __init__(self, params: Dict) -> None:
159173

160174
super().__init__(params)
161175

162-
def get_template(self, template_name: str) -> Template:
176+
def get_template(self, template_name: str) -> Jinja2Template:
163177
"""
164178
We override the Jinja2 get_template method so we can monkey patch
165179
in the AppConfig of the origin if this template was from an app
@@ -183,7 +197,7 @@ def get_template(self, template_name: str) -> Template:
183197
def select_templates(
184198
self,
185199
selector: str,
186-
first_loader: bool = False,
200+
first_loader: bool = False, # pylint: disable=unused-argument
187201
first_preference: bool = False,
188202
) -> List[str]:
189203
"""
@@ -210,15 +224,30 @@ def select_templates(
210224
self.get_template(selector)
211225
template_names.add(selector)
212226

213-
if first_loader and template_names:
214-
return list(template_names)
215-
216227
if template_names:
217228
return list(template_names)
229+
218230
raise TemplateDoesNotExist(
219231
f"Template selector {selector} did not resolve to any "
220232
f"template names."
221233
)
222234

235+
def search_templates(
236+
self,
237+
prefix: str,
238+
first_loader: bool = False, # pylint: disable=unused-argument
239+
) -> Generator[Jinja2Template, None, None]:
240+
"""
241+
Resolves a partial template selector into a list of template names from the
242+
loaders configured on this backend engine.
243+
244+
:param prefix: The template prefix to search for
245+
:param first_loader: This is ignored for the Jinja2 engine because there is
246+
only one loader
247+
:return: The list of resolved template names
248+
"""
249+
if isinstance(self.env.loader, SearchableJinja2Loader):
250+
yield from self.env.loader.search(self.env, prefix)
251+
223252
except ImportError:
224253
StaticJinja2Templates = Jinja2DependencyNeeded # type: ignore

render_static/context.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from typing import Callable, Dict, Optional, Sequence, Tuple, Union
1212

1313
from django.utils.module_loading import import_string
14+
1415
from render_static.exceptions import InvalidContext
1516

1617
try:

0 commit comments

Comments
 (0)