pythonic-fp-fptools 5.2.0__tar.gz → 5.4.0__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.
- pythonic_fp_fptools-5.4.0/.github/workflows/static.yml +64 -0
- {pythonic_fp_fptools-5.2.0 → pythonic_fp_fptools-5.4.0}/.gitignore +2 -0
- {pythonic_fp_fptools-5.2.0 → pythonic_fp_fptools-5.4.0}/CHANGELOG.rst +56 -2
- {pythonic_fp_fptools-5.2.0 → pythonic_fp_fptools-5.4.0}/PKG-INFO +14 -14
- {pythonic_fp_fptools-5.2.0 → pythonic_fp_fptools-5.4.0}/README.rst +5 -5
- pythonic_fp_fptools-5.4.0/docs/Makefile +78 -0
- pythonic_fp_fptools-5.4.0/docs/gen_conf.py +110 -0
- pythonic_fp_fptools-5.4.0/docs/requirements.txt +2 -0
- pythonic_fp_fptools-5.4.0/docs/source/_static/custom.css +3 -0
- pythonic_fp_fptools-5.4.0/docs/source/api/function.rst +6 -0
- pythonic_fp_fptools-5.4.0/docs/source/api/index.rst +20 -0
- pythonic_fp_fptools-5.4.0/docs/source/api/lazy.rst +6 -0
- pythonic_fp_fptools-5.4.0/docs/source/api/monads/either.rst +6 -0
- pythonic_fp_fptools-5.4.0/docs/source/api/monads/index.rst +10 -0
- pythonic_fp_fptools-5.4.0/docs/source/api/monads/maybe.rst +6 -0
- pythonic_fp_fptools-5.4.0/docs/source/api/monads/state.rst +6 -0
- pythonic_fp_fptools-5.4.0/docs/source/changelog.rst +7 -0
- pythonic_fp_fptools-5.4.0/docs/source/description.rst +8 -0
- pythonic_fp_fptools-5.4.0/docs/source/index.rst +30 -0
- pythonic_fp_fptools-5.4.0/docs/source/releases.rst +28 -0
- pythonic_fp_fptools-5.4.0/docs/source/usage.rst +29 -0
- {pythonic_fp_fptools-5.2.0 → pythonic_fp_fptools-5.4.0}/pyproject.toml +24 -20
- pythonic_fp_fptools-5.4.0/src/pythonic_fp/fptools/__init__.py +33 -0
- pythonic_fp_fptools-5.4.0/src/pythonic_fp/fptools/__init__.pyi +0 -0
- pythonic_fp_fptools-5.4.0/src/pythonic_fp/fptools/either.py +488 -0
- {pythonic_fp_fptools-5.2.0 → pythonic_fp_fptools-5.4.0}/src/pythonic_fp/fptools/either.pyi +10 -10
- {pythonic_fp_fptools-5.2.0 → pythonic_fp_fptools-5.4.0}/src/pythonic_fp/fptools/function.py +43 -23
- {pythonic_fp_fptools-5.2.0 → pythonic_fp_fptools-5.4.0}/src/pythonic_fp/fptools/lazy.py +81 -48
- pythonic_fp_fptools-5.4.0/src/pythonic_fp/fptools/maybe.py +261 -0
- {pythonic_fp_fptools-5.2.0 → pythonic_fp_fptools-5.4.0}/src/pythonic_fp/fptools/maybe.pyi +3 -1
- pythonic_fp_fptools-5.4.0/src/pythonic_fp/fptools/py.typed +0 -0
- pythonic_fp_fptools-5.4.0/src/pythonic_fp/fptools/state.py +257 -0
- pythonic_fp_fptools-5.2.0/src/pythonic_fp/fptools/__init__.py +0 -40
- pythonic_fp_fptools-5.2.0/src/pythonic_fp/fptools/either.py +0 -314
- pythonic_fp_fptools-5.2.0/src/pythonic_fp/fptools/maybe.py +0 -137
- pythonic_fp_fptools-5.2.0/src/pythonic_fp/fptools/state.py +0 -120
- {pythonic_fp_fptools-5.2.0 → pythonic_fp_fptools-5.4.0}/LICENSE +0 -0
- /pythonic_fp_fptools-5.2.0/src/pythonic_fp/fptools/__init__.pyi → /pythonic_fp_fptools-5.4.0/docs/source/_static/.gitkeep +0 -0
- /pythonic_fp_fptools-5.2.0/src/pythonic_fp/fptools/py.typed → /pythonic_fp_fptools-5.4.0/docs/source/_templates/.gitkeep +0 -0
- {pythonic_fp_fptools-5.2.0 → pythonic_fp_fptools-5.4.0}/src/pythonic_fp/fptools/function.pyi +0 -0
- {pythonic_fp_fptools-5.2.0 → pythonic_fp_fptools-5.4.0}/src/pythonic_fp/fptools/lazy.pyi +0 -0
- {pythonic_fp_fptools-5.2.0 → pythonic_fp_fptools-5.4.0}/src/pythonic_fp/fptools/state.pyi +0 -0
- {pythonic_fp_fptools-5.2.0 → pythonic_fp_fptools-5.4.0}/tests/either/test_either.py +0 -0
- {pythonic_fp_fptools-5.2.0 → pythonic_fp_fptools-5.4.0}/tests/either/test_sequence_either.py +0 -0
- {pythonic_fp_fptools-5.2.0 → pythonic_fp_fptools-5.4.0}/tests/either/test_str_repr_either.py +0 -0
- {pythonic_fp_fptools-5.2.0 → pythonic_fp_fptools-5.4.0}/tests/function/test_function.py +0 -0
- {pythonic_fp_fptools-5.2.0 → pythonic_fp_fptools-5.4.0}/tests/lazy/test_lazy.py +0 -0
- {pythonic_fp_fptools-5.2.0 → pythonic_fp_fptools-5.4.0}/tests/maybe/maybe.py +0 -0
- {pythonic_fp_fptools-5.2.0 → pythonic_fp_fptools-5.4.0}/tests/maybe/test_sequence_maybe.py +0 -0
- {pythonic_fp_fptools-5.2.0 → pythonic_fp_fptools-5.4.0}/tests/maybe/test_str_repr_maybe.py +0 -0
- {pythonic_fp_fptools-5.2.0 → pythonic_fp_fptools-5.4.0}/tests/state/test_state.py +0 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
name: Build and Deploy Furo Themed Sphinx Documentation
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: ["main"]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
env:
|
|
9
|
+
RELEASE: '5.4.0'
|
|
10
|
+
DEVEL: '5.4.1'
|
|
11
|
+
PYTHON: '3.14'
|
|
12
|
+
|
|
13
|
+
permissions:
|
|
14
|
+
contents: read
|
|
15
|
+
pages: write
|
|
16
|
+
id-token: write
|
|
17
|
+
|
|
18
|
+
concurrency:
|
|
19
|
+
group: "pages"
|
|
20
|
+
cancel-in-progress: false
|
|
21
|
+
|
|
22
|
+
jobs:
|
|
23
|
+
deploy:
|
|
24
|
+
runs-on: ubuntu-latest
|
|
25
|
+
environment:
|
|
26
|
+
name: github-pages
|
|
27
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
28
|
+
steps:
|
|
29
|
+
- name: Checkout
|
|
30
|
+
uses: actions/checkout@v6
|
|
31
|
+
|
|
32
|
+
- name: Select Python
|
|
33
|
+
uses: actions/setup-python@v6
|
|
34
|
+
with:
|
|
35
|
+
python-version: '3.14'
|
|
36
|
+
|
|
37
|
+
- name: Install Sphinx Dependencies
|
|
38
|
+
run: |
|
|
39
|
+
pip install -r docs/requirements.txt
|
|
40
|
+
sudo apt-get install -y graphviz
|
|
41
|
+
|
|
42
|
+
- name: Build Release Docs
|
|
43
|
+
run: |
|
|
44
|
+
pip install pythonic-fp-fptools
|
|
45
|
+
docs/gen_conf.py release ${{ env.RELEASE }} "FP Tools" fptools > docs/source/conf.py
|
|
46
|
+
sphinx-build -M html docs/source docs/build/release
|
|
47
|
+
|
|
48
|
+
- name: Build Development Docs
|
|
49
|
+
run: |
|
|
50
|
+
pip install -e .
|
|
51
|
+
docs/gen_conf.py devel ${{ env.DEVEL }} "FP Tools" fptools > docs/source/conf.py
|
|
52
|
+
sphinx-build -M html docs/source docs/build/development
|
|
53
|
+
|
|
54
|
+
- name: Setup Pages
|
|
55
|
+
uses: actions/configure-pages@v6
|
|
56
|
+
|
|
57
|
+
- name: Upload Artifact
|
|
58
|
+
uses: actions/upload-pages-artifact@v5
|
|
59
|
+
with:
|
|
60
|
+
path: docs/build
|
|
61
|
+
|
|
62
|
+
- name: Deploy to GitHub Pages
|
|
63
|
+
uses: actions/deploy-pages@v5
|
|
64
|
+
id: deployment
|
|
@@ -17,16 +17,46 @@ See `Semantic Versioning 2.0.0 <https://semver.org>`_.
|
|
|
17
17
|
Releases and Important Milestones
|
|
18
18
|
---------------------------------
|
|
19
19
|
|
|
20
|
+
PyPI 5.4.0 - 2026-05-16
|
|
21
|
+
~~~~~~~~~~~~~~~~~~~~~~~
|
|
22
|
+
|
|
23
|
+
EitherFlag changes.
|
|
24
|
+
|
|
25
|
+
- bugfix: fixed ``__repr__`` method to properly work with ``eval()``
|
|
26
|
+
- API addition: added a ``__str__`` method
|
|
27
|
+
|
|
28
|
+
Documentation now in maintenance mode.
|
|
29
|
+
|
|
30
|
+
PyPI 5.3.0 - 2026-05-09
|
|
31
|
+
~~~~~~~~~~~~~~~~~~~~~~~
|
|
32
|
+
|
|
33
|
+
First PyPI release in over a year with substantive code changes.
|
|
34
|
+
|
|
35
|
+
- Finally happy with the Sphinx/Furo based documentation.
|
|
36
|
+
- Fixed errors with MayBe and Either hashing.
|
|
37
|
+
- This will fix the PyPI link issues.
|
|
38
|
+
- Next release will be 6.0.0 when I move the monads to
|
|
39
|
+
their own submodule.
|
|
40
|
+
|
|
41
|
+
Development Status Reappraisal - 2026-05-05
|
|
42
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
43
|
+
|
|
44
|
+
Maintainer reappraised the Development Status for
|
|
45
|
+
pythonic-fp-fptools to be ``"5 - Production/Stable"``.
|
|
46
|
+
|
|
47
|
+
|
|
20
48
|
PyPI 5.2.0 - 2026-01-13
|
|
21
49
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
22
50
|
|
|
23
51
|
Added function.compose back on 2025-12-04. Docstring updates for Sphinx.
|
|
24
52
|
|
|
53
|
+
|
|
25
54
|
PyPI 5.1.2 - 2025-09-28
|
|
26
55
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
27
56
|
|
|
28
57
|
Patch bump for pythonic-fp PyPI coordinated release 3.3.3.
|
|
29
58
|
|
|
59
|
+
|
|
30
60
|
PyPI 5.1.1 - 2025-09-09
|
|
31
61
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
32
62
|
|
|
@@ -43,10 +73,11 @@ made it a MINOR release due to introducing .pyi files.
|
|
|
43
73
|
PyPI 5.0.0 - 2025-08-02
|
|
44
74
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
45
75
|
|
|
46
|
-
Coordinated entire project pythonic-fp PyPI
|
|
76
|
+
Coordinated moving entire project to the pythonic-fp PyPI name.
|
|
47
77
|
|
|
48
78
|
- moved maybe.py and xor.py from containers, renamed xor.py -> either.py.
|
|
49
79
|
|
|
80
|
+
|
|
50
81
|
PyPI 4.0.0 - 2025-07-13
|
|
51
82
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
52
83
|
|
|
@@ -58,16 +89,21 @@ Dropped developer status to Beta
|
|
|
58
89
|
TODO: After next Boring Math (bm) deployment, I should be able to archive
|
|
59
90
|
my dtools namespace repos
|
|
60
91
|
|
|
92
|
+
|
|
61
93
|
PyPI 3.0.0 - 2025-07-06
|
|
62
94
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
63
95
|
|
|
64
96
|
First PyPI release as ``pythonic-fp.fptools``
|
|
65
97
|
|
|
66
|
-
- dropping dtools namespace name because there is a repo by that name
|
|
98
|
+
- dropping dtools namespace name because there is a repo by that name
|
|
99
|
+
on PyPI.
|
|
100
|
+
|
|
67
101
|
|
|
68
102
|
PyPI 2.0.0 - 2025-05-22
|
|
69
103
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
70
104
|
|
|
105
|
+
One more release as dtools.fp.
|
|
106
|
+
|
|
71
107
|
- Moved dtools.fp.err_handling to the dtools.containers PyPI project
|
|
72
108
|
|
|
73
109
|
- Moved class MayBe -> module dtools.containers.maybe
|
|
@@ -76,6 +112,7 @@ PyPI 2.0.0 - 2025-05-22
|
|
|
76
112
|
|
|
77
113
|
- will import dtools.fp.lazy directly for this functionality
|
|
78
114
|
|
|
115
|
+
|
|
79
116
|
PyPI 1.7.0 - 2025-04-22
|
|
80
117
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
81
118
|
|
|
@@ -86,6 +123,7 @@ Last PyPI release as dtools.fp
|
|
|
86
123
|
- docstring changes
|
|
87
124
|
- pyproject.toml standardization
|
|
88
125
|
|
|
126
|
+
|
|
89
127
|
PyPI 1.6.1.0 - 2025-04-17
|
|
90
128
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
91
129
|
|
|
@@ -101,11 +139,13 @@ PyPI 1.6.1.0 - 2025-04-17
|
|
|
101
139
|
|
|
102
140
|
- Also noticed MB and XOR still have camelCase APIs
|
|
103
141
|
|
|
142
|
+
|
|
104
143
|
PyPI 1.6.0 - 2025-04-07
|
|
105
144
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
106
145
|
|
|
107
146
|
- typing improvements
|
|
108
147
|
|
|
148
|
+
|
|
109
149
|
PyPI 1.4.0 - 2025-03-16
|
|
110
150
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
111
151
|
|
|
@@ -125,11 +165,13 @@ PyPI 1.4.0 - 2025-03-16
|
|
|
125
165
|
|
|
126
166
|
- avoid using these methods in pure code
|
|
127
167
|
|
|
168
|
+
|
|
128
169
|
PyPI 1.3.1 - 2025-02-05
|
|
129
170
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
130
171
|
|
|
131
172
|
- added class method sequence to class State
|
|
132
173
|
|
|
174
|
+
|
|
133
175
|
PyPI 1.3.0 - 2025-01-17
|
|
134
176
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
135
177
|
|
|
@@ -140,6 +182,7 @@ Repo name changes.
|
|
|
140
182
|
- GitHub: fp -> dtools-fp
|
|
141
183
|
- PyPI: grscheller.fp -> dtools.fp
|
|
142
184
|
|
|
185
|
+
|
|
143
186
|
PyPI 1.2.0 - 2025-01-04
|
|
144
187
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
145
188
|
|
|
@@ -147,6 +190,7 @@ PyPI 1.2.0 - 2025-01-04
|
|
|
147
190
|
- renamed flatmap methods to bind
|
|
148
191
|
- minor MB and XOR updates/corrections
|
|
149
192
|
|
|
193
|
+
|
|
150
194
|
PyPI 1.1.0 - 2024-11-18
|
|
151
195
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
152
196
|
|
|
@@ -155,6 +199,7 @@ Added fp.function module.
|
|
|
155
199
|
- combine and partially apply functions as first class objects
|
|
156
200
|
- some tests may be lacking
|
|
157
201
|
|
|
202
|
+
|
|
158
203
|
Version 1.0.2.0 - 2024-10-20 (Devel environment only)
|
|
159
204
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
160
205
|
|
|
@@ -172,6 +217,7 @@ Version 1.0.2.0 - 2024-10-20 (Devel environment only)
|
|
|
172
217
|
|
|
173
218
|
- will redo docs in docs repo
|
|
174
219
|
|
|
220
|
+
|
|
175
221
|
PyPI 1.0.1 - 2024-10-20
|
|
176
222
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
177
223
|
|
|
@@ -183,6 +229,7 @@ PyPI 1.0.1 - 2024-10-20
|
|
|
183
229
|
PyPI 1.0.0 - 2024-10-18
|
|
184
230
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
185
231
|
|
|
232
|
+
|
|
186
233
|
Decided to make this release first stable release.
|
|
187
234
|
|
|
188
235
|
- renamed module fp.woException to fp.err_handling
|
|
@@ -191,11 +238,13 @@ Decided to make this release first stable release.
|
|
|
191
238
|
|
|
192
239
|
- pytest improvements based on pytest documentation
|
|
193
240
|
|
|
241
|
+
|
|
194
242
|
PyPI 0.4.0 - 2024-10-03
|
|
195
243
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
196
244
|
|
|
197
245
|
Long overdue PyPI release.
|
|
198
246
|
|
|
247
|
+
|
|
199
248
|
Version 0.3.5.1 - 2024-10-03 (Devel environment only)
|
|
200
249
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
201
250
|
|
|
@@ -214,6 +263,7 @@ New module ``grscheller.fp.nothingness`` which contains
|
|
|
214
263
|
|
|
215
264
|
- prefer class ``MB`` to represent a missing value in client code
|
|
216
265
|
|
|
266
|
+
|
|
217
267
|
PyPI 0.3.3 - 2024-08-25
|
|
218
268
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
219
269
|
|
|
@@ -226,6 +276,7 @@ PyPI 0.3.3 - 2024-08-25
|
|
|
226
276
|
- makeRight(self, right: R|Nada=nada) -> XOR\[L, R\]:
|
|
227
277
|
- swapRight(self, right: R) -> XOR\[L, R\]:
|
|
228
278
|
|
|
279
|
+
|
|
229
280
|
PyPI 0.3.0 - 2024-08-17
|
|
230
281
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
231
282
|
|
|
@@ -233,6 +284,7 @@ Class Nothing re-added but renamed class Nada.
|
|
|
233
284
|
|
|
234
285
|
Version grscheller.untyped.nothing for more strictly typed code.
|
|
235
286
|
|
|
287
|
+
|
|
236
288
|
PyPI 0.2.1 - 2024-07-26
|
|
237
289
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
238
290
|
|
|
@@ -241,6 +293,7 @@ PyPI grscheller.fp package release v0.2.1
|
|
|
241
293
|
- forgot to update README.md on last PyPI release
|
|
242
294
|
- simplified README.md to help alleviate this mistake in the future
|
|
243
295
|
|
|
296
|
+
|
|
244
297
|
PyPI 0.2.0 - 2024-07-26
|
|
245
298
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
246
299
|
|
|
@@ -253,6 +306,7 @@ PyPI 0.2.0 - 2024-07-26
|
|
|
253
306
|
|
|
254
307
|
- renamed ``fp.wo_exception`` to ``fp.woException``
|
|
255
308
|
|
|
309
|
+
|
|
256
310
|
PyPI 0.1.0 - 2024-07-11
|
|
257
311
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
258
312
|
|
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pythonic-fp-fptools
|
|
3
|
-
Version: 5.
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 5.4.0
|
|
4
|
+
Summary: .. admonition:: Functional programming tools for Python
|
|
5
5
|
Keywords: either,fp,functional,functional programming,lazy,maybe,monad,non-strict
|
|
6
6
|
Author-email: "Geoffrey R. Scheller" <geoffrey@scheller.com>
|
|
7
|
-
Requires-Python: >=3.
|
|
7
|
+
Requires-Python: >=3.13
|
|
8
8
|
Description-Content-Type: text/x-rst
|
|
9
|
-
Classifier: Development Status ::
|
|
9
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
10
10
|
Classifier: Framework :: Pytest
|
|
11
11
|
Classifier: Intended Audience :: Developers
|
|
12
12
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
13
13
|
Classifier: Operating System :: OS Independent
|
|
14
|
-
Classifier: Programming Language :: Python :: 3.
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
15
15
|
Classifier: Typing :: Typed
|
|
16
16
|
License-File: LICENSE
|
|
17
|
-
Requires-Dist: pythonic-fp-booleans>=
|
|
18
|
-
Requires-Dist: pythonic-fp-circulararray>=6.0.
|
|
17
|
+
Requires-Dist: pythonic-fp-booleans>=3.0.2
|
|
18
|
+
Requires-Dist: pythonic-fp-circulararray>=6.0.4
|
|
19
19
|
Requires-Dist: pythonic-fp-gadgets>=4.0.2
|
|
20
20
|
Requires-Dist: pytest>=8.4.1 ; extra == "test"
|
|
21
21
|
Requires-Dist: pythonic-fp-containers>=4.0.1 ; extra == "test"
|
|
22
22
|
Requires-Dist: pythonic-fp-iterables>=5.1.3 ; extra == "test"
|
|
23
23
|
Requires-Dist: pythonic-fp-queues>=5.1.1 ; extra == "test"
|
|
24
24
|
Project-URL: Changelog, https://github.com/grscheller/pythonic-fp-fptools/blob/main/CHANGELOG.rst
|
|
25
|
-
Project-URL: Documentation, https://grscheller.github.io/pythonic-fp/fptools
|
|
26
|
-
Project-URL: Homepage, https://grscheller.github.io/pythonic-fp/
|
|
25
|
+
Project-URL: Documentation, https://grscheller.github.io/pythonic-fp/projects/fptools.html
|
|
26
|
+
Project-URL: Homepage, https://grscheller.github.io/pythonic-fp/
|
|
27
27
|
Project-URL: Source, https://github.com/grscheller/pythonic-fp-fptools
|
|
28
28
|
Provides-Extra: test
|
|
29
29
|
|
|
@@ -32,7 +32,7 @@ Pythonic FP - Functional tools
|
|
|
32
32
|
|
|
33
33
|
PyPI project
|
|
34
34
|
`pythonic-fp.fptools
|
|
35
|
-
<https://pypi.org/project/pythonic-fp
|
|
35
|
+
<https://pypi.org/project/pythonic-fp-fptools>`_.
|
|
36
36
|
|
|
37
37
|
Tools to aid with functional programming in Python while still
|
|
38
38
|
endeavoring to be Pythonic.
|
|
@@ -53,19 +53,19 @@ endeavoring to be Pythonic.
|
|
|
53
53
|
|
|
54
54
|
Part of the
|
|
55
55
|
`pythonic-fp
|
|
56
|
-
<https://grscheller.github.io/pythonic-fp
|
|
56
|
+
<https://grscheller.github.io/pythonic-fp/>`_
|
|
57
57
|
PyPI projects.
|
|
58
58
|
|
|
59
59
|
Documentation
|
|
60
60
|
-------------
|
|
61
61
|
|
|
62
|
-
Documentation for this project
|
|
62
|
+
Documentation and other links for this project are hosted on
|
|
63
63
|
`GitHub Pages
|
|
64
|
-
<https://grscheller.github.io/pythonic-fp/fptools>`_.
|
|
64
|
+
<https://grscheller.github.io/pythonic-fp/projects/fptools.html>`_.
|
|
65
65
|
|
|
66
66
|
Copyright and License
|
|
67
67
|
---------------------
|
|
68
68
|
|
|
69
|
-
Copyright (c) 2023-
|
|
69
|
+
Copyright (c) 2023-2026 Geoffrey R. Scheller. Licensed under the Apache
|
|
70
70
|
License, Version 2.0. See the LICENSE file for details.
|
|
71
71
|
|
|
@@ -3,7 +3,7 @@ Pythonic FP - Functional tools
|
|
|
3
3
|
|
|
4
4
|
PyPI project
|
|
5
5
|
`pythonic-fp.fptools
|
|
6
|
-
<https://pypi.org/project/pythonic-fp
|
|
6
|
+
<https://pypi.org/project/pythonic-fp-fptools>`_.
|
|
7
7
|
|
|
8
8
|
Tools to aid with functional programming in Python while still
|
|
9
9
|
endeavoring to be Pythonic.
|
|
@@ -24,18 +24,18 @@ endeavoring to be Pythonic.
|
|
|
24
24
|
|
|
25
25
|
Part of the
|
|
26
26
|
`pythonic-fp
|
|
27
|
-
<https://grscheller.github.io/pythonic-fp
|
|
27
|
+
<https://grscheller.github.io/pythonic-fp/>`_
|
|
28
28
|
PyPI projects.
|
|
29
29
|
|
|
30
30
|
Documentation
|
|
31
31
|
-------------
|
|
32
32
|
|
|
33
|
-
Documentation for this project
|
|
33
|
+
Documentation and other links for this project are hosted on
|
|
34
34
|
`GitHub Pages
|
|
35
|
-
<https://grscheller.github.io/pythonic-fp/fptools>`_.
|
|
35
|
+
<https://grscheller.github.io/pythonic-fp/projects/fptools.html>`_.
|
|
36
36
|
|
|
37
37
|
Copyright and License
|
|
38
38
|
---------------------
|
|
39
39
|
|
|
40
|
-
Copyright (c) 2023-
|
|
40
|
+
Copyright (c) 2023-2026 Geoffrey R. Scheller. Licensed under the Apache
|
|
41
41
|
License, Version 2.0. See the LICENSE file for details.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Makefile for Sphinx documentation
|
|
2
|
+
|
|
3
|
+
# Last and future releases
|
|
4
|
+
# - former needs to agree with PyPI
|
|
5
|
+
# - later needs to agree with pyproject.toml
|
|
6
|
+
PROJECT_NAME = FP Tools Array
|
|
7
|
+
PYPI_NAME = fptools
|
|
8
|
+
RELEASE_VERSION = 5.4.0
|
|
9
|
+
DEVEL_VERSION = 5.4.1
|
|
10
|
+
CUSTOM_VERSION = 0.0.0
|
|
11
|
+
|
|
12
|
+
SPHINXOPTS ?=
|
|
13
|
+
SPHINXBUILD ?= sphinx-build
|
|
14
|
+
SOURCEDIR = source
|
|
15
|
+
BUILDDIR = build
|
|
16
|
+
|
|
17
|
+
STATICDIR = source/_static
|
|
18
|
+
TEMPLATEDIR = source/_templates
|
|
19
|
+
|
|
20
|
+
# Put help first so that "make" without argument is like "make help".
|
|
21
|
+
help:
|
|
22
|
+
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS)
|
|
23
|
+
|
|
24
|
+
clean_source:
|
|
25
|
+
@rm -f "$(SOURCEDIR)"/conf.py
|
|
26
|
+
|
|
27
|
+
clean_devel:
|
|
28
|
+
@rm -rf "$(BUILDDIR)"/development
|
|
29
|
+
|
|
30
|
+
clean_release:
|
|
31
|
+
@rm -rf "$(BUILDDIR)"/release
|
|
32
|
+
|
|
33
|
+
clean_custom:
|
|
34
|
+
@rm -rf "$(BUILDDIR)"/custom
|
|
35
|
+
|
|
36
|
+
clean: clean_devel clean_release clean_custom clean_source
|
|
37
|
+
@rm -rf $(BUILDDIR)
|
|
38
|
+
@echo Removed all doc build artifacts.
|
|
39
|
+
|
|
40
|
+
setup_devel: clean_devel
|
|
41
|
+
@./gen_conf.py devel "$(DEVEL_VERSION)" "$(PROJECT_NAME)" "$(PYPI_NAME)" > "$(SOURCEDIR)"/conf.py
|
|
42
|
+
|
|
43
|
+
setup_release: clean_release
|
|
44
|
+
@./gen_conf.py release "$(RELEASE_VERSION)" "$(PROJECT_NAME)" "$(PYPI_NAME)" > "$(SOURCEDIR)"/conf.py
|
|
45
|
+
|
|
46
|
+
setup_custom: clean_custom
|
|
47
|
+
@./gen_conf.py custom "$(CUSTOM_VERSION)" "$(PROJECT_NAME)" "$(PYPI_NAME)" > "$(SOURCEDIR)"/conf.py
|
|
48
|
+
|
|
49
|
+
setup_redo: clean_custom
|
|
50
|
+
@echo Redoing custom build with a possibly reeditted conf.py
|
|
51
|
+
@./gen_conf.py redo "" "" ""
|
|
52
|
+
|
|
53
|
+
# Build development labeled html docs.
|
|
54
|
+
devel: Makefile setup_devel
|
|
55
|
+
@$(SPHINXBUILD) -M html "$(SOURCEDIR)" "$(BUILDDIR)"/development $(SPHINXOPTS)
|
|
56
|
+
|
|
57
|
+
# Build release labeled html docs.
|
|
58
|
+
release: Makefile setup_release
|
|
59
|
+
@$(SPHINXBUILD) -M html "$(SOURCEDIR)" "$(BUILDDIR)"/release $(SPHINXOPTS)
|
|
60
|
+
|
|
61
|
+
# Build custom labeled html docs.
|
|
62
|
+
custom: Makefile setup_custom
|
|
63
|
+
@$(SPHINXBUILD) -M html "$(SOURCEDIR)" "$(BUILDDIR)"/custom $(SPHINXOPTS)
|
|
64
|
+
|
|
65
|
+
# Build HTML docs with previous generated (possibly hand edited) source/conf.py,
|
|
66
|
+
# put results in $(BUILDDIR)/custom.
|
|
67
|
+
redo: Makefile setup_redo
|
|
68
|
+
@$(SPHINXBUILD) -M html "$(SOURCEDIR)" "$(BUILDDIR)"/custom $(SPHINXOPTS)
|
|
69
|
+
|
|
70
|
+
# Catch-all target: route all unknown targets to Sphinx and save to $(BUILDDIR)/custom.
|
|
71
|
+
# Reuse a previously generated source/conf.py.
|
|
72
|
+
%: Makefile setup_redo
|
|
73
|
+
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)"/custom $(SPHINXOPTS)
|
|
74
|
+
|
|
75
|
+
.PHONY: help Makefile
|
|
76
|
+
.PHONY: setup_devel setup_release setup_custom
|
|
77
|
+
.PHONY: devel release
|
|
78
|
+
.PHONY: clean_source clean_devel clean_release clean_custom clean
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# Generate conf.py Sphinx configuration executable
|
|
3
|
+
|
|
4
|
+
import sys
|
|
5
|
+
import os
|
|
6
|
+
|
|
7
|
+
project_prefix = 'Pythonic FP'
|
|
8
|
+
pypi_prefix = 'pythonic-fp'
|
|
9
|
+
author = 'Geoffrey R. Scheller'
|
|
10
|
+
copyright = f'2023-2026, {author}'
|
|
11
|
+
|
|
12
|
+
args = sys.argv[1:]
|
|
13
|
+
num_args = len(args)
|
|
14
|
+
|
|
15
|
+
if num_args == 4:
|
|
16
|
+
build_type, version, project_name, pypi_name = args
|
|
17
|
+
project = project_prefix + ' - ' + project_name
|
|
18
|
+
pypi_project_repo = pypi_prefix + '-' + pypi_name
|
|
19
|
+
project_url_rst = f'`{project} <https://pypi.org/project/{pypi_project_repo}/>`_'
|
|
20
|
+
homepage_url_rst = f'`{project_prefix} <https://grscheller.github.io/{pypi_prefix}/>`_'
|
|
21
|
+
|
|
22
|
+
else:
|
|
23
|
+
sys.exit('Error: gen_conf.py takes exactly 4 arguments')
|
|
24
|
+
|
|
25
|
+
match build_type:
|
|
26
|
+
case 'custom':
|
|
27
|
+
release = f'{version}'
|
|
28
|
+
release_string = f'**Custom PyPI Non-release version {release}**'
|
|
29
|
+
case 'devel':
|
|
30
|
+
release = f'{version}'
|
|
31
|
+
release_string = f'**Proposed PyPI release version {release}**'
|
|
32
|
+
case 'release':
|
|
33
|
+
release = f'{version}'
|
|
34
|
+
release_string = f'**PyPI release version {release}**'
|
|
35
|
+
case 'redo':
|
|
36
|
+
if not os.path.isfile('source/conf.py'):
|
|
37
|
+
sys.exit('Error: cannot redo without source/conf.py')
|
|
38
|
+
sys.exit()
|
|
39
|
+
case _:
|
|
40
|
+
sys.exit(f'Error: unknown built_type {build_type} given')
|
|
41
|
+
|
|
42
|
+
print(f'''# Generated conf.py Sphinx configuration executable
|
|
43
|
+
|
|
44
|
+
from typing import Any
|
|
45
|
+
from sphinx.application import Sphinx
|
|
46
|
+
|
|
47
|
+
project = '{project}'
|
|
48
|
+
author = '{author}'
|
|
49
|
+
copyright = '{copyright}'
|
|
50
|
+
release = '{release}'
|
|
51
|
+
release_string = '{release_string}'
|
|
52
|
+
|
|
53
|
+
def skip_abc_methods(
|
|
54
|
+
app: Any, what: str, name: str, obj: Any, skip: bool, options: Any
|
|
55
|
+
) -> bool:
|
|
56
|
+
if name in [
|
|
57
|
+
'__init_subclass__',
|
|
58
|
+
'__subclasshook__',
|
|
59
|
+
'__class_getitem__',
|
|
60
|
+
'__weakref__',
|
|
61
|
+
]:
|
|
62
|
+
return True # Skip these members
|
|
63
|
+
return skip
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def setup(app: Sphinx) -> None:
|
|
67
|
+
app.connect('autodoc-skip-member', skip_abc_methods)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
extensions = [
|
|
71
|
+
'sphinx.ext.autodoc',
|
|
72
|
+
'sphinx.ext.graphviz',
|
|
73
|
+
]
|
|
74
|
+
|
|
75
|
+
autodoc_default_options = {{
|
|
76
|
+
'members': True,
|
|
77
|
+
'private-members': True,
|
|
78
|
+
'special-members': True,
|
|
79
|
+
'inherited-members': False,
|
|
80
|
+
'show-inheritance': True,
|
|
81
|
+
}}
|
|
82
|
+
autodoc_member_order = 'bysource'
|
|
83
|
+
autoclass_content = 'class'
|
|
84
|
+
autodoc_class_signature = 'separated'
|
|
85
|
+
autodoc_typehints_format = 'short'
|
|
86
|
+
autodoc_use_type_comments = True
|
|
87
|
+
autodoc_docstring_signature = False
|
|
88
|
+
autodoc_preserve_defaults = True
|
|
89
|
+
autodoc_warningiserror = False
|
|
90
|
+
|
|
91
|
+
templates_path = ['_templates']
|
|
92
|
+
exclude_patterns: list[str] = []
|
|
93
|
+
|
|
94
|
+
html_theme_options = {{
|
|
95
|
+
'light_css_variables': {{
|
|
96
|
+
'color-link--visited': 'var(--color-link)',
|
|
97
|
+
}},
|
|
98
|
+
'dark_css_variables': {{
|
|
99
|
+
'color-link--visited': 'var(--color-link)',
|
|
100
|
+
}},
|
|
101
|
+
}}
|
|
102
|
+
html_theme = 'furo'
|
|
103
|
+
html_static_path = ['_static']
|
|
104
|
+
html_css_files = ['custom.css']
|
|
105
|
+
|
|
106
|
+
rst_epilog = """
|
|
107
|
+
.. |RELEASE_STRING| replace:: {release_string}
|
|
108
|
+
|
|
109
|
+
"""
|
|
110
|
+
''')
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
FP Tools
|
|
2
|
+
========
|
|
3
|
+
|
|
4
|
+
.. toctree::
|
|
5
|
+
:caption: Function manipulation
|
|
6
|
+
:maxdepth: 1
|
|
7
|
+
|
|
8
|
+
function
|
|
9
|
+
|
|
10
|
+
.. toctree::
|
|
11
|
+
:caption: Lazy function evaluation
|
|
12
|
+
:maxdepth: 1
|
|
13
|
+
|
|
14
|
+
lazy
|
|
15
|
+
|
|
16
|
+
.. toctree::
|
|
17
|
+
:caption: Monads
|
|
18
|
+
:maxdepth: 2
|
|
19
|
+
|
|
20
|
+
monads/index
|