diff --git a/.gitignore b/.gitignore index a09bd3f..8d7ae02 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,27 @@ /orjson-3.8.10.tar.gz /orjson-3.8.11.tar.gz /orjson-3.8.12.tar.gz +/orjson-3.8.14.tar.gz +/orjson-3.9.2.tar.gz +/orjson-3.9.7.tar.gz +/orjson-3.9.8.tar.gz +/orjson-3.9.10.tar.gz +/orjson-3.9.12.tar.gz +/orjson-3.9.13.tar.gz +/orjson-3.10.1.tar.gz +/orjson-3.10.3.tar.gz +/orjson-3.10.6.tar.gz +/orjson-3.10.7.tar.gz +/orjson-3.10.10.tar.gz +/orjson-3.10.11.tar.gz +/orjson-3.10.12.tar.gz +/orjson-3.10.13.tar.gz +/orjson-3.10.14.tar.gz +/orjson-3.10.16.tar.gz +/orjson-3.10.18.tar.gz +/orjson-3.11.0.tar.gz +/orjson-3.11.0-filtered.tar.xz +/orjson-3.11.1-filtered.tar.xz +/orjson-3.11.2-filtered.tar.xz +/orjson-3.11.3-filtered.tar.xz +/orjson-3.11.4-filtered.tar.xz diff --git a/Remove-unstable-simd-feature.patch b/Remove-unstable-simd-feature.patch deleted file mode 100644 index 307ac08..0000000 --- a/Remove-unstable-simd-feature.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 8cb9c84fadfc490ec88665f0ab4871c2d7255738 Mon Sep 17 00:00:00 2001 -From: Maxwell G -Date: Wed, 25 Jan 2023 20:30:13 -0600 -Subject: [PATCH] Remove unstable-simd feature - -This feature requires nightly Rust. ---- - Cargo.toml | 6 ------ - 1 file changed, 6 deletions(-) - -diff --git a/Cargo.toml b/Cargo.toml -index fbd45a4..09724ce 100644 ---- a/Cargo.toml -+++ b/Cargo.toml -@@ -32,12 +32,6 @@ crate-type = ["cdylib"] - [features] - default = [] - --# Use SIMD intrinsics. This requires Rust on the nightly channel. --unstable-simd = [ -- "bytecount/generic-simd", -- "encoding_rs/simd-accel", --] -- - # Build yyjson as a backend and panic if it fails. The default is to attempt - # to build and on failure fall back to another backend. - yyjson = [] --- -2.40.1 - diff --git a/Use-setuptools-rust-instead-of-maturin.patch b/Use-setuptools-rust-instead-of-maturin.patch deleted file mode 100644 index 587982c..0000000 --- a/Use-setuptools-rust-instead-of-maturin.patch +++ /dev/null @@ -1,81 +0,0 @@ -From 37abb055e3435406156c6e4462b2a58923c9f11a Mon Sep 17 00:00:00 2001 -From: Maxwell G -Date: Wed, 25 Jan 2023 13:47:35 -0600 -Subject: [PATCH] Use setuptools-rust instead of maturin - -Maturin is not packaged for Fedora. We can use setuptools-rust instead. - -This requires setutpools >= 61.0 which is available on F37+. The -metadata in the [project] table can be translated to a setup.cfg or -added to setup.py for greater compatibility. ---- - pyproject.toml | 9 ++++++--- - setup.py | 28 ++++++++++++++++++++++++++++ - 2 files changed, 34 insertions(+), 3 deletions(-) - create mode 100644 setup.py - -diff --git a/pyproject.toml b/pyproject.toml -index 8372fc8..1e48b88 100644 ---- a/pyproject.toml -+++ b/pyproject.toml -@@ -1,6 +1,5 @@ - [project] - name = "orjson" --repository = "https://github.com/ijl/orjson" - requires-python = ">=3.7" - classifiers = [ - "Development Status :: 5 - Production/Stable", -@@ -22,10 +21,14 @@ classifiers = [ - "Programming Language :: Rust", - "Typing :: Typed", - ] -+dynamic = [ -+ # version is dynamically defined in setup.py -+ "version", -+] - - [build-system] --build-backend = "maturin" --requires = ["maturin>=0.13,<2"] -+build-backend = "setuptools.build_meta" -+requires = ["setuptools>=61.0", "setuptools-rust", "tomli; python_version<'3.11'"] - - [tool.maturin] - python-source = "pysrc" -diff --git a/setup.py b/setup.py -new file mode 100644 -index 0000000..63f263d ---- /dev/null -+++ b/setup.py -@@ -0,0 +1,28 @@ -+import sys -+from pathlib import Path -+ -+if sys.version_info[:2] >= (3, 11): -+ import tomllib -+else: -+ import tomli as tomllib -+ -+from setuptools import setup -+from setuptools_rust import Binding, RustExtension -+ -+HERE = Path(__file__).resolve().parent -+ -+with (HERE / "Cargo.toml").open("rb") as fp: -+ DATA = tomllib.load(fp)["package"] -+ -+setup( -+ # Can be removed once we no longer need a minimal build for setuptools < 61. -+ # This is duplicated in pyproject.toml's [project] table -+ name="orjson", -+ packages=["orjson"], -+ # -+ rust_extensions=[ -+ RustExtension("orjson.orjson", binding=Binding.NoBinding, args=["--offline"]) -+ ], -+ package_dir={"": "pysrc"}, -+ version=DATA["version"], -+) --- -2.40.1 - diff --git a/changelog b/changelog new file mode 100644 index 0000000..a07230a --- /dev/null +++ b/changelog @@ -0,0 +1,61 @@ +* Mon Jul 22 2024 Benjamin A. Beasley - 3.10.6-1 +- Update to 3.10.6. Fixes rhbz#2291190. + +* Fri Jul 19 2024 Fedora Release Engineering - 3.10.3-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild + +* Sat Jun 08 2024 Python Maint - 3.10.3-2 +- Rebuilt for Python 3.13 + +* Sat Jun 01 2024 Benjamin A. Beasley - 3.10.3-1 +- Update to 3.10.3. Fixes rhbz#2278078. + +* Fri May 24 2024 Benjamin A. Beasley - 3.10.1-2 +- Rebuild with Rust 1.78 to fix incomplete debuginfo and backtraces + +* Mon Apr 15 2024 Maxwell G - 3.10.1-1 +- Update to 3.10.1. Fixes rhbz#2264126. + +* Tue Feb 6 2024 Maxwell G - 3.9.13-1 +- Update to 3.9.13. Fixes rhbz#2262570. + +* Fri Jan 26 2024 Fedora Release Engineering - 3.9.12-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Mon Jan 22 2024 Fedora Release Engineering - 3.9.12-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Thu Jan 18 2024 Maxwell G - 3.9.12-1 +- Update to 3.9.12. Fixes rhbz#2259025. + +* Wed Nov 22 2023 Maxwell G - 3.9.10-1 +- Update to 3.9.10. Fixes rhbz#2243767. + +* Tue Oct 10 2023 Maxwell G - 3.9.8-1 +- Update to 3.9.8. Fixes rhbz#2229530. + +* Tue Jul 25 2023 Tomáš Hrnčiar - 3.9.2-2 +- Backport patch to add PyType_GetDict for Python 3.12 +- Fixes: rhbz#2220383 + +* Fri Jul 21 2023 Maxwell G - 3.9.2-1 +- Update to 3.9.2. Fixes rhbz#2211703. + +* Fri Jul 21 2023 Maxwell G - 3.8.14-1 +- Update to 3.8.14. + +* Fri Jul 21 2023 Fedora Release Engineering - 3.8.12-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild + +* Tue Jun 27 2023 Python Maint - 3.8.12-2 +- Rebuilt for Python 3.12 + +* Thu May 18 2023 Maxwell G - 3.8.12-1 +- Update to 3.8.12. +- Use maturin as a build system when available + +* Fri May 5 2023 Maxwell G - 3.8.11-1 +- Update to 3.8.11. Fixes rhbz#2193468. + +* Wed Apr 12 2023 Maxwell G - 3.8.10-1 +- Initial package (rhbz#2184237). diff --git a/get_source b/get_source new file mode 100755 index 0000000..5067989 --- /dev/null +++ b/get_source @@ -0,0 +1,49 @@ +#!/bin/sh +set -o errexit +set -o nounset + +if [ "$#" != '1' ] +then + cat 1>&2 < Downloading: ${URL}" 1>&2 +curl -L -O "${URL}" + +ARCHIVE="$(find . -mindepth 1 -maxdepth 1 -type f -name '*.tar.gz' -print -quit)" +echo "--> Extracting: $(basename "${ARCHIVE}")" 1>&2 +tar -xzf "${ARCHIVE}" +echo '--> Removing data/ due to licensing issues' 1>&2 +TARDIR="$(basename "${ARCHIVE}" '.tar.gz')" +MTIME="$(stat -c '%Y' "${TARDIR}")" +rm -rvf "${TARDIR}/data/" +# Make sure the original mtime is preserved even though we modified the base +# directory by removing something at the top level. +touch -d @"${MTIME}" "${TARDIR}" +FILTERED="$(basename "${ARCHIVE}" .tar.gz)-filtered.tar.xz" +echo "--> Re-archiving: ${FILTERED}" 1>&2 +# https://www.gnu.org/software/tar/manual/html_section/Reproducibility.html +TZ=UTC LC_ALL=C tar \ + --create --verbose \ + --sort=name \ + --format=posix \ + --numeric-owner --owner=0 --group=0 \ + --mode=go+u,go-w \ + --pax-option='delete=atime,delete=ctime' \ + "${TARDIR}/" | + xz -9e > "${FILTERED}" +mv -v "${FILTERED}" "${OUTDIR}" +echo 'Done.' 1>&2 diff --git a/python-orjson.spec b/python-orjson.spec index 6f0cc3b..33e673e 100644 --- a/python-orjson.spec +++ b/python-orjson.spec @@ -6,29 +6,64 @@ # Specfile compatability: EPEL >= 9 or Fedora >= 37 and RPM >= 4.16 %bcond tests 1 -%bcond maturin %[ 0%{?fedora} >= 39 ] +# Not yet in EPEL10: https://bugzilla.redhat.com/show_bug.cgi?id=2356387 +%bcond pendulum %{undefined el10} Name: python-orjson -Version: 3.8.12 -Release: 1%{?dist} +Version: 3.11.4 +Release: %autorelease Summary: Fast, correct Python JSON library -License: Apache-2.0 OR MIT +# The entire source is (Apache-2.0 OR MIT), except: +# +# MIT: +# - include/yyjson/yyjson.c +# - include/yyjson/yyjson.h +# +# Apache-2.0: +# - src/serialize/writer/str/mod.rs +# - src/serialize/writer/str/sse2.rs +License: (Apache-2.0 OR MIT) AND Apache-2.0 AND MIT URL: https://github.com/ijl/orjson -Source: %{pypi_source orjson} -# Ineligble for upstreaming -Patch: Remove-unstable-simd-feature.patch - -# Ineligble for upstreaming -# Used when maturin bcond is disabled -Patch5000: Use-setuptools-rust-instead-of-maturin.patch +# We must be careful about the source archive. +# +# The PyPI releases have a vendored Rust dependency bundle in include/cargo/, +# which we would remove in %%prep, but which we must still check to make sure +# everything has a license acceptable for distribution in Fedora before +# uploading to the lookaside cache. +# Source: %%{pypi_source orjson} +# The GitHub archives from +# %%{url}/archive/%%{version}/orjson-%%{version}.tar.gz do not have the +# vendored crates, but they contain benchmark data in data/, some of which is +# lacking its license text (e.g. data/blns.txt.xz, which is from +# https://github.com/minimaxir/big-list-of-naughty-strings and should carry the +# corresponding MIT license text), and some of which looks like it might have +# at best unclear license status. Since the benchmark data is potentially +# problematic, we would need to filter the GitHub archives with a script. +Source0: orjson-%{version}-filtered.tar.xz +# ./get_source ${COMMIT} (or ${TAG}) +Source1: get_source +BuildRequires: tomcli BuildRequires: python3-devel -BuildRequires: rust-packaging +BuildRequires: %{py3_dist pytest-forked} +# Upstream restricts these test dependencies to particular Python interpreter +# versions and architectures, but we would like to run the corresponding tests +# everywhere. +BuildRequires: %{py3_dist numpy} +%if %{with pendulum} +BuildRequires: %{py3_dist pendulum} +%endif +# These are not in tests/requirements.txt, but they enable additional tests +%ifnarch %{ix86} +BuildRequires: %{py3_dist pandas} +%endif +BuildRequires: %{py3_dist psutil} +BuildRequires: cargo-rpm-macros >= 24 %global _description %{expand: -orjosn is a fast, correct Python JSON library supporting dataclasses, +orjson is a fast, correct Python JSON library supporting dataclasses, datetimes, and numpy} @@ -36,47 +71,62 @@ datetimes, and numpy} %package -n python3-orjson Summary: %{summary} -# Apache-2.0 OR MIT: orjson itself -# (Apache-2.0 OR MIT) AND BSD-3-Clause: encoding_rs v0.8.32 -# Apache-2.0 OR BSL-1.0: ryu v1.0.13 -# Apache-2.0 OR MIT: bytecount v0.6.3 -# Apache-2.0 OR MIT: orjson v3.8.12 -# Apache-2.0: pyo3-ffi v0.18.3 -# MIT OR Apache-2.0: ahash v0.8.3 -# MIT OR Apache-2.0: arrayvec v0.7.2 -# MIT OR Apache-2.0: associative-cache v1.0.1 -# MIT OR Apache-2.0: beef v0.5.2 -# MIT OR Apache-2.0: cfg-if v1.0.0 -# MIT OR Apache-2.0: chrono v0.4.24 -# MIT OR Apache-2.0: itoa v1.0.6 -# MIT OR Apache-2.0: libc v0.2.144 -# MIT OR Apache-2.0: num-integer v0.1.45 -# MIT OR Apache-2.0: num-traits v0.2.15 -# MIT OR Apache-2.0: once_cell v1.17.1 -# MIT OR Apache-2.0: serde v1.0.162 -# MIT OR Apache-2.0: serde_json v1.0.96 -# MIT OR Apache-2.0: simdutf8 v0.1.4 -# MIT OR Apache-2.0: smallvec v1.10.0 -# MIT OR Apache-2.0: static_assertions v1.1.0 -# MIT: castaway v0.2.2 -# MIT: compact_str v0.7.0 -# MIT: itoap v1.0.1 -License: (Apache-2.0 OR MIT) AND (Apache-2.0 OR BSL-1.0) AND BSD-3-Clause AND Apache-2.0 +# Output of %%{cargo_license_summary}: +# +# (Apache-2.0 OR MIT) AND BSD-3-Clause +# Apache-2.0 OR BSL-1.0 +# Apache-2.0 OR MIT +# BSD-2-Clause OR Apache-2.0 OR MIT +# BSL-1.0 +# MIT +# MIT OR Apache-2.0 +# Unlicense OR MIT +# +# Note that this must include the terms of the base package License expression. +License: %{shrink: + (Apache-2.0 OR MIT) AND + Apache-2.0 AND + (Apache-2.0 OR BSL-1.0) AND + (Apache-2.0 OR BSD-2-Clause OR MIT) AND + BSD-3-Clause AND + BSL-1.0 AND + MIT AND + (Unlicense OR MIT) + } +# Version from YYJSON_VERSION_STRING in include/yyjson/yyjson.h +# +# Since version 3.11.4, orjson unconditionally uses a bundled copy of the C +# library yyjson, https://github.com/ibireme/yyjson, as the JSON +# deserialization backend. It is forked (customized) and compiled with a +# particular set of options via preprocessor defines (see build.rs), so it is +# not a candidate for unbundling. (Prior to version 3.11.4, this could be +# disabled, and the json crate from the Rust standard library, +# https://docs.rs/json, would be used instead, but this is no longer +# supported.) +Provides: bundled(yyjson) = 0.9.0 %description -n python3-orjson %{_description} %prep -%autosetup -p1 -n orjson-%{version} -N -%autopatch -M 4999 -%{!?with_maturin:%autopatch -m5000 -M5000 -p1} - -# Remove bundled yyjson. -rm -rv include/yyjson/ - +%autosetup -p1 -n orjson-%{version} %cargo_prep +# Remove unwind feature, which is not useful here: the comment above it says +# “Avoid bundling libgcc on musl.” +tomcli-set Cargo.toml del 'features.unwind' +tomcli-set Cargo.toml del 'dependencies.unwinding' + +%if %{without pendulum} +sed -i '/^pendulum\b/d' test/requirements.txt +%endif +# Test dependency on arrow appears spurious +# https://github.com/ijl/orjson/issues/559 +sed -i '/^arrow\b/d' test/requirements.txt +# Remove unpackaged PyPI plugin +sed -i '/pytest-random-order/d' test/requirements.txt + %generate_buildrequires %pyproject_buildrequires %{?with_tests:test/requirements.txt} @@ -92,28 +142,21 @@ export RUSTFLAGS='%{build_rustflags}' %install %pyproject_install -%pyproject_save_files orjson +%pyproject_save_files -l orjson %check %pyproject_check_import %if %{with tests} -%pytest -vv +# --forked: protect the pytest process against test segfaults +# -rs: print the reasons for skipped tests +%pytest --forked -rs %endif %files -n python3-orjson -f %{pyproject_files} -%license LICENSE-MIT LICENSE-APACHE LICENSES.dependencies %doc README.md %changelog -* Thu May 18 2023 Maxwell G - 3.8.12-1 -- Update to 3.8.12. -- Use maturin as a build system when available - -* Fri May 5 2023 Maxwell G - 3.8.11-1 -- Update to 3.8.11. Fixes rhbz#2193468. - -* Wed Apr 12 2023 Maxwell G - 3.8.10-1 -- Initial package (rhbz#2184237). +%autochangelog diff --git a/sources b/sources index b09abb7..18ca5d3 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (orjson-3.8.12.tar.gz) = c2a6a106721e5c84d52ccc255b60fb3da67d442604c5dd5e2dea63a6d52eece87fd3d1d81a2691c1f93b4c21a0f608a8c1ea6b19d8ba4995584a562780ff39e9 +SHA512 (orjson-3.11.4-filtered.tar.xz) = 1a457a91dfa1918341acfebcdb86ddf92b5776f166be9dbd16a4253f55140ae0bc90f911ceb3a9b33abd963be22f089aa2764b25e1701691298c0e8840c8225a