Skip to content

Commit f402c7b

Browse files
committed
Move template components to bolt-elements
1 parent 654f955 commit f402c7b

File tree

18 files changed

+92
-45
lines changed

18 files changed

+92
-45
lines changed

bolt-elements/.gitignore

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Local development files
2+
/.env
3+
/.bolt
4+
*.sqlite3
5+
6+
# Publishing
7+
/dist
8+
9+
# Python
10+
/.venv
11+
__pycache__/
12+
*.py[cod]
13+
*$py.class
14+
15+
# OS files
16+
.DS_Store
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from .core import ElementsLoader
2+
3+
__all__ = ["ElementsLoader"]

bolt/jinja/components.py renamed to bolt-elements/bolt/elements/core.py

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -13,55 +13,55 @@
1313
from jinja2 import Environment
1414

1515

16-
class FileSystemTemplateComponentsLoader(FileSystemLoader):
16+
class ElementsLoader(FileSystemLoader):
1717
def get_source(self, environment: "Environment", template: str):
1818
contents, path, uptodate = super().get_source(environment, template)
1919

20-
# Clear components cache if it looks like a component changed
21-
# if os.path.splitext(path)[1] == ".html" and "components" in path and "template_components" in self.__dict__:
22-
# del self.__dict__["template_components"]
20+
# Clear elements cache if it looks like a element changed
21+
# if os.path.splitext(path)[1] == ".html" and "elements" in path and "template_elements" in self.__dict__:
22+
# del self.__dict__["template_elements"]
2323

24-
# If it's html, replace component tags
24+
# If it's html, replace element tags
2525
if os.path.splitext(path)[1] == ".html":
26-
self._template_components_environment = (
27-
environment # Save this so we can use it in template_components
26+
self._elements_environment = (
27+
environment # Save this so we can use it in template_elements
2828
)
29-
contents = self.replace_template_component_tags(contents)
29+
contents = self.replace_template_element_tags(contents)
3030

3131
return contents, path, uptodate
3232

3333
@cached_property
34-
def template_components(self):
35-
components = []
34+
def template_elements(self):
35+
elements = []
3636

3737
for searchpath in self.searchpath:
38-
components_dir = os.path.join(searchpath, "components")
39-
if os.path.isdir(components_dir):
40-
for root, dirs, files in os.walk(components_dir):
38+
elements_dir = os.path.join(searchpath, "elements")
39+
if os.path.isdir(elements_dir):
40+
for root, dirs, files in os.walk(elements_dir):
4141
for file in files:
4242
relative_path = os.path.relpath(
43-
os.path.join(root, file), components_dir
43+
os.path.join(root, file), elements_dir
4444
)
4545
# Replace slashes with .
46-
component_name = os.path.splitext(relative_path)[0].replace(
46+
element_name = os.path.splitext(relative_path)[0].replace(
4747
os.sep, "."
4848
)
49-
components.append(
49+
elements.append(
5050
{
5151
"path": relative_path,
52-
"html_name": component_name, # Uses . syntax
53-
"tag_name": component_name.replace(
52+
"html_name": element_name, # Uses . syntax
53+
"tag_name": element_name.replace(
5454
".", "_"
5555
), # Uses _ syntax
5656
}
5757
)
5858

59-
for component in components:
60-
component_name = component["html_name"]
61-
jinja_tag_name = component["tag_name"]
62-
component_relative_path = component["path"]
59+
for element in elements:
60+
element_name = element["html_name"]
61+
jinja_tag_name = element["tag_name"]
62+
element_relative_path = element["path"]
6363

64-
class ComponentExtension(Extension):
64+
class ElemenetExtension(Extension):
6565
def parse(self, parser):
6666
lineno = next(parser.stream).lineno
6767
args = [
@@ -93,27 +93,27 @@ def _render(self, context, **kwargs):
9393
rendered = template.render({**context, **kwargs})
9494

9595
if settings.DEBUG:
96-
# Add an HTML comment in dev to help identify components in output
96+
# Add an HTML comment in dev to help identify elements in output
9797
return f"<!-- <{self.html_name}>\n{self.source_ref} -->\n{rendered}\n<!-- </{self.html_name}> -->"
9898
else:
9999
return rendered
100100

101101
# Create a new class on the fly
102-
NamedComponentExtension = type(
103-
f"HTMLComponent.{component_name}",
104-
(ComponentExtension,),
102+
NamedElementExtension = type(
103+
f"BoltElement.{element_name}",
104+
(ElemenetExtension,),
105105
{
106106
"tags": {jinja_tag_name, f"end{jinja_tag_name}"},
107-
"template_name": f"components/{component_relative_path}",
107+
"template_name": f"elements/{element_relative_path}",
108108
"jinja_tag_name": jinja_tag_name,
109-
"html_name": component_name,
109+
"html_name": element_name,
110110
},
111111
)
112-
self._template_components_environment.add_extension(NamedComponentExtension)
112+
self._elements_environment.add_extension(NamedElementExtension)
113113

114-
return components
114+
return elements
115115

116-
def replace_template_component_tags(self, contents: str):
116+
def replace_template_element_tags(self, contents: str):
117117
def replace_quoted_braces(s) -> str:
118118
"""
119119
We're converting to tag syntax, but it's very natural to write
@@ -122,19 +122,19 @@ def replace_quoted_braces(s) -> str:
122122
"""
123123
return re.sub(r"(?<=\"{{)(.+)(?=}}\")", r"\1", s)
124124

125-
for component in self.template_components:
126-
component_name = component["html_name"]
127-
jinja_tag_name = component["tag_name"]
125+
for element in self.template_elements:
126+
element_name = element["html_name"]
127+
jinja_tag_name = element["tag_name"]
128128

129129
closing_pattern = re.compile(
130-
rf"<{component_name}(\s+[\s\S]*?)?>([\s\S]*?)</{component_name}>"
130+
rf"<{element_name}(\s+[\s\S]*?)?>([\s\S]*?)</{element_name}>"
131131
)
132-
self_closing_pattern = re.compile(rf"<{component_name}(\s+[\s\S]*?)?/>")
132+
self_closing_pattern = re.compile(rf"<{element_name}(\s+[\s\S]*?)?/>")
133133

134134
def closing_cb(match: re.Match) -> str:
135-
if f"<{component_name}" in match.group(2):
135+
if f"<{element_name}" in match.group(2):
136136
raise ValueError(
137-
f"Component {component_name} cannot be nested in itself"
137+
f"Element {element_name} cannot be nested in itself"
138138
)
139139

140140
attrs_str = match.group(1) or ""

bolt-elements/pyproject.toml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
[tool.poetry]
2+
name = "bolt-elements"
3+
packages = [
4+
{ include = "bolt" },
5+
]
6+
7+
version = "0.1.0"
8+
description = ""
9+
authors = ["Dave Gaeddert <[email protected]>"]
10+
11+
[tool.poetry.dependencies]
12+
python = "^3.8"
13+
14+
[tool.poetry.dev-dependencies]
15+
pytest = "^7.1.2"
16+
ipdb = "^0.13.9"
17+
isort = "^5.10.1"
18+
black = "^23.1.0"
19+
pytest-django = "^4.5.2"
20+
21+
[build-system]
22+
requires = ["poetry-core>=1.0.0"]
23+
build-backend = "poetry.core.masonry.api"
6 KB
Binary file not shown.

0 commit comments

Comments
 (0)