splashstand 3.0.10__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 (118) hide show
  1. splashstand-3.0.10/.claude/settings.local.json +39 -0
  2. splashstand-3.0.10/.envrc +1 -0
  3. splashstand-3.0.10/.gitignore +18 -0
  4. splashstand-3.0.10/.pre-commit-config.yaml +109 -0
  5. splashstand-3.0.10/CHANGELOG.md +18 -0
  6. splashstand-3.0.10/CLAUDE.md +100 -0
  7. splashstand-3.0.10/LICENSE +28 -0
  8. splashstand-3.0.10/PKG-INFO +39 -0
  9. splashstand-3.0.10/QWEN.md +137 -0
  10. splashstand-3.0.10/README.md +6 -0
  11. splashstand-3.0.10/mypy.ini +9 -0
  12. splashstand-3.0.10/pyproject.toml +297 -0
  13. splashstand-3.0.10/pyproject.toml.tmpl +23 -0
  14. splashstand-3.0.10/splashstand/Dockerfile +8 -0
  15. splashstand-3.0.10/splashstand/Procfile +1 -0
  16. splashstand-3.0.10/splashstand/__init__.py +0 -0
  17. splashstand-3.0.10/splashstand/__main__.py +4 -0
  18. splashstand-3.0.10/splashstand/actions/__init__.py +0 -0
  19. splashstand-3.0.10/splashstand/adapters/__init__.py +0 -0
  20. splashstand-3.0.10/splashstand/adapters/admin/__init__.py +0 -0
  21. splashstand-3.0.10/splashstand/adapters/admin/_base.py +10 -0
  22. splashstand-3.0.10/splashstand/adapters/admin/_templates/base/base.html +37 -0
  23. splashstand-3.0.10/splashstand/adapters/admin/_templates/base/js/serviceworker.js +129 -0
  24. splashstand-3.0.10/splashstand/adapters/admin/_templates/old/actions.html +53 -0
  25. splashstand-3.0.10/splashstand/adapters/admin/_templates/old/analytics.html +117 -0
  26. splashstand-3.0.10/splashstand/adapters/admin/_templates/old/content.html +48 -0
  27. splashstand-3.0.10/splashstand/adapters/admin/_templates/old/details_modal.html +73 -0
  28. splashstand-3.0.10/splashstand/adapters/admin/_templates/old/edit_modal.html +0 -0
  29. splashstand-3.0.10/splashstand/adapters/admin/_templates/old/help.html +7 -0
  30. splashstand-3.0.10/splashstand/adapters/admin/_templates/old/index.html +322 -0
  31. splashstand-3.0.10/splashstand/adapters/admin/_templates/old/layout.html +95 -0
  32. splashstand-3.0.10/splashstand/adapters/admin/_templates/old/lib.html +470 -0
  33. splashstand-3.0.10/splashstand/adapters/admin/_templates/old/list.html +281 -0
  34. splashstand-3.0.10/splashstand/adapters/admin/_templates/old/modal.html +64 -0
  35. splashstand-3.0.10/splashstand/adapters/admin/_templates/old/offline.html +0 -0
  36. splashstand-3.0.10/splashstand/adapters/admin/_templates/old/preview.html +7 -0
  37. splashstand-3.0.10/splashstand/adapters/admin/_templates/old/redis_console.html +40 -0
  38. splashstand-3.0.10/splashstand/adapters/admin/_templates/old/redis_response.html +0 -0
  39. splashstand-3.0.10/splashstand/adapters/admin/_templates/old/row_actions.html +46 -0
  40. splashstand-3.0.10/splashstand/adapters/admin/_templates/old/site_edit.html +0 -0
  41. splashstand-3.0.10/splashstand/adapters/admin/_templates/old/static.html +0 -0
  42. splashstand-3.0.10/splashstand/adapters/admin/_templates/old/storage_list.html +280 -0
  43. splashstand-3.0.10/splashstand/adapters/admin/_templates/old/store.html +7 -0
  44. splashstand-3.0.10/splashstand/adapters/admin/_templates/old/support.html +7 -0
  45. splashstand-3.0.10/splashstand/adapters/admin/_templates/old/theme_details_modal.html +0 -0
  46. splashstand-3.0.10/splashstand/adapters/admin/_templates/old/theme_edit.html +112 -0
  47. splashstand-3.0.10/splashstand/adapters/admin/_templates/old/theme_list.html +96 -0
  48. splashstand-3.0.10/splashstand/adapters/admin/_templates/webawesome/sqladmin/blocks/display_menu.html +10 -0
  49. splashstand-3.0.10/splashstand/adapters/admin/_templates/webawesome/sqladmin/blocks/head.html +25 -0
  50. splashstand-3.0.10/splashstand/adapters/admin/_templates/webawesome/sqladmin/blocks/menu_category.html +7 -0
  51. splashstand-3.0.10/splashstand/adapters/admin/_templates/webawesome/sqladmin/blocks/menu_item.html +9 -0
  52. splashstand-3.0.10/splashstand/adapters/admin/_templates/webawesome/sqladmin/blocks/render_field.html +17 -0
  53. splashstand-3.0.10/splashstand/adapters/admin/_templates/webawesome/sqladmin/blocks/render_form_fields.html +12 -0
  54. splashstand-3.0.10/splashstand/adapters/admin/_templates/webawesome/sqladmin/blocks/tail.html +0 -0
  55. splashstand-3.0.10/splashstand/adapters/admin/_templates/webawesome/sqladmin/blocks/title.html +4 -0
  56. splashstand-3.0.10/splashstand/adapters/admin/_templates/webawesome/sqladmin/create.html +37 -0
  57. splashstand-3.0.10/splashstand/adapters/admin/_templates/webawesome/sqladmin/details.html +1 -0
  58. splashstand-3.0.10/splashstand/adapters/admin/_templates/webawesome/sqladmin/edit.html +43 -0
  59. splashstand-3.0.10/splashstand/adapters/admin/_templates/webawesome/sqladmin/index.html +6 -0
  60. splashstand-3.0.10/splashstand/adapters/admin/_templates/webawesome/sqladmin/layout.html +41 -0
  61. splashstand-3.0.10/splashstand/adapters/admin/_templates/webawesome/sqladmin/list.html +5 -0
  62. splashstand-3.0.10/splashstand/adapters/admin/_templates/webawesome/sqladmin/login.html +56 -0
  63. splashstand-3.0.10/splashstand/adapters/admin/sqladmin.py +1260 -0
  64. splashstand-3.0.10/splashstand/adapters/analytics/__init__.py +0 -0
  65. splashstand-3.0.10/splashstand/adapters/analytics/_base.py +7 -0
  66. splashstand-3.0.10/splashstand/adapters/analytics/google.py +32 -0
  67. splashstand-3.0.10/splashstand/adapters/analytics/plausible.py +1 -0
  68. splashstand-3.0.10/splashstand/adapters/app/__init__.py +0 -0
  69. splashstand-3.0.10/splashstand/adapters/app/_base.py +22 -0
  70. splashstand-3.0.10/splashstand/adapters/app/_templates/base/base.html +39 -0
  71. splashstand-3.0.10/splashstand/adapters/app/_templates/base/blocks/head.html +16 -0
  72. splashstand-3.0.10/splashstand/adapters/app/_templates/base/blocks/tail.html +41 -0
  73. splashstand-3.0.10/splashstand/adapters/app/_templates/base/blocks/title.html +6 -0
  74. splashstand-3.0.10/splashstand/adapters/app/_templates/base/js/serviceworker.js +146 -0
  75. splashstand-3.0.10/splashstand/adapters/app/_templates/base/sitemap.xml +0 -0
  76. splashstand-3.0.10/splashstand/adapters/app/_templates/base/sitemapindex.xml +0 -0
  77. splashstand-3.0.10/splashstand/adapters/app/_templates/webawesome/404.html +2 -0
  78. splashstand-3.0.10/splashstand/adapters/app/_templates/webawesome/500.html +2 -0
  79. splashstand-3.0.10/splashstand/adapters/app/_templates/webawesome/home.html +2 -0
  80. splashstand-3.0.10/splashstand/adapters/app/_templates/webawesome/index.html +6 -0
  81. splashstand-3.0.10/splashstand/adapters/app/_templates/webawesome/layout.html +48 -0
  82. splashstand-3.0.10/splashstand/adapters/app/_templates/webawesome/offline.html +1 -0
  83. splashstand-3.0.10/splashstand/adapters/app/_templates/webawesome/privacy_policy.html +105 -0
  84. splashstand-3.0.10/splashstand/adapters/app/_templates/webawesome/service_terms.html +70 -0
  85. splashstand-3.0.10/splashstand/adapters/app/default.py +148 -0
  86. splashstand-3.0.10/splashstand/adapters/app/demo.py +325 -0
  87. splashstand-3.0.10/splashstand/adapters/auth/__init__.py +0 -0
  88. splashstand-3.0.10/splashstand/adapters/auth/_base.py +69 -0
  89. splashstand-3.0.10/splashstand/adapters/auth/firebase.py +169 -0
  90. splashstand-3.0.10/splashstand/adapters/captcha/__init__.py +0 -0
  91. splashstand-3.0.10/splashstand/adapters/captcha/_base.py +13 -0
  92. splashstand-3.0.10/splashstand/adapters/captcha/google.py +122 -0
  93. splashstand-3.0.10/splashstand/adapters/mail/__init__.py +0 -0
  94. splashstand-3.0.10/splashstand/adapters/mail/mail.py +181 -0
  95. splashstand-3.0.10/splashstand/adapters/marketing/__init__.py +0 -0
  96. splashstand-3.0.10/splashstand/adapters/marketing/mailchimp.py +0 -0
  97. splashstand-3.0.10/splashstand/adapters/messaging/__init__.py +0 -0
  98. splashstand-3.0.10/splashstand/adapters/messaging/firebase.py +0 -0
  99. splashstand-3.0.10/splashstand/adapters/pwa/__init__.py +0 -0
  100. splashstand-3.0.10/splashstand/adapters/pwa/_base.py +34 -0
  101. splashstand-3.0.10/splashstand/adapters/pwa/_routes.py +30 -0
  102. splashstand-3.0.10/splashstand/adapters/pwa/_templates/serviceworker.js +1 -0
  103. splashstand-3.0.10/splashstand/adapters/pwa/app.py +16 -0
  104. splashstand-3.0.10/splashstand/adapters/schemas/__init__.py +0 -0
  105. splashstand-3.0.10/splashstand/adapters/schemas/_base.py +7 -0
  106. splashstand-3.0.10/splashstand/adapters/schemas/_models/__init__.py +98 -0
  107. splashstand-3.0.10/splashstand/adapters/schemas/_models/creative_work.py +186 -0
  108. splashstand-3.0.10/splashstand/adapters/schemas/_models/event.py +48 -0
  109. splashstand-3.0.10/splashstand/adapters/schemas/_models/organization.py +46 -0
  110. splashstand-3.0.10/splashstand/adapters/schemas/_models/person.py +74 -0
  111. splashstand-3.0.10/splashstand/adapters/schemas/_models/place.py +54 -0
  112. splashstand-3.0.10/splashstand/adapters/schemas/schemaorg.py +255 -0
  113. splashstand-3.0.10/splashstand/adapters/social/__init__.py +0 -0
  114. splashstand-3.0.10/splashstand/adapters/social/facebook.py +0 -0
  115. splashstand-3.0.10/splashstand/cli.py +275 -0
  116. splashstand-3.0.10/splashstand/main.py +10 -0
  117. splashstand-3.0.10/tests/__init__.py +0 -0
  118. splashstand-3.0.10/uv.lock +5607 -0
@@ -0,0 +1,39 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "mcp__session-mgmt__checkpoint",
5
+ "Bash(uv tree:*)",
6
+ "Bash(time uv build:*)",
7
+ "Bash(timeout 30 uv build:*)",
8
+ "Bash(uv check:*)",
9
+ "Bash(uv build:*)",
10
+ "Bash(timeout 60 uv build:*)"
11
+ ]
12
+ },
13
+ "enableAllProjectMcpServers": true,
14
+ "enabledMcpjsonServers": [
15
+ "session-mgmt",
16
+ "crackerjack",
17
+ "jetbrains",
18
+ "macos_automator",
19
+ "penpot",
20
+ "peekaboo",
21
+ "playwright",
22
+ "git",
23
+ "github",
24
+ "gitlab",
25
+ "memory",
26
+ "sequential-thinking",
27
+ "filesystem",
28
+ "mermaid",
29
+ "qwen-code",
30
+ "gemini-cli",
31
+ "context7",
32
+ "excalidraw",
33
+ "upstash",
34
+ "cloud-run",
35
+ "sentry",
36
+ "logfire",
37
+ "turso-cloud"
38
+ ]
39
+ }
@@ -0,0 +1 @@
1
+ layout uv
@@ -0,0 +1,18 @@
1
+ # Created by .ignore support plugin (hsz.mobi)
2
+ /.idea
3
+ /.pdm-python
4
+ /.pdm.toml
5
+ /build/
6
+ /__pypackages__/
7
+ /dist/
8
+ /.mypy_cache/
9
+ /.ruff_cache/
10
+ /.pdm-build/
11
+ /tmp/
12
+ /__pycache__/
13
+ /*.pyc
14
+ /.crackerjack.yaml
15
+ /scratch/
16
+ /old_projects/
17
+ /projects/
18
+ /.mcp.json
@@ -0,0 +1,109 @@
1
+ repos:
2
+ - repo: local
3
+ hooks:
4
+ - id: validate-regex-patterns
5
+ name: validate-regex-patterns
6
+ entry: uv run python -m crackerjack.tools.validate_regex_patterns
7
+ language: system
8
+ files: \.py$
9
+ exclude: ^\.venv/|^src/
10
+ - id: skylos
11
+ name: skylos-dead-code-detection
12
+ entry: skylos
13
+ language: system
14
+ args: ["splashstand", "--exclude", "tests"]
15
+ pass_filenames: false
16
+ exclude: ^tests/|^src/
17
+ stages: ["pre-push", "manual"]
18
+ - id: zuban
19
+ name: zuban-type-checking
20
+ entry: uv run zuban check
21
+ language: system
22
+ args: ["--config-file", "mypy.ini", "./splashstand"]
23
+ pass_filenames: false
24
+ exclude: ^tests/|^src/
25
+ stages: ["pre-push", "manual"]
26
+ - id: pyright
27
+ name: pyright-type-checking
28
+ entry: uv run pyright
29
+ language: system
30
+ files: ^splashstand/.*\.py$
31
+ exclude: ^crackerjack/(mcp|plugins)/.*\.py$|crackerjack/code_cleaner\.py$|^src/
32
+ stages: ["pre-push", "manual"]
33
+ - repo: https://github.com/pre-commit/pre-commit-hooks
34
+ rev: v6.0.0
35
+ hooks:
36
+ - id: trailing-whitespace
37
+ name: trailing-whitespace
38
+ exclude: ^\.venv/|^src/
39
+ - id: end-of-file-fixer
40
+ name: end-of-file-fixer
41
+ exclude: ^\.venv/|^src/
42
+ - id: check-yaml
43
+ name: check-yaml
44
+ exclude: ^\.venv/|^src/
45
+ - id: check-toml
46
+ name: check-toml
47
+ exclude: ^\.venv/|^src/
48
+ - id: check-added-large-files
49
+ name: check-added-large-files
50
+ exclude: ^\.venv/|^src/
51
+ - repo: https://github.com/astral-sh/uv-pre-commit
52
+ rev: 0.8.15
53
+ hooks:
54
+ - id: uv-lock
55
+ files: ^ pyproject\.toml$
56
+ exclude: ^src/
57
+ - repo: https://github.com/gitleaks/gitleaks
58
+ rev: v8.28.0
59
+ hooks:
60
+ - id: gitleaks
61
+ exclude: uv\.lock|pyproject\.toml|tests/.*|docs/.*|.*\.md|^src/
62
+ - repo: https://github.com/PyCQA/bandit
63
+ rev: 1.8.6
64
+ hooks:
65
+ - id: bandit
66
+ args: ["-c", "pyproject.toml", "-r", "-ll"]
67
+ files: ^splashstand/.*\.py$
68
+ exclude: ^tests/|^src/
69
+ stages: ["pre-push", "manual"]
70
+ - repo: https://github.com/codespell-project/codespell
71
+ rev: v2.4.1
72
+ hooks:
73
+ - id: codespell
74
+ exclude: ^\.venv/|^src/
75
+ additional_dependencies: ["tomli"]
76
+ - repo: https://github.com/astral-sh/ruff-pre-commit
77
+ rev: v0.12.12
78
+ hooks:
79
+ - id: ruff-check
80
+ exclude: ^\.venv/|^src/
81
+ - id: ruff-format
82
+ exclude: ^\.venv/|^src/
83
+ - repo: https://github.com/executablebooks/mdformat
84
+ rev: 0.7.22
85
+ hooks:
86
+ - id: mdformat
87
+ exclude: ^\.venv/|^src/
88
+ additional_dependencies: ["mdformat-ruff"]
89
+ - repo: https://github.com/fredrikaverpil/creosote
90
+ rev: v4.1.0
91
+ hooks:
92
+ - id: creosote
93
+ exclude: ^\.venv/|^src/
94
+ stages: ["pre-push", "manual"]
95
+ - repo: https://github.com/rohaquinlop/complexipy-pre-commit
96
+ rev: v3.3.0
97
+ hooks:
98
+ - id: complexipy
99
+ args: ["-d", "low", "--max-complexity-allowed", "15"]
100
+ files: ^splashstand/.*\.py$
101
+ exclude: ^(\.venv/|tests/)|^src/
102
+ stages: ["pre-push", "manual"]
103
+ - repo: https://github.com/dosisod/refurb
104
+ rev: v2.1.0
105
+ hooks:
106
+ - id: refurb
107
+ files: ^splashstand/.*\.py$
108
+ exclude: ^tests/|^src/
109
+ stages: ["pre-push", "manual"]
@@ -0,0 +1,18 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [3.0.9] - 2025-09-21
9
+
10
+ ### Documentation
11
+
12
+ - config: Update CHANGELOG, pyproject, uv
13
+
14
+ ## [3.0.8] - 2025-09-21
15
+
16
+ ### Internal
17
+
18
+ - config: Update pyproject
@@ -0,0 +1,100 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ ## Project Overview
6
+
7
+ SplashStand is a Python 3.13+ web application framework built on top of FastBlocks and ACB (Asynchronous Component Base). It provides "simple, safe, serverless, schema" development with a focus on modern web development patterns including HTMX, Jinja templating, and cloud-native deployment.
8
+
9
+ ## Development Commands
10
+
11
+ ### Essential Commands
12
+ - **Development server**: `uv run fastblocks dev` (from CLI integration)
13
+ - **Production server**: `uv run fastblocks run` (from CLI integration)
14
+ - **Install dependencies**: `uv sync`
15
+ - **Run tests**: `uv run pytest`
16
+ - **Type checking**: `uv run pyright` or `uv run zuban check --config-file mypy.ini ./splashstand`
17
+ - **Linting**: `uv run ruff check` and `uv run ruff format`
18
+ - **Security scan**: `uv run bandit -c pyproject.toml -r -ll splashstand/`
19
+ - **Dead code detection**: `skylos splashstand --exclude tests`
20
+ - **Dependency validation**: `uv run creosote`
21
+
22
+ ### Pre-commit Hooks
23
+ The project uses comprehensive pre-commit hooks. Key stages:
24
+ - **pre-push/manual**: Type checking (pyright, zuban), security (bandit), complexity analysis (complexipy), dead code detection (skylos), refactoring suggestions (refurb)
25
+ - **standard**: Formatting (ruff), linting, spell checking (codespell), YAML/TOML validation
26
+
27
+ ### Custom CLI Commands
28
+ SplashStand provides additional CLI commands via `splashstand/cli.py`:
29
+ - `get_revisions` - List Cloud Run service revisions
30
+ - `clean_revisions` - Clean up old revisions
31
+ - `clean_builds` - Clean up build artifacts
32
+ - `reset` - Reset application state
33
+ - `create` - Create new deployment
34
+ - `add_custom_domain` - Configure custom domain
35
+ - `build_revision` - Build and deploy revision
36
+
37
+ ## Architecture Overview
38
+
39
+ ### Core Structure
40
+ - **`splashstand/main.py`**: Application entry point using FastBlocks framework
41
+ - **`splashstand/cli.py`**: Extended CLI commands for deployment and management
42
+ - **`splashstand/adapters/`**: Modular adapter system for different services:
43
+ - `admin/` - Administrative interfaces
44
+ - `analytics/` - Google Analytics integration
45
+ - `app/` - Core application logic
46
+ - `auth/` - Firebase authentication
47
+ - `captcha/` - reCAPTCHA integration
48
+ - `mail/`, `messaging/`, `marketing/`, `social/` - Communication services
49
+ - `pwa/` - Progressive Web App features
50
+ - `schemas/` - Data validation schemas
51
+
52
+ ### Framework Dependencies
53
+ - **FastBlocks**: Primary web framework providing admin, monitoring, and sitemap features
54
+ - **ACB**: Asynchronous Component Base providing cache, DNS, monitoring, requests, secrets, SMTP, SQL, and storage adapters
55
+ - **Core Libraries**: Starlette, HTMX, Jinja2, SQLModel, Pydantic, httpx
56
+
57
+ ### Configuration Management
58
+ - Uses `acb.depends.depends` for dependency injection and configuration
59
+ - Application configuration loaded via `depends.get()` pattern
60
+ - Logging configured through ACB framework
61
+
62
+ ### Optional Features
63
+ - **Analytics**: Google Analytics Admin and Data APIs (`analytics` extra)
64
+ - **Captcha**: Google reCAPTCHA Enterprise (`captcha` extra)
65
+ - **Auth**: Firebase Admin SDK (`auth` extra)
66
+
67
+ ## Development Environment
68
+
69
+ ### Package Management
70
+ - Uses `uv` for dependency management and virtual environment handling
71
+ - Lock file: `uv.lock`
72
+ - Development dependencies in `dependency-groups.dev`
73
+
74
+ ### Quality Assurance
75
+ - **Type Checking**: Strict mode with pyright and mypy (zuban)
76
+ - **Code Quality**: Ruff for linting/formatting, refurb for refactoring suggestions
77
+ - **Security**: Bandit for security analysis, gitleaks for secrets detection
78
+ - **Complexity**: Maximum complexity of 15 (complexipy)
79
+ - **Coverage**: pytest with coverage reporting
80
+
81
+ ### Project Structure Patterns
82
+ - Adapter pattern for external service integrations
83
+ - CLI extension pattern for operational commands
84
+ - Configuration-driven dependency injection
85
+ - Async-first architecture throughout
86
+
87
+ ## Testing
88
+
89
+ - Test files follow pytest conventions: `test_*.py` or `*_test.py`
90
+ - Tests located in individual project directories under `projects/`
91
+ - Coverage configuration excludes test files and focuses on `splashstand/` source
92
+ - Async test support enabled with `asyncio_mode = "auto"`
93
+
94
+ ## Deployment
95
+
96
+ SplashStand is designed for serverless deployment, particularly Google Cloud Run, with built-in commands for:
97
+ - Revision management and cleanup
98
+ - Custom domain configuration
99
+ - Build and deployment automation
100
+ - Application state management
@@ -0,0 +1,28 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2023, Les Leslie and Wedgwood Web Works
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
10
+
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ 3. Neither the name of the copyright holder nor the names of its
16
+ contributors may be used to endorse or promote products derived from
17
+ this software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,39 @@
1
+ Metadata-Version: 2.4
2
+ Name: splashstand
3
+ Version: 3.0.10
4
+ Project-URL: Homepage, https://gitlab.com/lesleslie/splashstand
5
+ Project-URL: Documentation, https://gitlab.com/lesleslie/splashstand
6
+ Project-URL: Repository, https://gitlab.com/lesleslie/splashstand
7
+ Author-email: lesleslie <les@wedgwoodwebworks.com>
8
+ Maintainer-email: lesleslie <les@wedgwoodwebworks.com>
9
+ License: BSD-3-Clause
10
+ License-File: LICENSE
11
+ Keywords: htmx,httpx,jinja,pydantic,sqladmin,sqlmodel,starlette
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Framework :: AsyncIO
14
+ Classifier: Framework :: Pydantic
15
+ Classifier: Framework :: Pydantic :: 2
16
+ Classifier: License :: OSI Approved :: BSD License
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Programming Language :: Python
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
21
+ Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Content Management System
22
+ Classifier: Topic :: Internet :: WWW/HTTP :: Site Management
23
+ Classifier: Typing :: Typed
24
+ Requires-Python: >=3.13
25
+ Requires-Dist: acb[cache,dns,monitoring,requests,secret,smtp,sql,storage]
26
+ Requires-Dist: alive-progress>=3.2.0
27
+ Requires-Dist: fastblocks[admin,monitoring,sitemap]
28
+ Requires-Dist: jinja2-inflection>=0.4.0
29
+ Requires-Dist: phonenumbers>=9.0.8
30
+ Requires-Dist: pydantic[email]>=2.11.7
31
+ Requires-Dist: uuid-utils>=0.11.0
32
+ Requires-Dist: uv>=0.7.19
33
+ Provides-Extra: analytics
34
+ Requires-Dist: google-analytics-admin>=0.24.1; extra == 'analytics'
35
+ Requires-Dist: google-analytics-data>=0.18.19; extra == 'analytics'
36
+ Provides-Extra: auth
37
+ Requires-Dist: firebase-admin>=6.9.0; extra == 'auth'
38
+ Provides-Extra: captcha
39
+ Requires-Dist: google-cloud-recaptcha-enterprise>=1.28.2; extra == 'captcha'
@@ -0,0 +1,137 @@
1
+ # SplashStand Project Context
2
+
3
+ ## Project Overview
4
+
5
+ SplashStand is a mobile-first modular micro-CMS (Content Management System) built with Python. The project uses a modern tech stack including Flask, SQLAlchemy, Redis, and various Google Cloud services. It's designed to be simple, safe, serverless, and schema-based.
6
+
7
+ The project appears to have evolved over time, with both older Flask-based components (in the `whiskey` directory) and newer components using modern Python frameworks like Starlette, HTMX, Jinja, HTTPX, SQLAdmin, SQLModel, and Pydantic.
8
+
9
+ ## Key Technologies
10
+
11
+ - **Core Framework**: Python 3.13+
12
+ - **Web Framework**: Flask (legacy) and FastBlocks (modern)
13
+ - **Database**: SQLAlchemy with SQLModel
14
+ - **Frontend**: HTMX, Jinja2 templates
15
+ - **Authentication**: Firebase Admin, Flask-Security
16
+ - **Caching**: Redis
17
+ - **Cloud Services**: Google Cloud Platform (Cloud Run, Cloud SQL, Cloud Storage)
18
+ - **Deployment**: Docker, Google Cloud Build
19
+ - **Package Management**: uv, PDM
20
+ - **Code Quality**: Black, Ruff, Pyright, Crackerjack
21
+
22
+ ## Project Structure
23
+
24
+ ```
25
+ splashstand/
26
+ ├── splashstand/ # Main source code
27
+ │ ├── whiskey/ # Legacy Flask-based CMS
28
+ │ ├── adapters/ # Component adapters (admin, analytics, app, auth, etc.)
29
+ │ ├── actions/ # Business logic actions
30
+ │ ├── bin/ # Command-line utilities
31
+ │ ├── functions/ # Cloud functions
32
+ │ ├── public/ # Static files
33
+ │ └── cli.py # Command-line interface
34
+ ├── tests/ # Test files
35
+ ├── docs/ # Documentation
36
+ └── ...
37
+ ```
38
+
39
+ ## Building and Running
40
+
41
+ ### Development Setup
42
+
43
+ 1. Install dependencies with `uv`:
44
+
45
+ ```bash
46
+ uv sync
47
+ ```
48
+
49
+ 1. Run the development server:
50
+
51
+ ```bash
52
+ python -m splashstand
53
+ ```
54
+
55
+ ### CLI Commands
56
+
57
+ The project provides a CLI with several useful commands:
58
+
59
+ - `startproject` - Create a new project
60
+ - `upgradeproject` - Upgrade an existing project
61
+ - `checkversions` - Check dependency versions
62
+
63
+ Additional commands are available through the `cli.py` module:
64
+
65
+ - `deploy` - Build and deploy the application
66
+ - `create` - Create a new application
67
+ - `reset` - Reset debug settings
68
+ - `add_custom_domain` - Add a custom domain to Cloud Run
69
+
70
+ ### Deployment
71
+
72
+ Deployment is handled through Google Cloud Run:
73
+
74
+ 1. Build the Docker image
75
+ 1. Deploy to Cloud Run with appropriate settings
76
+ 1. Configure domain mappings
77
+ 1. Set up Cloud Scheduler for keep-warm tasks
78
+
79
+ ## Development Conventions
80
+
81
+ ### Code Style
82
+
83
+ The project follows strict code quality standards:
84
+
85
+ - Formatting with Black
86
+ - Linting with Ruff
87
+ - Type checking with Pyright
88
+ - Code style enforcement with Crackerjack
89
+
90
+ ### Testing
91
+
92
+ Tests are written using pytest with the following configuration:
93
+
94
+ - Async support with pytest-asyncio
95
+ - Coverage reporting
96
+ - Benchmark testing capabilities
97
+
98
+ ### Package Management
99
+
100
+ The project uses uv for fast package management and PDM for project metadata management. Dependencies are specified in `pyproject.toml`.
101
+
102
+ ### Configuration
103
+
104
+ Configuration is managed through YAML files and environment variables. The project uses a component-based architecture with adapters for different services.
105
+
106
+ ## Key Components
107
+
108
+ 1. **Whiskey** - Legacy Flask-based CMS implementation
109
+ 1. **FastBlocks** - Modern web framework based on Starlette
110
+ 1. **ACB** - Adapter Component Bus for dependency injection
111
+ 1. **Adapters** - Pluggable components for various services (mail, auth, analytics, etc.)
112
+
113
+ ## Important Files
114
+
115
+ - `pyproject.toml` - Project metadata and dependencies
116
+ - `splashstand/cli.py` - Main CLI interface
117
+ - `splashstand/main.py` - Application entry point
118
+ - `splashstand/whiskey/main.py` - Legacy Flask application
119
+ - `splashstand/bin/startproject.py` - Project creation utility
120
+
121
+ ## Development Workflow
122
+
123
+ 1. Create a new project using `startproject`
124
+ 1. Configure settings in YAML files
125
+ 1. Develop features using the component adapter pattern
126
+ 1. Test with pytest
127
+ 1. Deploy using the built-in deployment commands
128
+
129
+ ## Version Information
130
+
131
+ The project has multiple version indicators:
132
+
133
+ - `VERSION` file: 1.1.0
134
+ - `splashstand/whiskey/_version.py`: 1.2.1
135
+ - `pyproject.toml`: 3.0.6
136
+
137
+ This suggests the project is in active development with different components at different version levels.
@@ -0,0 +1,6 @@
1
+ # SplashStand
2
+
3
+ [![Code style: crackerjack](https://img.shields.io/badge/code%20style-crackerjack-000042)](https://github.com/lesleslie/crackerjack)
4
+ [![Python: 3.13+](https://img.shields.io/badge/python-3.13%2B-green)](https://www.python.org/downloads/)
5
+
6
+ SplashStand - simple. safe. serverless. schema.
@@ -0,0 +1,9 @@
1
+ [mypy]
2
+ python_version = 3.13
3
+ strict = true
4
+ ignore_missing_imports = true
5
+ show_error_codes = true
6
+ warn_return_any = true
7
+ warn_unused_configs = true
8
+ disallow_untyped_defs = true
9
+ exclude = tests/.*|test_.*\.py|.*_test\.py