platzky 0.2.4__py3-none-any.whl → 0.2.6__py3-none-any.whl

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.
platzky/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
+ from .platzky import Engine as Engine
1
2
  from .platzky import create_app_from_config as create_app_from_config
2
3
  from .platzky import create_engine as create_engine
3
- from .platzky import Engine as Engine
platzky/blog/blog.py CHANGED
@@ -35,9 +35,7 @@ def create_blog_blueprint(db, blog_prefix: str, locale_func):
35
35
  @blog.route("/feed", methods=["GET"])
36
36
  def get_feed():
37
37
  lang = locale_func()
38
- response = make_response(
39
- render_template("feed.xml", posts=db.get_all_posts(lang))
40
- )
38
+ response = make_response(render_template("feed.xml", posts=db.get_all_posts(lang)))
41
39
  response.headers["Content-Type"] = "application/xml"
42
40
  return response
43
41
 
platzky/config.py CHANGED
@@ -1,7 +1,8 @@
1
1
  import sys
2
2
  import typing as t
3
+
3
4
  import yaml
4
- from pydantic import ConfigDict, BaseModel, Field
5
+ from pydantic import BaseModel, ConfigDict, Field
5
6
 
6
7
  from .db.db import DBConfig
7
8
  from .db.db_loader import get_db_module
platzky/db/db.py CHANGED
@@ -1,10 +1,10 @@
1
+ from abc import ABC, abstractmethod
1
2
  from functools import partial
2
3
  from typing import Any, Callable
3
4
 
4
5
  from pydantic import BaseModel, Field
5
6
 
6
- from abc import abstractmethod, ABC
7
- from ..models import MenuItem, Post, Page, Color
7
+ from ..models import Color, MenuItem, Page, Post
8
8
 
9
9
 
10
10
  class DB(ABC):
@@ -14,7 +14,7 @@ class DB(ABC):
14
14
 
15
15
  def __init_subclass__(cls, *args, **kw):
16
16
  """Check that all methods defined in the subclass exist in the superclasses.
17
- This is to prevent subclasses from adding new methods to the DB object.
17
+ This is to prevent subclasses from splitting up DB interface.
18
18
  """
19
19
  super().__init_subclass__(*args, **kw)
20
20
  for name in cls.__dict__:
@@ -28,7 +28,7 @@ class DB(ABC):
28
28
  f"Method {name} defined in {cls.__name__} does not exist in superclasses"
29
29
  )
30
30
 
31
- def extend(self, function_name: str, function: Callable) -> None:
31
+ def extend(self, function_name: str, function: Callable[..., Any]) -> None:
32
32
  """
33
33
  Add a function to the DB object. The function must take the DB object as first parameter.
34
34
 
@@ -37,9 +37,7 @@ class DB(ABC):
37
37
  function (Callable): The function to add to the DB object.
38
38
  """
39
39
  if not callable(function):
40
- raise ValueError(
41
- f"The provided func for '{function_name}' is not callable."
42
- )
40
+ raise ValueError(f"The provided func for '{function_name}' is not callable.")
43
41
  try:
44
42
  bound_function = partial(function, self)
45
43
  setattr(self, function_name, bound_function)
@@ -71,27 +69,29 @@ class DB(ABC):
71
69
  pass
72
70
 
73
71
  @abstractmethod
74
- def get_logo_url(self) -> str:
72
+ def get_logo_url(
73
+ self,
74
+ ) -> str: # TODO provide alternative text along with the URL of logo
75
75
  pass
76
76
 
77
77
  @abstractmethod
78
- def get_primary_color(self) -> Color:
78
+ def get_favicon_url(self) -> str:
79
79
  pass
80
80
 
81
81
  @abstractmethod
82
- def get_secondary_color(self) -> Color:
82
+ def get_primary_color(self) -> Color:
83
83
  pass
84
84
 
85
85
  @abstractmethod
86
- def get_plugins_data(self) -> list:
86
+ def get_secondary_color(self) -> Color:
87
87
  pass
88
88
 
89
89
  @abstractmethod
90
- def get_font(self) -> str:
90
+ def get_plugins_data(self) -> list[Any]:
91
91
  pass
92
92
 
93
93
  @abstractmethod
94
- def get_site_content(self) -> str:
94
+ def get_font(self) -> str:
95
95
  pass
96
96
 
97
97
 
@@ -22,9 +22,7 @@ def db_from_config(config: GoogleJsonDbConfig):
22
22
 
23
23
  def get_db(config):
24
24
  google_json_db_config = GoogleJsonDbConfig.model_validate(config)
25
- return GoogleJsonDb(
26
- google_json_db_config.bucket_name, google_json_db_config.source_blob_name
27
- )
25
+ return GoogleJsonDb(google_json_db_config.bucket_name, google_json_db_config.source_blob_name)
28
26
 
29
27
 
30
28
  def get_blob(bucket_name, source_blob_name):
platzky/db/graph_ql_db.py CHANGED
@@ -5,8 +5,8 @@ from gql import Client, gql
5
5
  from gql.transport.aiohttp import AIOHTTPTransport
6
6
  from pydantic import Field
7
7
 
8
- from .db import DB, DBConfig
9
8
  from ..models import Color, Post
9
+ from .db import DB, DBConfig
10
10
 
11
11
 
12
12
  def db_config_type():
@@ -58,9 +58,7 @@ class GraphQL(DB):
58
58
  self.module_name = "graph_ql_db"
59
59
  self.db_name = "GraphQLDb"
60
60
  full_token = "bearer " + token
61
- transport = AIOHTTPTransport(
62
- url=endpoint, headers={"Authorization": full_token}
63
- )
61
+ transport = AIOHTTPTransport(url=endpoint, headers={"Authorization": full_token})
64
62
  self.client = Client(transport=transport)
65
63
  super().__init__()
66
64
 
@@ -97,9 +95,7 @@ class GraphQL(DB):
97
95
  }
98
96
  """
99
97
  )
100
- raw_ql_posts = self.client.execute(all_posts, variable_values={"lang": lang})[
101
- "posts"
102
- ]
98
+ raw_ql_posts = self.client.execute(all_posts, variable_values={"lang": lang})["posts"]
103
99
 
104
100
  return [Post.model_validate(_standarize_post(post)) for post in raw_ql_posts]
105
101
 
@@ -127,7 +123,7 @@ class GraphQL(DB):
127
123
  slug
128
124
  author {
129
125
  name
130
- }
126
+ }
131
127
  contentInRichText {
132
128
  markdown
133
129
  html
@@ -191,9 +187,7 @@ class GraphQL(DB):
191
187
  }
192
188
  """
193
189
  )
194
- return self.client.execute(post, variable_values={"tag": tag, "lang": lang})[
195
- "posts"
196
- ]
190
+ return self.client.execute(post, variable_values={"tag": tag, "lang": lang})["posts"]
197
191
 
198
192
  def add_comment(self, author_name, comment, post_slug):
199
193
  add_comment = gql(
@@ -224,7 +218,39 @@ class GraphQL(DB):
224
218
  return str("")
225
219
 
226
220
  def get_logo_url(self):
227
- return ""
221
+ logo = gql(
222
+ """
223
+ query myquery {
224
+ logos(stage: PUBLISHED) {
225
+ logo {
226
+ alternateText
227
+ image {
228
+ url
229
+ }
230
+ }
231
+ }
232
+ }
233
+ """
234
+ )
235
+ try:
236
+ return self.client.execute(logo)["logos"][0]["logo"]["image"]["url"]
237
+ except IndexError:
238
+ return ""
239
+
240
+ def get_favicon_url(self):
241
+ favicon = gql(
242
+ """
243
+ query myquery {
244
+ favicons(stage: PUBLISHED) {
245
+ favicon {
246
+ url
247
+ }
248
+ }
249
+ }
250
+ """
251
+ )
252
+
253
+ return self.client.execute(favicon)["favicons"][0]["favicon"]["url"]
228
254
 
229
255
  def get_primary_color(self) -> Color:
230
256
  return Color()
@@ -232,8 +258,15 @@ class GraphQL(DB):
232
258
  def get_secondary_color(self):
233
259
  return Color()
234
260
 
235
- def get_site_content(self):
236
- return ""
237
-
238
261
  def get_plugins_data(self):
239
- return []
262
+ plugins_data = gql(
263
+ """
264
+ query MyQuery {
265
+ pluginConfigs(stage: PUBLISHED) {
266
+ name
267
+ config
268
+ }
269
+ }
270
+ """
271
+ )
272
+ return self.client.execute(plugins_data)["pluginConfigs"]
platzky/db/json_db.py CHANGED
@@ -3,8 +3,8 @@ from typing import Any, Dict
3
3
 
4
4
  from pydantic import Field
5
5
 
6
- from .db import DB, DBConfig
7
6
  from ..models import MenuItem, Post
7
+ from .db import DB, DBConfig
8
8
 
9
9
 
10
10
  def db_config_type():
@@ -34,13 +34,13 @@ class Json(DB):
34
34
  def get_all_posts(self, lang):
35
35
  return [
36
36
  Post.model_validate(post)
37
- for post in self.get_site_content().get("posts", ())
37
+ for post in self._get_site_content().get("posts", ())
38
38
  if post["language"] == lang
39
39
  ]
40
40
 
41
41
  def get_post(self, slug: str) -> Post:
42
42
  """Returns a post matching the given slug."""
43
- all_posts = self.get_site_content().get("posts")
43
+ all_posts = self._get_site_content().get("posts")
44
44
  if all_posts is None:
45
45
  raise ValueError("Posts data is missing")
46
46
  wanted_post = next((post for post in all_posts if post["slug"] == slug), None)
@@ -51,40 +51,39 @@ class Json(DB):
51
51
  # TODO: add test for non-existing page
52
52
  def get_page(self, slug):
53
53
  list_of_pages = (
54
- page
55
- for page in self.get_site_content().get("pages")
56
- if page["slug"] == slug
54
+ page for page in self._get_site_content().get("pages") if page["slug"] == slug
57
55
  )
58
56
  page = Post.model_validate(next(list_of_pages))
59
57
  return page
60
58
 
61
59
  def get_menu_items(self) -> list[MenuItem]:
62
- menu_items_raw = self.get_site_content().get("menu_items", [])
60
+ menu_items_raw = self._get_site_content().get("menu_items", [])
63
61
  menu_items_list = [MenuItem.model_validate(x) for x in menu_items_raw]
64
62
  return menu_items_list
65
63
 
66
64
  def get_posts_by_tag(self, tag, lang):
67
- return (
68
- post for post in self.get_site_content()["posts"] if tag in post["tags"]
69
- )
65
+ return (post for post in self._get_site_content()["posts"] if tag in post["tags"])
70
66
 
71
- def get_site_content(self):
67
+ def _get_site_content(self):
72
68
  content = self.data.get("site_content")
73
69
  if content is None:
74
70
  raise Exception("Content should not be None")
75
71
  return content
76
72
 
77
73
  def get_logo_url(self):
78
- return self.get_site_content().get("logo_url", "")
74
+ return self._get_site_content().get("logo_url", "")
75
+
76
+ def get_favicon_url(self):
77
+ return self._get_site_content().get("favicon_url", "")
79
78
 
80
79
  def get_font(self) -> str:
81
- return self.get_site_content().get("font", "")
80
+ return self._get_site_content().get("font", "")
82
81
 
83
82
  def get_primary_color(self):
84
- return self.get_site_content().get("primary_color", "white")
83
+ return self._get_site_content().get("primary_color", "white")
85
84
 
86
85
  def get_secondary_color(self):
87
- return self.get_site_content().get("secondary_color", "navy")
86
+ return self._get_site_content().get("secondary_color", "navy")
88
87
 
89
88
  def add_comment(self, author_name, comment, post_slug):
90
89
  comment = {
@@ -95,10 +94,10 @@ class Json(DB):
95
94
 
96
95
  post_index = next(
97
96
  i
98
- for i in range(len(self.get_site_content()["posts"]))
99
- if self.get_site_content()["posts"][i]["slug"] == post_slug
97
+ for i in range(len(self._get_site_content()["posts"]))
98
+ if self._get_site_content()["posts"][i]["slug"] == post_slug
100
99
  )
101
- self.get_site_content()["posts"][post_index]["comments"].append(comment)
100
+ self._get_site_content()["posts"][post_index]["comments"].append(comment)
102
101
 
103
102
  def get_plugins_data(self):
104
103
  return self.data.get("plugins", [])
platzky/models.py CHANGED
@@ -1,6 +1,7 @@
1
- from pydantic import BaseModel
2
1
  import datetime
2
+
3
3
  import humanize
4
+ from pydantic import BaseModel
4
5
 
5
6
 
6
7
  class Image(BaseModel):
@@ -40,7 +41,7 @@ class Post(BaseModel):
40
41
  def __lt__(self, other):
41
42
  if isinstance(other, Post):
42
43
  return self.date < other.date
43
- return NotImplemented
44
+ raise NotImplementedError("Posts can only be compared with other posts")
44
45
 
45
46
 
46
47
  Page = Post
platzky/platzky.py CHANGED
@@ -87,12 +87,6 @@ def create_engine(config: Config, db) -> Engine:
87
87
  session["language"] = lang
88
88
  return redirect(request.referrer)
89
89
 
90
- @app.route("/logo", methods=["GET"])
91
- def logo():
92
- return redirect(
93
- "https://www.problematy.pl/wp-content/uploads/2023/08/kolor_poziom.png"
94
- )
95
-
96
90
  def url_link(x: str) -> str:
97
91
  return urllib.parse.quote(x, safe="")
98
92
 
@@ -108,6 +102,7 @@ def create_engine(config: Config, db) -> Engine:
108
102
  "url_link": url_link,
109
103
  "menu_items": app.db.get_menu_items(),
110
104
  "logo_url": app.db.get_logo_url(),
105
+ "favicon_url": app.db.get_favicon_url(),
111
106
  "font": app.db.get_font(),
112
107
  "primary_color": app.db.get_primary_color(),
113
108
  "secondary_color": app.db.get_secondary_color(),
@@ -27,8 +27,7 @@ def graph_ql_db_get_redirections(self):
27
27
  """
28
28
  )
29
29
  return {
30
- x["source"]: x["destination"]
31
- for x in self.client.execute(redirections)["redirections"]
30
+ x["source"]: x["destination"] for x in self.client.execute(redirections)["redirections"]
32
31
  }
33
32
 
34
33
 
@@ -37,11 +36,8 @@ class Redirection(BaseModel):
37
36
  destiny: str
38
37
 
39
38
 
40
- def parse_redirections(config: dict) -> list[Redirection]:
41
- return [
42
- Redirection(source=source, destiny=destiny)
43
- for source, destiny in config.items()
44
- ]
39
+ def parse_redirections(config: dict[str, str]) -> list[Redirection]:
40
+ return [Redirection(source=source, destiny=destiny) for source, destiny in config.items()]
45
41
 
46
42
 
47
43
  def setup_routes(app, redirections):
@@ -62,7 +58,7 @@ def redirect_with_name(destiny, code, name):
62
58
  return named_redirect
63
59
 
64
60
 
65
- def process(app, config: dict) -> object:
61
+ def process(app, config: dict[str, str]) -> object:
66
62
  redirections = parse_redirections(config)
67
63
  setup_routes(app, redirections)
68
64
  return app
@@ -3,12 +3,8 @@ import smtplib
3
3
  from pydantic import BaseModel, Field
4
4
 
5
5
 
6
- def send_mail(
7
- sender_email, password, smtp_server, port, receiver_email, subject, message
8
- ):
9
- full_message = (
10
- f"From: {sender_email}\nTo: {receiver_email}\nSubject: {subject}\n\n{message}"
11
- )
6
+ def send_mail(sender_email, password, smtp_server, port, receiver_email, subject, message):
7
+ full_message = f"From: {sender_email}\nTo: {receiver_email}\nSubject: {subject}\n\n{message}"
12
8
  server = smtplib.SMTP_SSL(smtp_server, port)
13
9
  server.ehlo()
14
10
  server.login(sender_email, password)
platzky/seo/seo.py CHANGED
@@ -1,6 +1,7 @@
1
1
  import typing as t
2
2
  import urllib.parse
3
3
  from os.path import dirname
4
+
4
5
  from flask import Blueprint, current_app, make_response, render_template, request
5
6
 
6
7
 
@@ -14,9 +15,7 @@ def create_seo_blueprint(db, config: dict[str, t.Any]):
14
15
 
15
16
  @seo.route("/robots.txt")
16
17
  def robots():
17
- robots_response = render_template(
18
- "robots.txt", domain=request.host, mimetype="text/plain"
19
- )
18
+ robots_response = render_template("robots.txt", domain=request.host, mimetype="text/plain")
20
19
  response = make_response(robots_response)
21
20
  response.headers["Content-Type"] = "text/plain"
22
21
  return response
@@ -45,12 +44,8 @@ def create_seo_blueprint(db, config: dict[str, t.Any]):
45
44
  static_urls = list()
46
45
  for rule in current_app.url_map.iter_rules():
47
46
  if not str(rule).startswith("/admin") and not str(rule).startswith("/user"):
48
- if (
49
- rule.methods is not None
50
- and "GET" in rule.methods
51
- and len(rule.arguments) == 0
52
- ):
53
- url = {"loc": f"{host_base}{str(rule)}"}
47
+ if rule.methods is not None and "GET" in rule.methods and len(rule.arguments) == 0:
48
+ url = {"loc": f"{host_base}{rule!s}"}
54
49
  static_urls.append(url)
55
50
 
56
51
  # Dynamic routes with dynamic content
@@ -11,7 +11,7 @@
11
11
  <link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.Default.css" />
12
12
  <link rel="stylesheet" href="{{ font.url }}">
13
13
  {% endblock %}
14
- <title>{% block title %} {{app_name}} {% endblock %}</title>
14
+ <title>{% block title %}{{app_name}}{% endblock %}</title>
15
15
  <meta name="description" content=" {% block description %} {% endblock %} ">
16
16
  <style>
17
17
  html,
@@ -98,13 +98,7 @@
98
98
  <i class="fas fa-sliders-h"></i>
99
99
  </button>
100
100
  {% endif %}
101
- <a class="navbar-brand" href="/">
102
- {% if logo_url %}
103
- <img src="{{ logo_url }}" class="logo" >
104
- {% else %}
105
- {{ _(app_name) }}
106
- {% endif %}
107
- </a>
101
+ <a class="navbar-brand" href="/">{% if logo_url %}<img src="{{ logo_url }}" class="logo">{% else %}{{_(app_name)}}{% endif %}</a>
108
102
  <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"
109
103
  aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
110
104
  <i class="fas fa-bars"></i>
@@ -2,8 +2,7 @@
2
2
  <meta charset="utf-8">
3
3
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
4
4
  <link rel="alternate" hreflang="{{ current_language }}" href="{{ request.base_url }}"/>
5
- <link rel="shortcut icon" href="{{ url_for('static', filename='favicon.png') }}" type="image/x-icon">
6
-
5
+ <link rel="shortcut icon" href="{{ favicon_url }}" type="image/x-icon">
7
6
  <link rel="canonical" href="{{ request.base_url }}"/>
8
7
 
9
8
  <!-- Bootstrap CSS -->
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: platzky
3
- Version: 0.2.4
3
+ Version: 0.2.6
4
4
  Summary: Not only blog engine
5
5
  License: MIT
6
6
  Requires-Python: >=3.10,<4.0
@@ -1,35 +1,35 @@
1
- platzky/__init__.py,sha256=kzi_UifSAOPFmTY0uyPbKDdJHu0MtUKKdev9NVFjJfA,160
1
+ platzky/__init__.py,sha256=cEAqMh-FU8mbfCzFQaWMhKX4lDjoxDiQ9S4hTNsSOMg,160
2
2
  platzky/blog/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- platzky/blog/blog.py,sha256=R1Otio2Ix5d02CT9mtYZ_kKMbKJArsuJdJLjCfc4Qxg,3031
3
+ platzky/blog/blog.py,sha256=caBUewnwd6QrJDv20m4JDfDDjiVu7hM0AJnoTyCdwM4,3009
4
4
  platzky/blog/comment_form.py,sha256=4lkNJ_S_2DZmJBbz-NPDqahvy2Zz5AGNH2spFeGIop4,513
5
- platzky/config.py,sha256=XL4oASEZQtc6iNfiLkAJaHp9fUX3A53DEpCXznYyOrQ,2203
5
+ platzky/config.py,sha256=WStlXnvoa9sCGPqKW6FuN1GIcp_MIV08FjPME9TD7x4,2204
6
6
  platzky/db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- platzky/db/db.py,sha256=0smTAiP4MDKOF_t60-KVKs1h-oTGydrWvAgPavFjDDo,2660
7
+ platzky/db/db.py,sha256=SayR69Nxs9aGMfYumLyLIH0LVLVmwiQt9WAICq59gng,2709
8
8
  platzky/db/db_loader.py,sha256=CuEiXxhIa4bFMm0vi7ugzm7j3WycilGRKCU6smgIImE,905
9
- platzky/db/google_json_db.py,sha256=65NKwbalGA1FfQz724dAK_3PS9e-MeLUb7WZkVU6nBo,1513
10
- platzky/db/graph_ql_db.py,sha256=jAfz9WK7tYjTFFwurR0piuW_M79vK7IbV9AbQpNLnOo,6444
11
- platzky/db/json_db.py,sha256=lbDZiEDWZebd9sssF8td1HKod4o7CdIvHu2fcPFgs7U,3184
9
+ platzky/db/google_json_db.py,sha256=IgfCER7oJ4I_WD4TjhvFFL0voUj6EfeoaVWdoEcHTdA,1499
10
+ platzky/db/graph_ql_db.py,sha256=aIqRxPV-Txr5MY2-qVALby9fHyIvWgvSz2t24M9SNRI,7343
11
+ platzky/db/json_db.py,sha256=AtZoTcM6S2ZHo19rxkCi4h4E4INGieZ4W6H5O2iormA,3246
12
12
  platzky/db/json_file_db.py,sha256=UQ8TadELmqOzj_tgNfmzhtCkDkMAgcB9vaUy0GQXUY4,1010
13
- platzky/models.py,sha256=8ATKVrGRtQ1JV_z7IdYbx1cxBU7ISoXjTmNxTlxok-k,1450
14
- platzky/platzky.py,sha256=3KljmS4lTB1yscOSDoavZ2yFwHcdQ_K8Om8qlJBA73U,4649
13
+ platzky/models.py,sha256=-IIlyeLzACeTUpzuzvzJYxtT57E6wRiERoRgXJYMMtY,1502
14
+ platzky/platzky.py,sha256=-01WVpSxZz96NoilFB_2ispHLRrquCsMR9p3F7Tyf1s,4525
15
15
  platzky/plugin_loader.py,sha256=KYLDSEd_hseAgBuSbikerU_IFx-YmcYK5UwYw7kla2E,1106
16
16
  platzky/plugins/google-tag-manager/entrypoint.py,sha256=yY5UqFvSdj3tt2upwNS8JkTrKcrbwlaaE2XQ6sRiGLc,1011
17
- platzky/plugins/redirections/entrypoint.py,sha256=HZsZBr8f7UkdYW0AJfUuG1vdEvWcpjoWMfm3cUXVHD4,1565
18
- platzky/plugins/sendmail/entrypoint.py,sha256=ioVUh_YgxyA4DnHRBUbg9ze08EKX_iCbFhbK145icjE,1237
19
- platzky/seo/seo.py,sha256=5Rl-ZQ3DWw65x0V7mpIkmUfxXTb6i5PEbIrAX7pzV70,2710
17
+ platzky/plugins/redirections/entrypoint.py,sha256=yoqHsRLqRALdICs5_UMSREkfEo1Lbsjj9tqEA7dsseg,1555
18
+ platzky/plugins/sendmail/entrypoint.py,sha256=16GszfLaYhVUSuCdL4SPVKYN9-mONp-hK5ZWSiLluPo,1215
19
+ platzky/seo/seo.py,sha256=l59Ol56YfJB4bk4IzypYVASYCjLrjJqXRXMIcc4EUZY,2606
20
20
  platzky/static/blog.css,sha256=jF-8ykgpbPp58SCUqygBhCm4o7ggULojbxpnk6Jbx3c,7895
21
21
  platzky/templates/404.html,sha256=EheoLSWylOscLH8FmcMA4c6Jw14i5HkSvE_GXzGIrUo,78
22
- platzky/templates/base.html,sha256=XpY5GOsuXiroLzSo0sQqIMIGSGx5AyhdHQOK9ioxVXM,4988
22
+ platzky/templates/base.html,sha256=6ZunlASdsCv9n0PWZBznQrRBKsnmWYRPweX9Ml-EhCo,4931
23
23
  platzky/templates/blog.html,sha256=aPl-DzLX85bHv7tN8UjlABR086PUJ9IGlGbIBioFHGA,1281
24
24
  platzky/templates/body_meta.html,sha256=au61f54ZK8SdovSpoUROjyy5fi3K6n_N5P-QjW7S5-8,526
25
25
  platzky/templates/feed.xml,sha256=I9cz7vnxx-TfbLIDHFXfrC3S2Nt9B6PrWf3u4zSIi78,863
26
- platzky/templates/head_meta.html,sha256=AEUPScGOBOQl6OIZ6NhcY0Sh3A17T8KHwJ3hmI4AYuA,1380
26
+ platzky/templates/head_meta.html,sha256=tpwNeaxQwlM6Gnmz1v2fboxqbm0qYPDP-fYeeTSKPKI,1349
27
27
  platzky/templates/home.html,sha256=nqoVVvaNBd1ceun6KOZB_eY20xf4Mjtu8LTl1Q_Ap6c,3900
28
28
  platzky/templates/page.html,sha256=8tS9K5dXfCKItvOlpEuURnWohnWjs6WW6zeBJFLARUM,647
29
29
  platzky/templates/post.html,sha256=GSgjIZsOQKtNx3cEbquSjZ5L4whPnG6MzRyoq9k4B8Q,1906
30
30
  platzky/templates/robots.txt,sha256=2_j2tiYtYJnzZUrANiX9pvBxyw5Dp27fR_co18BPEJ0,116
31
31
  platzky/templates/sitemap.xml,sha256=iIJZ91_B5ZuNLCHsRtsGKZlBAXojOTP8kffqKLacgvs,578
32
32
  platzky/www_handler.py,sha256=pF6Rmvem1sdVqHD7z3RLrDuG-CwAqfGCti50_NPsB2w,725
33
- platzky-0.2.4.dist-info/METADATA,sha256=0OfFP9xpFYKvGbAnNVJ9qsKyq5D6l2FvsnsPxEzr3GE,1591
34
- platzky-0.2.4.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
35
- platzky-0.2.4.dist-info/RECORD,,
33
+ platzky-0.2.6.dist-info/METADATA,sha256=maIpLxUQ2j_GtjB1KTkY0LC4obJoildhpkrWZTNVCag,1591
34
+ platzky-0.2.6.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
35
+ platzky-0.2.6.dist-info/RECORD,,