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.
Files changed (208) hide show
  1. soseki-0.8.8/LICENSE +21 -0
  2. soseki-0.8.8/MANIFEST.in +8 -0
  3. soseki-0.8.8/PKG-INFO +206 -0
  4. soseki-0.8.8/README.md +151 -0
  5. soseki-0.8.8/requirements.txt +27 -0
  6. soseki-0.8.8/setup.cfg +4 -0
  7. soseki-0.8.8/setup.py +149 -0
  8. soseki-0.8.8/soseki.egg-info/PKG-INFO +206 -0
  9. soseki-0.8.8/soseki.egg-info/SOURCES.txt +206 -0
  10. soseki-0.8.8/soseki.egg-info/dependency_links.txt +1 -0
  11. soseki-0.8.8/soseki.egg-info/entry_points.txt +2 -0
  12. soseki-0.8.8/soseki.egg-info/not-zip-safe +1 -0
  13. soseki-0.8.8/soseki.egg-info/requires.txt +17 -0
  14. soseki-0.8.8/soseki.egg-info/top_level.txt +1 -0
  15. soseki-0.8.8/ssk/__init__.py +447 -0
  16. soseki-0.8.8/ssk/blanco_app/README +1 -0
  17. soseki-0.8.8/ssk/blanco_app/__init__.py +57 -0
  18. soseki-0.8.8/ssk/blanco_app/assets/local/DONOTREMOVE +3 -0
  19. soseki-0.8.8/ssk/blanco_app/assets/local/global.css +512 -0
  20. soseki-0.8.8/ssk/blanco_app/assets/local/global.js +68 -0
  21. soseki-0.8.8/ssk/blanco_app/blueprints/api.py +14 -0
  22. soseki-0.8.8/ssk/blanco_app/blueprints/home.py +45 -0
  23. soseki-0.8.8/ssk/blanco_app/cfg/lite.yaml +124 -0
  24. soseki-0.8.8/ssk/blanco_app/cfg/tst.yaml +109 -0
  25. soseki-0.8.8/ssk/blanco_app/db_upgrader.py +26 -0
  26. soseki-0.8.8/ssk/blanco_app/html/local/DONOTREMOVE +3 -0
  27. soseki-0.8.8/ssk/blanco_app/html/local/about.html +70 -0
  28. soseki-0.8.8/ssk/blanco_app/html/local/layout.html +129 -0
  29. soseki-0.8.8/ssk/blanco_app/html/local/notebook.html +59 -0
  30. soseki-0.8.8/ssk/blanco_app/html/local/notes/DONOTREMOVE +0 -0
  31. soseki-0.8.8/ssk/blanco_app/html/local/notes/first.html +7539 -0
  32. soseki-0.8.8/ssk/blanco_app/html/local/notes/meta.csv +2 -0
  33. soseki-0.8.8/ssk/blanco_app/html/local/notes/test.html +7539 -0
  34. soseki-0.8.8/ssk/blanco_app/html/local/start.html +10 -0
  35. soseki-0.8.8/ssk/blanco_app/logic/app_logic.py +30 -0
  36. soseki-0.8.8/ssk/blanco_app/logic/cmd/DONOTREMOVE +0 -0
  37. soseki-0.8.8/ssk/blanco_app/logic/jobs/DONOTREMOVE +0 -0
  38. soseki-0.8.8/ssk/blanco_app/models/DONOTREMOVE +0 -0
  39. soseki-0.8.8/ssk/blanco_app/requirements.txt +1 -0
  40. soseki-0.8.8/ssk/blanco_bin/render_jup.sh +16 -0
  41. soseki-0.8.8/ssk/blanco_bin/run_app.sh +7 -0
  42. soseki-0.8.8/ssk/blanco_jup/DONOTREMOVE +0 -0
  43. soseki-0.8.8/ssk/blanco_jup/first.ipynb +55 -0
  44. soseki-0.8.8/ssk/blueprints/__init__.py +0 -0
  45. soseki-0.8.8/ssk/blueprints/admin.py +76 -0
  46. soseki-0.8.8/ssk/blueprints/admin_handler.py +152 -0
  47. soseki-0.8.8/ssk/blueprints/api.py +22 -0
  48. soseki-0.8.8/ssk/blueprints/api_handler.py +82 -0
  49. soseki-0.8.8/ssk/blueprints/cmd.py +27 -0
  50. soseki-0.8.8/ssk/blueprints/cmd_handler.py +41 -0
  51. soseki-0.8.8/ssk/blueprints/home.py +132 -0
  52. soseki-0.8.8/ssk/blueprints/home_handler.py +87 -0
  53. soseki-0.8.8/ssk/cli.py +80 -0
  54. soseki-0.8.8/ssk/config.py +36 -0
  55. soseki-0.8.8/ssk/db.py +372 -0
  56. soseki-0.8.8/ssk/forms/__init__.py +0 -0
  57. soseki-0.8.8/ssk/forms/contact_form.py +17 -0
  58. soseki-0.8.8/ssk/forms/user_edit.py +34 -0
  59. soseki-0.8.8/ssk/forms/validators.py +57 -0
  60. soseki-0.8.8/ssk/globals/__init__.py +0 -0
  61. soseki-0.8.8/ssk/globals/api_gate.py +132 -0
  62. soseki-0.8.8/ssk/globals/app_settings.py +178 -0
  63. soseki-0.8.8/ssk/globals/cmd_processor.py +82 -0
  64. soseki-0.8.8/ssk/globals/contacts_mgr.py +55 -0
  65. soseki-0.8.8/ssk/globals/email_mgr.py +57 -0
  66. soseki-0.8.8/ssk/globals/job_mgr.py +211 -0
  67. soseki-0.8.8/ssk/globals/setting_parser.py +48 -0
  68. soseki-0.8.8/ssk/globals/web_gate.py +31 -0
  69. soseki-0.8.8/ssk/lg.py +14 -0
  70. soseki-0.8.8/ssk/logic/__init__.py +0 -0
  71. soseki-0.8.8/ssk/logic/bus_logic.py +29 -0
  72. soseki-0.8.8/ssk/logic/cmd/__init__.py +0 -0
  73. soseki-0.8.8/ssk/logic/cmd/abstract_cmd.py +108 -0
  74. soseki-0.8.8/ssk/logic/cmd/admin_cmd.py +79 -0
  75. soseki-0.8.8/ssk/logic/cmd/anon_cmd.py +80 -0
  76. soseki-0.8.8/ssk/logic/cmd/api_cmd.py +192 -0
  77. soseki-0.8.8/ssk/logic/cmd/change_pass_cmd.py +49 -0
  78. soseki-0.8.8/ssk/logic/cmd/config_cmd.py +219 -0
  79. soseki-0.8.8/ssk/logic/cmd/db_cleanup_cmd.py +41 -0
  80. soseki-0.8.8/ssk/logic/cmd/db_stat_cmd.py +34 -0
  81. soseki-0.8.8/ssk/logic/cmd/group_cmd.py +175 -0
  82. soseki-0.8.8/ssk/logic/cmd/health_cmd.py +74 -0
  83. soseki-0.8.8/ssk/logic/cmd/job_cmd.py +163 -0
  84. soseki-0.8.8/ssk/logic/cmd/mail_cmd.py +61 -0
  85. soseki-0.8.8/ssk/logic/cmd/page_stat_cmd.py +34 -0
  86. soseki-0.8.8/ssk/logic/cmd/root_cmd.py +54 -0
  87. soseki-0.8.8/ssk/logic/cmd/tail_cmd.py +144 -0
  88. soseki-0.8.8/ssk/logic/cmd/user_cmd.py +224 -0
  89. soseki-0.8.8/ssk/logic/cmd/validate_cmd.py +39 -0
  90. soseki-0.8.8/ssk/logic/jobs/__init__.py +0 -0
  91. soseki-0.8.8/ssk/logic/jobs/base_job.py +231 -0
  92. soseki-0.8.8/ssk/logic/jobs/db_cleanup_job.py +50 -0
  93. soseki-0.8.8/ssk/logic/jobs/db_stat_job.py +48 -0
  94. soseki-0.8.8/ssk/logic/jobs/empty_job.py +20 -0
  95. soseki-0.8.8/ssk/logic/jobs/health_check_job.py +75 -0
  96. soseki-0.8.8/ssk/logic/jobs/jup_render_job.py +42 -0
  97. soseki-0.8.8/ssk/logic/jobs/page_stat_job.py +82 -0
  98. soseki-0.8.8/ssk/models/__init__.py +0 -0
  99. soseki-0.8.8/ssk/models/access.py +32 -0
  100. soseki-0.8.8/ssk/models/all_ssk_db.py +11 -0
  101. soseki-0.8.8/ssk/models/apikey.py +45 -0
  102. soseki-0.8.8/ssk/models/audit.py +21 -0
  103. soseki-0.8.8/ssk/models/contact.py +31 -0
  104. soseki-0.8.8/ssk/models/db_stats.py +38 -0
  105. soseki-0.8.8/ssk/models/job.py +37 -0
  106. soseki-0.8.8/ssk/models/setting.py +50 -0
  107. soseki-0.8.8/ssk/models/stats.py +60 -0
  108. soseki-0.8.8/ssk/models/status.py +30 -0
  109. soseki-0.8.8/ssk/models/user.py +165 -0
  110. soseki-0.8.8/ssk/models/version.py +20 -0
  111. soseki-0.8.8/ssk/ssk_consts.py +11 -0
  112. soseki-0.8.8/ssk/ssk_upgrader.py +169 -0
  113. soseki-0.8.8/ssk/static/assets/fonts/fa-brands-400.woff +0 -0
  114. soseki-0.8.8/ssk/static/assets/fonts/fa-brands-400.woff2 +0 -0
  115. soseki-0.8.8/ssk/static/assets/fonts/fa-regular-400.woff +0 -0
  116. soseki-0.8.8/ssk/static/assets/fonts/fa-regular-400.woff2 +0 -0
  117. soseki-0.8.8/ssk/static/assets/fonts/fa-solid-900.woff +0 -0
  118. soseki-0.8.8/ssk/static/assets/fonts/fa-solid-900.woff2 +0 -0
  119. soseki-0.8.8/ssk/static/assets/fonts/feather.woff +0 -0
  120. soseki-0.8.8/ssk/static/assets/fonts/pct.woff +0 -0
  121. soseki-0.8.8/ssk/static/assets/fonts/poppins/pxiByp8kv8JHgFVrLEj6Z11lFc-K.woff2 +0 -0
  122. soseki-0.8.8/ssk/static/assets/fonts/poppins/pxiByp8kv8JHgFVrLEj6Z1JlFc-K.woff2 +0 -0
  123. soseki-0.8.8/ssk/static/assets/fonts/poppins/pxiByp8kv8JHgFVrLEj6Z1xlFQ.woff2 +0 -0
  124. soseki-0.8.8/ssk/static/assets/fonts/poppins/pxiByp8kv8JHgFVrLGT9Z11lFc-K.woff2 +0 -0
  125. soseki-0.8.8/ssk/static/assets/fonts/poppins/pxiByp8kv8JHgFVrLGT9Z1JlFc-K.woff2 +0 -0
  126. soseki-0.8.8/ssk/static/assets/fonts/poppins/pxiByp8kv8JHgFVrLGT9Z1xlFQ.woff2 +0 -0
  127. soseki-0.8.8/ssk/static/assets/fonts/poppins/pxiEyp8kv8JHgFVrJJfecg.woff2 +0 -0
  128. soseki-0.8.8/ssk/static/assets/fonts/poppins/pxiEyp8kv8JHgFVrJJnecmNE.woff2 +0 -0
  129. soseki-0.8.8/ssk/static/css/chartjs/Chart.css +47 -0
  130. soseki-0.8.8/ssk/static/css/chartjs/Chart.min.css +1 -0
  131. soseki-0.8.8/ssk/static/css/term.css +5 -0
  132. soseki-0.8.8/ssk/static/css/terminal.js/emoji.css +3635 -0
  133. soseki-0.8.8/ssk/static/css/terminal.js/jquery.terminal.min.css +17 -0
  134. soseki-0.8.8/ssk/static/favicon.ico +0 -0
  135. soseki-0.8.8/ssk/static/local/DONOTREMOVE +3 -0
  136. soseki-0.8.8/ssk/static/local/global.css +512 -0
  137. soseki-0.8.8/ssk/static/local/global.js +68 -0
  138. soseki-0.8.8/ssk/static/vendor/bootstrap/js/bootstrap.bundle.min.js +7 -0
  139. soseki-0.8.8/ssk/static/vendor/chart.js/Chart.min.js +13 -0
  140. soseki-0.8.8/ssk/static/vendor/jquery/jquery.min.js +2 -0
  141. soseki-0.8.8/ssk/static/vendor/terminal.js/jquery.terminal.min.js +47 -0
  142. soseki-0.8.8/ssk/templates/500.html +50 -0
  143. soseki-0.8.8/ssk/templates/_common_base.html +11 -0
  144. soseki-0.8.8/ssk/templates/error.html +9 -0
  145. soseki-0.8.8/ssk/templates/flask_user/_authorized_base.html +1 -0
  146. soseki-0.8.8/ssk/templates/flask_user/_macros.html +42 -0
  147. soseki-0.8.8/ssk/templates/flask_user/_public_base.html +1 -0
  148. soseki-0.8.8/ssk/templates/flask_user/change_password.html +17 -0
  149. soseki-0.8.8/ssk/templates/flask_user/change_username.html +14 -0
  150. soseki-0.8.8/ssk/templates/flask_user/edit_user_profile.html +30 -0
  151. soseki-0.8.8/ssk/templates/flask_user/emails/base.html +8 -0
  152. soseki-0.8.8/ssk/templates/flask_user/emails/base.txt +7 -0
  153. soseki-0.8.8/ssk/templates/flask_user/emails/base_message.html +8 -0
  154. soseki-0.8.8/ssk/templates/flask_user/emails/base_message.txt +7 -0
  155. soseki-0.8.8/ssk/templates/flask_user/emails/base_subject.txt +1 -0
  156. soseki-0.8.8/ssk/templates/flask_user/emails/confirm_email_message.html +8 -0
  157. soseki-0.8.8/ssk/templates/flask_user/emails/confirm_email_message.txt +8 -0
  158. soseki-0.8.8/ssk/templates/flask_user/emails/confirm_email_subject.txt +3 -0
  159. soseki-0.8.8/ssk/templates/flask_user/emails/invite_user_message.html +9 -0
  160. soseki-0.8.8/ssk/templates/flask_user/emails/invite_user_message.txt +9 -0
  161. soseki-0.8.8/ssk/templates/flask_user/emails/invite_user_subject.txt +3 -0
  162. soseki-0.8.8/ssk/templates/flask_user/emails/password_changed_message.html +8 -0
  163. soseki-0.8.8/ssk/templates/flask_user/emails/password_changed_message.txt +10 -0
  164. soseki-0.8.8/ssk/templates/flask_user/emails/password_changed_subject.txt +3 -0
  165. soseki-0.8.8/ssk/templates/flask_user/emails/registered_message.html +13 -0
  166. soseki-0.8.8/ssk/templates/flask_user/emails/registered_message.txt +12 -0
  167. soseki-0.8.8/ssk/templates/flask_user/emails/registered_subject.txt +3 -0
  168. soseki-0.8.8/ssk/templates/flask_user/emails/reset_password_message.html +12 -0
  169. soseki-0.8.8/ssk/templates/flask_user/emails/reset_password_message.txt +10 -0
  170. soseki-0.8.8/ssk/templates/flask_user/emails/reset_password_subject.txt +3 -0
  171. soseki-0.8.8/ssk/templates/flask_user/emails/username_changed_message.html +6 -0
  172. soseki-0.8.8/ssk/templates/flask_user/emails/username_changed_message.txt +10 -0
  173. soseki-0.8.8/ssk/templates/flask_user/emails/username_changed_subject.txt +3 -0
  174. soseki-0.8.8/ssk/templates/flask_user/flask_user_layout.html +91 -0
  175. soseki-0.8.8/ssk/templates/flask_user/forgot_password.html +13 -0
  176. soseki-0.8.8/ssk/templates/flask_user/invite_user.html +13 -0
  177. soseki-0.8.8/ssk/templates/flask_user/login.html +53 -0
  178. soseki-0.8.8/ssk/templates/flask_user/login_auth0.html +71 -0
  179. soseki-0.8.8/ssk/templates/flask_user/login_or_register.html +66 -0
  180. soseki-0.8.8/ssk/templates/flask_user/manage_emails.html +39 -0
  181. soseki-0.8.8/ssk/templates/flask_user/register.html +41 -0
  182. soseki-0.8.8/ssk/templates/flask_user/resend_confirm_email.html +13 -0
  183. soseki-0.8.8/ssk/templates/flask_user/reset_password.html +16 -0
  184. soseki-0.8.8/ssk/templates/local/DONOTREMOVE +3 -0
  185. soseki-0.8.8/ssk/templates/local/about.html +70 -0
  186. soseki-0.8.8/ssk/templates/local/layout.html +129 -0
  187. soseki-0.8.8/ssk/templates/local/notebook.html +59 -0
  188. soseki-0.8.8/ssk/templates/local/notes/DONOTREMOVE +0 -0
  189. soseki-0.8.8/ssk/templates/local/notes/first.html +7539 -0
  190. soseki-0.8.8/ssk/templates/local/notes/meta.csv +2 -0
  191. soseki-0.8.8/ssk/templates/local/notes/test.html +7539 -0
  192. soseki-0.8.8/ssk/templates/local/start.html +10 -0
  193. soseki-0.8.8/ssk/templates/ssk/about.html +73 -0
  194. soseki-0.8.8/ssk/templates/ssk/admin/terminal.html +108 -0
  195. soseki-0.8.8/ssk/templates/ssk/closed.html +12 -0
  196. soseki-0.8.8/ssk/templates/ssk/emails/base.html +8 -0
  197. soseki-0.8.8/ssk/templates/ssk/emails/base.txt +7 -0
  198. soseki-0.8.8/ssk/templates/ssk/emails/receipt.html +10 -0
  199. soseki-0.8.8/ssk/templates/ssk/emails/receipt.txt +8 -0
  200. soseki-0.8.8/ssk/templates/ssk/emails/test.html +8 -0
  201. soseki-0.8.8/ssk/templates/ssk/emails/test.txt +8 -0
  202. soseki-0.8.8/ssk/templates/ssk/home.html +34 -0
  203. soseki-0.8.8/ssk/templates/ssk/not_found.html +12 -0
  204. soseki-0.8.8/ssk/templates/ssk/posts.html +31 -0
  205. soseki-0.8.8/ssk/templates/ssk/system_chart.html +20 -0
  206. soseki-0.8.8/ssk/templates/ssk/system_stats.html +121 -0
  207. soseki-0.8.8/ssk/templates/ssk/tasks.html +127 -0
  208. 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.
@@ -0,0 +1,8 @@
1
+ include README.md
2
+ include LICENCE
3
+ include requirements.txt
4
+ recursive-include ssk/templates *
5
+ recursive-include ssk/static *
6
+ recursive-include ssk/blanco_app *
7
+ recursive-include ssk/blanco_bin *
8
+ recursive-include ssk/blanco_jup *
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
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
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
+ )