forked from pool/python-msgspec
		
	Accepting request 1218885 from devel:languages:python
- add python313.patch: support python 3.13 OBS-URL: https://build.opensuse.org/request/show/1218885 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/python-msgspec?expand=0&rev=5
This commit is contained in:
		| @@ -1,3 +1,8 @@ | |||||||
|  | ------------------------------------------------------------------- | ||||||
|  | Mon Oct 28 22:29:06 UTC 2024 - Dirk Müller <dmueller@suse.com> | ||||||
|  |  | ||||||
|  | - add python313.patch: support python 3.13 | ||||||
|  |  | ||||||
| ------------------------------------------------------------------- | ------------------------------------------------------------------- | ||||||
| Tue Jan 30 18:06:33 UTC 2024 - Dirk Müller <dmueller@suse.com> | Tue Jan 30 18:06:33 UTC 2024 - Dirk Müller <dmueller@suse.com> | ||||||
|  |  | ||||||
|   | |||||||
| @@ -23,6 +23,8 @@ Summary:        A fast serialization and validation library | |||||||
| License:        BSD-3-Clause | License:        BSD-3-Clause | ||||||
| URL:            https://jcristharif.com/msgspec/ | URL:            https://jcristharif.com/msgspec/ | ||||||
| Source:         https://github.com/jcrist/msgspec/archive/refs/tags/%{version}.tar.gz#/msgspec-%{version}.tar.gz | Source:         https://github.com/jcrist/msgspec/archive/refs/tags/%{version}.tar.gz#/msgspec-%{version}.tar.gz | ||||||
|  | # PATCH-FIX-UPSTREAM: gh#jcrist/msgspec#711 | ||||||
|  | Patch1:         python313.patch | ||||||
| BuildRequires:  %{python_module devel} | BuildRequires:  %{python_module devel} | ||||||
| BuildRequires:  %{python_module pip} | BuildRequires:  %{python_module pip} | ||||||
| BuildRequires:  %{python_module pytest} | BuildRequires:  %{python_module pytest} | ||||||
|   | |||||||
							
								
								
									
										300
									
								
								python313.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										300
									
								
								python313.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,300 @@ | |||||||
|  | From 7ade46952adea22f3b2bb9c2b8b3139e4f2831b7 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= | ||||||
|  |  <16805946+edgarrmondragon@users.noreply.github.com> | ||||||
|  | Date: Sun, 13 Oct 2024 13:25:41 -0600 | ||||||
|  | Subject: [PATCH] Support Python 3.13 (not free-threaded) (#711) | ||||||
|  |  | ||||||
|  | * Build Python 3.13 wheels (not free-threaded) | ||||||
|  |  | ||||||
|  | * Include cp313 wheels for testing | ||||||
|  |  | ||||||
|  | * Build Python 3.13 wheels only for testing | ||||||
|  |  | ||||||
|  | * Remove trove classifier | ||||||
|  |  | ||||||
|  | * Update for Python 3.13.0rc1 | ||||||
|  |  | ||||||
|  | * Clean up | ||||||
|  |  | ||||||
|  | * Bump cibuildwheel to 2.21.1 | ||||||
|  |  | ||||||
|  | * Upgrade deprecated artifact actions | ||||||
|  |  | ||||||
|  | * Update for Python 3.13.0rc3 | ||||||
|  |  | ||||||
|  | * Bump cibuildwheel to 2.21.3 to use Python 3.13.0 final | ||||||
|  |  | ||||||
|  | * Squash _eval_type warning | ||||||
|  |  | ||||||
|  | * Still use _PyUnicode_EQ for older pythons | ||||||
|  |  | ||||||
|  | Keeps around the semantic meaning for when this function is added back | ||||||
|  | in Python 3.14. | ||||||
|  |  | ||||||
|  | * Use `PyObject_GetIter` for all versions | ||||||
|  |  | ||||||
|  | * Use PyLong_AsNativeBytes on Py3.13 | ||||||
|  |  | ||||||
|  | * Suppress hashing error when parsing annotated types | ||||||
|  |  | ||||||
|  | --------- | ||||||
|  |  | ||||||
|  | Co-authored-by: Jim Crist-Harif <jcristharif@gmail.com> | ||||||
|  | --- | ||||||
|  |  .github/workflows/ci.yml | 11 +++++--- | ||||||
|  |  msgspec/_core.c          | 56 ++++++++++++++++++++++++++++++---------- | ||||||
|  |  msgspec/_utils.py        | 11 +++++++- | ||||||
|  |  setup.cfg                |  2 ++ | ||||||
|  |  4 files changed, 61 insertions(+), 19 deletions(-) | ||||||
|  |  | ||||||
|  | Index: msgspec-0.18.6/.github/workflows/ci.yml | ||||||
|  | =================================================================== | ||||||
|  | --- msgspec-0.18.6.orig/.github/workflows/ci.yml | ||||||
|  | +++ msgspec-0.18.6/.github/workflows/ci.yml | ||||||
|  | @@ -80,7 +80,7 @@ jobs: | ||||||
|  |      env: | ||||||
|  |        CIBW_TEST_REQUIRES: "pytest msgpack pyyaml tomli tomli_w" | ||||||
|  |        CIBW_TEST_COMMAND: "pytest {project}/tests" | ||||||
|  | -      CIBW_BUILD: "cp38-* cp39-* cp310-* cp311-* cp312-*" | ||||||
|  | +      CIBW_BUILD: "cp38-* cp39-* cp310-* cp311-* cp312-* cp313-*" | ||||||
|  |        CIBW_SKIP: "*-win32 *_i686 *_s390x *_ppc64le" | ||||||
|  |        CIBW_ARCHS_MACOS: "x86_64 arm64" | ||||||
|  |        CIBW_ARCHS_LINUX: "x86_64 aarch64" | ||||||
|  | @@ -129,6 +129,7 @@ jobs: | ||||||
|  |        - name: Upload artifact | ||||||
|  |          uses: actions/upload-artifact@v2 | ||||||
|  |          with: | ||||||
|  | +          name: artifact-sdist | ||||||
|  |            path: dist/*.tar.gz | ||||||
|  |   | ||||||
|  |    upload_pypi: | ||||||
|  | @@ -138,8 +139,9 @@ jobs: | ||||||
|  |      steps: | ||||||
|  |        - uses: actions/download-artifact@v2 | ||||||
|  |          with: | ||||||
|  | -          name: artifact | ||||||
|  | +          merge-multiple: true | ||||||
|  |            path: dist | ||||||
|  | +          pattern: artifact-* | ||||||
|  |   | ||||||
|  |        - uses: pypa/gh-action-pypi-publish@master | ||||||
|  |          with: | ||||||
|  | Index: msgspec-0.18.6/msgspec/_core.c | ||||||
|  | =================================================================== | ||||||
|  | --- msgspec-0.18.6.orig/msgspec/_core.c | ||||||
|  | +++ msgspec-0.18.6/msgspec/_core.c | ||||||
|  | @@ -20,6 +20,7 @@ | ||||||
|  |  #define PY310_PLUS (PY_VERSION_HEX >= 0x030a0000) | ||||||
|  |  #define PY311_PLUS (PY_VERSION_HEX >= 0x030b0000) | ||||||
|  |  #define PY312_PLUS (PY_VERSION_HEX >= 0x030c0000) | ||||||
|  | +#define PY313_PLUS (PY_VERSION_HEX >= 0x030d0000) | ||||||
|  |   | ||||||
|  |  /* Hint to the compiler not to store `x` in a register since it is likely to | ||||||
|  |   * change. Results in much higher performance on GCC, with smaller benefits on | ||||||
|  | @@ -56,6 +57,12 @@ ms_popcount(uint64_t i) { | ||||||
|  |  #define SET_SIZE(obj, size) (((PyVarObject *)obj)->ob_size = size) | ||||||
|  |  #endif | ||||||
|  |   | ||||||
|  | +#if PY313_PLUS | ||||||
|  | +#define MS_UNICODE_EQ(a, b) (PyUnicode_Compare(a, b) == 0) | ||||||
|  | +#else | ||||||
|  | +#define MS_UNICODE_EQ(a, b) _PyUnicode_EQ(a, b) | ||||||
|  | +#endif | ||||||
|  | + | ||||||
|  |  #define DIV_ROUND_CLOSEST(n, d) ((((n) < 0) == ((d) < 0)) ? (((n) + (d)/2)/(d)) : (((n) - (d)/2)/(d))) | ||||||
|  |   | ||||||
|  |  /* These macros are used to manually unroll some loops */ | ||||||
|  | @@ -497,7 +504,7 @@ find_keyword(PyObject *kwnames, PyObject | ||||||
|  |      for (i = 0; i < nkwargs; i++) { | ||||||
|  |          PyObject *kwname = PyTuple_GET_ITEM(kwnames, i); | ||||||
|  |          assert(PyUnicode_Check(kwname)); | ||||||
|  | -        if (_PyUnicode_EQ(kwname, key)) { | ||||||
|  | +        if (MS_UNICODE_EQ(kwname, key)) { | ||||||
|  |              return kwstack[i]; | ||||||
|  |          } | ||||||
|  |      } | ||||||
|  | @@ -4438,10 +4445,8 @@ typenode_collect_convert_structs(TypeNod | ||||||
|  |       * | ||||||
|  |       * If any of these checks fails, an appropriate error is returned. | ||||||
|  |       */ | ||||||
|  | -    PyObject *tag_mapping = NULL, *tag_field = NULL, *set_item = NULL; | ||||||
|  | +    PyObject *tag_mapping = NULL, *tag_field = NULL, *set_iter = NULL, *set_item = NULL; | ||||||
|  |      PyObject *struct_info = NULL; | ||||||
|  | -    Py_ssize_t set_pos = 0; | ||||||
|  | -    Py_hash_t set_hash; | ||||||
|  |      bool array_like = false; | ||||||
|  |      bool tags_are_strings = true; | ||||||
|  |      int status = -1; | ||||||
|  | @@ -4449,7 +4454,8 @@ typenode_collect_convert_structs(TypeNod | ||||||
|  |      tag_mapping = PyDict_New(); | ||||||
|  |      if (tag_mapping == NULL) goto cleanup; | ||||||
|  |   | ||||||
|  | -    while (_PySet_NextEntry(state->structs_set, &set_pos, &set_item, &set_hash)) { | ||||||
|  | +    set_iter = PyObject_GetIter(state->structs_set); | ||||||
|  | +    while ((set_item = PyIter_Next(set_iter))) { | ||||||
|  |          struct_info = StructInfo_Convert(set_item); | ||||||
|  |          if (struct_info == NULL) goto cleanup; | ||||||
|  |   | ||||||
|  | @@ -4557,6 +4563,7 @@ typenode_collect_convert_structs(TypeNod | ||||||
|  |      status = 0; | ||||||
|  |   | ||||||
|  |  cleanup: | ||||||
|  | +    Py_XDECREF(set_iter); | ||||||
|  |      Py_XDECREF(tag_mapping); | ||||||
|  |      Py_XDECREF(struct_info); | ||||||
|  |      return status; | ||||||
|  | @@ -4612,11 +4619,15 @@ typenode_origin_args_metadata( | ||||||
|  |           * abstract -> concrete mapping. If present, this is an unparametrized | ||||||
|  |           * collection of some form. This helps avoid compatibility issues in | ||||||
|  |           * Python 3.8, where unparametrized collections still have __args__. */ | ||||||
|  | -        origin = PyDict_GetItem(state->mod->concrete_types, t); | ||||||
|  | +        origin = PyDict_GetItemWithError(state->mod->concrete_types, t); | ||||||
|  |          if (origin != NULL) { | ||||||
|  |              Py_INCREF(origin); | ||||||
|  |              break; | ||||||
|  |          } | ||||||
|  | +        else { | ||||||
|  | +            /* Ignore all errors in this initial check */ | ||||||
|  | +            PyErr_Clear(); | ||||||
|  | +        } | ||||||
|  |   | ||||||
|  |          /* If `t` is a type instance, no need to inspect further */ | ||||||
|  |          if (PyType_CheckExact(t)) { | ||||||
|  | @@ -7313,7 +7324,7 @@ Struct_vectorcall(PyTypeObject *cls, PyO | ||||||
|  |           * check for parameters passed both as arg and kwarg */ | ||||||
|  |          for (field_index = 0; field_index < nfields; field_index++) { | ||||||
|  |              PyObject *field = PyTuple_GET_ITEM(fields, field_index); | ||||||
|  | -            if (_PyUnicode_EQ(kwname, field)) { | ||||||
|  | +            if (MS_UNICODE_EQ(kwname, field)) { | ||||||
|  |                  if (MS_UNLIKELY(field_index < nargs)) { | ||||||
|  |                      PyErr_Format( | ||||||
|  |                          PyExc_TypeError, | ||||||
|  | @@ -7720,7 +7731,7 @@ struct_replace(PyObject *self, PyObject | ||||||
|  |          } | ||||||
|  |          for (field_index = 0; field_index < nfields; field_index++) { | ||||||
|  |              PyObject *field = PyTuple_GET_ITEM(fields, field_index); | ||||||
|  | -            if (_PyUnicode_EQ(kwname, field)) goto kw_found; | ||||||
|  | +            if (MS_UNICODE_EQ(kwname, field)) goto kw_found; | ||||||
|  |          } | ||||||
|  |   | ||||||
|  |          /* Unknown keyword */ | ||||||
|  | @@ -11251,7 +11262,16 @@ ms_uuid_to_16_bytes(MsgspecState *mod, P | ||||||
|  |          PyErr_SetString(PyExc_TypeError, "uuid.int must be an int"); | ||||||
|  |          return -1; | ||||||
|  |      } | ||||||
|  | +#if PY313_PLUS | ||||||
|  | +    int out = (int)PyLong_AsNativeBytes( | ||||||
|  | +        int128, | ||||||
|  | +        buf, | ||||||
|  | +        16, | ||||||
|  | +        Py_ASNATIVEBYTES_BIG_ENDIAN | Py_ASNATIVEBYTES_UNSIGNED_BUFFER | ||||||
|  | +    ); | ||||||
|  | +#else | ||||||
|  |      int out = _PyLong_AsByteArray((PyLongObject *)int128, buf, 16, 0, 0); | ||||||
|  | +#endif | ||||||
|  |      Py_DECREF(int128); | ||||||
|  |      return out; | ||||||
|  |  } | ||||||
|  | @@ -12403,8 +12423,7 @@ mpack_encode_list(EncoderState *self, Py | ||||||
|  |  static int | ||||||
|  |  mpack_encode_set(EncoderState *self, PyObject *obj) | ||||||
|  |  { | ||||||
|  | -    Py_ssize_t len, ppos = 0; | ||||||
|  | -    Py_hash_t hash; | ||||||
|  | +    Py_ssize_t len = 0; | ||||||
|  |      PyObject *item; | ||||||
|  |      int status = -1; | ||||||
|  |   | ||||||
|  | @@ -12423,13 +12442,18 @@ mpack_encode_set(EncoderState *self, PyO | ||||||
|  |   | ||||||
|  |      if (mpack_encode_array_header(self, len, "set") < 0) return -1; | ||||||
|  |      if (Py_EnterRecursiveCall(" while serializing an object")) return -1; | ||||||
|  | -    while (_PySet_NextEntry(obj, &ppos, &item, &hash)) { | ||||||
|  | + | ||||||
|  | +    PyObject *iter = PyObject_GetIter(obj); | ||||||
|  | +    if (iter == NULL) goto cleanup; | ||||||
|  | + | ||||||
|  | +    while ((item = PyIter_Next(iter))) { | ||||||
|  |          if (mpack_encode_inline(self, item) < 0) goto cleanup; | ||||||
|  |      } | ||||||
|  |      status = 0; | ||||||
|  |   | ||||||
|  |  cleanup: | ||||||
|  |      Py_LeaveRecursiveCall(); | ||||||
|  | +    Py_XDECREF(iter); | ||||||
|  |      return status; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | @@ -13725,8 +13749,7 @@ json_encode_tuple(EncoderState *self, Py | ||||||
|  |  static int | ||||||
|  |  json_encode_set(EncoderState *self, PyObject *obj) | ||||||
|  |  { | ||||||
|  | -    Py_ssize_t len, ppos = 0; | ||||||
|  | -    Py_hash_t hash; | ||||||
|  | +    Py_ssize_t len = 0; | ||||||
|  |      PyObject *item; | ||||||
|  |      int status = -1; | ||||||
|  |   | ||||||
|  | @@ -13745,7 +13768,11 @@ json_encode_set(EncoderState *self, PyOb | ||||||
|  |   | ||||||
|  |      if (ms_write(self, "[", 1) < 0) return -1; | ||||||
|  |      if (Py_EnterRecursiveCall(" while serializing an object")) return -1; | ||||||
|  | -    while (_PySet_NextEntry(obj, &ppos, &item, &hash)) { | ||||||
|  | + | ||||||
|  | +    PyObject *iter = PyObject_GetIter(obj); | ||||||
|  | +    if (iter == NULL) goto cleanup; | ||||||
|  | + | ||||||
|  | +    while ((item = PyIter_Next(iter))) { | ||||||
|  |          if (json_encode_inline(self, item) < 0) goto cleanup; | ||||||
|  |          if (ms_write(self, ",", 1) < 0) goto cleanup; | ||||||
|  |      } | ||||||
|  | @@ -13754,6 +13781,7 @@ json_encode_set(EncoderState *self, PyOb | ||||||
|  |      status = 0; | ||||||
|  |  cleanup: | ||||||
|  |      Py_LeaveRecursiveCall(); | ||||||
|  | +    Py_XDECREF(iter); | ||||||
|  |      return status; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | Index: msgspec-0.18.6/msgspec/_utils.py | ||||||
|  | =================================================================== | ||||||
|  | --- msgspec-0.18.6.orig/msgspec/_utils.py | ||||||
|  | +++ msgspec-0.18.6/msgspec/_utils.py | ||||||
|  | @@ -51,6 +51,15 @@ else: | ||||||
|  |          return typing.ForwardRef(value, is_argument=False, is_class=True) | ||||||
|  |   | ||||||
|  |   | ||||||
|  | +# Python 3.13 adds a new mandatory type_params kwarg to _eval_type | ||||||
|  | +if sys.version_info >= (3, 13): | ||||||
|  | + | ||||||
|  | +    def _eval_type(t, globalns, localns): | ||||||
|  | +        return typing._eval_type(t, globalns, localns, ()) | ||||||
|  | +else: | ||||||
|  | +    _eval_type = typing._eval_type | ||||||
|  | + | ||||||
|  | + | ||||||
|  |  def _apply_params(obj, mapping): | ||||||
|  |      if params := getattr(obj, "__parameters__", None): | ||||||
|  |          args = tuple(mapping.get(p, p) for p in params) | ||||||
|  | @@ -127,7 +136,7 @@ def get_class_annotations(obj): | ||||||
|  |                  value = type(None) | ||||||
|  |              elif isinstance(value, str): | ||||||
|  |                  value = _forward_ref(value) | ||||||
|  | -            value = typing._eval_type(value, cls_locals, cls_globals) | ||||||
|  | +            value = _eval_type(value, cls_locals, cls_globals) | ||||||
|  |              if mapping is not None: | ||||||
|  |                  value = _apply_params(value, mapping) | ||||||
|  |              hints[name] = value | ||||||
|  | Index: msgspec-0.18.6/setup.cfg | ||||||
|  | =================================================================== | ||||||
|  | --- msgspec-0.18.6.orig/setup.cfg | ||||||
|  | +++ msgspec-0.18.6/setup.cfg | ||||||
|  | @@ -12,6 +12,8 @@ omit = | ||||||
|  |  markers = | ||||||
|  |      mypy | ||||||
|  |      pyright | ||||||
|  | +filterwarnings = | ||||||
|  | +    error | ||||||
|  |   | ||||||
|  |  [versioneer] | ||||||
|  |  VCS = git | ||||||
		Reference in New Issue
	
	Block a user