monopyly 1.6.0__py3-none-any.whl → 1.6.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. monopyly/CHANGELOG.md +15 -0
  2. monopyly/_version.py +22 -4
  3. monopyly/banking/forms.py +4 -0
  4. monopyly/common/forms/_forms.py +5 -14
  5. monopyly/common/forms/fields.py +0 -9
  6. monopyly/common/forms/utils.py +3 -3
  7. monopyly/core/context_processors.py +3 -21
  8. monopyly/credit/cards.py +1 -1
  9. monopyly/credit/forms.py +6 -2
  10. monopyly/credit/transactions/activity/parser.py +1 -1
  11. monopyly/static/css/style.css +4 -0
  12. monopyly/static/js/bind-tag-actions.js +174 -86
  13. monopyly/static/js/highlight-discrepant-transactions.js +1 -0
  14. monopyly/templates/banking/account_form/account_form_page_new.html +10 -8
  15. monopyly/templates/banking/account_page.html +24 -24
  16. monopyly/templates/banking/accounts_page.html +8 -6
  17. monopyly/templates/common/tag_tree.html +4 -1
  18. monopyly/templates/common/tags_page.html +15 -13
  19. monopyly/templates/core/index.html +12 -8
  20. monopyly/templates/core/profile.html +18 -19
  21. monopyly/templates/credit/account_page.html +17 -17
  22. monopyly/templates/credit/card_form/card_form_page_new.html +8 -5
  23. monopyly/templates/credit/statement_page.html +43 -44
  24. monopyly/templates/credit/statement_reconciliation/statement_reconciliation_page.html +19 -19
  25. monopyly/templates/credit/statements_page.html +13 -13
  26. monopyly/templates/credit/transaction_form/transaction_form_page_update.html +9 -9
  27. monopyly/templates/credit/transactions_page.html +28 -28
  28. monopyly/templates/layout.html +7 -5
  29. {monopyly-1.6.0.dist-info → monopyly-1.6.2.dist-info}/METADATA +6 -6
  30. {monopyly-1.6.0.dist-info → monopyly-1.6.2.dist-info}/RECORD +34 -34
  31. {monopyly-1.6.0.dist-info → monopyly-1.6.2.dist-info}/WHEEL +1 -1
  32. {monopyly-1.6.0.dist-info → monopyly-1.6.2.dist-info}/entry_points.txt +0 -0
  33. {monopyly-1.6.0.dist-info → monopyly-1.6.2.dist-info}/licenses/COPYING +0 -0
  34. {monopyly-1.6.0.dist-info → monopyly-1.6.2.dist-info}/licenses/LICENSE +0 -0
@@ -18,7 +18,10 @@
18
18
  </li>
19
19
 
20
20
  {% if loop.last %}
21
- <input class="new-tag" type="text" />
21
+ {# Do not create a new input for a tag when its subtree is updated #}
22
+ {% if new_tree or loop.depth0 != 0 %}
23
+ <input class="new-tag" type="text" />
24
+ {% endif %}
22
25
  {% endif %}
23
26
  {% else %}
24
27
  <input class="new-tag" type="text" />
@@ -1,6 +1,18 @@
1
1
  {% extends 'layout.html' %}
2
2
 
3
3
 
4
+ {% block javascript %}
5
+
6
+ <script>
7
+ const ADD_TAG_ENDPOINT = "{{ url_for('banking.add_tag') }}";
8
+ const REMOVE_TAG_ENDPOINT = "{{ url_for('banking.delete_tag') }}";
9
+ </script>
10
+ <script type="module" src="{{ url_for('static', filename='js/bind-tag-actions.js') }}">
11
+ </script>
12
+
13
+ {% endblock %}
14
+
15
+
4
16
  {% block header %}
5
17
 
6
18
  <h1>
@@ -21,7 +33,9 @@
21
33
  <div id="tags-container" class="tag-container">
22
34
 
23
35
  <ul class="tags">
24
- {% include 'common/tag_tree.html' %}
36
+ {% with new_tree = True %}
37
+ {% include 'common/tag_tree.html' %}
38
+ {% endwith %}
25
39
  </ul>
26
40
 
27
41
  <img class="root new-tag button" src="{{ url_for('static', filename='img/icons/plus-thick.png') }}" />
@@ -31,15 +45,3 @@
31
45
  </div>
32
46
 
33
47
  {% endblock %}
34
-
35
-
36
- {% block javascript %}
37
-
38
- <script>
39
- const ADD_TAG_ENDPOINT = "{{ url_for('banking.add_tag') }}";
40
- const REMOVE_TAG_ENDPOINT = "{{ url_for('banking.delete_tag') }}";
41
- </script>
42
- <script type="module" src="{{ url_for('static', filename='js/bind-tag-actions.js') }}">
43
- </script>
44
-
45
- {% endblock %}
@@ -1,5 +1,17 @@
1
1
  {% extends "layout.html" %}
2
2
 
3
+
4
+ {% block javascript %}
5
+
6
+ <script>
7
+ const HIDE_HOMEPAGE_BLOCK_ENDPOINT = "{{ url_for('core.hide_homepage_block') }}";
8
+ </script>
9
+ <script type="module" src="{{ url_for('static', filename='js/hide-homepage-block.js') }}">
10
+ </script>
11
+
12
+ {% endblock %}
13
+
14
+
3
15
  {% block content %}
4
16
 
5
17
  {% if session["show_homepage_block"] %}
@@ -170,11 +182,3 @@
170
182
  {% endif %}
171
183
 
172
184
  {% endblock %}
173
-
174
- {% block javascript %}
175
- <script>
176
- const HIDE_HOMEPAGE_BLOCK_ENDPOINT = "{{ url_for('core.hide_homepage_block') }}";
177
- </script>
178
- <script type="module" src="{{ url_for('static', filename='js/hide-homepage-block.js') }}">
179
- </script>
180
- {% endblock %}
@@ -1,13 +1,28 @@
1
1
  {% extends "layout.html" %}
2
2
 
3
- {% block title %}
4
- Profile
3
+
4
+ {% block javascript %}
5
+
6
+ <script>
7
+ const UPDATE_BANK_NAME_ENDPOINTS = {
8
+ {% for bank in banks %}
9
+ {{ bank.id }}: "{{ url_for('banking.update_bank_name', bank_id=bank.id) }}",
10
+ {% endfor %}
11
+ };
12
+ </script>
13
+ <script type="module" src="{{ url_for('static', filename='js/expand-bank.js') }}">
14
+ </script>
15
+ <script type="module" src="{{ url_for('static', filename='js/update-bank-name.js') }}">
16
+ </script>
17
+
5
18
  {% endblock %}
6
19
 
20
+
7
21
  {% block header %}
8
- <h1>Profile</h1>
22
+ <h1>{% block title %}Profile{% endblock %}</h1>
9
23
  {% endblock %}
10
24
 
25
+
11
26
  {% block content %}
12
27
 
13
28
  <div id="profile">
@@ -76,19 +91,3 @@
76
91
  </div>
77
92
 
78
93
  {% endblock %}
79
-
80
-
81
- {% block javascript %}
82
- <script>
83
-
84
- const UPDATE_BANK_NAME_ENDPOINTS = {
85
- {% for bank in banks %}
86
- {{ bank.id }}: "{{ url_for('banking.update_bank_name', bank_id=bank.id) }}",
87
- {% endfor %}
88
- };
89
- </script>
90
- <script type="module" src="{{ url_for('static', filename='js/expand-bank.js') }}">
91
- </script>
92
- <script type="module" src="{{ url_for('static', filename='js/update-bank-name.js') }}">
93
- </script>
94
- {% endblock %}
@@ -1,6 +1,23 @@
1
1
  {% extends 'layout.html' %}
2
2
 
3
3
 
4
+ {% block javascript %}
5
+
6
+ <script>
7
+ const UPDATE_CARD_STATUS_ENDPOINT = "{{ url_for('credit.update_card_status') }}";
8
+ const UPDATE_ACCOUNT_STATEMENT_ISSUE_DAY_ENDPOINT = "{{ url_for('credit.update_account_statement_issue_day', account_id=account.id) }}";
9
+ const UPDATE_ACCOUNT_STATEMENT_DUE_DAY_ENDPOINT = "{{ url_for('credit.update_account_statement_due_day', account_id=account.id) }}";
10
+ </script>
11
+ <script src="{{ url_for('static', filename='js/flip-card.js') }}" defer>
12
+ </script>
13
+ <script type="module" src="{{ url_for('static', filename='js/update-card-status.js') }}">
14
+ </script>
15
+ <script type="module" src="{{ url_for('static', filename='js/update-account-statement-parameters.js') }}">
16
+ </script>
17
+
18
+ {% endblock %}
19
+
20
+
4
21
  {% block header %}
5
22
 
6
23
  <h1>
@@ -100,20 +117,3 @@
100
117
  </div>
101
118
 
102
119
  {% endblock %}
103
-
104
-
105
- {% block javascript %}
106
-
107
- <script>
108
- const UPDATE_CARD_STATUS_ENDPOINT = "{{ url_for('credit.update_card_status') }}";
109
- const UPDATE_ACCOUNT_STATEMENT_ISSUE_DAY_ENDPOINT = "{{ url_for('credit.update_account_statement_issue_day', account_id=account.id) }}";
110
- const UPDATE_ACCOUNT_STATEMENT_DUE_DAY_ENDPOINT = "{{ url_for('credit.update_account_statement_due_day', account_id=account.id) }}";
111
- </script>
112
- <script src="{{ url_for('static', filename='js/flip-card.js') }}">
113
- </script>
114
- <script type="module" src="{{ url_for('static', filename='js/update-card-status.js') }}">
115
- </script>
116
- <script type="module" src="{{ url_for('static', filename='js/update-account-statement-parameters.js') }}">
117
- </script>
118
-
119
- {% endblock %}
@@ -1,6 +1,14 @@
1
1
  {% extends "common/form_page.html" %}
2
2
 
3
3
 
4
+ {% block javascript %}
5
+
6
+ <script type="module" src="{{ url_for('static', filename='js/display-new-credit-account-inputs.js') }}">
7
+ </script>
8
+
9
+ {% endblock %}
10
+
11
+
4
12
  {% block title %}
5
13
  New Card
6
14
  {% endblock %}
@@ -17,8 +25,3 @@
17
25
  {% endif %}
18
26
 
19
27
  {% endblock %}
20
-
21
- {% block javascript %}
22
- <script type="module" src="{{ url_for('static', filename='js/display-new-credit-account-inputs.js') }}">
23
- </script>
24
- {% endblock %}
@@ -1,6 +1,49 @@
1
1
  {% extends 'layout.html' %}
2
2
 
3
3
 
4
+ {% block javascript %}
5
+
6
+ <script>
7
+ const CREDIT_ACTIVITY_RECONCILIATION_ENDPOINT = "{{ url_for('credit.reconcile_activity', statement_id=statement.id) }}";
8
+ const UPDATE_STATEMENT_DUE_DATE_ENDPOINT = "{{ url_for('credit.update_statement_due_date', statement_id=statement.id) }}";
9
+ const MAKE_PAYMENT_ENDPOINT = "{{ url_for('credit.pay_credit_card', card_id=statement.card_id, statement_id=statement.id) }}";
10
+ const EXPAND_TRANSACTION_ENDPOINT = "{{ url_for('credit.expand_transaction') }}";
11
+ const LINKED_TRANSACTION_ENDPOINT = "{{ url_for('credit.show_linked_transaction') }}";
12
+ </script>
13
+ <script>
14
+ const CATEGORY_CHART_DATA = {
15
+ labels: [
16
+ {% for label in chart_data['labels'] %}
17
+ {% if label == '' %}
18
+ "Other",
19
+ {% else %}
20
+ "{{ label }}",
21
+ {% endif %}
22
+ {% endfor %}
23
+ ],
24
+ series: [
25
+ {% for subtotal in chart_data['subtotals'] %}
26
+ {{ subtotal }},
27
+ {% endfor %}
28
+ ],
29
+ };
30
+ </script>
31
+ <script type="module" src="{{ url_for('static', filename='js/show-credit-activity-loader.js') }}">
32
+ </script>
33
+ <script type="module" src="{{ url_for('static', filename='js/update-statement-parameters.js') }}">
34
+ </script>
35
+ <script type="module" src="{{ url_for('static', filename='js/make-payment.js') }}">
36
+ </script>
37
+ <script type="module" src="{{ url_for('static', filename='js/expand-transaction.js') }}">
38
+ </script>
39
+ <script type="module" src="{{ url_for('static', filename='js/show-linked-transaction.js') }}">
40
+ </script>
41
+ <script type="module" src="{{ url_for('static', filename='js/create-category-chart.js') }}">
42
+ </script>
43
+
44
+ {% endblock %}
45
+
46
+
4
47
  {% block header %}
5
48
 
6
49
  <h1>
@@ -58,47 +101,3 @@
58
101
  </div>
59
102
 
60
103
  {% endblock %}
61
-
62
-
63
- {% block javascript %}
64
-
65
- <script>
66
- const CREDIT_ACTIVITY_RECONCILIATION_ENDPOINT = "{{ url_for('credit.reconcile_activity', statement_id=statement.id) }}";
67
- const UPDATE_STATEMENT_DUE_DATE_ENDPOINT = "{{ url_for('credit.update_statement_due_date', statement_id=statement.id) }}";
68
- const MAKE_PAYMENT_ENDPOINT = "{{ url_for('credit.pay_credit_card', card_id=statement.card_id, statement_id=statement.id) }}";
69
- const EXPAND_TRANSACTION_ENDPOINT = "{{ url_for('credit.expand_transaction') }}";
70
- const LINKED_TRANSACTION_ENDPOINT = "{{ url_for('credit.show_linked_transaction') }}";
71
- </script>
72
- <script>
73
- const CATEGORY_CHART_DATA = {
74
- labels: [
75
- {% for label in chart_data['labels'] %}
76
- {% if label == '' %}
77
- "Other",
78
- {% else %}
79
- "{{ label }}",
80
- {% endif %}
81
- {% endfor %}
82
- ],
83
- series: [
84
- {% for subtotal in chart_data['subtotals'] %}
85
- {{ subtotal }},
86
- {% endfor %}
87
- ],
88
- };
89
- </script>
90
- <script type="module" src="{{ url_for('static', filename='js/show-credit-activity-loader.js') }}">
91
- </script>
92
- <script type="module" src="{{ url_for('static', filename='js/update-statement-parameters.js') }}">
93
- </script>
94
- <script type="module" src="{{ url_for('static', filename='js/make-payment.js') }}">
95
- </script>
96
- <script type="module" src="{{ url_for('static', filename='js/expand-transaction.js') }}">
97
- </script>
98
- <script type="module" src="{{ url_for('static', filename='js/show-linked-transaction.js') }}">
99
- </script>
100
- <script type="module" src="{{ url_for('static', filename='js/create-category-chart.js') }}">
101
- </script>
102
-
103
- {% endblock %}
104
-
@@ -1,6 +1,25 @@
1
1
  {% extends 'layout.html' %}
2
2
 
3
3
 
4
+ {% block javascript %}
5
+
6
+ <script>
7
+ const CREDIT_ACTIVITY_RECONCILIATION_ENDPOINT = "{{ url_for('credit.reconcile_activity', statement_id=statement.id) }}";
8
+ const EXPAND_TRANSACTION_ENDPOINT = "{{ url_for('credit.expand_transaction') }}";
9
+ const LINKED_TRANSACTION_ENDPOINT = "{{ url_for('credit.show_linked_transaction') }}";
10
+ </script>
11
+ <script type="module" src="{{ url_for('static', filename='js/show-credit-activity-loader.js') }}">
12
+ </script>
13
+ <script type="module" src="{{ url_for('static', filename='js/highlight-discrepant-transactions.js') }}">
14
+ </script>
15
+ <script type="module" src="{{ url_for('static', filename='js/expand-transaction.js') }}">
16
+ </script>
17
+ <script type="module" src="{{ url_for('static', filename='js/show-linked-transaction.js') }}">
18
+ </script>
19
+
20
+ {% endblock %}
21
+
22
+
4
23
  {% block header %}
5
24
 
6
25
  <h1>
@@ -65,22 +84,3 @@
65
84
  </div>
66
85
 
67
86
  {% endblock %}
68
-
69
-
70
- {% block javascript %}
71
-
72
- <script>
73
- const CREDIT_ACTIVITY_RECONCILIATION_ENDPOINT = "{{ url_for('credit.reconcile_activity', statement_id=statement.id) }}";
74
- const EXPAND_TRANSACTION_ENDPOINT = "{{ url_for('credit.expand_transaction') }}";
75
- const LINKED_TRANSACTION_ENDPOINT = "{{ url_for('credit.show_linked_transaction') }}";
76
- </script>
77
- <script type="module" src="{{ url_for('static', filename='js/show-credit-activity-loader.js') }}">
78
- </script>
79
- <script type="module" src="{{ url_for('static', filename='js/highlight-discrepant-transactions.js') }}">
80
- </script>
81
- <script type="module" src="{{ url_for('static', filename='js/expand-transaction.js') }}">
82
- </script>
83
- <script type="module" src="{{ url_for('static', filename='js/show-linked-transaction.js') }}">
84
- </script>
85
-
86
- {% endblock %}
@@ -1,6 +1,19 @@
1
1
  {% extends 'layout.html' %}
2
2
 
3
3
 
4
+ {% block javascript %}
5
+
6
+ <script src="{{ url_for('static', filename='js/define-filter.js') }}" defer>
7
+ </script>
8
+ <script>
9
+ const FILTER_ENDPOINT = "{{ url_for('credit.update_statements_display') }}";
10
+ </script>
11
+ <script type="module" src="{{ url_for('static', filename='js/update-statements-display.js') }}">
12
+ </script>
13
+
14
+ {% endblock %}
15
+
16
+
4
17
  {% block left_sidebar %}
5
18
 
6
19
  <nav id="sidebar-nav-menu">
@@ -54,16 +67,3 @@
54
67
  <a name="bottom"></a>
55
68
 
56
69
  {% endblock %}
57
-
58
-
59
- {% block javascript %}
60
-
61
- <script src="{{ url_for('static', filename='js/define-filter.js') }}">
62
- </script>
63
- <script>
64
- const FILTER_ENDPOINT = "{{ url_for('credit.update_statements_display') }}";
65
- </script>
66
- <script type="module" src="{{ url_for('static', filename='js/update-statements-display.js') }}">
67
- </script>
68
-
69
- {% endblock %}
@@ -1,6 +1,15 @@
1
1
  {% extends "credit/transaction_form/transaction_form_page.html" %}
2
2
 
3
3
 
4
+ {% block javascript %}
5
+
6
+ {{ super() }}
7
+ <script type="module" src="{{ url_for('static', filename='js/use-suggested-amount.js') }}">
8
+ </script>
9
+
10
+ {% endblock %}
11
+
12
+
4
13
  {% block title %}
5
14
  Update Credit Transaction
6
15
  {% endblock %}
@@ -13,12 +22,3 @@
13
22
  {% endwith %}
14
23
 
15
24
  {% endblock %}
16
-
17
-
18
- {% block javascript %}
19
-
20
- {{ super() }}
21
- <script type="module" src="{{ url_for('static', filename='js/use-suggested-amount.js') }}">
22
- </script>
23
-
24
- {% endblock %}
@@ -2,6 +2,34 @@
2
2
  {% set full_view = True %}
3
3
 
4
4
 
5
+ {% block javascript %}
6
+
7
+ <script src="{{ url_for('static', filename='js/define-filter.js') }}" defer>
8
+ </script>
9
+ <script>
10
+ const FILTER_ENDPOINT = "{{ url_for('credit.update_transactions_display') }}";
11
+ const EXPAND_TRANSACTION_ENDPOINT = "{{ url_for('credit.expand_transaction') }}";
12
+ const LINKED_TRANSACTION_ENDPOINT = "{{ url_for('credit.show_linked_transaction') }}";
13
+ const LOAD_TRANSACTIONS_ENDPOINT = "{{ url_for('credit.load_more_transactions') }}";
14
+ const LOAD_TRANSACTIONS_SELECTORS = {
15
+ "selected_card_ids": {{ selected_card_ids }},
16
+ "sort_order": "{{ sort_order }}",
17
+ "block_count": 1,
18
+ "full_view": {{ full_view|tojson }}
19
+ }
20
+ </script>
21
+ <script type="module" src="{{ url_for('static', filename='js/update-transactions-display.js') }}">
22
+ </script>
23
+ <script type="module" src="{{ url_for('static', filename='js/load-more-transactions.js') }}">
24
+ </script>
25
+ <script type="module" src="{{ url_for('static', filename='js/expand-transaction.js') }}">
26
+ </script>
27
+ <script type="module" src="{{ url_for('static', filename='js/show-linked-transaction.js') }}">
28
+ </script>
29
+
30
+ {% endblock %}
31
+
32
+
5
33
  {% block left_sidebar %}
6
34
 
7
35
  <nav id="sidebar-nav-menu">
@@ -75,31 +103,3 @@
75
103
  <a name="bottom"></a>
76
104
 
77
105
  {% endblock %}
78
-
79
-
80
- {% block javascript %}
81
-
82
- <script src="{{ url_for('static', filename='js/define-filter.js') }}">
83
- </script>
84
- <script>
85
- const FILTER_ENDPOINT = "{{ url_for('credit.update_transactions_display') }}";
86
- const EXPAND_TRANSACTION_ENDPOINT = "{{ url_for('credit.expand_transaction') }}";
87
- const LINKED_TRANSACTION_ENDPOINT = "{{ url_for('credit.show_linked_transaction') }}";
88
- const LOAD_TRANSACTIONS_ENDPOINT = "{{ url_for('credit.load_more_transactions') }}";
89
- const LOAD_TRANSACTIONS_SELECTORS = {
90
- "selected_card_ids": {{ selected_card_ids }},
91
- "sort_order": "{{ sort_order }}",
92
- "block_count": 1,
93
- "full_view": {{ full_view|tojson }}
94
- }
95
- </script>
96
- <script type="module" src="{{ url_for('static', filename='js/update-transactions-display.js') }}">
97
- </script>
98
- <script type="module" src="{{ url_for('static', filename='js/load-more-transactions.js') }}">
99
- </script>
100
- <script type="module" src="{{ url_for('static', filename='js/expand-transaction.js') }}">
101
- </script>
102
- <script type="module" src="{{ url_for('static', filename='js/show-linked-transaction.js') }}">
103
- </script>
104
-
105
- {% endblock %}
@@ -43,7 +43,14 @@
43
43
  <script>
44
44
  window.Chartist || document.write('<script src="{{ url_for('static', filename='chartist-1.5.0.min.js') }}"><\/script>')
45
45
  </script>
46
+ <!-- Custom application JavaScript -->
47
+ <script type="module" src="{{ url_for('static', filename='js/toggle-navigation.js') }}">
48
+ </script>
49
+ {% block javascript %}
50
+ {% endblock %}
51
+
46
52
  </head>
53
+
47
54
  <body>
48
55
 
49
56
  <header id="masthead">
@@ -117,10 +124,5 @@
117
124
  </p>
118
125
  </footer>
119
126
 
120
- <script type="module" src="{{ url_for('static', filename='js/toggle-navigation.js') }}">
121
- </script>
122
- {% block javascript %}
123
- {% endblock %}
124
-
125
127
  </body>
126
128
  </html>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: monopyly
3
- Version: 1.6.0
3
+ Version: 1.6.2
4
4
  Summary: A homemade personal finance manager.
5
5
  Project-URL: Download, https://pypi.org/project/monopyly
6
6
  Project-URL: Homepage, http://monopyly.com
@@ -23,15 +23,15 @@ Classifier: Topic :: Office/Business :: Financial
23
23
  Classifier: Topic :: Office/Business :: Financial :: Accounting
24
24
  Classifier: Topic :: Office/Business :: Financial :: Spreadsheet
25
25
  Requires-Python: >=3.10
26
- Requires-Dist: dry-foundation==1.4.1
26
+ Requires-Dist: dry-foundation==1.6.2
27
27
  Requires-Dist: flask-wtf==1.2.2
28
28
  Requires-Dist: flask==3.1.2
29
- Requires-Dist: gunicorn==23.0.0
30
- Requires-Dist: markdown==3.9
29
+ Requires-Dist: gunicorn==25.0.1
30
+ Requires-Dist: markdown==3.10.1
31
31
  Requires-Dist: nltk==3.9.2
32
32
  Requires-Dist: python-dateutil==2.9.0
33
- Requires-Dist: rich==14.1.0
34
- Requires-Dist: sqlalchemy==2.0.43
33
+ Requires-Dist: rich==14.3.2
34
+ Requires-Dist: sqlalchemy==2.0.46
35
35
  Description-Content-Type: text/markdown
36
36
 
37
37
  <div id="header">