soseki 0.8.8__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.
- soseki-0.8.8/LICENSE +21 -0
- soseki-0.8.8/MANIFEST.in +8 -0
- soseki-0.8.8/PKG-INFO +206 -0
- soseki-0.8.8/README.md +151 -0
- soseki-0.8.8/requirements.txt +27 -0
- soseki-0.8.8/setup.cfg +4 -0
- soseki-0.8.8/setup.py +149 -0
- soseki-0.8.8/soseki.egg-info/PKG-INFO +206 -0
- soseki-0.8.8/soseki.egg-info/SOURCES.txt +206 -0
- soseki-0.8.8/soseki.egg-info/dependency_links.txt +1 -0
- soseki-0.8.8/soseki.egg-info/entry_points.txt +2 -0
- soseki-0.8.8/soseki.egg-info/not-zip-safe +1 -0
- soseki-0.8.8/soseki.egg-info/requires.txt +17 -0
- soseki-0.8.8/soseki.egg-info/top_level.txt +1 -0
- soseki-0.8.8/ssk/__init__.py +447 -0
- soseki-0.8.8/ssk/blanco_app/README +1 -0
- soseki-0.8.8/ssk/blanco_app/__init__.py +57 -0
- soseki-0.8.8/ssk/blanco_app/assets/local/DONOTREMOVE +3 -0
- soseki-0.8.8/ssk/blanco_app/assets/local/global.css +512 -0
- soseki-0.8.8/ssk/blanco_app/assets/local/global.js +68 -0
- soseki-0.8.8/ssk/blanco_app/blueprints/api.py +14 -0
- soseki-0.8.8/ssk/blanco_app/blueprints/home.py +45 -0
- soseki-0.8.8/ssk/blanco_app/cfg/lite.yaml +124 -0
- soseki-0.8.8/ssk/blanco_app/cfg/tst.yaml +109 -0
- soseki-0.8.8/ssk/blanco_app/db_upgrader.py +26 -0
- soseki-0.8.8/ssk/blanco_app/html/local/DONOTREMOVE +3 -0
- soseki-0.8.8/ssk/blanco_app/html/local/about.html +70 -0
- soseki-0.8.8/ssk/blanco_app/html/local/layout.html +129 -0
- soseki-0.8.8/ssk/blanco_app/html/local/notebook.html +59 -0
- soseki-0.8.8/ssk/blanco_app/html/local/notes/DONOTREMOVE +0 -0
- soseki-0.8.8/ssk/blanco_app/html/local/notes/first.html +7539 -0
- soseki-0.8.8/ssk/blanco_app/html/local/notes/meta.csv +2 -0
- soseki-0.8.8/ssk/blanco_app/html/local/notes/test.html +7539 -0
- soseki-0.8.8/ssk/blanco_app/html/local/start.html +10 -0
- soseki-0.8.8/ssk/blanco_app/logic/app_logic.py +30 -0
- soseki-0.8.8/ssk/blanco_app/logic/cmd/DONOTREMOVE +0 -0
- soseki-0.8.8/ssk/blanco_app/logic/jobs/DONOTREMOVE +0 -0
- soseki-0.8.8/ssk/blanco_app/models/DONOTREMOVE +0 -0
- soseki-0.8.8/ssk/blanco_app/requirements.txt +1 -0
- soseki-0.8.8/ssk/blanco_bin/render_jup.sh +16 -0
- soseki-0.8.8/ssk/blanco_bin/run_app.sh +7 -0
- soseki-0.8.8/ssk/blanco_jup/DONOTREMOVE +0 -0
- soseki-0.8.8/ssk/blanco_jup/first.ipynb +55 -0
- soseki-0.8.8/ssk/blueprints/__init__.py +0 -0
- soseki-0.8.8/ssk/blueprints/admin.py +76 -0
- soseki-0.8.8/ssk/blueprints/admin_handler.py +152 -0
- soseki-0.8.8/ssk/blueprints/api.py +22 -0
- soseki-0.8.8/ssk/blueprints/api_handler.py +82 -0
- soseki-0.8.8/ssk/blueprints/cmd.py +27 -0
- soseki-0.8.8/ssk/blueprints/cmd_handler.py +41 -0
- soseki-0.8.8/ssk/blueprints/home.py +132 -0
- soseki-0.8.8/ssk/blueprints/home_handler.py +87 -0
- soseki-0.8.8/ssk/cli.py +80 -0
- soseki-0.8.8/ssk/config.py +36 -0
- soseki-0.8.8/ssk/db.py +372 -0
- soseki-0.8.8/ssk/forms/__init__.py +0 -0
- soseki-0.8.8/ssk/forms/contact_form.py +17 -0
- soseki-0.8.8/ssk/forms/user_edit.py +34 -0
- soseki-0.8.8/ssk/forms/validators.py +57 -0
- soseki-0.8.8/ssk/globals/__init__.py +0 -0
- soseki-0.8.8/ssk/globals/api_gate.py +132 -0
- soseki-0.8.8/ssk/globals/app_settings.py +178 -0
- soseki-0.8.8/ssk/globals/cmd_processor.py +82 -0
- soseki-0.8.8/ssk/globals/contacts_mgr.py +55 -0
- soseki-0.8.8/ssk/globals/email_mgr.py +57 -0
- soseki-0.8.8/ssk/globals/job_mgr.py +211 -0
- soseki-0.8.8/ssk/globals/setting_parser.py +48 -0
- soseki-0.8.8/ssk/globals/web_gate.py +31 -0
- soseki-0.8.8/ssk/lg.py +14 -0
- soseki-0.8.8/ssk/logic/__init__.py +0 -0
- soseki-0.8.8/ssk/logic/bus_logic.py +29 -0
- soseki-0.8.8/ssk/logic/cmd/__init__.py +0 -0
- soseki-0.8.8/ssk/logic/cmd/abstract_cmd.py +108 -0
- soseki-0.8.8/ssk/logic/cmd/admin_cmd.py +79 -0
- soseki-0.8.8/ssk/logic/cmd/anon_cmd.py +80 -0
- soseki-0.8.8/ssk/logic/cmd/api_cmd.py +192 -0
- soseki-0.8.8/ssk/logic/cmd/change_pass_cmd.py +49 -0
- soseki-0.8.8/ssk/logic/cmd/config_cmd.py +219 -0
- soseki-0.8.8/ssk/logic/cmd/db_cleanup_cmd.py +41 -0
- soseki-0.8.8/ssk/logic/cmd/db_stat_cmd.py +34 -0
- soseki-0.8.8/ssk/logic/cmd/group_cmd.py +175 -0
- soseki-0.8.8/ssk/logic/cmd/health_cmd.py +74 -0
- soseki-0.8.8/ssk/logic/cmd/job_cmd.py +163 -0
- soseki-0.8.8/ssk/logic/cmd/mail_cmd.py +61 -0
- soseki-0.8.8/ssk/logic/cmd/page_stat_cmd.py +34 -0
- soseki-0.8.8/ssk/logic/cmd/root_cmd.py +54 -0
- soseki-0.8.8/ssk/logic/cmd/tail_cmd.py +144 -0
- soseki-0.8.8/ssk/logic/cmd/user_cmd.py +224 -0
- soseki-0.8.8/ssk/logic/cmd/validate_cmd.py +39 -0
- soseki-0.8.8/ssk/logic/jobs/__init__.py +0 -0
- soseki-0.8.8/ssk/logic/jobs/base_job.py +231 -0
- soseki-0.8.8/ssk/logic/jobs/db_cleanup_job.py +50 -0
- soseki-0.8.8/ssk/logic/jobs/db_stat_job.py +48 -0
- soseki-0.8.8/ssk/logic/jobs/empty_job.py +20 -0
- soseki-0.8.8/ssk/logic/jobs/health_check_job.py +75 -0
- soseki-0.8.8/ssk/logic/jobs/jup_render_job.py +42 -0
- soseki-0.8.8/ssk/logic/jobs/page_stat_job.py +82 -0
- soseki-0.8.8/ssk/models/__init__.py +0 -0
- soseki-0.8.8/ssk/models/access.py +32 -0
- soseki-0.8.8/ssk/models/all_ssk_db.py +11 -0
- soseki-0.8.8/ssk/models/apikey.py +45 -0
- soseki-0.8.8/ssk/models/audit.py +21 -0
- soseki-0.8.8/ssk/models/contact.py +31 -0
- soseki-0.8.8/ssk/models/db_stats.py +38 -0
- soseki-0.8.8/ssk/models/job.py +37 -0
- soseki-0.8.8/ssk/models/setting.py +50 -0
- soseki-0.8.8/ssk/models/stats.py +60 -0
- soseki-0.8.8/ssk/models/status.py +30 -0
- soseki-0.8.8/ssk/models/user.py +165 -0
- soseki-0.8.8/ssk/models/version.py +20 -0
- soseki-0.8.8/ssk/ssk_consts.py +11 -0
- soseki-0.8.8/ssk/ssk_upgrader.py +169 -0
- soseki-0.8.8/ssk/static/assets/fonts/fa-brands-400.woff +0 -0
- soseki-0.8.8/ssk/static/assets/fonts/fa-brands-400.woff2 +0 -0
- soseki-0.8.8/ssk/static/assets/fonts/fa-regular-400.woff +0 -0
- soseki-0.8.8/ssk/static/assets/fonts/fa-regular-400.woff2 +0 -0
- soseki-0.8.8/ssk/static/assets/fonts/fa-solid-900.woff +0 -0
- soseki-0.8.8/ssk/static/assets/fonts/fa-solid-900.woff2 +0 -0
- soseki-0.8.8/ssk/static/assets/fonts/feather.woff +0 -0
- soseki-0.8.8/ssk/static/assets/fonts/pct.woff +0 -0
- soseki-0.8.8/ssk/static/assets/fonts/poppins/pxiByp8kv8JHgFVrLEj6Z11lFc-K.woff2 +0 -0
- soseki-0.8.8/ssk/static/assets/fonts/poppins/pxiByp8kv8JHgFVrLEj6Z1JlFc-K.woff2 +0 -0
- soseki-0.8.8/ssk/static/assets/fonts/poppins/pxiByp8kv8JHgFVrLEj6Z1xlFQ.woff2 +0 -0
- soseki-0.8.8/ssk/static/assets/fonts/poppins/pxiByp8kv8JHgFVrLGT9Z11lFc-K.woff2 +0 -0
- soseki-0.8.8/ssk/static/assets/fonts/poppins/pxiByp8kv8JHgFVrLGT9Z1JlFc-K.woff2 +0 -0
- soseki-0.8.8/ssk/static/assets/fonts/poppins/pxiByp8kv8JHgFVrLGT9Z1xlFQ.woff2 +0 -0
- soseki-0.8.8/ssk/static/assets/fonts/poppins/pxiEyp8kv8JHgFVrJJfecg.woff2 +0 -0
- soseki-0.8.8/ssk/static/assets/fonts/poppins/pxiEyp8kv8JHgFVrJJnecmNE.woff2 +0 -0
- soseki-0.8.8/ssk/static/css/chartjs/Chart.css +47 -0
- soseki-0.8.8/ssk/static/css/chartjs/Chart.min.css +1 -0
- soseki-0.8.8/ssk/static/css/term.css +5 -0
- soseki-0.8.8/ssk/static/css/terminal.js/emoji.css +3635 -0
- soseki-0.8.8/ssk/static/css/terminal.js/jquery.terminal.min.css +17 -0
- soseki-0.8.8/ssk/static/favicon.ico +0 -0
- soseki-0.8.8/ssk/static/local/DONOTREMOVE +3 -0
- soseki-0.8.8/ssk/static/local/global.css +512 -0
- soseki-0.8.8/ssk/static/local/global.js +68 -0
- soseki-0.8.8/ssk/static/vendor/bootstrap/js/bootstrap.bundle.min.js +7 -0
- soseki-0.8.8/ssk/static/vendor/chart.js/Chart.min.js +13 -0
- soseki-0.8.8/ssk/static/vendor/jquery/jquery.min.js +2 -0
- soseki-0.8.8/ssk/static/vendor/terminal.js/jquery.terminal.min.js +47 -0
- soseki-0.8.8/ssk/templates/500.html +50 -0
- soseki-0.8.8/ssk/templates/_common_base.html +11 -0
- soseki-0.8.8/ssk/templates/error.html +9 -0
- soseki-0.8.8/ssk/templates/flask_user/_authorized_base.html +1 -0
- soseki-0.8.8/ssk/templates/flask_user/_macros.html +42 -0
- soseki-0.8.8/ssk/templates/flask_user/_public_base.html +1 -0
- soseki-0.8.8/ssk/templates/flask_user/change_password.html +17 -0
- soseki-0.8.8/ssk/templates/flask_user/change_username.html +14 -0
- soseki-0.8.8/ssk/templates/flask_user/edit_user_profile.html +30 -0
- soseki-0.8.8/ssk/templates/flask_user/emails/base.html +8 -0
- soseki-0.8.8/ssk/templates/flask_user/emails/base.txt +7 -0
- soseki-0.8.8/ssk/templates/flask_user/emails/base_message.html +8 -0
- soseki-0.8.8/ssk/templates/flask_user/emails/base_message.txt +7 -0
- soseki-0.8.8/ssk/templates/flask_user/emails/base_subject.txt +1 -0
- soseki-0.8.8/ssk/templates/flask_user/emails/confirm_email_message.html +8 -0
- soseki-0.8.8/ssk/templates/flask_user/emails/confirm_email_message.txt +8 -0
- soseki-0.8.8/ssk/templates/flask_user/emails/confirm_email_subject.txt +3 -0
- soseki-0.8.8/ssk/templates/flask_user/emails/invite_user_message.html +9 -0
- soseki-0.8.8/ssk/templates/flask_user/emails/invite_user_message.txt +9 -0
- soseki-0.8.8/ssk/templates/flask_user/emails/invite_user_subject.txt +3 -0
- soseki-0.8.8/ssk/templates/flask_user/emails/password_changed_message.html +8 -0
- soseki-0.8.8/ssk/templates/flask_user/emails/password_changed_message.txt +10 -0
- soseki-0.8.8/ssk/templates/flask_user/emails/password_changed_subject.txt +3 -0
- soseki-0.8.8/ssk/templates/flask_user/emails/registered_message.html +13 -0
- soseki-0.8.8/ssk/templates/flask_user/emails/registered_message.txt +12 -0
- soseki-0.8.8/ssk/templates/flask_user/emails/registered_subject.txt +3 -0
- soseki-0.8.8/ssk/templates/flask_user/emails/reset_password_message.html +12 -0
- soseki-0.8.8/ssk/templates/flask_user/emails/reset_password_message.txt +10 -0
- soseki-0.8.8/ssk/templates/flask_user/emails/reset_password_subject.txt +3 -0
- soseki-0.8.8/ssk/templates/flask_user/emails/username_changed_message.html +6 -0
- soseki-0.8.8/ssk/templates/flask_user/emails/username_changed_message.txt +10 -0
- soseki-0.8.8/ssk/templates/flask_user/emails/username_changed_subject.txt +3 -0
- soseki-0.8.8/ssk/templates/flask_user/flask_user_layout.html +91 -0
- soseki-0.8.8/ssk/templates/flask_user/forgot_password.html +13 -0
- soseki-0.8.8/ssk/templates/flask_user/invite_user.html +13 -0
- soseki-0.8.8/ssk/templates/flask_user/login.html +53 -0
- soseki-0.8.8/ssk/templates/flask_user/login_auth0.html +71 -0
- soseki-0.8.8/ssk/templates/flask_user/login_or_register.html +66 -0
- soseki-0.8.8/ssk/templates/flask_user/manage_emails.html +39 -0
- soseki-0.8.8/ssk/templates/flask_user/register.html +41 -0
- soseki-0.8.8/ssk/templates/flask_user/resend_confirm_email.html +13 -0
- soseki-0.8.8/ssk/templates/flask_user/reset_password.html +16 -0
- soseki-0.8.8/ssk/templates/local/DONOTREMOVE +3 -0
- soseki-0.8.8/ssk/templates/local/about.html +70 -0
- soseki-0.8.8/ssk/templates/local/layout.html +129 -0
- soseki-0.8.8/ssk/templates/local/notebook.html +59 -0
- soseki-0.8.8/ssk/templates/local/notes/DONOTREMOVE +0 -0
- soseki-0.8.8/ssk/templates/local/notes/first.html +7539 -0
- soseki-0.8.8/ssk/templates/local/notes/meta.csv +2 -0
- soseki-0.8.8/ssk/templates/local/notes/test.html +7539 -0
- soseki-0.8.8/ssk/templates/local/start.html +10 -0
- soseki-0.8.8/ssk/templates/ssk/about.html +73 -0
- soseki-0.8.8/ssk/templates/ssk/admin/terminal.html +108 -0
- soseki-0.8.8/ssk/templates/ssk/closed.html +12 -0
- soseki-0.8.8/ssk/templates/ssk/emails/base.html +8 -0
- soseki-0.8.8/ssk/templates/ssk/emails/base.txt +7 -0
- soseki-0.8.8/ssk/templates/ssk/emails/receipt.html +10 -0
- soseki-0.8.8/ssk/templates/ssk/emails/receipt.txt +8 -0
- soseki-0.8.8/ssk/templates/ssk/emails/test.html +8 -0
- soseki-0.8.8/ssk/templates/ssk/emails/test.txt +8 -0
- soseki-0.8.8/ssk/templates/ssk/home.html +34 -0
- soseki-0.8.8/ssk/templates/ssk/not_found.html +12 -0
- soseki-0.8.8/ssk/templates/ssk/posts.html +31 -0
- soseki-0.8.8/ssk/templates/ssk/system_chart.html +20 -0
- soseki-0.8.8/ssk/templates/ssk/system_stats.html +121 -0
- soseki-0.8.8/ssk/templates/ssk/tasks.html +127 -0
- soseki-0.8.8/ssk/utils.py +142 -0
soseki-0.8.8/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 Michał Świtała / CodingMinds.io
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
soseki-0.8.8/MANIFEST.in
ADDED
soseki-0.8.8/PKG-INFO
ADDED
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: soseki
|
|
3
|
+
Version: 0.8.8
|
|
4
|
+
Summary: a lightweight foundation for building Python web tools.
|
|
5
|
+
Home-page: https://codingminds.io/soseki
|
|
6
|
+
Author: Michał Świtała
|
|
7
|
+
Author-email: michal@codingminds.io
|
|
8
|
+
License: MIT
|
|
9
|
+
Project-URL: Bug Reports, https://github.com/acodingmind/soseki/issues
|
|
10
|
+
Project-URL: Source, https://github.com/acodingmind/soseki
|
|
11
|
+
Keywords: flask web framework user-management scheduling
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Framework :: Flask
|
|
20
|
+
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
|
21
|
+
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
22
|
+
Requires-Python: >=3.10
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
License-File: LICENSE
|
|
25
|
+
Requires-Dist: Flask==3.1.2
|
|
26
|
+
Requires-Dist: Flask-Login==0.6.3
|
|
27
|
+
Requires-Dist: Flask-Mail==0.10.0
|
|
28
|
+
Requires-Dist: Flask-SQLAlchemy==3.1.1
|
|
29
|
+
Requires-Dist: Flask-User==1.0.2.2
|
|
30
|
+
Requires-Dist: Flask-WTF==1.2.2
|
|
31
|
+
Requires-Dist: SQLAlchemy==2.0.44
|
|
32
|
+
Requires-Dist: SQLAlchemy-Utils==0.42.0
|
|
33
|
+
Requires-Dist: PyMySQL==1.1.2
|
|
34
|
+
Requires-Dist: APScheduler==3.11.1
|
|
35
|
+
Requires-Dist: WTForms==3.2.1
|
|
36
|
+
Requires-Dist: email-validator==2.3.0
|
|
37
|
+
Requires-Dist: psutil==7.1.3
|
|
38
|
+
Requires-Dist: PyYAML==6.0.3
|
|
39
|
+
Requires-Dist: textile==4.0.3
|
|
40
|
+
Requires-Dist: MarkupSafe==3.0.3
|
|
41
|
+
Requires-Dist: requests==2.32.5
|
|
42
|
+
Dynamic: author
|
|
43
|
+
Dynamic: author-email
|
|
44
|
+
Dynamic: classifier
|
|
45
|
+
Dynamic: description
|
|
46
|
+
Dynamic: description-content-type
|
|
47
|
+
Dynamic: home-page
|
|
48
|
+
Dynamic: keywords
|
|
49
|
+
Dynamic: license
|
|
50
|
+
Dynamic: license-file
|
|
51
|
+
Dynamic: project-url
|
|
52
|
+
Dynamic: requires-dist
|
|
53
|
+
Dynamic: requires-python
|
|
54
|
+
Dynamic: summary
|
|
55
|
+
|
|
56
|
+
# Soseki
|
|
57
|
+
|
|
58
|
+
A lightweight, batteries-included Flask framework designed for rapidly building internal tools, admin panels, and data-driven web applications.
|
|
59
|
+
|
|
60
|
+
Soseki takes care of the repetitive infrastructure—authentication, database management, background jobs, API controls, and logging—so you can focus on building the features that matter. Perfect for prototypes, internal dashboards, and production-ready utilities that need to ship fast without sacrificing structure.
|
|
61
|
+
|
|
62
|
+
## Features
|
|
63
|
+
|
|
64
|
+
- 🔐 **User Management** - Complete authentication system with Flask-User
|
|
65
|
+
- 📊 **Database Management** - SQLAlchemy integration with dual database support (app + logs)
|
|
66
|
+
- ⏰ **Job Scheduling** - Background job execution with APScheduler
|
|
67
|
+
- 📧 **Email Support** - Built-in email functionality with Flask-Mail
|
|
68
|
+
- 🔌 **API Gateway** - API key management and rate limiting
|
|
69
|
+
- 📝 **Request Logging** - Comprehensive request/response logging
|
|
70
|
+
- 🛠️ **Database Versioning** - Built-in database migration support
|
|
71
|
+
- 🛠️ **CLI** - interactive command line for quick feature development and testing
|
|
72
|
+
- 🎨 **Customizable** - YAML-based configuration system
|
|
73
|
+
|
|
74
|
+
## Requirements
|
|
75
|
+
|
|
76
|
+
- Python 3.10 or higher
|
|
77
|
+
- Flask 3.0+
|
|
78
|
+
- SQLAlchemy 2.0+
|
|
79
|
+
|
|
80
|
+
## Installation
|
|
81
|
+
|
|
82
|
+
### From PyPI (coming soon)
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
pip install soseki
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### From source
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
git clone https://github.com/acodingmind/soseki
|
|
92
|
+
cd soseki
|
|
93
|
+
pip install -e .
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Development Installation
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
pip install -r requirements.txt
|
|
100
|
+
pip install -r requirements-dev.txt
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Quick Start
|
|
104
|
+
|
|
105
|
+
1. Initialize a new soseki like application:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
# Create a project folder
|
|
109
|
+
mkdir soseki_app
|
|
110
|
+
cd soseki_app
|
|
111
|
+
|
|
112
|
+
# Install soseki
|
|
113
|
+
python3 -m venv venv
|
|
114
|
+
source venv/bin/activate
|
|
115
|
+
pip install soseki
|
|
116
|
+
|
|
117
|
+
# Initialize basic soseki app
|
|
118
|
+
python3 -m ssk.cli init
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
2. Update configuration file (`cfg/lite.yaml`):
|
|
122
|
+
|
|
123
|
+
```yaml
|
|
124
|
+
ssk:
|
|
125
|
+
USER_APP_NAME:
|
|
126
|
+
string: 'MyApp'
|
|
127
|
+
SECRET_KEY:
|
|
128
|
+
string: 'your-secret-key-here'
|
|
129
|
+
SQLALCHEMY_DATABASE_URI:
|
|
130
|
+
string: 'sqlite:///myapp.sqlite'
|
|
131
|
+
LOG_DB_CONNSTR:
|
|
132
|
+
string: 'sqlite:///myapp_log.sqlite'
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
3. Run your application:
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
# run the app
|
|
139
|
+
./bin/run_app.sh
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Documentation
|
|
143
|
+
|
|
144
|
+
- [Installation Guide](https://github.com/acodingmind/soseki/blob/release/docs/installation.md)
|
|
145
|
+
- [Quick Start](https://github.com/acodingmind/soseki/blob/release/docs/quickstart.md)
|
|
146
|
+
- [Configuration](https://github.com/acodingmind/soseki/blob/release/docs/configuration.md)
|
|
147
|
+
|
|
148
|
+
## How To
|
|
149
|
+
|
|
150
|
+
- [How To Add Notes](https://github.com/acodingmind/soseki/blob/release/docs/how-to-add-notes.md)
|
|
151
|
+
- [How To Upgrade Database](https://github.com/acodingmind/soseki/blob/release/docs/how-to-database-upgrade.md)
|
|
152
|
+
|
|
153
|
+
## Blanco App
|
|
154
|
+
|
|
155
|
+
Check the `app/` directory for a complete working example application.
|
|
156
|
+
|
|
157
|
+
The standard folder structure (created by init command):
|
|
158
|
+
- `assets/local` - Static files (CSS, JS)
|
|
159
|
+
- `blueprints/` - Flask blueprints
|
|
160
|
+
- `cfg/` - Configuration files
|
|
161
|
+
- `html/local` - Templates
|
|
162
|
+
- `logic/cmd` - Custom commands
|
|
163
|
+
- `logic/jobs` - Background jobs
|
|
164
|
+
- `models/` - Database models
|
|
165
|
+
|
|
166
|
+
## Project Structure
|
|
167
|
+
|
|
168
|
+
```
|
|
169
|
+
soseki/
|
|
170
|
+
├── ssk/ # Core framework package
|
|
171
|
+
├── app/ # Blanco application
|
|
172
|
+
├── bin/ # Utility scripts
|
|
173
|
+
├── tests/ # Test suite
|
|
174
|
+
├── docs/ # Documentation
|
|
175
|
+
└── requirements.txt # Core dependencies
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## Running Tests
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
pytest
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
With coverage:
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
pytest --cov=ssk
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## License
|
|
191
|
+
|
|
192
|
+
MIT License - see [LICENCE](https://github.com/acodingmind/soseki/blob/release/LICENSE) file for details.
|
|
193
|
+
|
|
194
|
+
## Author
|
|
195
|
+
|
|
196
|
+
Michał Świtała - [CodingMinds.io](https://codingminds.io)
|
|
197
|
+
|
|
198
|
+
## Contributing
|
|
199
|
+
|
|
200
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
201
|
+
|
|
202
|
+
- [How Contribute](https://github.com/acodingmind/soseki/blob/release/CONTRIBUTING.md)
|
|
203
|
+
|
|
204
|
+
## Support
|
|
205
|
+
|
|
206
|
+
For issues and questions, please use the [GitHub issue tracker](https://github.com/acodingmind/soseki/issues).
|
soseki-0.8.8/README.md
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# Soseki
|
|
2
|
+
|
|
3
|
+
A lightweight, batteries-included Flask framework designed for rapidly building internal tools, admin panels, and data-driven web applications.
|
|
4
|
+
|
|
5
|
+
Soseki takes care of the repetitive infrastructure—authentication, database management, background jobs, API controls, and logging—so you can focus on building the features that matter. Perfect for prototypes, internal dashboards, and production-ready utilities that need to ship fast without sacrificing structure.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- 🔐 **User Management** - Complete authentication system with Flask-User
|
|
10
|
+
- 📊 **Database Management** - SQLAlchemy integration with dual database support (app + logs)
|
|
11
|
+
- ⏰ **Job Scheduling** - Background job execution with APScheduler
|
|
12
|
+
- 📧 **Email Support** - Built-in email functionality with Flask-Mail
|
|
13
|
+
- 🔌 **API Gateway** - API key management and rate limiting
|
|
14
|
+
- 📝 **Request Logging** - Comprehensive request/response logging
|
|
15
|
+
- 🛠️ **Database Versioning** - Built-in database migration support
|
|
16
|
+
- 🛠️ **CLI** - interactive command line for quick feature development and testing
|
|
17
|
+
- 🎨 **Customizable** - YAML-based configuration system
|
|
18
|
+
|
|
19
|
+
## Requirements
|
|
20
|
+
|
|
21
|
+
- Python 3.10 or higher
|
|
22
|
+
- Flask 3.0+
|
|
23
|
+
- SQLAlchemy 2.0+
|
|
24
|
+
|
|
25
|
+
## Installation
|
|
26
|
+
|
|
27
|
+
### From PyPI (coming soon)
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
pip install soseki
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### From source
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
git clone https://github.com/acodingmind/soseki
|
|
37
|
+
cd soseki
|
|
38
|
+
pip install -e .
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Development Installation
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
pip install -r requirements.txt
|
|
45
|
+
pip install -r requirements-dev.txt
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Quick Start
|
|
49
|
+
|
|
50
|
+
1. Initialize a new soseki like application:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# Create a project folder
|
|
54
|
+
mkdir soseki_app
|
|
55
|
+
cd soseki_app
|
|
56
|
+
|
|
57
|
+
# Install soseki
|
|
58
|
+
python3 -m venv venv
|
|
59
|
+
source venv/bin/activate
|
|
60
|
+
pip install soseki
|
|
61
|
+
|
|
62
|
+
# Initialize basic soseki app
|
|
63
|
+
python3 -m ssk.cli init
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
2. Update configuration file (`cfg/lite.yaml`):
|
|
67
|
+
|
|
68
|
+
```yaml
|
|
69
|
+
ssk:
|
|
70
|
+
USER_APP_NAME:
|
|
71
|
+
string: 'MyApp'
|
|
72
|
+
SECRET_KEY:
|
|
73
|
+
string: 'your-secret-key-here'
|
|
74
|
+
SQLALCHEMY_DATABASE_URI:
|
|
75
|
+
string: 'sqlite:///myapp.sqlite'
|
|
76
|
+
LOG_DB_CONNSTR:
|
|
77
|
+
string: 'sqlite:///myapp_log.sqlite'
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
3. Run your application:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# run the app
|
|
84
|
+
./bin/run_app.sh
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Documentation
|
|
88
|
+
|
|
89
|
+
- [Installation Guide](https://github.com/acodingmind/soseki/blob/release/docs/installation.md)
|
|
90
|
+
- [Quick Start](https://github.com/acodingmind/soseki/blob/release/docs/quickstart.md)
|
|
91
|
+
- [Configuration](https://github.com/acodingmind/soseki/blob/release/docs/configuration.md)
|
|
92
|
+
|
|
93
|
+
## How To
|
|
94
|
+
|
|
95
|
+
- [How To Add Notes](https://github.com/acodingmind/soseki/blob/release/docs/how-to-add-notes.md)
|
|
96
|
+
- [How To Upgrade Database](https://github.com/acodingmind/soseki/blob/release/docs/how-to-database-upgrade.md)
|
|
97
|
+
|
|
98
|
+
## Blanco App
|
|
99
|
+
|
|
100
|
+
Check the `app/` directory for a complete working example application.
|
|
101
|
+
|
|
102
|
+
The standard folder structure (created by init command):
|
|
103
|
+
- `assets/local` - Static files (CSS, JS)
|
|
104
|
+
- `blueprints/` - Flask blueprints
|
|
105
|
+
- `cfg/` - Configuration files
|
|
106
|
+
- `html/local` - Templates
|
|
107
|
+
- `logic/cmd` - Custom commands
|
|
108
|
+
- `logic/jobs` - Background jobs
|
|
109
|
+
- `models/` - Database models
|
|
110
|
+
|
|
111
|
+
## Project Structure
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
soseki/
|
|
115
|
+
├── ssk/ # Core framework package
|
|
116
|
+
├── app/ # Blanco application
|
|
117
|
+
├── bin/ # Utility scripts
|
|
118
|
+
├── tests/ # Test suite
|
|
119
|
+
├── docs/ # Documentation
|
|
120
|
+
└── requirements.txt # Core dependencies
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Running Tests
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
pytest
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
With coverage:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
pytest --cov=ssk
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## License
|
|
136
|
+
|
|
137
|
+
MIT License - see [LICENCE](https://github.com/acodingmind/soseki/blob/release/LICENSE) file for details.
|
|
138
|
+
|
|
139
|
+
## Author
|
|
140
|
+
|
|
141
|
+
Michał Świtała - [CodingMinds.io](https://codingminds.io)
|
|
142
|
+
|
|
143
|
+
## Contributing
|
|
144
|
+
|
|
145
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
146
|
+
|
|
147
|
+
- [How Contribute](https://github.com/acodingmind/soseki/blob/release/CONTRIBUTING.md)
|
|
148
|
+
|
|
149
|
+
## Support
|
|
150
|
+
|
|
151
|
+
For issues and questions, please use the [GitHub issue tracker](https://github.com/acodingmind/soseki/issues).
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Core framework dependencies
|
|
2
|
+
Flask==3.1.2
|
|
3
|
+
Flask-Login==0.6.3
|
|
4
|
+
Flask-Mail==0.10.0
|
|
5
|
+
Flask-SQLAlchemy==3.1.1
|
|
6
|
+
Flask-User==1.0.2.2
|
|
7
|
+
Flask-WTF==1.2.2
|
|
8
|
+
|
|
9
|
+
# Database
|
|
10
|
+
SQLAlchemy==2.0.44
|
|
11
|
+
SQLAlchemy-Utils==0.42.0
|
|
12
|
+
PyMySQL==1.1.2
|
|
13
|
+
|
|
14
|
+
# Scheduling
|
|
15
|
+
APScheduler==3.11.1
|
|
16
|
+
|
|
17
|
+
# Forms and validation
|
|
18
|
+
WTForms==3.2.1
|
|
19
|
+
email-validator==2.3.0
|
|
20
|
+
|
|
21
|
+
# Utilities
|
|
22
|
+
psutil==7.1.3
|
|
23
|
+
PyYAML==6.0.3
|
|
24
|
+
textile==4.0.3
|
|
25
|
+
MarkupSafe==3.0.3
|
|
26
|
+
requests==2.32.5
|
|
27
|
+
|
soseki-0.8.8/setup.cfg
ADDED
soseki-0.8.8/setup.py
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (c) 2023 Michał Świtała / CodingMinds.io
|
|
3
|
+
# SPDX-License-Identifier: MIT
|
|
4
|
+
#
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
from setuptools import setup, find_packages
|
|
8
|
+
from setuptools.command.build_py import build_py
|
|
9
|
+
from setuptools.command.sdist import sdist
|
|
10
|
+
import re
|
|
11
|
+
import os
|
|
12
|
+
import shutil
|
|
13
|
+
|
|
14
|
+
def sync_blanco_app():
|
|
15
|
+
"""Copy app directory to ssk/blanco_app before building."""
|
|
16
|
+
app_dir = 'app'
|
|
17
|
+
blanco_app_dir = 'ssk/blanco_app'
|
|
18
|
+
|
|
19
|
+
if os.path.exists(app_dir):
|
|
20
|
+
# Remove existing blanco_app if it exists
|
|
21
|
+
if os.path.exists(blanco_app_dir):
|
|
22
|
+
shutil.rmtree(blanco_app_dir)
|
|
23
|
+
|
|
24
|
+
# Copy app to blanco_app, excluding templates and static
|
|
25
|
+
def ignore_patterns(dir, files):
|
|
26
|
+
# Ignore templates and static directories at the root level
|
|
27
|
+
if dir == app_dir:
|
|
28
|
+
return {'templates', 'static'}
|
|
29
|
+
return set()
|
|
30
|
+
|
|
31
|
+
shutil.copytree(app_dir, blanco_app_dir, ignore=ignore_patterns)
|
|
32
|
+
print(f"Synced {app_dir}/ to {blanco_app_dir}/ (excluding templates and static)")
|
|
33
|
+
else:
|
|
34
|
+
print(f"Warning: {app_dir}/ directory not found, skipping sync")
|
|
35
|
+
|
|
36
|
+
# Sync bin directory
|
|
37
|
+
bin_dir = 'bin'
|
|
38
|
+
blanco_bin_dir = 'ssk/blanco_bin'
|
|
39
|
+
|
|
40
|
+
if os.path.exists(bin_dir):
|
|
41
|
+
if os.path.exists(blanco_bin_dir):
|
|
42
|
+
shutil.rmtree(blanco_bin_dir)
|
|
43
|
+
shutil.copytree(bin_dir, blanco_bin_dir)
|
|
44
|
+
print(f"Synced {bin_dir}/ to {blanco_bin_dir}/")
|
|
45
|
+
else:
|
|
46
|
+
print(f"Warning: {bin_dir}/ directory not found, skipping sync")
|
|
47
|
+
|
|
48
|
+
# Sync jup directory
|
|
49
|
+
jup_dir = 'jup'
|
|
50
|
+
blanco_jup_dir = 'ssk/blanco_jup'
|
|
51
|
+
|
|
52
|
+
if os.path.exists(jup_dir):
|
|
53
|
+
if os.path.exists(blanco_jup_dir):
|
|
54
|
+
shutil.rmtree(blanco_jup_dir)
|
|
55
|
+
shutil.copytree(jup_dir, blanco_jup_dir)
|
|
56
|
+
print(f"Synced {jup_dir}/ to {blanco_jup_dir}/")
|
|
57
|
+
else:
|
|
58
|
+
print(f"Warning: {jup_dir}/ directory not found, skipping sync")
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class CustomBuildPy(build_py):
|
|
62
|
+
"""Custom build command that syncs blanco_app before building."""
|
|
63
|
+
def run(self):
|
|
64
|
+
sync_blanco_app()
|
|
65
|
+
build_py.run(self)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class CustomSdist(sdist):
|
|
69
|
+
"""Custom sdist command that syncs blanco_app before creating source distribution."""
|
|
70
|
+
def run(self):
|
|
71
|
+
sync_blanco_app()
|
|
72
|
+
sdist.run(self)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
# Read version without importing the module
|
|
76
|
+
with open('ssk/ssk_consts.py', 'r') as f:
|
|
77
|
+
version_file = f.read()
|
|
78
|
+
version_match = re.search(r"^SSK_VER = ['\"]([^'\"]*)['\"]", version_file, re.M)
|
|
79
|
+
if version_match:
|
|
80
|
+
SSK_VER = version_match.group(1)
|
|
81
|
+
else:
|
|
82
|
+
raise RuntimeError("Unable to find version string.")
|
|
83
|
+
|
|
84
|
+
# Read long description from README
|
|
85
|
+
with open('README.md', 'r', encoding='utf-8') as f:
|
|
86
|
+
long_description = f.read()
|
|
87
|
+
|
|
88
|
+
# Read requirements
|
|
89
|
+
with open('requirements.txt') as f:
|
|
90
|
+
requirements = f.read().splitlines()
|
|
91
|
+
|
|
92
|
+
# Filter out comments and empty lines
|
|
93
|
+
install_requires = []
|
|
94
|
+
for req in requirements:
|
|
95
|
+
req = req.strip()
|
|
96
|
+
if req and not req.startswith('#'):
|
|
97
|
+
install_requires.append(req)
|
|
98
|
+
|
|
99
|
+
setup(
|
|
100
|
+
name='soseki',
|
|
101
|
+
version=SSK_VER,
|
|
102
|
+
description='a lightweight foundation for building Python web tools.',
|
|
103
|
+
long_description=long_description,
|
|
104
|
+
long_description_content_type='text/markdown',
|
|
105
|
+
url='https://codingminds.io/soseki',
|
|
106
|
+
author='Michał Świtała',
|
|
107
|
+
author_email='michal@codingminds.io',
|
|
108
|
+
license='MIT',
|
|
109
|
+
classifiers=[
|
|
110
|
+
'Development Status :: 4 - Beta',
|
|
111
|
+
'Intended Audience :: Developers',
|
|
112
|
+
'License :: OSI Approved :: MIT License',
|
|
113
|
+
'Programming Language :: Python :: 3',
|
|
114
|
+
'Programming Language :: Python :: 3.10',
|
|
115
|
+
'Programming Language :: Python :: 3.11',
|
|
116
|
+
'Programming Language :: Python :: 3.12',
|
|
117
|
+
'Framework :: Flask',
|
|
118
|
+
'Topic :: Internet :: WWW/HTTP :: Dynamic Content',
|
|
119
|
+
'Topic :: Software Development :: Libraries :: Application Frameworks',
|
|
120
|
+
],
|
|
121
|
+
keywords='flask web framework user-management scheduling',
|
|
122
|
+
packages=find_packages(exclude=['tests', 'tests.*', 'app', 'app.*', 'scripts', 'jup', 'docs']),
|
|
123
|
+
python_requires='>=3.10',
|
|
124
|
+
install_requires=install_requires,
|
|
125
|
+
package_data={
|
|
126
|
+
'ssk': [
|
|
127
|
+
'templates/**/*',
|
|
128
|
+
'static/**/*',
|
|
129
|
+
'blanco_app/**/*',
|
|
130
|
+
'blanco_bin/**/*',
|
|
131
|
+
'blanco_jup/**/*',
|
|
132
|
+
]
|
|
133
|
+
},
|
|
134
|
+
include_package_data=True,
|
|
135
|
+
zip_safe=False,
|
|
136
|
+
cmdclass={
|
|
137
|
+
'build_py': CustomBuildPy,
|
|
138
|
+
'sdist': CustomSdist,
|
|
139
|
+
},
|
|
140
|
+
entry_points={
|
|
141
|
+
'console_scripts': [
|
|
142
|
+
'soseki=ssk.cli:cli',
|
|
143
|
+
],
|
|
144
|
+
},
|
|
145
|
+
project_urls={
|
|
146
|
+
'Bug Reports': 'https://github.com/acodingmind/soseki/issues',
|
|
147
|
+
'Source': 'https://github.com/acodingmind/soseki',
|
|
148
|
+
},
|
|
149
|
+
)
|