grokcore.component 4.1.1__tar.gz → 4.2__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 (142) hide show
  1. grokcore_component-4.2/.pre-commit-config.yaml +28 -0
  2. {grokcore_component-4.1.1 → grokcore_component-4.2}/CHANGES.rst +8 -0
  3. {grokcore_component-4.1.1 → grokcore_component-4.2}/CONTRIBUTING.md +1 -1
  4. {grokcore_component-4.1.1 → grokcore_component-4.2}/MANIFEST.in +1 -0
  5. {grokcore_component-4.1.1 → grokcore_component-4.2}/PKG-INFO +24 -5
  6. grokcore_component-4.2/pyproject.toml +32 -0
  7. {grokcore_component-4.1.1 → grokcore_component-4.2}/setup.cfg +1 -4
  8. {grokcore_component-4.1.1 → grokcore_component-4.2}/setup.py +5 -5
  9. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/decorators.py +2 -0
  10. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/subscriptions/multisubscriptions.py +1 -1
  11. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/subscriptions/ordered_multisubscriptions.py +2 -2
  12. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/test_grok.py +1 -1
  13. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/util.py +1 -1
  14. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore.component.egg-info/PKG-INFO +24 -5
  15. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore.component.egg-info/SOURCES.txt +2 -0
  16. grokcore_component-4.2/tox.ini +74 -0
  17. grokcore_component-4.1.1/tox.ini +0 -77
  18. {grokcore_component-4.1.1 → grokcore_component-4.2}/COPYRIGHT.txt +0 -0
  19. {grokcore_component-4.1.1 → grokcore_component-4.2}/CREDITS.rst +0 -0
  20. {grokcore_component-4.1.1 → grokcore_component-4.2}/INSTALL.txt +0 -0
  21. {grokcore_component-4.1.1 → grokcore_component-4.2}/LICENSE.txt +0 -0
  22. {grokcore_component-4.1.1 → grokcore_component-4.2}/README.rst +0 -0
  23. {grokcore_component-4.1.1 → grokcore_component-4.2}/TODO.rst +0 -0
  24. {grokcore_component-4.1.1 → grokcore_component-4.2}/buildout.cfg +0 -0
  25. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/__init__.py +0 -0
  26. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/__init__.py +0 -0
  27. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/compat.py +0 -0
  28. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/components.py +0 -0
  29. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/directive.py +0 -0
  30. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/interfaces.py +0 -0
  31. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/meta.py +0 -0
  32. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/meta.zcml +0 -0
  33. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/subscription.py +0 -0
  34. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/templates/default_display_form.pt +0 -0
  35. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/templates/default_edit_form.pt +0 -0
  36. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/testing.py +0 -0
  37. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/__init__.py +0 -0
  38. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/__init__.py +0 -0
  39. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/adapter.py +0 -0
  40. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/adapterdecorator.py +0 -0
  41. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/alphabetical.py +0 -0
  42. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/classcontext.py +0 -0
  43. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/classcontextimported.py +0 -0
  44. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/classcontextmultiple.py +0 -0
  45. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/classcontextmultiple_fixture.py +0 -0
  46. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/classorinterface.py +0 -0
  47. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/conflict.py +0 -0
  48. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/functionasargument_fixture.py +0 -0
  49. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/functioncontext.py +0 -0
  50. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/globaladapter.py +0 -0
  51. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/implementsmany.py +0 -0
  52. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/implementsnone.py +0 -0
  53. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/implementsnonemulti.py +0 -0
  54. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/importedmodel.py +0 -0
  55. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/importedmodel2.py +0 -0
  56. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/interface.py +0 -0
  57. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/interfacemodule.py +0 -0
  58. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/modulecontext.py +0 -0
  59. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/modulecontextimported.py +0 -0
  60. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/modulecontextmultiple.py +0 -0
  61. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/modulecontextmultiple_fixture.py +0 -0
  62. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/multiadapter.py +0 -0
  63. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/multiadaptsnone.py +0 -0
  64. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/multiple.py +0 -0
  65. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/namedadapter.py +0 -0
  66. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/noarguments_fixture.py +0 -0
  67. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/nomodel.py +0 -0
  68. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/oldstyleclass.py +0 -0
  69. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/order.py +0 -0
  70. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/adapter/providerdecorator.py +0 -0
  71. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/api.txt +0 -0
  72. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/directive/__init__.py +0 -0
  73. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/directive/argumenterror.py +0 -0
  74. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/directive/argumenterror_fixture.py +0 -0
  75. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/directive/multipletimes.py +0 -0
  76. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/event/__init__.py +0 -0
  77. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/event/errorconditions.py +0 -0
  78. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/event/errorconditions_fixture.py +0 -0
  79. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/event/provideHandler.py +0 -0
  80. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/event/subscriber.py +0 -0
  81. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/grok_component.txt +0 -0
  82. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/grokker/__init__.py +0 -0
  83. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/grokker/continue_scanning.py +0 -0
  84. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/grokker/continue_scanning_fixture.py +0 -0
  85. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/grokker/grokcomponent.py +0 -0
  86. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/grokker/onlyonce.py +0 -0
  87. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/grokker/onlyonce_fixture/__init__.py +0 -0
  88. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/grokker/onlyonce_fixture/_meta.py +0 -0
  89. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/grokker/onlyonce_fixture/component.py +0 -0
  90. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/grokker/onlyonce_fixture/implementation.py +0 -0
  91. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/grokker/priority.py +0 -0
  92. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/grokker/priority_fixture.py +0 -0
  93. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/inherit/__init__.py +0 -0
  94. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/inherit/inherit.py +0 -0
  95. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/inherit/inherit_fixture.py +0 -0
  96. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/order/__init__.py +0 -0
  97. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/order/arg_orderdirective.py +0 -0
  98. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/order/combined_orderdirective.py +0 -0
  99. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/order/combinednoorder_orderdirective.py +0 -0
  100. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/order/inter1.py +0 -0
  101. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/order/inter2.py +0 -0
  102. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/order/noarg_orderdirective.py +0 -0
  103. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/order/nodirective.py +0 -0
  104. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/subscriptions/__init__.py +0 -0
  105. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/subscriptions/decorator.py +0 -0
  106. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/subscriptions/multisubscriptions_no_adapts.py +0 -0
  107. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/subscriptions/multisubscriptions_no_interface.py +0 -0
  108. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/subscriptions/ordered_subscriptions.py +0 -0
  109. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/subscriptions/subscriptions.py +0 -0
  110. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/subscriptions/subscriptions_no_context.py +0 -0
  111. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/subscriptions/subscriptions_no_interface.py +0 -0
  112. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/utility/__init__.py +0 -0
  113. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/utility/conflict.py +0 -0
  114. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/utility/implementsmany.py +0 -0
  115. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/utility/implementsmany2.py +0 -0
  116. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/utility/implementsnone.py +0 -0
  117. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/utility/implementsnone2.py +0 -0
  118. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/utility/providesmany.py +0 -0
  119. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/utility/providesmany2.py +0 -0
  120. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/utility/providesnone.py +0 -0
  121. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/utility/providesnone2.py +0 -0
  122. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/utility/utility.py +0 -0
  123. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/view/__init__.py +0 -0
  124. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/view/nomodulename.py +0 -0
  125. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/view/nomodulename_fixture.py +0 -0
  126. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/zcml/__init__.py +0 -0
  127. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/zcml/conflict.py +0 -0
  128. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/zcml/conflictpkg/__init__.py +0 -0
  129. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/zcml/conflictpkg/fixture.py +0 -0
  130. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/zcml/exclude.py +0 -0
  131. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/zcml/excludemany.py +0 -0
  132. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/zcml/excludemanypkg/__init__.py +0 -0
  133. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/zcml/excludemanypkg/file_1.py +0 -0
  134. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/zcml/excludemanypkg/test_asdf.py +0 -0
  135. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/zcml/excludepkg/__init__.py +0 -0
  136. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/tests/zcml/excludepkg/sample.py +0 -0
  137. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore/component/zcml.py +0 -0
  138. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore.component.egg-info/dependency_links.txt +0 -0
  139. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore.component.egg-info/namespace_packages.txt +0 -0
  140. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore.component.egg-info/not-zip-safe +0 -0
  141. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore.component.egg-info/requires.txt +0 -0
  142. {grokcore_component-4.1.1 → grokcore_component-4.2}/src/grokcore.component.egg-info/top_level.txt +0 -0
@@ -0,0 +1,28 @@
1
+ # Generated from:
2
+ # https://github.com/zopefoundation/meta/tree/master/config/pure-python
3
+ minimum_pre_commit_version: '3.6'
4
+ repos:
5
+ - repo: https://github.com/pycqa/isort
6
+ rev: "6.0.1"
7
+ hooks:
8
+ - id: isort
9
+ - repo: https://github.com/hhatto/autopep8
10
+ rev: "v2.3.2"
11
+ hooks:
12
+ - id: autopep8
13
+ args: [--in-place, --aggressive, --aggressive]
14
+ - repo: https://github.com/asottile/pyupgrade
15
+ rev: v3.19.1
16
+ hooks:
17
+ - id: pyupgrade
18
+ args: [--py39-plus]
19
+ - repo: https://github.com/isidentical/teyit
20
+ rev: 0.4.3
21
+ hooks:
22
+ - id: teyit
23
+ - repo: https://github.com/PyCQA/flake8
24
+ rev: "7.2.0"
25
+ hooks:
26
+ - id: flake8
27
+ additional_dependencies:
28
+ - flake8-debugger == 4.1.2
@@ -1,6 +1,14 @@
1
1
  Changes
2
2
  =======
3
3
 
4
+ 4.2 (2025-06-03)
5
+ ----------------
6
+
7
+ * Add support for Python 3.12, 3.13.
8
+
9
+ * Drop support for Python 3.7, 3.8.
10
+
11
+
4
12
  4.1.1 (2025-01-28)
5
13
  ------------------
6
14
 
@@ -1,7 +1,7 @@
1
1
  <!--
2
2
  Generated from:
3
3
  https://github.com/zopefoundation/meta/tree/master/config/pure-python
4
- -->
4
+ -->
5
5
  # Contributing to zopefoundation projects
6
6
 
7
7
  The projects under the zopefoundation GitHub organization are open source and
@@ -5,6 +5,7 @@ include *.rst
5
5
  include *.txt
6
6
  include buildout.cfg
7
7
  include tox.ini
8
+ include .pre-commit-config.yaml
8
9
 
9
10
  recursive-include src *.py
10
11
  recursive-include src *.pt
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: grokcore.component
3
- Version: 4.1.1
3
+ Version: 4.2
4
4
  Summary: Grok-like configuration for basic components (adapters, utilities, subscribers)
5
5
  Home-page: https://github.com/zopefoundation/grokcore.component
6
6
  Author: Grok Team
@@ -11,14 +11,14 @@ Classifier: Development Status :: 6 - Mature
11
11
  Classifier: License :: OSI Approved :: Zope Public License
12
12
  Classifier: Operating System :: OS Independent
13
13
  Classifier: Programming Language :: Python :: 3
14
- Classifier: Programming Language :: Python :: 3.7
15
- Classifier: Programming Language :: Python :: 3.8
16
14
  Classifier: Programming Language :: Python :: 3.9
17
15
  Classifier: Programming Language :: Python :: 3.10
18
16
  Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
19
  Classifier: Programming Language :: Python :: Implementation :: CPython
20
20
  Classifier: Programming Language :: Python :: Implementation :: PyPy
21
- Requires-Python: >=3.7
21
+ Requires-Python: >=3.9
22
22
  License-File: LICENSE.txt
23
23
  Requires-Dist: setuptools
24
24
  Requires-Dist: martian>=1.2
@@ -28,6 +28,17 @@ Requires-Dist: zope.interface
28
28
  Requires-Dist: zope.testing
29
29
  Provides-Extra: test
30
30
  Requires-Dist: zope.event; extra == "test"
31
+ Dynamic: author
32
+ Dynamic: author-email
33
+ Dynamic: classifier
34
+ Dynamic: description
35
+ Dynamic: home-page
36
+ Dynamic: license
37
+ Dynamic: license-file
38
+ Dynamic: provides-extra
39
+ Dynamic: requires-dist
40
+ Dynamic: requires-python
41
+ Dynamic: summary
31
42
 
32
43
  This package provides base classes of basic component types for the
33
44
  Zope Component Architecture, as well as means for configuring and
@@ -275,6 +286,14 @@ multiple objects.
275
286
  Changes
276
287
  =======
277
288
 
289
+ 4.2 (2025-06-03)
290
+ ----------------
291
+
292
+ * Add support for Python 3.12, 3.13.
293
+
294
+ * Drop support for Python 3.7, 3.8.
295
+
296
+
278
297
  4.1.1 (2025-01-28)
279
298
  ------------------
280
299
 
@@ -0,0 +1,32 @@
1
+ # Generated from:
2
+ # https://github.com/zopefoundation/meta/tree/master/config/pure-python
3
+
4
+ [build-system]
5
+ requires = [
6
+ "setuptools == 78.1.1",
7
+ "wheel",
8
+ ]
9
+ build-backend = "setuptools.build_meta"
10
+
11
+ [tool.coverage.run]
12
+ branch = true
13
+ source = ["grokcore.component"]
14
+
15
+ [tool.coverage.report]
16
+ fail_under = 96
17
+ precision = 2
18
+ ignore_errors = true
19
+ show_missing = true
20
+ exclude_lines = [
21
+ "pragma: no cover",
22
+ "pragma: nocover",
23
+ "except ImportError:",
24
+ "raise NotImplementedError",
25
+ "if __name__ == '__main__':",
26
+ "self.fail",
27
+ "raise AssertionError",
28
+ "raise unittest.Skip",
29
+ ]
30
+
31
+ [tool.coverage.html]
32
+ directory = "parts/htmlcov"
@@ -1,6 +1,3 @@
1
- [bdist_wheel]
2
- universal = 0
3
-
4
1
  [flake8]
5
2
  doctests = 1
6
3
 
@@ -13,7 +10,7 @@ ignore =
13
10
  force_single_line = True
14
11
  combine_as_imports = True
15
12
  sections = FUTURE,STDLIB,THIRDPARTY,ZOPE,FIRSTPARTY,LOCALFOLDER
16
- known_third_party = six, docutils, pkg_resources, pytz
13
+ known_third_party = docutils, pkg_resources, pytz
17
14
  known_zope =
18
15
  known_first_party =
19
16
  default_section = ZOPE
@@ -20,7 +20,7 @@ tests_require = [
20
20
 
21
21
  setup(
22
22
  name='grokcore.component',
23
- version='4.1.1',
23
+ version='4.2',
24
24
  author='Grok Team',
25
25
  author_email='zope-dev@zope.dev',
26
26
  url='https://github.com/zopefoundation/grokcore.component',
@@ -34,21 +34,21 @@ setup(
34
34
  'License :: OSI Approved :: Zope Public License',
35
35
  'Operating System :: OS Independent',
36
36
  'Programming Language :: Python :: 3',
37
- 'Programming Language :: Python :: 3.7',
38
- 'Programming Language :: Python :: 3.8',
39
37
  'Programming Language :: Python :: 3.9',
40
38
  'Programming Language :: Python :: 3.10',
41
39
  'Programming Language :: Python :: 3.11',
40
+ 'Programming Language :: Python :: 3.12',
41
+ 'Programming Language :: Python :: 3.13',
42
42
  'Programming Language :: Python :: Implementation :: CPython',
43
43
  'Programming Language :: Python :: Implementation :: PyPy',
44
- ],
44
+ ],
45
45
 
46
46
  packages=find_packages('src'),
47
47
  package_dir={'': 'src'},
48
48
  namespace_packages=['grokcore'],
49
49
  include_package_data=True,
50
50
  zip_safe=False,
51
- python_requires='>=3.7',
51
+ python_requires='>=3.9',
52
52
  install_requires=['setuptools',
53
53
  'martian >= 1.2',
54
54
  'zope.component',
@@ -31,6 +31,7 @@ class subscribe:
31
31
  as a subscriber for the object type and the event interface.
32
32
 
33
33
  """
34
+
34
35
  def __init__(self, *args):
35
36
  self.subscribed = args
36
37
 
@@ -122,6 +123,7 @@ class provider:
122
123
  This is akin to calling directlyProvides() on the function object.
123
124
 
124
125
  """
126
+
125
127
  def __init__(self, *interfaces):
126
128
  self.interfaces = interfaces
127
129
 
@@ -71,7 +71,7 @@ class Sleep(grok.MultiSubscription):
71
71
  self.who = who
72
72
 
73
73
  def do(self):
74
- print('{} is sleeping at {}.'.format(self.who.name, self.where.name))
74
+ print(f'{self.who.name} is sleeping at {self.where.name}.')
75
75
 
76
76
 
77
77
  @grok.implementer(IActivity)
@@ -80,14 +80,14 @@ class Cleaning(DayTimeActivity):
80
80
  grok.order(99)
81
81
 
82
82
  def do(self):
83
- print('{} is cleaning the {}.'.format(self.who.name, self.where.name))
83
+ print(f'{self.who.name} is cleaning the {self.where.name}.')
84
84
 
85
85
 
86
86
  class Cooking(DayTimeActivity):
87
87
  grok.order(10)
88
88
 
89
89
  def do(self):
90
- print('{} is cooking in {}!'.format(self.who.name, self.where.name))
90
+ print(f'{self.who.name} is cooking in {self.where.name}!')
91
91
 
92
92
 
93
93
  class Gardening(DayTimeActivity):
@@ -36,7 +36,7 @@ def suiteFromPackage(name):
36
36
  optionflags=doctest.ELLIPSIS
37
37
  | doctest.NORMALIZE_WHITESPACE
38
38
  | doctest.IGNORE_EXCEPTION_DETAIL)
39
- except ImportError: # or should this accept anything?
39
+ except ModuleNotFoundError: # or should this accept anything?
40
40
  traceback.print_exc()
41
41
  raise
42
42
  suite.addTest(test)
@@ -131,7 +131,7 @@ def provideInterface(id, interface, iface_type=None, info=''):
131
131
  ['I']
132
132
  """
133
133
  if not id:
134
- id = "{}.{}".format(interface.__module__, interface.__name__)
134
+ id = f"{interface.__module__}.{interface.__name__}"
135
135
 
136
136
  if not IInterface.providedBy(interface):
137
137
  if not isinstance(interface, class_types):
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: grokcore.component
3
- Version: 4.1.1
3
+ Version: 4.2
4
4
  Summary: Grok-like configuration for basic components (adapters, utilities, subscribers)
5
5
  Home-page: https://github.com/zopefoundation/grokcore.component
6
6
  Author: Grok Team
@@ -11,14 +11,14 @@ Classifier: Development Status :: 6 - Mature
11
11
  Classifier: License :: OSI Approved :: Zope Public License
12
12
  Classifier: Operating System :: OS Independent
13
13
  Classifier: Programming Language :: Python :: 3
14
- Classifier: Programming Language :: Python :: 3.7
15
- Classifier: Programming Language :: Python :: 3.8
16
14
  Classifier: Programming Language :: Python :: 3.9
17
15
  Classifier: Programming Language :: Python :: 3.10
18
16
  Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
19
  Classifier: Programming Language :: Python :: Implementation :: CPython
20
20
  Classifier: Programming Language :: Python :: Implementation :: PyPy
21
- Requires-Python: >=3.7
21
+ Requires-Python: >=3.9
22
22
  License-File: LICENSE.txt
23
23
  Requires-Dist: setuptools
24
24
  Requires-Dist: martian>=1.2
@@ -28,6 +28,17 @@ Requires-Dist: zope.interface
28
28
  Requires-Dist: zope.testing
29
29
  Provides-Extra: test
30
30
  Requires-Dist: zope.event; extra == "test"
31
+ Dynamic: author
32
+ Dynamic: author-email
33
+ Dynamic: classifier
34
+ Dynamic: description
35
+ Dynamic: home-page
36
+ Dynamic: license
37
+ Dynamic: license-file
38
+ Dynamic: provides-extra
39
+ Dynamic: requires-dist
40
+ Dynamic: requires-python
41
+ Dynamic: summary
31
42
 
32
43
  This package provides base classes of basic component types for the
33
44
  Zope Component Architecture, as well as means for configuring and
@@ -275,6 +286,14 @@ multiple objects.
275
286
  Changes
276
287
  =======
277
288
 
289
+ 4.2 (2025-06-03)
290
+ ----------------
291
+
292
+ * Add support for Python 3.12, 3.13.
293
+
294
+ * Drop support for Python 3.7, 3.8.
295
+
296
+
278
297
  4.1.1 (2025-01-28)
279
298
  ------------------
280
299
 
@@ -1,3 +1,4 @@
1
+ .pre-commit-config.yaml
1
2
  CHANGES.rst
2
3
  CONTRIBUTING.md
3
4
  COPYRIGHT.txt
@@ -8,6 +9,7 @@ MANIFEST.in
8
9
  README.rst
9
10
  TODO.rst
10
11
  buildout.cfg
12
+ pyproject.toml
11
13
  setup.cfg
12
14
  setup.py
13
15
  tox.ini
@@ -0,0 +1,74 @@
1
+ # Generated from:
2
+ # https://github.com/zopefoundation/meta/tree/master/config/pure-python
3
+ [tox]
4
+ minversion = 3.18
5
+ envlist =
6
+ release-check
7
+ lint
8
+ py39
9
+ py310
10
+ py311
11
+ py312
12
+ py313
13
+ pypy3
14
+ coverage
15
+
16
+ [testenv]
17
+ usedevelop = true
18
+ package = wheel
19
+ wheel_build_env = .pkg
20
+ deps =
21
+ setuptools == 78.1.1
22
+ zope.testrunner
23
+ commands =
24
+ zope-testrunner --test-path=src {posargs:-vc}
25
+ extras =
26
+ test
27
+
28
+ [testenv:setuptools-latest]
29
+ basepython = python3
30
+ deps =
31
+ git+https://github.com/pypa/setuptools.git\#egg=setuptools
32
+ zope.testrunner
33
+
34
+ [testenv:release-check]
35
+ description = ensure that the distribution is ready to release
36
+ basepython = python3
37
+ skip_install = true
38
+ deps =
39
+ setuptools == 78.1.1
40
+ wheel
41
+ twine
42
+ build
43
+ check-manifest
44
+ check-python-versions >= 0.20.0
45
+ wheel
46
+ commands_pre =
47
+ commands =
48
+ check-manifest
49
+ check-python-versions --only setup.py,tox.ini,.github/workflows/tests.yml
50
+ python -m build --sdist --no-isolation
51
+ twine check dist/*
52
+
53
+ [testenv:lint]
54
+ description = This env runs all linters configured in .pre-commit-config.yaml
55
+ basepython = python3
56
+ skip_install = true
57
+ deps =
58
+ pre-commit
59
+ commands_pre =
60
+ commands =
61
+ pre-commit run --all-files --show-diff-on-failure
62
+
63
+ [testenv:coverage]
64
+ basepython = python3
65
+ allowlist_externals =
66
+ mkdir
67
+ deps =
68
+ coverage[toml]
69
+ zope.testrunner
70
+ commands =
71
+ mkdir -p {toxinidir}/parts/htmlcov
72
+ coverage run -m zope.testrunner --test-path=src {posargs:-vc}
73
+ coverage html
74
+ coverage report
@@ -1,77 +0,0 @@
1
- # Generated from:
2
- # https://github.com/zopefoundation/meta/tree/master/config/pure-python
3
- [tox]
4
- minversion = 3.18
5
- envlist =
6
- lint
7
- py37
8
- py38
9
- py39
10
- py310
11
- py311
12
- pypy3
13
- coverage
14
-
15
- [testenv]
16
- usedevelop = true
17
- deps =
18
- zope.testrunner
19
- commands =
20
- zope-testrunner --test-path=src {posargs:-vc}
21
- extras =
22
- test
23
-
24
- [testenv:lint]
25
- basepython = python3
26
- skip_install = true
27
- commands =
28
- isort --check-only --diff {toxinidir}/src {toxinidir}/setup.py
29
- flake8 src setup.py
30
- check-manifest
31
- check-python-versions
32
- deps =
33
- check-manifest
34
- check-python-versions >= 0.19.1
35
- wheel
36
- flake8
37
- isort
38
-
39
- [testenv:isort-apply]
40
- basepython = python3
41
- skip_install = true
42
- commands_pre =
43
- deps =
44
- isort
45
- commands =
46
- isort {toxinidir}/src {toxinidir}/setup.py []
47
-
48
- [testenv:coverage]
49
- basepython = python3
50
- allowlist_externals =
51
- mkdir
52
- deps =
53
- coverage
54
- zope.testrunner
55
- commands =
56
- mkdir -p {toxinidir}/parts/htmlcov
57
- coverage run -m zope.testrunner --test-path=src {posargs:-vc}
58
- coverage html --ignore-errors
59
- coverage report --ignore-errors --show-missing --fail-under=96
60
-
61
- [coverage:run]
62
- branch = True
63
- source = grokcore.component
64
-
65
- [coverage:report]
66
- precision = 2
67
- exclude_lines =
68
- pragma: no cover
69
- pragma: nocover
70
- except ImportError:
71
- raise NotImplementedError
72
- if __name__ == '__main__':
73
- self.fail
74
- raise AssertionError
75
-
76
- [coverage:html]
77
- directory = parts/htmlcov