zope.hookable 6.0__cp310-cp310-macosx_11_0_arm64.whl → 8.0__cp310-cp310-macosx_11_0_arm64.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.
Potentially problematic release.
This version of zope.hookable might be problematic. Click here for more details.
- zope/hookable/__init__.py +8 -4
- zope/hookable/_zope_hookable.c +191 -170
- zope/hookable/_zope_hookable.cpython-310-darwin.so +0 -0
- zope/hookable/tests/test_hookable.py +6 -1
- {zope.hookable-6.0.dist-info → zope_hookable-8.0.dist-info}/METADATA +50 -15
- zope_hookable-8.0.dist-info/RECORD +11 -0
- {zope.hookable-6.0.dist-info → zope_hookable-8.0.dist-info}/WHEEL +1 -1
- zope.hookable-6.0-py3.10-nspkg.pth +0 -1
- zope.hookable-6.0.dist-info/RECORD +0 -13
- zope.hookable-6.0.dist-info/namespace_packages.txt +0 -1
- {zope.hookable-6.0.dist-info → zope_hookable-8.0.dist-info/licenses}/LICENSE.txt +0 -0
- {zope.hookable-6.0.dist-info → zope_hookable-8.0.dist-info}/top_level.txt +0 -0
zope/hookable/__init__.py
CHANGED
|
@@ -17,8 +17,12 @@ import os
|
|
|
17
17
|
import platform
|
|
18
18
|
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
# Keep these two flags separate: we want the `_PURE_PYTHON` one
|
|
21
|
+
# to represent that the flag is explicitly set to '1' in the environment,
|
|
22
|
+
# since our 'tox.ini' sets it to '0' for its environments which expect
|
|
23
|
+
# to test the C extension.
|
|
24
|
+
_PYPY_OR_JAVA = platform.python_implementation() in ('PyPy', 'Jython')
|
|
25
|
+
_PURE_PYTHON = os.environ.get('PURE_PYTHON') == '1'
|
|
22
26
|
|
|
23
27
|
|
|
24
28
|
class _py_hookable:
|
|
@@ -66,10 +70,10 @@ class _py_hookable:
|
|
|
66
70
|
|
|
67
71
|
try:
|
|
68
72
|
from zope.hookable._zope_hookable import hookable as _c_hookable
|
|
69
|
-
except
|
|
73
|
+
except ModuleNotFoundError: # pragma: no cover
|
|
70
74
|
_c_hookable = None
|
|
71
75
|
|
|
72
|
-
if _PURE_PYTHON or _c_hookable is None:
|
|
76
|
+
if _PYPY_OR_JAVA or _PURE_PYTHON or _c_hookable is None:
|
|
73
77
|
hookable = _py_hookable
|
|
74
78
|
else: # pragma: no cover
|
|
75
79
|
hookable = _c_hookable
|
zope/hookable/_zope_hookable.c
CHANGED
|
@@ -12,145 +12,113 @@
|
|
|
12
12
|
#
|
|
13
13
|
############################################################################*/
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
*/
|
|
15
|
+
static char module__doc__[] = (
|
|
16
|
+
"Provide an efficient implementation for hookable objects"
|
|
17
|
+
);
|
|
20
18
|
|
|
21
19
|
#include "Python.h"
|
|
22
20
|
#include "structmember.h"
|
|
23
21
|
|
|
24
|
-
typedef struct
|
|
22
|
+
typedef struct
|
|
23
|
+
{
|
|
25
24
|
PyObject_HEAD
|
|
26
|
-
PyObject
|
|
27
|
-
PyObject
|
|
25
|
+
PyObject* original;
|
|
26
|
+
PyObject* implementation;
|
|
28
27
|
} hookable;
|
|
29
28
|
|
|
30
29
|
static int
|
|
31
|
-
hookable_init(hookable
|
|
30
|
+
hookable_init(hookable* self, PyObject* args, PyObject* kwds)
|
|
32
31
|
{
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
32
|
+
static char* kwlist[] = { "implementation", NULL };
|
|
33
|
+
PyObject* implementation;
|
|
34
|
+
|
|
35
|
+
if (!PyArg_ParseTupleAndKeywords(
|
|
36
|
+
args, kwds, "O:hookable", kwlist, &implementation))
|
|
37
|
+
return -1;
|
|
38
|
+
|
|
39
|
+
/* Both 'self->original' and 'self->implementation' are originally
|
|
40
|
+
* set to the passed-in 'implementation', hence the need for
|
|
41
|
+
* two increfs.
|
|
42
|
+
*/
|
|
43
|
+
Py_INCREF(implementation);
|
|
44
|
+
Py_XDECREF(self->original);
|
|
45
|
+
self->original = implementation;
|
|
46
|
+
|
|
47
|
+
Py_INCREF(implementation);
|
|
48
|
+
Py_XDECREF(self->implementation);
|
|
49
|
+
self->implementation = implementation;
|
|
50
|
+
|
|
51
|
+
return 0;
|
|
48
52
|
}
|
|
49
53
|
|
|
50
54
|
static int
|
|
51
|
-
hookable_traverse(hookable
|
|
55
|
+
hookable_traverse(hookable* self, visitproc visit, void* arg)
|
|
52
56
|
{
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
return -1;
|
|
60
|
-
|
|
61
|
-
return 0;
|
|
57
|
+
#if PY_VERSION_HEX >= 0x03090000
|
|
58
|
+
Py_VISIT(Py_TYPE(self));
|
|
59
|
+
#endif
|
|
60
|
+
Py_VISIT(self->implementation);
|
|
61
|
+
Py_VISIT(self->original);
|
|
62
|
+
return 0;
|
|
62
63
|
}
|
|
63
64
|
|
|
64
65
|
static int
|
|
65
|
-
hookable_clear(hookable
|
|
66
|
+
hookable_clear(hookable* self)
|
|
66
67
|
{
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
Py_XDECREF(self->implementation);
|
|
70
|
-
self->implementation = NULL;
|
|
71
|
-
return 0;
|
|
72
|
-
}
|
|
68
|
+
Py_XDECREF(self->original);
|
|
69
|
+
self->original = NULL;
|
|
73
70
|
|
|
71
|
+
Py_XDECREF(self->implementation);
|
|
72
|
+
self->implementation = NULL;
|
|
74
73
|
|
|
75
|
-
|
|
76
|
-
hookable_dealloc(hookable *self)
|
|
77
|
-
{
|
|
78
|
-
PyObject_GC_UnTrack((PyObject *)self);
|
|
79
|
-
Py_XDECREF(self->old);
|
|
80
|
-
Py_XDECREF(self->implementation);
|
|
81
|
-
Py_TYPE(self)->tp_free((PyObject*)self);
|
|
74
|
+
return 0;
|
|
82
75
|
}
|
|
83
76
|
|
|
84
|
-
static
|
|
85
|
-
|
|
77
|
+
static void
|
|
78
|
+
hookable_dealloc(hookable* self)
|
|
86
79
|
{
|
|
87
|
-
|
|
80
|
+
PyObject_GC_UnTrack((PyObject*)self);
|
|
81
|
+
PyTypeObject* tp = Py_TYPE(self);
|
|
88
82
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
self->implementation = implementation;
|
|
83
|
+
Py_XDECREF(self->original);
|
|
84
|
+
Py_XDECREF(self->implementation);
|
|
92
85
|
|
|
93
|
-
|
|
94
|
-
{
|
|
95
|
-
Py_INCREF(Py_None);
|
|
96
|
-
return Py_None;
|
|
97
|
-
}
|
|
86
|
+
tp->tp_free((PyObject*)self);
|
|
98
87
|
|
|
99
|
-
|
|
88
|
+
/* heap types must decref their type when dealloc'ed */
|
|
89
|
+
Py_DECREF(tp);
|
|
100
90
|
}
|
|
101
91
|
|
|
102
|
-
static PyObject
|
|
103
|
-
|
|
92
|
+
static PyObject*
|
|
93
|
+
hookable_call(hookable* self, PyObject* args, PyObject* kw)
|
|
104
94
|
{
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
self->implementation = self->old;
|
|
108
|
-
Py_INCREF(Py_None);
|
|
109
|
-
return Py_None;
|
|
110
|
-
}
|
|
95
|
+
if (self->implementation != NULL)
|
|
96
|
+
return PyObject_Call(self->implementation, args, kw);
|
|
111
97
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
"Set the hook implementation for the hookable object"},
|
|
115
|
-
{"reset", (PyCFunction)hookable_reset, METH_NOARGS,
|
|
116
|
-
"Reset the hook to the original value"},
|
|
117
|
-
{NULL, NULL} /* sentinel */
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
static PyObject *
|
|
122
|
-
hookable_call(hookable *self, PyObject *args, PyObject *kw)
|
|
123
|
-
{
|
|
124
|
-
if (self->implementation != NULL)
|
|
125
|
-
return PyObject_Call(self->implementation, args, kw);
|
|
126
|
-
PyErr_SetString(PyExc_TypeError, "Hookable has no implementation");
|
|
127
|
-
return NULL;
|
|
98
|
+
PyErr_SetString(PyExc_TypeError, "Hookable has no implementation");
|
|
99
|
+
return NULL;
|
|
128
100
|
}
|
|
129
101
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
hookable_getattro(hookable *self, PyObject *name)
|
|
102
|
+
static PyObject*
|
|
103
|
+
hookable_getattro(hookable* self, PyObject* name)
|
|
133
104
|
{
|
|
134
|
-
PyObject
|
|
135
|
-
const char
|
|
105
|
+
PyObject* result = NULL;
|
|
106
|
+
const char* name_as_string;
|
|
136
107
|
int maybe_special_name;
|
|
137
108
|
|
|
138
109
|
name_as_string = PyUnicode_AsUTF8(name);
|
|
139
|
-
|
|
140
|
-
if (name_as_string == NULL) {
|
|
141
|
-
return NULL;
|
|
142
|
-
}
|
|
110
|
+
if (name_as_string == NULL) { return NULL; }
|
|
143
111
|
|
|
144
112
|
maybe_special_name = name_as_string[0] == '_' && name_as_string[1] == '_';
|
|
145
113
|
|
|
146
114
|
if (maybe_special_name) {
|
|
147
115
|
/* pass through __doc__ to the original implementation */
|
|
148
116
|
if (strcmp("__doc__", name_as_string) == 0) {
|
|
149
|
-
return PyObject_GetAttr(self->
|
|
117
|
+
return PyObject_GetAttr(self->original, name);
|
|
150
118
|
}
|
|
151
|
-
/* synthesize
|
|
119
|
+
/* synthesize __bases__ and __dict__ if the original fails */
|
|
152
120
|
if (strcmp("__bases__", name_as_string) == 0) {
|
|
153
|
-
result = PyObject_GetAttr(self->
|
|
121
|
+
result = PyObject_GetAttr(self->original, name);
|
|
154
122
|
if (result == NULL) {
|
|
155
123
|
PyErr_Clear();
|
|
156
124
|
result = PyTuple_New(0);
|
|
@@ -158,7 +126,7 @@ hookable_getattro(hookable *self, PyObject *name)
|
|
|
158
126
|
return result;
|
|
159
127
|
}
|
|
160
128
|
if (strcmp("__dict__", name_as_string) == 0) {
|
|
161
|
-
result = PyObject_GetAttr(self->
|
|
129
|
+
result = PyObject_GetAttr(self->original, name);
|
|
162
130
|
if (result == NULL) {
|
|
163
131
|
PyErr_Clear();
|
|
164
132
|
result = PyDict_New();
|
|
@@ -170,95 +138,148 @@ hookable_getattro(hookable *self, PyObject *name)
|
|
|
170
138
|
return PyObject_GenericGetAttr((PyObject*)self, name);
|
|
171
139
|
}
|
|
172
140
|
|
|
141
|
+
static char hookable_sethook__doc__[] = (
|
|
142
|
+
"Set the hook implementation for the hookable object\n\n"
|
|
143
|
+
"Return the previous hook implementation, or None."
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
static PyObject*
|
|
147
|
+
hookable_sethook(hookable* self, PyObject* implementation)
|
|
148
|
+
{
|
|
149
|
+
PyObject* current;
|
|
150
|
+
|
|
151
|
+
current = self->implementation;
|
|
152
|
+
Py_INCREF(implementation);
|
|
153
|
+
self->implementation = implementation;
|
|
154
|
+
|
|
155
|
+
if (current == NULL) {
|
|
156
|
+
Py_INCREF(Py_None);
|
|
157
|
+
return Py_None;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return current;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
static char hookable_reset__doc__[] = (
|
|
164
|
+
"Reset the hook to the original value"
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
static PyObject*
|
|
168
|
+
hookable_reset(hookable* self)
|
|
169
|
+
{
|
|
170
|
+
Py_XINCREF(self->original);
|
|
171
|
+
Py_XDECREF(self->implementation);
|
|
172
|
+
|
|
173
|
+
self->implementation = self->original;
|
|
174
|
+
|
|
175
|
+
Py_INCREF(Py_None);
|
|
176
|
+
return Py_None;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
static struct PyMethodDef hookable_methods[] = {
|
|
180
|
+
{ "sethook",
|
|
181
|
+
(PyCFunction)hookable_sethook, METH_O, hookable_sethook__doc__ },
|
|
182
|
+
{ "reset",
|
|
183
|
+
(PyCFunction)hookable_reset, METH_NOARGS, hookable_reset__doc__},
|
|
184
|
+
{ NULL, NULL } /* sentinel */
|
|
185
|
+
};
|
|
186
|
+
|
|
173
187
|
static PyMemberDef hookable_members[] = {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
188
|
+
{ "original",
|
|
189
|
+
T_OBJECT_EX, offsetof(hookable, original), READONLY },
|
|
190
|
+
{ "implementation",
|
|
191
|
+
T_OBJECT_EX, offsetof(hookable, implementation), READONLY },
|
|
192
|
+
{ NULL } /* Sentinel */
|
|
177
193
|
};
|
|
178
194
|
|
|
195
|
+
static char hookable__name__[] = "zope.hookable.hookable";
|
|
196
|
+
static char hookable__doc__[] =
|
|
197
|
+
"Callable objects that support being overridden";
|
|
198
|
+
|
|
179
199
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
/* tp_compare */ 0,
|
|
195
|
-
/* tp_repr */ (reprfunc)0,
|
|
196
|
-
/* tp_as_number */ 0,
|
|
197
|
-
/* tp_as_sequence */ 0,
|
|
198
|
-
/* tp_as_mapping */ 0,
|
|
199
|
-
/* tp_hash */ (hashfunc)0,
|
|
200
|
-
/* tp_call */ (ternaryfunc)hookable_call,
|
|
201
|
-
/* tp_str */ (reprfunc)0,
|
|
202
|
-
/* tp_getattro */ (getattrofunc)hookable_getattro,
|
|
203
|
-
/* tp_setattro */ (setattrofunc)0,
|
|
204
|
-
/* tp_as_buffer */ 0,
|
|
205
|
-
/* tp_flags */ Py_TPFLAGS_DEFAULT
|
|
206
|
-
| Py_TPFLAGS_BASETYPE
|
|
207
|
-
| Py_TPFLAGS_HAVE_GC,
|
|
208
|
-
/* tp_doc */ Hookabletype__doc__,
|
|
209
|
-
/* tp_traverse */ (traverseproc)hookable_traverse,
|
|
210
|
-
/* tp_clear */ (inquiry)hookable_clear,
|
|
211
|
-
/* tp_richcompare */ (richcmpfunc)0,
|
|
212
|
-
/* tp_weaklistoffset */ (long)0,
|
|
213
|
-
/* tp_iter */ (getiterfunc)0,
|
|
214
|
-
/* tp_iternext */ (iternextfunc)0,
|
|
215
|
-
/* tp_methods */ hookable_methods,
|
|
216
|
-
/* tp_members */ hookable_members,
|
|
217
|
-
/* tp_getset */ 0,
|
|
218
|
-
/* tp_base */ 0,
|
|
219
|
-
/* tp_dict */ 0, /* internal use */
|
|
220
|
-
/* tp_descr_get */ (descrgetfunc)0,
|
|
221
|
-
/* tp_descr_set */ (descrsetfunc)0,
|
|
222
|
-
/* tp_dictoffset */ 0,
|
|
223
|
-
/* tp_init */ (initproc)hookable_init,
|
|
224
|
-
/* tp_alloc */ (allocfunc)0,
|
|
225
|
-
/* tp_new */ (newfunc)0 /*PyType_GenericNew*/,
|
|
226
|
-
/* tp_free */ 0/*PyObject_GC_Del*/,
|
|
200
|
+
/*
|
|
201
|
+
* Heap type: hookable
|
|
202
|
+
*/
|
|
203
|
+
static PyType_Slot hookable_type_slots[] = {
|
|
204
|
+
{Py_tp_doc, hookable__doc__},
|
|
205
|
+
{Py_tp_init, hookable_init},
|
|
206
|
+
{Py_tp_call, hookable_call},
|
|
207
|
+
{Py_tp_getattro, hookable_getattro},
|
|
208
|
+
{Py_tp_traverse, hookable_traverse},
|
|
209
|
+
{Py_tp_clear, hookable_clear},
|
|
210
|
+
{Py_tp_dealloc, hookable_dealloc},
|
|
211
|
+
{Py_tp_members, hookable_members},
|
|
212
|
+
{Py_tp_methods, hookable_methods},
|
|
213
|
+
{0, NULL}
|
|
227
214
|
};
|
|
228
215
|
|
|
216
|
+
static PyType_Spec hookable_type_spec = {
|
|
217
|
+
.name = hookable__name__,
|
|
218
|
+
.basicsize = sizeof(hookable),
|
|
219
|
+
.flags = Py_TPFLAGS_DEFAULT |
|
|
220
|
+
Py_TPFLAGS_BASETYPE |
|
|
221
|
+
#if PY_VERSION_HEX >= 0x030c0000
|
|
222
|
+
Py_TPFLAGS_MANAGED_WEAKREF |
|
|
223
|
+
#endif
|
|
224
|
+
Py_TPFLAGS_HAVE_GC,
|
|
225
|
+
.slots = hookable_type_slots
|
|
226
|
+
};
|
|
229
227
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
#define MOD_DEF(ob, name, doc, methods) \
|
|
234
|
-
static struct PyModuleDef moduledef = { \
|
|
235
|
-
PyModuleDef_HEAD_INIT, name, doc, -1, methods, }; \
|
|
236
|
-
ob = PyModule_Create(&moduledef);
|
|
228
|
+
/*
|
|
229
|
+
* Module initialization
|
|
230
|
+
*/
|
|
237
231
|
|
|
238
|
-
static struct PyMethodDef
|
|
239
|
-
{NULL, NULL}
|
|
232
|
+
static struct PyMethodDef hookable_module_methods[] = {
|
|
233
|
+
{ NULL, NULL } /* sentinel */
|
|
240
234
|
};
|
|
241
235
|
|
|
242
|
-
|
|
236
|
+
|
|
237
|
+
/* Handler for the 'execute' phase of multi-phase initialization
|
|
238
|
+
*
|
|
239
|
+
* See: https://docs.python.org/3/c-api/module.html#multi-phase-initialization
|
|
240
|
+
* and: https://peps.python.org/pep-0489/#module-execution-phase
|
|
241
|
+
*/
|
|
242
|
+
static int
|
|
243
|
+
hookable_module_exec(PyObject* module)
|
|
243
244
|
{
|
|
244
|
-
|
|
245
|
+
PyObject* hookable_type;
|
|
245
246
|
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
module_methods)
|
|
247
|
+
hookable_type = PyType_FromSpec(&hookable_type_spec);
|
|
248
|
+
if (hookable_type == NULL) { return -1; }
|
|
249
249
|
|
|
250
|
-
|
|
251
|
-
|
|
250
|
+
if (PyModule_AddObject(module, "hookable", hookable_type) < 0)
|
|
251
|
+
return -1;
|
|
252
252
|
|
|
253
|
-
|
|
254
|
-
|
|
253
|
+
return 0;
|
|
254
|
+
}
|
|
255
255
|
|
|
256
|
-
if (PyType_Ready(&hookabletype) < 0)
|
|
257
|
-
return MOD_ERROR_VAL;
|
|
258
256
|
|
|
259
|
-
|
|
260
|
-
|
|
257
|
+
/* Slot definitions for multi-phase initialization
|
|
258
|
+
*
|
|
259
|
+
* See: https://docs.python.org/3/c-api/module.html#multi-phase-initialization
|
|
260
|
+
* and: https://peps.python.org/pep-0489
|
|
261
|
+
*/
|
|
262
|
+
static PyModuleDef_Slot hookable_module_slots[] = {
|
|
263
|
+
{Py_mod_exec, hookable_module_exec},
|
|
264
|
+
{0, NULL}
|
|
265
|
+
};
|
|
266
|
+
|
|
267
|
+
static struct PyModuleDef hookable_module_def = {
|
|
268
|
+
PyModuleDef_HEAD_INIT,
|
|
269
|
+
.m_name = "_zope_hookable",
|
|
270
|
+
.m_doc = module__doc__,
|
|
271
|
+
.m_methods = hookable_module_methods,
|
|
272
|
+
.m_slots = hookable_module_slots
|
|
273
|
+
};
|
|
261
274
|
|
|
262
|
-
|
|
275
|
+
static PyObject*
|
|
276
|
+
init(void)
|
|
277
|
+
{
|
|
278
|
+
return PyModuleDef_Init(&hookable_module_def);
|
|
279
|
+
}
|
|
263
280
|
|
|
281
|
+
PyMODINIT_FUNC
|
|
282
|
+
PyInit__zope_hookable(void)
|
|
283
|
+
{
|
|
284
|
+
return init();
|
|
264
285
|
}
|
|
Binary file
|
|
@@ -50,10 +50,15 @@ class PyHookableTests(PyHookableMixin,
|
|
|
50
50
|
|
|
51
51
|
def test_pure_python(self):
|
|
52
52
|
from zope.hookable import _PURE_PYTHON
|
|
53
|
+
from zope.hookable import _PYPY_OR_JAVA
|
|
53
54
|
from zope.hookable import _c_hookable
|
|
54
55
|
from zope.hookable import _py_hookable
|
|
55
56
|
from zope.hookable import hookable
|
|
56
|
-
|
|
57
|
+
|
|
58
|
+
if _PYPY_OR_JAVA or _PURE_PYTHON:
|
|
59
|
+
self.assertIs(hookable, _py_hookable)
|
|
60
|
+
else:
|
|
61
|
+
self.assertIs(hookable, _c_hookable)
|
|
57
62
|
|
|
58
63
|
def test_before_hook(self):
|
|
59
64
|
hooked = self._callFUT(return_foo)
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: zope.hookable
|
|
3
|
-
Version:
|
|
3
|
+
Version: 8.0
|
|
4
4
|
Summary: Zope hookable
|
|
5
5
|
Home-page: http://github.com/zopefoundation/zope.hookable
|
|
6
6
|
Author: Zope Foundation and Contributors
|
|
7
|
-
Author-email: zope-dev@zope.
|
|
8
|
-
License: ZPL
|
|
7
|
+
Author-email: zope-dev@zope.dev
|
|
8
|
+
License: ZPL-2.1
|
|
9
9
|
Keywords: function hook replacement loose coupled
|
|
10
10
|
Classifier: Development Status :: 5 - Production/Stable
|
|
11
11
|
Classifier: Intended Audience :: Developers
|
|
@@ -13,29 +13,40 @@ Classifier: License :: OSI Approved :: Zope Public License
|
|
|
13
13
|
Classifier: Operating System :: OS Independent
|
|
14
14
|
Classifier: Programming Language :: Python
|
|
15
15
|
Classifier: Programming Language :: Python :: 3
|
|
16
|
-
Classifier: Programming Language :: Python :: 3.7
|
|
17
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
18
16
|
Classifier: Programming Language :: Python :: 3.9
|
|
19
17
|
Classifier: Programming Language :: Python :: 3.10
|
|
20
18
|
Classifier: Programming Language :: Python :: 3.11
|
|
21
19
|
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
22
21
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
23
22
|
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
24
23
|
Classifier: Framework :: Zope :: 3
|
|
25
24
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
26
|
-
Requires-Python: >=3.
|
|
25
|
+
Requires-Python: >=3.9
|
|
27
26
|
License-File: LICENSE.txt
|
|
28
27
|
Requires-Dist: setuptools
|
|
29
28
|
Provides-Extra: docs
|
|
30
|
-
Requires-Dist: Sphinx
|
|
31
|
-
Requires-Dist:
|
|
32
|
-
Provides-Extra: test
|
|
33
|
-
Requires-Dist: zope.testing ; extra == 'test'
|
|
34
|
-
Requires-Dist: zope.testrunner ; extra == 'test'
|
|
29
|
+
Requires-Dist: Sphinx; extra == "docs"
|
|
30
|
+
Requires-Dist: sphinx_rtd_theme; extra == "docs"
|
|
35
31
|
Provides-Extra: testing
|
|
36
|
-
Requires-Dist: zope.testing
|
|
37
|
-
Requires-Dist: zope.testrunner
|
|
38
|
-
Requires-Dist: coverage
|
|
32
|
+
Requires-Dist: zope.testing; extra == "testing"
|
|
33
|
+
Requires-Dist: zope.testrunner>=6.4; extra == "testing"
|
|
34
|
+
Requires-Dist: coverage; extra == "testing"
|
|
35
|
+
Provides-Extra: test
|
|
36
|
+
Requires-Dist: zope.testing; extra == "test"
|
|
37
|
+
Requires-Dist: zope.testrunner>=6.4; extra == "test"
|
|
38
|
+
Dynamic: author
|
|
39
|
+
Dynamic: author-email
|
|
40
|
+
Dynamic: classifier
|
|
41
|
+
Dynamic: description
|
|
42
|
+
Dynamic: home-page
|
|
43
|
+
Dynamic: keywords
|
|
44
|
+
Dynamic: license
|
|
45
|
+
Dynamic: license-file
|
|
46
|
+
Dynamic: provides-extra
|
|
47
|
+
Dynamic: requires-dist
|
|
48
|
+
Dynamic: requires-python
|
|
49
|
+
Dynamic: summary
|
|
39
50
|
|
|
40
51
|
===============
|
|
41
52
|
zope.hookable
|
|
@@ -75,6 +86,30 @@ Documentation is hosted at https://zopehookable.readthedocs.io
|
|
|
75
86
|
Changes
|
|
76
87
|
=========
|
|
77
88
|
|
|
89
|
+
8.0 (2025-09-12)
|
|
90
|
+
================
|
|
91
|
+
|
|
92
|
+
- Replace ``pkg_resources`` namespace with PEP 420 native namespace.
|
|
93
|
+
|
|
94
|
+
- Drop support for Python 3.8.
|
|
95
|
+
|
|
96
|
+
- Add preliminary support for Python 3.14.
|
|
97
|
+
|
|
98
|
+
7.0 (2024-09-17)
|
|
99
|
+
================
|
|
100
|
+
|
|
101
|
+
- C extension now enables multi-phase module initialization (PEP 489).
|
|
102
|
+
For CPython >= 3.11, the ``hookable`` type is now a heap-allocated
|
|
103
|
+
type. See:
|
|
104
|
+
https://docs.python.org/3.13/howto/isolating-extensions.html
|
|
105
|
+
|
|
106
|
+
- Drop support for Python 3.7.
|
|
107
|
+
|
|
108
|
+
- Add support for Python 3.13.
|
|
109
|
+
|
|
110
|
+
- Build windows wheels on GHA.
|
|
111
|
+
|
|
112
|
+
|
|
78
113
|
6.0 (2023-10-05)
|
|
79
114
|
================
|
|
80
115
|
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
zope/hookable/__init__.py,sha256=AlGd7CUrQFdO8X82n8At-Fb4oVU1woiE2AoKQUPiNYg,2460
|
|
2
|
+
zope/hookable/_zope_hookable.c,sha256=N9LOxTLZ-fZN8o_iNg8mjUNCX4na4UoGO0eDrkIqLic,7452
|
|
3
|
+
zope/hookable/_zope_hookable.cpython-310-darwin.so,sha256=4j-lJ4kvDXO46QrCOSfAJsq57ImGO0bc73iUUyJwOvA,51832
|
|
4
|
+
zope/hookable/tests/__init__.py,sha256=Z9EJNKBQorYcdV6oaIRTRgF41SMRZEEoLltZCKyVPI8,47
|
|
5
|
+
zope/hookable/tests/test_compile_flags.py,sha256=91siNUs2kotDUYpVV1vAZ_opWhZ50X4_DYkIiNMh6h0,1289
|
|
6
|
+
zope/hookable/tests/test_hookable.py,sha256=3FdXSprA60j5eX3LftT6MZG80moqG-0tTwQn_KjNLQc,6330
|
|
7
|
+
zope_hookable-8.0.dist-info/licenses/LICENSE.txt,sha256=PmcdsR32h1FswdtbPWXkqjg-rKPCDOo_r1Og9zNdCjw,2070
|
|
8
|
+
zope_hookable-8.0.dist-info/METADATA,sha256=_GUgDOwcqxufdVNOiy2mYGB4Y3nC5-h0y9NNxlIO4YI,6554
|
|
9
|
+
zope_hookable-8.0.dist-info/WHEEL,sha256=LEG6RfiPkSM-3Uy4tUs9AHCvQ4CGCC4sdFHRoPg6Rpk,109
|
|
10
|
+
zope_hookable-8.0.dist-info/top_level.txt,sha256=QpUHvpO4wIuZDeEgKY8qZCtD-tAukB0fn_f6utzlb98,5
|
|
11
|
+
zope_hookable-8.0.dist-info/RECORD,,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import sys, types, os;has_mfs = sys.version_info > (3, 5);p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('zope',));importlib = has_mfs and __import__('importlib.util');has_mfs and __import__('importlib.machinery');m = has_mfs and sys.modules.setdefault('zope', importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec('zope', [os.path.dirname(p)])));m = m or sys.modules.setdefault('zope', types.ModuleType('zope'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p)
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
zope.hookable-6.0-py3.10-nspkg.pth,sha256=SWEVH-jEWsKYrL0qoC6GBJaStx_iKxGoAY9PQycFVC4,529
|
|
2
|
-
zope/hookable/__init__.py,sha256=pb0kMg3D0-cDl4VLrYtYpaV499J8DpITbW01Wxc3_SA,2190
|
|
3
|
-
zope/hookable/_zope_hookable.c,sha256=3N5DrcP1lhrczu0yDqUshuuZ8GoCkWpf67lYzvkS8ao,7431
|
|
4
|
-
zope/hookable/_zope_hookable.cpython-310-darwin.so,sha256=jt5xYQMcBOV91NpEQ762lFRwRlDgAcIgCpsltB5tiuM,52817
|
|
5
|
-
zope/hookable/tests/__init__.py,sha256=Z9EJNKBQorYcdV6oaIRTRgF41SMRZEEoLltZCKyVPI8,47
|
|
6
|
-
zope/hookable/tests/test_compile_flags.py,sha256=91siNUs2kotDUYpVV1vAZ_opWhZ50X4_DYkIiNMh6h0,1289
|
|
7
|
-
zope/hookable/tests/test_hookable.py,sha256=Y7G2Z9CeZ4JBxaQSXi2AUvIN3ELP49T3_M9vBS2oQAk,6205
|
|
8
|
-
zope.hookable-6.0.dist-info/LICENSE.txt,sha256=PmcdsR32h1FswdtbPWXkqjg-rKPCDOo_r1Og9zNdCjw,2070
|
|
9
|
-
zope.hookable-6.0.dist-info/METADATA,sha256=1p0vh-s5YhRbv5-ZvPujboaIuXb7S7huFYPSboIt1as,5825
|
|
10
|
-
zope.hookable-6.0.dist-info/WHEEL,sha256=ReeDLt7JoWNv8uQs9jcofmiBOX-MvocIgD8kJPMfr7M,110
|
|
11
|
-
zope.hookable-6.0.dist-info/namespace_packages.txt,sha256=QpUHvpO4wIuZDeEgKY8qZCtD-tAukB0fn_f6utzlb98,5
|
|
12
|
-
zope.hookable-6.0.dist-info/top_level.txt,sha256=QpUHvpO4wIuZDeEgKY8qZCtD-tAukB0fn_f6utzlb98,5
|
|
13
|
-
zope.hookable-6.0.dist-info/RECORD,,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
zope
|
|
File without changes
|
|
File without changes
|