pythonic-fp-gadgets 4.0.3__tar.gz → 4.1.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.
Files changed (56) hide show
  1. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/.github/workflows/static.yml +11 -5
  2. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/.gitignore +1 -3
  3. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/CHANGELOG.rst +19 -0
  4. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/PKG-INFO +7 -7
  5. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/README.rst +4 -4
  6. pythonic_fp_gadgets-4.1.0/docs/Makefile +78 -0
  7. pythonic_fp_gadgets-4.1.0/docs/gen_conf.py +110 -0
  8. pythonic_fp_gadgets-4.1.0/docs/source/_static/custom.css +3 -0
  9. {pythonic_fp_gadgets-4.0.3/docs/source/docs → pythonic_fp_gadgets-4.1.0/docs/source/api}/functions/first_common_ancestor.rst +1 -1
  10. {pythonic_fp_gadgets-4.0.3/docs/source/docs → pythonic_fp_gadgets-4.1.0/docs/source/api}/functions/iterate_over_arguments.rst +1 -1
  11. {pythonic_fp_gadgets-4.0.3/docs/source/docs → pythonic_fp_gadgets-4.1.0/docs/source/api}/sentinels/index.rst +4 -2
  12. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/docs/source/changelog.rst +1 -1
  13. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/docs/source/description.rst +3 -2
  14. pythonic_fp_gadgets-4.0.3/docs/index_release.rst → pythonic_fp_gadgets-4.1.0/docs/source/index.rst +3 -3
  15. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/docs/source/releases.rst +5 -1
  16. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/pyproject.toml +6 -4
  17. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/src/pythonic_fp/gadgets/__init__.py +19 -18
  18. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/src/pythonic_fp/gadgets/__init__.pyi +2 -2
  19. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/src/pythonic_fp/gadgets/box.py +90 -45
  20. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/src/pythonic_fp/gadgets/sentinels/__init__.py +14 -3
  21. pythonic_fp_gadgets-4.1.0/src/pythonic_fp/gadgets/sentinels/__init__.pyi +0 -0
  22. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/src/pythonic_fp/gadgets/sentinels/flavored.py +49 -32
  23. pythonic_fp_gadgets-4.1.0/src/pythonic_fp/gadgets/sentinels/novalue.py +187 -0
  24. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/src/pythonic_fp/gadgets/sentinels/novalue.pyi +2 -0
  25. pythonic_fp_gadgets-4.1.0/src/pythonic_fp/gadgets/wrap.py +270 -0
  26. pythonic_fp_gadgets-4.0.3/docs/Makefile +0 -47
  27. pythonic_fp_gadgets-4.0.3/docs/build/index.html +0 -44
  28. pythonic_fp_gadgets-4.0.3/docs/build/style.css +0 -44
  29. pythonic_fp_gadgets-4.0.3/docs/conf_devel.py +0 -61
  30. pythonic_fp_gadgets-4.0.3/docs/conf_release.py +0 -61
  31. pythonic_fp_gadgets-4.0.3/docs/index_devel.rst +0 -30
  32. pythonic_fp_gadgets-4.0.3/src/pythonic_fp/gadgets/sentinels/novalue.py +0 -128
  33. pythonic_fp_gadgets-4.0.3/src/pythonic_fp/gadgets/wrap.py +0 -204
  34. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/LICENSE +0 -0
  35. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/docs/requirements.txt +0 -0
  36. /pythonic_fp_gadgets-4.0.3/docs/build/.nojekyll → /pythonic_fp_gadgets-4.1.0/docs/source/_static/.gitkeep +0 -0
  37. /pythonic_fp_gadgets-4.0.3/src/pythonic_fp/gadgets/py.typed → /pythonic_fp_gadgets-4.1.0/docs/source/_templates/.gitkeep +0 -0
  38. {pythonic_fp_gadgets-4.0.3/docs/source/docs → pythonic_fp_gadgets-4.1.0/docs/source/api}/box.rst +0 -0
  39. {pythonic_fp_gadgets-4.0.3/docs/source/docs → pythonic_fp_gadgets-4.1.0/docs/source/api}/functions/index.rst +0 -0
  40. {pythonic_fp_gadgets-4.0.3/docs/source/docs → pythonic_fp_gadgets-4.1.0/docs/source/api}/index.rst +0 -0
  41. {pythonic_fp_gadgets-4.0.3/docs/source/docs → pythonic_fp_gadgets-4.1.0/docs/source/api}/sentinels/flavored.rst +0 -0
  42. {pythonic_fp_gadgets-4.0.3/docs/source/docs → pythonic_fp_gadgets-4.1.0/docs/source/api}/sentinels/novalue.rst +0 -0
  43. {pythonic_fp_gadgets-4.0.3/docs/source/docs → pythonic_fp_gadgets-4.1.0/docs/source/api}/wrap.rst +0 -0
  44. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/docs/source/usage.rst +0 -0
  45. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/src/pythonic_fp/gadgets/box.pyi +0 -0
  46. /pythonic_fp_gadgets-4.0.3/src/pythonic_fp/gadgets/sentinels/__init__.pyi → /pythonic_fp_gadgets-4.1.0/src/pythonic_fp/gadgets/py.typed +0 -0
  47. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/src/pythonic_fp/gadgets/sentinels/flavored.pyi +0 -0
  48. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/src/pythonic_fp/gadgets/wrap.pyi +0 -0
  49. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/tests/sentinels/test_novalue.py +0 -0
  50. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/tests/sentinels/test_sentinel_hidden_implemetation_detail.py +0 -0
  51. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/tests/sentinels/test_sentinel_with_functions.py +0 -0
  52. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/tests/test_box.py +0 -0
  53. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/tests/test_first_common_ancestor.py +0 -0
  54. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/tests/test_hwrap.py +0 -0
  55. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/tests/test_iterate_over_arguments.py +0 -0
  56. {pythonic_fp_gadgets-4.0.3 → pythonic_fp_gadgets-4.1.0}/tests/test_wrap.py +0 -0
@@ -5,6 +5,11 @@ on:
5
5
  branches: ["main"]
6
6
  workflow_dispatch:
7
7
 
8
+ env:
9
+ RELEASE: '4.1.0'
10
+ DEVEL: '4.1.1'
11
+ PYTHON: '3.14'
12
+
8
13
  permissions:
9
14
  contents: read
10
15
  pages: write
@@ -17,6 +22,9 @@ concurrency:
17
22
  jobs:
18
23
  deploy:
19
24
  runs-on: ubuntu-latest
25
+ environment:
26
+ name: github-pages
27
+ url: ${{ steps.deployment.outputs.page_url }}
20
28
  steps:
21
29
  - name: Checkout
22
30
  uses: actions/checkout@v6
@@ -24,7 +32,7 @@ jobs:
24
32
  - name: Select Python
25
33
  uses: actions/setup-python@v6
26
34
  with:
27
- python-version: '3.14'
35
+ python-version: ${{ env.PYTHON }}
28
36
 
29
37
  - name: Install Sphinx Dependencies
30
38
  run: |
@@ -34,15 +42,13 @@ jobs:
34
42
  - name: Build Release Docs
35
43
  run: |
36
44
  pip install pythonic-fp-gadgets
37
- cp docs/index_release.rst docs/source/index.rst
38
- cp docs/conf_release.py docs/source/conf.py
45
+ docs/gen_conf.py release ${{ env.RELEASE }} Gadgets gadgets > docs/source/conf.py
39
46
  sphinx-build -M html docs/source docs/build/release
40
47
 
41
48
  - name: Build Development Docs
42
49
  run: |
43
50
  pip install -e .
44
- cp docs/index_devel.rst docs/source/index.rst
45
- cp docs/conf_devel.py docs/source/conf.py
51
+ docs/gen_conf.py devel ${{ env.DEVEL }} Gadgets gadgets > docs/source/conf.py
46
52
  sphinx-build -M html docs/source docs/build/development
47
53
 
48
54
  - name: Setup Pages
@@ -1,10 +1,8 @@
1
1
  # Minimal version - only add to when necessary
2
2
  **/__pycache__/
3
3
  dist/
4
- docs/build/release/
5
- docs/build/development/
4
+ docs/build/
6
5
  docs/source/conf.py
7
- docs/source/index.rst
8
6
  **/.dmypy.json
9
7
  **/.mypy_cache/
10
8
  **/.pytest_cache/
@@ -17,6 +17,25 @@ See `Semantic Versioning 2.0.0 <https://semver.org>`_.
17
17
  Releases and Important Milestones
18
18
  ---------------------------------
19
19
 
20
+ PyPI 4.1.0 - 2026-05-12
21
+ ~~~~~~~~~~~~~~~~~~~~~~~
22
+
23
+ - documentation now in maintenance mode
24
+ - development status now "4 - Beta"
25
+ - added a few missing methods
26
+
27
+ PyPI 4.0.4 - 2026-04-26
28
+ ~~~~~~~~~~~~~~~~~~~~~~~
29
+
30
+ Much docstring work for sentinels. Need to push now to fix
31
+ broken links on PyPI before going into documentation maintenance.
32
+
33
+ Development Status Reappraisal - 2026-05-05
34
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
35
+
36
+ Maintainer appraised the Development Status for
37
+ pythonic-fp-gadgets to be "3 - Alpha".
38
+
20
39
  PyPI 4.0.3 - 2026-04-26
21
40
  ~~~~~~~~~~~~~~~~~~~~~~~
22
41
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pythonic-fp-gadgets
3
- Version: 4.0.3
3
+ Version: 4.1.0
4
4
  Summary: Gadgets
5
5
  Keywords: gadgets
6
6
  Author-email: "Geoffrey R. Scheller" <geoffrey@scheller.com>
@@ -17,8 +17,8 @@ License-File: LICENSE
17
17
  Requires-Dist: pytest>=8.4.1 ; extra == "test"
18
18
  Requires-Dist: pythonic-fp-circulararray>=6.0.4 ; extra == "test"
19
19
  Project-URL: Changelog, https://github.com/grscheller/pythonic-fp-gadgets/blob/main/CHANGELOG.rst
20
- Project-URL: Documentation, https://grscheller.github.io/pythonic-fp-gadgets/
21
- Project-URL: Homepage, https://grscheller.github.io/pythonic-fp/homepage/html/
20
+ Project-URL: Documentation, https://grscheller.github.io/pythonic-fp/projects/gadgets.html
21
+ Project-URL: Homepage, https://grscheller.github.io/pythonic-fp/
22
22
  Project-URL: Source, https://github.com/grscheller/pythonic-fp-gadgets
23
23
  Provides-Extra: test
24
24
 
@@ -35,22 +35,22 @@ outside the Python Standard Library.
35
35
  - Gadgets
36
36
 
37
37
  - single item box
38
- - wrapped (hashable) references
38
+ - immutable wrapped (hashable) references
39
39
  - function returning iterator of its arguments
40
40
  - function to find the latest common ancestor of two classes
41
41
  - sentinel values
42
42
 
43
43
  Part of the
44
44
  `pythonic-fp
45
- <https://grscheller.github.io/pythonic-fp/homepage/html/>`_
45
+ <https://grscheller.github.io/pythonic-fp/>`_
46
46
  PyPI projects.
47
47
 
48
48
  Documentation
49
49
  -------------
50
50
 
51
- Documentation for this project is hosted on
51
+ Documentation and other links for this project are hosted on
52
52
  `GitHub Pages
53
- <https://grscheller.github.io/pythonic-fp-gadgets>`_.
53
+ <https://grscheller.github.io/pythonic-fp/projects/gadgets.html>`_.
54
54
 
55
55
  Copyright and License
56
56
  ---------------------
@@ -11,22 +11,22 @@ outside the Python Standard Library.
11
11
  - Gadgets
12
12
 
13
13
  - single item box
14
- - wrapped (hashable) references
14
+ - immutable wrapped (hashable) references
15
15
  - function returning iterator of its arguments
16
16
  - function to find the latest common ancestor of two classes
17
17
  - sentinel values
18
18
 
19
19
  Part of the
20
20
  `pythonic-fp
21
- <https://grscheller.github.io/pythonic-fp/homepage/html/>`_
21
+ <https://grscheller.github.io/pythonic-fp/>`_
22
22
  PyPI projects.
23
23
 
24
24
  Documentation
25
25
  -------------
26
26
 
27
- Documentation for this project is hosted on
27
+ Documentation and other links for this project are hosted on
28
28
  `GitHub Pages
29
- <https://grscheller.github.io/pythonic-fp-gadgets>`_.
29
+ <https://grscheller.github.io/pythonic-fp/projects/gadgets.html>`_.
30
30
 
31
31
  Copyright and License
32
32
  ---------------------
@@ -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 = Gadgets
7
+ PYPI_NAME = gadgets
8
+ RELEASE_VERSION = 4.1.0
9
+ DEVEL_VERSION = 4.1.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,3 @@
1
+ dl.field-list > dt {
2
+ text-transform: none !important;
3
+ }
@@ -1,4 +1,4 @@
1
- first_common_ancestor
1
+ First common ancestor
2
2
  ---------------------
3
3
 
4
4
  .. autofunction:: pythonic_fp.gadgets.first_common_ancestor
@@ -1,4 +1,4 @@
1
- iterate_over_arguments
1
+ Iterate over arguments
2
2
  ----------------------
3
3
 
4
4
  .. autofunction:: pythonic_fp.gadgets.iterate_over_arguments
@@ -2,11 +2,13 @@ sentinels
2
2
  =========
3
3
 
4
4
  .. automodule:: pythonic_fp.gadgets.sentinels
5
- :synopsis:
5
+ :no-members:
6
+ :ignore-module-all:
7
+ :no-index:
6
8
 
7
9
  .. toctree::
8
10
  :caption: Sentinel Values
11
+ :maxdepth: 2
9
12
 
10
13
  novalue
11
14
  flavored
12
-
@@ -1,4 +1,4 @@
1
- changelog
1
+ Changelog
2
2
  =========
3
3
 
4
4
  Changelog for the
@@ -2,6 +2,7 @@ Description
2
2
  -----------
3
3
 
4
4
  .. automodule:: pythonic_fp.gadgets
5
- :synopsis:
6
- :noindex:
5
+ :no-members:
6
+ :ignore-module-all:
7
+ :no-index:
7
8
 
@@ -2,12 +2,12 @@ pythonic-fp-gadgets
2
2
  ===================
3
3
 
4
4
  Project
5
- `pythonic-fp-gadgets <https://pypi.org/project/pythonic-fp-gadgets/>`_
5
+ `Pythonic FP - Gadgets <https://pypi.org/project/pythonic-fp-gadgets/>`_
6
6
  one of the
7
7
  `Pythonic FP <https://grscheller.github.io/pythonic-fp/>`_
8
8
  PyPI projects.
9
9
 
10
- **PyPI 4.0.2 release**
10
+ |RELEASE_STRING|
11
11
 
12
12
  .. toctree::
13
13
  :caption: Overview
@@ -27,4 +27,4 @@ PyPI projects.
27
27
  :caption: API Documentation
28
28
  :maxdepth: 1
29
29
 
30
- docs/index
30
+ api/index
@@ -8,7 +8,11 @@ PyPI releases
8
8
  +=====================================================================================+==============+
9
9
  | `development <https://grscheller.github.io/pythonic-fp-gadgets/development/html/>`_ | |
10
10
  +-------------------------------------------------------------------------------------+--------------+
11
- | `v4.0.2 <https://grscheller.github.io/pythonic-fp-gadgets/release/html/>`_ | 2026-01-08 |
11
+ | `v4.0.4 <https://grscheller.github.io/pythonic-fp-gadgets/release/html/>`_ | 2026-05-12 |
12
+ +-------------------------------------------------------------------------------------+--------------+
13
+ | v4.0.3 | 2026-04-26 |
14
+ +-------------------------------------------------------------------------------------+--------------+
15
+ | v4.0.2 | 2026-01-08 |
12
16
  +-------------------------------------------------------------------------------------+--------------+
13
17
  | v4.0.1 | 2025-12-02 |
14
18
  +-------------------------------------------------------------------------------------+--------------+
@@ -4,10 +4,12 @@ build-backend = "flit_core.buildapi"
4
4
 
5
5
  [project]
6
6
  name = "pythonic-fp-gadgets"
7
- version = "4.0.3"
7
+ version = "4.1.0"
8
8
  readme = "README.rst"
9
9
  requires-python = ">=3.13"
10
- authors = [{ name = "Geoffrey R. Scheller", email = "geoffrey@scheller.com" }]
10
+ authors = [
11
+ { name = "Geoffrey R. Scheller", email = "geoffrey@scheller.com" },
12
+ ]
11
13
  keywords = [
12
14
  "gadgets",
13
15
  ]
@@ -25,8 +27,8 @@ dynamic = ["description"]
25
27
 
26
28
  [project.urls]
27
29
  Changelog = "https://github.com/grscheller/pythonic-fp-gadgets/blob/main/CHANGELOG.rst"
28
- Documentation = "https://grscheller.github.io/pythonic-fp-gadgets/"
29
- Homepage = "https://grscheller.github.io/pythonic-fp/homepage/html/"
30
+ Documentation = "https://grscheller.github.io/pythonic-fp/projects/gadgets.html"
31
+ Homepage = "https://grscheller.github.io/pythonic-fp/"
30
32
  Source = "https://github.com/grscheller/pythonic-fp-gadgets"
31
33
 
32
34
  [project.optional-dependencies]
@@ -14,14 +14,15 @@
14
14
 
15
15
  """
16
16
  Gadgets
17
- -------
17
+ =======
18
18
 
19
19
  .. admonition:: Collection of mostly self-contained functions and classes
20
20
 
21
21
  - Functions and classes which could go multiple places or have
22
22
  no good place to go.
23
23
  - Self-contained with minimal dependencies.
24
- - No pythonic_fp dependencies at all.
24
+
25
+ - No pythonic_fp dependencies at all.
25
26
 
26
27
  """
27
28
 
@@ -42,22 +43,22 @@ def first_common_ancestor(cls1: type, cls2: type) -> type:
42
43
  Find the least upper bound in the inheritance graph
43
44
  of two classes.
44
45
 
45
- .. warning::
46
+ :param cls1: A class in the inheritance hierarchy.
47
+ :param cls2: A class in the inheritance hierarchy.
48
+ :returns: First common ancestor based on ``getmro`` order.
49
+ :raises TypeError: Raised when no common ancestor exists, or when
50
+ not caught when raised by ``inspect.getmro``.
46
51
 
47
- This function can fail with a TypeError. Some error messages
48
- seen are
52
+ .. warning::
49
53
 
50
- - multiple bases have instance lay-out conflict
51
- - type 'bool' is not an acceptable base type
54
+ This function can fail with a TypeError. Some error messages
55
+ seen are
52
56
 
53
- This happens frequently when the function is given
54
- Python builtin types or in multiple inheritance situations.
57
+ - multiple bases have instance lay-out conflict
58
+ - type 'bool' is not an acceptable base type
55
59
 
56
- :param cls1: A class in the inheritance hierarchy.
57
- :param cls2: A class in the inheritance hierarchy.
58
- :returns: First common ancestor based on ``getmro`` order.
59
- :raises TypeError: Raised when no common ancestor exists, or when
60
- not caught when raised by ``inspect.getmro``.
60
+ This happens frequently when the function is given
61
+ Python builtin types or in multiple inheritance situations.
61
62
 
62
63
  """
63
64
  if issubclass(cls1, cls2):
@@ -77,12 +78,12 @@ def iterate_over_arguments[A](*args: A) -> Iterator[A]:
77
78
 
78
79
  Function returning an iterator over its arguments.
79
80
 
80
- .. note::
81
+ :param args: Objects to iterate over.
82
+ :returns: An iterator of the function's arguments.
81
83
 
82
- Does not create a Python object to iterate over.
84
+ .. note::
83
85
 
84
- :param args: Objects to iterate over.
85
- :returns: An iterator of the functions arguments.
86
+ Does not create a Python object to iterate over.
86
87
 
87
88
  """
88
89
  yield from args
@@ -1,6 +1,6 @@
1
1
  from collections.abc import Iterator
2
2
 
3
- __all__ = ['iterate_over_arguments', 'first_common_ancestor']
3
+ __all__ = ['first_common_ancestor', 'iterate_over_arguments']
4
4
 
5
- def iterate_over_arguments[A](*args: A) -> Iterator[A]: ...
6
5
  def first_common_ancestor(cls1: type, cls2: type) -> type: ...
6
+ def iterate_over_arguments[A](*args: A) -> Iterator[A]: ...