create-pywire-app 0.1.2__py3-none-any.whl → 0.1.4__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.
Files changed (65) hide show
  1. create_pywire_app/__init__.py +8 -0
  2. create_pywire_app/_version.py +34 -0
  3. create_pywire_app/main.py +125 -4
  4. create_pywire_app/templates/blog/explicit/about.wire +2 -1
  5. create_pywire_app/templates/blog/explicit/blog-posts.wire +5 -11
  6. create_pywire_app/templates/blog/explicit/home.wire +5 -2
  7. create_pywire_app/templates/blog/path-based/index.wire +5 -2
  8. create_pywire_app/templates/blog/path-based/posts_index.wire +5 -2
  9. create_pywire_app/templates/blog/path-based/posts_slug.wire +3 -9
  10. create_pywire_app/templates/common/__error__.wire +1 -2
  11. create_pywire_app/templates/counter/explicit/home.wire +6 -4
  12. create_pywire_app/templates/counter/path-based/index.wire +6 -4
  13. create_pywire_app/templates/saas/explicit/auth-layout.wire.j2 +2 -1
  14. create_pywire_app/templates/saas/explicit/dashboard-pages.wire +2 -1
  15. create_pywire_app/templates/saas/explicit/landing.wire +2 -1
  16. create_pywire_app/templates/saas/explicit/login.wire +2 -1
  17. create_pywire_app/templates/saas/explicit/pricing.wire +1 -1
  18. create_pywire_app/templates/saas/path-based/dashboard__layout__.wire.j2 +2 -1
  19. create_pywire_app/templates/saas/path-based/dashboard_index.wire +0 -1
  20. create_pywire_app/templates/saas/path-based/dashboard_settings.wire +0 -1
  21. create_pywire_app/templates/saas/path-based/index.wire +0 -1
  22. create_pywire_app/templates/saas/path-based/login.wire +0 -1
  23. create_pywire_app/templates/saas/path-based/pricing.wire +2 -1
  24. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/blog/explicit/about.wire +2 -1
  25. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/blog/explicit/blog-posts.wire +5 -11
  26. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/blog/explicit/home.wire +5 -2
  27. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/blog/path-based/index.wire +5 -2
  28. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/blog/path-based/posts_index.wire +5 -2
  29. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/blog/path-based/posts_slug.wire +3 -9
  30. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/common/__error__.wire +1 -2
  31. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/counter/explicit/home.wire +6 -4
  32. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/counter/path-based/index.wire +6 -4
  33. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/saas/explicit/auth-layout.wire.j2 +2 -1
  34. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/saas/explicit/dashboard-pages.wire +2 -1
  35. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/saas/explicit/landing.wire +2 -1
  36. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/saas/explicit/login.wire +2 -1
  37. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/saas/explicit/pricing.wire +1 -1
  38. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/saas/path-based/dashboard__layout__.wire.j2 +2 -1
  39. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/saas/path-based/dashboard_index.wire +0 -1
  40. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/saas/path-based/dashboard_settings.wire +0 -1
  41. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/saas/path-based/index.wire +0 -1
  42. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/saas/path-based/login.wire +0 -1
  43. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/saas/path-based/pricing.wire +2 -1
  44. {create_pywire_app-0.1.2.dist-info → create_pywire_app-0.1.4.dist-info}/METADATA +1 -1
  45. create_pywire_app-0.1.4.dist-info/RECORD +80 -0
  46. create_pywire_app-0.1.2.dist-info/RECORD +0 -79
  47. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/blog/explicit/layout.wire.j2 +0 -0
  48. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/blog/path-based/__layout__.wire.j2 +0 -0
  49. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/blog/path-based/posts__layout__.wire.j2 +0 -0
  50. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/common/.gitignore +0 -0
  51. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/common/Dockerfile +0 -0
  52. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/common/README.md.j2 +0 -0
  53. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/common/extensions.json +0 -0
  54. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/common/main-explicit.py.j2 +0 -0
  55. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/common/main-path.py.j2 +0 -0
  56. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/common/pyproject.toml.j2 +0 -0
  57. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/common/render.yaml.j2 +0 -0
  58. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/counter/explicit/layout.wire.j2 +0 -0
  59. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/counter/path-based/__layout__.wire.j2 +0 -0
  60. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/saas/explicit/public-layout.wire.j2 +0 -0
  61. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/saas/models.py +0 -0
  62. {create_pywire_app-0.1.2.data → create_pywire_app-0.1.4.data}/data/share/create_pywire_app/templates/saas/path-based/__layout__.wire.j2 +0 -0
  63. {create_pywire_app-0.1.2.dist-info → create_pywire_app-0.1.4.dist-info}/WHEEL +0 -0
  64. {create_pywire_app-0.1.2.dist-info → create_pywire_app-0.1.4.dist-info}/entry_points.txt +0 -0
  65. {create_pywire_app-0.1.2.dist-info → create_pywire_app-0.1.4.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,8 @@
1
+ try:
2
+ from ._version import __version__
3
+ except ImportError:
4
+ from importlib.metadata import version, PackageNotFoundError
5
+ try:
6
+ __version__ = version("create-pywire-app")
7
+ except PackageNotFoundError:
8
+ __version__ = "unknown"
@@ -0,0 +1,34 @@
1
+ # file generated by setuptools-scm
2
+ # don't change, don't track in version control
3
+
4
+ __all__ = [
5
+ "__version__",
6
+ "__version_tuple__",
7
+ "version",
8
+ "version_tuple",
9
+ "__commit_id__",
10
+ "commit_id",
11
+ ]
12
+
13
+ TYPE_CHECKING = False
14
+ if TYPE_CHECKING:
15
+ from typing import Tuple
16
+ from typing import Union
17
+
18
+ VERSION_TUPLE = Tuple[Union[int, str], ...]
19
+ COMMIT_ID = Union[str, None]
20
+ else:
21
+ VERSION_TUPLE = object
22
+ COMMIT_ID = object
23
+
24
+ version: str
25
+ __version__: str
26
+ __version_tuple__: VERSION_TUPLE
27
+ version_tuple: VERSION_TUPLE
28
+ commit_id: COMMIT_ID
29
+ __commit_id__: COMMIT_ID
30
+
31
+ __version__ = version = '0.1.4'
32
+ __version_tuple__ = version_tuple = (0, 1, 4)
33
+
34
+ __commit_id__ = commit_id = None
create_pywire_app/main.py CHANGED
@@ -1,3 +1,5 @@
1
+ import argparse
2
+ import importlib.metadata
1
3
  import os
2
4
  import subprocess
3
5
  import sys
@@ -6,11 +8,14 @@ from pathlib import Path
6
8
  from typing import Any, Dict, List, Optional
7
9
 
8
10
  import questionary
11
+ import tomllib
9
12
  from jinja2 import Environment, PackageLoader, select_autoescape
10
13
  from rich.console import Console
11
14
  from rich.markdown import Markdown
12
15
  from rich.panel import Panel
13
16
 
17
+ from create_pywire_app import __version__
18
+
14
19
  console = Console()
15
20
 
16
21
  LOGO = r"""
@@ -25,6 +30,58 @@ LOGO = r"""
25
30
  """
26
31
 
27
32
 
33
+ def get_local_version(path: Path) -> Optional[str]:
34
+ """Try to read version from a local pyproject.toml file."""
35
+ try:
36
+ if path.exists():
37
+ with open(path, "rb") as f:
38
+ data = tomllib.load(f)
39
+ return data.get("project", {}).get("version")
40
+ except Exception:
41
+ pass
42
+ return None
43
+
44
+
45
+ def get_version() -> str:
46
+ return __version__
47
+
48
+
49
+ def resolve_pywire_version(pywire_dep: str) -> Optional[str]:
50
+ """Resolve the actual pywire version that will be installed.
51
+
52
+ Args:
53
+ pywire_dep: Dependency spec (e.g., 'pywire', 'pywire==0.1.4', 'pywire @ /path')
54
+
55
+ Returns:
56
+ Resolved version string or None if resolution fails
57
+ """
58
+ # For local paths, we can't resolve via uv pip compile
59
+ if "@" in pywire_dep:
60
+ return None
61
+
62
+ try:
63
+ # Use uv pip compile to resolve the version without installing
64
+ process = subprocess.run(
65
+ ["uv", "pip", "compile", "-", "--quiet"],
66
+ input=pywire_dep,
67
+ text=True,
68
+ capture_output=True,
69
+ check=True,
70
+ timeout=10,
71
+ )
72
+
73
+ # Parse the output for pywire==<version>
74
+ import re
75
+ match = re.search(r'pywire==([^\s]+)', process.stdout)
76
+ if match:
77
+ return match.group(1)
78
+
79
+ except (subprocess.CalledProcessError, subprocess.TimeoutExpired, FileNotFoundError):
80
+ pass
81
+
82
+ return None
83
+
84
+
28
85
  class TemplateRenderer:
29
86
  """Handles template loading and rendering using Jinja2."""
30
87
 
@@ -268,17 +325,81 @@ class ProjectGenerator:
268
325
 
269
326
 
270
327
  def main():
328
+ # Fix for macOS when running with redirected stdin (e.g. via pipe)
329
+ # KqueueSelector fails with /dev/tty on macOS, so we force SelectSelector.
330
+ if sys.platform == "darwin":
331
+ import asyncio
332
+ import selectors
333
+
334
+ class MacOSEventLoopPolicy(asyncio.DefaultEventLoopPolicy):
335
+ def new_event_loop(self):
336
+ selector = selectors.SelectSelector()
337
+ return asyncio.SelectorEventLoop(selector)
338
+
339
+ asyncio.set_event_loop_policy(MacOSEventLoopPolicy())
340
+
271
341
  console.clear()
272
342
 
273
- # Check for local override for testing
343
+ # Parse arguments
344
+ parser = argparse.ArgumentParser(description="Create a new PyWire application")
345
+ parser.add_argument(
346
+ "--pywire-version", help="Specify a specific version of pywire to install"
347
+ )
348
+ args = parser.parse_args()
349
+
350
+ # Check for local override for testing (highest priority)
274
351
  use_local = os.environ.get("USE_LOCAL_PYWIRE") == "1"
275
- pywire_dep = "pywire"
352
+
276
353
  if use_local:
277
354
  pywire_dep = "pywire @ /Users/rholmdahl/projects/pywire-workspace/pywire"
278
- console.print("[yellow]WARNING: Using local pywire dependency[/yellow]")
355
+ # Try to resolve actual local version for display
356
+ # In a workspace structure, we might be in src/create_pywire_app, so up 3 levels is create-pywire-app, then up 1 is workspace
357
+ # actually let's try a safer relative resolution based on known structure
358
+ # /Users/rholmdahl/projects/pywire-workspace/create-pywire-app/src/create_pywire_app/main.py
359
+ # -> create-pywire-app (repo root) = parents[2]
360
+ # -> pywire-workspace = parents[3]
361
+ workspace_root = Path(__file__).resolve().parents[3]
362
+ local_pywire_path = workspace_root / "pywire"
363
+
364
+ # Try reading _version.py first (generated by hatch-vcs)
365
+ local_pywire_version_file = local_pywire_path / "src" / "pywire" / "_version.py"
366
+ pywire_version_display = "Local (Source)"
367
+
368
+ if local_pywire_version_file.exists():
369
+ # Basic regex search for version string to avoid importing it
370
+ import re
371
+ content = local_pywire_version_file.read_text()
372
+ match = re.search(r'version = ["\']([^"\']+)["\']', content)
373
+ if match:
374
+ pywire_version_display = f"{match.group(1)} (Local)"
375
+
376
+ if pywire_version_display == "Local (Source)":
377
+ # Fallback to toml if needed, though with hatch-vcs pyproject.toml won't have it.
378
+ # but check anyway? hatch-vcs usually cleans it.
379
+ # If completely failing, just stick with "Local (Source)"
380
+ pass
381
+
382
+ elif args.pywire_version:
383
+ pywire_dep = f"pywire=={args.pywire_version}"
384
+ pywire_version_display = args.pywire_version
385
+ else:
386
+ pywire_dep = "pywire" # Latest
387
+ pywire_version_display = "Latest"
388
+
389
+ # Resolve the actual version if not local
390
+ if not use_local and pywire_version_display == "Latest":
391
+ with console.status("[dim]Resolving version...", spinner="dots"):
392
+ resolved_version = resolve_pywire_version(pywire_dep)
393
+ if resolved_version:
394
+ pywire_version_display = resolved_version
395
+
396
+ tool_version = get_version()
279
397
 
280
398
  console.print(LOGO)
281
- console.print("[dim]v0.1.0The Python Web Framework[/dim]\n")
399
+ console.print(f"[dim]v{tool_version}PyWire {pywire_version_display}[/dim]\n")
400
+
401
+ if use_local:
402
+ console.print("[yellow]WARNING: Using local pywire dependency[/yellow]")
282
403
 
283
404
  try:
284
405
  # Project Location
@@ -1,7 +1,8 @@
1
1
  !path "/about"
2
2
  !layout "layout.wire"
3
3
 
4
- ---html---
4
+ --- html ---
5
+
5
6
  <section>
6
7
  <h1>About</h1>
7
8
  <p>This page shows explicit routing with semantic filenames.</p>
@@ -31,15 +31,9 @@ if path.detail:
31
31
  "select title, body from posts where slug = ?",
32
32
  (slug,),
33
33
  ).fetchone()
34
-
35
- if post:
36
- post_title = post["title"]
37
- post_body_html = markdown.markdown(post["body"])
38
- else:
39
- post_title = "Post not found"
40
- post_body_html = "<p>We couldn't find that post.</p>"
41
-
42
- ---html---
34
+
35
+ --- html ---
36
+
43
37
  <main>
44
38
  <!-- List view: /posts -->
45
39
  <section $if={path.list}>
@@ -54,8 +48,8 @@ if path.detail:
54
48
 
55
49
  <!-- Detail view: /posts/{slug} -->
56
50
  <article $if={path.detail}>
57
- <h1>{post_title}</h1>
58
- <div>{post_body_html}</div>
51
+ <h1>{post_title if post else "Post not found"}</h1>
52
+ <div>{!html markdown.markdown(post["body"]) if post else "<p>We couldn't find that post.</p>"}</div>
59
53
  <p><a href="/posts">← Back to all posts</a></p>
60
54
  </article>
61
55
  </main>
@@ -48,11 +48,14 @@ posts = cursor.execute(
48
48
  "select slug, title from posts order by id desc"
49
49
  ).fetchall()
50
50
 
51
- ---html---
51
+ --- html ---
52
+
52
53
  <section>
53
54
  <h1>Blog + Portfolio (Explicit)</h1>
54
55
  <p>Routes are declared with <code>!path</code> and files are named semantically.</p>
55
56
  <ul>
56
- {"".join([f'<li><a href="/posts/{row["slug"]}">{row["title"]}</a></li>' for row in posts])}
57
+ <li $for={post in posts} $key={post["slug"]}>
58
+ <a href="/posts/{row["slug"]}">{row["title"]}</a>
59
+ </li>
57
60
  </ul>
58
61
  </section>
@@ -45,11 +45,14 @@ posts = cursor.execute(
45
45
  "select slug, title from posts order by id desc"
46
46
  ).fetchall()
47
47
 
48
- ---html---
48
+ --- html ---
49
+
49
50
  <section>
50
51
  <h1>Blog + Portfolio</h1>
51
52
  <p>Markdown posts backed by SQLite.</p>
52
53
  <ul>
53
- {"".join([f'<li><a href="/posts/{row["slug"]}">{row["title"]}</a></li>' for row in posts])}
54
+ <li $for={post in posts} $key={post["slug"]}>
55
+ <a href="/posts/{row["slug"]}">{row["title"]}</a>
56
+ </li>
54
57
  </ul>
55
58
  </section>
@@ -12,10 +12,13 @@ posts = cursor.execute(
12
12
  "select slug, title from posts order by id desc"
13
13
  ).fetchall()
14
14
 
15
- ---html---
15
+ --- html ---
16
+
16
17
  <section>
17
18
  <h1>All posts</h1>
18
19
  <ul>
19
- {"".join([f'<li><a href="/posts/{row["slug"]}">{row["title"]}</a></li>' for row in posts])}
20
+ <li $for={post in posts} $key={post["slug"]}>
21
+ <a href="/posts/{row["slug"]}">{row["title"]}</a>
22
+ </li>
20
23
  </ul>
21
24
  </section>
@@ -14,15 +14,9 @@ post = cursor.execute(
14
14
  (slug,),
15
15
  ).fetchone()
16
16
 
17
- if post:
18
- title = post["title"]
19
- body_html = markdown.markdown(post["body"])
20
- else:
21
- title = "Post not found"
22
- body_html = "<p>We couldn't find that post.</p>"
17
+ --- html ---
23
18
 
24
- ---html---
25
19
  <article>
26
- <h1>{title}</h1>
27
- <div>{body_html}</div>
20
+ <h1>{post["title"] if post else "Post not found"}</h1>
21
+ <div>{!html markdown.markdown(post["body"]) if post else "<p>We couldn't find that post.</p>"}</div>
28
22
  </article>
@@ -1,5 +1,4 @@
1
- ---html---
2
1
  <section class="container">
3
- <h1>Something went wrong</h1>
2
+ <h1>Something went wrong ({error_code})</h1>
4
3
  <p>Try refreshing the page. If the issue persists, check the server logs.</p>
5
4
  </section>
@@ -1,11 +1,13 @@
1
1
  !path "/"
2
2
  !layout "layout.wire"
3
3
 
4
- count = 0
5
- ---html---
4
+ count = wire(0)
5
+
6
+ --- html ---
7
+
6
8
  <div class="container">
7
9
  <h1>Counter (Explicit Routing)</h1>
8
10
  <p>This page uses explicit routing via <code>!path</code>.</p>
9
- <p>Count is: {count}</p>
10
- <button @click={count += 1}>Increment</button>
11
+ <p>Count is: {count.value}</p>
12
+ <button @click={count.value += 1}>Increment</button>
11
13
  </div>
@@ -1,8 +1,10 @@
1
- count = 0
2
- ---html---
1
+ count = wire(0)
2
+
3
+ --- html ---
4
+
3
5
  <div class="container">
4
6
  <h1>Counter</h1>
5
7
  <p>Edit <code>pages/index.wire</code> to watch hot reload in action.</p>
6
- <p>Count is: {count}</p>
7
- <button @click={count += 1}>Increment</button>
8
+ <p>Count is: {count.value}</p>
9
+ <button @click={count.value += 1}>Increment</button>
8
10
  </div>
@@ -3,7 +3,8 @@ from datetime import datetime
3
3
  # TODO: Replace with real auth middleware
4
4
  user = {"id": "demo-user", "email": "demo@pywire.dev", "signed_in_at": datetime.utcnow()}
5
5
 
6
- ---html---
6
+ --- html ---
7
+
7
8
  <!DOCTYPE html>
8
9
  <html lang="en">
9
10
  <head>
@@ -11,7 +11,8 @@ settings_sections = [
11
11
  {"id": "team", "title": "Team", "description": "Invite and manage team members."},
12
12
  ]
13
13
 
14
- ---html---
14
+ --- html ---
15
+
15
16
  <main>
16
17
  <!-- Dashboard home: /dashboard -->
17
18
  <section $if={path.home}>
@@ -1,7 +1,8 @@
1
1
  !path "/"
2
2
  !layout "public-layout.wire"
3
3
 
4
- ---html---
4
+ --- html ---
5
+
5
6
  <section>
6
7
  <h1>Ship a SaaS with pywire</h1>
7
8
  <p>This starter includes Stripe + SQLAlchemy + stubbed auth.</p>
@@ -1,7 +1,8 @@
1
1
  !path "/login"
2
2
  !layout "public-layout.wire"
3
3
 
4
- ---html---
4
+ --- html ---
5
+
5
6
  <section>
6
7
  <h1>Login</h1>
7
8
  <p>TODO: Replace with pywire auth once available.</p>
@@ -5,7 +5,7 @@ import os
5
5
 
6
6
  stripe_public_key = os.environ.get("STRIPE_PUBLIC_KEY", "")
7
7
 
8
- ---html---
8
+ --- html ---
9
9
  <section>
10
10
  <h1>Pricing</h1>
11
11
  <p>Set <code>STRIPE_PUBLIC_KEY</code> to connect Stripe.</p>
@@ -3,7 +3,8 @@ from datetime import datetime
3
3
  # TODO: Replace with real auth middleware
4
4
  user = {"id": "demo-user", "email": "demo@pywire.dev", "signed_in_at": datetime.utcnow()}
5
5
 
6
- ---html---
6
+ --- html ---
7
+
7
8
  <!DOCTYPE html>
8
9
  <html lang="en">
9
10
  <head>
@@ -1,4 +1,3 @@
1
- ---html---
2
1
  <section>
3
2
  <h1>Dashboard</h1>
4
3
  <p>Welcome to your SaaS dashboard.</p>
@@ -1,4 +1,3 @@
1
- ---html---
2
1
  <section>
3
2
  <h1>Settings</h1>
4
3
  <p>Manage billing, team, and usage.</p>
@@ -1,4 +1,3 @@
1
- ---html---
2
1
  <section>
3
2
  <h1>Ship a SaaS with pywire</h1>
4
3
  <p>This starter includes Stripe + SQLAlchemy + stubbed auth.</p>
@@ -1,4 +1,3 @@
1
- ---html---
2
1
  <section>
3
2
  <h1>Login</h1>
4
3
  <p>TODO: Replace with pywire auth once available.</p>
@@ -2,7 +2,8 @@ import os
2
2
 
3
3
  stripe_public_key = os.environ.get("STRIPE_PUBLIC_KEY", "")
4
4
 
5
- ---html---
5
+ --- html ---
6
+
6
7
  <section>
7
8
  <h1>Pricing</h1>
8
9
  <p>Set <code>STRIPE_PUBLIC_KEY</code> to connect Stripe.</p>
@@ -1,7 +1,8 @@
1
1
  !path "/about"
2
2
  !layout "layout.wire"
3
3
 
4
- ---html---
4
+ --- html ---
5
+
5
6
  <section>
6
7
  <h1>About</h1>
7
8
  <p>This page shows explicit routing with semantic filenames.</p>
@@ -31,15 +31,9 @@ if path.detail:
31
31
  "select title, body from posts where slug = ?",
32
32
  (slug,),
33
33
  ).fetchone()
34
-
35
- if post:
36
- post_title = post["title"]
37
- post_body_html = markdown.markdown(post["body"])
38
- else:
39
- post_title = "Post not found"
40
- post_body_html = "<p>We couldn't find that post.</p>"
41
-
42
- ---html---
34
+
35
+ --- html ---
36
+
43
37
  <main>
44
38
  <!-- List view: /posts -->
45
39
  <section $if={path.list}>
@@ -54,8 +48,8 @@ if path.detail:
54
48
 
55
49
  <!-- Detail view: /posts/{slug} -->
56
50
  <article $if={path.detail}>
57
- <h1>{post_title}</h1>
58
- <div>{post_body_html}</div>
51
+ <h1>{post_title if post else "Post not found"}</h1>
52
+ <div>{!html markdown.markdown(post["body"]) if post else "<p>We couldn't find that post.</p>"}</div>
59
53
  <p><a href="/posts">← Back to all posts</a></p>
60
54
  </article>
61
55
  </main>
@@ -48,11 +48,14 @@ posts = cursor.execute(
48
48
  "select slug, title from posts order by id desc"
49
49
  ).fetchall()
50
50
 
51
- ---html---
51
+ --- html ---
52
+
52
53
  <section>
53
54
  <h1>Blog + Portfolio (Explicit)</h1>
54
55
  <p>Routes are declared with <code>!path</code> and files are named semantically.</p>
55
56
  <ul>
56
- {"".join([f'<li><a href="/posts/{row["slug"]}">{row["title"]}</a></li>' for row in posts])}
57
+ <li $for={post in posts} $key={post["slug"]}>
58
+ <a href="/posts/{row["slug"]}">{row["title"]}</a>
59
+ </li>
57
60
  </ul>
58
61
  </section>
@@ -45,11 +45,14 @@ posts = cursor.execute(
45
45
  "select slug, title from posts order by id desc"
46
46
  ).fetchall()
47
47
 
48
- ---html---
48
+ --- html ---
49
+
49
50
  <section>
50
51
  <h1>Blog + Portfolio</h1>
51
52
  <p>Markdown posts backed by SQLite.</p>
52
53
  <ul>
53
- {"".join([f'<li><a href="/posts/{row["slug"]}">{row["title"]}</a></li>' for row in posts])}
54
+ <li $for={post in posts} $key={post["slug"]}>
55
+ <a href="/posts/{row["slug"]}">{row["title"]}</a>
56
+ </li>
54
57
  </ul>
55
58
  </section>
@@ -12,10 +12,13 @@ posts = cursor.execute(
12
12
  "select slug, title from posts order by id desc"
13
13
  ).fetchall()
14
14
 
15
- ---html---
15
+ --- html ---
16
+
16
17
  <section>
17
18
  <h1>All posts</h1>
18
19
  <ul>
19
- {"".join([f'<li><a href="/posts/{row["slug"]}">{row["title"]}</a></li>' for row in posts])}
20
+ <li $for={post in posts} $key={post["slug"]}>
21
+ <a href="/posts/{row["slug"]}">{row["title"]}</a>
22
+ </li>
20
23
  </ul>
21
24
  </section>
@@ -14,15 +14,9 @@ post = cursor.execute(
14
14
  (slug,),
15
15
  ).fetchone()
16
16
 
17
- if post:
18
- title = post["title"]
19
- body_html = markdown.markdown(post["body"])
20
- else:
21
- title = "Post not found"
22
- body_html = "<p>We couldn't find that post.</p>"
17
+ --- html ---
23
18
 
24
- ---html---
25
19
  <article>
26
- <h1>{title}</h1>
27
- <div>{body_html}</div>
20
+ <h1>{post["title"] if post else "Post not found"}</h1>
21
+ <div>{!html markdown.markdown(post["body"]) if post else "<p>We couldn't find that post.</p>"}</div>
28
22
  </article>
@@ -1,5 +1,4 @@
1
- ---html---
2
1
  <section class="container">
3
- <h1>Something went wrong</h1>
2
+ <h1>Something went wrong ({error_code})</h1>
4
3
  <p>Try refreshing the page. If the issue persists, check the server logs.</p>
5
4
  </section>
@@ -1,11 +1,13 @@
1
1
  !path "/"
2
2
  !layout "layout.wire"
3
3
 
4
- count = 0
5
- ---html---
4
+ count = wire(0)
5
+
6
+ --- html ---
7
+
6
8
  <div class="container">
7
9
  <h1>Counter (Explicit Routing)</h1>
8
10
  <p>This page uses explicit routing via <code>!path</code>.</p>
9
- <p>Count is: {count}</p>
10
- <button @click={count += 1}>Increment</button>
11
+ <p>Count is: {count.value}</p>
12
+ <button @click={count.value += 1}>Increment</button>
11
13
  </div>
@@ -1,8 +1,10 @@
1
- count = 0
2
- ---html---
1
+ count = wire(0)
2
+
3
+ --- html ---
4
+
3
5
  <div class="container">
4
6
  <h1>Counter</h1>
5
7
  <p>Edit <code>pages/index.wire</code> to watch hot reload in action.</p>
6
- <p>Count is: {count}</p>
7
- <button @click={count += 1}>Increment</button>
8
+ <p>Count is: {count.value}</p>
9
+ <button @click={count.value += 1}>Increment</button>
8
10
  </div>
@@ -3,7 +3,8 @@ from datetime import datetime
3
3
  # TODO: Replace with real auth middleware
4
4
  user = {"id": "demo-user", "email": "demo@pywire.dev", "signed_in_at": datetime.utcnow()}
5
5
 
6
- ---html---
6
+ --- html ---
7
+
7
8
  <!DOCTYPE html>
8
9
  <html lang="en">
9
10
  <head>
@@ -11,7 +11,8 @@ settings_sections = [
11
11
  {"id": "team", "title": "Team", "description": "Invite and manage team members."},
12
12
  ]
13
13
 
14
- ---html---
14
+ --- html ---
15
+
15
16
  <main>
16
17
  <!-- Dashboard home: /dashboard -->
17
18
  <section $if={path.home}>
@@ -1,7 +1,8 @@
1
1
  !path "/"
2
2
  !layout "public-layout.wire"
3
3
 
4
- ---html---
4
+ --- html ---
5
+
5
6
  <section>
6
7
  <h1>Ship a SaaS with pywire</h1>
7
8
  <p>This starter includes Stripe + SQLAlchemy + stubbed auth.</p>
@@ -1,7 +1,8 @@
1
1
  !path "/login"
2
2
  !layout "public-layout.wire"
3
3
 
4
- ---html---
4
+ --- html ---
5
+
5
6
  <section>
6
7
  <h1>Login</h1>
7
8
  <p>TODO: Replace with pywire auth once available.</p>
@@ -5,7 +5,7 @@ import os
5
5
 
6
6
  stripe_public_key = os.environ.get("STRIPE_PUBLIC_KEY", "")
7
7
 
8
- ---html---
8
+ --- html ---
9
9
  <section>
10
10
  <h1>Pricing</h1>
11
11
  <p>Set <code>STRIPE_PUBLIC_KEY</code> to connect Stripe.</p>
@@ -3,7 +3,8 @@ from datetime import datetime
3
3
  # TODO: Replace with real auth middleware
4
4
  user = {"id": "demo-user", "email": "demo@pywire.dev", "signed_in_at": datetime.utcnow()}
5
5
 
6
- ---html---
6
+ --- html ---
7
+
7
8
  <!DOCTYPE html>
8
9
  <html lang="en">
9
10
  <head>
@@ -1,4 +1,3 @@
1
- ---html---
2
1
  <section>
3
2
  <h1>Dashboard</h1>
4
3
  <p>Welcome to your SaaS dashboard.</p>
@@ -1,4 +1,3 @@
1
- ---html---
2
1
  <section>
3
2
  <h1>Settings</h1>
4
3
  <p>Manage billing, team, and usage.</p>
@@ -1,4 +1,3 @@
1
- ---html---
2
1
  <section>
3
2
  <h1>Ship a SaaS with pywire</h1>
4
3
  <p>This starter includes Stripe + SQLAlchemy + stubbed auth.</p>
@@ -1,4 +1,3 @@
1
- ---html---
2
1
  <section>
3
2
  <h1>Login</h1>
4
3
  <p>TODO: Replace with pywire auth once available.</p>
@@ -2,7 +2,8 @@ import os
2
2
 
3
3
  stripe_public_key = os.environ.get("STRIPE_PUBLIC_KEY", "")
4
4
 
5
- ---html---
5
+ --- html ---
6
+
6
7
  <section>
7
8
  <h1>Pricing</h1>
8
9
  <p>Set <code>STRIPE_PUBLIC_KEY</code> to connect Stripe.</p>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: create-pywire-app
3
- Version: 0.1.2
3
+ Version: 0.1.4
4
4
  Summary: Init wizard for new pywire projects
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.11
@@ -0,0 +1,80 @@
1
+ create_pywire_app/__init__.py,sha256=2IfSa43uHBGsCagUmksbomg1I0sGSSpyEjVrqha4doY,253
2
+ create_pywire_app/_version.py,sha256=rLCrf4heo25FJtBY-2Ap7ZuWW-5FS7sqTjsolIUuI5c,704
3
+ create_pywire_app/main.py,sha256=obN6gsKmL0GNlgiynomMn8me78AgJjuHeupR14boVtw,23813
4
+ create_pywire_app/templates/blog/explicit/about.wire,sha256=wA4BnWUwJMY403tHaHlyktKrL5MNx-pj0f1PiAdsLcc,161
5
+ create_pywire_app/templates/blog/explicit/blog-posts.wire,sha256=h0OgRIZ0Khphloa5ot9oImccb_JybXFvKO2OKhty0z4,1467
6
+ create_pywire_app/templates/blog/explicit/home.wire,sha256=CyA0mNvVtsSi8YJDKrjvPCa4d7RMnko97AR6X6sZXUk,1479
7
+ create_pywire_app/templates/blog/explicit/layout.wire.j2,sha256=PHoRbKEg7YxBJUdCvRI5AI2MvX1WSfZaJ0sW1YaVlSY,719
8
+ create_pywire_app/templates/blog/path-based/__layout__.wire.j2,sha256=phZ1UmW0Qgtl_0_iNbPH--jhBy5tFzQ8RYgtGxIfm0Q,667
9
+ create_pywire_app/templates/blog/path-based/index.wire,sha256=kXTPtEu_LtQRrpHo6zH8MBqGkQrWUazR4HyChdAYjAM,1388
10
+ create_pywire_app/templates/blog/path-based/posts__layout__.wire.j2,sha256=fsJM82UFdm4TXb5jo0uD5MJT0qyMiF4sQpeQR29nKtY,675
11
+ create_pywire_app/templates/blog/path-based/posts_index.wire,sha256=7oF8nK4zp4qClxbBh6AqqVkR3HgZP-jNLN4qMOmIZSQ,535
12
+ create_pywire_app/templates/blog/path-based/posts_slug.wire,sha256=wRYdW-pAZJSAru9gnXM1iy2ft6dxk2Iy8CyE1yU-S0w,554
13
+ create_pywire_app/templates/common/.gitignore,sha256=Ry9WhHi_-QVuxWtcXop8o9KAxlHVJzIeHrgIkoARZL4,26
14
+ create_pywire_app/templates/common/Dockerfile,sha256=Kw7nIH_wLUxRy6xJIA1Wlk1dl85iOBr2qRXLOg7WpHg,333
15
+ create_pywire_app/templates/common/README.md.j2,sha256=3n2DZtiOmzxjOZrPJlAYnfdNCz3owPWOnwRXeq_ElyU,168
16
+ create_pywire_app/templates/common/__error__.wire,sha256=gfD7cvGPbq8TSs4b_nzAjYQOeDSXfOxwpkMV_sCb2KI,170
17
+ create_pywire_app/templates/common/extensions.json,sha256=3Z8VrKu2ile4bLSUB4lvqGiEvuw58bAAZ6Y-KUC0_AA,51
18
+ create_pywire_app/templates/common/main-explicit.py.j2,sha256=0_2uVMb4oy9RK0xGpIi1znSiHTGdRzysKbwrOinw4gE,174
19
+ create_pywire_app/templates/common/main-path.py.j2,sha256=s1dChXg5baQFsNvISo45h4nQ1MqoFiMB-zrTnGYKdCs,144
20
+ create_pywire_app/templates/common/pyproject.toml.j2,sha256=rcKdp6wiSJe5bQlyh7_ymtAujwjCdYMSU_0i5cbPl4E,400
21
+ create_pywire_app/templates/common/render.yaml.j2,sha256=2PM73Rq5vLoAKpB5VXPfYoT3GHabtngZ9rg2n9zw6Fk,253
22
+ create_pywire_app/templates/counter/explicit/home.wire,sha256=B2mRbHiuBj_cM56g4bA77kCe-voWvFWnlsuR1pJwbfI,294
23
+ create_pywire_app/templates/counter/explicit/layout.wire.j2,sha256=orbZ_nvG5Fo9_VeFGwG8xJJAehyyDFhTsxe9DkBW3tc,615
24
+ create_pywire_app/templates/counter/path-based/__layout__.wire.j2,sha256=orbZ_nvG5Fo9_VeFGwG8xJJAehyyDFhTsxe9DkBW3tc,615
25
+ create_pywire_app/templates/counter/path-based/index.wire,sha256=jFsumtbPJPAhuYAwAKRGe06WC1xs4XPwsWtz6RvqnNw,252
26
+ create_pywire_app/templates/saas/models.py,sha256=pgz85rmuhxL0-AB8jEdCuKj_hi5g3G2fJroUzOKG5zU,817
27
+ create_pywire_app/templates/saas/explicit/auth-layout.wire.j2,sha256=0eQ211YhFQBuYQ4ef3Q-YX3ng-1SAKjo7TCZ2XDPnQE,887
28
+ create_pywire_app/templates/saas/explicit/dashboard-pages.wire,sha256=kKvoo3PDZ9Rn0QCnBKy4sHoupZ9esjPbKpXUhS-TGDo,1260
29
+ create_pywire_app/templates/saas/explicit/landing.wire,sha256=hf9xpMs5juFai5NZRBof2FylfLrvaEmCrrrsAhpGveM,235
30
+ create_pywire_app/templates/saas/explicit/login.wire,sha256=0YlZ78TjnCblNXRzq0tdlU9qRPVBSTZzMBfvCfXDewA,157
31
+ create_pywire_app/templates/saas/explicit/pricing.wire,sha256=IvfE2gF0RQheRRe17_P2oySmZBcLLBRW85kdI-1x2UU,343
32
+ create_pywire_app/templates/saas/explicit/public-layout.wire.j2,sha256=WfWX_2l5T7C7ibwYLAkwpovmapphsk0hSSa8RokeGVk,723
33
+ create_pywire_app/templates/saas/path-based/__layout__.wire.j2,sha256=WfWX_2l5T7C7ibwYLAkwpovmapphsk0hSSa8RokeGVk,723
34
+ create_pywire_app/templates/saas/path-based/dashboard__layout__.wire.j2,sha256=0eQ211YhFQBuYQ4ef3Q-YX3ng-1SAKjo7TCZ2XDPnQE,887
35
+ create_pywire_app/templates/saas/path-based/dashboard_index.wire,sha256=Cg0dm23tu2dCrjYjVU-L0Lans_o2hpCamQS4UKmXXi4,87
36
+ create_pywire_app/templates/saas/path-based/dashboard_settings.wire,sha256=AI_kP-Lgi9FwS9NJXNhJZUAHooDwOKiPAQVMVMHBUT0,87
37
+ create_pywire_app/templates/saas/path-based/index.wire,sha256=DsZ04Zi2_xvNaUJDLLmPnIMUyTqLseOMMFWJRyRCr98,181
38
+ create_pywire_app/templates/saas/path-based/login.wire,sha256=pZ5jDm014xB3k_DBf5O66tiHnvHgVHYcc9tAfDvwgjc,98
39
+ create_pywire_app/templates/saas/path-based/pricing.wire,sha256=jaDNLcPvfOkj7cG6nrLVo1_E5B9SW92HJPDWVt-yaOs,297
40
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/blog/explicit/about.wire,sha256=wA4BnWUwJMY403tHaHlyktKrL5MNx-pj0f1PiAdsLcc,161
41
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/blog/explicit/blog-posts.wire,sha256=h0OgRIZ0Khphloa5ot9oImccb_JybXFvKO2OKhty0z4,1467
42
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/blog/explicit/home.wire,sha256=CyA0mNvVtsSi8YJDKrjvPCa4d7RMnko97AR6X6sZXUk,1479
43
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/blog/explicit/layout.wire.j2,sha256=PHoRbKEg7YxBJUdCvRI5AI2MvX1WSfZaJ0sW1YaVlSY,719
44
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/blog/path-based/__layout__.wire.j2,sha256=phZ1UmW0Qgtl_0_iNbPH--jhBy5tFzQ8RYgtGxIfm0Q,667
45
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/blog/path-based/index.wire,sha256=kXTPtEu_LtQRrpHo6zH8MBqGkQrWUazR4HyChdAYjAM,1388
46
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/blog/path-based/posts__layout__.wire.j2,sha256=fsJM82UFdm4TXb5jo0uD5MJT0qyMiF4sQpeQR29nKtY,675
47
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/blog/path-based/posts_index.wire,sha256=7oF8nK4zp4qClxbBh6AqqVkR3HgZP-jNLN4qMOmIZSQ,535
48
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/blog/path-based/posts_slug.wire,sha256=wRYdW-pAZJSAru9gnXM1iy2ft6dxk2Iy8CyE1yU-S0w,554
49
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/common/.gitignore,sha256=Ry9WhHi_-QVuxWtcXop8o9KAxlHVJzIeHrgIkoARZL4,26
50
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/common/Dockerfile,sha256=Kw7nIH_wLUxRy6xJIA1Wlk1dl85iOBr2qRXLOg7WpHg,333
51
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/common/README.md.j2,sha256=3n2DZtiOmzxjOZrPJlAYnfdNCz3owPWOnwRXeq_ElyU,168
52
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/common/__error__.wire,sha256=gfD7cvGPbq8TSs4b_nzAjYQOeDSXfOxwpkMV_sCb2KI,170
53
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/common/extensions.json,sha256=3Z8VrKu2ile4bLSUB4lvqGiEvuw58bAAZ6Y-KUC0_AA,51
54
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/common/main-explicit.py.j2,sha256=0_2uVMb4oy9RK0xGpIi1znSiHTGdRzysKbwrOinw4gE,174
55
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/common/main-path.py.j2,sha256=s1dChXg5baQFsNvISo45h4nQ1MqoFiMB-zrTnGYKdCs,144
56
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/common/pyproject.toml.j2,sha256=rcKdp6wiSJe5bQlyh7_ymtAujwjCdYMSU_0i5cbPl4E,400
57
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/common/render.yaml.j2,sha256=2PM73Rq5vLoAKpB5VXPfYoT3GHabtngZ9rg2n9zw6Fk,253
58
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/counter/explicit/home.wire,sha256=B2mRbHiuBj_cM56g4bA77kCe-voWvFWnlsuR1pJwbfI,294
59
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/counter/explicit/layout.wire.j2,sha256=orbZ_nvG5Fo9_VeFGwG8xJJAehyyDFhTsxe9DkBW3tc,615
60
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/counter/path-based/__layout__.wire.j2,sha256=orbZ_nvG5Fo9_VeFGwG8xJJAehyyDFhTsxe9DkBW3tc,615
61
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/counter/path-based/index.wire,sha256=jFsumtbPJPAhuYAwAKRGe06WC1xs4XPwsWtz6RvqnNw,252
62
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/saas/models.py,sha256=pgz85rmuhxL0-AB8jEdCuKj_hi5g3G2fJroUzOKG5zU,817
63
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/saas/explicit/auth-layout.wire.j2,sha256=0eQ211YhFQBuYQ4ef3Q-YX3ng-1SAKjo7TCZ2XDPnQE,887
64
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/saas/explicit/dashboard-pages.wire,sha256=kKvoo3PDZ9Rn0QCnBKy4sHoupZ9esjPbKpXUhS-TGDo,1260
65
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/saas/explicit/landing.wire,sha256=hf9xpMs5juFai5NZRBof2FylfLrvaEmCrrrsAhpGveM,235
66
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/saas/explicit/login.wire,sha256=0YlZ78TjnCblNXRzq0tdlU9qRPVBSTZzMBfvCfXDewA,157
67
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/saas/explicit/pricing.wire,sha256=IvfE2gF0RQheRRe17_P2oySmZBcLLBRW85kdI-1x2UU,343
68
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/saas/explicit/public-layout.wire.j2,sha256=WfWX_2l5T7C7ibwYLAkwpovmapphsk0hSSa8RokeGVk,723
69
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/saas/path-based/__layout__.wire.j2,sha256=WfWX_2l5T7C7ibwYLAkwpovmapphsk0hSSa8RokeGVk,723
70
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/saas/path-based/dashboard__layout__.wire.j2,sha256=0eQ211YhFQBuYQ4ef3Q-YX3ng-1SAKjo7TCZ2XDPnQE,887
71
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/saas/path-based/dashboard_index.wire,sha256=Cg0dm23tu2dCrjYjVU-L0Lans_o2hpCamQS4UKmXXi4,87
72
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/saas/path-based/dashboard_settings.wire,sha256=AI_kP-Lgi9FwS9NJXNhJZUAHooDwOKiPAQVMVMHBUT0,87
73
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/saas/path-based/index.wire,sha256=DsZ04Zi2_xvNaUJDLLmPnIMUyTqLseOMMFWJRyRCr98,181
74
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/saas/path-based/login.wire,sha256=pZ5jDm014xB3k_DBf5O66tiHnvHgVHYcc9tAfDvwgjc,98
75
+ create_pywire_app-0.1.4.data/data/share/create_pywire_app/templates/saas/path-based/pricing.wire,sha256=jaDNLcPvfOkj7cG6nrLVo1_E5B9SW92HJPDWVt-yaOs,297
76
+ create_pywire_app-0.1.4.dist-info/METADATA,sha256=541uTd8IBt_0X-fJk33Xbn8bZfP-Rqssf-_Ln67cl9w,1675
77
+ create_pywire_app-0.1.4.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
78
+ create_pywire_app-0.1.4.dist-info/entry_points.txt,sha256=xoM8npX09IcNMw4filAdOqXraJH53J6Sc2pOLgM3JU8,66
79
+ create_pywire_app-0.1.4.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
80
+ create_pywire_app-0.1.4.dist-info/RECORD,,
@@ -1,79 +0,0 @@
1
- create_pywire_app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- create_pywire_app/main.py,sha256=oqp2I4hWDO-drEO26n3se6_Za6nxO7lyFwNAg2yJENM,19355
3
- create_pywire_app/templates/blog/explicit/about.wire,sha256=FJPqMcOZ87M5cfTft5PA-aR2tMidEBU-BuAnOv0VjS8,158
4
- create_pywire_app/templates/blog/explicit/blog-posts.wire,sha256=4Fz06UyXBxIgiZ2Ss2YC7j_eWz8sbTtn3wZ28z07oNk,1581
5
- create_pywire_app/templates/blog/explicit/home.wire,sha256=il2Dp7Dx4S-0O1gpF_7ij_Un5YjhUu8hOWWB4D_4c38,1446
6
- create_pywire_app/templates/blog/explicit/layout.wire.j2,sha256=PHoRbKEg7YxBJUdCvRI5AI2MvX1WSfZaJ0sW1YaVlSY,719
7
- create_pywire_app/templates/blog/path-based/__layout__.wire.j2,sha256=phZ1UmW0Qgtl_0_iNbPH--jhBy5tFzQ8RYgtGxIfm0Q,667
8
- create_pywire_app/templates/blog/path-based/index.wire,sha256=k_KUz7rbCjxf95ypt25yIGP9Q50WTgByAdswdyQETh8,1355
9
- create_pywire_app/templates/blog/path-based/posts__layout__.wire.j2,sha256=fsJM82UFdm4TXb5jo0uD5MJT0qyMiF4sQpeQR29nKtY,675
10
- create_pywire_app/templates/blog/path-based/posts_index.wire,sha256=msyxqeDoDIWUHHBHr7cTQBJs2nclPyJ39mc0DeklW9k,502
11
- create_pywire_app/templates/blog/path-based/posts_slug.wire,sha256=cV49NLcYcBlWCmtyVE7Cx37sVcUeB_3UseIlxnxtDWM,607
12
- create_pywire_app/templates/common/.gitignore,sha256=Ry9WhHi_-QVuxWtcXop8o9KAxlHVJzIeHrgIkoARZL4,26
13
- create_pywire_app/templates/common/Dockerfile,sha256=Kw7nIH_wLUxRy6xJIA1Wlk1dl85iOBr2qRXLOg7WpHg,333
14
- create_pywire_app/templates/common/README.md.j2,sha256=3n2DZtiOmzxjOZrPJlAYnfdNCz3owPWOnwRXeq_ElyU,168
15
- create_pywire_app/templates/common/__error__.wire,sha256=lnb2opOala97L5XgcyXTQI90MOZ54RvnI1HvvktrEF4,166
16
- create_pywire_app/templates/common/extensions.json,sha256=3Z8VrKu2ile4bLSUB4lvqGiEvuw58bAAZ6Y-KUC0_AA,51
17
- create_pywire_app/templates/common/main-explicit.py.j2,sha256=0_2uVMb4oy9RK0xGpIi1znSiHTGdRzysKbwrOinw4gE,174
18
- create_pywire_app/templates/common/main-path.py.j2,sha256=s1dChXg5baQFsNvISo45h4nQ1MqoFiMB-zrTnGYKdCs,144
19
- create_pywire_app/templates/common/pyproject.toml.j2,sha256=rcKdp6wiSJe5bQlyh7_ymtAujwjCdYMSU_0i5cbPl4E,400
20
- create_pywire_app/templates/common/render.yaml.j2,sha256=2PM73Rq5vLoAKpB5VXPfYoT3GHabtngZ9rg2n9zw6Fk,253
21
- create_pywire_app/templates/counter/explicit/home.wire,sha256=pX6yZzkxbNhjfysKbb6eWJ6-cAZP5Rnup4mwIZf7yQM,272
22
- create_pywire_app/templates/counter/explicit/layout.wire.j2,sha256=orbZ_nvG5Fo9_VeFGwG8xJJAehyyDFhTsxe9DkBW3tc,615
23
- create_pywire_app/templates/counter/path-based/__layout__.wire.j2,sha256=orbZ_nvG5Fo9_VeFGwG8xJJAehyyDFhTsxe9DkBW3tc,615
24
- create_pywire_app/templates/counter/path-based/index.wire,sha256=EdCfkqJ1UwD3xiyC8qE2evOrk_rKkzaTJt5pS-kfbpU,230
25
- create_pywire_app/templates/saas/models.py,sha256=pgz85rmuhxL0-AB8jEdCuKj_hi5g3G2fJroUzOKG5zU,817
26
- create_pywire_app/templates/saas/explicit/auth-layout.wire.j2,sha256=1p-feFdmUNUq2SQ7PqRWvM8jRr3OMXQsi9BXiIzmDCY,884
27
- create_pywire_app/templates/saas/explicit/dashboard-pages.wire,sha256=2QuxAj6-qYshQc__gJsrbJvPVNJtiLe-gnEAdTXHNpg,1257
28
- create_pywire_app/templates/saas/explicit/landing.wire,sha256=3rDHpEIphEK7UEgIhU9x2YHWUgNuSbNngUWMm-J-FCo,232
29
- create_pywire_app/templates/saas/explicit/login.wire,sha256=69D3iI7N-MopBT66zdXCv-QoIvdi5LH6cEjok4qTNyA,154
30
- create_pywire_app/templates/saas/explicit/pricing.wire,sha256=6y08_uSPD9bYsLkrvO6_74qANQa-6Tb1S6kzYSrIGCw,341
31
- create_pywire_app/templates/saas/explicit/public-layout.wire.j2,sha256=WfWX_2l5T7C7ibwYLAkwpovmapphsk0hSSa8RokeGVk,723
32
- create_pywire_app/templates/saas/path-based/__layout__.wire.j2,sha256=WfWX_2l5T7C7ibwYLAkwpovmapphsk0hSSa8RokeGVk,723
33
- create_pywire_app/templates/saas/path-based/dashboard__layout__.wire.j2,sha256=1p-feFdmUNUq2SQ7PqRWvM8jRr3OMXQsi9BXiIzmDCY,884
34
- create_pywire_app/templates/saas/path-based/dashboard_index.wire,sha256=hRkYGoKJcWIJhZygugJdP7yKZJZoX5xPrM2ioUIJ1Ls,98
35
- create_pywire_app/templates/saas/path-based/dashboard_settings.wire,sha256=Emw4tPu_U-42p1zAAS1jxbUIrZci3fGti6LaiHgH2Qc,98
36
- create_pywire_app/templates/saas/path-based/index.wire,sha256=xAfYDhbdMvORf2gnlnkm_RUzfJqAly2CMGwxdu5cTJM,192
37
- create_pywire_app/templates/saas/path-based/login.wire,sha256=voqqjRKNkDJLr8dO_2v-i1GQ9zvRGZ_SYLI6o9Q0qBI,109
38
- create_pywire_app/templates/saas/path-based/pricing.wire,sha256=EClcQgm4277UiOMV13xAN3jzCqxlfsGagsn2tvLkP5I,294
39
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/blog/explicit/about.wire,sha256=FJPqMcOZ87M5cfTft5PA-aR2tMidEBU-BuAnOv0VjS8,158
40
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/blog/explicit/blog-posts.wire,sha256=4Fz06UyXBxIgiZ2Ss2YC7j_eWz8sbTtn3wZ28z07oNk,1581
41
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/blog/explicit/home.wire,sha256=il2Dp7Dx4S-0O1gpF_7ij_Un5YjhUu8hOWWB4D_4c38,1446
42
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/blog/explicit/layout.wire.j2,sha256=PHoRbKEg7YxBJUdCvRI5AI2MvX1WSfZaJ0sW1YaVlSY,719
43
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/blog/path-based/__layout__.wire.j2,sha256=phZ1UmW0Qgtl_0_iNbPH--jhBy5tFzQ8RYgtGxIfm0Q,667
44
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/blog/path-based/index.wire,sha256=k_KUz7rbCjxf95ypt25yIGP9Q50WTgByAdswdyQETh8,1355
45
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/blog/path-based/posts__layout__.wire.j2,sha256=fsJM82UFdm4TXb5jo0uD5MJT0qyMiF4sQpeQR29nKtY,675
46
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/blog/path-based/posts_index.wire,sha256=msyxqeDoDIWUHHBHr7cTQBJs2nclPyJ39mc0DeklW9k,502
47
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/blog/path-based/posts_slug.wire,sha256=cV49NLcYcBlWCmtyVE7Cx37sVcUeB_3UseIlxnxtDWM,607
48
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/common/.gitignore,sha256=Ry9WhHi_-QVuxWtcXop8o9KAxlHVJzIeHrgIkoARZL4,26
49
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/common/Dockerfile,sha256=Kw7nIH_wLUxRy6xJIA1Wlk1dl85iOBr2qRXLOg7WpHg,333
50
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/common/README.md.j2,sha256=3n2DZtiOmzxjOZrPJlAYnfdNCz3owPWOnwRXeq_ElyU,168
51
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/common/__error__.wire,sha256=lnb2opOala97L5XgcyXTQI90MOZ54RvnI1HvvktrEF4,166
52
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/common/extensions.json,sha256=3Z8VrKu2ile4bLSUB4lvqGiEvuw58bAAZ6Y-KUC0_AA,51
53
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/common/main-explicit.py.j2,sha256=0_2uVMb4oy9RK0xGpIi1znSiHTGdRzysKbwrOinw4gE,174
54
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/common/main-path.py.j2,sha256=s1dChXg5baQFsNvISo45h4nQ1MqoFiMB-zrTnGYKdCs,144
55
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/common/pyproject.toml.j2,sha256=rcKdp6wiSJe5bQlyh7_ymtAujwjCdYMSU_0i5cbPl4E,400
56
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/common/render.yaml.j2,sha256=2PM73Rq5vLoAKpB5VXPfYoT3GHabtngZ9rg2n9zw6Fk,253
57
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/counter/explicit/home.wire,sha256=pX6yZzkxbNhjfysKbb6eWJ6-cAZP5Rnup4mwIZf7yQM,272
58
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/counter/explicit/layout.wire.j2,sha256=orbZ_nvG5Fo9_VeFGwG8xJJAehyyDFhTsxe9DkBW3tc,615
59
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/counter/path-based/__layout__.wire.j2,sha256=orbZ_nvG5Fo9_VeFGwG8xJJAehyyDFhTsxe9DkBW3tc,615
60
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/counter/path-based/index.wire,sha256=EdCfkqJ1UwD3xiyC8qE2evOrk_rKkzaTJt5pS-kfbpU,230
61
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/saas/models.py,sha256=pgz85rmuhxL0-AB8jEdCuKj_hi5g3G2fJroUzOKG5zU,817
62
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/saas/explicit/auth-layout.wire.j2,sha256=1p-feFdmUNUq2SQ7PqRWvM8jRr3OMXQsi9BXiIzmDCY,884
63
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/saas/explicit/dashboard-pages.wire,sha256=2QuxAj6-qYshQc__gJsrbJvPVNJtiLe-gnEAdTXHNpg,1257
64
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/saas/explicit/landing.wire,sha256=3rDHpEIphEK7UEgIhU9x2YHWUgNuSbNngUWMm-J-FCo,232
65
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/saas/explicit/login.wire,sha256=69D3iI7N-MopBT66zdXCv-QoIvdi5LH6cEjok4qTNyA,154
66
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/saas/explicit/pricing.wire,sha256=6y08_uSPD9bYsLkrvO6_74qANQa-6Tb1S6kzYSrIGCw,341
67
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/saas/explicit/public-layout.wire.j2,sha256=WfWX_2l5T7C7ibwYLAkwpovmapphsk0hSSa8RokeGVk,723
68
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/saas/path-based/__layout__.wire.j2,sha256=WfWX_2l5T7C7ibwYLAkwpovmapphsk0hSSa8RokeGVk,723
69
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/saas/path-based/dashboard__layout__.wire.j2,sha256=1p-feFdmUNUq2SQ7PqRWvM8jRr3OMXQsi9BXiIzmDCY,884
70
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/saas/path-based/dashboard_index.wire,sha256=hRkYGoKJcWIJhZygugJdP7yKZJZoX5xPrM2ioUIJ1Ls,98
71
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/saas/path-based/dashboard_settings.wire,sha256=Emw4tPu_U-42p1zAAS1jxbUIrZci3fGti6LaiHgH2Qc,98
72
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/saas/path-based/index.wire,sha256=xAfYDhbdMvORf2gnlnkm_RUzfJqAly2CMGwxdu5cTJM,192
73
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/saas/path-based/login.wire,sha256=voqqjRKNkDJLr8dO_2v-i1GQ9zvRGZ_SYLI6o9Q0qBI,109
74
- create_pywire_app-0.1.2.data/data/share/create_pywire_app/templates/saas/path-based/pricing.wire,sha256=EClcQgm4277UiOMV13xAN3jzCqxlfsGagsn2tvLkP5I,294
75
- create_pywire_app-0.1.2.dist-info/METADATA,sha256=IrLeqQplo10r6BAZLz2x9FEDHosC7PdPmw9ZJC3p2xo,1675
76
- create_pywire_app-0.1.2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
77
- create_pywire_app-0.1.2.dist-info/entry_points.txt,sha256=xoM8npX09IcNMw4filAdOqXraJH53J6Sc2pOLgM3JU8,66
78
- create_pywire_app-0.1.2.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
79
- create_pywire_app-0.1.2.dist-info/RECORD,,