diff options
Diffstat (limited to 'meta-python')
895 files changed, 16661 insertions, 6720 deletions
diff --git a/meta-python/README b/meta-python/README.md index 01c51dc88c..36c193957c 100644 --- a/meta-python/README +++ b/meta-python/README.md @@ -19,11 +19,6 @@ The meta-python layer depends on: layers: meta-oe branch: master -Please follow the recommended setup procedures of your OE distribution. -For Angstrom that is: - http://www.angstrom-distribution.org/building-angstrom, -other distros should have similar online resources. - Contributing ------------------------- diff --git a/meta-python/classes/distutils3-base.bbclass b/meta-python/classes/distutils3-base.bbclass index 850c535bb1..d36b4c4a3e 100644 --- a/meta-python/classes/distutils3-base.bbclass +++ b/meta-python/classes/distutils3-base.bbclass @@ -1,9 +1,9 @@ -DEPENDS:append:class-target = " ${PYTHON_PN}-native ${PYTHON_PN}" -DEPENDS:append:class-nativesdk = " ${PYTHON_PN}-native ${PYTHON_PN}" -RDEPENDS:${PN} += "${@['', '${PYTHON_PN}-core']['${CLASSOVERRIDE}' == 'class-target']}" +DEPENDS:append:class-target = " python3-native python3" +DEPENDS:append:class-nativesdk = " python3-native python3" +RDEPENDS:${PN} += "${@['', 'python3-core']['${CLASSOVERRIDE}' == 'class-target']}" inherit distutils-common-base python3native python3targetconfig python __anonymous() { bb.warn("distutils3-base.bbclass is deprecated, please use setuptools3-base.bbclass instead") - +} diff --git a/meta-python/classes/distutils3.bbclass b/meta-python/classes/distutils3.bbclass index a6d8e8763f..909415efa0 100644 --- a/meta-python/classes/distutils3.bbclass +++ b/meta-python/classes/distutils3.bbclass @@ -27,9 +27,9 @@ distutils3_do_compile() { NO_FETCH_BUILD=1 \ STAGING_INCDIR=${STAGING_INCDIR} \ STAGING_LIBDIR=${STAGING_LIBDIR} \ - ${STAGING_BINDIR_NATIVE}/${PYTHON_PN}-native/${PYTHON_PN} setup.py \ + ${STAGING_BINDIR_NATIVE}/python3-native/python3 setup.py \ build --build-base=${B} ${DISTUTILS_BUILD_ARGS} || \ - bbfatal_log "'${PYTHON_PN} setup.py build ${DISTUTILS_BUILD_ARGS}' execution failed." + bbfatal_log "'python3 setup.py build ${DISTUTILS_BUILD_ARGS}' execution failed." } distutils3_do_compile[vardepsexclude] = "MACHINE" @@ -39,9 +39,9 @@ distutils3_do_install() { STAGING_INCDIR=${STAGING_INCDIR} \ STAGING_LIBDIR=${STAGING_LIBDIR} \ PYTHONPATH=${D}${PYTHON_SITEPACKAGES_DIR} \ - ${STAGING_BINDIR_NATIVE}/${PYTHON_PN}-native/${PYTHON_PN} setup.py \ + ${STAGING_BINDIR_NATIVE}/python3-native/python3 setup.py \ build --build-base=${B} install --skip-build ${DISTUTILS_INSTALL_ARGS} || \ - bbfatal_log "'${PYTHON_PN} setup.py install ${DISTUTILS_INSTALL_ARGS}' execution failed." + bbfatal_log "'python3 setup.py install ${DISTUTILS_INSTALL_ARGS}' execution failed." # support filenames with *spaces* find ${D} -name "*.py" -exec grep -q ${D} {} \; \ diff --git a/meta-python/conf/include/non-repro-meta-python.inc b/meta-python/conf/include/non-repro-meta-python.inc new file mode 100755 index 0000000000..629dc4aa04 --- /dev/null +++ b/meta-python/conf/include/non-repro-meta-python.inc @@ -0,0 +1,22 @@ +# List of known non-reproducible package of the meta-python layer +# Please keep this list sorted +KNOWN_NON_REPRO_META_PYTHON = " \ + python3-evdev-src \ + python3-frozenlist \ + python3-frozenlist-dbg \ + python3-kivy-src \ + python3-pandas \ + python3-pandas-dbg \ + python3-pandas-src \ + python3-pycocotools-src \ + python3-pydantic-core \ + python3-pynacl \ + python3-pynacl-dbg \ + python3-pynacl-src \ + python3-pyproj \ + python3-pyproj-dbg \ + python3-pyproj-src \ + python3-pyzmq \ + python3-yarl \ + python3-yarl-dbg \ +" diff --git a/meta-python/conf/include/ptest-packagelists-meta-python.inc b/meta-python/conf/include/ptest-packagelists-meta-python.inc new file mode 100644 index 0000000000..e07aaf3c0c --- /dev/null +++ b/meta-python/conf/include/ptest-packagelists-meta-python.inc @@ -0,0 +1,108 @@ +# +# Lists of the ptest in meta-python, sorted into two sets by the time they take +# Please keep these sorted in alphabetical order +# +# A first pass at getting all meta-python recipes which inherit ptest +# meta_python_ptest_recipes=$(bitbake-layers show-recipes --recipes-only --layer meta-python --inherits ptest --bare | tr '\n' ' ' | pcregrep -o1 '^NOTE:.+===(.+)$') +# +# ptests which take less than ~30s each +PTESTS_FAST_META_PYTHON = "\ + python3-a2wsgi \ + python3-appdirs \ + python3-ansicolors \ + python3-asgiref \ + python3-aspectlib \ + python3-bleak \ + python3-blinker \ + python3-cachetools \ + python3-cbor2 \ + python3-click \ + python3-dominate \ + python3-execnet \ + python3-flexcache \ + python3-flexparser \ + python3-freezegun \ + python3-geojson \ + python3-google-auth-oauthlib \ + python3-gpiod \ + python3-gunicorn \ + python3-html2text \ + python3-httptools \ + python3-inflection \ + python3-inotify \ + python3-intervals \ + python3-ipy \ + python3-iso3166 \ + python3-jdcal \ + python3-jsmin \ + python3-msgpack \ + python3-multidict \ + python3-netaddr \ + python3-ordered-set \ + python3-parse \ + python3-parse-type \ + python3-platformdirs \ + python3-polyline \ + python3-portalocker \ + python3-precise-runner \ + python3-prettytable \ + python3-pydantic \ + python3-pydantic-core \ + python3-pylint \ + python3-ptyprocess \ + python3-py-cpuinfo \ + python3-pyasn1-modules \ + python3-pyroute2 \ + python3-pyserial \ + python3-pytest-mock \ + python3-pytoml \ + python3-pyyaml-include \ + python3-pydbus \ + python3-rapidjson \ + python3-requests-file \ + python3-requests-toolbelt \ + python3-semver \ + python3-serpent \ + python3-service-identity \ + python3-simpleeval \ + python3-smpplib \ + python3-soupsieve \ + python3-sqlparse \ + python3-tomli-w \ + python3-tomlkit \ + python3-trustme \ + python3-typeguard \ + python3-ujson \ + python3-u-msgpack-python \ + python3-unidiff \ + python3-uritemplate \ + python3-validators \ + python3-wrapt \ + python3-wsproto \ + python3-xlrd \ + python3-xmltodict \ + python3-xxhash \ + python3-yarl \ +" + +PTESTS_SLOW_META_PYTHON = "\ + python3-arrow \ + python3-ecdsa \ + python3-google-auth \ + python3-lz4 \ + python3-marshmallow \ + python3-pillow \ + python3-pytest-localserver \ + python3-scrypt \ + python3-traitlets \ + python3-yappi \ +" + +PTESTS_PROBLEMS_META_PYTHON ="\ + python3-betamax \ + python3-dnspython \ + python3-fastjsonschema \ + python3-pint \ + python3-pyzmq \ + python3-whoosh \ +" diff --git a/meta-python/conf/layer.conf b/meta-python/conf/layer.conf index 481e4ea2cc..998f492a49 100644 --- a/meta-python/conf/layer.conf +++ b/meta-python/conf/layer.conf @@ -14,6 +14,6 @@ LAYERVERSION_meta-python = "1" LAYERDEPENDS_meta-python = "core (>= 12) openembedded-layer" -LAYERSERIES_COMPAT_meta-python = "kirkstone langdale" +LAYERSERIES_COMPAT_meta-python = "scarthgap styhead" LICENSE_PATH += "${LAYERDIR}/licenses" diff --git a/meta-python/recipes-connectivity/python-gsocketpool/python3-gsocketpool_0.1.6.bb b/meta-python/recipes-connectivity/python-gsocketpool/python3-gsocketpool_0.1.6.bb index a5581c252b..60ac18155f 100644 --- a/meta-python/recipes-connectivity/python-gsocketpool/python3-gsocketpool_0.1.6.bb +++ b/meta-python/recipes-connectivity/python-gsocketpool/python3-gsocketpool_0.1.6.bb @@ -3,8 +3,11 @@ DESCRIPTION = "creates a pool of connections that can be used with gevent" HOMEPAGE = "https://github.com/studio-ousia/gsocketpool" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=4ba825394aec026b5f94edca44426859" -DEPENDS += "${PYTHON_PN}-gevent" -RDEPENDS:${PN} += "${PYTHON_PN}-gevent" + +RDEPENDS:${PN} += " \ + python3-gevent \ + python3-logging \ +" SRC_URI[md5sum] = "49f5f292ef1b60944ae92ca426a5e550" SRC_URI[sha256sum] = "f2e2749aceadce6b27ca52e2b0a64af99797746a8681e1a2963f72007c14cb14" diff --git a/meta-python/recipes-connectivity/python-h2/python3-h2_4.1.0.bb b/meta-python/recipes-connectivity/python-h2/python3-h2_4.1.0.bb index c2d58846df..6b3ce25371 100644 --- a/meta-python/recipes-connectivity/python-h2/python3-h2_4.1.0.bb +++ b/meta-python/recipes-connectivity/python-h2/python3-h2_4.1.0.bb @@ -8,4 +8,4 @@ SRC_URI[sha256sum] = "a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c2 inherit pypi setuptools3 -RDEPENDS:${PN} += "${PYTHON_PN}-hpack ${PYTHON_PN}-hyperframe" +RDEPENDS:${PN} += "python3-hpack python3-hyperframe" diff --git a/meta-python/recipes-connectivity/python-hpack/python3-hpack_4.0.0.bb b/meta-python/recipes-connectivity/python-hpack/python3-hpack_4.0.0.bb index afba98e4b3..0297cb8c27 100644 --- a/meta-python/recipes-connectivity/python-hpack/python3-hpack_4.0.0.bb +++ b/meta-python/recipes-connectivity/python-hpack/python3-hpack_4.0.0.bb @@ -8,3 +8,5 @@ SRC_URI[md5sum] = "27e01514ef06dc9fa0798d3dcb7de47c" SRC_URI[sha256sum] = "fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095" inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-logging" diff --git a/meta-python/recipes-connectivity/python-pyro4/python3-pyro4_4.82.bb b/meta-python/recipes-connectivity/python-pyro4/python3-pyro4_4.82.bb index a7ed75f018..c49e67c919 100644 --- a/meta-python/recipes-connectivity/python-pyro4/python3-pyro4_4.82.bb +++ b/meta-python/recipes-connectivity/python-pyro4/python3-pyro4_4.82.bb @@ -9,7 +9,7 @@ PYPI_PACKAGE = "Pyro4" inherit pypi setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-serpent \ - ${PYTHON_PN}-threading \ + python3-logging \ + python3-serpent \ + python3-threading \ " diff --git a/meta-python/recipes-connectivity/python-thrift/python3-thrift_0.16.0.bb b/meta-python/recipes-connectivity/python-thrift/python3-thrift_0.20.0.bb index 6eb896d1d2..6a0a66aef5 100644 --- a/meta-python/recipes-connectivity/python-thrift/python3-thrift_0.16.0.bb +++ b/meta-python/recipes-connectivity/python-thrift/python3-thrift_0.20.0.bb @@ -2,7 +2,7 @@ SUMMARY = "Python bindings for the Apache Thrift RPC system" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=7145f7cdd263359b62d342a02f005515" -SRC_URI[sha256sum] = "2b5b6488fcded21f9d312aa23c9ff6a0195d0f6ae26ddbd5ad9e3e25dfc14408" +SRC_URI[sha256sum] = "4dd662eadf6b8aebe8a41729527bd69adf6ceaa2a8681cbef64d1273b3e8feba" inherit pypi setuptools3 @@ -10,10 +10,11 @@ inherit pypi setuptools3 PYPI_SRC_URI:append = ";downloadfilename=${BP}.${PYPI_PACKAGE_EXT}" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-stringold \ - ${PYTHON_PN}-threading \ + python3-logging \ + python3-scons \ + python3-six \ + python3-stringold \ + python3-threading \ " -BBCLASSEXTEND = "native nativesdk" +BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-connectivity/python-txws/python3-txws_0.9.1.bb b/meta-python/recipes-connectivity/python-txws/python3-txws_0.9.1.bb index c075e42700..ab39606bdb 100644 --- a/meta-python/recipes-connectivity/python-txws/python3-txws_0.9.1.bb +++ b/meta-python/recipes-connectivity/python-txws/python3-txws_0.9.1.bb @@ -6,11 +6,14 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=76699830db7fa9e897f6a1ad05f98ec8" DEPENDS = "python3-twisted python3-six python3-vcversioner python3-six-native python3-vcversioner-native" +RDEPENDS:${PN} += " \ + python3-six \ + python3-twisted \ +" + SRC_URI = "git://github.com/MostAwesomeDude/txWS.git;branch=master;protocol=https" SRCREV= "88cf6d9b9b685ffa1720644bd53c742afb10a414" S = "${WORKDIR}/git" inherit setuptools3 - -PIP_INSTALL_PACKAGE = "txWS" diff --git a/meta-python/recipes-connectivity/telepathy/telepathy-python3-0.15.19/remove_duplicate_install.patch b/meta-python/recipes-connectivity/telepathy/telepathy-python3-0.15.19/remove_duplicate_install.patch index df95a4c138..04d2da8ef2 100644 --- a/meta-python/recipes-connectivity/telepathy/telepathy-python3-0.15.19/remove_duplicate_install.patch +++ b/meta-python/recipes-connectivity/telepathy/telepathy-python3-0.15.19/remove_duplicate_install.patch @@ -2,14 +2,14 @@ commit f6c67662145de889055a86a6b3b12c70a45fc8d5 Author: Dongxiao Xu <dongxiao.xu@intel.com> Date: Wed Sep 7 16:02:20 2011 +0800 - Avoid duplicated installation of errors.py +Avoid duplicated installation of errors.py - newer version of autotools don't seem to like listing files to install - twice. Remove one errors.py from the installation list. +newer version of autotools don't seem to like listing files to install +twice. Remove one errors.py from the installation list. - Signed-off-by: Dongxiao Xu <dongxiao.xu@intel.com> +Signed-off-by: Dongxiao Xu <dongxiao.xu@intel.com> - Upstream-Status: Inappropirate [upstream inactive] +Upstream-Status: Inappropriate [upstream inactive] diff --git a/src/Makefile.am b/src/Makefile.am index 5c27dfe..7536e43 100644 diff --git a/meta-python/recipes-connectivity/telepathy/telepathy-python3-0.15.19/telepathy-python_fix_for_automake_1.12.patch b/meta-python/recipes-connectivity/telepathy/telepathy-python3-0.15.19/telepathy-python_fix_for_automake_1.12.patch index f613fdce4d..0498f3ddd0 100644 --- a/meta-python/recipes-connectivity/telepathy/telepathy-python3-0.15.19/telepathy-python_fix_for_automake_1.12.patch +++ b/meta-python/recipes-connectivity/telepathy/telepathy-python3-0.15.19/telepathy-python_fix_for_automake_1.12.patch @@ -9,7 +9,7 @@ of warning-errors. | make[1]: Leaving directory `/srv/home/nitin/builds2/build0/tmp/work/i586-poky-linux/telepathy-python-0.15.19-r4/telepathy-python-0.15.19/src' | make: *** [all-recursive] Error 1 -Signed-Off-By: Nitin A Kamble <nitin.a.kamble@intel.com> +Signed-off-by: Nitin A Kamble <nitin.a.kamble@intel.com> 2012/07/10 Index: telepathy-python-0.15.19/src/Makefile.am =================================================================== diff --git a/meta-python/recipes-connectivity/telepathy/telepathy-python3_0.15.19.bb b/meta-python/recipes-connectivity/telepathy/telepathy-python3_0.15.19.bb index f5e2f67b35..23c2165047 100644 --- a/meta-python/recipes-connectivity/telepathy/telepathy-python3_0.15.19.bb +++ b/meta-python/recipes-connectivity/telepathy/telepathy-python3_0.15.19.bb @@ -11,7 +11,6 @@ SRC_URI = "http://telepathy.freedesktop.org/releases/telepathy-python/telepathy- file://remove_duplicate_install.patch \ file://telepathy-python_fix_for_automake_1.12.patch" -PR = "r6" S = "${WORKDIR}/telepathy-python-${PV}" @@ -21,14 +20,14 @@ SRC_URI[md5sum] = "f7ca25ab3c88874015b7e9728f7f3017" SRC_URI[sha256sum] = "244c0e1bf4bbd78ae298ea659fe10bf3a73738db550156767cc2477aedf72376" FILES:${PN} += "\ - ${libdir}/python*/site-packages/telepathy/*.py \ - ${libdir}/python*/site-packages/telepathy/*/*.py \ + ${PYTHON_SITEPACKAGES_DIR}/telepathy/*.py \ + ${PYTHON_SITEPACKAGES_DIR}/telepathy/*/*.py \ " do_install:append () { - rm -fr ${D}${libdir}/python*/site-packages/telepathy/__pycache__ - rm -fr ${D}${libdir}/python*/site-packages/telepathy/__pycache__ - rm -fr ${D}${libdir}/python*/site-packages/telepathy/*/__pycache__ - rm -fr ${D}${libdir}/python*/site-packages/telepathy/*/__pycache__ + rm -fr ${D}${PYTHON_SITEPACKAGES_DIR}/telepathy/__pycache__ + rm -fr ${D}${PYTHON_SITEPACKAGES_DIR}/telepathy/__pycache__ + rm -fr ${D}${PYTHON_SITEPACKAGES_DIR}/telepathy/*/__pycache__ + rm -fr ${D}${PYTHON_SITEPACKAGES_DIR}/telepathy/*/__pycache__ } RDEPENDS:${PN} += "python3-dbus" diff --git a/meta-python/recipes-core/images/meta-python-image.bb b/meta-python/recipes-core/images/meta-python-image-all.bb index 6353d389b5..fbe3efc600 100644 --- a/meta-python/recipes-core/images/meta-python-image.bb +++ b/meta-python/recipes-core/images/meta-python-image-all.bb @@ -1,4 +1,4 @@ -require meta-python-image-base.bb +require recipes-core/images/core-image-base.bb SUMMARY = "meta-python build test image" diff --git a/meta-python/recipes-core/images/meta-python-image-base.bb b/meta-python/recipes-core/images/meta-python-image-base.bb deleted file mode 100644 index 81081e61b2..0000000000 --- a/meta-python/recipes-core/images/meta-python-image-base.bb +++ /dev/null @@ -1,7 +0,0 @@ -SUMMARY = "meta-python build test image" - -IMAGE_INSTALL = "packagegroup-core-boot" - -LICENSE = "MIT" - -inherit core-image diff --git a/meta-python/recipes-core/images/meta-python-image-ptest-all.bb b/meta-python/recipes-core/images/meta-python-image-ptest-all.bb new file mode 100644 index 0000000000..d6708c5fd0 --- /dev/null +++ b/meta-python/recipes-core/images/meta-python-image-ptest-all.bb @@ -0,0 +1,25 @@ +DESCRIPTION = "Recipe to trigger execution of all meta-python ptest images." +HOMEPAGE = "https://www.openembedded.org/" + +LICENSE = "MIT" + +inherit features_check nopackages +REQUIRED_DISTRO_FEATURES = "ptest" + +require conf/include/ptest-packagelists-meta-python.inc + +# Include the full set of ptests +PTESTS_META_PYTHON = "${PTESTS_FAST_META_PYTHON} ${PTESTS_SLOW_META_PYTHON} ${PTESTS_PROBLEMS_META_PYTHON}" + +do_testimage[noexec] = "1" +do_testimage[depends] = "${@' '.join(['meta-python-image-ptest-'+x+':do_testimage' for x in d.getVar('PTESTS_META_PYTHON').split()])}" + +do_build[depends] = "${@' '.join(['meta-python-image-ptest-'+x+':do_build' for x in d.getVar('PTESTS_META_PYTHON').split()])}" + +# normally image.bbclass would do this +EXCLUDE_FROM_WORLD = "1" + +python () { + if bb.utils.contains('IMAGE_CLASSES', 'testimage', True, False, d): + bb.build.addtask("do_testimage", "", "", d) +} diff --git a/meta-python/recipes-core/images/meta-python-image-ptest-fast.bb b/meta-python/recipes-core/images/meta-python-image-ptest-fast.bb new file mode 100644 index 0000000000..bb6e8213fe --- /dev/null +++ b/meta-python/recipes-core/images/meta-python-image-ptest-fast.bb @@ -0,0 +1,6 @@ +require meta-python-image-ptest-all.bb + +DESCRIPTION = "Recipe to trigger execution of all fast meta-python ptest images." + +PTESTS_META_PYTHON = "${PTESTS_FAST_META_PYTHON}" + diff --git a/meta-python/recipes-core/images/meta-python-image-ptest.bb b/meta-python/recipes-core/images/meta-python-image-ptest.bb new file mode 100644 index 0000000000..002bd7a39e --- /dev/null +++ b/meta-python/recipes-core/images/meta-python-image-ptest.bb @@ -0,0 +1,44 @@ +inherit features_check +REQUIRED_DISTRO_FEATURES = "ptest" + +require recipes-core/images/core-image-minimal.bb +require conf/include/ptest-packagelists-meta-python.inc + +SUMMARY = "meta-python ptest test image" + +DESCRIPTION += "Also including the ${MCNAME} ptest package." +HOMEPAGE = "https://www.openembedded.org/" + +PTESTS_META_PYTHON = "${PTESTS_SLOW_META_PYTHON} ${PTESTS_FAST_META_PYTHON} ${PTESTS_PROBLEMS_META_PYTHON}" + +IMAGE_INSTALL:append = " ${MCNAME}-ptest openssh" + +BBCLASSEXTEND = "${@' '.join(['mcextend:'+x for x in d.getVar('PTESTS_META_PYTHON').split()])}" + +# The image can be sufficiently large (~1.8GB) that we need to be careful that it fits in a live +# image (which has a 4GB limit), so nullify the overhead factor (1.3x out of the +# box) and explicitly add up to 1500MB. +IMAGE_OVERHEAD_FACTOR = "1.0" +IMAGE_ROOTFS_EXTRA_SPACE = "324288" +# If a particular ptest needs more space, it can be customized: +#IMAGE_ROOTFS_EXTRA_SPACE:virtclass-mcextend-<pn> = "1024288" + +# ptests need more memory than standard to avoid the OOM killer +QB_MEM = "-m 1024" +# If a particular ptest needs more memory, it can be customized: +#QB_MEM:virtclass-mcextend-<pn> = "-m 4096" +# python3-scrypt ptests run into OOMs on RISCV64 qemu +QB_MEM:virtclass-mcextend-python3-scrypt = "-m 2048" +QB_MEM:virtclass-mcextend-python3-fastjsonschema = "-m 2048" +QB_MEM:virtclass-mcextend-python3-pillow = "-m 2048" + +TEST_SUITES = "ping ssh parselogs ptest" + +# Sadly at the moment the full set of ptests is not robust enough and sporadically fails in random places +PTEST_EXPECT_FAILURE = "1" + +python () { + if not d.getVar("MCNAME"): + raise bb.parse.SkipRecipe("No class extension set") +} + diff --git a/meta-python/recipes-core/images/meta-python-ptest-image.bb b/meta-python/recipes-core/images/meta-python-ptest-image.bb deleted file mode 100644 index d497016d41..0000000000 --- a/meta-python/recipes-core/images/meta-python-ptest-image.bb +++ /dev/null @@ -1,5 +0,0 @@ -require meta-python-image-base.bb - -SUMMARY = "meta-python ptest test image" - -IMAGE_INSTALL += "packagegroup-meta-python3-ptest" diff --git a/meta-python/recipes-core/packagegroups/packagegroup-meta-python.bb b/meta-python/recipes-core/packagegroups/packagegroup-meta-python.bb index 1d2a9952cf..8850f8eb9a 100644 --- a/meta-python/recipes-core/packagegroups/packagegroup-meta-python.bb +++ b/meta-python/recipes-core/packagegroups/packagegroup-meta-python.bb @@ -137,7 +137,6 @@ RDEPENDS:packagegroup-meta-python3 = "\ python3-flask-nav \ python3-flask-pymongo \ python3-flask-restful \ - python3-flask-script \ python3-flask-sijax \ python3-flask-socketio \ python3-flask-sqlalchemy \ @@ -157,6 +156,7 @@ RDEPENDS:packagegroup-meta-python3 = "\ python3-gmqtt \ python3-gnupg \ python3-google-api-python-client \ + python3-gpiod \ python3-gpsd-py3 \ python3-graphviz \ python3-greenlet \ @@ -210,7 +210,6 @@ RDEPENDS:packagegroup-meta-python3 = "\ python3-jsonpath-rw \ python3-jsonpointer \ python3-jsonref \ - python3-jsonrpcserver \ python3-jsonschema \ python3-jstyleson \ python3-kconfiglib \ @@ -313,7 +312,6 @@ RDEPENDS:packagegroup-meta-python3 = "\ python3-pyconnman \ python3-pycurl \ python3-pydbus \ - python3-pydbus-manager \ python3-pydicti \ python3-pyephem \ python3-pyexpect \ @@ -322,7 +320,6 @@ RDEPENDS:packagegroup-meta-python3 = "\ python3-pyflakes \ python3-pyhamcrest \ python3-pyiface \ - python3-pyinotify \ python3-pyjks \ python3-pyjwt \ python3-pykickstart \ @@ -352,7 +349,7 @@ RDEPENDS:packagegroup-meta-python3 = "\ python3-pytest-forked \ python3-pytest-helpers-namespace \ python3-pytest-html \ - python3-pytest-lazy-fixture \ + python3-pytest-lazy-fixtures \ python3-pytest-metadata \ python3-pytest-tempdir \ python3-pytest-timeout \ @@ -361,7 +358,6 @@ RDEPENDS:packagegroup-meta-python3 = "\ python3-python-vlc \ python3-pytoml \ python3-pytun \ - python3-pytz-deprecation-shim \ python3-pyudev \ python3-pyusb \ python3-pywbem \ @@ -392,8 +388,8 @@ RDEPENDS:packagegroup-meta-python3 = "\ python3-send2trash \ python3-sentry-sdk \ python3-serpent \ + python3-service-identity \ python3-setuptools-declarative-requirements \ - python3-setuptools-scm-git-archive \ python3-sh \ python3-sijax \ python3-simpleeval \ @@ -413,7 +409,6 @@ RDEPENDS:packagegroup-meta-python3 = "\ python3-sqlparse \ python3-sqlsoup \ python3-stevedore \ - python3-strict-rfc3339 \ python3-supervisor \ python3-sympy \ python3-tabulate \ @@ -430,6 +425,7 @@ RDEPENDS:packagegroup-meta-python3 = "\ python3-trafaret-config \ python3-traitlets \ python3-transitions \ + python3-trustme \ python3-twine \ python3-twisted \ python3-twitter \ @@ -437,24 +433,23 @@ RDEPENDS:packagegroup-meta-python3 = "\ python3-txaio \ python3-txdbus \ python3-txws \ - python3-typed-ast \ python3-typeguard \ python3-tzlocal \ python3-u-msgpack-python \ - python3-uinput \ python3-ujson \ python3-unidiff \ python3-uritemplate \ python3-vcversioner \ + python3-versioneer \ python3-versiontools \ python3-visitor \ python3-waitress \ python3-watchdog \ + python3-watchdogdev \ python3-web3 \ python3-webcolors \ python3-webencodings \ python3-websocket-client \ - python3-websockets \ python3-werkzeug \ python3-werkzeug \ python3-whoosh \ @@ -462,7 +457,6 @@ RDEPENDS:packagegroup-meta-python3 = "\ python3-wtforms \ python3-xlrd \ python3-xlsxwriter \ - python3-xmlrunner \ python3-xmltodict \ python3-xmodem \ python3-xstatic \ @@ -513,7 +507,6 @@ RDEPENDS:packagegroup-meta-python3-ptest = "\ python3-pyasn1-modules-ptest \ python3-pyroute2-ptest \ python3-pyserial-ptest \ - python3-pytest-lazy-fixture-ptest \ python3-pytoml-ptest \ python3-pyzmq-ptest \ python3-requests-file-ptest \ diff --git a/meta-python/recipes-devtools/gyp/gyp/0001-Fix-for-Python-3.10-compatibility.patch b/meta-python/recipes-devtools/gyp/gyp/0001-Fix-for-Python-3.10-compatibility.patch deleted file mode 100644 index 1848654404..0000000000 --- a/meta-python/recipes-devtools/gyp/gyp/0001-Fix-for-Python-3.10-compatibility.patch +++ /dev/null @@ -1,34 +0,0 @@ -From bfe579283e5fcab60172818bfe4e6e1d40c2bed0 Mon Sep 17 00:00:00 2001 -From: Kurt Kiefer <kurt.kiefer@arthrex.com> -Date: Mon, 18 Oct 2021 11:21:14 -0700 -Subject: [PATCH] Fix for Python 3.10 compatibility - -The collections.abc module replaces collections for Python 3.10 - -Signed-off-by: Kurt Kiefer <kurt.kiefer@arthrex.com> ---- - pylib/gyp/common.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/pylib/gyp/common.py b/pylib/gyp/common.py -index b268d229..4f9cb0ec 100644 ---- a/pylib/gyp/common.py -+++ b/pylib/gyp/common.py -@@ -4,7 +4,7 @@ - - from __future__ import with_statement - --import collections -+import collections.abc - import errno - import filecmp - import os.path -@@ -494,7 +494,7 @@ def uniquer(seq, idfun=None): - - - # Based on http://code.activestate.com/recipes/576694/. --class OrderedSet(collections.MutableSet): -+class OrderedSet(collections.abc.MutableSet): - def __init__(self, iterable=None): - self.end = end = [] - end += [None, end, end] # sentinel node for doubly linked list diff --git a/meta-python/recipes-devtools/gyp/gyp_git.bb b/meta-python/recipes-devtools/gyp/gyp_git.bb index 38906de759..6ac4228a8b 100644 --- a/meta-python/recipes-devtools/gyp/gyp_git.bb +++ b/meta-python/recipes-devtools/gyp/gyp_git.bb @@ -5,12 +5,11 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=ab828cb8ce4c62ee82945a11247b6bbd" SECTION = "devel" SRC_URI = "git://chromium.googlesource.com/external/gyp;protocol=https;branch=master \ - file://0001-Fix-for-Python-3.10-compatibility.patch \ " -SRCREV = "caa60026e223fc501e8b337fd5086ece4028b1c6" +SRCREV = "a03d7413becefc8d55c8aa3df58b55b9bd0e9052" S = "${WORKDIR}/git" -PV = "0.1+git${SRCPV}" +PV = "0.1+git" inherit setuptools3 diff --git a/meta-python/recipes-devtools/python-jsonref/files/migrate-to-pdm-backend.patch b/meta-python/recipes-devtools/python-jsonref/files/migrate-to-pdm-backend.patch new file mode 100644 index 0000000000..709a38c4aa --- /dev/null +++ b/meta-python/recipes-devtools/python-jsonref/files/migrate-to-pdm-backend.patch @@ -0,0 +1,28 @@ +From 1b594cf12e5a69aa25f49f532c1201a6b39e280d Mon Sep 17 00:00:00 2001 +From: Leon Anavi <leon.anavi@konsulko.com> +Date: Tue, 7 Nov 2023 10:43:32 +0000 +Subject: [PATCH] Migrate to pdm-backend + +Signed-off-by: Leon Anavi <leon.anavi@konsulko.com> +Upstream-Status: Pending +--- + pyproject.toml | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/pyproject.toml b/pyproject.toml +index f549376..c608213 100644 +--- a/pyproject.toml ++++ b/pyproject.toml +@@ -36,7 +36,5 @@ includes = [ + profile = "black" + + [build-system] +-requires = [ +- "pdm-pep517>=1.0.0", +-] +-build-backend = "pdm.pep517.api" ++requires = ["pdm-backend"] ++build-backend = "pdm.backend" +-- +2.39.2 + diff --git a/meta-python/recipes-devtools/python-jsonref/python3-jsonref_0.2.bb b/meta-python/recipes-devtools/python-jsonref/python3-jsonref_0.2.bb deleted file mode 100644 index 45deb09c72..0000000000 --- a/meta-python/recipes-devtools/python-jsonref/python3-jsonref_0.2.bb +++ /dev/null @@ -1,11 +0,0 @@ -SUMMARY = "jsonref is a library for automatic dereferencing of JSON Reference objects for Python" -HOMEPAGE = "https://github.com/gazpachoking/jsonref" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=a34264f25338d41744dca1abfe4eb18f" - -SRC_URI[md5sum] = "42b518b9ccd6852d1d709749bc96cb70" -SRC_URI[sha256sum] = "f3c45b121cf6257eafabdc3a8008763aed1cd7da06dbabc59a9e4d2a5e4e6697" - -inherit pypi setuptools3 - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python-jsonref/python3-jsonref_1.1.0.bb b/meta-python/recipes-devtools/python-jsonref/python3-jsonref_1.1.0.bb new file mode 100644 index 0000000000..4272fc4f24 --- /dev/null +++ b/meta-python/recipes-devtools/python-jsonref/python3-jsonref_1.1.0.bb @@ -0,0 +1,23 @@ +SUMMARY = "jsonref is a library for automatic dereferencing of JSON Reference objects for Python" +HOMEPAGE = "https://github.com/gazpachoking/jsonref" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=4ac1cccee5d43e11fc4eddcf445be64a" + +SRC_URI[sha256sum] = "32fe8e1d85af0fdefbebce950af85590b22b60f9e95443176adbde4e1ecea552" + +SRC_URI += "file://migrate-to-pdm-backend.patch" + +inherit pypi python_setuptools_build_meta + +BBCLASSEXTEND = "native nativesdk" + +DEPENDS += " \ + python3-pdm-native \ + python3-pdm-backend-native \ +" + +RDEPENDS:${PN} += " \ + python3-core \ + python3-json \ + python3-netclient \ +" diff --git a/meta-python/recipes-devtools/python/files/0001-versioneer.py-do-not-use-SafeConfigParser.patch b/meta-python/recipes-devtools/python/files/0001-versioneer.py-do-not-use-SafeConfigParser.patch new file mode 100644 index 0000000000..34caaca982 --- /dev/null +++ b/meta-python/recipes-devtools/python/files/0001-versioneer.py-do-not-use-SafeConfigParser.patch @@ -0,0 +1,29 @@ +From 0920bd21ceab75bc4b655c571a37835526dd2468 Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin <alex@linutronix.de> +Date: Wed, 27 Dec 2023 15:12:19 +0100 +Subject: [PATCH] versioneer.py: do not use SafeConfigParser + +This has been deprecated for a long time, and finally removed in python 3.12 + +Upstream-Status: Submitted [https://github.com/rsokl/custom_inherit/pull/49] +Signed-off-by: Alexander Kanavin <alex@linutronix.de> +--- + versioneer.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/versioneer.py b/versioneer.py +index 64fea1c..3aa5da3 100644 +--- a/versioneer.py ++++ b/versioneer.py +@@ -339,9 +339,9 @@ def get_config_from_root(root): + # configparser.NoOptionError (if it lacks "VCS="). See the docstring at + # the top of versioneer.py for instructions on writing your setup.cfg . + setup_cfg = os.path.join(root, "setup.cfg") +- parser = configparser.SafeConfigParser() ++ parser = configparser.ConfigParser() + with open(setup_cfg, "r") as f: +- parser.readfp(f) ++ parser.read_file(f) + VCS = parser.get("versioneer", "VCS") # mandatory + + def get(parser, name): diff --git a/meta-python/recipes-devtools/python/pamela_1.0.0.bb b/meta-python/recipes-devtools/python/pamela_1.0.0.bb deleted file mode 100644 index 369ed78ca7..0000000000 --- a/meta-python/recipes-devtools/python/pamela_1.0.0.bb +++ /dev/null @@ -1,15 +0,0 @@ -DESCRIPTION = "Pamela: yet another Python wrapper for PAM" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://PKG-INFO;md5=3f9b78307cdde4e6a4976bfd82a0e7f3" - -SRC_URI[md5sum] = "5fc14f5275383ed8bdd509007af0323d" -SRC_URI[sha256sum] = "65c9389bef7d1bb0b168813b6be21964df32016923aac7515bdf05366acbab6c" - -PYPI_PACKAGE = "pamela" - -inherit pypi setuptools3 - -RDEPENDS:${PN} = "libpam" - -inherit features_check -REQUIRED_DISTRO_FEATURES = "pam" diff --git a/meta-python/recipes-devtools/python/pamela_1.1.0.bb b/meta-python/recipes-devtools/python/pamela_1.1.0.bb new file mode 100644 index 0000000000..3573de551d --- /dev/null +++ b/meta-python/recipes-devtools/python/pamela_1.1.0.bb @@ -0,0 +1,14 @@ +DESCRIPTION = "Pamela: yet another Python wrapper for PAM" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://PKG-INFO;md5=6b706db92112b8384848de3e5c6adaa3" + +SRC_URI[sha256sum] = "d4b139fe600e192e176a2a368059207a6bffa0e7879879b13f4fcba0163481be" + +PYPI_PACKAGE = "pamela" + +inherit pypi setuptools3 + +RDEPENDS:${PN} = "libpam" + +inherit features_check +REQUIRED_DISTRO_FEATURES = "pam" diff --git a/meta-python/recipes-devtools/python/pyrtm_0.4.2.bb b/meta-python/recipes-devtools/python/pyrtm_0.4.2.bb index 71e932bb0c..ed4e588509 100644 --- a/meta-python/recipes-devtools/python/pyrtm_0.4.2.bb +++ b/meta-python/recipes-devtools/python/pyrtm_0.4.2.bb @@ -1,5 +1,4 @@ SUMMARY = "Python interface for Remember The Milk API" -AUTHOR = "Sridhar Ratnakumar / srid" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=a53cbc7cb75660694e138ba973c148df" @@ -21,9 +20,9 @@ FILES:${PN}-tests += " \ " RDEPENDS:${PN} += "\ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-netclient \ + python3-json \ + python3-logging \ + python3-netclient \ " RDEPENDS:${PN}-samples += " \ @@ -32,5 +31,5 @@ RDEPENDS:${PN}-samples += " \ RDEPENDS:${PN}-tests += " \ ${PN} \ - ${PYTHON_PN}-unittest \ + python3-unittest \ " diff --git a/meta-python/recipes-devtools/python/python-daemon/0001-Workaround-for-issue-2-1.patch b/meta-python/recipes-devtools/python/python-daemon/0001-Workaround-for-issue-2-1.patch deleted file mode 100644 index dbb8407186..0000000000 --- a/meta-python/recipes-devtools/python/python-daemon/0001-Workaround-for-issue-2-1.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 0981eee9f0198c2045dc0eaa78a005d06fc7bfe4 Mon Sep 17 00:00:00 2001 -From: Carlos Eduardo Moreira dos Santos <cems@cemshost.com.br> -Date: Tue, 28 Mar 2017 18:23:44 -0300 -Subject: [PATCH] Workaround for issue 2 [1] - -[1] https://pagure.io/python-daemon/issue/2 ---- - version.py | 7 ++++--- - 1 file changed, 4 insertions(+), 3 deletions(-) - -diff --git a/version.py b/version.py -index d58422a377ee..293e2d64c2b7 100644 ---- a/version.py -+++ b/version.py -@@ -648,9 +648,10 @@ class ChangelogAwareDistribution(distutils.dist.Distribution, object): - - @lru_cache(maxsize=128) - def get_version_info(self): -- changelog_path = get_changelog_path(self) -- version_info = generate_version_info_from_changelog(changelog_path) -- return version_info -+ return { -+ 'version': '2.1.2', -+ 'maintainer': 'Ben Finney' -+ } - - def get_version(self): - version_info = self.get_version_info() --- -2.7.4 - diff --git a/meta-python/recipes-devtools/python/python-django-south.inc b/meta-python/recipes-devtools/python/python-django-south.inc index 4a376391aa..28eb84c563 100644 --- a/meta-python/recipes-devtools/python/python-django-south.inc +++ b/meta-python/recipes-devtools/python/python-django-south.inc @@ -13,5 +13,5 @@ inherit pypi BBCLASSEXTEND = "native nativesdk" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-django \ + python3-django \ " diff --git a/meta-python/recipes-devtools/python/python-django.inc b/meta-python/recipes-devtools/python/python-django.inc index e030ff4087..d9ab3fd21f 100644 --- a/meta-python/recipes-devtools/python/python-django.inc +++ b/meta-python/recipes-devtools/python/python-django.inc @@ -13,22 +13,21 @@ FILES:${PN} += "${datadir}/django" BBCLASSEXTEND = "native nativesdk" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-ctypes \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-email \ - ${PYTHON_PN}-html \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-multiprocessing \ - ${PYTHON_PN}-netserver \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-pkgutil \ - ${PYTHON_PN}-pytz \ - ${PYTHON_PN}-threading \ - ${PYTHON_PN}-unixadmin \ - ${PYTHON_PN}-xml \ - ${PYTHON_PN}-distutils \ + python3-compression \ + python3-ctypes \ + python3-datetime \ + python3-email \ + python3-html \ + python3-json \ + python3-logging \ + python3-multiprocessing \ + python3-netserver \ + python3-numbers \ + python3-pkgutil \ + python3-pytz \ + python3-threading \ + python3-unixadmin \ + python3-xml \ " CVE_PRODUCT = "django" diff --git a/meta-python/recipes-devtools/python/python-flask-bootstrap.inc b/meta-python/recipes-devtools/python/python-flask-bootstrap.inc index 1a729c975b..24c76ce942 100644 --- a/meta-python/recipes-devtools/python/python-flask-bootstrap.inc +++ b/meta-python/recipes-devtools/python/python-flask-bootstrap.inc @@ -8,7 +8,7 @@ SRC_URI[sha256sum] = "cb08ed940183f6343a64e465e83b3a3f13c53e1baabb8d72b5da4545ef PYPI_PACKAGE = "Flask-Bootstrap" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-dominate \ - ${PYTHON_PN}-flask \ - ${PYTHON_PN}-visitor \ + python3-dominate \ + python3-flask \ + python3-visitor \ " diff --git a/meta-python/recipes-devtools/python/python-flask-script.inc b/meta-python/recipes-devtools/python/python-flask-script.inc deleted file mode 100644 index 3a7adb32ca..0000000000 --- a/meta-python/recipes-devtools/python/python-flask-script.inc +++ /dev/null @@ -1,12 +0,0 @@ -DESCRIPTION = "Scripting support for flask" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=e686048adb69341fc8a08caeda528b41" - -SRC_URI[md5sum] = "3fbd91fe13cebedfb2431331f6eabb68" -SRC_URI[sha256sum] = "6425963d91054cfcc185807141c7314a9c5ad46325911bd24dcb489bd0161c65" - -PYPI_PACKAGE = "Flask-Script" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-flask \ - " diff --git a/meta-python/recipes-devtools/python/python-flask-sijax.inc b/meta-python/recipes-devtools/python/python-flask-sijax.inc index 4264f8f6d5..239c843fce 100644 --- a/meta-python/recipes-devtools/python/python-flask-sijax.inc +++ b/meta-python/recipes-devtools/python/python-flask-sijax.inc @@ -5,4 +5,8 @@ LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=266adc7b911b7c84b837bf77196e1ba6" PYPI_PACKAGE = "Flask-Sijax" -RDEPENDS:${PN} = "${PYTHON_PN}-sijax"
\ No newline at end of file +RDEPENDS:${PN} += " \ + python3-flask \ + python3-sijax \ + python3-werkzeug \ +" diff --git a/meta-python/recipes-devtools/python/python-flask-xstatic.inc b/meta-python/recipes-devtools/python/python-flask-xstatic.inc index 5f4e0858f8..8434d2610b 100644 --- a/meta-python/recipes-devtools/python/python-flask-xstatic.inc +++ b/meta-python/recipes-devtools/python/python-flask-xstatic.inc @@ -11,6 +11,6 @@ SRC_URI += "file://remove-pip-requires.patch" PYPI_PACKAGE = "Flask-XStatic" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-flask \ - ${PYTHON_PN}-xstatic \ + python3-flask \ + python3-xstatic \ " diff --git a/meta-python/recipes-devtools/python/python-flask-xstatic/remove-pip-requires.patch b/meta-python/recipes-devtools/python/python-flask-xstatic/remove-pip-requires.patch index a2d620ad06..ba06d670e3 100644 --- a/meta-python/recipes-devtools/python/python-flask-xstatic/remove-pip-requires.patch +++ b/meta-python/recipes-devtools/python/python-flask-xstatic/remove-pip-requires.patch @@ -1,3 +1,5 @@ +Upstream-Status: Pending + --- Flask-XStatic-0.0.1/setup.py.orig 2015-01-30 08:01:56.000000000 -0800 +++ Flask-XStatic-0.0.1/setup.py 2017-04-17 21:40:32.570181626 -0700 @@ -1,4 +1,3 @@ diff --git a/meta-python/recipes-devtools/python/python-idna-ssl.inc b/meta-python/recipes-devtools/python/python-idna-ssl.inc deleted file mode 100644 index e74bbd7c65..0000000000 --- a/meta-python/recipes-devtools/python/python-idna-ssl.inc +++ /dev/null @@ -1,10 +0,0 @@ -SUMMARY = "Patch ssl.match_hostname for Unicode(idna) domains support" -HOMEPAGE = "https://github.com/aio-libs/idna-ssl" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=a61b9c5aec8796b64a6bf15d42605073" - -SRC_URI[md5sum] = "dd44ec53bac36e68446766fd8d3835bd" -SRC_URI[sha256sum] = "a933e3bb13da54383f9e8f35dc4f9cb9eb9b3b78c6b36f311254d6d0d92c6c7c" - -PYPI_PACKAGE = "idna-ssl" -inherit pypi diff --git a/meta-python/recipes-devtools/python/python-imaging/0001-python-imaging-setup.py-force-paths-for-zlib-freetyp.patch b/meta-python/recipes-devtools/python/python-imaging/0001-python-imaging-setup.py-force-paths-for-zlib-freetyp.patch deleted file mode 100644 index 2575306bec..0000000000 --- a/meta-python/recipes-devtools/python/python-imaging/0001-python-imaging-setup.py-force-paths-for-zlib-freetyp.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 07d4f095a9e22ae676a8d68073101131e65012dc Mon Sep 17 00:00:00 2001 -From: Koen Kooi <koen@dominion.thruhere.net> -Date: Tue, 15 Nov 2011 13:16:54 +0100 -Subject: [PATCH] python imaging setup.py: force paths for zlib, freetype and jpeg and don't add host paths - -Signed-off-by: Koen Kooi <koen@dominion.thruhere.net> - -Upstream-Status: Inappropriate [embedded specific] ---- - setup.py | 14 +++----------- - 1 files changed, 3 insertions(+), 11 deletions(-) - -diff --git a/setup.py b/setup.py -index 5d4d53a..b1a22ec 100644 ---- a/setup.py -+++ b/setup.py -@@ -34,10 +34,10 @@ def libinclude(root): - # TIFF_ROOT = libinclude("/opt/tiff") - - TCL_ROOT = None --JPEG_ROOT = None --ZLIB_ROOT = None -+JPEG_ROOT = os.environ['STAGING_LIBDIR'] -+ZLIB_ROOT = os.environ['STAGING_LIBDIR'] - TIFF_ROOT = None --FREETYPE_ROOT = None -+FREETYPE_ROOT = os.environ['STAGING_LIBDIR'], os.environ['STAGING_INCDIR'] - LCMS_ROOT = None - - # FIXME: add mechanism to explicitly *disable* the use of a library -@@ -147,7 +147,6 @@ class pil_build_ext(build_ext): - add_directory(library_dirs, "/opt/local/lib") - add_directory(include_dirs, "/opt/local/include") - -- add_directory(library_dirs, "/usr/local/lib") - # FIXME: check /opt/stuff directories here? - - prefix = sysconfig.get_config_var("prefix") -@@ -207,13 +206,6 @@ class pil_build_ext(build_ext): - if os.path.isfile(os.path.join(tcl_dir, "tk.h")): - add_directory(include_dirs, tcl_dir) - -- # standard locations -- add_directory(library_dirs, "/usr/local/lib") -- add_directory(include_dirs, "/usr/local/include") -- -- add_directory(library_dirs, "/usr/lib") -- add_directory(include_dirs, "/usr/include") -- - # - # insert new dirs *before* default libs, to avoid conflicts - # between Python PYD stub libs and real libraries --- -1.7.2.5 - diff --git a/meta-python/recipes-devtools/python/python-imaging/allow.to.disable.some.features.patch b/meta-python/recipes-devtools/python/python-imaging/allow.to.disable.some.features.patch deleted file mode 100644 index 4960ed4661..0000000000 --- a/meta-python/recipes-devtools/python/python-imaging/allow.to.disable.some.features.patch +++ /dev/null @@ -1,65 +0,0 @@ -At least lcms wasn't deterministicly detected from sysroot. - -This will allow to export LCMS_ENABLED=False when lcms isn't in PACKAGECONFIG. - -Upstream-Status: Inappropriate [configuration] - -Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com> - -diff -uNr Imaging-1.1.7.orig/setup.py Imaging-1.1.7/setup.py ---- Imaging-1.1.7.orig/setup.py 2013-07-22 10:17:02.081457075 +0200 -+++ Imaging-1.1.7/setup.py 2013-07-22 13:10:09.029707492 +0200 -@@ -39,6 +39,12 @@ - TIFF_ROOT = None - FREETYPE_ROOT = os.environ['STAGING_LIBDIR'], os.environ['STAGING_INCDIR'] - LCMS_ROOT = None -+TCL_ENABLED = os.getenv('TCL_ENABLED', "True") -+JPEG_ENABLED = os.getenv('JPEG_ENABLED', "True") -+ZLIB_ENABLED = os.getenv('ZLIB_ENABLED', "True") -+TIFF_ENABLED = os.getenv('TIFF_ENABLED', "True") -+FREETYPE_ENABLED = os.getenv('FREETYPE_ENABLED', "True") -+LCMS_ENABLED = os.getenv('LCMS_ENABLED', "True") - - # FIXME: add mechanism to explicitly *disable* the use of a library - -@@ -220,22 +226,22 @@ - zlib = jpeg = tiff = freetype = tcl = tk = lcms = None - feature = feature() - -- if find_include_file(self, "zlib.h"): -+ if ZLIB_ENABLED == 'True' and find_include_file(self, "zlib.h"): - if find_library_file(self, "z"): - feature.zlib = "z" - elif sys.platform == "win32" and find_library_file(self, "zlib"): - feature.zlib = "zlib" # alternative name - -- if find_include_file(self, "jpeglib.h"): -+ if JPEG_ENABLED == 'True' and find_include_file(self, "jpeglib.h"): - if find_library_file(self, "jpeg"): - feature.jpeg = "jpeg" - elif sys.platform == "win32" and find_library_file(self, "libjpeg"): - feature.jpeg = "libjpeg" # alternative name - -- if find_library_file(self, "tiff"): -+ if TIFF_ENABLED == 'True' and find_library_file(self, "tiff"): - feature.tiff = "tiff" - -- if find_library_file(self, "freetype"): -+ if FREETYPE_ENABLED == 'True' and find_library_file(self, "freetype"): - # look for freetype2 include files - freetype_version = 0 - for dir in self.compiler.include_dirs: -@@ -256,11 +262,11 @@ - if dir: - add_directory(self.compiler.include_dirs, dir, 0) - -- if find_include_file(self, "lcms.h"): -+ if LCMS_ENABLED == 'True' and find_include_file(self, "lcms.h"): - if find_library_file(self, "lcms"): - feature.lcms = "lcms" - -- if _tkinter and find_include_file(self, "tk.h"): -+ if TCL_ENABLED == 'True' and _tkinter and find_include_file(self, "tk.h"): - # the library names may vary somewhat (e.g. tcl84 or tcl8.4) - version = TCL_VERSION[0] + TCL_VERSION[2] - if find_library_file(self, "tcl" + version): diff --git a/meta-python/recipes-devtools/python/python-imaging/fix-freetype-includes.patch b/meta-python/recipes-devtools/python/python-imaging/fix-freetype-includes.patch deleted file mode 100644 index 9ecc63a0d6..0000000000 --- a/meta-python/recipes-devtools/python/python-imaging/fix-freetype-includes.patch +++ /dev/null @@ -1,30 +0,0 @@ -Upstream-Status: Backport -Signed-off-by: Ross Burton <ross.burton@intel.com> - -From c6040f618d8f2706a7b46d1cdf37d1a587f9701f Mon Sep 17 00:00:00 2001 -From: Andrew Stromnov <stromnov@gmail.com> -Date: Thu, 28 Nov 2013 16:58:43 +0400 -Subject: [PATCH] fix compiling with FreeType 2.5.1 - ---- - _imagingft.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/_imagingft.c b/_imagingft.c -index 47d50bd..f19555b 100644 ---- a/_imagingft.c -+++ b/_imagingft.c -@@ -59,7 +59,11 @@ struct { - const char* message; - } ft_errors[] = - -+#if defined(USE_FREETYPE_2_1) -+#include FT_ERRORS_H -+#else - #include <freetype/fterrors.h> -+#endif - - /* -------------------------------------------------------------------- */ - /* font objects */ --- -1.8.5.1 diff --git a/meta-python/recipes-devtools/python/python-imaging/python-imaging-CVE-2016-2533.patch b/meta-python/recipes-devtools/python/python-imaging/python-imaging-CVE-2016-2533.patch deleted file mode 100644 index b01136f9ac..0000000000 --- a/meta-python/recipes-devtools/python/python-imaging/python-imaging-CVE-2016-2533.patch +++ /dev/null @@ -1,38 +0,0 @@ -python-imaging: CVE-2016-2533 - -the patch comes from: -https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-2533 -https://github.com/python-pillow/Pillow/commit/ae453aa18b66af54e7ff716f4ccb33adca60afd4#diff-8ff6909c159597e22288ad818938fd6b - -PCD decoder overruns the shuffle buffer, Fixes #568 - -Signed-off-by: Li Wang <li.wang@windriver.com> ---- - libImaging/PcdDecode.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/libImaging/PcdDecode.c b/libImaging/PcdDecode.c -index b6898e3..c02d005 100644 ---- a/libImaging/PcdDecode.c -+++ b/libImaging/PcdDecode.c -@@ -47,7 +47,7 @@ ImagingPcdDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) - out[0] = ptr[x]; - out[1] = ptr[(x+4*state->xsize)/2]; - out[2] = ptr[(x+5*state->xsize)/2]; -- out += 4; -+ out += 3; - } - - state->shuffle((UINT8*) im->image[state->y], -@@ -62,7 +62,7 @@ ImagingPcdDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) - out[0] = ptr[x+state->xsize]; - out[1] = ptr[(x+4*state->xsize)/2]; - out[2] = ptr[(x+5*state->xsize)/2]; -- out += 4; -+ out += 3; - } - - state->shuffle((UINT8*) im->image[state->y], --- -1.7.9.5 - diff --git a/meta-python/recipes-devtools/python/python-imaging/remove-host-libdir.patch b/meta-python/recipes-devtools/python/python-imaging/remove-host-libdir.patch deleted file mode 100644 index 028a51ad59..0000000000 --- a/meta-python/recipes-devtools/python/python-imaging/remove-host-libdir.patch +++ /dev/null @@ -1,25 +0,0 @@ -Avoid getting host sysroot paths in the library paths to fix issue like: - -| /home/andrei/work/yocto/build-rpi-master/tmp/sysroots/x86_64-linux/usr/lib/libz.so: file not recognized: File format not recognized - -Upstream-Status: Inappropriate [configuration] - -Signed-off-by: Andrei Gherzan <andrei@gherzan.ro> - - -Index: Imaging-1.1.7/setup.py -=================================================================== ---- Imaging-1.1.7.orig/setup.py -+++ Imaging-1.1.7/setup.py -@@ -155,11 +155,6 @@ class pil_build_ext(build_ext): - - # FIXME: check /opt/stuff directories here? - -- prefix = sysconfig.get_config_var("prefix") -- if prefix: -- add_directory(library_dirs, os.path.join(prefix, "lib")) -- add_directory(include_dirs, os.path.join(prefix, "include")) -- - # - # locate tkinter libraries - diff --git a/meta-python/recipes-devtools/python/python-libusb1_3.1.0.bb b/meta-python/recipes-devtools/python/python-libusb1_3.1.0.bb new file mode 100644 index 0000000000..a045dfa8bc --- /dev/null +++ b/meta-python/recipes-devtools/python/python-libusb1_3.1.0.bb @@ -0,0 +1,18 @@ +SUMMARY = "Pure-python wrapper for libusb-1.0" +HOMEPAGE = "http://github.com/vpelletier/python-libusb1" +AUTHOR = "Vincent Pelletier <plr.vincent@gmail.com>" +LICENSE = "GPL-2.0-only & LGPL-2.1-only" +LIC_FILES_CHKSUM = " \ + file://COPYING;md5=751419260aa954499f7abaabaa882bbe \ + file://COPYING.LESSER;md5=4fbd65380cdd255951079008b364516c \ +" + +SRC_URI = "https://github.com/vpelletier/${BPN}/releases/download/${PV}/libusb1-${PV}.tar.gz" +SRC_URI[md5sum] = "7b4f094786d1dfc8d011c7649d8ccb97" +SRC_URI[sha256sum] = "4ee9b0a55f8bd0b3ea7017ae919a6c1f439af742c4a4b04543c5fd7af89b828c" + +S = "${WORKDIR}/libusb1-${PV}" + +RDEPENDS:${PN} = "libusb1" + +inherit setuptools3 diff --git a/meta-python/recipes-devtools/python/python-mccabe/0001-python-mccabe-remove-unnecessary-setup_requires-pyte.patch b/meta-python/recipes-devtools/python/python-mccabe/0001-python-mccabe-remove-unnecessary-setup_requires-pyte.patch deleted file mode 100644 index 941bed3d73..0000000000 --- a/meta-python/recipes-devtools/python/python-mccabe/0001-python-mccabe-remove-unnecessary-setup_requires-pyte.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 3484bdfa7adbaebcf8bb8e7d4820f64b12717932 Mon Sep 17 00:00:00 2001 -From: Mingli Yu <mingli.yu@windriver.com> -Date: Fri, 29 Jul 2016 15:37:18 +0800 -Subject: [PATCH] python-mccabe: remove unnecessary setup_requires - pytest-runner - -* Remove setup_requires pytest-runner as the - setup_requires pytest-runner actually is not - used for pytest which only in do_compile phase - via setup.py build - -Upstream-Status: Pending - -Signed-off-by: Mingli Yu <mingli.yu@windriver.com> ---- - setup.py | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/setup.py b/setup.py -index e59903d..bf2aaba 100644 ---- a/setup.py -+++ b/setup.py -@@ -33,7 +33,6 @@ setup( - license='Expat license', - py_modules=['mccabe'], - zip_safe=False, -- setup_requires=['pytest-runner'], - tests_require=['pytest'], - entry_points={ - 'flake8.extension': [ --- -2.8.1 - diff --git a/meta-python/recipes-devtools/python/python-numeric/0001-it-tries-to-define-this-function-differently-than-it.patch b/meta-python/recipes-devtools/python/python-numeric/0001-it-tries-to-define-this-function-differently-than-it.patch deleted file mode 100644 index 81ed744cbd..0000000000 --- a/meta-python/recipes-devtools/python/python-numeric/0001-it-tries-to-define-this-function-differently-than-it.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 322e781c67d7a78fc2cfc3d377f50b825fc64abb Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Fri, 2 Jun 2017 20:21:01 -0700 -Subject: [PATCH] it tries to define this function differently than it is - defined in sys/time.h. - -Use the definition from system - -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- - Packages/RNG/Src/ranf.c | 3 --- - 1 file changed, 3 deletions(-) - -diff --git a/Packages/RNG/Src/ranf.c b/Packages/RNG/Src/ranf.c -index 5ca7dc5..e669fa8 100644 ---- a/Packages/RNG/Src/ranf.c -+++ b/Packages/RNG/Src/ranf.c -@@ -149,9 +149,6 @@ void Mixranf(int *s,u32 s48[2]) - #else - struct timeval tv; - struct timezone tz; --#if !defined(__sgi) -- int gettimeofday(struct timeval *, struct timezone *); --#endif - - (void)gettimeofday(&tv,&tz); - s48[0] = (u32)tv.tv_sec; --- -2.13.0 - diff --git a/meta-python/recipes-devtools/python/python-pygpgme/0001-reflect-2.1-reporting-for-key-imports.patch b/meta-python/recipes-devtools/python/python-pygpgme/0001-reflect-2.1-reporting-for-key-imports.patch deleted file mode 100644 index 1f31cb805e..0000000000 --- a/meta-python/recipes-devtools/python/python-pygpgme/0001-reflect-2.1-reporting-for-key-imports.patch +++ /dev/null @@ -1,90 +0,0 @@ -From ed44474c11f577c1644910964a917a4cf701bb0f Mon Sep 17 00:00:00 2001 -From: Daniel Kahn Gillmor <dkg@fifthhorseman.net> -Date: Tue, 26 Jan 2016 14:24:26 -0500 -Subject: [PATCH] reflect 2.1 reporting for key imports - -GnuPG 2.1 changes how it reports key imports. These changes should -make the pygpgme test suite compatible with GnuPG 2.1. - -See also: -https://lists.gnupg.org/pipermail/gnupg-devel/2016-January/030718.html - -Upstream-Status: Backport - -Signed-off-by: Catalin Enache <catalin.enache@windriver.com> - ---- - tests/test_import.py | 22 +++++++++++----------- - 1 file changed, 11 insertions(+), 11 deletions(-) - -diff --git a/tests/test_import.py b/tests/test_import.py -index 10eb816..597eb47 100644 ---- a/tests/test_import.py -+++ b/tests/test_import.py -@@ -55,7 +55,7 @@ class ImportTestCase(GpgHomeTestCase): - ctx = gpgme.Context() - with self.keyfile('key1.sec') as fp: - result = ctx.import_(fp) -- self.assertEqual(result.considered, 1) -+ self.assertEqual(result.considered, 3) - self.assertEqual(result.no_user_id, 0) - self.assertEqual(result.imported, 1) - self.assertEqual(result.imported_rsa, 0) -@@ -64,18 +64,18 @@ class ImportTestCase(GpgHomeTestCase): - self.assertEqual(result.new_sub_keys, 0) - self.assertEqual(result.new_signatures, 0) - self.assertEqual(result.new_revocations, 0) -- self.assertEqual(result.secret_read, 1) -- self.assertEqual(result.secret_imported, 1) -+ self.assertEqual(result.secret_read, 3) -+ self.assertEqual(result.secret_imported, 2) - self.assertEqual(result.secret_unchanged, 0) - self.assertEqual(result.skipped_new_keys, 0) - self.assertEqual(result.not_imported, 0) - self.assertEqual(len(result.imports), 2) - self.assertEqual(result.imports[0], - ('E79A842DA34A1CA383F64A1546BB55F0885C65A4', -- None, gpgme.IMPORT_NEW | gpgme.IMPORT_SECRET)) -+ None, gpgme.IMPORT_NEW)) - self.assertEqual(result.imports[1], - ('E79A842DA34A1CA383F64A1546BB55F0885C65A4', -- None, gpgme.IMPORT_NEW)) -+ None, gpgme.IMPORT_NEW | gpgme.IMPORT_SECRET)) - # can we get the public key? - key = ctx.get_key('E79A842DA34A1CA383F64A1546BB55F0885C65A4') - # can we get the secret key? -@@ -102,17 +102,17 @@ class ImportTestCase(GpgHomeTestCase): - fp = BytesIO(b'\n'.join(keys)) - ctx = gpgme.Context() - result = ctx.import_(fp) -- self.assertEqual(result.considered, 3) -+ self.assertEqual(result.considered, 5) - self.assertEqual(result.no_user_id, 0) - self.assertEqual(result.imported, 2) -- self.assertEqual(result.imported_rsa, 1) -+ self.assertEqual(result.imported_rsa, 0) - self.assertEqual(result.unchanged, 0) - self.assertEqual(result.new_user_ids, 0) - self.assertEqual(result.new_sub_keys, 0) - self.assertEqual(result.new_signatures, 1) - self.assertEqual(result.new_revocations, 0) -- self.assertEqual(result.secret_read, 1) -- self.assertEqual(result.secret_imported, 1) -+ self.assertEqual(result.secret_read, 3) -+ self.assertEqual(result.secret_imported, 2) - self.assertEqual(result.secret_unchanged, 0) - self.assertEqual(result.skipped_new_keys, 0) - self.assertEqual(result.not_imported, 0) -@@ -122,10 +122,10 @@ class ImportTestCase(GpgHomeTestCase): - None, gpgme.IMPORT_NEW)) - self.assertEqual(result.imports[1], - ('E79A842DA34A1CA383F64A1546BB55F0885C65A4', -- None, gpgme.IMPORT_NEW | gpgme.IMPORT_SECRET)) -+ None, gpgme.IMPORT_SIG)) - self.assertEqual(result.imports[2], - ('E79A842DA34A1CA383F64A1546BB55F0885C65A4', -- None, gpgme.IMPORT_SIG)) -+ None, gpgme.IMPORT_NEW | gpgme.IMPORT_SECRET)) - self.assertEqual(result.imports[3], - ('93C2240D6B8AA10AB28F701D2CF46B7FC97E6B0F', - None, gpgme.IMPORT_NEW)) diff --git a/meta-python/recipes-devtools/python/python-pygpgme/0002-passphrase_cb-is-deprecated.patch b/meta-python/recipes-devtools/python/python-pygpgme/0002-passphrase_cb-is-deprecated.patch deleted file mode 100644 index c18cf3feba..0000000000 --- a/meta-python/recipes-devtools/python/python-pygpgme/0002-passphrase_cb-is-deprecated.patch +++ /dev/null @@ -1,52 +0,0 @@ -From ba0dc8273e4f83bcd2d43baa5910aae34b93048c Mon Sep 17 00:00:00 2001 -From: Daniel Kahn Gillmor <dkg@fifthhorseman.net> -Date: Mon, 1 Feb 2016 19:25:12 -0500 -Subject: [PATCH] passphrase_cb is deprecated - -https://bugs.gnupg.org/gnupg/issue767 indicates that -gpgme_set_passphrase_cb is a deprecated corner of the API and that -developers using gpgme should really rely on the gpg-agent to handle -this stuff. This should actually simplify things for most -installations -- just strip out all passphrase handling from your -application entirely, relying on gpg to figure out how to find the -agent, and relying on the agent figuring out how to prompt the user -(if necessary). - -However, if a developer really wants to use the passphrase callback -approach, they'll have to use loopback pinentry. This sets up the -test suite to be able to make those tests. - -Upstream-Status: Backport - -Signed-off-by: Catalin Enache <catalin.enache@windriver.com> - ---- - tests/util.py | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -diff --git a/tests/util.py b/tests/util.py -index cd803c2..86892ca 100644 ---- a/tests/util.py -+++ b/tests/util.py -@@ -28,7 +28,9 @@ keydir = os.path.join(os.path.dirname(__file__), 'keys') - - class GpgHomeTestCase(unittest.TestCase): - -- gpg_conf_contents = '' -+ gpg_conf_contents = 'pinentry-mode loopback' -+ gpg_agent_conf_contents = 'allow-loopback-pinentry' -+ - import_keys = [] - - def keyfile(self, key): -@@ -41,6 +43,10 @@ class GpgHomeTestCase(unittest.TestCase): - fp.write(self.gpg_conf_contents.encode('UTF-8')) - fp.close() - -+ fp = open(os.path.join(self._gpghome, 'gpg-agent.conf'), 'wb') -+ fp.write(self.gpg_agent_conf_contents.encode('UTF-8')) -+ fp.close() -+ - # import requested keys into the keyring - ctx = gpgme.Context() - for key in self.import_keys: diff --git a/meta-python/recipes-devtools/python/python-pygpgme/0003-handle-generic-error-when-no-passphrase-callback-pre.patch b/meta-python/recipes-devtools/python/python-pygpgme/0003-handle-generic-error-when-no-passphrase-callback-pre.patch deleted file mode 100644 index 6acb68bfe7..0000000000 --- a/meta-python/recipes-devtools/python/python-pygpgme/0003-handle-generic-error-when-no-passphrase-callback-pre.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 579b5930e15de8855bf63b3c20b6c3aaf894c3eb Mon Sep 17 00:00:00 2001 -From: Daniel Kahn Gillmor <dkg@fifthhorseman.net> -Date: Mon, 1 Feb 2016 19:27:59 -0500 -Subject: [PATCH] handle generic error when no passphrase callback present - -apparently gpg 2.1 returns ERR_GENERAL right now if the pinentry was -in loopback mode and no passphrase callback was supplied. Earlier -versions supplied ERR_BAD_PASSPHRASE. - -Upstream-Status: Backport - -Signed-off-by: Catalin Enache <catalin.enache@windriver.com> - ---- - tests/test_passphrase.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/tests/test_passphrase.py b/tests/test_passphrase.py -index 0a235e9..35b3c59 100644 ---- a/tests/test_passphrase.py -+++ b/tests/test_passphrase.py -@@ -41,7 +41,7 @@ class PassphraseTestCase(GpgHomeTestCase): - new_sigs = ctx.sign(plaintext, signature, gpgme.SIG_MODE_CLEAR) - except gpgme.GpgmeError as exc: - self.assertEqual(exc.args[0], gpgme.ERR_SOURCE_GPGME) -- self.assertEqual(exc.args[1], gpgme.ERR_BAD_PASSPHRASE) -+ self.assertEqual(exc.args[1], gpgme.ERR_GENERAL) - else: - self.fail('gpgme.GpgmeError not raised') - diff --git a/meta-python/recipes-devtools/python/python-pygpgme/run-ptest b/meta-python/recipes-devtools/python/python-pygpgme/run-ptest deleted file mode 100644 index ce2abb66a5..0000000000 --- a/meta-python/recipes-devtools/python/python-pygpgme/run-ptest +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -GPG_AGENT_INFO= python test_all.py -v 2>&1 | sed -e '/\.\.\. ok/ s/^/PASS: /g' -e '/\.\.\. [ERROR|FAIL]/ s/^/FAIL: /g' -e '/\.\.\. skipped/ s/^/SKIP: /g' -e 's/ \.\.\. ok//g' -e 's/ \.\.\. ERROR//g' -e 's/ \.\.\. FAIL//g' -e 's/ \.\.\. skipped//g' diff --git a/meta-python/recipes-devtools/python/python-pyrex/pyrex-fix-optimized-mode.patch b/meta-python/recipes-devtools/python/python-pyrex/pyrex-fix-optimized-mode.patch deleted file mode 100644 index c58c3280e2..0000000000 --- a/meta-python/recipes-devtools/python/python-pyrex/pyrex-fix-optimized-mode.patch +++ /dev/null @@ -1,15 +0,0 @@ -Upstream-Status: Pending - -Index: Pyrex-0.9.8.4/Pyrex/Distutils/extension.py -=================================================================== ---- Pyrex-0.9.8.4.orig/Pyrex/Distutils/extension.py -+++ Pyrex-0.9.8.4/Pyrex/Distutils/extension.py -@@ -15,7 +15,7 @@ except ImportError: - warnings = None - - class Extension(_Extension.Extension): -- _Extension.Extension.__doc__ + \ -+ _Extension.Extension.__doc__ or "" + \ - """pyrex_include_dirs : [string] - list of directories to search for Pyrex header files (.pxd) (in - Unix form for portability) diff --git a/meta-python/recipes-devtools/python/python-systemd/0002-setup.py-switch-from-distutils-to-setuptools.patch b/meta-python/recipes-devtools/python/python-systemd/0002-setup.py-switch-from-distutils-to-setuptools.patch deleted file mode 100644 index b3180f29f2..0000000000 --- a/meta-python/recipes-devtools/python/python-systemd/0002-setup.py-switch-from-distutils-to-setuptools.patch +++ /dev/null @@ -1,30 +0,0 @@ -From a681a79472df85cdc8c052bc61fb8b9e7b9a6495 Mon Sep 17 00:00:00 2001 -From: Tim Orling <tim.orling@konsulko.com> -Date: Sun, 27 Feb 2022 11:50:36 -0800 -Subject: [PATCH] setup.py: switch from distutils to setuptools - -In Python 3.10, distutils is deprecated and slated for removal in Python -3.12. It also prevents 'setup.py bdist_wheel' from building a wheel. - -Upstream-Status: Submitted -[https://github.com/systemd/python-systemd/pull/103] - -Signed-off-by: Tim Orling <tim.orling@konsulko.com> ---- - setup.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/setup.py b/setup.py -index 099819b..fe9c03a 100644 ---- a/setup.py -+++ b/setup.py -@@ -1,5 +1,5 @@ - import sys, os --from distutils.core import setup, Extension -+from setuptools import setup, Extension - from subprocess import Popen, PIPE, check_output - - def call(*cmd): --- -2.30.2 - diff --git a/meta-python/recipes-devtools/python/python-systemd/endian.patch b/meta-python/recipes-devtools/python/python-systemd/endian.patch deleted file mode 100644 index e09aea7336..0000000000 --- a/meta-python/recipes-devtools/python/python-systemd/endian.patch +++ /dev/null @@ -1,14 +0,0 @@ -Include endian.h for missing definitions of htobe16 - -Upstream-Status: Pending -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- a/systemd/util.c -+++ b/systemd/util.c -@@ -28,6 +28,7 @@ - #include <stdbool.h> - #include <assert.h> - #include <errno.h> -+#include <endian.h> - #include <fcntl.h> - #include <unistd.h> - #include <net/if.h> diff --git a/meta-python/recipes-devtools/python/python3-a2wsgi/run-ptest b/meta-python/recipes-devtools/python/python3-a2wsgi/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-a2wsgi/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-a2wsgi_1.10.4.bb b/meta-python/recipes-devtools/python/python3-a2wsgi_1.10.4.bb new file mode 100644 index 0000000000..e6b980266e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-a2wsgi_1.10.4.bb @@ -0,0 +1,33 @@ +SUMMARY = "Convert WSGI app to ASGI app or ASGI app to WSGI app." +HOMEPAGE = "https://github.com/abersheeran/a2wsgi" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=e10d05d29ec6d8be8bfc503683f1bc9a" + +inherit pypi python_setuptools_build_meta ptest + +SRC_URI[sha256sum] = "50e81ac55aa609fa2c666e42bacc25c424c8884ce6072f1a7e902114b7ee5d63" + +DEPENDS += " \ + python3-pdm-native \ + python3-pdm-backend-native \ +" + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-httpx \ + python3-pytest \ + python3-pytest-asyncio \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} + +RDEPENDS:${PN} += " \ + python3-asyncio \ +" diff --git a/meta-python/recipes-devtools/python/python3-absl_1.2.0.bb b/meta-python/recipes-devtools/python/python3-absl_2.1.0.bb index 42b3ddc93a..5bdb83175d 100644 --- a/meta-python/recipes-devtools/python/python3-absl_1.2.0.bb +++ b/meta-python/recipes-devtools/python/python3-absl_2.1.0.bb @@ -4,7 +4,7 @@ SECTION = "devel/python" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57" -SRC_URI[sha256sum] = "f568809938c49abbda89826223c992b630afd23c638160ad7840cfe347710d97" +SRC_URI[sha256sum] = "7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff" PYPI_PACKAGE = "absl-py" diff --git a/meta-python/recipes-devtools/python/python3-aenum_3.1.11.bb b/meta-python/recipes-devtools/python/python3-aenum_3.1.15.bb index b2fba6f010..3769be0d5d 100644 --- a/meta-python/recipes-devtools/python/python3-aenum_3.1.11.bb +++ b/meta-python/recipes-devtools/python/python3-aenum_3.1.15.bb @@ -3,12 +3,12 @@ HOMEPAGE = "https://pypi.org/project/aenum/" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://aenum/LICENSE;md5=c6a85477543f8b8591b9c1f82abebbe9" -SRC_URI[sha256sum] = "aed2c273547ae72a0d5ee869719c02a643da16bf507c80958faadc7e038e3f73" +SRC_URI[sha256sum] = "8cbd76cd18c4f870ff39b24284d3ea028fbe8731a58df3aa581e434c575b9559" inherit pypi setuptools3 RDEPENDS:${PN} += "\ - ${PYTHON_PN}-pprint \ + python3-pprint \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-aiodns_3.0.0.bb b/meta-python/recipes-devtools/python/python3-aiodns_3.2.0.bb index 64599d43c3..bf3f1312d2 100644 --- a/meta-python/recipes-devtools/python/python3-aiodns_3.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-aiodns_3.2.0.bb @@ -4,14 +4,15 @@ HOMEPAGE = "https://github.com/saghul/aiodns" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=a565d8b5d06b9620968a135a2657b093" -SRC_URI[md5sum] = "181e11935c78965de2b2b7b0e5efba8d" -SRC_URI[sha256sum] = "946bdfabe743fceeeb093c8a010f5d1645f708a241be849e17edfb0e49e08cd6" +SRC_URI[sha256sum] = "62869b23409349c21b072883ec8998316b234c9a9e36675756e8e317e8768f72" PYPI_PACKAGE = "aiodns" inherit pypi setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-asyncio \ - ${PYTHON_PN}-pycares \ + python3-asyncio \ + python3-pycares \ " + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-aiofiles_0.8.0.bb b/meta-python/recipes-devtools/python/python3-aiofiles_23.2.1.bb index d50cb8e6f4..73dc17423e 100644 --- a/meta-python/recipes-devtools/python/python3-aiofiles_0.8.0.bb +++ b/meta-python/recipes-devtools/python/python3-aiofiles_23.2.1.bb @@ -4,12 +4,12 @@ HOMEPAGE = "https://github.com/aio-libs/aiohttp" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=d2794c0df5b907fdace235a619d80314" -SRC_URI[sha256sum] = "8334f23235248a3b2e83b2c3a78a22674f39969b96397126cc93664d9a901e59" +SRC_URI[sha256sum] = "84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a" PYPI_PACKAGE = "aiofiles" -inherit pypi python_poetry_core +inherit pypi python_hatchling RDEPENDS:${PN} = "\ - ${PYTHON_PN}-asyncio \ + python3-asyncio \ " diff --git a/meta-python/recipes-devtools/python/python3-aiohappyeyeballs_2.3.2.bb b/meta-python/recipes-devtools/python/python3-aiohappyeyeballs_2.3.2.bb new file mode 100644 index 0000000000..edad28e772 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-aiohappyeyeballs_2.3.2.bb @@ -0,0 +1,12 @@ +SUMMARY = "Happy Eyeballs" +DESCRIPTION = "This library exists to allow connecting with Happy Eyeballs when you already have a list of addrinfo and not a DNS name." +HOMEPAGE = "https://github.com/aio-libs/aiohappyeyeballs" +LICENSE = "PSF-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=fcf6b249c2641540219a727f35d8d2c2" + +SRC_URI[sha256sum] = "77e15a733090547a1f5369a1287ddfc944bd30df0eb8993f585259c34b405f4e" + +inherit pypi python_poetry_core + +BBCLASSEXTEND = "native nativesdk" + diff --git a/meta-python/recipes-devtools/python/python3-aiohttp-jinja2_1.5.bb b/meta-python/recipes-devtools/python/python3-aiohttp-jinja2_1.6.bb index c86ec092a6..df4a0adcaf 100644 --- a/meta-python/recipes-devtools/python/python3-aiohttp-jinja2_1.5.bb +++ b/meta-python/recipes-devtools/python/python3-aiohttp-jinja2_1.6.bb @@ -3,13 +3,11 @@ SUMMARY = "jinja2 template renderer for aiohttp.web (http server for asyncio)" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=29dca541e03964615590ca7b50392d97" -SRC_URI[sha256sum] = "7c3ba5eac060b691f4e50534af2d79fca2a75712ebd2b25e6fcb1295859f910b" +SRC_URI[sha256sum] = "a3a7ff5264e5bca52e8ae547bbfd0761b72495230d438d05b6c0915be619b0e2" inherit pypi setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-jinja2 \ - ${PYTHON_PN}-aiohttp \ + python3-jinja2 \ + python3-aiohttp \ " - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-aiohttp_3.8.1.bb b/meta-python/recipes-devtools/python/python3-aiohttp_3.8.1.bb deleted file mode 100644 index f2b8d52a72..0000000000 --- a/meta-python/recipes-devtools/python/python3-aiohttp_3.8.1.bb +++ /dev/null @@ -1,27 +0,0 @@ -SUMMARY = "Async http client/server framework" -DESCRIPTION = "Asynchronous HTTP client/server framework for asyncio and Python" -HOMEPAGE = "https://github.com/aio-libs/aiohttp" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=8074d6c6e217873b2a018a4522243ea3" - -SRC_URI[sha256sum] = "fc5471e1a54de15ef71c1bc6ebe80d4dc681ea600e68bfd1cbce40427f0b7578" - -PYPI_PACKAGE = "aiohttp" -inherit python_setuptools_build_meta pypi - -RDEPENDS:${PN} = "\ - ${PYTHON_PN}-async-timeout \ - ${PYTHON_PN}-attrs \ - ${PYTHON_PN}-chardet \ - ${PYTHON_PN}-html \ - ${PYTHON_PN}-idna-ssl \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-misc \ - ${PYTHON_PN}-multidict \ - ${PYTHON_PN}-netserver \ - ${PYTHON_PN}-typing-extensions \ - ${PYTHON_PN}-yarl \ - ${PYTHON_PN}-cchardet \ - ${PYTHON_PN}-charset-normalizer \ - ${PYTHON_PN}-aiosignal \ -" diff --git a/meta-python/recipes-devtools/python/python3-aiohttp_3.9.4.bb b/meta-python/recipes-devtools/python/python3-aiohttp_3.9.4.bb new file mode 100644 index 0000000000..1cfed0d7a4 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-aiohttp_3.9.4.bb @@ -0,0 +1,22 @@ +SUMMARY = "Async http client/server framework" +DESCRIPTION = "Asynchronous HTTP client/server framework for asyncio and Python" +HOMEPAGE = "https://github.com/aio-libs/aiohttp" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=748073912af33aa59430d3702aa32d41" + +SRC_URI[sha256sum] = "6ff71ede6d9a5a58cfb7b6fffc83ab5d4a63138276c771ac91ceaaddf5459644" + +PYPI_PACKAGE = "aiohttp" +inherit python_setuptools_build_meta pypi + +RDEPENDS:${PN} = "\ + python3-aiohappyeyeballs \ + python3-aiosignal \ + python3-async-timeout \ + python3-attrs \ + python3-frozenlist \ + python3-misc \ + python3-multidict \ + python3-yarl \ + python3-aiodns \ +" diff --git a/meta-python/recipes-devtools/python/python3-aiohue_4.5.0.bb b/meta-python/recipes-devtools/python/python3-aiohue_4.7.1.bb index 7507b8ffd0..438c771dbc 100644 --- a/meta-python/recipes-devtools/python/python3-aiohue_4.5.0.bb +++ b/meta-python/recipes-devtools/python/python3-aiohue_4.7.1.bb @@ -4,13 +4,13 @@ SECTION = "devel/python" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=dab31a1d28183826937f4b152143a33f" -SRC_URI[sha256sum] = "9a5aaf2fa97a889746142093e74143d5e3e02209fae428d1e2dbcc34a5c36efd" +SRC_URI[sha256sum] = "29b5e5ae05938cac195b1969e70bd6ad4e4e2e105d0e565849803d2a99ff47d1" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta RDEPENDS:${PN} += " \ - ${PYTHON_PN}-aiohttp \ - ${PYTHON_PN}-asyncio-throttle \ - ${PYTHON_PN}-profile \ - ${PYTHON_PN}-awesomeversion \ + python3-aiohttp \ + python3-asyncio-throttle \ + python3-profile \ + python3-awesomeversion \ " diff --git a/meta-python/recipes-devtools/python/python3-aioredis_2.0.1.bb b/meta-python/recipes-devtools/python/python3-aioredis_2.0.1.bb new file mode 100644 index 0000000000..d8a8f2d033 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-aioredis_2.0.1.bb @@ -0,0 +1,16 @@ +SUMMARY = "The library is intended to provide simple and clear interface to Redis based on asyncio." +HOMEPAGE = "https://github.com/aio-libs/aioredis-py" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=bf9085f32a671dfa86ee69fe0fff7b95" + +SRC_URI[sha256sum] = "eaa51aaf993f2d71f54b70527c440437ba65340588afeb786cd87c55c89cd98e" + +PYPI_PACKAGE = "aioredis" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-core (>=3.6) \ + python3-async-timeout \ + python3-typing-extensions \ +" diff --git a/meta-python/recipes-devtools/python/python3-aioserial_1.3.1.bb b/meta-python/recipes-devtools/python/python3-aioserial_1.3.1.bb new file mode 100755 index 0000000000..8279f27044 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-aioserial_1.3.1.bb @@ -0,0 +1,17 @@ +DESCRIPTION = "An asynchronous serial port library for Python" +HOMEPAGE = "https://github.com/changyuheng/aioserial.py" +SECTION = "devel/python" + +LICENSE = "MPL-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=650b9179efef1ea560df5c08bc32b494" + +PYPI_PACKAGE = "aioserial" + +SRC_URI[sha256sum] = "702bf03b0eb84b8ef2d8dac5cb925e1e685dce98f77b125569bc6fd2b3b58228" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-asyncio \ + python3-pyserial \ +" diff --git a/meta-python/recipes-devtools/python/python3-aiosignal_1.2.0.bb b/meta-python/recipes-devtools/python/python3-aiosignal_1.3.1.bb index efd94f7934..fd4ec767c0 100644 --- a/meta-python/recipes-devtools/python/python3-aiosignal_1.2.0.bb +++ b/meta-python/recipes-devtools/python/python3-aiosignal_1.3.1.bb @@ -3,12 +3,12 @@ HOMEPAGE = "https://github.com/aio-libs/aiosignal" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=cf056e8e7a0a5477451af18b7b5aa98c" -SRC_URI[sha256sum] = "78ed67db6c7b7ced4f98e495e572106d5c432a93e1ddd1bf475e1dc05f5b7df2" +SRC_URI[sha256sum] = "54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc" inherit pypi setuptools3 BBCLASSEXTEND = "native nativesdk" RDEPENDS:${PN} = "\ - ${PYTHON_PN}-frozenlist \ + python3-frozenlist \ " diff --git a/meta-python/recipes-devtools/python/python3-alembic_1.13.1.bb b/meta-python/recipes-devtools/python/python3-alembic_1.13.1.bb new file mode 100644 index 0000000000..c4853c4437 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-alembic_1.13.1.bb @@ -0,0 +1,19 @@ +DESCRIPTION = "A database migration tool for SQLAlchemy" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=e3023b042cb6002cb398344b51c67093" + +inherit pypi setuptools3 + +SRC_URI[sha256sum] = "4932c8558bf68f2ee92b9bbcb8218671c627064d5b08939437af6d77dc05e595" + +PYPI_PACKAGE = "alembic" + +RDEPENDS:${PN} += "\ + python3-dateutil \ + python3-editor \ + python3-mako \ + python3-sqlalchemy \ + python3-misc \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-alembic_1.8.1.bb b/meta-python/recipes-devtools/python/python3-alembic_1.8.1.bb deleted file mode 100644 index 3e31158835..0000000000 --- a/meta-python/recipes-devtools/python/python3-alembic_1.8.1.bb +++ /dev/null @@ -1,19 +0,0 @@ -DESCRIPTION = "A database migration tool for SQLAlchemy" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=f5a8522010db1a393833988dbe2c7f0b" - -inherit pypi setuptools3 - -SRC_URI[sha256sum] = "cd0b5e45b14b706426b833f06369b9a6d5ee03f826ec3238723ce8caaf6e5ffa" - -PYPI_PACKAGE = "alembic" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-dateutil \ - ${PYTHON_PN}-editor \ - ${PYTHON_PN}-mako \ - ${PYTHON_PN}-sqlalchemy \ - ${PYTHON_PN}-misc \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-aniso8601_9.0.1.bb b/meta-python/recipes-devtools/python/python3-aniso8601_9.0.1.bb new file mode 100644 index 0000000000..3d99e48c26 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-aniso8601_9.0.1.bb @@ -0,0 +1,8 @@ +DESCRIPTION = "A library for parsing ISO 8601 strings." + +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=6d91d56f51a54389d95526eefe039b1c" + +SRC_URI[sha256sum] = "72e3117667eedf66951bb2d93f4296a56b94b078a8a95905a052611fb3f1b973" + +inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-annotated-types_0.6.0.bb b/meta-python/recipes-devtools/python/python3-annotated-types_0.6.0.bb new file mode 100644 index 0000000000..79cbb66bc0 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-annotated-types_0.6.0.bb @@ -0,0 +1,14 @@ +SUMMARY = "Reusable constraint types to use with typing.Annotated" +DESCRIPTION = "" +HOMEPAGE = "" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=c6afb13fdc220497ee5cded1e717ed67" + +SRC_URI[sha256sum] = "563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d" + +S = "${WORKDIR}/annotated_types-${PV}" +PYPI_PACKAGE = "annotated_types" + +inherit pypi python_hatchling + +RDEPENDS:${PN} = "python3-typing-extensions" diff --git a/meta-python/recipes-devtools/python/python3-ansi2html_1.8.0.bb b/meta-python/recipes-devtools/python/python3-ansi2html_1.9.1.bb index 8dcd7b0d5d..6af8989177 100644 --- a/meta-python/recipes-devtools/python/python3-ansi2html_1.8.0.bb +++ b/meta-python/recipes-devtools/python/python3-ansi2html_1.9.1.bb @@ -5,16 +5,15 @@ LICENSE = "GPL-3.0-only" PYPI_PACKAGE = "ansi2html" -SRC_URI[sha256sum] = "38b82a298482a1fa2613f0f9c9beb3db72a8f832eeac58eb2e47bf32cd37f6d5" +SRC_URI[sha256sum] = "5c6837a13ecc1903aab7a545353312049dfedfe5105362ad3a8d9d207871ec71" inherit pypi python_setuptools_build_meta DEPENDS += " \ - ${PYTHON_PN}-setuptools-scm-native \ - ${PYTHON_PN}-setuptools-scm-git-archive-native \ + python3-setuptools-scm-native \ " RDEPENDS:${PN} = " \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-compression \ + python3-six \ + python3-compression \ " diff --git a/meta-python/recipes-devtools/python/python3-ansicolors/run-ptest b/meta-python/recipes-devtools/python/python3-ansicolors/run-ptest index 7dc3ef32be..922353a1f3 100644 --- a/meta-python/recipes-devtools/python/python3-ansicolors/run-ptest +++ b/meta-python/recipes-devtools/python/python3-ansicolors/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO test.py| sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake test.py diff --git a/meta-python/recipes-devtools/python/python3-ansicolors_1.1.8.bb b/meta-python/recipes-devtools/python/python3-ansicolors_1.1.8.bb index 0e32443992..b63cc32a23 100644 --- a/meta-python/recipes-devtools/python/python3-ansicolors_1.1.8.bb +++ b/meta-python/recipes-devtools/python/python3-ansicolors_1.1.8.bb @@ -14,7 +14,8 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-antlr4-runtime_4.10.bb b/meta-python/recipes-devtools/python/python3-antlr4-runtime_4.13.1.bb index 01f17207c6..431d37c7d7 100644 --- a/meta-python/recipes-devtools/python/python3-antlr4-runtime_4.10.bb +++ b/meta-python/recipes-devtools/python/python3-antlr4-runtime_4.13.1.bb @@ -1,8 +1,8 @@ SUMMARY = "ANTLR runtime for Python" LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://PKG-INFO;md5=6e514123aedb5d9fb133d1bc6c598d46" +LIC_FILES_CHKSUM = "file://PKG-INFO;md5=4b18e4a9f93178eaa50a9a37f26da7f7" -SRC_URI[sha256sum] = "061a49bc72ae05a35d9b61c0ba0ac36c0397708819f02fbfb20a80e47d287a1b" +SRC_URI[sha256sum] = "3cd282f5ea7cfb841537fe01f143350fdb1c0b1ce7981443a2fa8513fddb6d1a" PYPI_PACKAGE = "antlr4-python3-runtime" diff --git a/meta-python/recipes-devtools/python/python3-anyio_4.3.0.bb b/meta-python/recipes-devtools/python/python3-anyio_4.3.0.bb new file mode 100644 index 0000000000..2c7a9f8cab --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-anyio_4.3.0.bb @@ -0,0 +1,27 @@ +SUMMARY = "High level compatibility layer for multiple asynchronous event loop implementations" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=c0a769411d2af7894099e8ff75058c9f" + +inherit pypi python_setuptools_build_meta + +SRC_URI[sha256sum] = "f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6" + +DEPENDS += " \ + python3-setuptools-scm-native \ +" + +# Don't provide "trio" PACKAGECONFIG as nothing provides "python3-trio" currently. +# If somebody needs this please feel free to add python3-trio and enable the +# packageconfig below: +#PACKAGECONFIG ??= "" +#PACKAGECONFIG[trio] = ",,,python3-trio" + +RDEPENDS:${PN} += "\ + python3-idna \ + python3-sniffio \ + python3-core \ + python3-numbers \ + python3-io \ + python3-asyncio \ +" diff --git a/meta-python/recipes-devtools/python/python3-anyjson/0001-setup.py-Do-not-use-2to3.patch b/meta-python/recipes-devtools/python/python3-anyjson/0001-setup.py-Do-not-use-2to3.patch deleted file mode 100644 index 2b9e6e52e8..0000000000 --- a/meta-python/recipes-devtools/python/python3-anyjson/0001-setup.py-Do-not-use-2to3.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 4fb61d7c621599b0db9c2c45f4243f07936c5953 Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Wed, 13 Oct 2021 08:20:00 -0700 -Subject: [PATCH] setup.py: Do not use 2to3 - -This helps compiling with setuptools 0.58+ -and it seems to compile fine with python3 - -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- - setup.py | 2 -- - 1 file changed, 2 deletions(-) - -diff --git a/setup.py b/setup.py -index 9fe4902..f2098e1 100644 ---- a/setup.py -+++ b/setup.py -@@ -2,8 +2,6 @@ import os - import sys - - extra = {} --if sys.version_info >= (3, 0): -- extra.update(use_2to3=True) - - try: - from setuptools import setup, find_packages --- -2.33.0 - diff --git a/meta-python/recipes-devtools/python/python3-anyjson/run-ptest b/meta-python/recipes-devtools/python/python3-anyjson/run-ptest deleted file mode 100644 index b63c4de0d9..0000000000 --- a/meta-python/recipes-devtools/python/python3-anyjson/run-ptest +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' diff --git a/meta-python/recipes-devtools/python/python3-apiflask_2.1.1.bb b/meta-python/recipes-devtools/python/python3-apiflask_2.1.1.bb new file mode 100644 index 0000000000..94f2e37a89 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-apiflask_2.1.1.bb @@ -0,0 +1,18 @@ +SUMMARY = "APIFlask is a lightweight Python web API framework based on Flask and marshmallow-code projects." +HOMEPAGE = "https://github.com/apiflask/apiflask" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=5f89d1b0dec37448d4f4163dc3c40e64" + +inherit pypi setuptools3 + +PYPI_PACKAGE = "APIFlask" + +SRC_URI[sha256sum] = "88db5a539cc155e35d9636d99b434d00ca6c0b23e7c87c8321ec9dc980535366" + +RDEPENDS:${PN} += "\ + python3-flask \ + python3-flask-marshmallow \ + python3-webargs \ + python3-flask-httpauth \ + python3-apispec \ + " diff --git a/meta-python/recipes-devtools/python/python3-apispec_6.4.0.bb b/meta-python/recipes-devtools/python/python3-apispec_6.4.0.bb new file mode 100644 index 0000000000..a48e1cfaee --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-apispec_6.4.0.bb @@ -0,0 +1,10 @@ +SUMMARY = "A pluggable API specification generator. Currently supports the OpenAPI Specification (f.k.a. the Swagger specification)." +HOMEPAGE = "https://github.com/marshmallow-code/apispec" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3d9c303644a2e62578f0347748a80358" + +inherit pypi setuptools3 + +SRC_URI[sha256sum] = "42b8a6833cf154c9dbd22d006b56bf9c49c972d32d24fe716fd734e0f6b739b8" + +RDEPENDS:${PN} += "python3-packaging" diff --git a/meta-python/recipes-devtools/python/python3-appdirs/run-ptest b/meta-python/recipes-devtools/python/python3-appdirs/run-ptest index 5287f3e035..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-appdirs/run-ptest +++ b/meta-python/recipes-devtools/python/python3-appdirs/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest | sed -e 's/\[100%\]//g' | sed -e 's/\.\.F/: FAIL/g' | sed -e 's/\.\.\./: PASS/g' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-appdirs_1.4.4.bb b/meta-python/recipes-devtools/python/python3-appdirs_1.4.4.bb index 977999bfe5..ad07b3b082 100644 --- a/meta-python/recipes-devtools/python/python3-appdirs_1.4.4.bb +++ b/meta-python/recipes-devtools/python/python3-appdirs_1.4.4.bb @@ -12,10 +12,13 @@ SRC_URI[sha256sum] = "7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27 inherit pypi setuptools3 ptest RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { install -d ${D}${PTEST_PATH}/test cp -rf ${S}/test/* ${D}${PTEST_PATH}/test/ } + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-argcomplete_2.0.0.bb b/meta-python/recipes-devtools/python/python3-argcomplete_3.3.0.bb index 4eab34f488..d96861010e 100644 --- a/meta-python/recipes-devtools/python/python3-argcomplete_2.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-argcomplete_3.3.0.bb @@ -3,15 +3,15 @@ HOMEPAGE = "https://github.com/kislyuk/argcomplete" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=2ee41112a44fe7014dce33e26468ba93" -SRC_URI[sha256sum] = "6372ad78c89d662035101418ae253668445b391755cfe94ea52f1b9d22425b20" +SRC_URI[sha256sum] = "fd03ff4a5b9e6580569d34b273f741e85cd9e072f3feeeee3eba4891c70eda62" PYPI_PACKAGE = "argcomplete" inherit pypi setuptools3 RDEPENDS:${PN} += "\ - ${PYTHON_PN}-core \ - ${PYTHON_PN}-io \ + python3-core \ + python3-io \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-argh_0.26.2.bb b/meta-python/recipes-devtools/python/python3-argh_0.26.2.bb deleted file mode 100644 index c02e31a9a1..0000000000 --- a/meta-python/recipes-devtools/python/python3-argh_0.26.2.bb +++ /dev/null @@ -1,14 +0,0 @@ -SUMMARY = "Pattern matching and various utilities for file systems paths." - -LICENSE = "LGPL-2.0-only" -LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=cede70b648dcc81baf5b431d38905bad" - -SRC_URI[sha256sum] = "e9535b8c84dc9571a48999094fda7f33e63c3f1b74f3e5f3ac0105a58405bb65" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-logging \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-argh_0.31.2.bb b/meta-python/recipes-devtools/python/python3-argh_0.31.2.bb new file mode 100644 index 0000000000..afcd7d9665 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-argh_0.31.2.bb @@ -0,0 +1,26 @@ +SUMMARY = "An unobtrusive argparse wrapper with natural syntax" +DESCRIPTION = "Building a command-line interface? Found yourself uttering \ +'argh!' while struggling with the API of argparse? Don't like the complexity \ +but need the power? \ +\ +Everything should be made as simple as possible, but no simpler. \ +\ +—Albert Einstein (probably) \ +\ +Argh is a smart wrapper for argparse. Argparse is a very powerful \ +tool; Argh just makes it easy to use." + +LICENSE = "LGPL-3.0-or-later" +LIC_FILES_CHKSUM = "file://COPYING.LESSER;md5=3000208d539ec061b899bce1d9ce9404 \ + " + +SRC_URI[sha256sum] = "db1c34885804f7d4646c385dc2fb19b45298561322f4c15eae1b133993f9e323" + +inherit pypi python_flit_core + +RDEPENDS:${PN} += " \ + python3-argcomplete \ + python3-logging \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-arpeggio_2.0.0.bb b/meta-python/recipes-devtools/python/python3-arpeggio_2.0.2.bb index 96d6de6a69..3130e2cb96 100644 --- a/meta-python/recipes-devtools/python/python3-arpeggio_2.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-arpeggio_2.0.2.bb @@ -3,15 +3,15 @@ HOMEPAGE = "https://pypi.org/project/Arpeggio/" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=33b8d1ba459a2fa4d801acfd1d1b7ceb" -SRC_URI[sha256sum] = "d6b03839019bb8a68785f9292ee6a36b1954eb84b925b84a6b8a5e1e26d3ed3d" +SRC_URI[sha256sum] = "c790b2b06e226d2dd468e4fbfb5b7f506cec66416031fde1441cf1de2a0ba700" PYPI_PACKAGE = "Arpeggio" inherit pypi setuptools3 # setup.py of Arpeggio needs this. DEPENDS += "\ - ${PYTHON_PN}-pytest-runner-native \ - ${PYTHON_PN}-wheel-native \ + python3-pytest-runner-native \ + python3-wheel-native \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-arrow/run-ptest b/meta-python/recipes-devtools/python/python3-arrow/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-arrow/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-arrow_1.3.0.bb b/meta-python/recipes-devtools/python/python3-arrow_1.3.0.bb new file mode 100644 index 0000000000..c1b7c1a433 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-arrow_1.3.0.bb @@ -0,0 +1,35 @@ +SUMMARY = "Better dates and times for Python" +HOMEPAGE = "https://github.com/arrow-py/arrow" +SECTION = "devel/python" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=14a2e29a9d542fb9052d75344d67619d" + +SRC_URI[sha256sum] = "d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85" + +inherit pypi python_flit_core ptest + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-dateutil-zoneinfo \ + python3-pytest \ + python3-pytest-mock \ + python3-pytz \ + python3-simplejson \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} + +RDEPENDS:${PN} += " \ + python3-compression \ + python3-dateutil \ + python3-dateutil-zoneinfo \ + python3-json \ + python3-types-python-dateutil \ +" diff --git a/meta-python/recipes-devtools/python/python3-asgiref/run-ptest b/meta-python/recipes-devtools/python/python3-asgiref/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-asgiref/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-asgiref_3.8.1.bb b/meta-python/recipes-devtools/python/python3-asgiref_3.8.1.bb new file mode 100644 index 0000000000..3b90eda5bb --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-asgiref_3.8.1.bb @@ -0,0 +1,30 @@ +DESCRIPTION = "ASGI is a standard for Python asynchronous web apps and servers to communicate with each other, and positioned as an asynchronous successor to WSGI." +HOMEPAGE = "https://pypi.org/project/asgiref/" +SECTION = "devel/python" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=f09eb47206614a4954c51db8a94840fa" + +SRC_URI += "file://run-ptest \ + " + +SRC_URI[sha256sum] = "c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590" + +export BUILD_SYS +export HOST_SYS + +inherit pypi ptest setuptools3 + +RDEPENDS:${PN}-ptest += " \ + python3-asyncio \ + python3-io \ + python3-multiprocessing \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-aspectlib/0001-Remove-tornado-6-test-constraint.-Ref-15.patch b/meta-python/recipes-devtools/python/python3-aspectlib/0001-Remove-tornado-6-test-constraint.-Ref-15.patch deleted file mode 100644 index 174f088e9e..0000000000 --- a/meta-python/recipes-devtools/python/python3-aspectlib/0001-Remove-tornado-6-test-constraint.-Ref-15.patch +++ /dev/null @@ -1,45 +0,0 @@ -From d3ae6ac951cc5bbce29b9c987741e0a557c9b777 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ionel=20Cristian=20M=C4=83rie=C8=99?= <contact@ionelmc.ro> -Date: Sun, 2 May 2021 09:50:43 +0300 -Subject: [PATCH] Remove tornado<6 test constraint. Ref #15. - -Upstream-Status: Backport [https://github.com/ionelmc/python-aspectlib/commit/7dccb198dfb426f529b81a28a755f3c02f8b50cb] -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- - tests/test_integrations_py3.py | 5 ++++- - tox.ini | 3 ++- - 2 files changed, 6 insertions(+), 2 deletions(-) - -diff --git a/tests/test_integrations_py3.py b/tests/test_integrations_py3.py -index e025eac..596589d 100644 ---- a/tests/test_integrations_py3.py -+++ b/tests/test_integrations_py3.py -@@ -36,7 +36,10 @@ def test_decorate_tornado_coroutine(): - @gen.coroutine - @debug.log(print_to=buf, module=False, stacktrace=2, result_repr=repr) - def coro(): -- yield gen.Task(loop.add_timeout, timedelta(microseconds=10)) -+ if hasattr(gen, 'Task'): -+ yield gen.Task(loop.add_timeout, timedelta(microseconds=10)) -+ else: -+ yield gen.sleep(0.01) - return "result" - - loop = ioloop.IOLoop.current() -diff --git a/tox.ini b/tox.ini -index 8c607de..08c31b3 100644 ---- a/tox.ini -+++ b/tox.ini -@@ -55,7 +55,8 @@ deps = - pytest-clarity - pytest-cov - pytest-travis-fold -- tornado<6.0 -+ six -+ tornado - commands = - {posargs:pytest --cov --cov-report=term-missing -vv --ignore=src} - --- -2.32.0 - diff --git a/meta-python/recipes-devtools/python/python3-aspectlib/run-ptest b/meta-python/recipes-devtools/python/python3-aspectlib/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-aspectlib/run-ptest +++ b/meta-python/recipes-devtools/python/python3-aspectlib/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-aspectlib_1.5.2.bb b/meta-python/recipes-devtools/python/python3-aspectlib_2.0.0.bb index 71f3d3594e..1341513289 100644 --- a/meta-python/recipes-devtools/python/python3-aspectlib_1.5.2.bb +++ b/meta-python/recipes-devtools/python/python3-aspectlib_2.0.0.bb @@ -6,14 +6,13 @@ DESCRIPTION = " It is useful when changing behavior in existing code is desired. It includes tools for debugging and testing: simple mock/record and a complete capture/replay framework." HOMEPAGE = "https://github.com/ionelmc/python-aspectlib" LICENSE = "BSD-2-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=d58b3f20fd10347a9458b8a03793b62e" +LIC_FILES_CHKSUM = "file://LICENSE;md5=80721ace117fd1f814049ecb81c6be76" -SRC_URI[sha256sum] = "d275ec82c4c2712e564bb760e4accff8f061f648e38774feabeb8b241cf3a4aa" +SRC_URI[sha256sum] = "a4b461b9da0b531aebcb93efcde3de808a72c60226dd8d902c467d13faf7ce92" inherit ptest pypi setuptools3 SRC_URI += "file://run-ptest \ - file://0001-Remove-tornado-6-test-constraint.-Ref-15.patch \ " do_install_ptest() { @@ -22,10 +21,15 @@ do_install_ptest() { } RDEPENDS:${PN}-ptest += "\ - python3-tornado \ python3-process-tests \ + python3-pytest \ + python3-tornado \ + python3-unittest-automake-output \ " -RDEPENDS:${PN} += "python3-core python3-fields" +RDEPENDS:${PN} += " \ + python3-fields \ + python3-logging \ +" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-astor_0.8.1.bb b/meta-python/recipes-devtools/python/python3-astor_0.8.1.bb index 54e43e3754..bc3315f751 100644 --- a/meta-python/recipes-devtools/python/python3-astor_0.8.1.bb +++ b/meta-python/recipes-devtools/python/python3-astor_0.8.1.bb @@ -10,7 +10,6 @@ SRC_URI = "git://github.com/berkerpeksag/astor.git;branch=master;protocol=https SRCREV ?= "c7553c79f9222e20783fe9bd8a553f932e918072" inherit setuptools3 -PIP_INSTALL_PACKAGE = "astor" S = "${WORKDIR}/git" diff --git a/meta-python/recipes-devtools/python/python3-astroid_2.12.2.bb b/meta-python/recipes-devtools/python/python3-astroid_3.1.0.bb index ae2a4109ef..3c68f1e583 100644 --- a/meta-python/recipes-devtools/python/python3-astroid_2.12.2.bb +++ b/meta-python/recipes-devtools/python/python3-astroid_3.1.0.bb @@ -4,11 +4,14 @@ SECTION = "devel/python" LICENSE = "LGPL-2.1-only" LIC_FILES_CHKSUM = "file://LICENSE;md5=a70cf540abf41acb644ac3b621b2fad1" -SRC_URI[sha256sum] = "4675ef501edbbb143b3d9bb4c81d5f6338f08f960beed2ce41a03dc4cd20d777" +SRC_URI[sha256sum] = "ac248253bfa4bd924a0de213707e7ebeeb3138abeb48d798784ead1e56d419d4" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta -DEPENDS += "${PYTHON_PN}-pytest-runner-native" +DEPENDS += "\ + python3-pytest-runner-native \ + python3-wheel-native \ +" PACKAGES =+ "${PN}-tests" @@ -18,15 +21,17 @@ FILES:${PN}-tests += " \ " RDEPENDS:${PN}:class-target += "\ - ${PYTHON_PN}-distutils \ - ${PYTHON_PN}-lazy-object-proxy \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-wrapt \ - ${PYTHON_PN}-setuptools \ + python3-lazy-object-proxy \ + python3-logging \ + python3-six \ + python3-wrapt \ + python3-setuptools \ + python3-typing-extensions \ " RDEPENDS:${PN}-tests:class-target += "\ - ${PYTHON_PN}-unittest \ - ${PYTHON_PN}-xml \ + python3-unittest \ + python3-xml \ " + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-asttokens_2.0.7.bb b/meta-python/recipes-devtools/python/python3-asttokens_2.4.1.bb index 5e3ca9e30f..dbb2fc0ebe 100644 --- a/meta-python/recipes-devtools/python/python3-asttokens_2.0.7.bb +++ b/meta-python/recipes-devtools/python/python3-asttokens_2.4.1.bb @@ -7,12 +7,12 @@ PYPI_PACKAGE = "asttokens" inherit pypi python_setuptools_build_meta -SRC_URI[sha256sum] = "8444353e4e2a99661c8dfb85ec9c02eedded08f0006234bff7db44a06840acc2" +SRC_URI[sha256sum] = "b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0" DEPENDS += "python3-setuptools-scm-native" RDEPENDS:${PN} += " \ - ${PYTHON_PN}-six \ + python3-six \ " BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-async-timeout_4.0.0.bb b/meta-python/recipes-devtools/python/python3-async-timeout_4.0.0.bb deleted file mode 100644 index ca61490fac..0000000000 --- a/meta-python/recipes-devtools/python/python3-async-timeout_4.0.0.bb +++ /dev/null @@ -1,18 +0,0 @@ -SUMMARY = "asyncio-compatible timeout context manager" -DESCRIPTION = "\ -The context manager is useful in cases when you want to apply \ -timeout logic around block of code or in cases when asyncio.wait_for() \ -is not suitable. Also it's much faster than asyncio.wait_for() because \ -timeout doesn't create a new task." -HOMEPAGE = "https://github.com/aio-libs/async-timeout" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=4fa41f15bb5f23b6d3560c5845eb8d57" - -SRC_URI[sha256sum] = "7d87a4e8adba8ededb52e579ce6bc8276985888913620c935094c2276fd83382" - -PYPI_PACKAGE = "async-timeout" -inherit pypi setuptools3 - -RDEPENDS:${PN} = "\ - ${PYTHON_PN}-asyncio \ -" diff --git a/meta-python/recipes-devtools/python/python3-async-timeout_4.0.2.bb b/meta-python/recipes-devtools/python/python3-async-timeout_4.0.3.bb index b1d19ce619..3d35780b65 100644 --- a/meta-python/recipes-devtools/python/python3-async-timeout_4.0.2.bb +++ b/meta-python/recipes-devtools/python/python3-async-timeout_4.0.3.bb @@ -8,11 +8,11 @@ HOMEPAGE = "https://github.com/aio-libs/async-timeout" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=4fa41f15bb5f23b6d3560c5845eb8d57" -SRC_URI[sha256sum] = "2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15" +SRC_URI[sha256sum] = "4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f" PYPI_PACKAGE = "async-timeout" inherit pypi python_setuptools_build_meta RDEPENDS:${PN} = "\ - ${PYTHON_PN}-asyncio \ + python3-asyncio \ " diff --git a/meta-python/recipes-devtools/python/python3-asyncinotify_2.0.5.bb b/meta-python/recipes-devtools/python/python3-asyncinotify_4.0.6.bb index 4c64508752..34f7187d46 100644 --- a/meta-python/recipes-devtools/python/python3-asyncinotify_2.0.5.bb +++ b/meta-python/recipes-devtools/python/python3-asyncinotify_4.0.6.bb @@ -1,11 +1,11 @@ SUMMARY = "A simple optionally-async python inotify library, focused on simplicity of use and operation, and leveraging modern Python features" HOMEPAGE = "https://gitlab.com/Taywee/asyncinotify" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=6ec941a1cd6616454970d03cb9c9e8f8" +LICENSE = "MPL-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=f75d2927d3c1ed2414ef72048f5ad640" -SRC_URI[sha256sum] = "e4d95cba362f10d33b6fdd558afd39f0ea7a5be1a9694434e738141cbed366d9" +SRC_URI[sha256sum] = "c03fdb1a7dbb6bed8ede763e4e0ac224a2a3157bdc51e4ba3832588a3c29904d" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta RDEPENDS:${PN} += " \ python3-asyncio \ diff --git a/meta-python/recipes-devtools/python/python3-asyncio-glib_0.1.bb b/meta-python/recipes-devtools/python/python3-asyncio-glib_0.1.bb index 2314f72845..01dfe51543 100644 --- a/meta-python/recipes-devtools/python/python3-asyncio-glib_0.1.bb +++ b/meta-python/recipes-devtools/python/python3-asyncio-glib_0.1.bb @@ -1,9 +1,10 @@ SUMMARY = "An implementation of the Python 3 asyncio event loop on top of GLib" -AUTHOR = "James Henstridge" LICENSE = "LGPL-2.1-only" LIC_FILES_CHKSUM = "file://COPYING.LGPL;md5=4fbd65380cdd255951079008b364516c" -inherit setuptools3 pypi +inherit setuptools3 pypi features_check + +REQUIRED_DISTRO_FEATURES = "gobject-introspection-data" SRC_URI[md5sum] = "60153055e76ceaacdfbaeafb03d61dd9" SRC_URI[sha256sum] = "fe3ceb2ba5f541330c07ca1bd7ae792468d625bad1acf5354a3a7a0b9fd87521" diff --git a/meta-python/recipes-devtools/python/python3-asyncio-throttle_1.0.2.bb b/meta-python/recipes-devtools/python/python3-asyncio-throttle_1.0.2.bb index 1f907511a6..040e70940b 100644 --- a/meta-python/recipes-devtools/python/python3-asyncio-throttle_1.0.2.bb +++ b/meta-python/recipes-devtools/python/python3-asyncio-throttle_1.0.2.bb @@ -7,3 +7,5 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=c7906e56b70808e1ade6ca05e0bb48d5" SRC_URI[sha256sum] = "2675282e99d9129ecc446f917e174bc205c65e36c602aa18603b4948567fcbd4" inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-asyncio" diff --git a/meta-python/recipes-devtools/python/python3-autobahn_22.7.1.bb b/meta-python/recipes-devtools/python/python3-autobahn_22.7.1.bb deleted file mode 100644 index 09957ad003..0000000000 --- a/meta-python/recipes-devtools/python/python3-autobahn_22.7.1.bb +++ /dev/null @@ -1,23 +0,0 @@ -DESCRIPTION = "WebSocket client & server library, WAMP real-time framework" -HOMEPAGE = "http://crossbar.io/autobahn" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=97c0bda20ad1d845c6369c0e47a1cd98" - -SRC_URI[sha256sum] = "8b462ea2e6aad6b4dc0ed45fb800b6cbfeb0325e7fe6983907f122f2be4a1fe9" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-twisted \ - ${PYTHON_PN}-zopeinterface \ - ${PYTHON_PN}-py-ubjson \ - ${PYTHON_PN}-cbor2 \ - ${PYTHON_PN}-u-msgpack-python \ - ${PYTHON_PN}-lz4 \ - ${PYTHON_PN}-snappy \ - ${PYTHON_PN}-pyopenssl \ - ${PYTHON_PN}-txaio \ - ${PYTHON_PN}-six \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-autobahn_23.6.2.bb b/meta-python/recipes-devtools/python/python3-autobahn_23.6.2.bb new file mode 100644 index 0000000000..d9cc40b1b4 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-autobahn_23.6.2.bb @@ -0,0 +1,21 @@ +DESCRIPTION = "WebSocket client & server library, WAMP real-time framework" +HOMEPAGE = "http://crossbar.io/autobahn" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3e2c2c2cc2915edc5321b0e6b1d3f5f8" + +SRC_URI[sha256sum] = "ec9421c52a2103364d1ef0468036e6019ee84f71721e86b36fe19ad6966c1181" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-twisted \ + python3-zopeinterface \ + python3-py-ubjson \ + python3-cbor2 \ + python3-u-msgpack-python \ + python3-lz4 \ + python3-snappy \ + python3-pyopenssl \ + python3-txaio \ + python3-six \ +" diff --git a/meta-python/recipes-devtools/python/python3-autoflake_2.2.1.bb b/meta-python/recipes-devtools/python/python3-autoflake_2.2.1.bb new file mode 100644 index 0000000000..7b74308666 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-autoflake_2.2.1.bb @@ -0,0 +1,12 @@ +SUMMARY = "Removes unused imports and unused variables" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=88246be6a34c1496c253f58599f3db85" + +SRC_URI[sha256sum] = "62b7b6449a692c3c9b0c916919bbc21648da7281e8506bcf8d3f8280e431ebc1" + +inherit pypi python_hatchling + +RDEPENDS:${PN} += "python3-pyflakes" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-automat/0001-setup.py-remove-the-dependency-on-m2r.patch b/meta-python/recipes-devtools/python/python3-automat/0001-setup.py-remove-the-dependency-on-m2r.patch deleted file mode 100644 index b83b7f3808..0000000000 --- a/meta-python/recipes-devtools/python/python3-automat/0001-setup.py-remove-the-dependency-on-m2r.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 4fb6bbfbc53428fe5d38ec3e04bb4fd187b2fd45 Mon Sep 17 00:00:00 2001 -From: Derek Straka <derek@asterius.io> -Date: Fri, 22 Dec 2017 09:07:00 -0500 -Subject: [PATCH] setup.py: remove the dependency on m2r - -The dependency on m2r is removed here as it only provides the -long_description value that is optional. This item is just the -text that would be present on PyPi, so it doesn't provide much -value in this case - -Upstream-Status: Inappropriate (OE specific) - -Signed-off-by: Derek Straka <derek@asterius.io> -Signed-off-by: Leon Anavi <leon.anavi@konsulko.com> ---- - setup.py | 10 ---------- - 1 file changed, 10 deletions(-) - -diff --git a/setup.py b/setup.py -index 3fb7fdb..245d69a 100644 ---- a/setup.py -+++ b/setup.py -@@ -4,14 +4,6 @@ Setup file for automat - - from setuptools import setup, find_packages - --try: -- from m2r import parse_from_file -- long_description = parse_from_file('README.md') --except(IOError, ImportError): -- print("\n\n!!! m2r not found, long_description is bad, don't upload this to PyPI !!!\n\n") -- import io -- long_description = io.open('README.md', encoding="utf-8").read() -- - setup( - name='Automat', - use_scm_version=True, -@@ -19,12 +11,10 @@ setup( - description=""" - Self-service finite-state machines for the programmer on the go. - """.strip(), -- long_description=long_description, - packages=find_packages(exclude=[]), - package_dir={'automat': 'automat'}, - setup_requires=[ - 'setuptools-scm', -- 'm2r', - ], - install_requires=[ - "attrs>=19.2.0", --- -2.17.1 - diff --git a/meta-python/recipes-devtools/python/python3-automat_20.2.0.bb b/meta-python/recipes-devtools/python/python3-automat_20.2.0.bb deleted file mode 100644 index dbba97e76d..0000000000 --- a/meta-python/recipes-devtools/python/python3-automat_20.2.0.bb +++ /dev/null @@ -1,21 +0,0 @@ -DESCRIPTION = "Self-service finite-state machines for the programmer on the go" -HOMEPAGE = "https://github.com/glyph/Automat" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=4ad213bcca81688e94593e5f60c87477" - -SRC_URI[md5sum] = "d6cef9886b037b8857bfbc686f3ae30a" -SRC_URI[sha256sum] = "7979803c74610e11ef0c0d68a2942b152df52da55336e0c9d58daf1831cbdf33" - -DEPENDS += "${PYTHON_PN}-setuptools-scm-native" - -SRC_URI:append = " \ - file://0001-setup.py-remove-the-dependency-on-m2r.patch \ -" - -PYPI_PACKAGE = "Automat" -inherit pypi setuptools3 - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-attrs \ - ${PYTHON_PN}-six \ -" diff --git a/meta-python/recipes-devtools/python/python3-automat_22.10.0.bb b/meta-python/recipes-devtools/python/python3-automat_22.10.0.bb new file mode 100644 index 0000000000..9e33fe7831 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-automat_22.10.0.bb @@ -0,0 +1,16 @@ +DESCRIPTION = "Self-service finite-state machines for the programmer on the go" +HOMEPAGE = "https://github.com/glyph/Automat" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=4ad213bcca81688e94593e5f60c87477" + +SRC_URI[sha256sum] = "e56beb84edad19dcc11d30e8d9b895f75deeb5ef5e96b84a467066b3b84bb04e" + +DEPENDS += "python3-setuptools-scm-native" + +PYPI_PACKAGE = "Automat" +inherit pypi setuptools3 + +RDEPENDS:${PN} += "\ + python3-attrs \ + python3-six \ +" diff --git a/meta-python/recipes-devtools/python/python3-awesomeversion_22.6.0.bb b/meta-python/recipes-devtools/python/python3-awesomeversion_24.2.0.bb index cadb6f502d..8b19605b1e 100644 --- a/meta-python/recipes-devtools/python/python3-awesomeversion_22.6.0.bb +++ b/meta-python/recipes-devtools/python/python3-awesomeversion_24.2.0.bb @@ -4,8 +4,8 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENCE.md;md5=92622b5a8e216099be741d78328bae5d" -SRC_URI[sha256sum] = "38f580bfacf1c06b674bcd0f68e0c445ebb03fcd3700c6a2c588fb9313308e0f" +SRC_URI[sha256sum] = "47a6dcbbe2921b725f75106a66ab30f26f1f33dbc5e07bc8e1e39d8eb921f53c" RDEPENDS:${PN} += "python3-profile python3-logging" -inherit pypi setuptools3 +inherit pypi python_poetry_core diff --git a/meta-python/recipes-devtools/python/python3-aws-iot-device-sdk-python_1.5.2.bb b/meta-python/recipes-devtools/python/python3-aws-iot-device-sdk-python_1.5.2.bb index 35d061f5e6..bdadf7c774 100644 --- a/meta-python/recipes-devtools/python/python3-aws-iot-device-sdk-python_1.5.2.bb +++ b/meta-python/recipes-devtools/python/python3-aws-iot-device-sdk-python_1.5.2.bb @@ -27,15 +27,15 @@ do_install:append() { PACKAGES =+ "${PN}-examples" RDEPENDS:${PN} += " \ - ${PYTHON_PN}-crypt \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-math \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-threading \ + python3-crypt \ + python3-datetime \ + python3-io \ + python3-json \ + python3-logging \ + python3-math \ + python3-netclient \ + python3-numbers \ + python3-threading \ " RDEPENDS:${PN}-examples += "${PN}" diff --git a/meta-python/recipes-devtools/python/python3-backcall_0.2.0.bb b/meta-python/recipes-devtools/python/python3-backcall_0.2.0.bb index 434ab57c50..d1ac486c05 100644 --- a/meta-python/recipes-devtools/python/python3-backcall_0.2.0.bb +++ b/meta-python/recipes-devtools/python/python3-backcall_0.2.0.bb @@ -1,6 +1,5 @@ SUMMARY = "Specifications for callback functions passed in to an API" HOMEPAGE = "https://github.com/takluyver/backcall" -AUTHOR = "Thomas Kluyver <thomas@kluyver.me.uk>" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=40e56b724d016484a7f790ec826d3ffc" diff --git a/meta-python/recipes-devtools/python/python3-backports-functools-lru-cache/run-ptest b/meta-python/recipes-devtools/python/python3-backports-functools-lru-cache/run-ptest deleted file mode 100644 index b63c4de0d9..0000000000 --- a/meta-python/recipes-devtools/python/python3-backports-functools-lru-cache/run-ptest +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' diff --git a/meta-python/recipes-devtools/python/python3-bandit_1.7.4.bb b/meta-python/recipes-devtools/python/python3-bandit_1.7.8.bb index cfdbde9689..8b0968857f 100644 --- a/meta-python/recipes-devtools/python/python3-bandit_1.7.4.bb +++ b/meta-python/recipes-devtools/python/python3-bandit_1.7.8.bb @@ -2,12 +2,18 @@ SUMMARY = "Security oriented static analyser for python code." LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=34400b68072d710fecd0a2940a0d1658" -SRC_URI[sha256sum] = "2d63a8c573417bae338962d4b9b06fbc6080f74ecd955a092849e1e65c717bd2" +SRC_URI[sha256sum] = "36de50f720856ab24a24dbaa5fee2c66050ed97c1477e0a1159deab1775eab6b" DEPENDS = "python3-pbr-native python3-git python3-pbr python3-pyyaml python3-six python3-stevedore" inherit setuptools3 pypi -RDEPENDS:${PN} += "python3-modules python3-git python3-pbr python3-pyyaml python3-six python3-stevedore" - -BBCLASSEXTEND = "native" +RDEPENDS:${PN} += "\ + python3-git \ + python3-modules \ + python3-pbr \ + python3-pyyaml \ + python3-rich \ + python3-six \ + python3-stevedore \ + " diff --git a/meta-python/recipes-devtools/python/python3-beautifulsoup4_4.11.1.bb b/meta-python/recipes-devtools/python/python3-beautifulsoup4_4.11.1.bb deleted file mode 100644 index 3037ea83c0..0000000000 --- a/meta-python/recipes-devtools/python/python3-beautifulsoup4_4.11.1.bb +++ /dev/null @@ -1,18 +0,0 @@ -SUMMARY = "Screen-scraping library" -HOMEPAGE = " https://www.crummy.com/software/BeautifulSoup/bs4" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://COPYING.txt;md5=15a76c7c51ecfc5c094d04f3ccd41a09" - -SRC_URI[sha256sum] = "ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693" - -inherit pypi setuptools3 - -RDEPENDS:${PN} = "\ - ${PYTHON_PN}-html5lib \ - ${PYTHON_PN}-lxml \ - ${PYTHON_PN}-soupsieve \ - ${PYTHON_PN}-html \ - ${PYTHON_PN}-logging \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-beautifulsoup4_4.12.3.bb b/meta-python/recipes-devtools/python/python3-beautifulsoup4_4.12.3.bb new file mode 100644 index 0000000000..14dedba922 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-beautifulsoup4_4.12.3.bb @@ -0,0 +1,18 @@ +SUMMARY = "Screen-scraping library" +HOMEPAGE = " https://www.crummy.com/software/BeautifulSoup/bs4" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=96e0034f7c9443910c486773aa1ed9ac" + +SRC_URI[sha256sum] = "74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051" + +inherit pypi python_hatchling + +RDEPENDS:${PN} = "\ + python3-html5lib \ + python3-lxml \ + python3-soupsieve \ + python3-html \ + python3-logging \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-behave_1.2.6.bb b/meta-python/recipes-devtools/python/python3-behave_1.2.6.bb index 1dcc7d218e..da4f3047f9 100644 --- a/meta-python/recipes-devtools/python/python3-behave_1.2.6.bb +++ b/meta-python/recipes-devtools/python/python3-behave_1.2.6.bb @@ -12,7 +12,7 @@ S = "${WORKDIR}/git" inherit setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-parse-type \ - ${PYTHON_PN}-setuptools \ - ${PYTHON_PN}-six \ + python3-parse-type \ + python3-setuptools \ + python3-six \ " diff --git a/meta-python/recipes-devtools/python/python3-betamax/0001-Drop-ptests-fixtures-and-recorde_modes.patch b/meta-python/recipes-devtools/python/python3-betamax/0001-Drop-ptests-fixtures-and-recorde_modes.patch new file mode 100644 index 0000000000..52745a9373 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-betamax/0001-Drop-ptests-fixtures-and-recorde_modes.patch @@ -0,0 +1,343 @@ +From e5aa66b1af2d49f159c4daefc598f96744ee988d Mon Sep 17 00:00:00 2001 +From: Zhixiong Chi <zhixiong.chi@windriver.com> +Date: Thu, 29 Feb 2024 12:31:58 -0800 +Subject: [PATCH] [PATCH] Drop ptests fixtures and recorde_modes + +The usage of fixture in test_fixtures has been deprecated. +See https://docs.pytest.org/en/stable/explanation/fixtures.html and +https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly +for more information about fixtures. +Meanwhile the test_record_modes relies on httpbin.org which has been sold and +re-sold several times, and it adds X-Amzn-Trace-Id header that can possibly +diff for each request. +It leads to ptest failure, so drop it now until we find the solution. + +Upstream-Status: Inappropriate [OE-Specific] + +Signed-off-by: Zhixiong Chi <zhixiong.chi@windriver.com> +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + tests/integration/test_fixtures.py | 60 ----------- + tests/integration/test_record_modes.py | 141 ------------------------- + tests/unit/test_fixtures.py | 94 ----------------- + 3 files changed, 295 deletions(-) + delete mode 100644 tests/integration/test_fixtures.py + delete mode 100644 tests/integration/test_record_modes.py + delete mode 100644 tests/unit/test_fixtures.py + +diff --git a/tests/integration/test_fixtures.py b/tests/integration/test_fixtures.py +deleted file mode 100644 +index fc3d1e7..0000000 +--- a/tests/integration/test_fixtures.py ++++ /dev/null +@@ -1,60 +0,0 @@ +-import os.path +- +-import pytest +- +- +-@pytest.mark.usefixtures('betamax_session') +-class TestPyTestFixtures: +- @pytest.fixture(autouse=True) +- def setup(self, request): +- """After test hook to assert everything.""" +- def finalizer(): +- test_dir = os.path.abspath('.') +- cassette_name = ('tests.integration.test_fixtures.' # Module name +- 'TestPyTestFixtures.' # Class name +- 'test_pytest_fixture' # Test function name +- '.json') +- file_name = os.path.join(test_dir, 'tests', 'cassettes', +- cassette_name) +- assert os.path.exists(file_name) is True +- +- request.addfinalizer(finalizer) +- +- def test_pytest_fixture(self, betamax_session): +- """Exercise the fixture itself.""" +- resp = betamax_session.get('https://httpbin.org/get') +- assert resp.ok +- +- +-@pytest.mark.usefixtures('betamax_parametrized_session') +-class TestPyTestParametrizedFixtures: +- @pytest.fixture(autouse=True) +- def setup(self, request): +- """After test hook to assert everything.""" +- def finalizer(): +- test_dir = os.path.abspath('.') +- cassette_name = ('tests.integration.test_fixtures.' # Module name +- 'TestPyTestParametrizedFixtures.' # Class name +- 'test_pytest_fixture' # Test function name +- '[https---httpbin.org-get]' # Parameter +- '.json') +- file_name = os.path.join(test_dir, 'tests', 'cassettes', +- cassette_name) +- assert os.path.exists(file_name) is True +- +- request.addfinalizer(finalizer) +- +- @pytest.mark.parametrize('url', ('https://httpbin.org/get',)) +- def test_pytest_fixture(self, betamax_parametrized_session, url): +- """Exercise the fixture itself.""" +- resp = betamax_parametrized_session.get(url) +- assert resp.ok +- +- +-@pytest.mark.parametrize('problematic_arg', [r'aaa\bbb', 'ccc:ddd', 'eee*fff']) +-def test_pytest_parametrize_with_filesystem_problematic_chars( +- betamax_parametrized_session, problematic_arg): +- """ +- Exercice parametrized args containing characters which might cause +- problems when getting translated into file names. """ +- assert True +diff --git a/tests/integration/test_record_modes.py b/tests/integration/test_record_modes.py +deleted file mode 100644 +index 988b851..0000000 +--- a/tests/integration/test_record_modes.py ++++ /dev/null +@@ -1,141 +0,0 @@ +-import re +- +-from betamax import Betamax, BetamaxError +- +-from tests.integration.helper import IntegrationHelper +- +- +-class TestRecordOnce(IntegrationHelper): +- def test_records_new_interaction(self): +- s = self.session +- with Betamax(s).use_cassette('test_record_once') as betamax: +- self.cassette_path = betamax.current_cassette.cassette_path +- assert betamax.current_cassette.is_empty() is True +- r = s.get('http://httpbin.org/get') +- assert r.status_code == 200 +- assert betamax.current_cassette.is_empty() is True +- assert betamax.current_cassette.interactions != [] +- +- def test_replays_response_from_cassette(self): +- s = self.session +- with Betamax(s).use_cassette('test_replays_response') as betamax: +- self.cassette_path = betamax.current_cassette.cassette_path +- assert betamax.current_cassette.is_empty() is True +- r0 = s.get('http://httpbin.org/get') +- assert r0.status_code == 200 +- assert betamax.current_cassette.interactions != [] +- assert len(betamax.current_cassette.interactions) == 1 +- r1 = s.get('http://httpbin.org/get') +- assert len(betamax.current_cassette.interactions) == 2 +- assert r1.status_code == 200 +- r0_headers = r0.headers.copy() +- r0_headers.pop('Date') +- r0_headers.pop('Age', None) +- r0_headers.pop('X-Processed-Time', None) +- r1_headers = r1.headers.copy() +- r1_headers.pop('Date') +- r1_headers.pop('Age', None) +- r1_headers.pop('X-Processed-Time', None) +- # NOTE(sigmavirus24): This fails if the second request is +- # technically a second later. Ignoring the Date headers allows +- # this test to succeed. +- # NOTE(hroncok): httpbin.org added X-Processed-Time header that +- # can possibly differ (and often does) +- r0_content = r0.content.decode(encoding='utf-8', errors='strict') +- r1_content = r1.content.decode(encoding='utf-8', errors='strict') +- r0_content = re.sub('"X-Amzn-Trace-Id": "[^"]+"', '"X-Amzn-Trace-Id": ""', r0_content) +- r1_content = re.sub('"X-Amzn-Trace-Id": "[^"]+"', '"X-Amzn-Trace-Id": ""', r1_content) +- # NOTE(jhatler): httpbin.org added "X-Amzn-Trace-Id" to their +- # response, which is a unique ID that will differ between requests. +- # We remove it from the response body before comparing. +- assert r0_headers == r1_headers +- assert r0_content == r1_content +- +- +-class TestRecordNone(IntegrationHelper): +- def test_raises_exception_when_no_interactions_present(self): +- s = self.session +- with Betamax(s) as betamax: +- betamax.use_cassette('test', record='none') +- self.cassette_created = False +- assert betamax.current_cassette is not None +- self.assertRaises(BetamaxError, s.get, 'http://httpbin.org/get') +- +- def test_record_none_does_not_create_cassettes(self): +- s = self.session +- with Betamax(s) as betamax: +- self.assertRaises(ValueError, betamax.use_cassette, +- 'test_record_none', record='none') +- self.cassette_created = False +- +- +-class TestRecordNewEpisodes(IntegrationHelper): +- def setUp(self): +- super(TestRecordNewEpisodes, self).setUp() +- with Betamax(self.session).use_cassette('test_record_new'): +- self.session.get('http://httpbin.org/get') +- self.session.get('http://httpbin.org/redirect/2') +- +- def test_records_new_events_with_existing_cassette(self): +- s = self.session +- opts = {'record': 'new_episodes'} +- with Betamax(s).use_cassette('test_record_new', **opts) as betamax: +- cassette = betamax.current_cassette +- self.cassette_path = cassette.cassette_path +- assert cassette.interactions != [] +- assert len(cassette.interactions) == 4 +- assert cassette.is_empty() is False +- s.get('https://httpbin.org/get') +- assert len(cassette.interactions) == 5 +- +- with Betamax(s).use_cassette('test_record_new') as betamax: +- cassette = betamax.current_cassette +- assert len(cassette.interactions) == 5 +- r = s.get('https://httpbin.org/get') +- assert r.status_code == 200 +- +- +-class TestRecordNewEpisodesCreatesCassettes(IntegrationHelper): +- def test_creates_new_cassettes(self): +- recorder = Betamax(self.session) +- opts = {'record': 'new_episodes'} +- cassette_name = 'test_record_new_makes_new_cassettes' +- with recorder.use_cassette(cassette_name, **opts) as betamax: +- self.cassette_path = betamax.current_cassette.cassette_path +- self.session.get('https://httpbin.org/get') +- +- +-class TestRecordAll(IntegrationHelper): +- def setUp(self): +- super(TestRecordAll, self).setUp() +- with Betamax(self.session).use_cassette('test_record_all'): +- self.session.get('http://httpbin.org/get') +- self.session.get('http://httpbin.org/redirect/2') +- self.session.get('http://httpbin.org/get') +- +- def test_records_new_interactions(self): +- s = self.session +- opts = {'record': 'all'} +- with Betamax(s).use_cassette('test_record_all', **opts) as betamax: +- cassette = betamax.current_cassette +- self.cassette_path = cassette.cassette_path +- assert cassette.interactions != [] +- assert len(cassette.interactions) == 5 +- assert cassette.is_empty() is False +- s.post('http://httpbin.org/post', data={'foo': 'bar'}) +- assert len(cassette.interactions) == 6 +- +- with Betamax(s).use_cassette('test_record_all') as betamax: +- assert len(betamax.current_cassette.interactions) == 6 +- +- def test_replaces_old_interactions(self): +- s = self.session +- opts = {'record': 'all'} +- with Betamax(s).use_cassette('test_record_all', **opts) as betamax: +- cassette = betamax.current_cassette +- self.cassette_path = cassette.cassette_path +- assert cassette.interactions != [] +- assert len(cassette.interactions) == 5 +- assert cassette.is_empty() is False +- s.get('http://httpbin.org/get') +- assert len(cassette.interactions) == 5 +diff --git a/tests/unit/test_fixtures.py b/tests/unit/test_fixtures.py +deleted file mode 100644 +index 41f33eb..0000000 +--- a/tests/unit/test_fixtures.py ++++ /dev/null +@@ -1,94 +0,0 @@ +-try: +- import unittest.mock as mock +-except ImportError: +- import mock +- +-import pytest +-import unittest +- +-import requests +- +-import betamax +-from betamax.fixtures import pytest as pytest_fixture +-from betamax.fixtures import unittest as unittest_fixture +- +- +-class TestPyTestFixture(unittest.TestCase): +- def setUp(self): +- self.mocked_betamax = mock.MagicMock() +- self.patched_betamax = mock.patch.object( +- betamax.recorder, 'Betamax', return_value=self.mocked_betamax) +- self.patched_betamax.start() +- +- def tearDown(self): +- self.patched_betamax.stop() +- +- def test_adds_stop_as_a_finalizer(self): +- # Mock a pytest request object +- request = mock.MagicMock() +- request.cls = request.module = None +- request.node.name = request.function.__name__ = 'test' +- +- pytest_fixture._betamax_recorder(request) +- assert request.addfinalizer.called is True +- request.addfinalizer.assert_called_once_with(self.mocked_betamax.stop) +- +- def test_auto_starts_the_recorder(self): +- # Mock a pytest request object +- request = mock.MagicMock() +- request.cls = request.module = None +- request.node.name = request.function.__name__ = 'test' +- +- pytest_fixture._betamax_recorder(request) +- self.mocked_betamax.start.assert_called_once_with() +- +- +-class FakeBetamaxTestCase(unittest_fixture.BetamaxTestCase): +- def test_fake(self): +- pass +- +- +-class TestUnittestFixture(unittest.TestCase): +- def setUp(self): +- self.mocked_betamax = mock.MagicMock() +- self.patched_betamax = mock.patch.object( +- betamax.recorder, 'Betamax', return_value=self.mocked_betamax) +- self.betamax = self.patched_betamax.start() +- self.fixture = FakeBetamaxTestCase(methodName='test_fake') +- +- def tearDown(self): +- self.patched_betamax.stop() +- +- def test_setUp(self): +- self.fixture.setUp() +- +- self.mocked_betamax.use_cassette.assert_called_once_with( +- 'FakeBetamaxTestCase.test_fake' +- ) +- self.mocked_betamax.start.assert_called_once_with() +- +- def test_setUp_rejects_arbitrary_session_classes(self): +- self.fixture.SESSION_CLASS = object +- +- with pytest.raises(AssertionError): +- self.fixture.setUp() +- +- def test_setUp_accepts_session_subclasses(self): +- class TestSession(requests.Session): +- pass +- +- self.fixture.SESSION_CLASS = TestSession +- +- self.fixture.setUp() +- +- assert self.betamax.called is True +- call_kwargs = self.betamax.call_args[-1] +- assert isinstance(call_kwargs['session'], TestSession) +- +- def test_tearDown_calls_stop(self): +- recorder = mock.Mock() +- self.fixture.recorder = recorder +- +- self.fixture.tearDown() +- +- recorder.stop.assert_called_once_with() +-- +2.44.0 + diff --git a/meta-python/recipes-devtools/python/python3-betamax/run-ptest b/meta-python/recipes-devtools/python/python3-betamax/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-betamax/run-ptest +++ b/meta-python/recipes-devtools/python/python3-betamax/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-betamax_0.8.1.bb b/meta-python/recipes-devtools/python/python3-betamax_0.9.0.bb index 2caeb5afa2..a0454686ee 100644 --- a/meta-python/recipes-devtools/python/python3-betamax_0.8.1.bb +++ b/meta-python/recipes-devtools/python/python3-betamax_0.9.0.bb @@ -5,16 +5,20 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=61c15f0c146c5fb1a8ce8ba2f310d73c" SRC_URI += " \ file://run-ptest \ + file://0001-Drop-ptests-fixtures-and-recorde_modes.patch \ " - -SRC_URI[md5sum] = "b8182d43a200fc126a3bf7555626f964" -SRC_URI[sha256sum] = "5bf004ceffccae881213fb722f34517166b84a34919b92ffc14d1dbd050b71c2" +SRC_URI[sha256sum] = "82316e1679bc6879e3c83318d016b54b7c9225ff08c4462de4813e22038d5f94" inherit pypi setuptools3 ptest +RDEPENDS:${PN} += " \ + python3-requests \ + python3-unittest \ +" + RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-requests \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-bidict_0.22.0.bb b/meta-python/recipes-devtools/python/python3-bidict_0.23.0.bb index 088931d148..5667e4927f 100644 --- a/meta-python/recipes-devtools/python/python3-bidict_0.22.0.bb +++ b/meta-python/recipes-devtools/python/python3-bidict_0.23.0.bb @@ -2,9 +2,9 @@ SUMMARY = "The bidirectional mapping library for Python." DESCRIPTION = "The bidirectional mapping library for Python." HOMEPAGE = "https://bidict.readthedocs.io/" LICENSE = "MPL-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=858e74278ef3830d46481172ae03c819" +LIC_FILES_CHKSUM = "file://LICENSE;md5=e907308cc9356afa99ac0eec6b20211b" -SRC_URI[sha256sum] = "5c826b3e15e97cc6e615de295756847c282a79b79c5430d3bfc909b1ac9f5bd8" +SRC_URI[sha256sum] = "3959ca59d4d6997702d642bf1e5fd93cba299863723fc289545198f70c468578" inherit pypi python_setuptools_build_meta diff --git a/meta-python/recipes-devtools/python/python3-binwalk_2.3.4.bb b/meta-python/recipes-devtools/python/python3-binwalk_2.3.4.bb new file mode 100644 index 0000000000..45b1ff5145 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-binwalk_2.3.4.bb @@ -0,0 +1,25 @@ +SUMMARY = "Firmware analysis tool" +DESCRIPTION = "This package contains Python Binwalk tool. Binwalk is a fast, \ +easy to use tool for analyzing, reverse engineering, and extracting firmware \ +images." +HOMEPAGE = "https://github.com/ReFirmLabs/binwalk" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=65bbee055d3ea3bfc475f07aecf4de64" + +SRC_URI = "git://github.com/ReFirmLabs/binwalk;protocol=https;branch=master" + +SRCREV = "cddfede795971045d99422bd7a9676c8803ec5ee" + +S = "${WORKDIR}/git" + +UPSTREAM_CHECK_GITTAGREGEX = "v(?P<pver>\d+(\.\d+)+)" + +inherit setuptools3 + +RDEPENDS:${PN} += " \ + python3-compression \ + python3-logging \ + python3-netserver \ + python3-setuptools \ + python3-stringold \ +" diff --git a/meta-python/recipes-devtools/python/python3-bitarray_2.6.0.bb b/meta-python/recipes-devtools/python/python3-bitarray_2.9.2.bb index 507c0bc51a..7d7be0b1aa 100644 --- a/meta-python/recipes-devtools/python/python3-bitarray_2.6.0.bb +++ b/meta-python/recipes-devtools/python/python3-bitarray_2.9.2.bb @@ -1,9 +1,10 @@ -SUMMARY = "A high-level Python efficient arrays of booleans -- C extension" +SUMMARY = "efficient arrays of booleans -- C extension" +DESCRIPTION = "A high-level Python efficient arrays of booleans -- C extension" HOMEPAGE = "https://github.com/ilanschnell/bitarray" LICENSE = "PSF-2.0" LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=2ad702cdcd49e8d2ac01d7e7d0810d2d" -SRC_URI[sha256sum] = "56d3f16dd807b1c56732a244ce071c135ee973d3edc9929418c1b24c5439a0fd" +SRC_URI[sha256sum] = "a8f286a51a32323715d77755ed959f94bef13972e9a2fe71b609e40e6d27957e" inherit setuptools3 pypi diff --git a/meta-python/recipes-devtools/python/python3-bitstring_3.1.9.bb b/meta-python/recipes-devtools/python/python3-bitstring_3.1.9.bb deleted file mode 100644 index 94dbae2afc..0000000000 --- a/meta-python/recipes-devtools/python/python3-bitstring_3.1.9.bb +++ /dev/null @@ -1,19 +0,0 @@ -SUMMARY = "Simple construction, analysis and modification of binary data." -HOMEPAGE = "https://github.com/scott-griffiths/bitstring" -AUTHOR = "Scott Griffiths <dr.scottgriffiths@gmail.com>" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=f7f2fd3f1cd52b5ccd39d76fb3568d3f" - -SRC_URI[sha256sum] = "a5848a3f63111785224dca8bb4c0a75b62ecdef56a042c8d6be74b16f7e860e7" - -PYPI_PACKAGE = "bitstring" - -inherit pypi setuptools3 - -RDEPENDS:${PN} = "\ - ${PYTHON_PN}-core \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-mmap \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-bitstring_4.1.4.bb b/meta-python/recipes-devtools/python/python3-bitstring_4.1.4.bb new file mode 100644 index 0000000000..0777b6cffb --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-bitstring_4.1.4.bb @@ -0,0 +1,19 @@ +SUMMARY = "Simple construction, analysis and modification of binary data." +HOMEPAGE = "https://github.com/scott-griffiths/bitstring" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=661f450e2c0aef39b4b15597333444a7" + +SRC_URI[sha256sum] = "94f3f1c45383ebe8fd4a359424ffeb75c2f290760ae8fcac421b44f89ac85213" + +PYPI_PACKAGE = "bitstring" + +inherit pypi python_poetry_core + +RDEPENDS:${PN} = "\ + python3-core \ + python3-io \ + python3-mmap \ + python3-numbers \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-bitstruct_8.15.1.bb b/meta-python/recipes-devtools/python/python3-bitstruct_8.19.0.bb index fe3aeb7b58..6401322e2c 100644 --- a/meta-python/recipes-devtools/python/python3-bitstruct_8.15.1.bb +++ b/meta-python/recipes-devtools/python/python3-bitstruct_8.19.0.bb @@ -3,7 +3,7 @@ HOMEPAGE = "https://github.com/eerimoq/bitstruct" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=d9aa4ec07de78abae21c490c9ffe61bd" -SRC_URI[sha256sum] = "6fa6adbfb8f3b8cb68c21b13aa65d23eb2c3ac32419ab926f3fd1fff717a9125" +SRC_URI[sha256sum] = "d75ba9dded85c17e885a209a00eb8e248ee40762149f2f2a79360ca857467dac" PYPI_PACKAGE = "bitstruct" diff --git a/meta-python/recipes-devtools/python/python3-bleak/run-ptest b/meta-python/recipes-devtools/python/python3-bleak/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-bleak/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-bleak_0.21.1.bb b/meta-python/recipes-devtools/python/python3-bleak_0.21.1.bb new file mode 100644 index 0000000000..96f3fcbcfe --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-bleak_0.21.1.bb @@ -0,0 +1,33 @@ +SUMMARY = "Bleak is a GATT client software, capable of connecting to BLE devices acting as GATT servers." +HOMEPAGE = "https://github.com/hbldh/bleak" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=bcbc2069a86cba1b5e47253679f66ed7" + +SRCREV = "054b092e19c7a45d5ea07d8948022f54117fe5e8" +PYPI_SRC_URI = "git://github.com/hbldh/bleak.git;protocol=https;branch=develop" + +inherit pypi python_poetry_core ptest + +S = "${WORKDIR}/git" + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-pytest-asyncio \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} + +RDEPENDS:${PN} += " \ + python3-core (>3.7) \ + python3-async-timeout \ + python3-dbus-fast \ + python3-xml \ +" diff --git a/meta-python/recipes-devtools/python/python3-blinker/run-ptest b/meta-python/recipes-devtools/python/python3-blinker/run-ptest index 15c3f6282d..69cd362f69 100644 --- a/meta-python/recipes-devtools/python/python3-blinker/run-ptest +++ b/meta-python/recipes-devtools/python/python3-blinker/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-blinker_1.5.bb b/meta-python/recipes-devtools/python/python3-blinker_1.7.0.bb index dae1e39437..8f2cf4883d 100644 --- a/meta-python/recipes-devtools/python/python3-blinker_1.5.bb +++ b/meta-python/recipes-devtools/python/python3-blinker_1.7.0.bb @@ -2,14 +2,19 @@ DESCRIPTION = "Fast, simple object-to-object and broadcast signaling." LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=42cd19c88fc13d1307a4efd64ee90e4e" -SRC_URI[sha256sum] = "923e5e2f69c155f2cc42dafbbd70e16e3fde24d2d4aa2ab72fbe386238892462" +SRC_URI[sha256sum] = "e6820ff6fa4e4d1d8e2747c2283749c3f547e4fee112b98555cdcdae32996182" -inherit pypi setuptools3 ptest +inherit pypi python_setuptools_build_meta ptest SRC_URI += "file://run-ptest" +RDEPENDS:${PN} += "\ + python3-asyncio \ +" + RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-booleanpy_4.0.bb b/meta-python/recipes-devtools/python/python3-booleanpy_4.0.bb deleted file mode 100644 index 41fd3d960a..0000000000 --- a/meta-python/recipes-devtools/python/python3-booleanpy_4.0.bb +++ /dev/null @@ -1,13 +0,0 @@ -SUMMARY = "Define boolean algebras, create and parse boolean expressions and create custom boolean DSL" -HOMEPAGE = "https://github.com/bastikr/boolean.py" - -LICENSE = "BSD-2-Clause" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=d118b5feceee598ebeca76e13395c2bd" - -SRC_URI[sha256sum] = "17b9a181630e43dde1851d42bef546d616d5d9b4480357514597e78b203d06e4" - -PYPI_PACKAGE = "boolean.py" - -inherit pypi setuptools3 - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-brotli_1.1.0.bb b/meta-python/recipes-devtools/python/python3-brotli_1.1.0.bb new file mode 100644 index 0000000000..678f12b730 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-brotli_1.1.0.bb @@ -0,0 +1,17 @@ +SUMMARY = "Brotli compression format" +HOMEPAGE = "https://pypi.org/project/Brotli/" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=941ee9cd1609382f946352712a319b4b" + +PYPI_PACKAGE = "Brotli" + +SRC_URI[sha256sum] = "81de08ac11bcb85841e440c13611c00b67d3bf82698314928d0b676362546724" + +inherit pypi setuptools3 + +RDEPENDS:${PN} = "\ + python3-cffi \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-cachecontrol_0.12.11.bb b/meta-python/recipes-devtools/python/python3-cachecontrol_0.14.0.bb index fc2b0ae75b..1e374529cc 100644 --- a/meta-python/recipes-devtools/python/python3-cachecontrol_0.12.11.bb +++ b/meta-python/recipes-devtools/python/python3-cachecontrol_0.14.0.bb @@ -1,15 +1,14 @@ SUMMARY = "httplib2 caching for requests" HOMEPAGE = "https://pypi.org/project/CacheControl/" LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=12;endline=12;md5=942a721dac34d073453642ffe5fcf546" +LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=12;endline=12;md5=e2fd6ddcf506e08972d5ba4b93c0022e" -# On PyPi, this is "CacheControl", rather than "cachecontrol", so we need to -# override PYPI_PACKAGE so fetch succeeds. -PYPI_PACKAGE = "CacheControl" +SRC_URI[sha256sum] = "7db1195b41c81f8274a7bbd97c956f44e8348265a1bc7641c37dfebc39f0c938" -SRC_URI[sha256sum] = "a5b9fcc986b184db101aa280b42ecdcdfc524892596f606858e0b7a8b4d9e144" +inherit pypi python_poetry_core -inherit pypi setuptools3 +UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/CacheControl/" +UPSTREAM_CHECK_REGEX = "/CacheControl/(?P<pver>(\d+[\.\-_]*)+)" RDEPENDS:${PN} += "\ python3-crypt \ diff --git a/meta-python/recipes-devtools/python/python3-cachetools/run-ptest b/meta-python/recipes-devtools/python/python3-cachetools/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-cachetools/run-ptest +++ b/meta-python/recipes-devtools/python/python3-cachetools/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-cachetools_5.2.0.bb b/meta-python/recipes-devtools/python/python3-cachetools_5.3.3.bb index 35b338ca8f..3ef75d4703 100644 --- a/meta-python/recipes-devtools/python/python3-cachetools_5.2.0.bb +++ b/meta-python/recipes-devtools/python/python3-cachetools_5.3.3.bb @@ -6,7 +6,7 @@ Python 3 Standard Library @lru_cache function decorator." SECTION = "devel/python" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=1ec55353c80c662e4255f8889a0ca558" +LIC_FILES_CHKSUM = "file://LICENSE;md5=539275e657c6b7af026bb908356f7541" inherit pypi python_setuptools_build_meta ptest @@ -15,11 +15,12 @@ SRC_URI += " \ " RDEPENDS:${PN} += " \ - ${PYTHON_PN}-math \ + python3-math \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { @@ -27,6 +28,6 @@ do_install_ptest() { cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ } -SRC_URI[sha256sum] = "6a94c6402995a99c3970cc7e4884bb60b4a8639938157eeed436098bf9831757" +SRC_URI[sha256sum] = "ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-can_4.0.0.bb b/meta-python/recipes-devtools/python/python3-can_4.0.0.bb deleted file mode 100644 index b1ba6849be..0000000000 --- a/meta-python/recipes-devtools/python/python3-can_4.0.0.bb +++ /dev/null @@ -1,27 +0,0 @@ -SUMMARY = "Controller Area Network (CAN) interface module for Python" -SECTION = "devel/python" -LICENSE = "LGPL-3.0-only" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=e6a600fd5e1d9cbde2d983680233ad02" - -SRC_URI[sha256sum] = "59d92846ffb981e634e9e0f2d14a6b4967a875e3869bd2ba168c92c4db6b8b5d" - -PYPI_PACKAGE="python-can" - -inherit pypi setuptools3 - -RDEPENDS:${PN}:class-target += "\ - ${PYTHON_PN}-aenum \ - ${PYTHON_PN}-ctypes \ - ${PYTHON_PN}-codecs \ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-fcntl \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-misc \ - ${PYTHON_PN}-netserver \ - ${PYTHON_PN}-sqlite3 \ - ${PYTHON_PN}-wrapt \ - ${PYTHON_PN}-pkg-resources \ - ${PYTHON_PN}-typing-extensions \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-can_4.2.2.bb b/meta-python/recipes-devtools/python/python3-can_4.2.2.bb new file mode 100644 index 0000000000..9ca926d66c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-can_4.2.2.bb @@ -0,0 +1,29 @@ +SUMMARY = "Controller Area Network (CAN) interface module for Python" +SECTION = "devel/python" +LICENSE = "LGPL-3.0-only" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=e6a600fd5e1d9cbde2d983680233ad02" + +SRC_URI[sha256sum] = "6ad50f4613289f3c4d276b6d2ac8901d776dcb929994cce93f55a69e858c595f" + +PYPI_PACKAGE="python-can" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-aenum \ + python3-asyncio \ + python3-codecs \ + python3-compression \ + python3-ctypes \ + python3-fcntl \ + python3-json \ + python3-logging \ + python3-misc \ + python3-netserver \ + python3-packaging \ + python3-pkg-resources \ + python3-setuptools \ + python3-sqlite3 \ + python3-typing-extensions \ + python3-wrapt \ +" diff --git a/meta-python/recipes-devtools/python/python3-cantools_37.1.0.bb b/meta-python/recipes-devtools/python/python3-cantools_37.1.0.bb deleted file mode 100644 index 1af1310aba..0000000000 --- a/meta-python/recipes-devtools/python/python3-cantools_37.1.0.bb +++ /dev/null @@ -1,22 +0,0 @@ -DESCRIPTION = "CAN BUS tools in Python 3." -HOMEPAGE = "https://github.com/eerimoq/cantools" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=d9aa4ec07de78abae21c490c9ffe61bd" - -SRC_URI[sha256sum] = "9f2449e94a7698bd44bb50d9b464788053a0bf070faa09a132535c3aa07e7e6a" - -PYPI_PACKAGE = "cantools" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-can \ - ${PYTHON_PN}-bitstruct \ - ${PYTHON_PN}-core \ - ${PYTHON_PN}-textparser \ - ${PYTHON_PN}-typing-extensions \ - ${PYTHON_PN}-diskcache \ - ${PYTHON_PN}-asyncio \ -" - -CLEANBROKEN = "1" diff --git a/meta-python/recipes-devtools/python/python3-cantools_39.4.4.bb b/meta-python/recipes-devtools/python/python3-cantools_39.4.4.bb new file mode 100644 index 0000000000..ebae6b63e6 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-cantools_39.4.4.bb @@ -0,0 +1,24 @@ +DESCRIPTION = "CAN BUS tools in Python 3." +HOMEPAGE = "https://github.com/eerimoq/cantools" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=d9aa4ec07de78abae21c490c9ffe61bd" + +SRC_URI[sha256sum] = "6e8e918b6671a62a9f3990546ece5623e1deb71defb1cef85a9955ac301da99e" + +PYPI_PACKAGE = "cantools" + +inherit pypi python_poetry_core + +DEPENDS += "python3-setuptools-scm-native" + +RDEPENDS:${PN} += "\ + python3-can \ + python3-bitstruct \ + python3-core \ + python3-textparser \ + python3-typing-extensions \ + python3-diskcache \ + python3-asyncio \ +" + +CLEANBROKEN = "1" diff --git a/meta-python/recipes-devtools/python/python3-cassandra-driver_3.25.0.bb b/meta-python/recipes-devtools/python/python3-cassandra-driver_3.29.1.bb index cf27f7f476..3003e84acf 100644 --- a/meta-python/recipes-devtools/python/python3-cassandra-driver_3.25.0.bb +++ b/meta-python/recipes-devtools/python/python3-cassandra-driver_3.29.1.bb @@ -8,21 +8,21 @@ LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=2ee41112a44fe7014dce33e26468ba93" SRCNAME = "cassandra-driver" -SRC_URI[sha256sum] = "8ad7d7c090eb1cac6110b3bfc1fd2d334ac62f415aac09350ebb8d241b7aa7ee" +SRC_URI[sha256sum] = "38e9c2a2f2a9664bb03f1f852d5fccaeff2163942b5db35dffcf8bf32a51cfe5" inherit pypi setuptools3 RDEPENDS:${PN} += "\ - ${PYTHON_PN}-cython \ - ${PYTHON_PN}-geomet \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-misc \ - ${PYTHON_PN}-multiprocessing \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-six \ + python3-cython \ + python3-geomet \ + python3-json \ + python3-misc \ + python3-multiprocessing \ + python3-numbers \ + python3-six \ libevent \ " DEPENDS += "\ - ${PYTHON_PN}-cython \ + python3-cython \ " diff --git a/meta-python/recipes-devtools/python/python3-casttube_0.2.1.bb b/meta-python/recipes-devtools/python/python3-casttube_0.2.1.bb new file mode 100644 index 0000000000..af3daf016e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-casttube_0.2.1.bb @@ -0,0 +1,16 @@ +SUMMARY = "YouTube Chromecast API" +HOMEPAGE = "https://github.com/ur1katz/casttube" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=d3aafde5479a4102b867156e2527a34e" + +SRC_URI[sha256sum] = "54d2af8c7949aa9c5db87fb11ef0a478a5d3e7ac6d2d2ac8dd1711e3a516fc82" + +inherit pypi setuptools3 + +FILES:${PN} += "\ + /usr/LICENSE \ +" + +RDEPENDS:${PN} = "\ + python3-requests \ +" diff --git a/meta-python/recipes-devtools/python/python3-cbor2/run-ptest b/meta-python/recipes-devtools/python/python3-cbor2/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-cbor2/run-ptest +++ b/meta-python/recipes-devtools/python/python3-cbor2/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-cbor2_5.4.3.bb b/meta-python/recipes-devtools/python/python3-cbor2_5.6.3.bb index bbb57a4a9f..c9c98b6fb5 100644 --- a/meta-python/recipes-devtools/python/python3-cbor2_5.4.3.bb +++ b/meta-python/recipes-devtools/python/python3-cbor2_5.6.3.bb @@ -1,10 +1,10 @@ DESCRIPTION = "An implementation of RFC 7049 - Concise Binary Object Representation (CBOR)." -DEPENDS +="${PYTHON_PN}-setuptools-scm-native" +DEPENDS +="python3-setuptools-scm-native" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10" -SRC_URI[sha256sum] = "62b863c5ee6ced4032afe948f3c1484f375550995d3b8498145237fe28e546c2" +SRC_URI[sha256sum] = "e6f0ae2751c2d333a960e0807c0611494eb1245631a167965acbc100509455d3" inherit pypi python_setuptools_build_meta ptest @@ -15,17 +15,19 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-unixadmin \ + python3-hypothesis \ + python3-pytest \ + python3-unittest-automake-output \ + python3-unixadmin \ " do_install_ptest() { - install -d ${D}${PTEST_PATH}/tests + install -d ${D}${PTEST_PATH}/tests cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ } RDEPENDS:${PN} += " \ - ${PYTHON_PN}-datetime \ + python3-datetime \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-cchardet_2.1.7.bb b/meta-python/recipes-devtools/python/python3-cchardet_2.1.7.bb index d6d96965eb..3d9194c219 100644 --- a/meta-python/recipes-devtools/python/python3-cchardet_2.1.7.bb +++ b/meta-python/recipes-devtools/python/python3-cchardet_2.1.7.bb @@ -8,3 +8,5 @@ SRC_URI[sha256sum] = "c428b6336545053c2589f6caf24ea32276c6664cb86db817e03a94c60a inherit pypi setuptools3 BBCLASSEXTEND = "native nativesdk" + +DEPENDS += "python3-cython-native" diff --git a/meta-python/recipes-devtools/python/python3-cerberus_1.3.4.bb b/meta-python/recipes-devtools/python/python3-cerberus_1.3.5.bb index f9f8853495..eb3453aeef 100644 --- a/meta-python/recipes-devtools/python/python3-cerberus_1.3.4.bb +++ b/meta-python/recipes-devtools/python/python3-cerberus_1.3.5.bb @@ -4,10 +4,8 @@ SECTION = "devel/python" LICENSE = "ISC" LIC_FILES_CHKSUM = "file://LICENSE;md5=48f8e9432d0dac5e0e7a18211a0bacdb" -RDEPENDS:${PN} += "python3-setuptools" - # The PyPI package uses a capital letter so we have to specify this explicitly PYPI_PACKAGE = "Cerberus" -inherit pypi setuptools3 +inherit pypi python_poetry_core -SRC_URI[sha256sum] = "d1b21b3954b2498d9a79edf16b3170a3ac1021df88d197dc2ce5928ba519237c" +SRC_URI[sha256sum] = "81011e10266ef71b6ec6d50e60171258a5b134d69f8fb387d16e4936d0d47642" diff --git a/meta-python/recipes-devtools/python/python3-charset-normalizer_2.1.0.bb b/meta-python/recipes-devtools/python/python3-charset-normalizer_3.3.2.bb index 7c3d3ffc14..ca9a88ccfb 100644 --- a/meta-python/recipes-devtools/python/python3-charset-normalizer_2.1.0.bb +++ b/meta-python/recipes-devtools/python/python3-charset-normalizer_3.3.2.bb @@ -3,13 +3,15 @@ HOMEPAGE = "https://github.com/ousret/charset_normalizer" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=0974a390827087287db39928f7c524b5" -SRC_URI[sha256sum] = "575e708016ff3a5e3681541cb9d79312c416835686d054a23accb873b254f413" +SRC_URI[sha256sum] = "f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5" inherit pypi setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-core \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-codecs \ - ${PYTHON_PN}-json \ + python3-core \ + python3-logging \ + python3-codecs \ + python3-json \ " + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-cheetah_3.2.6.bb b/meta-python/recipes-devtools/python/python3-cheetah_3.2.6.post1.bb index 802eab2a07..448772960b 100644 --- a/meta-python/recipes-devtools/python/python3-cheetah_3.2.6.bb +++ b/meta-python/recipes-devtools/python/python3-cheetah_3.2.6.post1.bb @@ -11,4 +11,4 @@ RDEPENDS:${PN}:class-native = "" BBCLASSEXTEND = "native nativesdk" -SRC_URI[sha256sum] = "f1c2b693cdcac2ded2823d363f8459ae785261e61c128d68464c8781dba0466b" +SRC_URI[sha256sum] = "58b5d84e5fbff6cf8e117414b3ea49ef51654c02ee887d155113c5b91d761967" diff --git a/meta-python/recipes-devtools/python/python3-classes_0.4.1.bb b/meta-python/recipes-devtools/python/python3-classes_0.4.1.bb new file mode 100644 index 0000000000..d9240e1383 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-classes_0.4.1.bb @@ -0,0 +1,10 @@ +SUMMARY = "Smart, pythonic, ad-hoc, typed polymorphism for Python." + +LICENSE = "BSD-2-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=155fbcc756c8ae5265d252d23e20908f" + +SRC_URI[sha256sum] = "4de4fdd6c5c38607bbd8ad76703d7cc4dbe007cfa78e8ef1f62fc6ac55303e23" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-typing-extensions" diff --git a/meta-python/recipes-devtools/python/python3-click-repl_0.2.0.bb b/meta-python/recipes-devtools/python/python3-click-repl_0.2.0.bb deleted file mode 100644 index cf5ba988b4..0000000000 --- a/meta-python/recipes-devtools/python/python3-click-repl_0.2.0.bb +++ /dev/null @@ -1,10 +0,0 @@ -SUMMARY = "REPL plugin for Click" -HOMEPAGE = "https://github.com/untitaker/click-repl" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=fee2943fdd4d8afbac9ccc1c8ac137d5" - -SRC_URI[sha256sum] = "cd12f68d745bf6151210790540b4cb064c7b13e571bc64b6957d98d120dacfd8" - -inherit pypi setuptools3 - -RDEPENDS:${PN} = "${PYTHON_PN}-click" diff --git a/meta-python/recipes-devtools/python/python3-click-repl_0.3.0.bb b/meta-python/recipes-devtools/python/python3-click-repl_0.3.0.bb new file mode 100644 index 0000000000..b773ed6b8b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-click-repl_0.3.0.bb @@ -0,0 +1,10 @@ +SUMMARY = "REPL plugin for Click" +HOMEPAGE = "https://github.com/untitaker/click-repl" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=580facc4832cac548fad94845542da44" + +SRC_URI[sha256sum] = "17849c23dba3d667247dc4defe1757fff98694e90fe37474f3feebb69ced26a9" + +inherit pypi setuptools3 + +RDEPENDS:${PN} = "python3-click python3-prompt-toolkit" diff --git a/meta-python/recipes-devtools/python/python3-click-spinner/0001-Update-Versioneer-to-0.22.patch b/meta-python/recipes-devtools/python/python3-click-spinner/0001-Update-Versioneer-to-0.22.patch new file mode 100644 index 0000000000..4edb5da9ef --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-click-spinner/0001-Update-Versioneer-to-0.22.patch @@ -0,0 +1,2489 @@ +From 739f9da6bf0d2d9f0de624aee2ec71c65f62c275 Mon Sep 17 00:00:00 2001 +From: Hugo van Kemenade <hugovk@users.noreply.github.com> +Date: Tue, 10 May 2022 18:17:50 +0300 +Subject: [PATCH] Update Versioneer to 0.22 + +Upstream-Status: Backport [https://github.com/click-contrib/click-spinner/commit/5622ab0a0b4296dc8f10863f268ed98dccf4b642] + +Signed-off-by: Ny Antra Ranaivoarison <nyantra.ranaivoarison@smile.fr> +--- + click_spinner/__init__.py | 5 +- + click_spinner/_version.py | 665 +++++++++++++++++++++- + versioneer.py | 1128 ++++++++++++++++++++++++------------- + 3 files changed, 1400 insertions(+), 398 deletions(-) + +diff --git a/click_spinner/__init__.py b/click_spinner/__init__.py +index aeec089..8e9f4f9 100644 +--- a/click_spinner/__init__.py ++++ b/click_spinner/__init__.py +@@ -77,6 +77,5 @@ def spinner(beep=False, disable=False, force=False, stream=sys.stdout): + return Spinner(beep, disable, force, stream) + + +-from ._version import get_versions +-__version__ = get_versions()['version'] +-del get_versions ++from . import _version ++__version__ = _version.get_versions()['version'] +diff --git a/click_spinner/_version.py b/click_spinner/_version.py +index 5ae340e..d44565d 100644 +--- a/click_spinner/_version.py ++++ b/click_spinner/_version.py +@@ -1,21 +1,658 @@ + +-# This file was generated by 'versioneer.py' (0.16) from +-# revision-control system data, or from the parent directory name of an +-# unpacked source archive. Distribution tarballs contain a pre-generated copy +-# of this file. ++# This file helps to compute a version number in source trees obtained from ++# git-archive tarball (such as those provided by githubs download-from-tag ++# feature). Distribution tarballs (built by setup.py sdist) and build ++# directories (produced by setup.py build) will contain a much shorter file ++# that just contains the computed version number. + +-import json ++# This file is released into the public domain. Generated by ++# versioneer-0.22 (https://github.com/python-versioneer/python-versioneer) ++ ++"""Git implementation of _version.py.""" ++ ++import errno ++import os ++import re ++import subprocess + import sys ++from typing import Callable, Dict ++import functools ++ ++ ++def get_keywords(): ++ """Get the keywords needed to look up the version information.""" ++ # these strings will be replaced by git during git-archive. ++ # setup.py/versioneer.py will grep for the variable names, so they must ++ # each be defined on a line of their own. _version.py will just call ++ # get_keywords(). ++ git_refnames = "$Format:%d$" ++ git_full = "$Format:%H$" ++ git_date = "$Format:%ci$" ++ keywords = {"refnames": git_refnames, "full": git_full, "date": git_date} ++ return keywords ++ ++ ++class VersioneerConfig: ++ """Container for Versioneer configuration parameters.""" ++ ++ ++def get_config(): ++ """Create, populate and return the VersioneerConfig() object.""" ++ # these strings are filled in when 'setup.py versioneer' creates ++ # _version.py ++ cfg = VersioneerConfig() ++ cfg.VCS = "git" ++ cfg.style = "pep440" ++ cfg.tag_prefix = "v" ++ cfg.parentdir_prefix = "click-spinner-" ++ cfg.versionfile_source = "click_spinner/_version.py" ++ cfg.verbose = False ++ return cfg ++ ++ ++class NotThisMethod(Exception): ++ """Exception raised if a method is not valid for the current scenario.""" ++ ++ ++LONG_VERSION_PY: Dict[str, str] = {} ++HANDLERS: Dict[str, Dict[str, Callable]] = {} ++ ++ ++def register_vcs_handler(vcs, method): # decorator ++ """Create decorator to mark a method as the handler of a VCS.""" ++ def decorate(f): ++ """Store f in HANDLERS[vcs][method].""" ++ if vcs not in HANDLERS: ++ HANDLERS[vcs] = {} ++ HANDLERS[vcs][method] = f ++ return f ++ return decorate ++ ++ ++def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, ++ env=None): ++ """Call the given command(s).""" ++ assert isinstance(commands, list) ++ process = None ++ ++ popen_kwargs = {} ++ if sys.platform == "win32": ++ # This hides the console window if pythonw.exe is used ++ startupinfo = subprocess.STARTUPINFO() ++ startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW ++ popen_kwargs["startupinfo"] = startupinfo ++ ++ for command in commands: ++ try: ++ dispcmd = str([command] + args) ++ # remember shell=False, so use git.cmd on windows, not just git ++ process = subprocess.Popen([command] + args, cwd=cwd, env=env, ++ stdout=subprocess.PIPE, ++ stderr=(subprocess.PIPE if hide_stderr ++ else None), **popen_kwargs) ++ break ++ except OSError: ++ e = sys.exc_info()[1] ++ if e.errno == errno.ENOENT: ++ continue ++ if verbose: ++ print("unable to run %s" % dispcmd) ++ print(e) ++ return None, None ++ else: ++ if verbose: ++ print("unable to find command, tried %s" % (commands,)) ++ return None, None ++ stdout = process.communicate()[0].strip().decode() ++ if process.returncode != 0: ++ if verbose: ++ print("unable to run %s (error)" % dispcmd) ++ print("stdout was %s" % stdout) ++ return None, process.returncode ++ return stdout, process.returncode ++ ++ ++def versions_from_parentdir(parentdir_prefix, root, verbose): ++ """Try to determine the version from the parent directory name. ++ ++ Source tarballs conventionally unpack into a directory that includes both ++ the project name and a version string. We will also support searching up ++ two directory levels for an appropriately named parent directory ++ """ ++ rootdirs = [] ++ ++ for _ in range(3): ++ dirname = os.path.basename(root) ++ if dirname.startswith(parentdir_prefix): ++ return {"version": dirname[len(parentdir_prefix):], ++ "full-revisionid": None, ++ "dirty": False, "error": None, "date": None} ++ rootdirs.append(root) ++ root = os.path.dirname(root) # up a level ++ ++ if verbose: ++ print("Tried directories %s but none started with prefix %s" % ++ (str(rootdirs), parentdir_prefix)) ++ raise NotThisMethod("rootdir doesn't start with parentdir_prefix") ++ ++ ++@register_vcs_handler("git", "get_keywords") ++def git_get_keywords(versionfile_abs): ++ """Extract version information from the given file.""" ++ # the code embedded in _version.py can just fetch the value of these ++ # keywords. When used from setup.py, we don't want to import _version.py, ++ # so we do it with a regexp instead. This function is not used from ++ # _version.py. ++ keywords = {} ++ try: ++ with open(versionfile_abs, "r") as fobj: ++ for line in fobj: ++ if line.strip().startswith("git_refnames ="): ++ mo = re.search(r'=\s*"(.*)"', line) ++ if mo: ++ keywords["refnames"] = mo.group(1) ++ if line.strip().startswith("git_full ="): ++ mo = re.search(r'=\s*"(.*)"', line) ++ if mo: ++ keywords["full"] = mo.group(1) ++ if line.strip().startswith("git_date ="): ++ mo = re.search(r'=\s*"(.*)"', line) ++ if mo: ++ keywords["date"] = mo.group(1) ++ except OSError: ++ pass ++ return keywords ++ ++ ++@register_vcs_handler("git", "keywords") ++def git_versions_from_keywords(keywords, tag_prefix, verbose): ++ """Get version information from git keywords.""" ++ if "refnames" not in keywords: ++ raise NotThisMethod("Short version file found") ++ date = keywords.get("date") ++ if date is not None: ++ # Use only the last line. Previous lines may contain GPG signature ++ # information. ++ date = date.splitlines()[-1] ++ ++ # git-2.2.0 added "%cI", which expands to an ISO-8601 -compliant ++ # datestamp. However we prefer "%ci" (which expands to an "ISO-8601 ++ # -like" string, which we must then edit to make compliant), because ++ # it's been around since git-1.5.3, and it's too difficult to ++ # discover which version we're using, or to work around using an ++ # older one. ++ date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) ++ refnames = keywords["refnames"].strip() ++ if refnames.startswith("$Format"): ++ if verbose: ++ print("keywords are unexpanded, not using") ++ raise NotThisMethod("unexpanded keywords, not a git-archive tarball") ++ refs = {r.strip() for r in refnames.strip("()").split(",")} ++ # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of ++ # just "foo-1.0". If we see a "tag: " prefix, prefer those. ++ TAG = "tag: " ++ tags = {r[len(TAG):] for r in refs if r.startswith(TAG)} ++ if not tags: ++ # Either we're using git < 1.8.3, or there really are no tags. We use ++ # a heuristic: assume all version tags have a digit. The old git %d ++ # expansion behaves like git log --decorate=short and strips out the ++ # refs/heads/ and refs/tags/ prefixes that would let us distinguish ++ # between branches and tags. By ignoring refnames without digits, we ++ # filter out many common branch names like "release" and ++ # "stabilization", as well as "HEAD" and "master". ++ tags = {r for r in refs if re.search(r'\d', r)} ++ if verbose: ++ print("discarding '%s', no digits" % ",".join(refs - tags)) ++ if verbose: ++ print("likely tags: %s" % ",".join(sorted(tags))) ++ for ref in sorted(tags): ++ # sorting will prefer e.g. "2.0" over "2.0rc1" ++ if ref.startswith(tag_prefix): ++ r = ref[len(tag_prefix):] ++ # Filter out refs that exactly match prefix or that don't start ++ # with a number once the prefix is stripped (mostly a concern ++ # when prefix is '') ++ if not re.match(r'\d', r): ++ continue ++ if verbose: ++ print("picking %s" % r) ++ return {"version": r, ++ "full-revisionid": keywords["full"].strip(), ++ "dirty": False, "error": None, ++ "date": date} ++ # no suitable tags, so version is "0+unknown", but full hex is still there ++ if verbose: ++ print("no suitable tags, using unknown + full revision id") ++ return {"version": "0+unknown", ++ "full-revisionid": keywords["full"].strip(), ++ "dirty": False, "error": "no suitable tags", "date": None} ++ ++ ++@register_vcs_handler("git", "pieces_from_vcs") ++def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command): ++ """Get version from 'git describe' in the root of the source tree. ++ ++ This only gets called if the git-archive 'subst' keywords were *not* ++ expanded, and _version.py hasn't already been rewritten with a short ++ version string, meaning we're inside a checked out source tree. ++ """ ++ GITS = ["git"] ++ if sys.platform == "win32": ++ GITS = ["git.cmd", "git.exe"] ++ ++ # GIT_DIR can interfere with correct operation of Versioneer. ++ # It may be intended to be passed to the Versioneer-versioned project, ++ # but that should not change where we get our version from. ++ env = os.environ.copy() ++ env.pop("GIT_DIR", None) ++ runner = functools.partial(runner, env=env) ++ ++ _, rc = runner(GITS, ["rev-parse", "--git-dir"], cwd=root, ++ hide_stderr=True) ++ if rc != 0: ++ if verbose: ++ print("Directory %s not under git control" % root) ++ raise NotThisMethod("'git rev-parse --git-dir' returned error") ++ ++ MATCH_ARGS = ["--match", "%s*" % tag_prefix] if tag_prefix else [] ++ ++ # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] ++ # if there isn't one, this yields HEX[-dirty] (no NUM) ++ describe_out, rc = runner(GITS, ["describe", "--tags", "--dirty", ++ "--always", "--long", *MATCH_ARGS], ++ cwd=root) ++ # --long was added in git-1.5.5 ++ if describe_out is None: ++ raise NotThisMethod("'git describe' failed") ++ describe_out = describe_out.strip() ++ full_out, rc = runner(GITS, ["rev-parse", "HEAD"], cwd=root) ++ if full_out is None: ++ raise NotThisMethod("'git rev-parse' failed") ++ full_out = full_out.strip() ++ ++ pieces = {} ++ pieces["long"] = full_out ++ pieces["short"] = full_out[:7] # maybe improved later ++ pieces["error"] = None ++ ++ branch_name, rc = runner(GITS, ["rev-parse", "--abbrev-ref", "HEAD"], ++ cwd=root) ++ # --abbrev-ref was added in git-1.6.3 ++ if rc != 0 or branch_name is None: ++ raise NotThisMethod("'git rev-parse --abbrev-ref' returned error") ++ branch_name = branch_name.strip() ++ ++ if branch_name == "HEAD": ++ # If we aren't exactly on a branch, pick a branch which represents ++ # the current commit. If all else fails, we are on a branchless ++ # commit. ++ branches, rc = runner(GITS, ["branch", "--contains"], cwd=root) ++ # --contains was added in git-1.5.4 ++ if rc != 0 or branches is None: ++ raise NotThisMethod("'git branch --contains' returned error") ++ branches = branches.split("\n") ++ ++ # Remove the first line if we're running detached ++ if "(" in branches[0]: ++ branches.pop(0) ++ ++ # Strip off the leading "* " from the list of branches. ++ branches = [branch[2:] for branch in branches] ++ if "master" in branches: ++ branch_name = "master" ++ elif not branches: ++ branch_name = None ++ else: ++ # Pick the first branch that is returned. Good or bad. ++ branch_name = branches[0] ++ ++ pieces["branch"] = branch_name ++ ++ # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] ++ # TAG might have hyphens. ++ git_describe = describe_out ++ ++ # look for -dirty suffix ++ dirty = git_describe.endswith("-dirty") ++ pieces["dirty"] = dirty ++ if dirty: ++ git_describe = git_describe[:git_describe.rindex("-dirty")] ++ ++ # now we have TAG-NUM-gHEX or HEX ++ ++ if "-" in git_describe: ++ # TAG-NUM-gHEX ++ mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe) ++ if not mo: ++ # unparsable. Maybe git-describe is misbehaving? ++ pieces["error"] = ("unable to parse git-describe output: '%s'" ++ % describe_out) ++ return pieces ++ ++ # tag ++ full_tag = mo.group(1) ++ if not full_tag.startswith(tag_prefix): ++ if verbose: ++ fmt = "tag '%s' doesn't start with prefix '%s'" ++ print(fmt % (full_tag, tag_prefix)) ++ pieces["error"] = ("tag '%s' doesn't start with prefix '%s'" ++ % (full_tag, tag_prefix)) ++ return pieces ++ pieces["closest-tag"] = full_tag[len(tag_prefix):] ++ ++ # distance: number of commits since tag ++ pieces["distance"] = int(mo.group(2)) ++ ++ # commit: short hex revision ID ++ pieces["short"] = mo.group(3) ++ ++ else: ++ # HEX: no tags ++ pieces["closest-tag"] = None ++ count_out, rc = runner(GITS, ["rev-list", "HEAD", "--count"], cwd=root) ++ pieces["distance"] = int(count_out) # total number of commits + +-version_json = ''' +-{ +- "dirty": false, +- "error": null, +- "full-revisionid": "7cadb31e3e257c64a47a67255547f0a746e1a465", +- "version": "0.1.10" +-} +-''' # END VERSION_JSON ++ # commit date: see ISO-8601 comment in git_versions_from_keywords() ++ date = runner(GITS, ["show", "-s", "--format=%ci", "HEAD"], cwd=root)[0].strip() ++ # Use only the last line. Previous lines may contain GPG signature ++ # information. ++ date = date.splitlines()[-1] ++ pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) ++ ++ return pieces ++ ++ ++def plus_or_dot(pieces): ++ """Return a + if we don't already have one, else return a .""" ++ if "+" in pieces.get("closest-tag", ""): ++ return "." ++ return "+" ++ ++ ++def render_pep440(pieces): ++ """Build up version string, with post-release "local version identifier". ++ ++ Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you ++ get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty ++ ++ Exceptions: ++ 1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty] ++ """ ++ if pieces["closest-tag"]: ++ rendered = pieces["closest-tag"] ++ if pieces["distance"] or pieces["dirty"]: ++ rendered += plus_or_dot(pieces) ++ rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ else: ++ # exception #1 ++ rendered = "0+untagged.%d.g%s" % (pieces["distance"], ++ pieces["short"]) ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ return rendered ++ ++ ++def render_pep440_branch(pieces): ++ """TAG[[.dev0]+DISTANCE.gHEX[.dirty]] . ++ ++ The ".dev0" means not master branch. Note that .dev0 sorts backwards ++ (a feature branch will appear "older" than the master branch). ++ ++ Exceptions: ++ 1: no tags. 0[.dev0]+untagged.DISTANCE.gHEX[.dirty] ++ """ ++ if pieces["closest-tag"]: ++ rendered = pieces["closest-tag"] ++ if pieces["distance"] or pieces["dirty"]: ++ if pieces["branch"] != "master": ++ rendered += ".dev0" ++ rendered += plus_or_dot(pieces) ++ rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ else: ++ # exception #1 ++ rendered = "0" ++ if pieces["branch"] != "master": ++ rendered += ".dev0" ++ rendered += "+untagged.%d.g%s" % (pieces["distance"], ++ pieces["short"]) ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ return rendered ++ ++ ++def pep440_split_post(ver): ++ """Split pep440 version string at the post-release segment. ++ ++ Returns the release segments before the post-release and the ++ post-release version number (or -1 if no post-release segment is present). ++ """ ++ vc = str.split(ver, ".post") ++ return vc[0], int(vc[1] or 0) if len(vc) == 2 else None ++ ++ ++def render_pep440_pre(pieces): ++ """TAG[.postN.devDISTANCE] -- No -dirty. ++ ++ Exceptions: ++ 1: no tags. 0.post0.devDISTANCE ++ """ ++ if pieces["closest-tag"]: ++ if pieces["distance"]: ++ # update the post release segment ++ tag_version, post_version = pep440_split_post(pieces["closest-tag"]) ++ rendered = tag_version ++ if post_version is not None: ++ rendered += ".post%d.dev%d" % (post_version+1, pieces["distance"]) ++ else: ++ rendered += ".post0.dev%d" % (pieces["distance"]) ++ else: ++ # no commits, use the tag as the version ++ rendered = pieces["closest-tag"] ++ else: ++ # exception #1 ++ rendered = "0.post0.dev%d" % pieces["distance"] ++ return rendered ++ ++ ++def render_pep440_post(pieces): ++ """TAG[.postDISTANCE[.dev0]+gHEX] . ++ ++ The ".dev0" means dirty. Note that .dev0 sorts backwards ++ (a dirty tree will appear "older" than the corresponding clean one), ++ but you shouldn't be releasing software with -dirty anyways. ++ ++ Exceptions: ++ 1: no tags. 0.postDISTANCE[.dev0] ++ """ ++ if pieces["closest-tag"]: ++ rendered = pieces["closest-tag"] ++ if pieces["distance"] or pieces["dirty"]: ++ rendered += ".post%d" % pieces["distance"] ++ if pieces["dirty"]: ++ rendered += ".dev0" ++ rendered += plus_or_dot(pieces) ++ rendered += "g%s" % pieces["short"] ++ else: ++ # exception #1 ++ rendered = "0.post%d" % pieces["distance"] ++ if pieces["dirty"]: ++ rendered += ".dev0" ++ rendered += "+g%s" % pieces["short"] ++ return rendered ++ ++ ++def render_pep440_post_branch(pieces): ++ """TAG[.postDISTANCE[.dev0]+gHEX[.dirty]] . ++ ++ The ".dev0" means not master branch. ++ ++ Exceptions: ++ 1: no tags. 0.postDISTANCE[.dev0]+gHEX[.dirty] ++ """ ++ if pieces["closest-tag"]: ++ rendered = pieces["closest-tag"] ++ if pieces["distance"] or pieces["dirty"]: ++ rendered += ".post%d" % pieces["distance"] ++ if pieces["branch"] != "master": ++ rendered += ".dev0" ++ rendered += plus_or_dot(pieces) ++ rendered += "g%s" % pieces["short"] ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ else: ++ # exception #1 ++ rendered = "0.post%d" % pieces["distance"] ++ if pieces["branch"] != "master": ++ rendered += ".dev0" ++ rendered += "+g%s" % pieces["short"] ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ return rendered ++ ++ ++def render_pep440_old(pieces): ++ """TAG[.postDISTANCE[.dev0]] . ++ ++ The ".dev0" means dirty. ++ ++ Exceptions: ++ 1: no tags. 0.postDISTANCE[.dev0] ++ """ ++ if pieces["closest-tag"]: ++ rendered = pieces["closest-tag"] ++ if pieces["distance"] or pieces["dirty"]: ++ rendered += ".post%d" % pieces["distance"] ++ if pieces["dirty"]: ++ rendered += ".dev0" ++ else: ++ # exception #1 ++ rendered = "0.post%d" % pieces["distance"] ++ if pieces["dirty"]: ++ rendered += ".dev0" ++ return rendered ++ ++ ++def render_git_describe(pieces): ++ """TAG[-DISTANCE-gHEX][-dirty]. ++ ++ Like 'git describe --tags --dirty --always'. ++ ++ Exceptions: ++ 1: no tags. HEX[-dirty] (note: no 'g' prefix) ++ """ ++ if pieces["closest-tag"]: ++ rendered = pieces["closest-tag"] ++ if pieces["distance"]: ++ rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) ++ else: ++ # exception #1 ++ rendered = pieces["short"] ++ if pieces["dirty"]: ++ rendered += "-dirty" ++ return rendered ++ ++ ++def render_git_describe_long(pieces): ++ """TAG-DISTANCE-gHEX[-dirty]. ++ ++ Like 'git describe --tags --dirty --always -long'. ++ The distance/hash is unconditional. ++ ++ Exceptions: ++ 1: no tags. HEX[-dirty] (note: no 'g' prefix) ++ """ ++ if pieces["closest-tag"]: ++ rendered = pieces["closest-tag"] ++ rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) ++ else: ++ # exception #1 ++ rendered = pieces["short"] ++ if pieces["dirty"]: ++ rendered += "-dirty" ++ return rendered ++ ++ ++def render(pieces, style): ++ """Render the given version pieces into the requested style.""" ++ if pieces["error"]: ++ return {"version": "unknown", ++ "full-revisionid": pieces.get("long"), ++ "dirty": None, ++ "error": pieces["error"], ++ "date": None} ++ ++ if not style or style == "default": ++ style = "pep440" # the default ++ ++ if style == "pep440": ++ rendered = render_pep440(pieces) ++ elif style == "pep440-branch": ++ rendered = render_pep440_branch(pieces) ++ elif style == "pep440-pre": ++ rendered = render_pep440_pre(pieces) ++ elif style == "pep440-post": ++ rendered = render_pep440_post(pieces) ++ elif style == "pep440-post-branch": ++ rendered = render_pep440_post_branch(pieces) ++ elif style == "pep440-old": ++ rendered = render_pep440_old(pieces) ++ elif style == "git-describe": ++ rendered = render_git_describe(pieces) ++ elif style == "git-describe-long": ++ rendered = render_git_describe_long(pieces) ++ else: ++ raise ValueError("unknown style '%s'" % style) ++ ++ return {"version": rendered, "full-revisionid": pieces["long"], ++ "dirty": pieces["dirty"], "error": None, ++ "date": pieces.get("date")} + + + def get_versions(): +- return json.loads(version_json) ++ """Get version information or return default if unable to do so.""" ++ # I am in _version.py, which lives at ROOT/VERSIONFILE_SOURCE. If we have ++ # __file__, we can work backwards from there to the root. Some ++ # py2exe/bbfreeze/non-CPython implementations don't do __file__, in which ++ # case we can only use expanded keywords. ++ ++ cfg = get_config() ++ verbose = cfg.verbose ++ ++ try: ++ return git_versions_from_keywords(get_keywords(), cfg.tag_prefix, ++ verbose) ++ except NotThisMethod: ++ pass ++ ++ try: ++ root = os.path.realpath(__file__) ++ # versionfile_source is the relative path from the top of the source ++ # tree (where the .git directory might live) to this file. Invert ++ # this to find the root from __file__. ++ for _ in cfg.versionfile_source.split('/'): ++ root = os.path.dirname(root) ++ except NameError: ++ return {"version": "0+unknown", "full-revisionid": None, ++ "dirty": None, ++ "error": "unable to find root of source tree", ++ "date": None} ++ ++ try: ++ pieces = git_pieces_from_vcs(cfg.tag_prefix, root, verbose) ++ return render(pieces, cfg.style) ++ except NotThisMethod: ++ pass ++ ++ try: ++ if cfg.parentdir_prefix: ++ return versions_from_parentdir(cfg.parentdir_prefix, root, verbose) ++ except NotThisMethod: ++ pass ++ ++ return {"version": "0+unknown", "full-revisionid": None, ++ "dirty": None, ++ "error": "unable to compute version", "date": None} +diff --git a/versioneer.py b/versioneer.py +index 7ed2a21..a142bf5 100644 +--- a/versioneer.py ++++ b/versioneer.py +@@ -1,5 +1,5 @@ + +-# Version: 0.16 ++# Version: 0.22 + + """The Versioneer - like a rocketeer, but for versions. + +@@ -7,18 +7,14 @@ The Versioneer + ============== + + * like a rocketeer, but for versions! +-* https://github.com/warner/python-versioneer ++* https://github.com/python-versioneer/python-versioneer + * Brian Warner + * License: Public Domain +-* Compatible With: python2.6, 2.7, 3.3, 3.4, 3.5, and pypy +-* [![Latest Version] +-(https://pypip.in/version/versioneer/badge.svg?style=flat) +-](https://pypi.python.org/pypi/versioneer/) +-* [![Build Status] +-(https://travis-ci.org/warner/python-versioneer.png?branch=master) +-](https://travis-ci.org/warner/python-versioneer) +- +-This is a tool for managing a recorded version number in distutils-based ++* Compatible with: Python 3.6, 3.7, 3.8, 3.9, 3.10 and pypy3 ++* [![Latest Version][pypi-image]][pypi-url] ++* [![Build Status][travis-image]][travis-url] ++ ++This is a tool for managing a recorded version number in distutils/setuptools-based + python projects. The goal is to remove the tedious and error-prone "update + the embedded version string" step from your release process. Making a new + release should be as easy as recording a new tag in your version-control +@@ -27,9 +23,10 @@ system, and maybe making new tarballs. + + ## Quick Install + +-* `pip install versioneer` to somewhere to your $PATH +-* add a `[versioneer]` section to your setup.cfg (see below) ++* `pip install versioneer` to somewhere in your $PATH ++* add a `[versioneer]` section to your setup.cfg (see [Install](INSTALL.md)) + * run `versioneer install` in your source tree, commit the results ++* Verify version information with `python setup.py version` + + ## Version Identifiers + +@@ -61,7 +58,7 @@ version 1.3). Many VCS systems can report a description that captures this, + for example `git describe --tags --dirty --always` reports things like + "0.7-1-g574ab98-dirty" to indicate that the checkout is one revision past the + 0.7 tag, has a unique revision id of "574ab98", and is "dirty" (it has +-uncommitted changes. ++uncommitted changes). + + The version identifier is used for multiple purposes: + +@@ -88,127 +85,7 @@ the generated version data. + + ## Installation + +-First, decide on values for the following configuration variables: +- +-* `VCS`: the version control system you use. Currently accepts "git". +- +-* `style`: the style of version string to be produced. See "Styles" below for +- details. Defaults to "pep440", which looks like +- `TAG[+DISTANCE.gSHORTHASH[.dirty]]`. +- +-* `versionfile_source`: +- +- A project-relative pathname into which the generated version strings should +- be written. This is usually a `_version.py` next to your project's main +- `__init__.py` file, so it can be imported at runtime. If your project uses +- `src/myproject/__init__.py`, this should be `src/myproject/_version.py`. +- This file should be checked in to your VCS as usual: the copy created below +- by `setup.py setup_versioneer` will include code that parses expanded VCS +- keywords in generated tarballs. The 'build' and 'sdist' commands will +- replace it with a copy that has just the calculated version string. +- +- This must be set even if your project does not have any modules (and will +- therefore never import `_version.py`), since "setup.py sdist" -based trees +- still need somewhere to record the pre-calculated version strings. Anywhere +- in the source tree should do. If there is a `__init__.py` next to your +- `_version.py`, the `setup.py setup_versioneer` command (described below) +- will append some `__version__`-setting assignments, if they aren't already +- present. +- +-* `versionfile_build`: +- +- Like `versionfile_source`, but relative to the build directory instead of +- the source directory. These will differ when your setup.py uses +- 'package_dir='. If you have `package_dir={'myproject': 'src/myproject'}`, +- then you will probably have `versionfile_build='myproject/_version.py'` and +- `versionfile_source='src/myproject/_version.py'`. +- +- If this is set to None, then `setup.py build` will not attempt to rewrite +- any `_version.py` in the built tree. If your project does not have any +- libraries (e.g. if it only builds a script), then you should use +- `versionfile_build = None`. To actually use the computed version string, +- your `setup.py` will need to override `distutils.command.build_scripts` +- with a subclass that explicitly inserts a copy of +- `versioneer.get_version()` into your script file. See +- `test/demoapp-script-only/setup.py` for an example. +- +-* `tag_prefix`: +- +- a string, like 'PROJECTNAME-', which appears at the start of all VCS tags. +- If your tags look like 'myproject-1.2.0', then you should use +- tag_prefix='myproject-'. If you use unprefixed tags like '1.2.0', this +- should be an empty string, using either `tag_prefix=` or `tag_prefix=''`. +- +-* `parentdir_prefix`: +- +- a optional string, frequently the same as tag_prefix, which appears at the +- start of all unpacked tarball filenames. If your tarball unpacks into +- 'myproject-1.2.0', this should be 'myproject-'. To disable this feature, +- just omit the field from your `setup.cfg`. +- +-This tool provides one script, named `versioneer`. That script has one mode, +-"install", which writes a copy of `versioneer.py` into the current directory +-and runs `versioneer.py setup` to finish the installation. +- +-To versioneer-enable your project: +- +-* 1: Modify your `setup.cfg`, adding a section named `[versioneer]` and +- populating it with the configuration values you decided earlier (note that +- the option names are not case-sensitive): +- +- ```` +- [versioneer] +- VCS = git +- style = pep440 +- versionfile_source = src/myproject/_version.py +- versionfile_build = myproject/_version.py +- tag_prefix = +- parentdir_prefix = myproject- +- ```` +- +-* 2: Run `versioneer install`. This will do the following: +- +- * copy `versioneer.py` into the top of your source tree +- * create `_version.py` in the right place (`versionfile_source`) +- * modify your `__init__.py` (if one exists next to `_version.py`) to define +- `__version__` (by calling a function from `_version.py`) +- * modify your `MANIFEST.in` to include both `versioneer.py` and the +- generated `_version.py` in sdist tarballs +- +- `versioneer install` will complain about any problems it finds with your +- `setup.py` or `setup.cfg`. Run it multiple times until you have fixed all +- the problems. +- +-* 3: add a `import versioneer` to your setup.py, and add the following +- arguments to the setup() call: +- +- version=versioneer.get_version(), +- cmdclass=versioneer.get_cmdclass(), +- +-* 4: commit these changes to your VCS. To make sure you won't forget, +- `versioneer install` will mark everything it touched for addition using +- `git add`. Don't forget to add `setup.py` and `setup.cfg` too. +- +-## Post-Installation Usage +- +-Once established, all uses of your tree from a VCS checkout should get the +-current version string. All generated tarballs should include an embedded +-version string (so users who unpack them will not need a VCS tool installed). +- +-If you distribute your project through PyPI, then the release process should +-boil down to two steps: +- +-* 1: git tag 1.0 +-* 2: python setup.py register sdist upload +- +-If you distribute it through github (i.e. users use github to generate +-tarballs with `git archive`), the process is: +- +-* 1: git tag 1.0 +-* 2: git push; git push --tags +- +-Versioneer will report "0+untagged.NUMCOMMITS.gHASH" until your tree has at +-least one tag in its history. ++See [INSTALL.md](./INSTALL.md) for detailed installation instructions. + + ## Version-String Flavors + +@@ -229,6 +106,10 @@ information: + * `['full-revisionid']`: detailed revision identifier. For Git, this is the + full SHA1 commit id, e.g. "1076c978a8d3cfc70f408fe5974aa6c092c949ac". + ++* `['date']`: Date and time of the latest `HEAD` commit. For Git, it is the ++ commit date in ISO 8601 format. This will be None if the date is not ++ available. ++ + * `['dirty']`: a boolean, True if the tree has uncommitted changes. Note that + this is only accurate if run in a VCS checkout, otherwise it is likely to + be False or None +@@ -267,8 +148,8 @@ that this commit is two revisions ("+2") beyond the "0.11" tag. For released + software (exactly equal to a known tag), the identifier will only contain the + stripped tag, e.g. "0.11". + +-Other styles are available. See details.md in the Versioneer source tree for +-descriptions. ++Other styles are available. See [details.md](details.md) in the Versioneer ++source tree for descriptions. + + ## Debugging + +@@ -278,51 +159,83 @@ version`, which will run the version-lookup code in a verbose mode, and will + display the full contents of `get_versions()` (including the `error` string, + which may help identify what went wrong). + +-## Updating Versioneer ++## Known Limitations + +-To upgrade your project to a new release of Versioneer, do the following: ++Some situations are known to cause problems for Versioneer. This details the ++most significant ones. More can be found on Github ++[issues page](https://github.com/python-versioneer/python-versioneer/issues). + +-* install the new Versioneer (`pip install -U versioneer` or equivalent) +-* edit `setup.cfg`, if necessary, to include any new configuration settings +- indicated by the release notes +-* re-run `versioneer install` in your source tree, to replace +- `SRC/_version.py` +-* commit any changed files ++### Subprojects ++ ++Versioneer has limited support for source trees in which `setup.py` is not in ++the root directory (e.g. `setup.py` and `.git/` are *not* siblings). The are ++two common reasons why `setup.py` might not be in the root: ++ ++* Source trees which contain multiple subprojects, such as ++ [Buildbot](https://github.com/buildbot/buildbot), which contains both ++ "master" and "slave" subprojects, each with their own `setup.py`, ++ `setup.cfg`, and `tox.ini`. Projects like these produce multiple PyPI ++ distributions (and upload multiple independently-installable tarballs). ++* Source trees whose main purpose is to contain a C library, but which also ++ provide bindings to Python (and perhaps other languages) in subdirectories. ++ ++Versioneer will look for `.git` in parent directories, and most operations ++should get the right version string. However `pip` and `setuptools` have bugs ++and implementation details which frequently cause `pip install .` from a ++subproject directory to fail to find a correct version string (so it usually ++defaults to `0+unknown`). + +-### Upgrading to 0.16 ++`pip install --editable .` should work correctly. `setup.py install` might ++work too. + +-Nothing special. ++Pip-8.1.1 is known to have this problem, but hopefully it will get fixed in ++some later version. + +-### Upgrading to 0.15 ++[Bug #38](https://github.com/python-versioneer/python-versioneer/issues/38) is tracking ++this issue. The discussion in ++[PR #61](https://github.com/python-versioneer/python-versioneer/pull/61) describes the ++issue from the Versioneer side in more detail. ++[pip PR#3176](https://github.com/pypa/pip/pull/3176) and ++[pip PR#3615](https://github.com/pypa/pip/pull/3615) contain work to improve ++pip to let Versioneer work correctly. + +-Starting with this version, Versioneer is configured with a `[versioneer]` +-section in your `setup.cfg` file. Earlier versions required the `setup.py` to +-set attributes on the `versioneer` module immediately after import. The new +-version will refuse to run (raising an exception during import) until you +-have provided the necessary `setup.cfg` section. ++Versioneer-0.16 and earlier only looked for a `.git` directory next to the ++`setup.cfg`, so subprojects were completely unsupported with those releases. + +-In addition, the Versioneer package provides an executable named +-`versioneer`, and the installation process is driven by running `versioneer +-install`. In 0.14 and earlier, the executable was named +-`versioneer-installer` and was run without an argument. ++### Editable installs with setuptools <= 18.5 + +-### Upgrading to 0.14 ++`setup.py develop` and `pip install --editable .` allow you to install a ++project into a virtualenv once, then continue editing the source code (and ++test) without re-installing after every change. + +-0.14 changes the format of the version string. 0.13 and earlier used +-hyphen-separated strings like "0.11-2-g1076c97-dirty". 0.14 and beyond use a +-plus-separated "local version" section strings, with dot-separated +-components, like "0.11+2.g1076c97". PEP440-strict tools did not like the old +-format, but should be ok with the new one. ++"Entry-point scripts" (`setup(entry_points={"console_scripts": ..})`) are a ++convenient way to specify executable scripts that should be installed along ++with the python package. + +-### Upgrading from 0.11 to 0.12 ++These both work as expected when using modern setuptools. When using ++setuptools-18.5 or earlier, however, certain operations will cause ++`pkg_resources.DistributionNotFound` errors when running the entrypoint ++script, which must be resolved by re-installing the package. This happens ++when the install happens with one version, then the egg_info data is ++regenerated while a different version is checked out. Many setup.py commands ++cause egg_info to be rebuilt (including `sdist`, `wheel`, and installing into ++a different virtualenv), so this can be surprising. + +-Nothing special. ++[Bug #83](https://github.com/python-versioneer/python-versioneer/issues/83) describes ++this one, but upgrading to a newer version of setuptools should probably ++resolve it. + +-### Upgrading from 0.10 to 0.11 + +-You must add a `versioneer.VCS = "git"` to your `setup.py` before re-running +-`setup.py setup_versioneer`. This will enable the use of additional +-version-control systems (SVN, etc) in the future. ++## Updating Versioneer ++ ++To upgrade your project to a new release of Versioneer, do the following: ++ ++* install the new Versioneer (`pip install -U versioneer` or equivalent) ++* edit `setup.cfg`, if necessary, to include any new configuration settings ++ indicated by the release notes. See [UPGRADING](./UPGRADING.md) for details. ++* re-run `versioneer install` in your source tree, to replace ++ `SRC/_version.py` ++* commit any changed files + + ## Future Directions + +@@ -337,6 +250,14 @@ installation by editing setup.py . Alternatively, it might go the other + direction and include code from all supported VCS systems, reducing the + number of intermediate scripts. + ++## Similar projects ++ ++* [setuptools_scm](https://github.com/pypa/setuptools_scm/) - a non-vendored build-time ++ dependency ++* [minver](https://github.com/jbweston/miniver) - a lightweight reimplementation of ++ versioneer ++* [versioningit](https://github.com/jwodder/versioningit) - a PEP 518-based setuptools ++ plugin + + ## License + +@@ -346,19 +267,28 @@ Specifically, both are released under the Creative Commons "Public Domain + Dedication" license (CC0-1.0), as described in + https://creativecommons.org/publicdomain/zero/1.0/ . + ++[pypi-image]: https://img.shields.io/pypi/v/versioneer.svg ++[pypi-url]: https://pypi.python.org/pypi/versioneer/ ++[travis-image]: ++https://img.shields.io/travis/com/python-versioneer/python-versioneer.svg ++[travis-url]: https://travis-ci.com/github/python-versioneer/python-versioneer ++ + """ ++# pylint:disable=invalid-name,import-outside-toplevel,missing-function-docstring ++# pylint:disable=missing-class-docstring,too-many-branches,too-many-statements ++# pylint:disable=raise-missing-from,too-many-lines,too-many-locals,import-error ++# pylint:disable=too-few-public-methods,redefined-outer-name,consider-using-with ++# pylint:disable=attribute-defined-outside-init,too-many-arguments + +-from __future__ import print_function +-try: +- import configparser +-except ImportError: +- import ConfigParser as configparser ++import configparser + import errno + import json + import os + import re + import subprocess + import sys ++from typing import Callable, Dict ++import functools + + + class VersioneerConfig: +@@ -393,10 +323,12 @@ def get_root(): + # module-import table will cache the first one. So we can't use + # os.path.dirname(__file__), as that will find whichever + # versioneer.py was first imported, even in later projects. +- me = os.path.realpath(os.path.abspath(__file__)) +- if os.path.splitext(me)[0] != os.path.splitext(versioneer_py)[0]: ++ my_path = os.path.realpath(os.path.abspath(__file__)) ++ me_dir = os.path.normcase(os.path.splitext(my_path)[0]) ++ vsr_dir = os.path.normcase(os.path.splitext(versioneer_py)[0]) ++ if me_dir != vsr_dir: + print("Warning: build in %s is using versioneer.py from %s" +- % (os.path.dirname(me), versioneer_py)) ++ % (os.path.dirname(my_path), versioneer_py)) + except NameError: + pass + return root +@@ -404,85 +336,94 @@ def get_root(): + + def get_config_from_root(root): + """Read the project setup.cfg file to determine Versioneer config.""" +- # This might raise EnvironmentError (if setup.cfg is missing), or ++ # This might raise OSError (if setup.cfg is missing), or + # configparser.NoSectionError (if it lacks a [versioneer] section), or + # configparser.NoOptionError (if it lacks "VCS="). See the docstring at + # the top of versioneer.py for instructions on writing your setup.cfg . + setup_cfg = os.path.join(root, "setup.cfg") +- parser = configparser.SafeConfigParser() +- with open(setup_cfg, "r") as f: +- parser.readfp(f) ++ parser = configparser.ConfigParser() ++ with open(setup_cfg, "r") as cfg_file: ++ parser.read_file(cfg_file) + VCS = parser.get("versioneer", "VCS") # mandatory + +- def get(parser, name): +- if parser.has_option("versioneer", name): +- return parser.get("versioneer", name) +- return None ++ # Dict-like interface for non-mandatory entries ++ section = parser["versioneer"] ++ + cfg = VersioneerConfig() + cfg.VCS = VCS +- cfg.style = get(parser, "style") or "" +- cfg.versionfile_source = get(parser, "versionfile_source") +- cfg.versionfile_build = get(parser, "versionfile_build") +- cfg.tag_prefix = get(parser, "tag_prefix") ++ cfg.style = section.get("style", "") ++ cfg.versionfile_source = section.get("versionfile_source") ++ cfg.versionfile_build = section.get("versionfile_build") ++ cfg.tag_prefix = section.get("tag_prefix") + if cfg.tag_prefix in ("''", '""'): + cfg.tag_prefix = "" +- cfg.parentdir_prefix = get(parser, "parentdir_prefix") +- cfg.verbose = get(parser, "verbose") ++ cfg.parentdir_prefix = section.get("parentdir_prefix") ++ cfg.verbose = section.get("verbose") + return cfg + + + class NotThisMethod(Exception): + """Exception raised if a method is not valid for the current scenario.""" + ++ + # these dictionaries contain VCS-specific tools +-LONG_VERSION_PY = {} +-HANDLERS = {} ++LONG_VERSION_PY: Dict[str, str] = {} ++HANDLERS: Dict[str, Dict[str, Callable]] = {} + + + def register_vcs_handler(vcs, method): # decorator +- """Decorator to mark a method as the handler for a particular VCS.""" ++ """Create decorator to mark a method as the handler of a VCS.""" + def decorate(f): + """Store f in HANDLERS[vcs][method].""" +- if vcs not in HANDLERS: +- HANDLERS[vcs] = {} +- HANDLERS[vcs][method] = f ++ HANDLERS.setdefault(vcs, {})[method] = f + return f + return decorate + + +-def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False): ++def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, ++ env=None): + """Call the given command(s).""" + assert isinstance(commands, list) +- p = None +- for c in commands: ++ process = None ++ ++ popen_kwargs = {} ++ if sys.platform == "win32": ++ # This hides the console window if pythonw.exe is used ++ startupinfo = subprocess.STARTUPINFO() ++ startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW ++ popen_kwargs["startupinfo"] = startupinfo ++ ++ for command in commands: + try: +- dispcmd = str([c] + args) ++ dispcmd = str([command] + args) + # remember shell=False, so use git.cmd on windows, not just git +- p = subprocess.Popen([c] + args, cwd=cwd, stdout=subprocess.PIPE, +- stderr=(subprocess.PIPE if hide_stderr +- else None)) ++ process = subprocess.Popen([command] + args, cwd=cwd, env=env, ++ stdout=subprocess.PIPE, ++ stderr=(subprocess.PIPE if hide_stderr ++ else None), **popen_kwargs) + break +- except EnvironmentError: ++ except OSError: + e = sys.exc_info()[1] + if e.errno == errno.ENOENT: + continue + if verbose: + print("unable to run %s" % dispcmd) + print(e) +- return None ++ return None, None + else: + if verbose: + print("unable to find command, tried %s" % (commands,)) +- return None +- stdout = p.communicate()[0].strip() +- if sys.version_info[0] >= 3: +- stdout = stdout.decode() +- if p.returncode != 0: ++ return None, None ++ stdout = process.communicate()[0].strip().decode() ++ if process.returncode != 0: + if verbose: + print("unable to run %s (error)" % dispcmd) +- return None +- return stdout +-LONG_VERSION_PY['git'] = ''' ++ print("stdout was %s" % stdout) ++ return None, process.returncode ++ return stdout, process.returncode ++ ++ ++LONG_VERSION_PY['git'] = r''' + # This file helps to compute a version number in source trees obtained from + # git-archive tarball (such as those provided by githubs download-from-tag + # feature). Distribution tarballs (built by setup.py sdist) and build +@@ -490,7 +431,7 @@ LONG_VERSION_PY['git'] = ''' + # that just contains the computed version number. + + # This file is released into the public domain. Generated by +-# versioneer-0.16 (https://github.com/warner/python-versioneer) ++# versioneer-0.22 (https://github.com/python-versioneer/python-versioneer) + + """Git implementation of _version.py.""" + +@@ -499,6 +440,8 @@ import os + import re + import subprocess + import sys ++from typing import Callable, Dict ++import functools + + + def get_keywords(): +@@ -509,7 +452,8 @@ def get_keywords(): + # get_keywords(). + git_refnames = "%(DOLLAR)sFormat:%%d%(DOLLAR)s" + git_full = "%(DOLLAR)sFormat:%%H%(DOLLAR)s" +- keywords = {"refnames": git_refnames, "full": git_full} ++ git_date = "%(DOLLAR)sFormat:%%ci%(DOLLAR)s" ++ keywords = {"refnames": git_refnames, "full": git_full, "date": git_date} + return keywords + + +@@ -535,12 +479,12 @@ class NotThisMethod(Exception): + """Exception raised if a method is not valid for the current scenario.""" + + +-LONG_VERSION_PY = {} +-HANDLERS = {} ++LONG_VERSION_PY: Dict[str, str] = {} ++HANDLERS: Dict[str, Dict[str, Callable]] = {} + + + def register_vcs_handler(vcs, method): # decorator +- """Decorator to mark a method as the handler for a particular VCS.""" ++ """Create decorator to mark a method as the handler of a VCS.""" + def decorate(f): + """Store f in HANDLERS[vcs][method].""" + if vcs not in HANDLERS: +@@ -550,55 +494,71 @@ def register_vcs_handler(vcs, method): # decorator + return decorate + + +-def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False): ++def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, ++ env=None): + """Call the given command(s).""" + assert isinstance(commands, list) +- p = None +- for c in commands: ++ process = None ++ ++ popen_kwargs = {} ++ if sys.platform == "win32": ++ # This hides the console window if pythonw.exe is used ++ startupinfo = subprocess.STARTUPINFO() ++ startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW ++ popen_kwargs["startupinfo"] = startupinfo ++ ++ for command in commands: + try: +- dispcmd = str([c] + args) ++ dispcmd = str([command] + args) + # remember shell=False, so use git.cmd on windows, not just git +- p = subprocess.Popen([c] + args, cwd=cwd, stdout=subprocess.PIPE, +- stderr=(subprocess.PIPE if hide_stderr +- else None)) ++ process = subprocess.Popen([command] + args, cwd=cwd, env=env, ++ stdout=subprocess.PIPE, ++ stderr=(subprocess.PIPE if hide_stderr ++ else None), **popen_kwargs) + break +- except EnvironmentError: ++ except OSError: + e = sys.exc_info()[1] + if e.errno == errno.ENOENT: + continue + if verbose: + print("unable to run %%s" %% dispcmd) + print(e) +- return None ++ return None, None + else: + if verbose: + print("unable to find command, tried %%s" %% (commands,)) +- return None +- stdout = p.communicate()[0].strip() +- if sys.version_info[0] >= 3: +- stdout = stdout.decode() +- if p.returncode != 0: ++ return None, None ++ stdout = process.communicate()[0].strip().decode() ++ if process.returncode != 0: + if verbose: + print("unable to run %%s (error)" %% dispcmd) +- return None +- return stdout ++ print("stdout was %%s" %% stdout) ++ return None, process.returncode ++ return stdout, process.returncode + + + def versions_from_parentdir(parentdir_prefix, root, verbose): + """Try to determine the version from the parent directory name. + +- Source tarballs conventionally unpack into a directory that includes +- both the project name and a version string. ++ Source tarballs conventionally unpack into a directory that includes both ++ the project name and a version string. We will also support searching up ++ two directory levels for an appropriately named parent directory + """ +- dirname = os.path.basename(root) +- if not dirname.startswith(parentdir_prefix): +- if verbose: +- print("guessing rootdir is '%%s', but '%%s' doesn't start with " +- "prefix '%%s'" %% (root, dirname, parentdir_prefix)) +- raise NotThisMethod("rootdir doesn't start with parentdir_prefix") +- return {"version": dirname[len(parentdir_prefix):], +- "full-revisionid": None, +- "dirty": False, "error": None} ++ rootdirs = [] ++ ++ for _ in range(3): ++ dirname = os.path.basename(root) ++ if dirname.startswith(parentdir_prefix): ++ return {"version": dirname[len(parentdir_prefix):], ++ "full-revisionid": None, ++ "dirty": False, "error": None, "date": None} ++ rootdirs.append(root) ++ root = os.path.dirname(root) # up a level ++ ++ if verbose: ++ print("Tried directories %%s but none started with prefix %%s" %% ++ (str(rootdirs), parentdir_prefix)) ++ raise NotThisMethod("rootdir doesn't start with parentdir_prefix") + + + @register_vcs_handler("git", "get_keywords") +@@ -610,18 +570,21 @@ def git_get_keywords(versionfile_abs): + # _version.py. + keywords = {} + try: +- f = open(versionfile_abs, "r") +- for line in f.readlines(): +- if line.strip().startswith("git_refnames ="): +- mo = re.search(r'=\s*"(.*)"', line) +- if mo: +- keywords["refnames"] = mo.group(1) +- if line.strip().startswith("git_full ="): +- mo = re.search(r'=\s*"(.*)"', line) +- if mo: +- keywords["full"] = mo.group(1) +- f.close() +- except EnvironmentError: ++ with open(versionfile_abs, "r") as fobj: ++ for line in fobj: ++ if line.strip().startswith("git_refnames ="): ++ mo = re.search(r'=\s*"(.*)"', line) ++ if mo: ++ keywords["refnames"] = mo.group(1) ++ if line.strip().startswith("git_full ="): ++ mo = re.search(r'=\s*"(.*)"', line) ++ if mo: ++ keywords["full"] = mo.group(1) ++ if line.strip().startswith("git_date ="): ++ mo = re.search(r'=\s*"(.*)"', line) ++ if mo: ++ keywords["date"] = mo.group(1) ++ except OSError: + pass + return keywords + +@@ -629,18 +592,31 @@ def git_get_keywords(versionfile_abs): + @register_vcs_handler("git", "keywords") + def git_versions_from_keywords(keywords, tag_prefix, verbose): + """Get version information from git keywords.""" +- if not keywords: +- raise NotThisMethod("no keywords at all, weird") ++ if "refnames" not in keywords: ++ raise NotThisMethod("Short version file found") ++ date = keywords.get("date") ++ if date is not None: ++ # Use only the last line. Previous lines may contain GPG signature ++ # information. ++ date = date.splitlines()[-1] ++ ++ # git-2.2.0 added "%%cI", which expands to an ISO-8601 -compliant ++ # datestamp. However we prefer "%%ci" (which expands to an "ISO-8601 ++ # -like" string, which we must then edit to make compliant), because ++ # it's been around since git-1.5.3, and it's too difficult to ++ # discover which version we're using, or to work around using an ++ # older one. ++ date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) + refnames = keywords["refnames"].strip() + if refnames.startswith("$Format"): + if verbose: + print("keywords are unexpanded, not using") + raise NotThisMethod("unexpanded keywords, not a git-archive tarball") +- refs = set([r.strip() for r in refnames.strip("()").split(",")]) ++ refs = {r.strip() for r in refnames.strip("()").split(",")} + # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of + # just "foo-1.0". If we see a "tag: " prefix, prefer those. + TAG = "tag: " +- tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)]) ++ tags = {r[len(TAG):] for r in refs if r.startswith(TAG)} + if not tags: + # Either we're using git < 1.8.3, or there really are no tags. We use + # a heuristic: assume all version tags have a digit. The old git %%d +@@ -649,56 +625,72 @@ def git_versions_from_keywords(keywords, tag_prefix, verbose): + # between branches and tags. By ignoring refnames without digits, we + # filter out many common branch names like "release" and + # "stabilization", as well as "HEAD" and "master". +- tags = set([r for r in refs if re.search(r'\d', r)]) ++ tags = {r for r in refs if re.search(r'\d', r)} + if verbose: +- print("discarding '%%s', no digits" %% ",".join(refs-tags)) ++ print("discarding '%%s', no digits" %% ",".join(refs - tags)) + if verbose: + print("likely tags: %%s" %% ",".join(sorted(tags))) + for ref in sorted(tags): + # sorting will prefer e.g. "2.0" over "2.0rc1" + if ref.startswith(tag_prefix): + r = ref[len(tag_prefix):] ++ # Filter out refs that exactly match prefix or that don't start ++ # with a number once the prefix is stripped (mostly a concern ++ # when prefix is '') ++ if not re.match(r'\d', r): ++ continue + if verbose: + print("picking %%s" %% r) + return {"version": r, + "full-revisionid": keywords["full"].strip(), +- "dirty": False, "error": None +- } ++ "dirty": False, "error": None, ++ "date": date} + # no suitable tags, so version is "0+unknown", but full hex is still there + if verbose: + print("no suitable tags, using unknown + full revision id") + return {"version": "0+unknown", + "full-revisionid": keywords["full"].strip(), +- "dirty": False, "error": "no suitable tags"} ++ "dirty": False, "error": "no suitable tags", "date": None} + + + @register_vcs_handler("git", "pieces_from_vcs") +-def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): ++def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command): + """Get version from 'git describe' in the root of the source tree. + + This only gets called if the git-archive 'subst' keywords were *not* + expanded, and _version.py hasn't already been rewritten with a short + version string, meaning we're inside a checked out source tree. + """ +- if not os.path.exists(os.path.join(root, ".git")): +- if verbose: +- print("no .git in %%s" %% root) +- raise NotThisMethod("no .git directory") +- + GITS = ["git"] + if sys.platform == "win32": + GITS = ["git.cmd", "git.exe"] ++ ++ # GIT_DIR can interfere with correct operation of Versioneer. ++ # It may be intended to be passed to the Versioneer-versioned project, ++ # but that should not change where we get our version from. ++ env = os.environ.copy() ++ env.pop("GIT_DIR", None) ++ runner = functools.partial(runner, env=env) ++ ++ _, rc = runner(GITS, ["rev-parse", "--git-dir"], cwd=root, ++ hide_stderr=True) ++ if rc != 0: ++ if verbose: ++ print("Directory %%s not under git control" %% root) ++ raise NotThisMethod("'git rev-parse --git-dir' returned error") ++ ++ MATCH_ARGS = ["--match", "%%s*" %% tag_prefix] if tag_prefix else [] ++ + # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] + # if there isn't one, this yields HEX[-dirty] (no NUM) +- describe_out = run_command(GITS, ["describe", "--tags", "--dirty", +- "--always", "--long", +- "--match", "%%s*" %% tag_prefix], +- cwd=root) ++ describe_out, rc = runner(GITS, ["describe", "--tags", "--dirty", ++ "--always", "--long", *MATCH_ARGS], ++ cwd=root) + # --long was added in git-1.5.5 + if describe_out is None: + raise NotThisMethod("'git describe' failed") + describe_out = describe_out.strip() +- full_out = run_command(GITS, ["rev-parse", "HEAD"], cwd=root) ++ full_out, rc = runner(GITS, ["rev-parse", "HEAD"], cwd=root) + if full_out is None: + raise NotThisMethod("'git rev-parse' failed") + full_out = full_out.strip() +@@ -708,6 +700,39 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): + pieces["short"] = full_out[:7] # maybe improved later + pieces["error"] = None + ++ branch_name, rc = runner(GITS, ["rev-parse", "--abbrev-ref", "HEAD"], ++ cwd=root) ++ # --abbrev-ref was added in git-1.6.3 ++ if rc != 0 or branch_name is None: ++ raise NotThisMethod("'git rev-parse --abbrev-ref' returned error") ++ branch_name = branch_name.strip() ++ ++ if branch_name == "HEAD": ++ # If we aren't exactly on a branch, pick a branch which represents ++ # the current commit. If all else fails, we are on a branchless ++ # commit. ++ branches, rc = runner(GITS, ["branch", "--contains"], cwd=root) ++ # --contains was added in git-1.5.4 ++ if rc != 0 or branches is None: ++ raise NotThisMethod("'git branch --contains' returned error") ++ branches = branches.split("\n") ++ ++ # Remove the first line if we're running detached ++ if "(" in branches[0]: ++ branches.pop(0) ++ ++ # Strip off the leading "* " from the list of branches. ++ branches = [branch[2:] for branch in branches] ++ if "master" in branches: ++ branch_name = "master" ++ elif not branches: ++ branch_name = None ++ else: ++ # Pick the first branch that is returned. Good or bad. ++ branch_name = branches[0] ++ ++ pieces["branch"] = branch_name ++ + # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] + # TAG might have hyphens. + git_describe = describe_out +@@ -724,7 +749,7 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): + # TAG-NUM-gHEX + mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe) + if not mo: +- # unparseable. Maybe git-describe is misbehaving? ++ # unparsable. Maybe git-describe is misbehaving? + pieces["error"] = ("unable to parse git-describe output: '%%s'" + %% describe_out) + return pieces +@@ -749,10 +774,16 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): + else: + # HEX: no tags + pieces["closest-tag"] = None +- count_out = run_command(GITS, ["rev-list", "HEAD", "--count"], +- cwd=root) ++ count_out, rc = runner(GITS, ["rev-list", "HEAD", "--count"], cwd=root) + pieces["distance"] = int(count_out) # total number of commits + ++ # commit date: see ISO-8601 comment in git_versions_from_keywords() ++ date = runner(GITS, ["show", "-s", "--format=%%ci", "HEAD"], cwd=root)[0].strip() ++ # Use only the last line. Previous lines may contain GPG signature ++ # information. ++ date = date.splitlines()[-1] ++ pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) ++ + return pieces + + +@@ -788,19 +819,67 @@ def render_pep440(pieces): + return rendered + + +-def render_pep440_pre(pieces): +- """TAG[.post.devDISTANCE] -- No -dirty. ++def render_pep440_branch(pieces): ++ """TAG[[.dev0]+DISTANCE.gHEX[.dirty]] . ++ ++ The ".dev0" means not master branch. Note that .dev0 sorts backwards ++ (a feature branch will appear "older" than the master branch). + + Exceptions: +- 1: no tags. 0.post.devDISTANCE ++ 1: no tags. 0[.dev0]+untagged.DISTANCE.gHEX[.dirty] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] ++ if pieces["distance"] or pieces["dirty"]: ++ if pieces["branch"] != "master": ++ rendered += ".dev0" ++ rendered += plus_or_dot(pieces) ++ rendered += "%%d.g%%s" %% (pieces["distance"], pieces["short"]) ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ else: ++ # exception #1 ++ rendered = "0" ++ if pieces["branch"] != "master": ++ rendered += ".dev0" ++ rendered += "+untagged.%%d.g%%s" %% (pieces["distance"], ++ pieces["short"]) ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ return rendered ++ ++ ++def pep440_split_post(ver): ++ """Split pep440 version string at the post-release segment. ++ ++ Returns the release segments before the post-release and the ++ post-release version number (or -1 if no post-release segment is present). ++ """ ++ vc = str.split(ver, ".post") ++ return vc[0], int(vc[1] or 0) if len(vc) == 2 else None ++ ++ ++def render_pep440_pre(pieces): ++ """TAG[.postN.devDISTANCE] -- No -dirty. ++ ++ Exceptions: ++ 1: no tags. 0.post0.devDISTANCE ++ """ ++ if pieces["closest-tag"]: + if pieces["distance"]: +- rendered += ".post.dev%%d" %% pieces["distance"] ++ # update the post release segment ++ tag_version, post_version = pep440_split_post(pieces["closest-tag"]) ++ rendered = tag_version ++ if post_version is not None: ++ rendered += ".post%%d.dev%%d" %% (post_version+1, pieces["distance"]) ++ else: ++ rendered += ".post0.dev%%d" %% (pieces["distance"]) ++ else: ++ # no commits, use the tag as the version ++ rendered = pieces["closest-tag"] + else: + # exception #1 +- rendered = "0.post.dev%%d" %% pieces["distance"] ++ rendered = "0.post0.dev%%d" %% pieces["distance"] + return rendered + + +@@ -831,12 +910,41 @@ def render_pep440_post(pieces): + return rendered + + ++def render_pep440_post_branch(pieces): ++ """TAG[.postDISTANCE[.dev0]+gHEX[.dirty]] . ++ ++ The ".dev0" means not master branch. ++ ++ Exceptions: ++ 1: no tags. 0.postDISTANCE[.dev0]+gHEX[.dirty] ++ """ ++ if pieces["closest-tag"]: ++ rendered = pieces["closest-tag"] ++ if pieces["distance"] or pieces["dirty"]: ++ rendered += ".post%%d" %% pieces["distance"] ++ if pieces["branch"] != "master": ++ rendered += ".dev0" ++ rendered += plus_or_dot(pieces) ++ rendered += "g%%s" %% pieces["short"] ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ else: ++ # exception #1 ++ rendered = "0.post%%d" %% pieces["distance"] ++ if pieces["branch"] != "master": ++ rendered += ".dev0" ++ rendered += "+g%%s" %% pieces["short"] ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ return rendered ++ ++ + def render_pep440_old(pieces): + """TAG[.postDISTANCE[.dev0]] . + + The ".dev0" means dirty. + +- Eexceptions: ++ Exceptions: + 1: no tags. 0.postDISTANCE[.dev0] + """ + if pieces["closest-tag"]: +@@ -899,17 +1007,22 @@ def render(pieces, style): + return {"version": "unknown", + "full-revisionid": pieces.get("long"), + "dirty": None, +- "error": pieces["error"]} ++ "error": pieces["error"], ++ "date": None} + + if not style or style == "default": + style = "pep440" # the default + + if style == "pep440": + rendered = render_pep440(pieces) ++ elif style == "pep440-branch": ++ rendered = render_pep440_branch(pieces) + elif style == "pep440-pre": + rendered = render_pep440_pre(pieces) + elif style == "pep440-post": + rendered = render_pep440_post(pieces) ++ elif style == "pep440-post-branch": ++ rendered = render_pep440_post_branch(pieces) + elif style == "pep440-old": + rendered = render_pep440_old(pieces) + elif style == "git-describe": +@@ -920,7 +1033,8 @@ def render(pieces, style): + raise ValueError("unknown style '%%s'" %% style) + + return {"version": rendered, "full-revisionid": pieces["long"], +- "dirty": pieces["dirty"], "error": None} ++ "dirty": pieces["dirty"], "error": None, ++ "date": pieces.get("date")} + + + def get_versions(): +@@ -944,12 +1058,13 @@ def get_versions(): + # versionfile_source is the relative path from the top of the source + # tree (where the .git directory might live) to this file. Invert + # this to find the root from __file__. +- for i in cfg.versionfile_source.split('/'): ++ for _ in cfg.versionfile_source.split('/'): + root = os.path.dirname(root) + except NameError: + return {"version": "0+unknown", "full-revisionid": None, + "dirty": None, +- "error": "unable to find root of source tree"} ++ "error": "unable to find root of source tree", ++ "date": None} + + try: + pieces = git_pieces_from_vcs(cfg.tag_prefix, root, verbose) +@@ -965,7 +1080,7 @@ def get_versions(): + + return {"version": "0+unknown", "full-revisionid": None, + "dirty": None, +- "error": "unable to compute version"} ++ "error": "unable to compute version", "date": None} + ''' + + +@@ -978,18 +1093,21 @@ def git_get_keywords(versionfile_abs): + # _version.py. + keywords = {} + try: +- f = open(versionfile_abs, "r") +- for line in f.readlines(): +- if line.strip().startswith("git_refnames ="): +- mo = re.search(r'=\s*"(.*)"', line) +- if mo: +- keywords["refnames"] = mo.group(1) +- if line.strip().startswith("git_full ="): +- mo = re.search(r'=\s*"(.*)"', line) +- if mo: +- keywords["full"] = mo.group(1) +- f.close() +- except EnvironmentError: ++ with open(versionfile_abs, "r") as fobj: ++ for line in fobj: ++ if line.strip().startswith("git_refnames ="): ++ mo = re.search(r'=\s*"(.*)"', line) ++ if mo: ++ keywords["refnames"] = mo.group(1) ++ if line.strip().startswith("git_full ="): ++ mo = re.search(r'=\s*"(.*)"', line) ++ if mo: ++ keywords["full"] = mo.group(1) ++ if line.strip().startswith("git_date ="): ++ mo = re.search(r'=\s*"(.*)"', line) ++ if mo: ++ keywords["date"] = mo.group(1) ++ except OSError: + pass + return keywords + +@@ -997,18 +1115,31 @@ def git_get_keywords(versionfile_abs): + @register_vcs_handler("git", "keywords") + def git_versions_from_keywords(keywords, tag_prefix, verbose): + """Get version information from git keywords.""" +- if not keywords: +- raise NotThisMethod("no keywords at all, weird") ++ if "refnames" not in keywords: ++ raise NotThisMethod("Short version file found") ++ date = keywords.get("date") ++ if date is not None: ++ # Use only the last line. Previous lines may contain GPG signature ++ # information. ++ date = date.splitlines()[-1] ++ ++ # git-2.2.0 added "%cI", which expands to an ISO-8601 -compliant ++ # datestamp. However we prefer "%ci" (which expands to an "ISO-8601 ++ # -like" string, which we must then edit to make compliant), because ++ # it's been around since git-1.5.3, and it's too difficult to ++ # discover which version we're using, or to work around using an ++ # older one. ++ date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) + refnames = keywords["refnames"].strip() + if refnames.startswith("$Format"): + if verbose: + print("keywords are unexpanded, not using") + raise NotThisMethod("unexpanded keywords, not a git-archive tarball") +- refs = set([r.strip() for r in refnames.strip("()").split(",")]) ++ refs = {r.strip() for r in refnames.strip("()").split(",")} + # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of + # just "foo-1.0". If we see a "tag: " prefix, prefer those. + TAG = "tag: " +- tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)]) ++ tags = {r[len(TAG):] for r in refs if r.startswith(TAG)} + if not tags: + # Either we're using git < 1.8.3, or there really are no tags. We use + # a heuristic: assume all version tags have a digit. The old git %d +@@ -1017,56 +1148,72 @@ def git_versions_from_keywords(keywords, tag_prefix, verbose): + # between branches and tags. By ignoring refnames without digits, we + # filter out many common branch names like "release" and + # "stabilization", as well as "HEAD" and "master". +- tags = set([r for r in refs if re.search(r'\d', r)]) ++ tags = {r for r in refs if re.search(r'\d', r)} + if verbose: +- print("discarding '%s', no digits" % ",".join(refs-tags)) ++ print("discarding '%s', no digits" % ",".join(refs - tags)) + if verbose: + print("likely tags: %s" % ",".join(sorted(tags))) + for ref in sorted(tags): + # sorting will prefer e.g. "2.0" over "2.0rc1" + if ref.startswith(tag_prefix): + r = ref[len(tag_prefix):] ++ # Filter out refs that exactly match prefix or that don't start ++ # with a number once the prefix is stripped (mostly a concern ++ # when prefix is '') ++ if not re.match(r'\d', r): ++ continue + if verbose: + print("picking %s" % r) + return {"version": r, + "full-revisionid": keywords["full"].strip(), +- "dirty": False, "error": None +- } ++ "dirty": False, "error": None, ++ "date": date} + # no suitable tags, so version is "0+unknown", but full hex is still there + if verbose: + print("no suitable tags, using unknown + full revision id") + return {"version": "0+unknown", + "full-revisionid": keywords["full"].strip(), +- "dirty": False, "error": "no suitable tags"} ++ "dirty": False, "error": "no suitable tags", "date": None} + + + @register_vcs_handler("git", "pieces_from_vcs") +-def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): ++def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command): + """Get version from 'git describe' in the root of the source tree. + + This only gets called if the git-archive 'subst' keywords were *not* + expanded, and _version.py hasn't already been rewritten with a short + version string, meaning we're inside a checked out source tree. + """ +- if not os.path.exists(os.path.join(root, ".git")): +- if verbose: +- print("no .git in %s" % root) +- raise NotThisMethod("no .git directory") +- + GITS = ["git"] + if sys.platform == "win32": + GITS = ["git.cmd", "git.exe"] ++ ++ # GIT_DIR can interfere with correct operation of Versioneer. ++ # It may be intended to be passed to the Versioneer-versioned project, ++ # but that should not change where we get our version from. ++ env = os.environ.copy() ++ env.pop("GIT_DIR", None) ++ runner = functools.partial(runner, env=env) ++ ++ _, rc = runner(GITS, ["rev-parse", "--git-dir"], cwd=root, ++ hide_stderr=True) ++ if rc != 0: ++ if verbose: ++ print("Directory %s not under git control" % root) ++ raise NotThisMethod("'git rev-parse --git-dir' returned error") ++ ++ MATCH_ARGS = ["--match", "%s*" % tag_prefix] if tag_prefix else [] ++ + # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] + # if there isn't one, this yields HEX[-dirty] (no NUM) +- describe_out = run_command(GITS, ["describe", "--tags", "--dirty", +- "--always", "--long", +- "--match", "%s*" % tag_prefix], +- cwd=root) ++ describe_out, rc = runner(GITS, ["describe", "--tags", "--dirty", ++ "--always", "--long", *MATCH_ARGS], ++ cwd=root) + # --long was added in git-1.5.5 + if describe_out is None: + raise NotThisMethod("'git describe' failed") + describe_out = describe_out.strip() +- full_out = run_command(GITS, ["rev-parse", "HEAD"], cwd=root) ++ full_out, rc = runner(GITS, ["rev-parse", "HEAD"], cwd=root) + if full_out is None: + raise NotThisMethod("'git rev-parse' failed") + full_out = full_out.strip() +@@ -1076,6 +1223,39 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): + pieces["short"] = full_out[:7] # maybe improved later + pieces["error"] = None + ++ branch_name, rc = runner(GITS, ["rev-parse", "--abbrev-ref", "HEAD"], ++ cwd=root) ++ # --abbrev-ref was added in git-1.6.3 ++ if rc != 0 or branch_name is None: ++ raise NotThisMethod("'git rev-parse --abbrev-ref' returned error") ++ branch_name = branch_name.strip() ++ ++ if branch_name == "HEAD": ++ # If we aren't exactly on a branch, pick a branch which represents ++ # the current commit. If all else fails, we are on a branchless ++ # commit. ++ branches, rc = runner(GITS, ["branch", "--contains"], cwd=root) ++ # --contains was added in git-1.5.4 ++ if rc != 0 or branches is None: ++ raise NotThisMethod("'git branch --contains' returned error") ++ branches = branches.split("\n") ++ ++ # Remove the first line if we're running detached ++ if "(" in branches[0]: ++ branches.pop(0) ++ ++ # Strip off the leading "* " from the list of branches. ++ branches = [branch[2:] for branch in branches] ++ if "master" in branches: ++ branch_name = "master" ++ elif not branches: ++ branch_name = None ++ else: ++ # Pick the first branch that is returned. Good or bad. ++ branch_name = branches[0] ++ ++ pieces["branch"] = branch_name ++ + # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] + # TAG might have hyphens. + git_describe = describe_out +@@ -1092,7 +1272,7 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): + # TAG-NUM-gHEX + mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe) + if not mo: +- # unparseable. Maybe git-describe is misbehaving? ++ # unparsable. Maybe git-describe is misbehaving? + pieces["error"] = ("unable to parse git-describe output: '%s'" + % describe_out) + return pieces +@@ -1117,10 +1297,16 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): + else: + # HEX: no tags + pieces["closest-tag"] = None +- count_out = run_command(GITS, ["rev-list", "HEAD", "--count"], +- cwd=root) ++ count_out, rc = runner(GITS, ["rev-list", "HEAD", "--count"], cwd=root) + pieces["distance"] = int(count_out) # total number of commits + ++ # commit date: see ISO-8601 comment in git_versions_from_keywords() ++ date = runner(GITS, ["show", "-s", "--format=%ci", "HEAD"], cwd=root)[0].strip() ++ # Use only the last line. Previous lines may contain GPG signature ++ # information. ++ date = date.splitlines()[-1] ++ pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) ++ + return pieces + + +@@ -1128,7 +1314,7 @@ def do_vcs_install(manifest_in, versionfile_source, ipy): + """Git-specific installation logic for Versioneer. + + For Git, this means creating/changing .gitattributes to mark _version.py +- for export-time keyword substitution. ++ for export-subst keyword substitution. + """ + GITS = ["git"] + if sys.platform == "win32": +@@ -1137,27 +1323,26 @@ def do_vcs_install(manifest_in, versionfile_source, ipy): + if ipy: + files.append(ipy) + try: +- me = __file__ +- if me.endswith(".pyc") or me.endswith(".pyo"): +- me = os.path.splitext(me)[0] + ".py" +- versioneer_file = os.path.relpath(me) ++ my_path = __file__ ++ if my_path.endswith(".pyc") or my_path.endswith(".pyo"): ++ my_path = os.path.splitext(my_path)[0] + ".py" ++ versioneer_file = os.path.relpath(my_path) + except NameError: + versioneer_file = "versioneer.py" + files.append(versioneer_file) + present = False + try: +- f = open(".gitattributes", "r") +- for line in f.readlines(): +- if line.strip().startswith(versionfile_source): +- if "export-subst" in line.strip().split()[1:]: +- present = True +- f.close() +- except EnvironmentError: ++ with open(".gitattributes", "r") as fobj: ++ for line in fobj: ++ if line.strip().startswith(versionfile_source): ++ if "export-subst" in line.strip().split()[1:]: ++ present = True ++ break ++ except OSError: + pass + if not present: +- f = open(".gitattributes", "a+") +- f.write("%s export-subst\n" % versionfile_source) +- f.close() ++ with open(".gitattributes", "a+") as fobj: ++ fobj.write(f"{versionfile_source} export-subst\n") + files.append(".gitattributes") + run_command(GITS, ["add", "--"] + files) + +@@ -1165,27 +1350,34 @@ def do_vcs_install(manifest_in, versionfile_source, ipy): + def versions_from_parentdir(parentdir_prefix, root, verbose): + """Try to determine the version from the parent directory name. + +- Source tarballs conventionally unpack into a directory that includes +- both the project name and a version string. ++ Source tarballs conventionally unpack into a directory that includes both ++ the project name and a version string. We will also support searching up ++ two directory levels for an appropriately named parent directory + """ +- dirname = os.path.basename(root) +- if not dirname.startswith(parentdir_prefix): +- if verbose: +- print("guessing rootdir is '%s', but '%s' doesn't start with " +- "prefix '%s'" % (root, dirname, parentdir_prefix)) +- raise NotThisMethod("rootdir doesn't start with parentdir_prefix") +- return {"version": dirname[len(parentdir_prefix):], +- "full-revisionid": None, +- "dirty": False, "error": None} ++ rootdirs = [] ++ ++ for _ in range(3): ++ dirname = os.path.basename(root) ++ if dirname.startswith(parentdir_prefix): ++ return {"version": dirname[len(parentdir_prefix):], ++ "full-revisionid": None, ++ "dirty": False, "error": None, "date": None} ++ rootdirs.append(root) ++ root = os.path.dirname(root) # up a level ++ ++ if verbose: ++ print("Tried directories %s but none started with prefix %s" % ++ (str(rootdirs), parentdir_prefix)) ++ raise NotThisMethod("rootdir doesn't start with parentdir_prefix") ++ + + SHORT_VERSION_PY = """ +-# This file was generated by 'versioneer.py' (0.16) from ++# This file was generated by 'versioneer.py' (0.22) from + # revision-control system data, or from the parent directory name of an + # unpacked source archive. Distribution tarballs contain a pre-generated copy + # of this file. + + import json +-import sys + + version_json = ''' + %s +@@ -1202,10 +1394,13 @@ def versions_from_file(filename): + try: + with open(filename) as f: + contents = f.read() +- except EnvironmentError: ++ except OSError: + raise NotThisMethod("unable to read _version.py") + mo = re.search(r"version_json = '''\n(.*)''' # END VERSION_JSON", + contents, re.M | re.S) ++ if not mo: ++ mo = re.search(r"version_json = '''\r\n(.*)''' # END VERSION_JSON", ++ contents, re.M | re.S) + if not mo: + raise NotThisMethod("no version_json in _version.py") + return json.loads(mo.group(1)) +@@ -1254,19 +1449,67 @@ def render_pep440(pieces): + return rendered + + +-def render_pep440_pre(pieces): +- """TAG[.post.devDISTANCE] -- No -dirty. ++def render_pep440_branch(pieces): ++ """TAG[[.dev0]+DISTANCE.gHEX[.dirty]] . ++ ++ The ".dev0" means not master branch. Note that .dev0 sorts backwards ++ (a feature branch will appear "older" than the master branch). + + Exceptions: +- 1: no tags. 0.post.devDISTANCE ++ 1: no tags. 0[.dev0]+untagged.DISTANCE.gHEX[.dirty] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] ++ if pieces["distance"] or pieces["dirty"]: ++ if pieces["branch"] != "master": ++ rendered += ".dev0" ++ rendered += plus_or_dot(pieces) ++ rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ else: ++ # exception #1 ++ rendered = "0" ++ if pieces["branch"] != "master": ++ rendered += ".dev0" ++ rendered += "+untagged.%d.g%s" % (pieces["distance"], ++ pieces["short"]) ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ return rendered ++ ++ ++def pep440_split_post(ver): ++ """Split pep440 version string at the post-release segment. ++ ++ Returns the release segments before the post-release and the ++ post-release version number (or -1 if no post-release segment is present). ++ """ ++ vc = str.split(ver, ".post") ++ return vc[0], int(vc[1] or 0) if len(vc) == 2 else None ++ ++ ++def render_pep440_pre(pieces): ++ """TAG[.postN.devDISTANCE] -- No -dirty. ++ ++ Exceptions: ++ 1: no tags. 0.post0.devDISTANCE ++ """ ++ if pieces["closest-tag"]: + if pieces["distance"]: +- rendered += ".post.dev%d" % pieces["distance"] ++ # update the post release segment ++ tag_version, post_version = pep440_split_post(pieces["closest-tag"]) ++ rendered = tag_version ++ if post_version is not None: ++ rendered += ".post%d.dev%d" % (post_version+1, pieces["distance"]) ++ else: ++ rendered += ".post0.dev%d" % (pieces["distance"]) ++ else: ++ # no commits, use the tag as the version ++ rendered = pieces["closest-tag"] + else: + # exception #1 +- rendered = "0.post.dev%d" % pieces["distance"] ++ rendered = "0.post0.dev%d" % pieces["distance"] + return rendered + + +@@ -1297,12 +1540,41 @@ def render_pep440_post(pieces): + return rendered + + ++def render_pep440_post_branch(pieces): ++ """TAG[.postDISTANCE[.dev0]+gHEX[.dirty]] . ++ ++ The ".dev0" means not master branch. ++ ++ Exceptions: ++ 1: no tags. 0.postDISTANCE[.dev0]+gHEX[.dirty] ++ """ ++ if pieces["closest-tag"]: ++ rendered = pieces["closest-tag"] ++ if pieces["distance"] or pieces["dirty"]: ++ rendered += ".post%d" % pieces["distance"] ++ if pieces["branch"] != "master": ++ rendered += ".dev0" ++ rendered += plus_or_dot(pieces) ++ rendered += "g%s" % pieces["short"] ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ else: ++ # exception #1 ++ rendered = "0.post%d" % pieces["distance"] ++ if pieces["branch"] != "master": ++ rendered += ".dev0" ++ rendered += "+g%s" % pieces["short"] ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ return rendered ++ ++ + def render_pep440_old(pieces): + """TAG[.postDISTANCE[.dev0]] . + + The ".dev0" means dirty. + +- Eexceptions: ++ Exceptions: + 1: no tags. 0.postDISTANCE[.dev0] + """ + if pieces["closest-tag"]: +@@ -1365,17 +1637,22 @@ def render(pieces, style): + return {"version": "unknown", + "full-revisionid": pieces.get("long"), + "dirty": None, +- "error": pieces["error"]} ++ "error": pieces["error"], ++ "date": None} + + if not style or style == "default": + style = "pep440" # the default + + if style == "pep440": + rendered = render_pep440(pieces) ++ elif style == "pep440-branch": ++ rendered = render_pep440_branch(pieces) + elif style == "pep440-pre": + rendered = render_pep440_pre(pieces) + elif style == "pep440-post": + rendered = render_pep440_post(pieces) ++ elif style == "pep440-post-branch": ++ rendered = render_pep440_post_branch(pieces) + elif style == "pep440-old": + rendered = render_pep440_old(pieces) + elif style == "git-describe": +@@ -1386,7 +1663,8 @@ def render(pieces, style): + raise ValueError("unknown style '%s'" % style) + + return {"version": rendered, "full-revisionid": pieces["long"], +- "dirty": pieces["dirty"], "error": None} ++ "dirty": pieces["dirty"], "error": None, ++ "date": pieces.get("date")} + + + class VersioneerBadRootError(Exception): +@@ -1465,7 +1743,8 @@ def get_versions(verbose=False): + print("unable to compute version") + + return {"version": "0+unknown", "full-revisionid": None, +- "dirty": None, "error": "unable to compute version"} ++ "dirty": None, "error": "unable to compute version", ++ "date": None} + + + def get_version(): +@@ -1473,8 +1752,12 @@ def get_version(): + return get_versions()["version"] + + +-def get_cmdclass(): +- """Get the custom setuptools/distutils subclasses used by Versioneer.""" ++def get_cmdclass(cmdclass=None): ++ """Get the custom setuptools/distutils subclasses used by Versioneer. ++ ++ If the package uses a different cmdclass (e.g. one from numpy), it ++ should be provide as an argument. ++ """ + if "versioneer" in sys.modules: + del sys.modules["versioneer"] + # this fixes the "python setup.py develop" case (also 'install' and +@@ -1488,12 +1771,15 @@ def get_cmdclass(): + # parent is protected against the child's "import versioneer". By + # removing ourselves from sys.modules here, before the child build + # happens, we protect the child from the parent's versioneer too. +- # Also see https://github.com/warner/python-versioneer/issues/52 ++ # Also see https://github.com/python-versioneer/python-versioneer/issues/52 + +- cmds = {} ++ cmds = {} if cmdclass is None else cmdclass.copy() + + # we add "version" to both distutils and setuptools +- from distutils.core import Command ++ try: ++ from setuptools import Command ++ except ImportError: ++ from distutils.core import Command + + class cmd_version(Command): + description = "report generated version string" +@@ -1511,6 +1797,7 @@ def get_cmdclass(): + print("Version: %s" % vers["version"]) + print(" full-revisionid: %s" % vers.get("full-revisionid")) + print(" dirty: %s" % vers.get("dirty")) ++ print(" date: %s" % vers.get("date")) + if vers["error"]: + print(" error: %s" % vers["error"]) + cmds["version"] = cmd_version +@@ -1524,9 +1811,16 @@ def get_cmdclass(): + # setuptools/bdist_egg -> distutils/install_lib -> build_py + # setuptools/install -> bdist_egg ->.. + # setuptools/develop -> ? ++ # pip install: ++ # copies source tree to a tempdir before running egg_info/etc ++ # if .git isn't copied too, 'git describe' will fail ++ # then does setup.py bdist_wheel, or sometimes setup.py install ++ # setup.py egg_info -> ? + + # we override different "build_py" commands for both environments +- if "setuptools" in sys.modules: ++ if 'build_py' in cmds: ++ _build_py = cmds['build_py'] ++ elif "setuptools" in sys.modules: + from setuptools.command.build_py import build_py as _build_py + else: + from distutils.command.build_py import build_py as _build_py +@@ -1546,8 +1840,41 @@ def get_cmdclass(): + write_to_version_file(target_versionfile, versions) + cmds["build_py"] = cmd_build_py + ++ if 'build_ext' in cmds: ++ _build_ext = cmds['build_ext'] ++ elif "setuptools" in sys.modules: ++ from setuptools.command.build_ext import build_ext as _build_ext ++ else: ++ from distutils.command.build_ext import build_ext as _build_ext ++ ++ class cmd_build_ext(_build_ext): ++ def run(self): ++ root = get_root() ++ cfg = get_config_from_root(root) ++ versions = get_versions() ++ _build_ext.run(self) ++ if self.inplace: ++ # build_ext --inplace will only build extensions in ++ # build/lib<..> dir with no _version.py to write to. ++ # As in place builds will already have a _version.py ++ # in the module dir, we do not need to write one. ++ return ++ # now locate _version.py in the new build/ directory and replace ++ # it with an updated value ++ target_versionfile = os.path.join(self.build_lib, ++ cfg.versionfile_build) ++ print("UPDATING %s" % target_versionfile) ++ write_to_version_file(target_versionfile, versions) ++ cmds["build_ext"] = cmd_build_ext ++ + if "cx_Freeze" in sys.modules: # cx_freeze enabled? + from cx_Freeze.dist import build_exe as _build_exe ++ # nczeczulin reports that py2exe won't like the pep440-style string ++ # as FILEVERSION, but it can be used for PRODUCTVERSION, e.g. ++ # setup(console=[{ ++ # "version": versioneer.get_version().split("+", 1)[0], # FILEVERSION ++ # "product_version": versioneer.get_version(), ++ # ... + + class cmd_build_exe(_build_exe): + def run(self): +@@ -1572,8 +1899,35 @@ def get_cmdclass(): + cmds["build_exe"] = cmd_build_exe + del cmds["build_py"] + ++ if 'py2exe' in sys.modules: # py2exe enabled? ++ from py2exe.distutils_buildexe import py2exe as _py2exe ++ ++ class cmd_py2exe(_py2exe): ++ def run(self): ++ root = get_root() ++ cfg = get_config_from_root(root) ++ versions = get_versions() ++ target_versionfile = cfg.versionfile_source ++ print("UPDATING %s" % target_versionfile) ++ write_to_version_file(target_versionfile, versions) ++ ++ _py2exe.run(self) ++ os.unlink(target_versionfile) ++ with open(cfg.versionfile_source, "w") as f: ++ LONG = LONG_VERSION_PY[cfg.VCS] ++ f.write(LONG % ++ {"DOLLAR": "$", ++ "STYLE": cfg.style, ++ "TAG_PREFIX": cfg.tag_prefix, ++ "PARENTDIR_PREFIX": cfg.parentdir_prefix, ++ "VERSIONFILE_SOURCE": cfg.versionfile_source, ++ }) ++ cmds["py2exe"] = cmd_py2exe ++ + # we override different "sdist" commands for both environments +- if "setuptools" in sys.modules: ++ if 'sdist' in cmds: ++ _sdist = cmds['sdist'] ++ elif "setuptools" in sys.modules: + from setuptools.command.sdist import sdist as _sdist + else: + from distutils.command.sdist import sdist as _sdist +@@ -1640,21 +1994,26 @@ SAMPLE_CONFIG = """ + + """ + +-INIT_PY_SNIPPET = """ ++OLD_SNIPPET = """ + from ._version import get_versions + __version__ = get_versions()['version'] + del get_versions + """ + ++INIT_PY_SNIPPET = """ ++from . import {0} ++__version__ = {0}.get_versions()['version'] ++""" ++ + + def do_setup(): +- """Main VCS-independent setup function for installing Versioneer.""" ++ """Do main VCS-independent setup function for installing Versioneer.""" + root = get_root() + try: + cfg = get_config_from_root(root) +- except (EnvironmentError, configparser.NoSectionError, ++ except (OSError, configparser.NoSectionError, + configparser.NoOptionError) as e: +- if isinstance(e, (EnvironmentError, configparser.NoSectionError)): ++ if isinstance(e, (OSError, configparser.NoSectionError)): + print("Adding sample versioneer config to setup.cfg", + file=sys.stderr) + with open(os.path.join(root, "setup.cfg"), "a") as f: +@@ -1678,12 +2037,18 @@ def do_setup(): + try: + with open(ipy, "r") as f: + old = f.read() +- except EnvironmentError: ++ except OSError: + old = "" +- if INIT_PY_SNIPPET not in old: ++ module = os.path.splitext(os.path.basename(cfg.versionfile_source))[0] ++ snippet = INIT_PY_SNIPPET.format(module) ++ if OLD_SNIPPET in old: ++ print(" replacing boilerplate in %s" % ipy) ++ with open(ipy, "w") as f: ++ f.write(old.replace(OLD_SNIPPET, snippet)) ++ elif snippet not in old: + print(" appending to %s" % ipy) + with open(ipy, "a") as f: +- f.write(INIT_PY_SNIPPET) ++ f.write(snippet) + else: + print(" %s unmodified" % ipy) + else: +@@ -1702,7 +2067,7 @@ def do_setup(): + if line.startswith("include "): + for include in line.split()[1:]: + simple_includes.add(include) +- except EnvironmentError: ++ except OSError: + pass + # That doesn't cover everything MANIFEST.in can do + # (http://docs.python.org/2/distutils/sourcedist.html#commands), so +@@ -1723,7 +2088,7 @@ def do_setup(): + print(" versionfile_source already in MANIFEST.in") + + # Make VCS-specific changes. For git, this means creating/changing +- # .gitattributes to mark _version.py for export-time keyword ++ # .gitattributes to mark _version.py for export-subst keyword + # substitution. + do_vcs_install(manifest_in, cfg.versionfile_source, ipy) + return 0 +@@ -1765,6 +2130,7 @@ def scan_setup_py(): + errors += 1 + return errors + ++ + if __name__ == "__main__": + cmd = sys.argv[1] + if cmd == "setup": diff --git a/meta-python/recipes-devtools/python/python3-click-spinner_0.1.10.bb b/meta-python/recipes-devtools/python/python3-click-spinner_0.1.10.bb index 418f8a32a7..b3e1328c75 100644 --- a/meta-python/recipes-devtools/python/python3-click-spinner_0.1.10.bb +++ b/meta-python/recipes-devtools/python/python3-click-spinner_0.1.10.bb @@ -3,7 +3,10 @@ HOMEPAGE = "https://github.com/click-contrib/click-spinner" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=8227180126797a0148f94f483f3e1489" +SRC_URI += "file://0001-Update-Versioneer-to-0.22.patch" SRC_URI[md5sum] = "ab68ed404401421819c81cc6c0677a87" SRC_URI[sha256sum] = "87eacf9d7298973a25d7615ef57d4782aebf913a532bba4b28a37e366e975daf" inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-json" diff --git a/meta-python/recipes-devtools/python/python3-click/run-ptest b/meta-python/recipes-devtools/python/python3-click/run-ptest deleted file mode 100644 index b63c4de0d9..0000000000 --- a/meta-python/recipes-devtools/python/python3-click/run-ptest +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' diff --git a/meta-python/recipes-devtools/python/python3-click_8.1.3.bb b/meta-python/recipes-devtools/python/python3-click_8.1.3.bb deleted file mode 100644 index 006742f153..0000000000 --- a/meta-python/recipes-devtools/python/python3-click_8.1.3.bb +++ /dev/null @@ -1,41 +0,0 @@ -SUMMARY = "A simple wrapper around optparse for powerful command line utilities." -DESCRIPTION = "\ -Click is a Python package for creating beautiful command line interfaces \ -in a composable way with as little code as necessary. It's the "Command \ -Line Interface Creation Kit". It's highly configurable but comes with \ -sensible defaults out of the box." -HOMEPAGE = "http://click.pocoo.org/" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=1fa98232fd645608937a0fdc82e999b8" - -SRC_URI[sha256sum] = "7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e" - -inherit pypi setuptools3 ptest - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-terminal \ - ${PYTHON_PN}-unixadmin \ -" - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/tests - cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ - cp -rf ${S}/setup.cfg ${D}${PTEST_PATH}/ - cp -rf ${S}/docs ${D}${PTEST_PATH}/ -} - -UPSTREAM_CHECK_REGEX = "click/(?P<pver>\d+(\.\d+)+)/" - -CLEANBROKEN = "1" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-threading \ - " - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-cloudpickle_3.0.0.bb b/meta-python/recipes-devtools/python/python3-cloudpickle_3.0.0.bb new file mode 100644 index 0000000000..25c379590f --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-cloudpickle_3.0.0.bb @@ -0,0 +1,18 @@ +SUMMARY = "Pickler class to extend the standard pickle.Pickler functionality" +DESCRIPTION = "cloudpickle makes it possible to serialize Python constructs \ +not supported by the default pickle module from the Python standard library.\ +\ +cloudpickle is especially useful for cluster computing where Python code is \ +shipped over the network to execute on remote hosts, possibly close to the \ +data." +HOMEPAGE = "https://github.com/cloudpipe/cloudpickle" + +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://${WORKDIR}/LICENSE.cloudpickle;md5=b4d59aa5e2cc777722aac17841237931" + +inherit pypi python_flit_core + +SRC_URI += "https://raw.githubusercontent.com/cloudpipe/cloudpickle/v${PV}/LICENSE;downloadfilename=LICENSE.cloudpickle;name=license" + +SRC_URI[sha256sum] = "996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882" +SRC_URI[license.sha256sum] = "3029ea34173e9fdc233ad315dc6b100bd1ea71f529b1c1af97664a272fdc55f5" diff --git a/meta-python/recipes-devtools/python/python3-cmake/CMakeLists.txt b/meta-python/recipes-devtools/python/python3-cmake/CMakeLists.txt new file mode 100644 index 0000000000..8ba81970ff --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-cmake/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.6) + +# +# For more details, see docs/building.rst +# + +project(CMakePythonDistributions NONE) + +install(CODE " + message(STATUS \"Install CMake project\") +") diff --git a/meta-python/recipes-devtools/python/python3-cmake/run-cmake-from-path.patch b/meta-python/recipes-devtools/python/python3-cmake/run-cmake-from-path.patch new file mode 100644 index 0000000000..d4d2903d5e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-cmake/run-cmake-from-path.patch @@ -0,0 +1,13 @@ +Upstream-Status: Pending + +--- cmake-3.25.2/src/cmake/__init__.py.old 2023-03-10 09:40:43.582315753 +0100 ++++ cmake-3.25.2/src/cmake/__init__.py 2023-03-10 09:41:38.030874047 +0100 +@@ -36,7 +36,7 @@ + + + def _program(name, args): +- return subprocess.call([os.path.join(CMAKE_BIN_DIR, name)] + args, close_fds=False) ++ return subprocess.call([name] + args, close_fds=False) + + + def cmake(): diff --git a/meta-python/recipes-devtools/python/python3-cmake_3.28.3.bb b/meta-python/recipes-devtools/python/python3-cmake_3.28.3.bb new file mode 100644 index 0000000000..6b31d0b4f5 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-cmake_3.28.3.bb @@ -0,0 +1,37 @@ +SUMMARY = "CMake is an open-source, cross-platform family of tools designed to build, test and package software" +LICENSE = "BSD-3-Clause & Apache-2.0" +LIC_FILES_CHKSUM = " \ + file://LICENSE_BSD_3;md5=9134cb61aebbdd79dd826ccb9ae6afcd \ + file://LICENSE_Apache_20;md5=19cbd64715b51267a47bf3750cc6a8a5 \ +" + +DEPENDS = "ninja-native cmake-native python3-scikit-build-native" + +PYPI_PACKAGE = "cmake" +PYPI_ARCHIVE_NAME_PREFIX = "pypi-" + +inherit pypi python_setuptools_build_meta +SRC_URI[sha256sum] = "a8092815c739da7d6775c26ec30c2645f0fca9527a29e36a682faec7d39cde89" + +SRC_URI += " \ + file://CMakeLists.txt \ + file://run-cmake-from-path.patch \ +" + +addtask do_patchbuild after do_patch before do_configure + +do_patchbuild () { + rm -f ${S}/CMakeLists.txt + cp ${WORKDIR}/CMakeLists.txt ${S}/ +} + +do_install:append () { + rm -rf ${D}${bindir} +} + +RDEPENDS:${PN} = " \ + cmake \ + python3-scikit-build \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-cmd2_2.4.2.bb b/meta-python/recipes-devtools/python/python3-cmd2_2.4.2.bb deleted file mode 100644 index d2434b626f..0000000000 --- a/meta-python/recipes-devtools/python/python3-cmd2_2.4.2.bb +++ /dev/null @@ -1,23 +0,0 @@ -SUMMARY = "Extra features for standard library's cmd module" -HOMEPAGE = "https://github.com/python-cmd2/cmd2" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=209e288518b0668115f58c3929af9ff1" - -DEPENDS += "${PYTHON_PN}-setuptools-scm-native" - -SRC_URI[sha256sum] = "073e555c05853b0f6965f3d03329babdf9e38a5f2cea028e61a64cd7eeb74ad5" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-attrs \ - ${PYTHON_PN}-colorama \ - ${PYTHON_PN}-pyperclip \ - ${PYTHON_PN}-wcwidth \ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-pydoc \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-numbers \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-cmd2_2.4.3.bb b/meta-python/recipes-devtools/python/python3-cmd2_2.4.3.bb new file mode 100644 index 0000000000..3d37e8b3c7 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-cmd2_2.4.3.bb @@ -0,0 +1,23 @@ +SUMMARY = "Extra features for standard library's cmd module" +HOMEPAGE = "https://github.com/python-cmd2/cmd2" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=fad7740aa21780c8b9a214f5b320b4ad" + +DEPENDS += "python3-setuptools-scm-native" + +SRC_URI[sha256sum] = "71873c11f72bd19e2b1db578214716f0d4f7c8fa250093c601265a9a717dee52" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "\ + python3-attrs \ + python3-colorama \ + python3-pyperclip \ + python3-wcwidth \ + python3-compression \ + python3-pydoc \ + python3-json \ + python3-numbers \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-colorama_0.4.5.bb b/meta-python/recipes-devtools/python/python3-colorama_0.4.6.bb index 122ae53991..0f364c424d 100644 --- a/meta-python/recipes-devtools/python/python3-colorama_0.4.5.bb +++ b/meta-python/recipes-devtools/python/python3-colorama_0.4.6.bb @@ -3,8 +3,12 @@ HOMEPAGE = "https://github.com/tartley/colorama" LICENSE = "BSD-2-Clause" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=b4936429a56a652b84c5c01280dcaa26" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta -SRC_URI[sha256sum] = "e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4" +SRC_URI[sha256sum] = "08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44" + +DEPENDS += " \ + python3-hatchling-native \ +" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-colorclass_2.2.2.bb b/meta-python/recipes-devtools/python/python3-colorclass_2.2.2.bb new file mode 100644 index 0000000000..ff72f4c2f6 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-colorclass_2.2.2.bb @@ -0,0 +1,17 @@ +SUMMARY = "Colorful worry-free console applications for Linux, Mac OS X, and Windows." +HOMEPAGE = "https://github.com/matthewdeanmartin/colorclass" +LICENSE = "MIT" +SECTION = "devel/python" +LIC_FILES_CHKSUM = "file://LICENSE;md5=1b2a533055839e54558a727657c1c73e" + +inherit pypi setuptools3 + +SRC_URI[sha256sum] = "6d4fe287766166a98ca7bc6f6312daf04a0481b1eda43e7173484051c0ab4366" + +PYPI_PACKAGE="colorclass" + +RDEPENDS:${PN} += "\ + python3-ctypes \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-coloredlogs_15.0.1.bb b/meta-python/recipes-devtools/python/python3-coloredlogs_15.0.1.bb index d17ab87525..31f75eef62 100644 --- a/meta-python/recipes-devtools/python/python3-coloredlogs_15.0.1.bb +++ b/meta-python/recipes-devtools/python/python3-coloredlogs_15.0.1.bb @@ -13,7 +13,7 @@ do_install:append() { } RDEPENDS:${PN} += "\ - ${PYTHON_PN}-humanfriendly \ + python3-humanfriendly \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-colorlog_6.6.0.bb b/meta-python/recipes-devtools/python/python3-colorlog_6.8.2.bb index 2f8a0e5ca8..df5fdedfc8 100644 --- a/meta-python/recipes-devtools/python/python3-colorlog_6.6.0.bb +++ b/meta-python/recipes-devtools/python/python3-colorlog_6.8.2.bb @@ -7,4 +7,8 @@ inherit pypi setuptools3 PYPI_PACKAGE = "colorlog" -SRC_URI[sha256sum] = "344f73204009e4c83c5b6beb00b3c45dc70fcdae3c80db919e0a4171d006fde8" +SRC_URI[sha256sum] = "3e3e079a41feb5a1b64f978b5ea4f46040a94f11f0e8bbb8261e3dbbeca64d44" + +RDEPENDS:${PN} += "python3-logging" + +BBCLASSEXTEND += "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-colorzero_2.0.bb b/meta-python/recipes-devtools/python/python3-colorzero_2.0.bb index 1a331d13fd..fc1615e670 100644 --- a/meta-python/recipes-devtools/python/python3-colorzero_2.0.bb +++ b/meta-python/recipes-devtools/python/python3-colorzero_2.0.bb @@ -7,7 +7,10 @@ HOMEPAGE = " https://github.com/waveform80/colorzero " LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=ae6c62710c0646f3c60d1ad812ea9bf9" -RDEPENDS:${PN} = "python3-image" +RDEPENDS:${PN} += " \ + python3-image \ + python3-numbers \ +" SRC_URI[sha256sum] = "e7d5a5c26cd0dc37b164ebefc609f388de24f8593b659191e12d85f8f9d5eb58" diff --git a/meta-python/recipes-devtools/python/python3-configargparse_1.5.3.bb b/meta-python/recipes-devtools/python/python3-configargparse_1.7.bb index 7d21375548..1c49d891d2 100644 --- a/meta-python/recipes-devtools/python/python3-configargparse_1.5.3.bb +++ b/meta-python/recipes-devtools/python/python3-configargparse_1.7.bb @@ -3,19 +3,19 @@ HOMEPAGE = "https://github.com/bw2/ConfigArgParse" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=da746463714cc35999ed9a42339f2943" -SRC_URI[sha256sum] = "1b0b3cbf664ab59dada57123c81eff3d9737e0d11d8cf79e3d6eb10823f1739f" +SRC_URI[sha256sum] = "e7067471884de5478c58a511e529f0f9bd1c66bfef1dea90935438d6c23306d1" PYPI_PACKAGE = "ConfigArgParse" inherit pypi setuptools3 PACKAGECONFIG ?= "yaml" -PACKAGECONFIG[yaml] = ",,,${PYTHON_PN}-pyyaml" +PACKAGECONFIG[yaml] = ",,,python3-pyyaml" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-core \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-json \ + python3-core \ + python3-shell \ + python3-json \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-configobj/0001-Switch-from-using-distutils-to-setuptools.patch b/meta-python/recipes-devtools/python/python3-configobj/0001-Switch-from-using-distutils-to-setuptools.patch deleted file mode 100644 index ed6ceca8e1..0000000000 --- a/meta-python/recipes-devtools/python/python3-configobj/0001-Switch-from-using-distutils-to-setuptools.patch +++ /dev/null @@ -1,28 +0,0 @@ -From ad9024e50a9df4a2b8a1a019e07bb133c3df31bf Mon Sep 17 00:00:00 2001 -From: Daniel Watkins <daniel@daniel-watkins.co.uk> -Date: Thu, 28 Aug 2014 18:49:04 +0200 -Subject: [PATCH] Switch from using distutils to setuptools. - -Upstream-Status: Backport - -Signed-off-by: Tim Orling <tim.orling@konsulko.com> ---- - setup.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/setup.py b/setup.py -index c6d57a6..6755ab4 100644 ---- a/setup.py -+++ b/setup.py -@@ -12,7 +12,7 @@ - # http://opensource.org/licenses/BSD-3-Clause - import os - import sys --from distutils.core import setup -+from setuptools import setup - # a simple import wouldn't work if we moved towards a package with __init__ - from _version import __version__ - --- -2.30.2 - diff --git a/meta-python/recipes-devtools/python/python3-configobj_5.0.6.bb b/meta-python/recipes-devtools/python/python3-configobj_5.0.6.bb deleted file mode 100644 index 1125a6389d..0000000000 --- a/meta-python/recipes-devtools/python/python3-configobj_5.0.6.bb +++ /dev/null @@ -1,11 +0,0 @@ -SUMMARY = "Config file reading, writing and validation." -SECTION = "devel/python" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://configobj.py;md5=a7c3968dd866dfd23e91e125b669ab21" - -PYPI_PACKAGE = "configobj" -SRC_URI[sha256sum] = "a2f5650770e1c87fb335af19a9b7eb73fc05ccf22144eb68db7d00cd2bcb0902" - -SRC_URI += "file://0001-Switch-from-using-distutils-to-setuptools.patch" - -inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-configobj_5.0.8.bb b/meta-python/recipes-devtools/python/python3-configobj_5.0.8.bb new file mode 100644 index 0000000000..8dc706fdfd --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-configobj_5.0.8.bb @@ -0,0 +1,14 @@ +SUMMARY = "Config file reading, writing and validation." +SECTION = "devel/python" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3d6f99b84d9a94610c62e48fa2e59e72" + +PYPI_PACKAGE = "configobj" +SRC_URI[sha256sum] = "6f704434a07dc4f4dc7c9a745172c1cad449feb548febd9f7fe362629c627a97" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-pprint \ + python3-six \ +" diff --git a/meta-python/recipes-devtools/python/python3-configshell-fb_1.1.29.bb b/meta-python/recipes-devtools/python/python3-configshell-fb_1.1.30.bb index 2bb196c209..aa14c99e8b 100644 --- a/meta-python/recipes-devtools/python/python3-configshell-fb_1.1.29.bb +++ b/meta-python/recipes-devtools/python/python3-configshell-fb_1.1.30.bb @@ -6,12 +6,13 @@ building simple but nice CLI-based applications. This runs with Python 2 and \ LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://COPYING;md5=1dece7821bf3fd70fe1309eaa37d52a2" -SRC_URI = "git://github.com/open-iscsi/configshell-fb.git;protocol=https;branch=master" -SRCREV = "d74a33b69f688ed9b8b28033835303604639d4eb" +SRC_URI[sha256sum] = "41f6b7eaa7c9ff422acdc910762fd39ef3333a365918463fef8b398d857170fe" -S = "${WORKDIR}/git" +inherit pypi python_poetry_core -inherit setuptools3 -PIP_INSTALL_PACKAGE = "configshell_fb" - -RDEPENDS:${PN} += "python3-modules python3-fcntl python3-six" +RDEPENDS:${PN} += " \ + python3-fcntl \ + python3-modules \ + python3-pyparsing \ + python3-six \ +" diff --git a/meta-python/recipes-devtools/python/python3-constantly_15.1.0.bb b/meta-python/recipes-devtools/python/python3-constantly_15.1.0.bb deleted file mode 100644 index 7f9b0326fa..0000000000 --- a/meta-python/recipes-devtools/python/python3-constantly_15.1.0.bb +++ /dev/null @@ -1,11 +0,0 @@ -DESCRIPTION = "Symbolic constants in Python" -HOMEPAGE = "https://github.com/twisted/constantly" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=e393e4ddd223e3a74982efa784f89fd7" - -SRC_URI[md5sum] = "f0762f083d83039758e53f8cf0086eef" -SRC_URI[sha256sum] = "586372eb92059873e29eba4f9dec8381541b4d3834660707faf8ba59146dfc35" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += "${PYTHON_PN}-json" diff --git a/meta-python/recipes-devtools/python/python3-constantly_23.10.4.bb b/meta-python/recipes-devtools/python/python3-constantly_23.10.4.bb new file mode 100644 index 0000000000..2df501aaa6 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-constantly_23.10.4.bb @@ -0,0 +1,12 @@ +DESCRIPTION = "Symbolic constants in Python" +HOMEPAGE = "https://github.com/twisted/constantly" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=e393e4ddd223e3a74982efa784f89fd7" + +SRC_URI[sha256sum] = "aa92b70a33e2ac0bb33cd745eb61776594dc48764b06c35e0efd050b7f1c7cbd" + +inherit pypi python_poetry_core + +DEPENDS += "python3-versioneer-native" + +RDEPENDS:${PN} += "python3-json" diff --git a/meta-python/recipes-devtools/python/python3-covdefaults/run-ptest b/meta-python/recipes-devtools/python/python3-covdefaults/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-covdefaults/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-covdefaults_2.3.0.bb b/meta-python/recipes-devtools/python/python3-covdefaults_2.3.0.bb new file mode 100644 index 0000000000..7391c3ae2e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-covdefaults_2.3.0.bb @@ -0,0 +1,30 @@ +SUMMARY = "A coverage plugin to provide sensible default settings" +HOMEPAGE = "https://github.com/asottile/covdefaults" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=a3da826da635201a80d2fb40f3034929" + +# Use GitHub SRC_URI, as pypi package does not include tests +SRC_URI += " \ + git://github.com/asottile/covdefaults.git;branch=main;protocol=https \ + file://run-ptest \ +" + +SRCREV = "007f5aff5d1c817883385a5f61f742dd11776dc6" + +S = "${WORKDIR}/git" + +inherit setuptools3 ptest + +RDEPENDS:${PN} += " \ + python3-coverage \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH} + cp -rf ${S}/tests ${D}${PTEST_PATH} +} diff --git a/meta-python/recipes-devtools/python/python3-coverage_6.4.1.bb b/meta-python/recipes-devtools/python/python3-coverage_6.4.1.bb deleted file mode 100644 index d352cdadff..0000000000 --- a/meta-python/recipes-devtools/python/python3-coverage_6.4.1.bb +++ /dev/null @@ -1,16 +0,0 @@ -SUMMARY = "Code coverage measurement for Python" -HOMEPAGE = "https://coverage.readthedocs.io" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=2ee41112a44fe7014dce33e26468ba93" - -SRC_URI[sha256sum] = "4321f075095a096e70aff1d002030ee612b65a205a0a0f5b815280d5dc58100c" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-sqlite3 \ - ${PYTHON_PN}-core \ - ${PYTHON_PN}-pprint \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-xml \ -" diff --git a/meta-python/recipes-devtools/python/python3-coverage_7.4.1.bb b/meta-python/recipes-devtools/python/python3-coverage_7.4.1.bb new file mode 100644 index 0000000000..b3da5d5716 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-coverage_7.4.1.bb @@ -0,0 +1,22 @@ +SUMMARY = "Code coverage measurement for Python" +HOMEPAGE = "https://coverage.readthedocs.io" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=2ee41112a44fe7014dce33e26468ba93" + +SRC_URI[sha256sum] = "1ed4b95480952b1a26d863e546fa5094564aa0065e1e5f0d4d0041f293251d04" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-crypt \ + python3-io \ + python3-json \ + python3-multiprocessing \ + python3-pprint \ + python3-shell \ + python3-sqlite3 \ + python3-tomllib \ + python3-xml \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-cppy_1.2.1.bb b/meta-python/recipes-devtools/python/python3-cppy_1.2.1.bb index 270f74963d..7817401fa4 100644 --- a/meta-python/recipes-devtools/python/python3-cppy_1.2.1.bb +++ b/meta-python/recipes-devtools/python/python3-cppy_1.2.1.bb @@ -5,7 +5,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=0bfb3e39b13587f0028f17baf0e42371" SRC_URI[sha256sum] = "83b43bf17b1085ac15c5debdb42154f138b928234b21447358981f69d0d6fe1b" -RDEPENDS:${PN} += "python3-setuptools python3-distutils" +RDEPENDS:${PN} += "python3-setuptools" inherit pypi python_setuptools_build_meta diff --git a/meta-python/recipes-devtools/python/python3-crc32c_2.3.bb b/meta-python/recipes-devtools/python/python3-crc32c_2.3.bb index 2032568950..da756ea074 100644 --- a/meta-python/recipes-devtools/python/python3-crc32c_2.3.bb +++ b/meta-python/recipes-devtools/python/python3-crc32c_2.3.bb @@ -6,7 +6,7 @@ LIC_FILES_CHKSUM = " \ file://LICENSE;md5=4fbd65380cdd255951079008b364516c \ file://LICENSE.google-crc32c;md5=e9ed01b5e5ac9eae23fc2bb33701220c \ file://LICENSE.slice-by-8;md5=6b3bc7709d6b2db6646ec2467310ff6b \ - file://crc32c_adler.c;startline=9;endline=24;md5=c60e6e55d0e5d95effa6fad27db0711a \ + file://crc32c_adler.c;beginline=9;endline=24;md5=9c8bd2afd2d340fd37c038759cd4eff8 \ " SRC_URI[sha256sum] = "17ce6c596ad0d53df52dcd72defb66984aeabd98fbefea7ba848a6b6bdece36a" diff --git a/meta-python/recipes-devtools/python/python3-crcmod_1.7.bb b/meta-python/recipes-devtools/python/python3-crcmod_1.7.bb index f8f1683601..11d36b53ec 100644 --- a/meta-python/recipes-devtools/python/python3-crcmod_1.7.bb +++ b/meta-python/recipes-devtools/python/python3-crcmod_1.7.bb @@ -9,6 +9,6 @@ SRC_URI[sha256sum] = "dc7051a0db5f2bd48665a990d3ec1cc305a466a77358ca4492826f41f2 inherit pypi setuptools3 -RDEPENDS:${PN} += "${PYTHON_PN}-unittest" +RDEPENDS:${PN} += "python3-unittest" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-croniter_1.3.5.bb b/meta-python/recipes-devtools/python/python3-croniter_1.3.5.bb deleted file mode 100644 index 92962c0f45..0000000000 --- a/meta-python/recipes-devtools/python/python3-croniter_1.3.5.bb +++ /dev/null @@ -1,12 +0,0 @@ -DESCRIPTION = "croniter provides iteration for datetime object with cron like format" -SECTION = "devel/python" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://docs/LICENSE;md5=b8ee59850b882cbf623188489ea748e2" - -PYPI_PACKAGE = "croniter" - -SRC_URI[sha256sum] = "7592fc0e8a00d82af98dfa2768b75983b6fb4c2adc8f6d0d7c931a715b7cefee" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += " python3-dateutil python3-natsort" diff --git a/meta-python/recipes-devtools/python/python3-croniter_2.0.5.bb b/meta-python/recipes-devtools/python/python3-croniter_2.0.5.bb new file mode 100644 index 0000000000..01ee048404 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-croniter_2.0.5.bb @@ -0,0 +1,16 @@ +DESCRIPTION = "croniter provides iteration for datetime object with cron like format" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=b8ee59850b882cbf623188489ea748e2" + +PYPI_PACKAGE = "croniter" + +SRC_URI[sha256sum] = "f1f8ca0af64212fbe99b1bee125ee5a1b53a9c1b433968d8bca8817b79d237f3" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-dateutil \ + python3-natsort \ + python3-pytz \ +" diff --git a/meta-python/recipes-devtools/python/python3-custom-inherit_2.3.1.bb b/meta-python/recipes-devtools/python/python3-custom-inherit_2.4.1.bb index c0e10448ea..e7409f77e6 100644 --- a/meta-python/recipes-devtools/python/python3-custom-inherit_2.3.1.bb +++ b/meta-python/recipes-devtools/python/python3-custom-inherit_2.4.1.bb @@ -5,6 +5,12 @@ LIC_FILES_CHKSUM = "file://LICENSE.md;md5=f910a85a4c3da51edf780f17a7608434" PYPI_PACKAGE = "custom_inherit" -SRC_URI[sha256sum] = "a0d104847b4cc1ae24e00061fc2e11da8766b019bf4c8c753822347366c8c49f" +SRC_URI += "file://0001-versioneer.py-do-not-use-SafeConfigParser.patch" +SRC_URI[sha256sum] = "7052eb337bcce83551815264391cc4efc2bf70b295a3c52aba64f1ab57c3a8a2" inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-json \ + python3-stringold \ +" diff --git a/meta-python/recipes-devtools/python/python3-cvxopt_1.2.7.bb b/meta-python/recipes-devtools/python/python3-cvxopt_1.3.2.bb index 70e9831770..d7d4b22fbd 100644 --- a/meta-python/recipes-devtools/python/python3-cvxopt_1.2.7.bb +++ b/meta-python/recipes-devtools/python/python3-cvxopt_1.3.2.bb @@ -1,11 +1,11 @@ SUMMARY = "Convex optimization package" HOMEPAGE = "http://cvxopt.org" LICENSE = "GPL-3.0-only" -LIC_FILES_CHKSUM = "file://LICENSE;md5=ba1a8a73d8ebea5c47a1173aaf476ddd" +LIC_FILES_CHKSUM = "file://LICENSE;md5=66ec4f8e53d3e733a8c26d5ca3830fba" SRC_URI = "git://github.com/cvxopt/cvxopt;protocol=https;branch=master" -SRCREV = "d5a21cf1da62e4269176384b1ff62edac5579f94" +SRCREV = "3b718ee560b3b97d6255c55f0ed7f64cb4b72082" S = "${WORKDIR}/git" diff --git a/meta-python/recipes-devtools/python/python3-cycler_0.11.0.bb b/meta-python/recipes-devtools/python/python3-cycler_0.12.1.bb index 59492e8bfa..574083b61f 100644 --- a/meta-python/recipes-devtools/python/python3-cycler_0.11.0.bb +++ b/meta-python/recipes-devtools/python/python3-cycler_0.12.1.bb @@ -3,9 +3,9 @@ HOMEPAGE = "http://github.com/matplotlib/cycler" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=7713fe42cd766b15c710e19392bfa811" -SRC_URI[sha256sum] = "9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f" +SRC_URI[sha256sum] = "88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta RDEPENDS:${PN} += "\ python3-core \ diff --git a/meta-python/recipes-devtools/python/python3-cytoolz_0.12.0.bb b/meta-python/recipes-devtools/python/python3-cytoolz_0.12.3.bb index b6977b029a..f9c9704d7f 100644 --- a/meta-python/recipes-devtools/python/python3-cytoolz_0.12.0.bb +++ b/meta-python/recipes-devtools/python/python3-cytoolz_0.12.3.bb @@ -3,11 +3,11 @@ performance utility functions for iterables, functions, and dictionaries." HOMEPAGE = "https://github.com/pytoolz/cytoolz" SECTION = "devel/python" LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=efbcddfa5610ca0c07ecfa274a82b373" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=d422ebce3e9c6447563bd410e9b22f2e" -SRC_URI[sha256sum] = "c105b05f85e03fbcd60244375968e62e44fe798c15a3531c922d531018d22412" +SRC_URI[sha256sum] = "4503dc59f4ced53a54643272c61dc305d1dbbfbd7d6bdf296948de9f34c3a282" inherit pypi setuptools3 -DEPENDS += "${PYTHON_PN}-cython-native" -RDEPENDS:${PN} += "${PYTHON_PN}-toolz" +DEPENDS += "python3-cython-native" +RDEPENDS:${PN} += "python3-toolz" diff --git a/meta-python/recipes-devtools/python/python3-daemon_3.0.1.bb b/meta-python/recipes-devtools/python/python3-daemon_3.0.1.bb new file mode 100644 index 0000000000..715d3bf120 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-daemon_3.0.1.bb @@ -0,0 +1,18 @@ +DESCRIPTION = "Library to implement a well-behaved Unix daemon process" +HOMEPAGE = "https://pagure.io/python-daemon/" +SECTION = "devel/python" + +DEPENDS += "python3-docutils-native" +RDEPENDS:${PN} = "python3-docutils \ + python3-lockfile (>= 0.10) \ + python3-resource \ +" + +LICENSE = "Apache-2.0 & GPL-3.0-only" +LIC_FILES_CHKSUM = "file://README;md5=a3a94c615dc969a70525f1eebbacf235" + +inherit pypi setuptools3 + +SRC_URI[sha256sum] = "6c57452372f7eaff40934a1c03ad1826bf5e793558e87fef49131e6464b4dae5" + +PYPI_PACKAGE = "python-daemon" diff --git a/meta-python/recipes-devtools/python/python3-dateparser_1.1.0.bb b/meta-python/recipes-devtools/python/python3-dateparser_1.2.0.bb index 5b661a0863..a08564b3f5 100644 --- a/meta-python/recipes-devtools/python/python3-dateparser_1.1.0.bb +++ b/meta-python/recipes-devtools/python/python3-dateparser_1.2.0.bb @@ -3,7 +3,7 @@ HOMEPAGE = "https://github.com/scrapinghub/dateparser" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=3d3ed25571191e7aa3f55d0a6efe0051" -SRC_URI[sha256sum] = "faa2b97f51f3b5ff1ba2f17be90de2b733fb6191f89b4058787473e8202f3044" +SRC_URI[sha256sum] = "7975b43a4222283e0ae15be7b4999d08c9a70e2d378ac87385b1ccf2cffbbb30" PYPI_PACKAGE = "dateparser" @@ -12,9 +12,12 @@ inherit pypi setuptools3 CLEANBROKEN = "1" RDEPENDS:${PN} += " \ - ${PYTHON_PN}-dateutil \ - ${PYTHON_PN}-tzlocal \ - ${PYTHON_PN}-ruamel-yaml \ + python3-dateutil \ + python3-logging \ + python3-pytz \ + python3-regex \ + python3-ruamel-yaml \ + python3-tzlocal \ " -# Ommitted ${PYTHON_PN}-convertdate, ${PYTHON_PN}-jdatetime ${PYTHON_PN}-umalqurra +# Ommitted python3-convertdate, python3-jdatetime python3-umalqurra diff --git a/meta-python/recipes-devtools/python/python3-dateutil_2.8.2.bb b/meta-python/recipes-devtools/python/python3-dateutil_2.9.0.bb index e281f0f285..1f7a4a03fd 100644 --- a/meta-python/recipes-devtools/python/python3-dateutil_2.8.2.bb +++ b/meta-python/recipes-devtools/python/python3-dateutil_2.9.0.bb @@ -4,22 +4,21 @@ HOMEPAGE = "https://dateutil.readthedocs.org" LICENSE = "BSD-3-Clause & Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=e3155c7bdc71f66e02678411d2abf996" -SRC_URI[sha256sum] = "0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86" +SRC_URI[sha256sum] = "78e73e19c63f5b20ffa567001531680d939dc042bf7850431877645523c66709" PYPI_PACKAGE = "python-dateutil" -PIP_INSTALL_PACKAGE = "python_dateutil" inherit pypi python_setuptools_build_meta PACKAGES =+ "${PN}-zoneinfo" -FILES:${PN}-zoneinfo = "${libdir}/${PYTHON_DIR}/site-packages/dateutil/zoneinfo" +FILES:${PN}-zoneinfo = "${PYTHON_SITEPACKAGES_DIR}/dateutil/zoneinfo" -DEPENDS += "${PYTHON_PN}-setuptools-scm-native" +DEPENDS += "python3-setuptools-scm-native" RDEPENDS:${PN} = "\ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-stringold \ + python3-datetime \ + python3-numbers \ + python3-six \ + python3-stringold \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-dbus-fast_2.21.1.bb b/meta-python/recipes-devtools/python/python3-dbus-fast_2.21.1.bb new file mode 100644 index 0000000000..9e2566175d --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-dbus-fast_2.21.1.bb @@ -0,0 +1,15 @@ +SUMMARY = "A faster version of dbus-next originally from the great DBus next library." +HOMEPAGE = "https://github.com/bluetooth-devices/dbus-fast" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=729e372b5ea0168438e4fd4a00a04947" + +SRC_URI[sha256sum] = "87b852d2005f1d59399ca51c5f3538f28a4742d739d7abe82b7ae8d01d8a5d02" + +PYPI_PACKAGE = "dbus_fast" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-core (>=3.7) \ + python3-async-timeout \ +" diff --git a/meta-python/recipes-devtools/python/python3-dbus-next_0.2.3.bb b/meta-python/recipes-devtools/python/python3-dbus-next_0.2.3.bb index 3ee11b9d55..9f6aa7ed7f 100644 --- a/meta-python/recipes-devtools/python/python3-dbus-next_0.2.3.bb +++ b/meta-python/recipes-devtools/python/python3-dbus-next_0.2.3.bb @@ -10,3 +10,8 @@ PYPI_PACKAGE = "dbus_next" inherit pypi setuptools3 BBCLASSEXTEND = "native nativesdk" + +RDEPENDS:${PN} += " \ + python3-asyncio \ + python3-xml \ +" diff --git a/meta-python/recipes-devtools/python/python3-dbussy_1.3.bb b/meta-python/recipes-devtools/python/python3-dbussy_1.3.bb index b1ba953922..59da4545aa 100644 --- a/meta-python/recipes-devtools/python/python3-dbussy_1.3.bb +++ b/meta-python/recipes-devtools/python/python3-dbussy_1.3.bb @@ -12,8 +12,6 @@ S = "${WORKDIR}/git" inherit setuptools3 -PIP_INSTALL_PACKAGE = "DBussy" - RDEPENDS:${PN} += "\ python3-asyncio \ python3-core \ diff --git a/meta-python/recipes-devtools/python/python3-decorator_5.1.1.bb b/meta-python/recipes-devtools/python/python3-decorator_5.1.1.bb index c9c6f9a62e..f330376243 100644 --- a/meta-python/recipes-devtools/python/python3-decorator_5.1.1.bb +++ b/meta-python/recipes-devtools/python/python3-decorator_5.1.1.bb @@ -14,5 +14,7 @@ SRC_URI[sha256sum] = "637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253a inherit pypi setuptools3 RDEPENDS:${PN} += "\ - ${PYTHON_PN}-stringold \ + python3-stringold \ " + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-decouple_3.6.bb b/meta-python/recipes-devtools/python/python3-decouple_3.8.bb index 772ee7faf9..20d614a423 100644 --- a/meta-python/recipes-devtools/python/python3-decouple_3.6.bb +++ b/meta-python/recipes-devtools/python/python3-decouple_3.8.bb @@ -4,7 +4,7 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=a46375b26bb7d7603565d829a2a51782" -SRC_URI[sha256sum] = "2838cdf77a5cf127d7e8b339ce14c25bceb3af3e674e039d4901ba16359968c7" +SRC_URI[sha256sum] = "ba6e2657d4f376ecc46f77a3a615e058d93ba5e465c01bbe57289bfb7cce680f" PYPI_PACKAGE = "python-decouple" diff --git a/meta-python/recipes-devtools/python/python3-defusedxml_0.7.1.bb b/meta-python/recipes-devtools/python/python3-defusedxml_0.7.1.bb index 3396c7262d..8ec6680d8f 100644 --- a/meta-python/recipes-devtools/python/python3-defusedxml_0.7.1.bb +++ b/meta-python/recipes-devtools/python/python3-defusedxml_0.7.1.bb @@ -10,3 +10,5 @@ SRC_URI[sha256sum] = "1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51 inherit pypi setuptools3 BBCLASSEXTEND = "native" + +RDEPENDS:${PN} += "python3-xml" diff --git a/meta-python/recipes-devtools/python/python3-deprecated_1.2.13.bb b/meta-python/recipes-devtools/python/python3-deprecated_1.2.14.bb index 6ea47f4292..49d5f01c8f 100644 --- a/meta-python/recipes-devtools/python/python3-deprecated_1.2.13.bb +++ b/meta-python/recipes-devtools/python/python3-deprecated_1.2.14.bb @@ -4,10 +4,10 @@ LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=44288e26f4896bdab14072d4fa35ff01" PYPI_PACKAGE = "Deprecated" -SRC_URI[sha256sum] = "43ac5335da90c31c24ba028af536a91d41d53f9e6901ddb021bcc572ce44e38d" +SRC_URI[sha256sum] = "e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3" inherit pypi setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-wrapt \ + python3-wrapt \ " diff --git a/meta-python/recipes-devtools/python/python3-dill_0.3.5.1.bb b/meta-python/recipes-devtools/python/python3-dill_0.3.5.1.bb deleted file mode 100644 index d9110e3fd4..0000000000 --- a/meta-python/recipes-devtools/python/python3-dill_0.3.5.1.bb +++ /dev/null @@ -1,15 +0,0 @@ -SUMMARY = "Serialize all of python" -HOMEPAGE = "https://pypi.org/project/dill/" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=61f24e44fc855bde43ed5a1524a37bc4" - -SRC_URI[sha256sum] = "d75e41f3eff1eee599d738e76ba8f4ad98ea229db8b085318aa2b3333a208c86" - -inherit pypi setuptools3 - -PYPI_PACKAGE_EXT = "tar.gz" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-multiprocessing \ - ${PYTHON_PN}-logging \ -" diff --git a/meta-python/recipes-devtools/python/python3-dill_0.3.8.bb b/meta-python/recipes-devtools/python/python3-dill_0.3.8.bb new file mode 100644 index 0000000000..04e7f4bfb8 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-dill_0.3.8.bb @@ -0,0 +1,19 @@ +SUMMARY = "Serialize all of python" +HOMEPAGE = "https://pypi.org/project/dill/" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=a41509b57cc475ed93f8cb1dbbfaeec1" + +SRC_URI[sha256sum] = "3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca" + +inherit pypi setuptools3 + +PYPI_PACKAGE_EXT = "tar.gz" + +RDEPENDS:${PN} += "\ + python3-multiprocessing \ + python3-logging \ + python3-profile \ + python3-core \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-dirty-equals_0.7.1.bb b/meta-python/recipes-devtools/python/python3-dirty-equals_0.7.1.bb new file mode 100644 index 0000000000..ea9303b17e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-dirty-equals_0.7.1.bb @@ -0,0 +1,21 @@ +SUMMARY = "Doing dirty (but extremely useful) things with equals." +DESCRIPTION = "dirty-equals is a python library that (mis)uses the \ +__eq__ method to make python code (generally unit tests) more \ +declarative and therefore easier to read and write.\ +\ +dirty-equals can be used in whatever context you like, but it comes \ +into its own when writing unit tests for applications where you're \ +commonly checking the response to API calls and the contents of a database." +HOMEPAGE = "https://github.com/samuelcolvin/dirty-equals" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ab599c188b4a314d2856b3a55030c75c" + +SRC_URI[sha256sum] = "a580513f3285e93656a770a04e428f8bfc513848877bf278282dbfbb907fdbb4" + +S = "${WORKDIR}/dirty_equals-${PV}" + +inherit pypi python_hatchling + +PYPI_PACKAGE = "dirty_equals" + +RDEPENDS:${PN} += "python3-pytz" diff --git a/meta-python/recipes-devtools/python/python3-diskcache_5.4.0.bb b/meta-python/recipes-devtools/python/python3-diskcache_5.6.3.bb index 84d42e5722..09b06553df 100644 --- a/meta-python/recipes-devtools/python/python3-diskcache_5.4.0.bb +++ b/meta-python/recipes-devtools/python/python3-diskcache_5.6.3.bb @@ -3,20 +3,20 @@ HOMEPAGE = "http://www.grantjenks.com/docs/diskcache/" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=c60ef82f0f40155453f6d5f2c94b6e8e" -SRC_URI[sha256sum] = "8879eb8c9b4a2509a5e633d2008634fb2b0b35c2b36192d89655dbde02419644" +SRC_URI[sha256sum] = "2c3a3fa2743d8535d832ec61c2054a1641f41775aa7c556758a109941e33e4fc" PYPI_PACKAGE = "diskcache" inherit pypi setuptools3 RDEPENDS:${PN} = "\ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-pickle \ - ${PYTHON_PN}-sqlite3 \ - ${PYTHON_PN}-core \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-threading \ + python3-json \ + python3-pickle \ + python3-sqlite3 \ + python3-core \ + python3-io \ + python3-compression \ + python3-threading \ " CLEANBROKEN = "1" diff --git a/meta-python/recipes-devtools/python/python3-distlib_0.3.8.bb b/meta-python/recipes-devtools/python/python3-distlib_0.3.8.bb new file mode 100644 index 0000000000..41a66479cc --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-distlib_0.3.8.bb @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: MIT +# Copyright (C) 2023 iris-GmbH infrared & intelligent sensors + +SUMMARY = "A library which implements low-level functions that relate to packaging and distribution of Python software." +HOMEPAGE = "https://github.com/pypa/distlib" +LICENSE = "PSF-2.0" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=f6a11430d5cd6e2cd3832ee94f22ddfc" + +SRC_URI[sha256sum] = "1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64" + +BBCLASSEXTEND = "native nativesdk" +inherit pypi python_setuptools_build_meta diff --git a/meta-python/recipes-devtools/python/python3-distro_1.7.0.bb b/meta-python/recipes-devtools/python/python3-distro_1.9.0.bb index f069234d1b..08a9526783 100644 --- a/meta-python/recipes-devtools/python/python3-distro_1.7.0.bb +++ b/meta-python/recipes-devtools/python/python3-distro_1.9.0.bb @@ -5,15 +5,15 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=d2794c0df5b907fdace235a619d80314" PYPI_PACKAGE = "distro" -SRC_URI[sha256sum] = "151aeccf60c216402932b52e40ee477a939f8d58898927378a02abbe852c1c39" +SRC_URI[sha256sum] = "2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta RDEPENDS:${PN} = "\ - ${PYTHON_PN}-core \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-shell \ + python3-core \ + python3-json \ + python3-logging \ + python3-shell \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-django_2.2.28.bb b/meta-python/recipes-devtools/python/python3-django_2.2.28.bb deleted file mode 100644 index 9ef988176e..0000000000 --- a/meta-python/recipes-devtools/python/python3-django_2.2.28.bb +++ /dev/null @@ -1,12 +0,0 @@ -require python-django.inc - -# Pin to 2.2.x LTS releases ONLY for this recipe -UPSTREAM_CHECK_REGEX = "/${PYPI_PACKAGE}/(?P<pver>(2\.2\.\d*)+)/" - -inherit setuptools3 - -SRC_URI[sha256sum] = "0200b657afbf1bc08003845ddda053c7641b9b24951e52acd51f6abda33a7413" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-sqlparse \ -" diff --git a/meta-python/recipes-devtools/python/python3-django_3.2.12.bb b/meta-python/recipes-devtools/python/python3-django_3.2.12.bb deleted file mode 100644 index adbc498bdf..0000000000 --- a/meta-python/recipes-devtools/python/python3-django_3.2.12.bb +++ /dev/null @@ -1,13 +0,0 @@ -require python-django.inc -inherit setuptools3 - -SRC_URI[sha256sum] = "9772e6935703e59e993960832d66a614cf0233a1c5123bc6224ecc6ad69e41e2" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-sqlparse \ -" - -# Set DEFAULT_PREFERENCE so that the LTS version of django is built by -# default. To build the 3.x branch, -# PREFERRED_VERSION_python3-django = "3.2.2" can be added to local.conf -DEFAULT_PREFERENCE = "-1" diff --git a/meta-python/recipes-devtools/python/python3-django_4.0.2.bb b/meta-python/recipes-devtools/python/python3-django_4.2.11.bb index 690b9809dc..0642b7e7c3 100644 --- a/meta-python/recipes-devtools/python/python3-django_4.0.2.bb +++ b/meta-python/recipes-devtools/python/python3-django_4.2.11.bb @@ -1,13 +1,14 @@ require python-django.inc inherit setuptools3 -SRC_URI[sha256sum] = "110fb58fb12eca59e072ad59fc42d771cd642dd7a2f2416582aa9da7a8ef954a" +SRC_URI[sha256sum] = "6e6ff3db2d8dd0c986b4eec8554c8e4f919b5c1ff62a5b4390c17aff2ed6e5c4" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-sqlparse \ + python3-sqlparse \ + python3-asgiref \ " # Set DEFAULT_PREFERENCE so that the LTS version of django is built by # default. To build the 4.x branch, -# PREFERRED_VERSION_python3-django = "4.0.2" can be added to local.conf +# PREFERRED_VERSION_python3-django = "4.2.11" can be added to local.conf DEFAULT_PREFERENCE = "-1" diff --git a/meta-python/recipes-devtools/python/python3-django_5.0.4.bb b/meta-python/recipes-devtools/python/python3-django_5.0.4.bb new file mode 100644 index 0000000000..3139ed4682 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-django_5.0.4.bb @@ -0,0 +1,9 @@ +require python-django.inc +inherit setuptools3 + +SRC_URI[sha256sum] = "4bd01a8c830bb77a8a3b0e7d8b25b887e536ad17a81ba2dce5476135c73312bd" + +RDEPENDS:${PN} += "\ + python3-sqlparse \ + python3-asgiref \ +" diff --git a/meta-python/recipes-devtools/python/python3-djangorestframework_3.13.1.bb b/meta-python/recipes-devtools/python/python3-djangorestframework_3.15.1.bb index be85827ef3..9515aa2296 100644 --- a/meta-python/recipes-devtools/python/python3-djangorestframework_3.13.1.bb +++ b/meta-python/recipes-devtools/python/python3-djangorestframework_3.15.1.bb @@ -5,12 +5,12 @@ HOMEPAGE = "https://pypi.python.org/pypi/djangorestframework" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE.md;md5=7879a5a716147a784f7e524c9cf103c1" -SRC_URI[sha256sum] = "0c33407ce23acc68eca2a6e46424b008c9c02eceb8cf18581921d0092bc1f2ee" +SRC_URI[sha256sum] = "f88fad74183dfc7144b2756d0d2ac716ea5b4c7c9840995ac3bfd8ec034333c1" PYPI_PACKAGE = "djangorestframework" inherit pypi setuptools3 RDEPENDS:${PN} += "\ - ${PYTHON_PN}-django \ + python3-django \ " diff --git a/meta-python/recipes-devtools/python/python3-dnspython/run-ptest b/meta-python/recipes-devtools/python/python3-dnspython/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-dnspython/run-ptest +++ b/meta-python/recipes-devtools/python/python3-dnspython/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-dnspython_2.2.1.bb b/meta-python/recipes-devtools/python/python3-dnspython_2.6.1.bb index 67158fbdad..13e31afe79 100644 --- a/meta-python/recipes-devtools/python/python3-dnspython_2.2.1.bb +++ b/meta-python/recipes-devtools/python/python3-dnspython_2.6.1.bb @@ -3,16 +3,17 @@ HOMEPAGE = "http://www.dnspython.org/" LICENSE = "ISC" LIC_FILES_CHKSUM = "file://LICENSE;md5=5af50906b5929837f667dfe31052bd34" -SRC_URI[sha256sum] = "0f7569a4a6ff151958b64304071d370daa3243d15941a7beedf0c9fe5105603e" +SRC_URI[sha256sum] = "e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc" -inherit pypi python_poetry_core ptest +inherit pypi python_hatchling ptest SRC_URI += " \ file://run-ptest \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { @@ -21,15 +22,15 @@ do_install_ptest() { } DEPENDS += "\ - ${PYTHON_PN}-wheel-native \ - ${PYTHON_PN}-setuptools-scm-native \ + python3-wheel-native \ + python3-setuptools-scm-native \ " RDEPENDS:${PN} += " \ - ${PYTHON_PN}-crypt \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-math \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-threading \ + python3-crypt \ + python3-io \ + python3-math \ + python3-netclient \ + python3-numbers \ + python3-threading \ " diff --git a/meta-python/recipes-devtools/python/python3-dominate/run-ptest b/meta-python/recipes-devtools/python/python3-dominate/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-dominate/run-ptest +++ b/meta-python/recipes-devtools/python/python3-dominate/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-dominate_2.7.0.bb b/meta-python/recipes-devtools/python/python3-dominate_2.9.1.bb index bee89ed754..054d5236e5 100644 --- a/meta-python/recipes-devtools/python/python3-dominate_2.7.0.bb +++ b/meta-python/recipes-devtools/python/python3-dominate_2.9.1.bb @@ -2,16 +2,17 @@ SUMMARY = "Dominate is a Python library for creating and manipulating HTML docum LICENSE = "LGPL-3.0-only" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=b52f2d57d10c4f7ee67a7eb9615d5d24" -SRC_URI[sha256sum] = "520101360892ebf9d0553f67d37e359ff92403d8a1e33814030503088a05da49" +SRC_URI[sha256sum] = "558284687d9b8aae1904e3d6051ad132dd4a8c0cf551b37ea4e7e42a31d19dc4" -inherit pypi setuptools3 ptest +inherit pypi ptest python_setuptools_build_meta SRC_URI += " \ file://run-ptest \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { @@ -20,6 +21,6 @@ do_install_ptest() { } RDEPENDS:${PN} += "\ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-threading \ + python3-numbers \ + python3-threading \ " diff --git a/meta-python/recipes-devtools/python/python3-dynamic-dispatch_1.0.3.bb b/meta-python/recipes-devtools/python/python3-dynamic-dispatch_1.0.3.bb index 9e4a13cff4..eeb013d4fe 100644 --- a/meta-python/recipes-devtools/python/python3-dynamic-dispatch_1.0.3.bb +++ b/meta-python/recipes-devtools/python/python3-dynamic-dispatch_1.0.3.bb @@ -5,11 +5,13 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=ea70b07c354e36056bd35e17c9c3face" inherit pypi setuptools3 -SRC_URI[md5sum] = "6bd3cc24427de753eed0656e89d5302c" SRC_URI[sha256sum] = "fbc676aaedc8ec542056c21e5e206b8b62b8d11c3f3c5cfb32b273936da89604" PYPI_PACKAGE = "dynamic_dispatch" +UPSTREAM_CHECK_URI = "https://pypi.org/project/dynamic-dispatch/" +UPSTREAM_CHECK_REGEX = "/dynamic-dispatch/(?P<pver>(\d+[\.\-_]*)+)" + DEPENDS += "python3-setuptools-scm-native" RDEPENDS:${PN} += "\ python3-typeguard \ diff --git a/meta-python/recipes-devtools/python/python3-ecdsa/run-ptest b/meta-python/recipes-devtools/python/python3-ecdsa/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-ecdsa/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-ecdsa_0.18.0.bb b/meta-python/recipes-devtools/python/python3-ecdsa_0.18.0.bb deleted file mode 100644 index 6a399a96fe..0000000000 --- a/meta-python/recipes-devtools/python/python3-ecdsa_0.18.0.bb +++ /dev/null @@ -1,15 +0,0 @@ -SUMMARY = "ECDSA cryptographic signature library (pure python)" -SECTION = "devel/python" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=66ffc5e30f76cbb5358fe54b645e5a1d" - -DEPENDS += "python3-pip python3-pbr" - -PYPI_PACKAGE = "ecdsa" -SRC_URI[sha256sum] = "190348041559e21b22a1d65cee485282ca11a6f81d503fddb84d5017e9ed1e49" - -inherit pypi setuptools3 python3native - -RDEPENDS:${PN} += "python3-six python3-gmpy2 python3-pbr" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-ecdsa_0.19.0.bb b/meta-python/recipes-devtools/python/python3-ecdsa_0.19.0.bb new file mode 100644 index 0000000000..8e967f9259 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-ecdsa_0.19.0.bb @@ -0,0 +1,36 @@ +SUMMARY = "ECDSA cryptographic signature library (pure python)" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=66ffc5e30f76cbb5358fe54b645e5a1d" + +PYPI_PACKAGE = "ecdsa" +SRC_URI[sha256sum] = "60eaad1199659900dd0af521ed462b793bbdf867432b3948e87416ae4caf6bf8" + +inherit pypi setuptools3 python3native ptest + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-hypothesis \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/src/ecdsa/* ${D}${PTEST_PATH}/tests/ +} + +RDEPENDS:${PN} += " \ + python3-gmpy2 \ + python3-json \ + python3-six \ +" + +do_install:append() { + rm ${D}${PYTHON_SITEPACKAGES_DIR}/ecdsa/test_*.py +} + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-editor_1.0.4.bb b/meta-python/recipes-devtools/python/python3-editor_1.0.4.bb index dffc36169e..335461c435 100644 --- a/meta-python/recipes-devtools/python/python3-editor_1.0.4.bb +++ b/meta-python/recipes-devtools/python/python3-editor_1.0.4.bb @@ -10,3 +10,8 @@ PYPI_PACKAGE = "python-editor" inherit pypi setuptools3 BBCLASSEXTEND = "native nativesdk" + +RDEPENDS:${PN} += " \ + python3-io \ + python3-setuptools \ +" diff --git a/meta-python/recipes-devtools/python/python3-elementpath_3.0.1.bb b/meta-python/recipes-devtools/python/python3-elementpath_4.4.0.bb index 13468ebfff..e095cb8a32 100644 --- a/meta-python/recipes-devtools/python/python3-elementpath_3.0.1.bb +++ b/meta-python/recipes-devtools/python/python3-elementpath_4.4.0.bb @@ -3,13 +3,17 @@ HOMEPAGE = "https://github.com/sissaschool/elementpath" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=5dbb7fb7d72da3921202dd7b995d3ecf" -SRC_URI[sha256sum] = "a75eed5aad3dad92ba577b1f3a268d8c3c98ceeda91cb8abae4269e920e7c8f6" +SRC_URI[sha256sum] = "dfc4b8ca3d87966dcb0df40b5b6d04a98f053683271930fad9e7fa000924dfb2" PYPI_PACKAGE = "elementpath" inherit pypi setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-xml \ + python3-xml \ + python3-core \ + python3-numbers \ + python3-datetime \ + python3-stringold \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-email-validator_1.2.1.bb b/meta-python/recipes-devtools/python/python3-email-validator_2.1.0.bb index a5cb09fd9b..7daf548cb1 100644 --- a/meta-python/recipes-devtools/python/python3-email-validator_1.2.1.bb +++ b/meta-python/recipes-devtools/python/python3-email-validator_2.1.0.bb @@ -3,7 +3,7 @@ SECTION = "devel/python" LICENSE = "CC0-1.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=65d3616852dbf7b1a6d4b53b00626032" -SRC_URI[sha256sum] = "6757aea012d40516357c0ac2b1a4c31219ab2f899d26831334c5d069e8b6c3d8" +SRC_URI[sha256sum] = "5f511cca8856bb03251d6292ba59e7f98978aae13fa5823ddd8bf885c56a6260" PYPI_PACKAGE = "email_validator" diff --git a/meta-python/recipes-devtools/python/python3-engineio_4.3.4.bb b/meta-python/recipes-devtools/python/python3-engineio_4.9.0.bb index d89a54dc3d..790d1b44cf 100644 --- a/meta-python/recipes-devtools/python/python3-engineio_4.3.4.bb +++ b/meta-python/recipes-devtools/python/python3-engineio_4.9.0.bb @@ -17,4 +17,4 @@ RDEPENDS:${PN} += " \ python3-asyncio \ " -SRC_URI[sha256sum] = "d8d8b072799c36cadcdcc2b40d2a560ce09797ab3d2d596b2ad519a5e4df19ae" +SRC_URI[sha256sum] = "e87459c15638e567711fd156e6f9c4a402668871bed79523f0ecfec744729ec7" diff --git a/meta-python/recipes-devtools/python/python3-et-xmlfile_1.1.0.bb b/meta-python/recipes-devtools/python/python3-et-xmlfile_1.1.0.bb index 7c66342ec4..50ae7fa5e4 100644 --- a/meta-python/recipes-devtools/python/python3-et-xmlfile_1.1.0.bb +++ b/meta-python/recipes-devtools/python/python3-et-xmlfile_1.1.0.bb @@ -10,7 +10,13 @@ LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=8227180126797a0148 SRC_URI[sha256sum] = "8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c" -RDEPENDS:${PN} += "${PYTHON_PN}-compression ${PYTHON_PN}-io ${PYTHON_PN}-pprint ${PYTHON_PN}-shell" +RDEPENDS:${PN} += " \ + python3-compression \ + python3-io \ + python3-pprint \ + python3-shell \ + python3-xml \ +" inherit setuptools3 pypi diff --git a/meta-python/recipes-devtools/python/python3-eth-abi_3.0.1.bb b/meta-python/recipes-devtools/python/python3-eth-abi_5.1.0.bb index 3d8a67ba56..e8bfb437fb 100644 --- a/meta-python/recipes-devtools/python/python3-eth-abi_3.0.1.bb +++ b/meta-python/recipes-devtools/python/python3-eth-abi_5.1.0.bb @@ -2,9 +2,9 @@ SUMMARY = "Python utilities for working with Ethereum ABI definitions, especiall HOMEPAGE = "https://github.com/ethereum/eth-abi" SECTION = "devel/python" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=bf9691ead96f1163622689e47ce3f366" +LIC_FILES_CHKSUM = "file://LICENSE;md5=731f4de9c79bfeba6d8d55f83d0d2423" -SRC_URI[sha256sum] = "c3872e3ac1e9ef3f8c6599aaca4ee536d536eefca63a6892ab937f0560edb656" +SRC_URI[sha256sum] = "33ddd756206e90f7ddff1330cc8cac4aa411a824fe779314a0a52abea2c8fc14" PYPI_PACKAGE = "eth_abi" diff --git a/meta-python/recipes-devtools/python/python3-eth-account_0.6.1.bb b/meta-python/recipes-devtools/python/python3-eth-account_0.12.1.bb index 9c87d3f5d1..867aaaf025 100644 --- a/meta-python/recipes-devtools/python/python3-eth-account_0.6.1.bb +++ b/meta-python/recipes-devtools/python/python3-eth-account_0.12.1.bb @@ -2,17 +2,19 @@ SUMMARY = "Assign Ethereum transactions and messages with local private keys." HOMEPAGE = "https://github.com/ethereum/eth-account" SECTION = "devel/python" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=287820ad3553117aa2f92bf84c219324" +LIC_FILES_CHKSUM = "file://LICENSE;md5=16ffc86adf4293d4cfb204e77d62cfe6" -SRC_URI[sha256sum] = "54b0b7d661e73f4cd12d508c9baa5c9a6e8c194aa7bafc39277cd673683ae50e" +SRC_URI[sha256sum] = "0374c5886f35780e1f23e50ce6b0482f3387646eceda544e97d69f17f6c216ee" inherit pypi setuptools3 RDEPENDS:${PN} += " \ python3-bitarray \ - python3-cytoolz \ python3-eth-abi \ python3-eth-keyfile \ + python3-eth-keys \ python3-eth-rlp \ + python3-eth-utils \ python3-hexbytes \ + python3-rlp \ " diff --git a/meta-python/recipes-devtools/python/python3-eth-hash_0.5.0.bb b/meta-python/recipes-devtools/python/python3-eth-hash_0.6.0.bb index 73072706e0..8464dbe403 100644 --- a/meta-python/recipes-devtools/python/python3-eth-hash_0.5.0.bb +++ b/meta-python/recipes-devtools/python/python3-eth-hash_0.6.0.bb @@ -2,13 +2,13 @@ SUMMARY = "The Ethereum hashing function, keccak256, sometimes (erroneously) cal HOMEPAGE = "https://github.com/ethereum/eth-hash" SECTION = "devel/python" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=287820ad3553117aa2f92bf84c219324" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3d7bdfe69b1ffbde073ca6e96f5c53f7" -SRC_URI[sha256sum] = "ea0fd4e264c97c8aa739ae1cea7199db2e1f3bdf387cc9b81ef03c660f871335" +SRC_URI[sha256sum] = "ae72889e60db6acbb3872c288cfa02ed157f4c27630fcd7f9c8442302c31e478" inherit pypi setuptools3 RDEPENDS:${PN} = "\ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-pycryptodome \ + python3-logging \ + python3-pycryptodome \ " diff --git a/meta-python/recipes-devtools/python/python3-eth-keyfile/0001-setup-don-t-use-setuptools-markdown.patch b/meta-python/recipes-devtools/python/python3-eth-keyfile/0001-setup-don-t-use-setuptools-markdown.patch deleted file mode 100644 index 7b81203807..0000000000 --- a/meta-python/recipes-devtools/python/python3-eth-keyfile/0001-setup-don-t-use-setuptools-markdown.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 4348c72877e049804c7cdb7eec7a6bcd7ac2ea1d Mon Sep 17 00:00:00 2001 -From: Bartosz Golaszewski <brgl@bgdev.pl> -Date: Wed, 11 May 2022 13:21:30 +0200 -Subject: [PATCH] setup: don't use setuptools-markdown - -This project is deprecated and irrelevant for the functionality of -eth-keyfile. We don't support it in meta-python so just drop it from -the dependencies. - -Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl> ---- - setup.py | 2 -- - 1 file changed, 2 deletions(-) - -diff --git a/setup.py b/setup.py -index cbb7f4c..7702aa4 100644 ---- a/setup.py -+++ b/setup.py -@@ -51,14 +51,12 @@ setup( - "A library for handling the encrypted keyfiles used to store ethereum " - "private keys." - ), -- long_description_markdown_filename='README.md', - author='Piper Merriam', - author_email='pipermerriam@gmail.com', - url='https://github.com/ethereum/eth-keyfile', - include_package_data=True, - install_requires=install_requires, - extras_require=deps, -- setup_requires=['setuptools-markdown'], - py_modules=['eth_keyfile'], - license="MIT", - zip_safe=False, --- -2.34.1 - diff --git a/meta-python/recipes-devtools/python/python3-eth-keyfile_0.6.0.bb b/meta-python/recipes-devtools/python/python3-eth-keyfile_0.7.0.bb index 9477632e2f..2afc288bce 100644 --- a/meta-python/recipes-devtools/python/python3-eth-keyfile_0.6.0.bb +++ b/meta-python/recipes-devtools/python/python3-eth-keyfile_0.7.0.bb @@ -2,10 +2,9 @@ SUMMARY = "A library for handling the encrypted keyfiles used to store ethereum HOMEPAGE = "https://github.com/ethereum/eth-keyfile" SECTION = "devel/python" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=2beaef1b1764f4d6b46084c885b4bcad" +LIC_FILES_CHKSUM = "file://LICENSE;md5=6749008d847c14b9718949c2e24d5c0a" -SRC_URI[sha256sum] = "d30597cdecb8ccd3b56bb275cd86fcdc7a279f86eafa92ddc49f66512f0bff67" -SRC_URI += "file://0001-setup-don-t-use-setuptools-markdown.patch" +SRC_URI[sha256sum] = "6bdb8110c3a50439deb68a04c93c9d5ddd5402353bfae1bf4cfca1d6dff14fcf" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-eth-keys_0.4.0.bb b/meta-python/recipes-devtools/python/python3-eth-keys_0.5.0.bb index b0b1aad76d..aabfff1b1d 100644 --- a/meta-python/recipes-devtools/python/python3-eth-keys_0.4.0.bb +++ b/meta-python/recipes-devtools/python/python3-eth-keys_0.5.0.bb @@ -2,9 +2,9 @@ SUMMARY = "A common API for Ethereum key operations with pluggable backends." HOMEPAGE = "https://github.com/ethereum/eth-keys" SECTION = "devel/python" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=2beaef1b1764f4d6b46084c885b4bcad" +LIC_FILES_CHKSUM = "file://LICENSE;md5=6749008d847c14b9718949c2e24d5c0a" -SRC_URI[sha256sum] = "7d18887483bc9b8a3fdd8e32ddcb30044b9f08fcb24a380d93b6eee3a5bb3216" +SRC_URI[sha256sum] = "a0abccb83f3d84322591a2c047a1e3aa52ea86b185fa3e82ce311d120ca2791e" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-eth-rlp_0.3.0.bb b/meta-python/recipes-devtools/python/python3-eth-rlp_2.1.0.bb index d19a657557..4bdc0c8873 100644 --- a/meta-python/recipes-devtools/python/python3-eth-rlp_0.3.0.bb +++ b/meta-python/recipes-devtools/python/python3-eth-rlp_2.1.0.bb @@ -2,9 +2,9 @@ SUMMARY = "RLP definitions for common Ethereum objects in Python" HOMEPAGE = "https://github.com/ethereum/eth-rlp" SECTION = "devel/python" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=287820ad3553117aa2f92bf84c219324" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3d7bdfe69b1ffbde073ca6e96f5c53f7" -SRC_URI[sha256sum] = "f3263b548df718855d9a8dbd754473f383c0efc82914b0b849572ce3e06e71a6" +SRC_URI[sha256sum] = "d5b408a8cd20ed496e8e66d0559560d29bc21cee482f893936a1f05d0dddc4a0" inherit pypi setuptools3 @@ -12,4 +12,5 @@ RDEPENDS:${PN} = " \ python3-eth-utils \ python3-hexbytes \ python3-rlp \ + python3-typing-extensions \ " diff --git a/meta-python/recipes-devtools/python/python3-eth-typing_3.1.0.bb b/meta-python/recipes-devtools/python/python3-eth-typing_4.1.0.bb index 0e274c25d8..4491de979c 100644 --- a/meta-python/recipes-devtools/python/python3-eth-typing_3.1.0.bb +++ b/meta-python/recipes-devtools/python/python3-eth-typing_4.1.0.bb @@ -2,8 +2,8 @@ SUMMARY = "Common type annotations for ethereum python packages." HOMEPAGE = "https://github.com/ethereum/eth-typing" SECTION = "devel/python" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=bf9691ead96f1163622689e47ce3f366" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3d7bdfe69b1ffbde073ca6e96f5c53f7" -SRC_URI[sha256sum] = "92698268be83c75f65a028d47421f7c0aed459be76dd7ce916af166dca8bc53e" +SRC_URI[sha256sum] = "ed52b0c6b049240fd810bc87c8857c7ea39370f060f70b9ca3876285269f2938" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-eth-utils/0001-setup-don-t-use-setuptools-markdown.patch b/meta-python/recipes-devtools/python/python3-eth-utils/0001-setup-don-t-use-setuptools-markdown.patch deleted file mode 100644 index 3c3c5270a3..0000000000 --- a/meta-python/recipes-devtools/python/python3-eth-utils/0001-setup-don-t-use-setuptools-markdown.patch +++ /dev/null @@ -1,37 +0,0 @@ -From bc86d603e632ce61de4ae7a5d4bcef080cbdb160 Mon Sep 17 00:00:00 2001 -From: Bartosz Golaszewski <brgl@bgdev.pl> -Date: Wed, 11 May 2022 13:45:06 +0200 -Subject: [PATCH] setup: don't use setuptools-markdown - -This project is deprecated and irrelevant for the functionality of -eth-utils. We don't support it in meta-python so just drop it from -the dependencies. - -Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl> ---- - setup.py | 2 -- - 1 file changed, 2 deletions(-) - -diff --git a/setup.py b/setup.py -index 5717d5b..cb62132 100644 ---- a/setup.py -+++ b/setup.py -@@ -37,7 +37,6 @@ setup( - # *IMPORTANT*: Don't manually change the version here. Use the 'bumpversion' utility. - version='1.1.2', - description="""Common utility functions for ethereum codebases.""", -- long_description_markdown_filename='README.md', - author='Piper Merriam', - author_email='pipermerriam@gmail.com', - url='https://github.com/ethereum/eth_utils', -@@ -48,7 +47,6 @@ setup( - "toolz>0.8.2,<1;implementation_name=='pypy'", - "cytoolz>=0.8.2,<1.0.0;implementation_name=='cpython'", - ], -- setup_requires=['setuptools-markdown'], - extras_require=extras_require, - py_modules=['eth_utils'], - license="MIT", --- -2.34.1 - diff --git a/meta-python/recipes-devtools/python/python3-eth-utils_2.0.0.bb b/meta-python/recipes-devtools/python/python3-eth-utils_3.0.0.bb index ff7caf5bf2..faca03865b 100644 --- a/meta-python/recipes-devtools/python/python3-eth-utils_2.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-eth-utils_3.0.0.bb @@ -2,9 +2,9 @@ SUMMARY = "Common utility functions for codebases which interact with ethereum." HOMEPAGE = "https://github.com/ethereum/eth-utils" SECTION = "devel/python" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=287820ad3553117aa2f92bf84c219324" +LIC_FILES_CHKSUM = "file://LICENSE;md5=6749008d847c14b9718949c2e24d5c0a" -SRC_URI[sha256sum] = "32f50edb14c5be0c4f0e8c2e6117286ccc5dfda21d170f358add554a048398e3" +SRC_URI[sha256sum] = "8721869568448349bceae63c277b75758d11e0dc190e7ef31e161b89619458f1" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-evdev_1.6.0.bb b/meta-python/recipes-devtools/python/python3-evdev_1.6.1.bb index 659a86dae3..be6f9611e7 100644 --- a/meta-python/recipes-devtools/python/python3-evdev_1.6.0.bb +++ b/meta-python/recipes-devtools/python/python3-evdev_1.6.1.bb @@ -1,9 +1,9 @@ SUMMARY = "Python evdev lib" HOMEPAGE = "https://github.com/gvalkov/python-evdev" LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=18debddbb3f52c661a129724a883a8e2" +LIC_FILES_CHKSUM = "file://LICENSE;md5=0ff275b442f45fc06287544cf713016f" -SRC_URI[sha256sum] = "ecfa01b5c84f7e8c6ced3367ac95288f43cd84efbfd7dd7d0cdbfc0d18c87a6a" +SRC_URI[sha256sum] = "299db8628cc73b237fc1cc57d3c2948faa0756e2a58b6194b5bf81dc2081f1e3" inherit pypi setuptools3 @@ -14,9 +14,9 @@ do_compile:prepend() { SETUPTOOLS_BUILD_ARGS = "build_ecodes --evdev-headers ${STAGING_DIR_TARGET}/usr/include/linux/input.h:${STAGING_DIR_TARGET}/usr/include/linux/input-event-codes.h" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-ctypes \ - ${PYTHON_PN}-fcntl \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-stringold \ + python3-ctypes \ + python3-fcntl \ + python3-io \ + python3-shell \ + python3-stringold \ " diff --git a/meta-python/recipes-devtools/python/python3-eventlet_0.33.1.bb b/meta-python/recipes-devtools/python/python3-eventlet_0.36.1.bb index afaaf4a978..f70099ab94 100644 --- a/meta-python/recipes-devtools/python/python3-eventlet_0.33.1.bb +++ b/meta-python/recipes-devtools/python/python3-eventlet_0.36.1.bb @@ -4,13 +4,12 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=56472ad6de4caf50e05332a34b66e778" -SRC_URI[sha256sum] = "afbe17f06a58491e9aebd7a4a03e70b0b63fd4cf76d8307bae07f280479b1515" +SRC_URI[sha256sum] = "d227fe76a63d9e6a6cef53beb8ad0b2dc40a5e7737c801f4b474cfae1db07bc5" inherit pypi setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-dnspython \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-distutils \ - ${PYTHON_PN}-greenlet \ + python3-dnspython \ + python3-six \ + python3-greenlet \ " diff --git a/meta-python/recipes-devtools/python/python3-execnet/run-ptest b/meta-python/recipes-devtools/python/python3-execnet/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-execnet/run-ptest +++ b/meta-python/recipes-devtools/python/python3-execnet/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-execnet_1.9.0.bb b/meta-python/recipes-devtools/python/python3-execnet_2.1.1.bb index ea17e84143..94c1a228e3 100644 --- a/meta-python/recipes-devtools/python/python3-execnet_1.9.0.bb +++ b/meta-python/recipes-devtools/python/python3-execnet_2.1.1.bb @@ -8,14 +8,14 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=772fcdaca14b378878d05c7d857e6c3e" DEPENDS += "\ python3-pip-native \ - python3-setuptools-scm-native \ + python3-hatch-vcs-native \ " SRC_URI += "file://run-ptest \ " -SRC_URI[sha256sum] = "8f694f3ba9cc92cab508b152dcfe322153975c29bda272e2fd7f3f00f36e47c5" +SRC_URI[sha256sum] = "5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3" -inherit ptest pypi setuptools3 +inherit ptest pypi python_hatchling do_install_ptest() { install -d ${D}${PTEST_PATH}/tests @@ -24,6 +24,7 @@ do_install_ptest() { RDEPENDS:${PN}-ptest += "\ python3-pytest \ + python3-unittest-automake-output \ " RDEPENDS:${PN} += "python3-core python3-crypt python3-ctypes python3-fcntl python3-io python3-shell python3-threading" diff --git a/meta-python/recipes-devtools/python/python3-executing_2.0.1.bb b/meta-python/recipes-devtools/python/python3-executing_2.0.1.bb new file mode 100644 index 0000000000..3ee1e66f97 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-executing_2.0.1.bb @@ -0,0 +1,9 @@ +SUMMARY = "Get the currently executing AST node of a frame, and other information" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=a3d6c15f7859ae235a78f2758e5a48cf" + +DEPENDS = "python3-setuptools-scm-native" + +inherit pypi python_setuptools_build_meta + +SRC_URI[sha256sum] = "35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147" diff --git a/meta-python/recipes-devtools/python/python3-expandvars_0.12.0.bb b/meta-python/recipes-devtools/python/python3-expandvars_0.12.0.bb new file mode 100644 index 0000000000..6183c310ed --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-expandvars_0.12.0.bb @@ -0,0 +1,10 @@ +SUMMARY = "Expand system variables Unix style" +HOMEPAGE = "https://github.com/sayanarijit/expandvars" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=8b2e744064bd184728ac09dbfb52aaf4" + +SRC_URI[sha256sum] = "7d1adfa55728cf4b5d812ece3d087703faea953e0c0a1a78415de9df5024d844" + +inherit pypi python_hatchling python_setuptools_build_meta + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-fasteners_0.17.3.bb b/meta-python/recipes-devtools/python/python3-fasteners_0.19.bb index 51691b7593..22e58c5668 100644 --- a/meta-python/recipes-devtools/python/python3-fasteners_0.17.3.bb +++ b/meta-python/recipes-devtools/python/python3-fasteners_0.19.bb @@ -3,11 +3,11 @@ HOMEPAGE = "https://github.com/harlowja/fasteners" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=4476c4be31402271e101d9a4a3430d52" -SRC_URI[sha256sum] = "a9a42a208573d4074c77d041447336cf4e3c1389a256fd3e113ef59cf29b7980" +SRC_URI[sha256sum] = "b4f37c3ac52d8a445af3a66bce57b33b5e90b97c696b7b984f530cf8f0ded09c" inherit pypi python_setuptools_build_meta RDEPENDS:${PN} += "\ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-fcntl \ + python3-logging \ + python3-fcntl \ " diff --git a/meta-python/recipes-devtools/python/python3-fastjsonschema/run-ptest b/meta-python/recipes-devtools/python/python3-fastjsonschema/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-fastjsonschema/run-ptest +++ b/meta-python/recipes-devtools/python/python3-fastjsonschema/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-fastjsonschema_2.16.1.bb b/meta-python/recipes-devtools/python/python3-fastjsonschema_2.18.0.bb index bb6c1ee813..b2e969c5c1 100644 --- a/meta-python/recipes-devtools/python/python3-fastjsonschema_2.16.1.bb +++ b/meta-python/recipes-devtools/python/python3-fastjsonschema_2.18.0.bb @@ -6,7 +6,7 @@ HOMEPAGE = "https://github.com/seznam/python-fastjsonschema" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=18950e8362b69c0c617b42b8bd8e7532" -SRCREV = "98399bb4029b2d7020d8abd9770661a5b2c4f9f8" +SRCREV = "756540088687cda351390f687b92e602feaa7dc6" PYPI_SRC_URI = "git://github.com/horejsek/python-fastjsonschema;protocol=https;branch=master" SRC_URI += "file://run-ptest" @@ -27,6 +27,8 @@ RDEPENDS:${PN}-ptest += "\ python3-pytest \ python3-pytest-benchmark \ python3-pytest-cache \ + python3-statistics \ + python3-unittest-automake-output \ " RDEPENDS:${PN} += "\ python3-core \ diff --git a/meta-python/recipes-devtools/python/python3-fastnumbers_3.2.1.bb b/meta-python/recipes-devtools/python/python3-fastnumbers_3.2.1.bb deleted file mode 100644 index 0db33052ff..0000000000 --- a/meta-python/recipes-devtools/python/python3-fastnumbers_3.2.1.bb +++ /dev/null @@ -1,10 +0,0 @@ -SUMMARY = "Super-fast and clean conversions to numbers." -SECTION = "devel/python" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=6a96e5ad780a0eea866ecccec4463517" - -PYPI_PACKAGE = "fastnumbers" - -SRC_URI[sha256sum] = "44f92b42e7e9f2ed77ba5cb7d664f05c17e43d4586718ed6cd3b3fffa0e67f33" - -inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-fastnumbers_5.1.0.bb b/meta-python/recipes-devtools/python/python3-fastnumbers_5.1.0.bb new file mode 100644 index 0000000000..01aa8b3b44 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-fastnumbers_5.1.0.bb @@ -0,0 +1,10 @@ +SUMMARY = "Super-fast and clean conversions to numbers." +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=d32431d1b650010945da4e078011c8fa" + +PYPI_PACKAGE = "fastnumbers" + +SRC_URI[sha256sum] = "e092d33f8b95c3171a2fb34e579efe0c54b0290dd7f96ffaa2762437601d90a7" + +inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-file-magic_0.4.1.bb b/meta-python/recipes-devtools/python/python3-file-magic_0.4.1.bb new file mode 100644 index 0000000000..5289ad3745 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-file-magic_0.4.1.bb @@ -0,0 +1,21 @@ +SUMMARY = "Python front end for libmagic" +DESCRIPTION = "This library is a Python ctypes interface to libmagic." +HOMEPAGE = "https://darwinsys.com/file/" +LICENSE = "BSD-2-Clause" +SECTION = "devel/python" +LIC_FILES_CHKSUM = "file://LICENSE;md5=0e949c0b3fb4fd86232f00c6ee0bdef3" + +SRC_URI[sha256sum] = "a91d1483117f7ed48cd0238ad9be36b04824d57e9c38ea7523113989e81b9c53" + +PYPI_PACKAGE="file-magic" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + file \ + python3-core \ + python3-ctypes \ + python3-threading \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-filelock_3.13.4.bb b/meta-python/recipes-devtools/python/python3-filelock_3.13.4.bb new file mode 100644 index 0000000000..4d6d19551a --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-filelock_3.13.4.bb @@ -0,0 +1,16 @@ +# SPDX-License-Identifier: MIT +# Copyright (C) 2023 iris-GmbH infrared & intelligent sensors + +SUMMARY = "A single module, which implements a platform independent file lock in Python, which provides a simple way of inter-process communication" +HOMEPAGE = "https://py-filelock.readthedocs.io/" +LICENSE = "Unlicense" +LIC_FILES_CHKSUM = "file://LICENSE;md5=911690f51af322440237a253d695d19f" + +SRC_URI[sha256sum] = "d13f466618bfde72bd2c18255e269f72542c6e70e7bac83a0232d6b1cc5c8cf4" + +BBCLASSEXTEND = "native nativesdk" +inherit pypi python_hatchling + +DEPENDS += "\ + python3-hatch-vcs-native \ +" diff --git a/meta-python/recipes-devtools/python/python3-flask-babel_2.0.0.bb b/meta-python/recipes-devtools/python/python3-flask-babel_2.0.0.bb deleted file mode 100644 index 657c190ec5..0000000000 --- a/meta-python/recipes-devtools/python/python3-flask-babel_2.0.0.bb +++ /dev/null @@ -1,16 +0,0 @@ -DESCRIPTION = "i18n and l10n support for Flask based on babel and pytz" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=51917f3e8e858f5ae295a7d0e2eb3cc9" - -SRC_URI[md5sum] = "50d5e92d96ef58787bf85b5a1b0a5567" -SRC_URI[sha256sum] = "f9faf45cdb2e1a32ea2ec14403587d4295108f35017a7821a2b1acb8cfd9257d" - -PYPI_PACKAGE = "Flask-Babel" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-speaklater \ - ${PYTHON_PN}-babel \ - ${PYTHON_PN}-flask \ - " diff --git a/meta-python/recipes-devtools/python/python3-flask-babel_4.0.0.bb b/meta-python/recipes-devtools/python/python3-flask-babel_4.0.0.bb new file mode 100644 index 0000000000..b445ec0e1c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-flask-babel_4.0.0.bb @@ -0,0 +1,15 @@ +DESCRIPTION = "i18n and l10n support for Flask based on babel and pytz" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=51917f3e8e858f5ae295a7d0e2eb3cc9" + +SRC_URI[sha256sum] = "dbeab4027a3f4a87678a11686496e98e1492eb793cbdd77ab50f4e9a2602a593" + +PYPI_PACKAGE = "flask_babel" + +inherit pypi python_poetry_core + +RDEPENDS:${PN} += "\ + python3-speaklater \ + python3-babel \ + python3-flask \ + " diff --git a/meta-python/recipes-devtools/python/python3-flask-cors_4.0.0.bb b/meta-python/recipes-devtools/python/python3-flask-cors_4.0.0.bb new file mode 100644 index 0000000000..1d0d86b4e7 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-flask-cors_4.0.0.bb @@ -0,0 +1,16 @@ +HOMEPAGE = "https://pypi.python.org/pypi/Flask-Cors/" +SUMMARY = "A Flask extension adding a decorator for CORS support" +DESCRIPTION = "\ + A Flask extension for handling Cross Origin Resource Sharing (CORS), making cross-origin AJAX possible \ + " +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=118fecaa576ab51c1520f95e98db61ce" + +PYPI_PACKAGE = "Flask-Cors" + +SRC_URI[sha256sum] = "f268522fcb2f73e2ecdde1ef45e2fd5c71cc48fe03cffb4b441c6d1b40684eb0" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-flask" diff --git a/meta-python/recipes-devtools/python/python3-flask-httpauth_4.8.0.bb b/meta-python/recipes-devtools/python/python3-flask-httpauth_4.8.0.bb new file mode 100644 index 0000000000..51b907e6db --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-flask-httpauth_4.8.0.bb @@ -0,0 +1,14 @@ +SUMMARY = "Simple extension that provides Basic and Digest HTTP authentication for Flask routes." +HOMEPAGE = "https://github.com/miguelgrinberg/flask-httpauth" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3b69377f79f3f48c661701236d5a6a85" + +inherit pypi python_setuptools_build_meta + +PYPI_PACKAGE = "Flask-HTTPAuth" + +SRC_URI[sha256sum] = "66568a05bc73942c65f1e2201ae746295816dc009edd84b482c44c758d75097a" + +RDEPENDS:${PN} += "\ + python3-flask \ + " diff --git a/meta-python/recipes-devtools/python/python3-flask-jsonpify_1.5.0.bb b/meta-python/recipes-devtools/python/python3-flask-jsonpify_1.5.0.bb index 68eb2cefe7..76c6fb7731 100644 --- a/meta-python/recipes-devtools/python/python3-flask-jsonpify_1.5.0.bb +++ b/meta-python/recipes-devtools/python/python3-flask-jsonpify_1.5.0.bb @@ -11,4 +11,4 @@ SRC_URI[sha256sum] = "8ac4c732aa5b11d9f6c2de58065d3b669f139518ca8f529bce943817e2 inherit pypi setuptools3 -RDEPENDS:${PN} += "${PYTHON_PN}-flask" +RDEPENDS:${PN} += "python3-flask" diff --git a/meta-python/recipes-devtools/python/python3-flask-jwt-extended_4.6.0.bb b/meta-python/recipes-devtools/python/python3-flask-jwt-extended_4.6.0.bb new file mode 100644 index 0000000000..cc07c92f47 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-flask-jwt-extended_4.6.0.bb @@ -0,0 +1,16 @@ +SUMMARY = "Extended JWT integration with Flask" +HOMEPAGE = "https://github.com/vimalloc/flask-jwt-extended" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=9166295d7c482b9440bbb2b5c0fa43ac" + +inherit pypi setuptools3 + +PYPI_PACKAGE = "Flask-JWT-Extended" + +SRC_URI[sha256sum] = "9215d05a9413d3855764bcd67035e75819d23af2fafb6b55197eb5a3313fdfb2" + +RDEPENDS:${PN} += "\ + python3-werkzeug \ + python3-flask \ + python3-pyjwt \ + " diff --git a/meta-python/recipes-devtools/python/python3-flask-jwt_0.3.2.bb b/meta-python/recipes-devtools/python/python3-flask-jwt_0.3.2.bb index f2eb34d0f7..35bcbc00ae 100644 --- a/meta-python/recipes-devtools/python/python3-flask-jwt_0.3.2.bb +++ b/meta-python/recipes-devtools/python/python3-flask-jwt_0.3.2.bb @@ -11,4 +11,4 @@ SRC_URI[sha256sum] = "49c0672fbde0f1cd3374bd834918d28956e3c521c7e00089cdc5380d32 inherit pypi setuptools3 -RDEPENDS:${PN} += "${PYTHON_PN}-pyjwt ${PYTHON_PN}-flask" +RDEPENDS:${PN} += "python3-pyjwt python3-flask" diff --git a/meta-python/recipes-devtools/python/python3-flask-login_0.6.2.bb b/meta-python/recipes-devtools/python/python3-flask-login_0.6.3.bb index 97d7bce359..d990d4e80b 100644 --- a/meta-python/recipes-devtools/python/python3-flask-login_0.6.2.bb +++ b/meta-python/recipes-devtools/python/python3-flask-login_0.6.3.bb @@ -6,10 +6,10 @@ HOMEPAGE = " https://github.com/maxcountryman/flask-login" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=8aa87a1cd9fa41d969ad32cfdac2c596" -SRC_URI[sha256sum] = "c0a7baa9fdc448cdd3dd6f0939df72eec5177b2f7abe6cb82fc934d29caac9c3" +SRC_URI[sha256sum] = "5e23d14a607ef12806c699590b89d0f0e0d67baeec599d75947bf9c147330333" PYPI_PACKAGE = "Flask-Login" inherit pypi setuptools3 -RDEPENDS:${PN}:class-target = "${PYTHON_PN}-flask" +RDEPENDS:${PN}:class-target = "python3-flask" diff --git a/meta-python/recipes-devtools/python/python3-flask-mail_0.9.1.bb b/meta-python/recipes-devtools/python/python3-flask-mail_0.9.1.bb index e568f7fac2..1aca3a1619 100644 --- a/meta-python/recipes-devtools/python/python3-flask-mail_0.9.1.bb +++ b/meta-python/recipes-devtools/python/python3-flask-mail_0.9.1.bb @@ -11,4 +11,7 @@ PYPI_PACKAGE = "Flask-Mail" inherit pypi setuptools3 -RDEPENDS:${PN} = "${PYTHON_PN}-flask" +RDEPENDS:${PN} = " \ + python3-blinker \ + python3-flask \ +" diff --git a/meta-python/recipes-devtools/python/python3-flask-marshmallow_1.2.1.bb b/meta-python/recipes-devtools/python/python3-flask-marshmallow_1.2.1.bb new file mode 100644 index 0000000000..8408ebd7b0 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-flask-marshmallow_1.2.1.bb @@ -0,0 +1,15 @@ +SUMMARY = "Flask + marshmallow for beautiful APIs" +HOMEPAGE = "https://github.com/marshmallow-code/flask-marshmallow" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=27586b20700d7544c06933afe56f7df4" + +inherit pypi python_setuptools_build_meta + +PYPI_PACKAGE = "flask_marshmallow" + +SRC_URI[sha256sum] = "00ee96399ed664963afff3b5d6ee518640b0f91dbc2aace2b5abcf32f40ef23a" + +RDEPENDS:${PN} += "\ + python3-flask \ + python3-marshmallow \ + " diff --git a/meta-python/recipes-devtools/python/python3-flask-migrate_3.1.0.bb b/meta-python/recipes-devtools/python/python3-flask-migrate_4.0.7.bb index 8153156458..bfd854ac05 100644 --- a/meta-python/recipes-devtools/python/python3-flask-migrate_3.1.0.bb +++ b/meta-python/recipes-devtools/python/python3-flask-migrate_4.0.7.bb @@ -2,14 +2,14 @@ DESCRIPTION = "SQLAlchemy database migrations for Flask applications using Alemb LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=3b69377f79f3f48c661701236d5a6a85" -SRC_URI[sha256sum] = "57d6060839e3a7f150eaab6fe4e726d9e3e7cffe2150fb223d73f92421c6d1d9" +SRC_URI[sha256sum] = "dff7dd25113c210b069af280ea713b883f3840c1e3455274745d7355778c8622" PYPI_PACKAGE = "Flask-Migrate" inherit pypi python_setuptools_build_meta RDEPENDS:${PN} += "\ - ${PYTHON_PN}-flask-sqlalchemy \ - ${PYTHON_PN}-alembic \ - ${PYTHON_PN}-flask \ + python3-flask-sqlalchemy \ + python3-alembic \ + python3-flask \ " diff --git a/meta-python/recipes-devtools/python/python3-flask-nav_0.6.bb b/meta-python/recipes-devtools/python/python3-flask-nav_0.6.bb index d7edba25c1..3855909fbc 100644 --- a/meta-python/recipes-devtools/python/python3-flask-nav_0.6.bb +++ b/meta-python/recipes-devtools/python/python3-flask-nav_0.6.bb @@ -10,6 +10,6 @@ PYPI_PACKAGE = "flask-nav" inherit pypi setuptools3 RDEPENDS:${PN} += "\ - ${PYTHON_PN}-blinker \ - ${PYTHON_PN}-flask \ + python3-blinker \ + python3-flask \ " diff --git a/meta-python/recipes-devtools/python/python3-flask-pymongo_2.3.0.bb b/meta-python/recipes-devtools/python/python3-flask-pymongo_2.3.0.bb index a995a2ea39..1cd4a4b699 100644 --- a/meta-python/recipes-devtools/python/python3-flask-pymongo_2.3.0.bb +++ b/meta-python/recipes-devtools/python/python3-flask-pymongo_2.3.0.bb @@ -12,6 +12,6 @@ PYPI_PACKAGE = "Flask-PyMongo" inherit pypi setuptools3 -DEPENDS = "${PYTHON_PN}-vcversioner ${PYTHON_PN}-vcversioner-native" +DEPENDS = "python3-vcversioner python3-vcversioner-native" -RDEPENDS:${PN} = "${PYTHON_PN}-pymongo ${PYTHON_PN}-flask" +RDEPENDS:${PN} = "python3-pymongo python3-flask" diff --git a/meta-python/recipes-devtools/python/python3-flask-restful_0.3.9.bb b/meta-python/recipes-devtools/python/python3-flask-restful_0.3.10.bb index 294e3b0928..8ea455c633 100644 --- a/meta-python/recipes-devtools/python/python3-flask-restful_0.3.9.bb +++ b/meta-python/recipes-devtools/python/python3-flask-restful_0.3.10.bb @@ -6,10 +6,10 @@ HOMEPAGE = "https://github.com/flask-restful/flask-restful" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=685bb55ed99a366bb431995f5eef2783" -SRC_URI[sha256sum] = "ccec650b835d48192138c85329ae03735e6ced58e9b2d9c2146d6c84c06fa53e" +SRC_URI[sha256sum] = "fe4af2ef0027df8f9b4f797aba20c5566801b6ade995ac63b588abf1a59cec37" inherit pypi setuptools3 PYPI_PACKAGE = "Flask-RESTful" -RDEPENDS:${PN} = "${PYTHON_PN}-flask" +RDEPENDS:${PN} = "python3-flask" diff --git a/meta-python/recipes-devtools/python/python3-flask-restx_1.3.0.bb b/meta-python/recipes-devtools/python/python3-flask-restx_1.3.0.bb new file mode 100644 index 0000000000..9c2a1e9a8b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-flask-restx_1.3.0.bb @@ -0,0 +1,13 @@ +DESCRIPTION = "Fully featured framework for fast, easy and documented API development with Flask" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=c96dd911c6d9e32868b6bc667a38a3e2" + +SRC_URI[sha256sum] = "4f3d3fa7b6191fcc715b18c201a12cd875176f92ba4acc61626ccfd571ee1728" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-aniso8601 \ + python3-jsonschema \ + python3-pytz \ +" diff --git a/meta-python/recipes-devtools/python/python3-flask-script_2.0.6.bb b/meta-python/recipes-devtools/python/python3-flask-script_2.0.6.bb deleted file mode 100644 index 9f885191be..0000000000 --- a/meta-python/recipes-devtools/python/python3-flask-script_2.0.6.bb +++ /dev/null @@ -1,2 +0,0 @@ -inherit pypi setuptools3 -require python-flask-script.inc diff --git a/meta-python/recipes-devtools/python/python3-flask-socketio_5.2.0.bb b/meta-python/recipes-devtools/python/python3-flask-socketio_5.3.6.bb index 9deae8b41d..6b76e03f8d 100644 --- a/meta-python/recipes-devtools/python/python3-flask-socketio_5.2.0.bb +++ b/meta-python/recipes-devtools/python/python3-flask-socketio_5.3.6.bb @@ -9,9 +9,9 @@ inherit pypi python_setuptools_build_meta PYPI_PACKAGE = "Flask-SocketIO" -SRC_URI[sha256sum] = "19c3d0cea49c53505fa457fedc133b32cb6eeaaa30d28cdab9d6ca8f16045427" +SRC_URI[sha256sum] = "bb8f9f9123ef47632f5ce57a33514b0c0023ec3696b2384457f0fcaa5b70501c" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-flask \ - ${PYTHON_PN}-socketio \ + python3-flask \ + python3-socketio \ " diff --git a/meta-python/recipes-devtools/python/python3-flask-sqlalchemy_2.5.1.bb b/meta-python/recipes-devtools/python/python3-flask-sqlalchemy_2.5.1.bb deleted file mode 100644 index 3aa6303da7..0000000000 --- a/meta-python/recipes-devtools/python/python3-flask-sqlalchemy_2.5.1.bb +++ /dev/null @@ -1,11 +0,0 @@ -DESCRIPTION = "Adds SQLAlchemy support to your Flask application." -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=ffeffa59c90c9c4a033c7574f8f3fb75" - -SRC_URI[sha256sum] = "2bda44b43e7cacb15d4e05ff3cc1f8bc97936cc464623424102bfc2c35e95912" - -PYPI_PACKAGE = "Flask-SQLAlchemy" - -inherit pypi setuptools3 - -RDEPENDS:${PN} = "${PYTHON_PN}-sqlalchemy ${PYTHON_PN}-flask" diff --git a/meta-python/recipes-devtools/python/python3-flask-sqlalchemy_3.1.1.bb b/meta-python/recipes-devtools/python/python3-flask-sqlalchemy_3.1.1.bb new file mode 100644 index 0000000000..f5fe1cc446 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-flask-sqlalchemy_3.1.1.bb @@ -0,0 +1,13 @@ +DESCRIPTION = "Adds SQLAlchemy support to your Flask application." +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=ffeffa59c90c9c4a033c7574f8f3fb75" + +SRC_URI[sha256sum] = "e4b68bb881802dda1a7d878b2fc84c06d1ee57fb40b874d3dc97dabfa36b8312" + +PYPI_PACKAGE = "flask_sqlalchemy" +UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/Flask-SQLAlchemy" +UPSTREAM_CHECK_REGEX = "/Flask-SQLAlchemy/(?P<pver>(\d+[\.\-_]*)+)" + +inherit pypi python_setuptools_build_meta + +RDEPENDS:${PN} = "python3-sqlalchemy python3-flask" diff --git a/meta-python/recipes-devtools/python/python3-flask-uploads_0.2.1.bb b/meta-python/recipes-devtools/python/python3-flask-uploads_0.2.1.bb index 388e257a8b..9ac321dec7 100644 --- a/meta-python/recipes-devtools/python/python3-flask-uploads_0.2.1.bb +++ b/meta-python/recipes-devtools/python/python3-flask-uploads_0.2.1.bb @@ -10,5 +10,5 @@ PYPI_PACKAGE = "Flask-Uploads" inherit pypi setuptools3 RDEPENDS:${PN} += "\ - ${PYTHON_PN}-flask \ + python3-flask \ " diff --git a/meta-python/recipes-devtools/python/python3-flask-user_0.6.19.bb b/meta-python/recipes-devtools/python/python3-flask-user_0.6.19.bb index fbacf2e996..ac449361a4 100644 --- a/meta-python/recipes-devtools/python/python3-flask-user_0.6.19.bb +++ b/meta-python/recipes-devtools/python/python3-flask-user_0.6.19.bb @@ -13,7 +13,12 @@ PYPI_PACKAGE = "Flask-User" inherit pypi setuptools3 -RDEPENDS:${PN} = "${PYTHON_PN}-flask \ - ${PYTHON_PN}-flask-login \ - ${PYTHON_PN}-flask-mail \ - ${PYTHON_PN}-babel" +RDEPENDS:${PN} = " \ + python3-babel \ + python3-blinker \ + python3-flask \ + python3-flask-login \ + python3-flask-mail \ + python3-flask-wtf \ + python3-passlib \ +" diff --git a/meta-python/recipes-devtools/python/python3-flask-wtf_1.0.1.bb b/meta-python/recipes-devtools/python/python3-flask-wtf_1.0.1.bb deleted file mode 100644 index 678588265d..0000000000 --- a/meta-python/recipes-devtools/python/python3-flask-wtf_1.0.1.bb +++ /dev/null @@ -1,16 +0,0 @@ -DESCRIPTION = "Simple integration of Flask and WTForms." -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=d98d089889e14b227732d45dac3aacc4" - -SRC_URI[sha256sum] = "34fe5c6fee0f69b50e30f81a3b7ea16aa1492a771fe9ad0974d164610c09a6c9" - -PYPI_PACKAGE = "Flask-WTF" - -inherit pypi setuptools3 - -RDEPENDS:${PN} = "\ - ${PYTHON_PN}-flask \ - ${PYTHON_PN}-itsdangerous \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-wtforms \ -" diff --git a/meta-python/recipes-devtools/python/python3-flask-wtf_1.2.1.bb b/meta-python/recipes-devtools/python/python3-flask-wtf_1.2.1.bb new file mode 100644 index 0000000000..509be463f8 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-flask-wtf_1.2.1.bb @@ -0,0 +1,18 @@ +DESCRIPTION = "Simple integration of Flask and WTForms." +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=d98d089889e14b227732d45dac3aacc4" + +SRC_URI[sha256sum] = "8bb269eb9bb46b87e7c8233d7e7debdf1f8b74bf90cc1789988c29b37a97b695" + +PYPI_PACKAGE = "flask_wtf" +UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/Flask-WTF" +UPSTREAM_CHECK_REGEX = "/Flask-WTF/(?P<pver>(\d+[\.\-_]*)+)" + +inherit pypi python_hatchling + +RDEPENDS:${PN} = "\ + python3-flask \ + python3-itsdangerous \ + python3-json \ + python3-wtforms \ +" diff --git a/meta-python/recipes-devtools/python/python3-flask_2.2.2.bb b/meta-python/recipes-devtools/python/python3-flask_3.0.2.bb index cceab72ede..300ca99ddc 100644 --- a/meta-python/recipes-devtools/python/python3-flask_2.2.2.bb +++ b/meta-python/recipes-devtools/python/python3-flask_3.0.2.bb @@ -6,18 +6,20 @@ HOMEPAGE = "https://github.com/mitsuhiko/flask/" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=ffeffa59c90c9c4a033c7574f8f3fb75" -SRC_URI[sha256sum] = "642c450d19c4ad482f96729bd2a8f6d32554aa1e231f4f6b4e7e5264b16cca2b" +SRC_URI[sha256sum] = "822c03f4b799204250a7ee84b1eddc40665395333973dfb9deebfe425fefcb7d" -PYPI_PACKAGE = "Flask" +UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/Flask" +UPSTREAM_CHECK_REGEX = "/Flask/(?P<pver>(\d+[\.\-_]*)+)" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta CLEANBROKEN = "1" RDEPENDS:${PN} = " \ - ${PYTHON_PN}-werkzeug \ - ${PYTHON_PN}-jinja2 \ - ${PYTHON_PN}-itsdangerous \ - ${PYTHON_PN}-click \ - ${PYTHON_PN}-profile \ + python3-blinker \ + python3-click \ + python3-itsdangerous \ + python3-jinja2 \ + python3-profile \ + python3-werkzeug \ " diff --git a/meta-python/recipes-devtools/python/python3-flexcache/run-ptest b/meta-python/recipes-devtools/python/python3-flexcache/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-flexcache/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-flexcache_0.3.bb b/meta-python/recipes-devtools/python/python3-flexcache_0.3.bb new file mode 100644 index 0000000000..1bee774022 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-flexcache_0.3.bb @@ -0,0 +1,31 @@ +SUMMARY = "Saves and loads to the cache a transformed versions of a source object." +HOMEPAGE = "https://github.com/hgrecco/flexcache" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=32f547dac365c355d2cdbcd7ebea9144" +DEPENDS += "python3-setuptools-scm-native" +SRC_URI[sha256sum] = "18743bd5a0621bfe2cf8d519e4c3bfdf57a269c15d1ced3fb4b64e0ff4600656" + +inherit pypi python_setuptools_build_meta ptest +PYPI_PACKAGE = "flexcache" + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/testsuite + cp -rf ${S}/flexcache/testsuite/* ${D}${PTEST_PATH}/testsuite/ +} + +RDEPENDS:${PN} += " \ + python3-compression \ + python3-email \ + python3-json \ + python3-pickle \ + python3-typing-extensions \ +" diff --git a/meta-python/recipes-devtools/python/python3-flexparser/run-ptest b/meta-python/recipes-devtools/python/python3-flexparser/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-flexparser/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-flexparser_0.3.bb b/meta-python/recipes-devtools/python/python3-flexparser_0.3.bb new file mode 100644 index 0000000000..e45175f5a5 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-flexparser_0.3.bb @@ -0,0 +1,31 @@ +SUMMARY = "Parsing made fun ... using typing." +HOMEPAGE = "https://github.com/hgrecco/flexparser" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=32f547dac365c355d2cdbcd7ebea9144" + +DEPENDS += "python3-setuptools-scm-native" +SRC_URI[sha256sum] = "692e7524d9e14b2b1231b772b091d7d6296951deb383f5a67bfbd0ecb0b9fa9a" + +inherit pypi python_setuptools_build_meta ptest + +PYPI_PACKAGE = "flexparser" + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/testsuite + cp -rf ${S}/flexparser/testsuite/* ${D}${PTEST_PATH}/testsuite/ +} + +RDEPENDS:${PN} += " \ + python3-compression \ + python3-email \ + python3-logging \ +" diff --git a/meta-python/recipes-devtools/python/python3-freezegun/run-ptest b/meta-python/recipes-devtools/python/python3-freezegun/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-freezegun/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-freezegun_1.4.0.bb b/meta-python/recipes-devtools/python/python3-freezegun_1.4.0.bb new file mode 100644 index 0000000000..15c0bf06ba --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-freezegun_1.4.0.bb @@ -0,0 +1,29 @@ +SUMMARY = "FreezeGun is a library that allows your Python tests to travel through time by mocking the datetime module." +HOMEPAGE = "https://github.com/spulec/freezegun" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=acf1d209bb6eddae4cbe6ffd6a0144fe" + +SRC_URI[sha256sum] = "10939b0ba0ff5adaecf3b06a5c2f73071d9678e507c5eaedb23c761d56ac774b" + +inherit pypi python_setuptools_build_meta ptest + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-sqlite3 \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} + +RDEPENDS:${PN} = "\ + python3-asyncio \ + python3-dateutil \ + python3-unittest \ +" diff --git a/meta-python/recipes-devtools/python/python3-frozenlist_1.3.1.bb b/meta-python/recipes-devtools/python/python3-frozenlist_1.4.1.bb index b95a014f55..4288f2922e 100644 --- a/meta-python/recipes-devtools/python/python3-frozenlist_1.3.1.bb +++ b/meta-python/recipes-devtools/python/python3-frozenlist_1.4.1.bb @@ -3,9 +3,13 @@ HOMEPAGE = "https://github.com/aio-libs/frozenlist" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=cf056e8e7a0a5477451af18b7b5aa98c" -SRC_URI[sha256sum] = "3a735e4211a04ccfa3f4833547acdf5d2f863bfeb01cfd3edaffbc251f15cec8" +SRC_URI[sha256sum] = "c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b" inherit pypi python_setuptools_build_meta -BBCLASSEXTEND = "native nativesdk" +DEPENDS += " \ + python3-expandvars-native \ + python3-cython-native \ +" +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-future_0.18.2.bb b/meta-python/recipes-devtools/python/python3-future_0.18.3.bb index 90d1661d40..e4a4b5c197 100644 --- a/meta-python/recipes-devtools/python/python3-future_0.18.2.bb +++ b/meta-python/recipes-devtools/python/python3-future_0.18.3.bb @@ -3,8 +3,7 @@ HOMEPAGE = "https://python-future.org" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=a253924061f8ecc41ad7a2ba1560e8e7" -SRC_URI[md5sum] = "e4579c836b9c025872efe230f6270349" -SRC_URI[sha256sum] = "b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d" +SRC_URI[sha256sum] = "34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307" PYPI_PACKAGE_HASH = "99abde815842bc6e97d5a7806ad51236630da14ca2f3b1fce94c0bb94d3d" diff --git a/meta-python/recipes-devtools/python/python3-gast_0.5.3.bb b/meta-python/recipes-devtools/python/python3-gast_0.5.4.bb index 7fd49456d2..9c750ea3b0 100644 --- a/meta-python/recipes-devtools/python/python3-gast_0.5.3.bb +++ b/meta-python/recipes-devtools/python/python3-gast_0.5.4.bb @@ -4,7 +4,7 @@ SECTION = "devel/python" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=a3ad9b6802e713fc5e307e1230f1ea90" -SRC_URI[sha256sum] = "cfbea25820e653af9c7d1807f659ce0a0a9c64f2439421a7bba4f0983f532dea" +SRC_URI[sha256sum] = "9c270fe5f4b130969b54174de7db4e764b09b4f7f67ccfc32480e29f78348d97" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-gcovr_5.2.bb b/meta-python/recipes-devtools/python/python3-gcovr_5.2.bb deleted file mode 100644 index 03231f926a..0000000000 --- a/meta-python/recipes-devtools/python/python3-gcovr_5.2.bb +++ /dev/null @@ -1,17 +0,0 @@ -DESCRIPTION = "generate GCC code coverage reports" -HOMEPAGE = "https://gcovr.com" -SECTION = "devel/python" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=e59af597b3484fa3b52c0fbfd5d17611" - -SRC_URI = "git://github.com/gcovr/gcovr.git;branch=master;protocol=https" -SRCREV = "1040a85ecfb3ef0d01635df9d50a3cae5059d566" - -S = "${WORKDIR}/git" - -inherit setuptools3 -PIP_INSTALL_PACKAGE = "gcovr" - -RDEPENDS:${PN} += "${PYTHON_PN}-jinja2 ${PYTHON_PN}-lxml ${PYTHON_PN}-setuptools ${PYTHON_PN}-pygments" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-gcovr_7.2.bb b/meta-python/recipes-devtools/python/python3-gcovr_7.2.bb new file mode 100644 index 0000000000..517124742a --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-gcovr_7.2.bb @@ -0,0 +1,23 @@ +DESCRIPTION = "generate GCC code coverage reports" +HOMEPAGE = "https://gcovr.com" +SECTION = "devel/python" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=c5a58ca91c1758a53f896ba89d8aaac2" + +SRC_URI = "git://github.com/gcovr/gcovr.git;branch=main;protocol=https" +SRCREV = "c4b74b0859611283be646d590c7915e787911b6f" + +S = "${WORKDIR}/git" + +inherit setuptools3 + +RDEPENDS:${PN} += " \ + python3-colorlog \ + python3-jinja2 \ + python3-lxml \ + python3-multiprocessing \ + python3-pygments \ + python3-setuptools \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-geojson/run-ptest b/meta-python/recipes-devtools/python/python3-geojson/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-geojson/run-ptest +++ b/meta-python/recipes-devtools/python/python3-geojson/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-geojson_2.5.0.bb b/meta-python/recipes-devtools/python/python3-geojson_3.1.0.bb index 40cf8bda76..742f921e59 100644 --- a/meta-python/recipes-devtools/python/python3-geojson_2.5.0.bb +++ b/meta-python/recipes-devtools/python/python3-geojson_3.1.0.bb @@ -1,10 +1,9 @@ SUMMARY = "Python bindings and utilities for GeoJSON" HOMEPAGE = "https://pypi.org/project/geojson/" LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=f48972abe5cddee79e301574742ed745" +LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=f77f2ed49768c8d4c79ba874c0f94d8a" -SRC_URI[md5sum] = "14753ed28678828b1de73f68b04e2324" -SRC_URI[sha256sum] = "6e4bb7ace4226a45d9c8c8b1348b3fc43540658359f93c3f7e03efa9f15f658a" +SRC_URI[sha256sum] = "58a7fa40727ea058efc28b0e9ff0099eadf6d0965e04690830208d3ef571adac" inherit pypi setuptools3 ptest @@ -13,7 +12,8 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-geomet_0.3.0.bb b/meta-python/recipes-devtools/python/python3-geomet_1.1.0.bb index 8e907462ae..ceba10b65b 100644 --- a/meta-python/recipes-devtools/python/python3-geomet_0.3.0.bb +++ b/meta-python/recipes-devtools/python/python3-geomet_1.1.0.bb @@ -9,18 +9,16 @@ SRCNAME = "geomet" SRC_URI[sha256sum] = "cb52411978ee01ff104ab48f108d7333b14423ae7a15a65fee25b7d29bda2e1b" S = "${WORKDIR}/git" -SRC_URI = "git://github.com/geomet/geomet.git;protocol=https;branch=release-${PV} \ - " -SRCREV = "73ec5ec96cca32f2e2461d3964fc3d4ab80248f9" +SRC_URI = "git://github.com/geomet/geomet.git;protocol=https;branch=master" +SRCREV = "6ac73c312b52aca328db2e61d90c5e363b62639f" inherit setuptools3 -PIP_INSTALL_PACKAGE = "geomet" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-click \ - ${PYTHON_PN}-core \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-six \ + python3-click \ + python3-core \ + python3-io \ + python3-json \ + python3-logging \ + python3-six \ " diff --git a/meta-python/recipes-devtools/python/python3-gevent/0001-_setuputils.py-Do-not-add-sys_inc_dir.patch b/meta-python/recipes-devtools/python/python3-gevent/0001-_setuputils.py-Do-not-add-sys_inc_dir.patch new file mode 100644 index 0000000000..49903d6ce8 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-gevent/0001-_setuputils.py-Do-not-add-sys_inc_dir.patch @@ -0,0 +1,38 @@ +From 9eb453283a7ac8a9b1dd3eac86d936c7a430476b Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Tue, 11 Oct 2022 17:37:01 -0700 +Subject: [PATCH] _setuputils.py: Do not add sys_inc_dir + +sys_inc_dir computes to ignore sysroot and ends with paths into host +system include area, which is then flagged by OE gcc since it finds +the host include path poisoning. Since we are adding the syroot anyway +we really do not need setuptools to deduce it for us. + +Upstream-Status: Inappropriate [ Cross-compile specific ] +Signed-off-by: Khem Raj <raj.khem@gmail.com> + +--- + _setuputils.py | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/_setuputils.py b/_setuputils.py +index 4c25e00..23fdfe1 100644 +--- a/_setuputils.py ++++ b/_setuputils.py +@@ -164,7 +164,6 @@ def get_include_dirs(*extra_paths): + # Neither sysconfig dir is not enough if we're in a virtualenv; the greenlet.h + # header goes into a site/ subdir. See https://github.com/pypa/pip/issues/4610 + dist_inc_dir = os.path.abspath(dist_sysconfig.get_python_inc()) # 1 +- sys_inc_dir = os.path.abspath(sysconfig.get_path("include")) # 2 + venv_include_dir = os.path.join( + sys.prefix, 'include', 'site', + 'python' + sysconfig.get_python_version() +@@ -178,7 +177,7 @@ def get_include_dirs(*extra_paths): + + return [ + p +- for p in (dist_inc_dir, sys_inc_dir, dep_inc_dir) + extra_paths ++ for p in (dist_inc_dir, dep_inc_dir) + extra_paths + if os.path.exists(p) + ] + diff --git a/meta-python/recipes-devtools/python/python3-gevent_21.12.0.bb b/meta-python/recipes-devtools/python/python3-gevent_21.12.0.bb deleted file mode 100644 index 9efeec4d9f..0000000000 --- a/meta-python/recipes-devtools/python/python3-gevent_21.12.0.bb +++ /dev/null @@ -1,24 +0,0 @@ -SUMMARY = "A coroutine-based Python networking library" -DESCRIPTION = "gevent is a coroutine-based Python networking library that uses greenlet to provide \ -a high-level synchronous API on top of the libevent event loop." -HOMEPAGE = "http://www.gevent.org" -LICENSE = "MIT & Python-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=4de99aac27b470c29c6c309e0c279b65" -DEPENDS += "${PYTHON_PN}-greenlet libev c-ares" - -RDEPENDS:${PN} = "${PYTHON_PN}-greenlet \ - ${PYTHON_PN}-mime \ - ${PYTHON_PN}-pprint \ - " - -SRC_URI[sha256sum] = "f48b64578c367b91fa793bf8eaaaf4995cb93c8bc45860e473bf868070ad094e" - -inherit pypi setuptools3 - -# Don't embed libraries, link to the system instead -export GEVENTSETUP_EMBED = "0" - -# Delete the embedded copies of libraries so we can't accidentally link to them -do_configure:append() { - rm -rf ${S}/deps -} diff --git a/meta-python/recipes-devtools/python/python3-gevent_24.2.1.bb b/meta-python/recipes-devtools/python/python3-gevent_24.2.1.bb new file mode 100644 index 0000000000..fbdbf8ccc7 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-gevent_24.2.1.bb @@ -0,0 +1,37 @@ +SUMMARY = "A coroutine-based Python networking library" +DESCRIPTION = "gevent is a coroutine-based Python networking library that uses greenlet to provide \ +a high-level synchronous API on top of the libevent event loop." +HOMEPAGE = "http://www.gevent.org" +LICENSE = "MIT & Python-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=4de99aac27b470c29c6c309e0c279b65" +DEPENDS += "python3-greenlet libev libuv c-ares python3-cython-native" + +RDEPENDS:${PN} = "python3-greenlet \ + python3-mime \ + python3-pprint \ + python3-zopeevent \ + python3-zopeinterface \ + " + +SRC_URI += "file://0001-_setuputils.py-Do-not-add-sys_inc_dir.patch" + +SRC_URI[sha256sum] = "432fc76f680acf7cf188c2ee0f5d3ab73b63c1f03114c7cd8a34cebbe5aa2056" + +inherit pypi setuptools3 + +# Don't embed libraries, link to the system provided libs instead +export GEVENTSETUP_EMBED_CARES = "0" +export GEVENTSETUP_EMBED_LIBEV = "0" +export GEVENTSETUP_EMBED_LIBUV = "0" + +do_configure:append() { + # Delete the embedded copies of libraries so we can't accidentally link to them + rm -rf ${S}/deps + + # Delete the generated cython files, as they are all out of date with python 3.11 + rm -rf ${S}/src/gevent/*.c +} + +do_compile:append() { + sed -i -e 's#${WORKDIR}##g' ${S}/src/gevent/*.c ${S}/src/gevent/libev/*.c ${S}/src/gevent/resolver/*.c +} diff --git a/meta-python/recipes-devtools/python/python3-git-pw_2.6.0.bb b/meta-python/recipes-devtools/python/python3-git-pw_2.6.0.bb new file mode 100644 index 0000000000..c0b6a60814 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-git-pw_2.6.0.bb @@ -0,0 +1,20 @@ +SUMMARY = "A tool for integrating Git with Patchwork" +HOMEPAGE = "https://github.com/getpatchwork/git-pw" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=26e1a171d943c64f00c51f90c256b9d4" + +SRC_URI[sha256sum] = "e118e31bbe259ed9ae540d627cc563a6ece553d02aed11b1a92bbac408a0da0e" + +inherit pypi python_setuptools_build_meta + +DEPENDS += " \ + python3-pbr-native \ +" + +RDEPENDS:${PN} += " \ + python3-arrow \ + python3-click \ + python3-pyyaml \ + python3-requests \ + python3-tabulate \ +" diff --git a/meta-python/recipes-devtools/python/python3-gmpy2/0001-src-fix-python-3.12-builds.patch b/meta-python/recipes-devtools/python/python3-gmpy2/0001-src-fix-python-3.12-builds.patch new file mode 100644 index 0000000000..1171322e26 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-gmpy2/0001-src-fix-python-3.12-builds.patch @@ -0,0 +1,263 @@ +From 43f132103cedfd92b85173bcdacfbabd5916d9fc Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin <alex@linutronix.de> +Date: Wed, 27 Dec 2023 14:52:16 +0100 +Subject: [PATCH] src: fix python 3.12 builds + +This is a backport for 3.1.x versions provided separately in https://github.com/aleaxit/gmpy/issues/446 + +Upstream-Status: Inappropriate [can be dropped when 2.2.x is released] + +Signed-off-by: Alexander Kanavin <alex@linutronix.de> +--- + src/gmpy2_convert.h | 21 +++++++ + src/gmpy2_convert_gmp.c | 129 +++++++++++++------------------------- + src/gmpy2_convert_utils.c | 2 +- + 3 files changed, 65 insertions(+), 87 deletions(-) + +diff --git a/src/gmpy2_convert.h b/src/gmpy2_convert.h +index f887d47..3e8cb2b 100644 +--- a/src/gmpy2_convert.h ++++ b/src/gmpy2_convert.h +@@ -142,6 +142,27 @@ extern "C" { + #define IS_TYPE_COMPLEX_ONLY(x) ((x > OBJ_TYPE_REAL) && \ + (x < OBJ_TYPE_COMPLEX)) + ++/* Compatibility macros (to work with PyLongObject internals). ++ */ ++ ++#if PY_VERSION_HEX >= 0x030C0000 ++# define TAG_FROM_SIGN_AND_SIZE(is_neg, size) ((is_neg?2:(size==0)) | (((size_t)size) << 3)) ++# define _PyLong_SetSignAndDigitCount(obj, is_neg, size) (obj->long_value.lv_tag = TAG_FROM_SIGN_AND_SIZE(is_neg, size)) ++#elif PY_VERSION_HEX >= 0x030900A4 ++# define _PyLong_SetSignAndDigitCount(obj, is_neg, size) (Py_SET_SIZE(obj, (is_neg?-1:1)*size)) ++#else ++# define _PyLong_SetSignAndDigitCount(obj, is_neg, size) (Py_SIZE(obj) = (is_neg?-1:1)*size) ++#endif ++ ++#if PY_VERSION_HEX >= 0x030C0000 ++# define GET_OB_DIGIT(obj) obj->long_value.ob_digit ++# define _PyLong_IsNegative(obj) ((obj->long_value.lv_tag & 3) == 2) ++# define _PyLong_DigitCount(obj) (obj->long_value.lv_tag >> 3) ++#else ++# define GET_OB_DIGIT(obj) obj->ob_digit ++# define _PyLong_IsNegative(obj) (Py_SIZE(obj) < 0) ++# define _PyLong_DigitCount(obj) (_PyLong_IsNegative(obj)? -Py_SIZE(obj):Py_SIZE(obj)) ++#endif + + /* Since the macros are used in gmpy2's codebase, these functions are skipped + * until they are needed for the C API in the future. +diff --git a/src/gmpy2_convert_gmp.c b/src/gmpy2_convert_gmp.c +index cf0891e..8b8df81 100644 +--- a/src/gmpy2_convert_gmp.c ++++ b/src/gmpy2_convert_gmp.c +@@ -59,33 +59,24 @@ GMPy_MPZ_From_PyIntOrLong(PyObject *obj, CTXT_Object *context) + } + #endif + +- switch (Py_SIZE(templong)) { +- case -1: +- mpz_set_si(result->z, -(sdigit)templong->ob_digit[0]); ++ len = _PyLong_DigitCount(templong); ++ negative = _PyLong_IsNegative(templong); ++ ++ switch (len) { ++ case 1: ++ mpz_set_si(result->z, (sdigit)GET_OB_DIGIT(templong)[0]); + break; + case 0: + mpz_set_si(result->z, 0); + break; +- case 1: +- mpz_set_si(result->z, templong->ob_digit[0]); +- break; + default: +- mpz_set_si(result->z, 0); +- +- if (Py_SIZE(templong) < 0) { +- len = - Py_SIZE(templong); +- negative = 1; +- } else { +- len = Py_SIZE(templong); +- negative = 0; +- } +- +- mpz_import(result->z, len, -1, sizeof(templong->ob_digit[0]), 0, +- sizeof(templong->ob_digit[0])*8 - PyLong_SHIFT, templong->ob_digit); ++ mpz_import(result->z, len, -1, sizeof(GET_OB_DIGIT(templong)[0]), 0, ++ sizeof(GET_OB_DIGIT(templong)[0])*8 - PyLong_SHIFT, ++ GET_OB_DIGIT(templong)); ++ } + +- if (negative) { +- mpz_neg(result->z, result->z); +- } ++ if (negative) { ++ mpz_neg(result->z, result->z); + } + return result; + } +@@ -105,33 +96,24 @@ mpz_set_PyIntOrLong(mpz_t z, PyObject *obj) + } + #endif + +- switch (Py_SIZE(templong)) { +- case -1: +- mpz_set_si(z, -(sdigit)templong->ob_digit[0]); ++ len = _PyLong_DigitCount(templong); ++ negative = _PyLong_IsNegative(templong); ++ ++ switch (len) { ++ case 1: ++ mpz_set_si(z, (sdigit)GET_OB_DIGIT(templong)[0]); + break; + case 0: + mpz_set_si(z, 0); + break; +- case 1: +- mpz_set_si(z, templong->ob_digit[0]); +- break; + default: +- mpz_set_si(z, 0); +- +- if (Py_SIZE(templong) < 0) { +- len = - Py_SIZE(templong); +- negative = 1; +- } else { +- len = Py_SIZE(templong); +- negative = 0; +- } +- +- mpz_import(z, len, -1, sizeof(templong->ob_digit[0]), 0, +- sizeof(templong->ob_digit[0])*8 - PyLong_SHIFT, templong->ob_digit); ++ mpz_import(z, len, -1, sizeof(GET_OB_DIGIT(templong)[0]), 0, ++ sizeof(GET_OB_DIGIT(templong)[0])*8 - PyLong_SHIFT, ++ GET_OB_DIGIT(templong)); ++ } + +- if (negative) { +- mpz_neg(z, z); +- } ++ if (negative) { ++ mpz_neg(z, z); + } + return; + } +@@ -186,12 +168,7 @@ GMPy_PyLong_From_MPZ(MPZ_Object *obj, CTXT_Object *context) + + /* Assume gmp uses limbs as least as large as the builtin longs do */ + +- if (mpz_sgn(obj->z) < 0) { +- negative = 1; +- } else { +- negative = 0; +- } +- ++ negative = mpz_sgn(obj->z) < 0; + size = (mpz_sizeinbase(obj->z, 2) + PyLong_SHIFT - 1) / PyLong_SHIFT; + + if (!(result = _PyLong_New(size))) { +@@ -200,31 +177,20 @@ GMPy_PyLong_From_MPZ(MPZ_Object *obj, CTXT_Object *context) + /* LCOV_EXCL_STOP */ + } + +- mpz_export(result->ob_digit, &count, -1, sizeof(result->ob_digit[0]), 0, +- sizeof(result->ob_digit[0])*8 - PyLong_SHIFT, obj->z); ++ mpz_export(GET_OB_DIGIT(result), &count, -1, sizeof(GET_OB_DIGIT(result)[0]), 0, ++ sizeof(GET_OB_DIGIT(result)[0])*8 - PyLong_SHIFT, obj->z); + + if (count == 0) { +- result->ob_digit[0] = 0; ++ GET_OB_DIGIT(result)[0] = 0; + } + + /* long_normalize() is file-static so we must reimplement it */ + /* longobjp = long_normalize(longobjp); */ +- while ((size>0) && (result->ob_digit[size-1] == 0)) { ++ while ((size>0) && (GET_OB_DIGIT(result)[size-1] == 0)) { + size--; + } +-#if PY_VERSION_HEX >= 0x030900A4 +- Py_SET_SIZE(result, size); +-#else +- Py_SIZE(result) = size; +-#endif + +- if (negative) { +-#if PY_VERSION_HEX >= 0x030900A4 +- Py_SET_SIZE(result, - Py_SIZE(result)); +-#else +- Py_SIZE(result) = - Py_SIZE(result); +-#endif +- } ++ _PyLong_SetSignAndDigitCount(result, negative, size); + return (PyObject*)result; + } + +@@ -476,33 +442,24 @@ GMPy_XMPZ_From_PyIntOrLong(PyObject *obj, CTXT_Object *context) + } + #endif + +- switch (Py_SIZE(templong)) { +- case -1: +- mpz_set_si(result->z, -(sdigit)templong->ob_digit[0]); ++ len = _PyLong_DigitCount(templong); ++ negative = _PyLong_IsNegative(templong); ++ ++ switch (len) { ++ case 1: ++ mpz_set_si(result->z, (sdigit)GET_OB_DIGIT(templong)[0]); + break; + case 0: + mpz_set_si(result->z, 0); + break; +- case 1: +- mpz_set_si(result->z, templong->ob_digit[0]); +- break; + default: +- mpz_set_si(result->z, 0); +- +- if (Py_SIZE(templong) < 0) { +- len = - Py_SIZE(templong); +- negative = 1; +- } else { +- len = Py_SIZE(templong); +- negative = 0; +- } +- +- mpz_import(result->z, len, -1, sizeof(templong->ob_digit[0]), 0, +- sizeof(templong->ob_digit[0])*8 - PyLong_SHIFT, templong->ob_digit); ++ mpz_import(result->z, len, -1, sizeof(GET_OB_DIGIT(templong)[0]), 0, ++ sizeof(GET_OB_DIGIT(templong)[0])*8 - PyLong_SHIFT, ++ GET_OB_DIGIT(templong)); ++ } + +- if (negative) { +- mpz_neg(result->z, result->z); +- } ++ if (negative) { ++ mpz_neg(result->z, result->z); + } + return result; + } +@@ -639,7 +596,7 @@ GMPy_MPQ_From_PyStr(PyObject *s, int base, CTXT_Object *context) + } + + cp = PyBytes_AsString(ascii_str); +- ++ + { + char *whereslash = strchr((char*)cp, '/'); + char *wheredot = strchr((char*)cp, '.'); +diff --git a/src/gmpy2_convert_utils.c b/src/gmpy2_convert_utils.c +index d676eaf..8908d17 100644 +--- a/src/gmpy2_convert_utils.c ++++ b/src/gmpy2_convert_utils.c +@@ -123,7 +123,7 @@ static unsigned long + GMPy_Integer_AsUnsignedLongWithType_v2(PyObject *x, int xtype) + { + if IS_TYPE_PyInteger(xtype) { +- if (Py_SIZE(x) < 0) { ++ if (_PyLong_IsNegative(((PyLongObject*)x))) { + VALUE_ERROR("n must be > 0"); + return (unsigned long)-1; + } diff --git a/meta-python/recipes-devtools/python/python3-gmpy2_2.1.2.bb b/meta-python/recipes-devtools/python/python3-gmpy2_2.1.5.bb index 274f24090b..d9e9bd50e5 100644 --- a/meta-python/recipes-devtools/python/python3-gmpy2_2.1.2.bb +++ b/meta-python/recipes-devtools/python/python3-gmpy2_2.1.5.bb @@ -7,8 +7,9 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504 \ DEPENDS += "gmp mpfr libmpc" PYPI_PACKAGE = "gmpy2" -SRC_URI[sha256sum] = "da75140bca128ece795895477e53b43773e3748aa90ba6170eae7ca2c74b82d1" +SRC_URI[sha256sum] = "bc297f1fd8c377ae67a4f493fc0f926e5d1b157e5c342e30a4d84dc7b9f95d96" inherit pypi setuptools3 python3native +SRC_URI += "file://0001-src-fix-python-3.12-builds.patch" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-gmqtt_0.6.11.bb b/meta-python/recipes-devtools/python/python3-gmqtt_0.6.14.bb index 0e6670b906..5d8a3ba51c 100644 --- a/meta-python/recipes-devtools/python/python3-gmqtt_0.6.11.bb +++ b/meta-python/recipes-devtools/python/python3-gmqtt_0.6.14.bb @@ -3,7 +3,7 @@ HOMEPAGE = "https://github.com/wialon/gmqtt" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=903f1792621a3b35ee546da75d139177" -SRC_URI[sha256sum] = "0be6d57841538abc3ae0a41131c6d53314e0705b74876a6f94bc903df1209fb6" +SRC_URI[sha256sum] = "45b0f7794247455b9163155eeedf41c86e303c72b79056bf65d33038b17443a3" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-gnupg_0.4.9.bb b/meta-python/recipes-devtools/python/python3-gnupg_0.5.2.bb index 9e13e4c26f..b69e2c465e 100644 --- a/meta-python/recipes-devtools/python/python3-gnupg_0.4.9.bb +++ b/meta-python/recipes-devtools/python/python3-gnupg_0.5.2.bb @@ -4,7 +4,7 @@ LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=5dabe659eadd6d97325b1582e41cfc11" PYPI_PACKAGE = "python-gnupg" -SRC_URI[sha256sum] = "aaa748795572591aaf127b4ac8985684f3673ff82b39f370c836b006e68fc537" +SRC_URI[sha256sum] = "01d8013931c9fa3f45824bbea7054c03d6e11f258a72e7e086e168dbcb91854c" inherit pypi python_setuptools_build_meta diff --git a/meta-python/recipes-devtools/python/python3-google-api-core_2.18.0.bb b/meta-python/recipes-devtools/python/python3-google-api-core_2.18.0.bb new file mode 100644 index 0000000000..b4cbafa85d --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-google-api-core_2.18.0.bb @@ -0,0 +1,25 @@ +DESCRIPTION = "Google API client core library" +HOMEPAGE = "https://github.com/googleapis/python-api-core" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57" + +inherit pypi setuptools3 + +SRC_URI[sha256sum] = "62d97417bfc674d6cef251e5c4d639a9655e00c45528c4364fbfebb478ce72a9" + +RDEPENDS:${PN} += "\ + python3-asyncio \ + python3-datetime \ + python3-logging \ + python3-math \ +" + +RDEPENDS:${PN} += "\ + python3-googleapis-common-protos \ + python3-google-auth \ + python3-grpcio \ + python3-protobuf \ + python3-pytz \ + python3-requests \ + python3-six \ +" diff --git a/meta-python/recipes-devtools/python/python3-google-api-core_2.8.2.bb b/meta-python/recipes-devtools/python/python3-google-api-core_2.8.2.bb deleted file mode 100644 index a2df7fb48a..0000000000 --- a/meta-python/recipes-devtools/python/python3-google-api-core_2.8.2.bb +++ /dev/null @@ -1,26 +0,0 @@ -DESCRIPTION = "Google API client core library" -HOMEPAGE = "https://github.com/googleapis/python-api-core" -AUTHOR = "Google LLC" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57" - -inherit pypi setuptools3 - -SRC_URI[sha256sum] = "06f7244c640322b508b125903bb5701bebabce8832f85aba9335ec00b3d02edc" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-asyncio \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-math \ -" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-googleapis-common-protos \ - ${PYTHON_PN}-google-auth \ - ${PYTHON_PN}-grpcio \ - ${PYTHON_PN}-protobuf \ - ${PYTHON_PN}-pytz \ - ${PYTHON_PN}-requests \ - ${PYTHON_PN}-six \ -" diff --git a/meta-python/recipes-devtools/python/python3-google-api-python-client_2.56.0.bb b/meta-python/recipes-devtools/python/python3-google-api-python-client_2.125.0.bb index b8f7ff97b2..8abe4699e8 100644 --- a/meta-python/recipes-devtools/python/python3-google-api-python-client_2.56.0.bb +++ b/meta-python/recipes-devtools/python/python3-google-api-python-client_2.125.0.bb @@ -4,17 +4,17 @@ HOMEPAGE = "https://github.com/googleapis/google-api-python-client" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327" -SRC_URI[sha256sum] = "70d33203a4752bf4144b33fc689e997a2b5ed42c696d57149e4b3f5082682436" +SRC_URI[sha256sum] = "51a0385cff65ec135106e8be60ee7112557396dde5f44113ae23912baddda143" inherit pypi setuptools3 RDEPENDS:${PN} += "\ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-core \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-httplib2 \ - ${PYTHON_PN}-uritemplate \ - ${PYTHON_PN}-google-api-core \ + python3-logging \ + python3-six \ + python3-json \ + python3-core \ + python3-netclient \ + python3-httplib2 \ + python3-uritemplate \ + python3-google-api-core \ " diff --git a/meta-python/recipes-devtools/python/python3-google-auth-oauthlib/run-ptest b/meta-python/recipes-devtools/python/python3-google-auth-oauthlib/run-ptest new file mode 100644 index 0000000000..f1c8729f0e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-google-auth-oauthlib/run-ptest @@ -0,0 +1,4 @@ +#!/bin/sh + +pytest --automake + diff --git a/meta-python/recipes-devtools/python/python3-google-auth-oauthlib_1.2.0.bb b/meta-python/recipes-devtools/python/python3-google-auth-oauthlib_1.2.0.bb new file mode 100644 index 0000000000..70e843a094 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-google-auth-oauthlib_1.2.0.bb @@ -0,0 +1,31 @@ +SUMMARY = "Google Authentication Library" +DESCRIPTION = "This library provides oauthlib integration with google-auth" +HOMEPAGE = "https://github.com/googleapis/google-auth-library-python-oauthlib" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57" + +SRC_URI[sha256sum] = "292d2d3783349f2b0734a0a0207b1e1e322ac193c2c09d8f7c613fb7cc501ea8" + +inherit pypi setuptools3 ptest + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-click \ + python3-mock \ + python3-pytest \ + python3-unittest-automake-output \ + python3-unixadmin \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} + +RDEPENDS:${PN} += " \ + python3-google-auth \ + python3-requests-oauthlib \ +" diff --git a/meta-python/recipes-devtools/python/python3-google-auth/run-ptest b/meta-python/recipes-devtools/python/python3-google-auth/run-ptest new file mode 100644 index 0000000000..f1c8729f0e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-google-auth/run-ptest @@ -0,0 +1,4 @@ +#!/bin/sh + +pytest --automake + diff --git a/meta-python/recipes-devtools/python/python3-google-auth_2.10.0.bb b/meta-python/recipes-devtools/python/python3-google-auth_2.10.0.bb deleted file mode 100644 index 610a4d7dd8..0000000000 --- a/meta-python/recipes-devtools/python/python3-google-auth_2.10.0.bb +++ /dev/null @@ -1,27 +0,0 @@ -DESCRIPTION = "Google Authentication Library" -HOMEPAGE = "https://github.com/googleapis/google-auth-library-python" -AUTHOR = "Google Cloud Platform" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327" - -inherit pypi setuptools3 - -SRC_URI[sha256sum] = "7904dbd44b745c7323fef29565adee2fe7ff48473e2d94443aced40b0404a395" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-asyncio \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-numbers \ -" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-aiohttp \ - ${PYTHON_PN}-cachetools \ - ${PYTHON_PN}-pyasn1-modules \ - ${PYTHON_PN}-rsa \ - ${PYTHON_PN}-six \ -" diff --git a/meta-python/recipes-devtools/python/python3-google-auth_2.29.0.bb b/meta-python/recipes-devtools/python/python3-google-auth_2.29.0.bb new file mode 100644 index 0000000000..e8d438df02 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-google-auth_2.29.0.bb @@ -0,0 +1,41 @@ +DESCRIPTION = "Google Authentication Library" +HOMEPAGE = "https://github.com/googleapis/google-auth-library-python" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327" + +inherit pypi setuptools3 ptest + +SRC_URI[sha256sum] = "672dff332d073227550ffc7457868ac4218d6c500b155fe6cc17d2b13602c360" + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-cryptography \ + python3-flask \ + python3-freezegun \ + python3-grpcio \ + python3-mock \ + python3-oauth2client \ + python3-pyopenssl \ + python3-pytest \ + python3-pytest-localserver \ + python3-pyu2f \ + python3-requests \ + python3-responses \ + python3-unittest-automake-output \ + python3-unixadmin \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} + +RDEPENDS:${PN} += "\ + python3-cachetools \ + python3-json \ + python3-pyasn1-modules \ + python3-rsa \ +" diff --git a/meta-python/recipes-devtools/python/python3-googleapis-common-protos_1.56.4.bb b/meta-python/recipes-devtools/python/python3-googleapis-common-protos_1.63.0.bb index 3f03933e06..aee2337267 100644 --- a/meta-python/recipes-devtools/python/python3-googleapis-common-protos_1.56.4.bb +++ b/meta-python/recipes-devtools/python/python3-googleapis-common-protos_1.63.0.bb @@ -1,14 +1,13 @@ DESCRIPTION = "Common protobufs used in Google APIs" HOMEPAGE = "https://github.com/googleapis/python-api-common-protos" -AUTHOR = "Google LLC" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10" inherit pypi setuptools3 -SRC_URI[sha256sum] = "c25873c47279387cfdcbdafa36149887901d36202cb645a0e4f29686bf6e4417" +SRC_URI[sha256sum] = "17ad01b11d5f1d0171c06d3ba5c04c54474e883b66b949722b4938ee2694ef4e" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-grpcio \ - ${PYTHON_PN}-protobuf \ + python3-grpcio \ + python3-protobuf \ " diff --git a/meta-python/recipes-devtools/python/python3-gpiod/run-ptest b/meta-python/recipes-devtools/python/python3-gpiod/run-ptest new file mode 100644 index 0000000000..bf1244b07c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-gpiod/run-ptest @@ -0,0 +1,15 @@ +#!/bin/sh + +cd $(dirname "$(readlink -f "$0")") + +# python3-gpiod uses gpio-sim - a configfs-based testing module. We need to +# make sure configfs is mounted before running any tests. +modprobe configfs +mountpoint /sys/kernel/config > /dev/null || mount -t configfs configfs /sys/kernel/config + +python3 -m gpiod-test -v > ./python3-gpiod.out 2>&1 +if [ $? -ne 0 ]; then + echo "FAIL: python3-gpiod" +else + echo "PASS: python3-gpiod" +fi diff --git a/meta-python/recipes-devtools/python/python3-gpiod_2.1.3.bb b/meta-python/recipes-devtools/python/python3-gpiod_2.1.3.bb new file mode 100644 index 0000000000..d8c8628daa --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-gpiod_2.1.3.bb @@ -0,0 +1,46 @@ +SUMMARY = "Python bindings for libgpiod." + +LICENSE = "GPL-2.0-or-later & LGPL-2.1-or-later & CC-BY-SA-4.0" +# The actual license files live in the upstream libgpiod from which the pypi +# package is spun out. +LIC_FILES_CHKSUM = "file://setup.py;beginline=237;endline=237;md5=f5ddb56912b7f20bf94aa4d1bdcd3533" + +SRC_URI += "file://run-ptest" + +SRC_URI[sha256sum] = "a33193d6cab79d252329f71666a35a3668e04f1f82bf9b93ee2c9ae852398b20" + +inherit setuptools3-base python_pep517 ptest pypi + +DEPENDS += " \ + libgpiod \ + python3-setuptools-native \ +" +RDEPENDS:${PN} += " \ + libgpiod (>= 2.1) \ + python3-datetime \ + python3-profile \ +" +RDEPENDS:${PN}-ptest += " \ + libgpiod-ptest \ + python3-setuptools \ +" +RRECOMMENDS:${PN}-ptest += "kernel-module-configfs" + +export LINK_SYSTEM_LIBGPIOD = "1" + +do_compile_ptest() { + setup_target_config + nativepython3 build_tests.py +} + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/gpiod-test/gpiosim + install -d ${D}${PTEST_PATH}/gpiod-test/procname + install -m 0644 ${S}/tests/*.py ${D}${PTEST_PATH}/gpiod-test/ + install -m 0644 ${B}/tests/gpiosim/_ext* ${D}${PTEST_PATH}/gpiod-test/gpiosim + install -m 0644 ${S}/tests/gpiosim/*.py ${D}${PTEST_PATH}/gpiod-test/gpiosim + install -m 0644 ${B}/tests/procname/_ext* ${D}${PTEST_PATH}/gpiod-test/procname + install -m 0644 ${S}/tests/procname/*.py ${D}${PTEST_PATH}/gpiod-test/procname +} + +INSANE_SKIP:${PN}-ptest += "buildpaths" diff --git a/meta-python/recipes-devtools/python/python3-graphviz_0.20.1.bb b/meta-python/recipes-devtools/python/python3-graphviz_0.20.3.bb index 506c738133..0fd81b0ee6 100644 --- a/meta-python/recipes-devtools/python/python3-graphviz_0.20.1.bb +++ b/meta-python/recipes-devtools/python/python3-graphviz_0.20.3.bb @@ -1,16 +1,16 @@ DESCRIPTION = "Graphviz protocol implementation" HOMEPAGE = "https://graphviz.readthedocs.io/en/stable/" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=951dd0868a9606c867ffda0ea3ea6da2" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=bcdc1cf20245c598f9a563b550605785" -SRC_URI[sha256sum] = "8c58f14adaa3b947daf26c19bc1e98c4e0702cdc31cf99153e6f06904d492bf8" +SRC_URI[sha256sum] = "09d6bc81e6a9fa392e7ba52135a9d49f1ed62526f96499325930e87ca1b5925d" inherit pypi setuptools3 PYPI_PACKAGE_EXT = "zip" RDEPENDS:${PN} += " \ - ${PYTHON_PN}-logging \ + python3-logging \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-greenlet_1.1.2.bb b/meta-python/recipes-devtools/python/python3-greenlet_3.0.3.bb index d14987b1fe..abd6c49caf 100644 --- a/meta-python/recipes-devtools/python/python3-greenlet_1.1.2.bb +++ b/meta-python/recipes-devtools/python/python3-greenlet_3.0.3.bb @@ -4,6 +4,6 @@ LICENSE = "MIT & PSF-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=e95668d68e4329085c7ab3535e6a7aee \ file://LICENSE.PSF;md5=c106931d9429eda0492617f037b8f69a" -SRC_URI[sha256sum] = "e30f5ea4ae2346e62cedde8794a56858a67b878dd79f7df76a0767e356b1744a" +SRC_URI[sha256sum] = "43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-greenstalk_2.0.0.bb b/meta-python/recipes-devtools/python/python3-greenstalk_2.0.2.bb index 841b84ddf6..33eb62d5d9 100644 --- a/meta-python/recipes-devtools/python/python3-greenstalk_2.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-greenstalk_2.0.2.bb @@ -3,9 +3,8 @@ HOMEPAGE = "https://github.com/mayhewj/greenstalk" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=8f98432ba1fce3933c556430fd47298f" -SRC_URI[sha256sum] = "0020970abdb6f400586938573cbbec80410e83805d61e46cf76ea3ed71129257" +SRC_URI[sha256sum] = "3ebde5fc9ecf986f96f6779fd6d15a53f33d432c52a2e28012e100a99ee154a4" RDEPENDS:${PN} += "python3-io python3-core" -inherit pypi -inherit setuptools3 +inherit pypi python_setuptools_build_meta diff --git a/meta-python/recipes-devtools/python/python3-grpcio-tools/0001-protobuf-Disable-musttail-attribute-on-mips.patch b/meta-python/recipes-devtools/python/python3-grpcio-tools/0001-protobuf-Disable-musttail-attribute-on-mips.patch new file mode 100644 index 0000000000..67505d0ce1 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-grpcio-tools/0001-protobuf-Disable-musttail-attribute-on-mips.patch @@ -0,0 +1,24 @@ +From 64d737318656286f69ddc5ad654072785ddcbbed Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Fri, 16 Sep 2022 19:09:15 -0700 +Subject: [PATCH] protobuf: Disable musttail attribute on mips + +See https://github.com/llvm/llvm-project/issues/57795 + +Upstream-Status: Pending +Signed-off-by: Khem Raj <raj.khem@gmail.com> +Signed-off-by: Wang Mingyu <wangmy@fujitsu.com> +--- + third_party/protobuf/src/google/protobuf/port_def.inc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/third_party/protobuf/src/google/protobuf/port_def.inc ++++ b/third_party/protobuf/src/google/protobuf/port_def.inc +@@ -298,6 +298,7 @@ + #error PROTOBUF_TAILCALL was previously defined + #endif + #if ABSL_HAVE_CPP_ATTRIBUTE(clang::musttail) && !defined(__arm__) && \ ++ !defined(__mips__) && \ + !defined(_ARCH_PPC) && !defined(__wasm__) && \ + !(defined(_MSC_VER) && defined(_M_IX86)) && !defined(__i386__) + // Compilation fails on ARM32: b/195943306 diff --git a/meta-python/recipes-devtools/python/python3-grpcio-tools/0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch b/meta-python/recipes-devtools/python/python3-grpcio-tools/0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch index 4aa11bd57a..07276c17f6 100644 --- a/meta-python/recipes-devtools/python/python3-grpcio-tools/0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch +++ b/meta-python/recipes-devtools/python/python3-grpcio-tools/0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch @@ -30,29 +30,30 @@ diff --git a/setup.py b/setup.py index cc53e79..be3bc78 100644 --- a/setup.py +++ b/setup.py -@@ -87,8 +87,11 @@ def check_linker_need_libatomic(): - """Test if linker on system needs libatomic.""" - code_test = (b'#include <atomic>\n' + - b'int main() { return std::atomic<int64_t>{}; }') -- cxx = os.environ.get('CXX', 'c++') -- cpp_test = subprocess.Popen([cxx, '-x', 'c++', '-std=c++14', '-'], +@@ -88,9 +88,11 @@ + b"#include <atomic>\n" + + b"int main() { return std::atomic<int64_t>{}; }" + ) +- cxx = os.environ.get("CXX", "c++") +- cpp_test = subprocess.Popen( +- [cxx, "-x", "c++", "-std=c++14", "-"], + cxx, cxx_args = os.environ.get('CXX').split(' ', 1) or 'c++' + if not cxx_args: + cxx_args = "-g" + + cpp_test = subprocess.Popen([cxx, cxx_args, '-x', 'c++', '-std=c++14', '-'], - stdin=PIPE, - stdout=PIPE, - stderr=PIPE) -@@ -98,7 +101,7 @@ def check_linker_need_libatomic(): + stdin=PIPE, + stdout=PIPE, + stderr=PIPE, +@@ -101,7 +103,7 @@ # Double-check to see if -latomic actually can solve the problem. # https://github.com/grpc/grpc/issues/22491 cpp_test = subprocess.Popen( -- [cxx, '-x', 'c++', '-std=c++14', '-', '-latomic'], +- [cxx, "-x", "c++", "-std=c++14", "-", "-latomic"], + [cxx, cxx_args, '-x', 'c++', '-std=c++14', '-', '-latomic'], stdin=PIPE, stdout=PIPE, - stderr=PIPE) + stderr=PIPE, -- 2.25.1 diff --git a/meta-python/recipes-devtools/python/python3-grpcio-tools_1.47.0.bb b/meta-python/recipes-devtools/python/python3-grpcio-tools_1.62.2.bb index 90c8efeeca..e05b8734d6 100644 --- a/meta-python/recipes-devtools/python/python3-grpcio-tools_1.47.0.bb +++ b/meta-python/recipes-devtools/python/python3-grpcio-tools_1.62.2.bb @@ -7,11 +7,13 @@ LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=7145f7cdd263359b62 inherit pypi setuptools3 -DEPENDS += "${PYTHON_PN}-grpcio" +DEPENDS += "python3-grpcio" -SRC_URI += "file://0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch" -SRC_URI[sha256sum] = "f64b5378484be1d6ce59311f86174be29c8ff98d8d90f589e1c56d5acae67d3c" +SRC_URI += "file://0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch \ + file://0001-protobuf-Disable-musttail-attribute-on-mips.patch \ + " +SRC_URI[sha256sum] = "5fd5e1582b678e6b941ee5f5809340be5e0724691df5299aae8226640f94e18f" -RDEPENDS:${PN} = "${PYTHON_PN}-grpcio" +RDEPENDS:${PN} = "python3-grpcio" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-grpcio/0001-Include-missing-cstdint-header.patch b/meta-python/recipes-devtools/python/python3-grpcio/0001-Include-missing-cstdint-header.patch new file mode 100644 index 0000000000..5cd94dee9c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-grpcio/0001-Include-missing-cstdint-header.patch @@ -0,0 +1,30 @@ +From 252aa78526287fe033c5656cd166e551fa5daa88 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Mon, 30 Jan 2023 10:31:10 -0800 +Subject: [PATCH] Include missing <cstdint> header + +gcc 13 moved some includes around and as a result <cstdint> is +no longer transitively included [1]. Explicitly include it for +int32_t. + +[1] https://gcc.gnu.org/gcc-13/porting_to.html#header-dep-changes + +Upstream-Status: Submitted [https://code-review.googlesource.com/c/re2/+/60970] +Signed-off-by: Khem Raj <raj.khem@gmail.com> + +--- + third_party/re2/util/pcre.h | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/third_party/re2/util/pcre.h b/third_party/re2/util/pcre.h +index 896b0bd..271a005 100644 +--- a/third_party/re2/util/pcre.h ++++ b/third_party/re2/util/pcre.h +@@ -163,6 +163,7 @@ + + #include "util/util.h" + #include "re2/stringpiece.h" ++#include <cstdint> + + #ifdef USEPCRE + #include <pcre.h> diff --git a/meta-python/recipes-devtools/python/python3-grpcio/0001-absl-always-use-asm-sgidefs.h.patch b/meta-python/recipes-devtools/python/python3-grpcio/0001-absl-always-use-asm-sgidefs.h.patch deleted file mode 100644 index be516ca508..0000000000 --- a/meta-python/recipes-devtools/python/python3-grpcio/0001-absl-always-use-asm-sgidefs.h.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 8f21fdfb83b0fa844a9f1f03a86a9ca46642d85e Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Thu, 9 Apr 2020 13:06:27 -0700 -Subject: [PATCH 1/2] absl: always use <asm/sgidefs.h> - -Fixes mips/musl build, since sgidefs.h is not present on all C libraries -but on linux asm/sgidefs.h is there and contains same definitions, using -that makes it portable. - -Upstream-Status: Pending - -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- - third_party/abseil-cpp/absl/base/internal/direct_mmap.h | 6 +----- - 1 file changed, 1 insertion(+), 5 deletions(-) - ---- a/third_party/abseil-cpp/absl/base/internal/direct_mmap.h -+++ b/third_party/abseil-cpp/absl/base/internal/direct_mmap.h -@@ -41,13 +41,9 @@ - - #ifdef __mips__ - // Include definitions of the ABI currently in use. --#ifdef __BIONIC__ --// Android doesn't have sgidefs.h, but does have asm/sgidefs.h, which has the -+// bionic/musl C libs don't have sgidefs.h, but do have asm/sgidefs.h, which has the - // definitions we need. - #include <asm/sgidefs.h> --#else --#include <sgidefs.h> --#endif // __BIONIC__ - #endif // __mips__ - - // SYS_mmap and SYS_munmap are not defined in Android. diff --git a/meta-python/recipes-devtools/python/python3-grpcio/0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch b/meta-python/recipes-devtools/python/python3-grpcio/0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch deleted file mode 100644 index f416ca2728..0000000000 --- a/meta-python/recipes-devtools/python/python3-grpcio/0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch +++ /dev/null @@ -1,76 +0,0 @@ -From de10fbc2386dcac3ab810c49b6977b2ee01bf426 Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Wed, 17 Feb 2021 13:30:23 -0800 -Subject: [PATCH] setup.py: Do not mix C and C++ compiler options - -EXTRA_ENV_COMPILE_ARGS is used both with CC and CXX -so using -std=c++11 or -std=gnu99 together will cause -build time errors espcially with clang - -Keep '-std=c++11' to fix native build error -with old gcc (such as gcc 5.4.0 on ubuntu 16.04), for clang -we will remove them through GRPC_PYTHON_CFLAGS at do_compile -in bb recipe. - -While export CC="gcc ", cc_args is None, it will -cause subprocess.Popen always return 1. On centos 8, if you don't -install package libatomic, there will be a native build error -`cannot find /usr/lib64/libatomic.so.1.2.0'. - -Add no harm '-g' to cc_args if cc_args is empty. - -Upstream-Status: Inappropriate [oe specific] - -Signed-off-by: Khem Raj <raj.khem@gmail.com> -Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> ---- - setup.py | 9 ++++++--- - src/python/grpcio/commands.py | 5 ++++- - 2 files changed, 10 insertions(+), 4 deletions(-) - -diff --git a/setup.py b/setup.py -index ec27fe4..b2d2d1a 100644 ---- a/setup.py -+++ b/setup.py -@@ -206,8 +206,11 @@ def check_linker_need_libatomic(): - """Test if linker on system needs libatomic.""" - code_test = (b'#include <atomic>\n' + - b'int main() { return std::atomic<int64_t>{}; }') -- cxx = shlex.split(os.environ.get('CXX', 'c++')) -- cpp_test = subprocess.Popen(cxx + ['-x', 'c++', '-std=c++14', '-'], -+ cxx, cxx_args = os.environ.get('CXX').split(' ', 1) or 'c++' -+ if not cxx_args: -+ cxx_args = "-g" -+ -+ cpp_test = subprocess.Popen([cxx, cxx_args, '-x', 'c++', '-std=c++14', '-'], - stdin=PIPE, - stdout=PIPE, - stderr=PIPE) -@@ -217,7 +220,7 @@ def check_linker_need_libatomic(): - # Double-check to see if -latomic actually can solve the problem. - # https://github.com/grpc/grpc/issues/22491 - cpp_test = subprocess.Popen( -- [cxx, '-x', 'c++', '-std=c++14', '-', '-latomic'], -+ [cxx, cxx_args, '-x', 'c++', '-std=c++14', '-', '-latomic'], - stdin=PIPE, - stdout=PIPE, - stderr=PIPE) -diff --git a/src/python/grpcio/commands.py b/src/python/grpcio/commands.py -index d93b6c7..a8c4a51 100644 ---- a/src/python/grpcio/commands.py -+++ b/src/python/grpcio/commands.py -@@ -228,7 +228,10 @@ class BuildExt(build_ext.build_ext): - """ - try: - # TODO(lidiz) Remove the generated a.out for success tests. -- cc_test = subprocess.Popen(['cc', '-x', 'c', '-std=c++14', '-'], -+ cc_test, cc_args = os.environ.get('CC').split(' ', 1) or 'gcc' -+ if not cc_args: -+ cc_args = "-g" -+ cc_test = subprocess.Popen([cc_test, cc_args, '-x', 'c', '-std=c++14', '-'], - stdin=subprocess.PIPE, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) --- -2.25.1 - diff --git a/meta-python/recipes-devtools/python/python3-grpcio/0001-zlib-Include-unistd.h-for-open-close-C-APIs.patch b/meta-python/recipes-devtools/python/python3-grpcio/0001-zlib-Include-unistd.h-for-open-close-C-APIs.patch new file mode 100644 index 0000000000..34ef7874e8 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-grpcio/0001-zlib-Include-unistd.h-for-open-close-C-APIs.patch @@ -0,0 +1,24 @@ +From 671618df3e48619f0c7a5a3acd8982374a5e43db Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Sun, 12 Feb 2023 21:25:04 -0800 +Subject: [PATCH] zlib: Include unistd.h for open/close C APIs + +Upstream-Status: Pending + +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + third_party/zlib/gzguts.h | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/third_party/zlib/gzguts.h b/third_party/zlib/gzguts.h +index f937504..341a68d 100644 +--- a/third_party/zlib/gzguts.h ++++ b/third_party/zlib/gzguts.h +@@ -18,6 +18,7 @@ + #endif + + #include <stdio.h> ++#include <unistd.h> + #include "zlib.h" + #ifdef STDC + # include <string.h> diff --git a/meta-python/recipes-devtools/python/python3-grpcio/abseil-ppc-fixes.patch b/meta-python/recipes-devtools/python/python3-grpcio/abseil-ppc-fixes.patch index e8048fe940..f39a9616d9 100644 --- a/meta-python/recipes-devtools/python/python3-grpcio/abseil-ppc-fixes.patch +++ b/meta-python/recipes-devtools/python/python3-grpcio/abseil-ppc-fixes.patch @@ -1,4 +1,7 @@ -An all-in-one patch that fixes several issues: +From 102dcce6610e6606fffd3a4986f84eb52177f8c8 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Sat, 13 Mar 2021 10:26:25 -0800 +Subject: [PATCH] An all-in-one patch that fixes several issues: 1) UnscaledCycleClock not fully implemented for ppc*-musl (disabled on musl) 2) powerpc stacktrace implementation only works on glibc (disabled on musl) @@ -7,10 +10,20 @@ An all-in-one patch that fixes several issues: Sourced from void linux +Upstream-Status: Pending Signed-off-by: Khem Raj <raj.khem@gmail.com> +Signed-off-by: Xu Huan <xuhuan.fnst@fujitsu.com> +--- + .../abseil-cpp/absl/base/internal/unscaledcycleclock.cc | 4 ++-- + .../absl/base/internal/unscaledcycleclock_config.h | 3 ++- + .../abseil-cpp/absl/debugging/internal/examine_stack.cc | 8 +++++++- + .../absl/debugging/internal/stacktrace_config.h | 2 +- + 4 files changed, 12 insertions(+), 5 deletions(-) ---- a/absl/base/internal/unscaledcycleclock.cc -+++ b/absl/base/internal/unscaledcycleclock.cc +diff --git a/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc b/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +index 05e0e7b..f11fecb 100644 +--- a/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc ++++ b/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc @@ -20,7 +20,7 @@ #include <intrin.h> #endif @@ -20,7 +33,7 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com> #ifdef __GLIBC__ #include <sys/platform/ppc.h> #elif defined(__FreeBSD__) -@@ -59,7 +59,7 @@ double UnscaledCycleClock::Frequency() { +@@ -58,7 +58,7 @@ double UnscaledCycleClock::Frequency() { return base_internal::NominalCPUFrequency(); } @@ -29,21 +42,25 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com> int64_t UnscaledCycleClock::Now() { #ifdef __GLIBC__ ---- a/absl/base/internal/unscaledcycleclock.h -+++ b/absl/base/internal/unscaledcycleclock.h -@@ -46,7 +46,8 @@ +diff --git a/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h b/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h +index 24b324a..5e232c1 100644 +--- a/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h ++++ b/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h +@@ -21,7 +21,8 @@ // The following platforms have an implementation of a hardware counter. #if defined(__i386__) || defined(__x86_64__) || defined(__aarch64__) || \ - defined(__powerpc__) || defined(__ppc__) || defined(__riscv) || \ + ((defined(__powerpc__) || defined(__ppc__)) && defined(__GLIBC__)) || \ + defined(__riscv) || \ - defined(_M_IX86) || defined(_M_X64) + defined(_M_IX86) || (defined(_M_X64) && !defined(_M_ARM64EC)) #define ABSL_HAVE_UNSCALED_CYCLECLOCK_IMPLEMENTATION 1 #else ---- a/absl/debugging/internal/examine_stack.cc -+++ b/absl/debugging/internal/examine_stack.cc -@@ -27,6 +27,10 @@ +diff --git a/third_party/abseil-cpp/absl/debugging/internal/examine_stack.cc b/third_party/abseil-cpp/absl/debugging/internal/examine_stack.cc +index 3dd6ba1..9f0601c 100644 +--- a/third_party/abseil-cpp/absl/debugging/internal/examine_stack.cc ++++ b/third_party/abseil-cpp/absl/debugging/internal/examine_stack.cc +@@ -36,6 +36,10 @@ #include <csignal> #include <cstdio> @@ -54,7 +71,7 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com> #include "absl/base/attributes.h" #include "absl/base/internal/raw_logging.h" #include "absl/base/macros.h" -@@ -63,8 +67,10 @@ void* GetProgramCounter(void* vuc) { +@@ -177,8 +181,10 @@ void* GetProgramCounter(void* const vuc) { return reinterpret_cast<void*>(context->uc_mcontext.pc); #elif defined(__powerpc64__) return reinterpret_cast<void*>(context->uc_mcontext.gp_regs[32]); @@ -66,9 +83,11 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com> #elif defined(__riscv) return reinterpret_cast<void*>(context->uc_mcontext.__gregs[REG_PC]); #elif defined(__s390__) && !defined(__s390x__) ---- a/absl/debugging/internal/stacktrace_config.h -+++ b/absl/debugging/internal/stacktrace_config.h -@@ -59,7 +59,7 @@ +diff --git a/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h b/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +index 3929b1b..23d5e50 100644 +--- a/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h ++++ b/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +@@ -60,7 +60,7 @@ #elif defined(__i386__) || defined(__x86_64__) #define ABSL_STACKTRACE_INL_HEADER \ "absl/debugging/internal/stacktrace_x86-inl.inc" diff --git a/meta-python/recipes-devtools/python/python3-grpcio/boring_ssl.patch b/meta-python/recipes-devtools/python/python3-grpcio/boring_ssl.patch deleted file mode 100644 index d12e35a993..0000000000 --- a/meta-python/recipes-devtools/python/python3-grpcio/boring_ssl.patch +++ /dev/null @@ -1,50 +0,0 @@ -From f71b32eb8a5c173fc5733847437b9485d75bb2e5 Mon Sep 17 00:00:00 2001 -From: Leon Anavi <leon.anavi@konsulko.com> -Date: Fri, 9 Apr 2021 14:06:36 +0300 -Subject: [PATCH] setup.py: Fix determining target platform - -Do not poke at the build machine to determine target platform or architecture -pass it from environment instead for cross compiling to work - -Upstream-Status: Inappropriate [OE-Specific] -Signed-off-by: Khem Raj <raj.khem@gmail.com> -Signed-off-by: Leon Anavi <leon.anavi@konsulko.com> ---- - setup.py | 11 +++++++---- - 1 file changed, 7 insertions(+), 4 deletions(-) - -diff --git a/setup.py b/setup.py -index c93d419f32..71a944a9d0 100644 ---- a/setup.py -+++ b/setup.py -@@ -116,6 +116,9 @@ def _env_bool_value(env_name, default): - BUILD_WITH_BORING_SSL_ASM = _env_bool_value('GRPC_BUILD_WITH_BORING_SSL_ASM', - 'True') - -+BORING_SSL_PLATFORM = os.environ.get('GRPC_BORING_SSL_PLATFORM', -+ 'True') -+ - # Export this environment variable to override the platform variant that will - # be chosen for boringssl assembly optimizations. This option is useful when - # crosscompiling and the host platform as obtained by distutils.utils.get_platform() -@@ -336,13 +339,13 @@ if BUILD_WITH_BORING_SSL_ASM and not BUILD_WITH_SYSTEM_OPENSSL: - LINUX_X86_64 = 'linux-x86_64' - LINUX_ARM = 'linux-arm' - LINUX_AARCH64 = 'linux-aarch64' -- if LINUX_X86_64 == boringssl_asm_platform: -+ if LINUX_X86_64 == BORING_SSL_PLATFORM: - asm_key = 'crypto_linux_x86_64' -- elif LINUX_ARM == boringssl_asm_platform: -+ elif LINUX_ARM == BORING_SSL_PLATFORM: - asm_key = 'crypto_linux_arm' -- elif LINUX_AARCH64 == boringssl_asm_platform: -+ elif LINUX_AARCH64 == BORING_SSL_PLATFORM: - asm_key = 'crypto_linux_aarch64' -- elif "mac" in boringssl_asm_platform and "x86_64" in boringssl_asm_platform: -+ elif "mac" in boringssl_asm_platform and "x86_64" in BORING_SSL_PLATFORM: - asm_key = 'crypto_mac_x86_64' - else: - print("ASM Builds for BoringSSL currently not supported on:", --- -2.17.1 - diff --git a/meta-python/recipes-devtools/python/python3-grpcio/mips_bigendian.patch b/meta-python/recipes-devtools/python/python3-grpcio/mips_bigendian.patch deleted file mode 100644 index 775afa415c..0000000000 --- a/meta-python/recipes-devtools/python/python3-grpcio/mips_bigendian.patch +++ /dev/null @@ -1,15 +0,0 @@ ---- a/third_party/boringssl-with-bazel/src/include/openssl/base.h -+++ b/third_party/boringssl-with-bazel/src/include/openssl/base.h -@@ -102,10 +102,10 @@ extern "C" { - #elif (defined(__PPC__) || defined(__powerpc__)) - #define OPENSSL_32_BIT - #define OPENSSL_PPC --#elif defined(__MIPSEL__) && !defined(__LP64__) -+#elif defined(__mips__) && !defined(__LP64__) - #define OPENSSL_32_BIT - #define OPENSSL_MIPS --#elif defined(__MIPSEL__) && defined(__LP64__) -+#elif defined(__mips__) && defined(__LP64__) - #define OPENSSL_64_BIT - #define OPENSSL_MIPS64 - #elif defined(__riscv) && __SIZEOF_POINTER__ == 8 diff --git a/meta-python/recipes-devtools/python/python3-grpcio/ppc-boringssl-support.patch b/meta-python/recipes-devtools/python/python3-grpcio/ppc-boringssl-support.patch deleted file mode 100644 index 5c9be443d8..0000000000 --- a/meta-python/recipes-devtools/python/python3-grpcio/ppc-boringssl-support.patch +++ /dev/null @@ -1,17 +0,0 @@ -Let boringSSL compile on ppc32 bit - -Upstream-Status: Pending -Signed-off-by: Khem Raj <raj.khem@gmail.com> - ---- a/third_party/boringssl-with-bazel/src/include/openssl/base.h -+++ b/third_party/boringssl-with-bazel/src/include/openssl/base.h -@@ -99,6 +99,9 @@ extern "C" { - #elif (defined(__PPC64__) || defined(__powerpc64__)) && defined(_LITTLE_ENDIAN) - #define OPENSSL_64_BIT - #define OPENSSL_PPC64LE -+#elif (defined(__PPC__) || defined(__powerpc__)) -+#define OPENSSL_32_BIT -+#define OPENSSL_PPC - #elif defined(__MIPSEL__) && !defined(__LP64__) - #define OPENSSL_32_BIT - #define OPENSSL_MIPS diff --git a/meta-python/recipes-devtools/python/python3-grpcio_1.47.0.bb b/meta-python/recipes-devtools/python/python3-grpcio_1.47.0.bb deleted file mode 100644 index 24c6e53447..0000000000 --- a/meta-python/recipes-devtools/python/python3-grpcio_1.47.0.bb +++ /dev/null @@ -1,46 +0,0 @@ -DESCRIPTION = "Google gRPC" -HOMEPAGE = "http://www.grpc.io/" -SECTION = "devel/python" -LICENSE = "Apache-2.0 & BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=6e4cf218112648d22420a84281b68b88" - -DEPENDS += "${PYTHON_PN}-protobuf" - -SRC_URI += "file://0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch" -SRC_URI:append:class-target = " file://ppc-boringssl-support.patch \ - file://boring_ssl.patch \ - file://mips_bigendian.patch \ - file://0001-absl-always-use-asm-sgidefs.h.patch \ - file://abseil-ppc-fixes.patch;patchdir=third_party/abseil-cpp \ -" -SRC_URI[sha256sum] = "5dbba95fab9b35957b4977b8904fc1fa56b302f9051eff4d7716ebb0c087f801" - -RDEPENDS:${PN} = "${PYTHON_PN}-protobuf \ - ${PYTHON_PN}-setuptools \ - ${PYTHON_PN}-six \ -" - -inherit setuptools3 -inherit pypi - -export GRPC_PYTHON_DISABLE_LIBC_COMPATIBILITY = "1" - -BORING_SSL_PLATFORM:arm = "linux-arm" -BORING_SSL_PLATFORM:x86-64 = "linux-x86_64" -BORING_SSL_PLATFORM ?= "unsupported" -export GRPC_BORING_SSL_PLATFORM = "${BORING_SSL_PLATFORM}" - -BORING_SSL:x86-64 = "1" -BORING_SSL:arm = "1" -BORING_SSL ?= "0" -export GRPC_BUILD_WITH_BORING_SSL_ASM = "${BORING_SSL}" - -GRPC_CFLAGS ?= "" -GRPC_CFLAGS:append:toolchain-clang = " -fvisibility=hidden -fno-wrapv -fno-exceptions" -export GRPC_PYTHON_CFLAGS = "${GRPC_CFLAGS}" - -CLEANBROKEN = "1" - -BBCLASSEXTEND = "native nativesdk" - -CCACHE_DISABLE = "1" diff --git a/meta-python/recipes-devtools/python/python3-grpcio_1.62.2.bb b/meta-python/recipes-devtools/python/python3-grpcio_1.62.2.bb new file mode 100644 index 0000000000..3148f63761 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-grpcio_1.62.2.bb @@ -0,0 +1,45 @@ +DESCRIPTION = "Google gRPC" +HOMEPAGE = "http://www.grpc.io/" +SECTION = "devel/python" +LICENSE = "Apache-2.0 & BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=731e401b36f8077ae0c134b59be5c906" + +DEPENDS += "python3-protobuf" + +SRC_URI += "file://0001-Include-missing-cstdint-header.patch \ + file://abseil-ppc-fixes.patch \ + file://0001-zlib-Include-unistd.h-for-open-close-C-APIs.patch \ + " +SRC_URI[sha256sum] = "c77618071d96b7a8be2c10701a98537823b9c65ba256c0b9067e0594cdbd954d" + +RDEPENDS:${PN} = "python3-protobuf" + +inherit setuptools3 +inherit pypi + +CFLAGS:append:libc-musl = " -D_LARGEFILE64_SOURCE" + +export GRPC_PYTHON_DISABLE_LIBC_COMPATIBILITY = "1" + +BORING_SSL_PLATFORM:arm = "linux-arm" +BORING_SSL_PLATFORM:x86-64 = "linux-x86_64" +BORING_SSL_PLATFORM:aarch64 = "linux-aarch64" +BORING_SSL_PLATFORM ?= "unsupported" +export GRPC_BORING_SSL_PLATFORM = "${BORING_SSL_PLATFORM}" +export GRPC_BUILD_OVERRIDE_BORING_SSL_ASM_PLATFORM = "${BORING_SSL_PLATFORM}" + +BORING_SSL:arm = "1" +BORING_SSL:x86-64 = "1" +BORING_SSL:aarch64 = "1" +BORING_SSL ?= "0" +export GRPC_BUILD_WITH_BORING_SSL_ASM = "${BORING_SSL}" + +GRPC_CFLAGS ?= "" +GRPC_CFLAGS:append:toolchain-clang = " -fvisibility=hidden -fno-wrapv -fno-exceptions" +export GRPC_PYTHON_CFLAGS = "${GRPC_CFLAGS}" + +CLEANBROKEN = "1" + +BBCLASSEXTEND = "native nativesdk" + +CCACHE_DISABLE = "1" diff --git a/meta-python/recipes-devtools/python/python3-gunicorn/run-ptest b/meta-python/recipes-devtools/python/python3-gunicorn/run-ptest index 98d73fa037..5ca7e26e8a 100644 --- a/meta-python/recipes-devtools/python/python3-gunicorn/run-ptest +++ b/meta-python/recipes-devtools/python/python3-gunicorn/run-ptest @@ -4,4 +4,4 @@ # ptests to work, so make sure there's at least one nameserver line echo "nameserver 8.8.8.8" >> /etc/resolv.conf -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-gunicorn_20.1.0.bb b/meta-python/recipes-devtools/python/python3-gunicorn_20.1.0.bb deleted file mode 100644 index f381b9df2b..0000000000 --- a/meta-python/recipes-devtools/python/python3-gunicorn_20.1.0.bb +++ /dev/null @@ -1,25 +0,0 @@ -SUMMARY = "WSGI HTTP Server for UNIX" - -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=f75f3fb94cdeab1d607e2adaa6077752" - -SRC_URI[sha256sum] = "e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8" - -inherit pypi setuptools3 ptest - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-eventlet \ - ${PYTHON_PN}-gevent \ - ${PYTHON_PN}-pytest \ -" - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/tests - cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ -} - -RDEPENDS:${PN} += "${PYTHON_PN}-setuptools ${PYTHON_PN}-fcntl" diff --git a/meta-python/recipes-devtools/python/python3-gunicorn_21.2.0.bb b/meta-python/recipes-devtools/python/python3-gunicorn_21.2.0.bb new file mode 100644 index 0000000000..9fd601c999 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-gunicorn_21.2.0.bb @@ -0,0 +1,26 @@ +SUMMARY = "WSGI HTTP Server for UNIX" + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=302423eeae97079c633da81b6a5fe35e" + +SRC_URI[sha256sum] = "88ec8bff1d634f98e61b9f65bc4bf3cd918a90806c6f5c48bc5603849ec81033" + +inherit pypi setuptools3 ptest + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-eventlet \ + python3-gevent \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} + +RDEPENDS:${PN} += "python3-setuptools python3-fcntl" diff --git a/meta-python/recipes-devtools/python/python3-h11_0.13.0.bb b/meta-python/recipes-devtools/python/python3-h11_0.14.0.bb index afc6439654..2bddefa3f0 100644 --- a/meta-python/recipes-devtools/python/python3-h11_0.13.0.bb +++ b/meta-python/recipes-devtools/python/python3-h11_0.14.0.bb @@ -5,4 +5,6 @@ LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=f5501d19c3116f4aaeef89369f458693" inherit pypi setuptools3 -SRC_URI[sha256sum] = "70813c1135087a248a4d38cc0e1a0181ffab2188141a93eaf567940c3957ff06" +SRC_URI[sha256sum] = "8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d" + +RDEPENDS:${PN} += "python3-profile" diff --git a/meta-python/recipes-devtools/python/python3-h5py/0001-Fix-Cython-3-compatibility.patch b/meta-python/recipes-devtools/python/python3-h5py/0001-Fix-Cython-3-compatibility.patch new file mode 100644 index 0000000000..aba62ddf14 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-h5py/0001-Fix-Cython-3-compatibility.patch @@ -0,0 +1,796 @@ +From 1e02dbe5533d679b9ef064078a303607a7d0542a Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin <alex@linutronix.de> +Date: Fri, 29 Dec 2023 14:33:38 +0100 +Subject: [PATCH] Fix Cython 3 compatibility + +Upstream-Status: Backport [https://github.com/h5py/h5py/pull/2345/commits] +Signed-off-by: Alexander Kanavin <alex@linutronix.de> +--- + benchmarks/benchmark_slicing.py | 12 ++++---- + docs/conf.py | 2 +- + docs/high/dataset.rst | 4 +-- + docs/high/file.rst | 6 ++-- + docs/requirements-rtd.txt | 5 ++-- + docs/vds.rst | 2 +- + docs/whatsnew/3.0.rst | 2 +- + docs/whatsnew/3.7.rst | 4 +-- + h5py/_errors.pxd | 10 +++---- + h5py/_errors.pyx | 4 +-- + h5py/_hl/base.py | 4 +-- + h5py/_hl/dataset.py | 8 ++--- + h5py/_hl/dims.py | 3 +- + h5py/_hl/files.py | 2 +- + h5py/_locks.pxi | 6 ++-- + h5py/_proxy.pyx | 4 +-- + h5py/_selector.pyx | 2 +- + h5py/api_compat.h | 13 ++++---- + h5py/api_types_hdf5.pxd | 48 +++++++++++++++--------------- + h5py/h5fd.pyx | 38 ++++++++++++++++------- + h5py/h5p.pyx | 4 +-- + h5py/h5t.pyx | 2 +- + h5py/tests/test_attrs_data.py | 2 +- + h5py/tests/test_big_endian_file.py | 4 +-- + h5py/tests/test_dataset.py | 4 +-- + h5py/tests/test_file.py | 6 ++-- + h5py/tests/test_file_alignment.py | 4 +-- + h5py/tests/test_group.py | 4 +-- + h5py/tests/test_selections.py | 2 +- + pylintrc | 2 +- + pyproject.toml | 2 +- + setup_configure.py | 2 +- + tox.ini | 2 +- + 33 files changed, 116 insertions(+), 103 deletions(-) + +diff --git a/benchmarks/benchmark_slicing.py b/benchmarks/benchmark_slicing.py +index e9a34dad..b833f012 100644 +--- a/benchmarks/benchmark_slicing.py ++++ b/benchmarks/benchmark_slicing.py +@@ -7,7 +7,7 @@ import logging + logger = logging.getLogger(__name__) + import h5py + +-#Needed for mutithreading: ++#Needed for multithreading: + from queue import Queue + from threading import Thread, Event + import multiprocessing +@@ -173,8 +173,8 @@ class SlicingBenchmark: + + if __name__ == "__main__": + logging.basicConfig(level=logging.INFO) +- benckmark = SlicingBenchmark() +- benckmark.setup() +- benckmark.time_sequential_reads() +- benckmark.time_threaded_reads() +- benckmark.teardown() ++ benchmark = SlicingBenchmark() ++ benchmark.setup() ++ benchmark.time_sequential_reads() ++ benchmark.time_threaded_reads() ++ benchmark.teardown() +diff --git a/docs/conf.py b/docs/conf.py +index 93b23939..a0f6c1ac 100644 +--- a/docs/conf.py ++++ b/docs/conf.py +@@ -109,7 +109,7 @@ pygments_style = 'sphinx' + + # The theme to use for HTML and HTML Help pages. See the documentation for + # a list of builtin themes. +-html_theme = 'default' ++html_theme = 'sphinx_rtd_theme' + + # Theme options are theme-specific and customize the look and feel of a theme + # further. For a list of options available for each theme, see the +diff --git a/docs/high/dataset.rst b/docs/high/dataset.rst +index 0f27284f..cb75fffe 100644 +--- a/docs/high/dataset.rst ++++ b/docs/high/dataset.rst +@@ -58,7 +58,7 @@ the requested ``dtype``. + Reading & writing data + ---------------------- + +-HDF5 datasets re-use the NumPy slicing syntax to read and write to the file. ++HDF5 datasets reuse the NumPy slicing syntax to read and write to the file. + Slice specifications are translated directly to HDF5 "hyperslab" + selections, and are a fast and efficient way to access data in the file. The + following slicing arguments are recognized: +@@ -464,7 +464,7 @@ Reference + >>> dset = f["MyDS"] + >>> f.close() + >>> if dset: +- ... print("datset accessible") ++ ... print("dataset accessible") + ... else: + ... print("dataset inaccessible") + dataset inaccessible +diff --git a/docs/high/file.rst b/docs/high/file.rst +index 484498ce..e757fe1a 100644 +--- a/docs/high/file.rst ++++ b/docs/high/file.rst +@@ -392,7 +392,7 @@ Data alignment + When creating datasets within files, it may be advantageous to align the offset + within the file itself. This can help optimize read and write times if the data + become aligned with the underlying hardware, or may help with parallelism with +-MPI. Unfortunately, aligning small variables to large blocks can leave alot of ++MPI. Unfortunately, aligning small variables to large blocks can leave a lot of + empty space in a file. To this effect, application developers are left with two + options to tune the alignment of data within their file. The two variables + ``alignment_threshold`` and ``alignment_interval`` in the :class:`File` +@@ -415,7 +415,7 @@ number of regions. Setting a small value can reduce the overall file size, + especially in combination with the ``libver`` option. This controls how the + overall data and metadata are laid out within the file. + +-For more information, see the offical HDF5 documentation `H5P_SET_META_BLOCK_SIZE ++For more information, see the official HDF5 documentation `H5P_SET_META_BLOCK_SIZE + <https://portal.hdfgroup.org/display/HDF5/H5P_SET_META_BLOCK_SIZE>`_. + + Reference +@@ -497,7 +497,7 @@ Reference + Only available with HDF5 >= 1.12.1 or 1.10.x >= 1.10.7. + :param alignment_threshold: Together with ``alignment_interval``, this + property ensures that any file object greater than or equal +- in size to the alignement threshold (in bytes) will be ++ in size to the alignment threshold (in bytes) will be + aligned on an address which is a multiple of alignment interval. + :param alignment_interval: This property should be used in conjunction with + ``alignment_threshold``. See the description above. For more +diff --git a/docs/requirements-rtd.txt b/docs/requirements-rtd.txt +index e67a3eee..52096927 100644 +--- a/docs/requirements-rtd.txt ++++ b/docs/requirements-rtd.txt +@@ -1,3 +1,2 @@ +-sphinx==4.3.0 +-sphinx_rtd_theme==1.0.0 +-readthedocs-sphinx-search==0.1.1 ++sphinx==7.2.6 ++sphinx_rtd_theme==1.3.0 +diff --git a/docs/vds.rst b/docs/vds.rst +index a9a7c7f6..bd47ad1c 100644 +--- a/docs/vds.rst ++++ b/docs/vds.rst +@@ -124,7 +124,7 @@ Reference + slice it to indicate which regions should be used in the virtual dataset. + + When `creating a virtual dataset <creating_vds_>`_, paths to sources present +- in the same file are changed to a ".", refering to the current file (see ++ in the same file are changed to a ".", referring to the current file (see + `H5Pset_virtual <https://portal.hdfgroup.org/display/HDF5/H5P_SET_VIRTUAL>`_). + This will keep such sources valid in case the file is renamed. + +diff --git a/docs/whatsnew/3.0.rst b/docs/whatsnew/3.0.rst +index db30ad66..ff3c2bef 100644 +--- a/docs/whatsnew/3.0.rst ++++ b/docs/whatsnew/3.0.rst +@@ -44,7 +44,7 @@ New features + See also the deprecation related to the ``external`` argument. + * Support for setting file space strategy at file creation. Includes option to + persist empty space tracking between sessions. See :class:`.File` for details. +-* More efficient writing when assiging a scalar to a chunked dataset, when the ++* More efficient writing when assigning a scalar to a chunked dataset, when the + number of elements to write is no more than the size of one chunk. + * Introduced support for the split :ref:`file driver <file_driver>` + (:pr:`1468`). +diff --git a/docs/whatsnew/3.7.rst b/docs/whatsnew/3.7.rst +index 27790254..2e822d68 100644 +--- a/docs/whatsnew/3.7.rst ++++ b/docs/whatsnew/3.7.rst +@@ -19,7 +19,7 @@ New features + include it. Alternatively, you can :ref:`build h5py from source <source_install>` + against an HDF5 build with the direct driver enabled. + * The :class:`.File` constructor contains two new parameters ``alignment_threshold``, +- and ``alignment_interval`` controling the data alignment within the HDF5 ++ and ``alignment_interval`` controlling the data alignment within the HDF5 + file (:pr:`2040`). + * :meth:`~.Group.create_dataset` and :meth:`~.Group.require_dataset` now accept + parameters ``efile_prefix`` and ``virtual_prefix`` to set a filesystem path +@@ -40,7 +40,7 @@ Bug fixes + attributes with ``track_order=True``. + * Fix for building with mpi4py on Python 3.10 (:pr:`2101`). + * Fixed fancy indexing with a boolean array for a single dimension (:pr:`2079`). +-* Avoid returning unitialised memory when reading from a chunked dataset with ++* Avoid returning uninitialised memory when reading from a chunked dataset with + missing chunks and no fill value (:pr:`2076`). + * Enable setting of fillvalue for datasets with variable length string dtype + (:pr:`2044`). +diff --git a/h5py/_errors.pxd b/h5py/_errors.pxd +index df9c1bbe..3cba6307 100644 +--- a/h5py/_errors.pxd ++++ b/h5py/_errors.pxd +@@ -23,7 +23,7 @@ cdef extern from "hdf5.h": + H5E_ARGS, # invalid arguments to routine + H5E_RESOURCE, # resource unavailable + H5E_INTERNAL, # Internal error (too specific to document) +- H5E_FILE, # file Accessability ++ H5E_FILE, # file Accessibility + H5E_IO, # Low-level I/O + H5E_FUNC, # function Entry/Exit + H5E_ATOM, # object Atom +@@ -121,7 +121,7 @@ cdef extern from "hdf5.h": + # No error + H5E_NONE_MINOR # No error + +- # File accessability errors ++ # File accessibility errors + H5E_FILEEXISTS # File already exists + H5E_FILEOPEN # File already open + H5E_CANTCREATE # Unable to create file +@@ -207,7 +207,7 @@ cdef extern from "hdf5.h": + H5E_ARGS, # invalid arguments to routine + H5E_RESOURCE, # resource unavailable + H5E_INTERNAL, # Internal error (too specific to document) +- H5E_FILE, # file Accessability ++ H5E_FILE, # file Accessibility + H5E_IO, # Low-level I/O + H5E_FUNC, # function Entry/Exit + H5E_ID, # object ID +@@ -305,7 +305,7 @@ cdef extern from "hdf5.h": + # No error + H5E_NONE_MINOR # No error + +- # File accessability errors ++ # File accessibility errors + H5E_FILEEXISTS # File already exists + H5E_FILEOPEN # File already open + H5E_CANTCREATE # Unable to create file +@@ -425,4 +425,4 @@ ctypedef struct err_cookie: + cdef err_cookie set_error_handler(err_cookie handler) + + # Set the default error handler set by silence_errors/unsilence_errors +-cdef void set_default_error_handler() nogil ++cdef void set_default_error_handler() noexcept nogil +diff --git a/h5py/_errors.pyx b/h5py/_errors.pyx +index c3bd184e..2a7524b2 100644 +--- a/h5py/_errors.pyx ++++ b/h5py/_errors.pyx +@@ -94,7 +94,7 @@ cdef struct err_data_t: + H5E_error_t err + int n + +-cdef herr_t walk_cb(unsigned int n, const H5E_error_t *desc, void *e) nogil noexcept: ++cdef herr_t walk_cb(unsigned int n, const H5E_error_t *desc, void *e) noexcept nogil: + + cdef err_data_t *ee = <err_data_t*>e + +@@ -168,7 +168,7 @@ cdef err_cookie _error_handler # Store error handler used by h5py + _error_handler.func = NULL + _error_handler.data = NULL + +-cdef void set_default_error_handler() nogil: ++cdef void set_default_error_handler() noexcept nogil: + """Set h5py's current default error handler""" + H5Eset_auto(<hid_t>H5E_DEFAULT, _error_handler.func, _error_handler.data) + +diff --git a/h5py/_hl/base.py b/h5py/_hl/base.py +index cad37053..9d261c90 100644 +--- a/h5py/_hl/base.py ++++ b/h5py/_hl/base.py +@@ -20,7 +20,7 @@ import posixpath + import numpy as np + + # The high-level interface is serialized; every public API function & method +-# is wrapped in a lock. We re-use the low-level lock because (1) it's fast, ++# is wrapped in a lock. We reuse the low-level lock because (1) it's fast, + # and (2) it eliminates the possibility of deadlocks due to out-of-order + # lock acquisition. + from .._objects import phil, with_phil +@@ -524,7 +524,7 @@ def product(nums): + # Daniel Greenfeld, BSD license), where it is attributed to bottle (Copyright + # (c) 2009-2022, Marcel Hellkamp, MIT license). + +-class cached_property(object): ++class cached_property: + def __init__(self, func): + self.__doc__ = getattr(func, "__doc__") + self.func = func +diff --git a/h5py/_hl/dataset.py b/h5py/_hl/dataset.py +index b69aba48..77b202d2 100644 +--- a/h5py/_hl/dataset.py ++++ b/h5py/_hl/dataset.py +@@ -334,10 +334,10 @@ class ChunkIterator: + self._layout = dset.chunks + if source_sel is None: + # select over entire dataset +- slices = [] +- for dim in range(rank): +- slices.append(slice(0, self._shape[dim])) +- self._sel = tuple(slices) ++ self._sel = tuple( ++ slice(0, self._shape[dim]) ++ for dim in range(rank) ++ ) + else: + if isinstance(source_sel, slice): + self._sel = (source_sel,) +diff --git a/h5py/_hl/dims.py b/h5py/_hl/dims.py +index d3c9206b..0cf4c9f3 100644 +--- a/h5py/_hl/dims.py ++++ b/h5py/_hl/dims.py +@@ -53,8 +53,7 @@ class DimensionProxy(base.CommonStateObject): + + @with_phil + def __iter__(self): +- for k in self.keys(): +- yield k ++ yield from self.keys() + + @with_phil + def __len__(self): +diff --git a/h5py/_hl/files.py b/h5py/_hl/files.py +index aa4fb78d..bfcf3098 100644 +--- a/h5py/_hl/files.py ++++ b/h5py/_hl/files.py +@@ -480,7 +480,7 @@ class File(Group): + + alignment_threshold + Together with ``alignment_interval``, this property ensures that +- any file object greater than or equal in size to the alignement ++ any file object greater than or equal in size to the alignment + threshold (in bytes) will be aligned on an address which is a + multiple of alignment interval. + +diff --git a/h5py/_locks.pxi b/h5py/_locks.pxi +index bc8b2dd9..1ec4e2fc 100644 +--- a/h5py/_locks.pxi ++++ b/h5py/_locks.pxi +@@ -63,7 +63,7 @@ cdef class FastRLock: + return self._owner == pythread.PyThread_get_thread_ident() + + +-cdef inline bint lock_lock(FastRLock lock, long current_thread, bint blocking) nogil: ++cdef inline bint lock_lock(FastRLock lock, long current_thread, bint blocking) noexcept nogil: + # Note that this function *must* hold the GIL when being called. + # We just use 'nogil' in the signature to make sure that no Python + # code execution slips in that might free the GIL +@@ -83,7 +83,7 @@ cdef inline bint lock_lock(FastRLock lock, long current_thread, bint blocking) n + lock, current_thread, + pythread.WAIT_LOCK if blocking else pythread.NOWAIT_LOCK) + +-cdef bint _acquire_lock(FastRLock lock, long current_thread, int wait) nogil: ++cdef bint _acquire_lock(FastRLock lock, long current_thread, int wait) noexcept nogil: + # Note that this function *must* hold the GIL when being called. + # We just use 'nogil' in the signature to make sure that no Python + # code execution slips in that might free the GIL +@@ -111,7 +111,7 @@ cdef bint _acquire_lock(FastRLock lock, long current_thread, int wait) nogil: + lock._count = 1 + return 1 + +-cdef inline void unlock_lock(FastRLock lock) nogil: ++cdef inline void unlock_lock(FastRLock lock) noexcept nogil: + # Note that this function *must* hold the GIL when being called. + # We just use 'nogil' in the signature to make sure that no Python + # code execution slips in that might free the GIL +diff --git a/h5py/_proxy.pyx b/h5py/_proxy.pyx +index 46b4fe0d..e40504f5 100644 +--- a/h5py/_proxy.pyx ++++ b/h5py/_proxy.pyx +@@ -241,7 +241,7 @@ ctypedef struct h5py_scatter_t: + void* buf + + cdef herr_t h5py_scatter_cb(void* elem, hid_t type_id, unsigned ndim, +- const hsize_t *point, void *operator_data) nogil except -1: ++ const hsize_t *point, void *operator_data) except -1 nogil: + cdef h5py_scatter_t* info = <h5py_scatter_t*>operator_data + + memcpy(elem, (<char*>info[0].buf)+((info[0].i)*(info[0].elsize)), +@@ -252,7 +252,7 @@ cdef herr_t h5py_scatter_cb(void* elem, hid_t type_id, unsigned ndim, + return 0 + + cdef herr_t h5py_gather_cb(void* elem, hid_t type_id, unsigned ndim, +- const hsize_t *point, void *operator_data) nogil except -1: ++ const hsize_t *point, void *operator_data) except -1 nogil: + cdef h5py_scatter_t* info = <h5py_scatter_t*>operator_data + + memcpy((<char*>info[0].buf)+((info[0].i)*(info[0].elsize)), elem, +diff --git a/h5py/_selector.pyx b/h5py/_selector.pyx +index 8b858c82..69970176 100644 +--- a/h5py/_selector.pyx ++++ b/h5py/_selector.pyx +@@ -341,7 +341,7 @@ cdef class Reader: + + arr = PyArray_ZEROS(arr_rank, arr_shape, self.np_typenum, 0) + if not self.native_byteorder: +- arr = arr.newbyteorder() ++ arr = arr.view(arr.dtype.newbyteorder()) + finally: + efree(arr_shape) + +diff --git a/h5py/api_compat.h b/h5py/api_compat.h +index 52917f4d..a359e827 100644 +--- a/h5py/api_compat.h ++++ b/h5py/api_compat.h +@@ -24,7 +24,6 @@ typedef void *PyMPI_MPI_Message; + #include <stddef.h> + #include "Python.h" + #include "numpy/arrayobject.h" +-#include "hdf5.h" + + /* The HOFFSET macro can't be used from Cython. */ + +@@ -35,14 +34,14 @@ typedef void *PyMPI_MPI_Message; + #define h5py_size_n256 (sizeof(npy_complex256)) + #endif + +-#define h5py_offset_n64_real (HOFFSET(npy_complex64, real)) +-#define h5py_offset_n64_imag (HOFFSET(npy_complex64, imag)) +-#define h5py_offset_n128_real (HOFFSET(npy_complex128, real)) +-#define h5py_offset_n128_imag (HOFFSET(npy_complex128, imag)) ++#define h5py_offset_n64_real (0) ++#define h5py_offset_n64_imag (sizeof(float)) ++#define h5py_offset_n128_real (0) ++#define h5py_offset_n128_imag (sizeof(double)) + + #ifdef NPY_COMPLEX256 +-#define h5py_offset_n256_real (HOFFSET(npy_complex256, real)) +-#define h5py_offset_n256_imag (HOFFSET(npy_complex256, imag)) ++#define h5py_offset_n256_real (0) ++#define h5py_offset_n256_imag (sizeof(long double)) + #endif + + #endif +diff --git a/h5py/api_types_hdf5.pxd b/h5py/api_types_hdf5.pxd +index a198f105..099e0f58 100644 +--- a/h5py/api_types_hdf5.pxd ++++ b/h5py/api_types_hdf5.pxd +@@ -257,27 +257,27 @@ cdef extern from "hdf5.h": + herr_t (*sb_encode)(H5FD_t *file, char *name, unsigned char *p) + herr_t (*sb_decode)(H5FD_t *f, const char *name, const unsigned char *p) + size_t fapl_size +- void * (*fapl_get)(H5FD_t *file) +- void * (*fapl_copy)(const void *fapl) +- herr_t (*fapl_free)(void *fapl) ++ void * (*fapl_get)(H5FD_t *file) except * ++ void * (*fapl_copy)(const void *fapl) except * ++ herr_t (*fapl_free)(void *fapl) except -1 + size_t dxpl_size + void * (*dxpl_copy)(const void *dxpl) + herr_t (*dxpl_free)(void *dxpl) +- H5FD_t *(*open)(const char *name, unsigned flags, hid_t fapl, haddr_t maxaddr) +- herr_t (*close)(H5FD_t *file) ++ H5FD_t *(*open)(const char *name, unsigned flags, hid_t fapl, haddr_t maxaddr) except * ++ herr_t (*close)(H5FD_t *file) except -1 + int (*cmp)(const H5FD_t *f1, const H5FD_t *f2) + herr_t (*query)(const H5FD_t *f1, unsigned long *flags) + herr_t (*get_type_map)(const H5FD_t *file, H5FD_mem_t *type_map) + haddr_t (*alloc)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size) + herr_t (*free)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, hsize_t size) +- haddr_t (*get_eoa)(const H5FD_t *file, H5FD_mem_t type) +- herr_t (*set_eoa)(H5FD_t *file, H5FD_mem_t type, haddr_t addr) +- haddr_t (*get_eof)(const H5FD_t *file, H5FD_mem_t type) ++ haddr_t (*get_eoa)(const H5FD_t *file, H5FD_mem_t type) noexcept ++ herr_t (*set_eoa)(H5FD_t *file, H5FD_mem_t type, haddr_t addr) noexcept ++ haddr_t (*get_eof)(const H5FD_t *file, H5FD_mem_t type) except -1 + herr_t (*get_handle)(H5FD_t *file, hid_t fapl, void**file_handle) +- herr_t (*read)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, void *buffer) +- herr_t (*write)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, const void *buffer) +- herr_t (*flush)(H5FD_t *file, hid_t dxpl_id, hbool_t closing) +- herr_t (*truncate)(H5FD_t *file, hid_t dxpl_id, hbool_t closing) ++ herr_t (*read)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, void *buffer) except * ++ herr_t (*write)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, const void *buffer) except * ++ herr_t (*flush)(H5FD_t *file, hid_t dxpl_id, hbool_t closing) except -1 ++ herr_t (*truncate)(H5FD_t *file, hid_t dxpl_id, hbool_t closing) except -1 + herr_t (*lock)(H5FD_t *file, hbool_t rw) + herr_t (*unlock)(H5FD_t *file) + H5FD_mem_t fl_map[<int>H5FD_MEM_NTYPES] +@@ -295,27 +295,27 @@ cdef extern from "hdf5.h": + herr_t (*sb_encode)(H5FD_t *file, char *name, unsigned char *p) + herr_t (*sb_decode)(H5FD_t *f, const char *name, const unsigned char *p) + size_t fapl_size +- void * (*fapl_get)(H5FD_t *file) +- void * (*fapl_copy)(const void *fapl) +- herr_t (*fapl_free)(void *fapl) ++ void * (*fapl_get)(H5FD_t *file) except * ++ void * (*fapl_copy)(const void *fapl) except * ++ herr_t (*fapl_free)(void *fapl) except -1 + size_t dxpl_size + void * (*dxpl_copy)(const void *dxpl) + herr_t (*dxpl_free)(void *dxpl) +- H5FD_t *(*open)(const char *name, unsigned flags, hid_t fapl, haddr_t maxaddr) +- herr_t (*close)(H5FD_t *file) ++ H5FD_t *(*open)(const char *name, unsigned flags, hid_t fapl, haddr_t maxaddr) except * ++ herr_t (*close)(H5FD_t *file) except -1 + int (*cmp)(const H5FD_t *f1, const H5FD_t *f2) + herr_t (*query)(const H5FD_t *f1, unsigned long *flags) + herr_t (*get_type_map)(const H5FD_t *file, H5FD_mem_t *type_map) + haddr_t (*alloc)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size) + herr_t (*free)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, hsize_t size) +- haddr_t (*get_eoa)(const H5FD_t *file, H5FD_mem_t type) +- herr_t (*set_eoa)(H5FD_t *file, H5FD_mem_t type, haddr_t addr) +- haddr_t (*get_eof)(const H5FD_t *file, H5FD_mem_t type) ++ haddr_t (*get_eoa)(const H5FD_t *file, H5FD_mem_t type) noexcept ++ herr_t (*set_eoa)(H5FD_t *file, H5FD_mem_t type, haddr_t addr) noexcept ++ haddr_t (*get_eof)(const H5FD_t *file, H5FD_mem_t type) except -1 + herr_t (*get_handle)(H5FD_t *file, hid_t fapl, void**file_handle) +- herr_t (*read)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, void *buffer) +- herr_t (*write)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, const void *buffer) +- herr_t (*flush)(H5FD_t *file, hid_t dxpl_id, hbool_t closing) +- herr_t (*truncate)(H5FD_t *file, hid_t dxpl_id, hbool_t closing) ++ herr_t (*read)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, void *buffer) except * ++ herr_t (*write)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, const void *buffer) except * ++ herr_t (*flush)(H5FD_t *file, hid_t dxpl_id, hbool_t closing) except -1 ++ herr_t (*truncate)(H5FD_t *file, hid_t dxpl_id, hbool_t closing) except -1 + herr_t (*lock)(H5FD_t *file, hbool_t rw) + herr_t (*unlock)(H5FD_t *file) + H5FD_mem_t fl_map[<int>H5FD_MEM_NTYPES] +diff --git a/h5py/h5fd.pyx b/h5py/h5fd.pyx +index e9746057..d39cf68f 100644 +--- a/h5py/h5fd.pyx ++++ b/h5py/h5fd.pyx +@@ -144,10 +144,10 @@ cdef herr_t H5FD_fileobj_close(H5FD_fileobj_t *f) except -1 with gil: + stdlib_free(f) + return 0 + +-cdef haddr_t H5FD_fileobj_get_eoa(const H5FD_fileobj_t *f, H5FD_mem_t type): ++cdef haddr_t H5FD_fileobj_get_eoa(const H5FD_fileobj_t *f, H5FD_mem_t type) noexcept nogil: + return f.eoa + +-cdef herr_t H5FD_fileobj_set_eoa(H5FD_fileobj_t *f, H5FD_mem_t type, haddr_t addr): ++cdef herr_t H5FD_fileobj_set_eoa(H5FD_fileobj_t *f, H5FD_mem_t type, haddr_t addr) noexcept nogil: + f.eoa = addr + return 0 + +@@ -191,22 +191,38 @@ cdef herr_t H5FD_fileobj_flush(H5FD_fileobj_t *f, hid_t dxpl, hbool_t closing) e + cdef H5FD_class_t info + memset(&info, 0, sizeof(info)) + ++# Cython doesn't support "except X" in casting definition currently ++ctypedef herr_t (*file_free_func_ptr)(void *) except -1 ++ ++ctypedef herr_t (*file_close_func_ptr)(H5FD_t *) except -1 ++ctypedef haddr_t (*file_get_eoa_func_ptr)(const H5FD_t *, H5FD_mem_t) noexcept ++ctypedef herr_t (*file_set_eof_func_ptr)(H5FD_t *, H5FD_mem_t, haddr_t) noexcept ++ctypedef haddr_t (*file_get_eof_func_ptr)(const H5FD_t *, H5FD_mem_t) except -1 ++ctypedef herr_t (*file_read_func_ptr)(H5FD_t *, H5FD_mem_t, hid_t, haddr_t, size_t, void*) except -1 ++ctypedef herr_t (*file_write_func_ptr)(H5FD_t *, H5FD_mem_t, hid_t, haddr_t, size_t, const void*) except -1 ++ctypedef herr_t (*file_truncate_func_ptr)(H5FD_t *, hid_t, hbool_t) except -1 ++ctypedef herr_t (*file_flush_func_ptr)(H5FD_t *, hid_t, hbool_t) except -1 ++ ++ + info.name = 'fileobj' + info.maxaddr = libc.stdint.SIZE_MAX - 1 + info.fc_degree = H5F_CLOSE_WEAK + info.fapl_size = sizeof(PyObject *) + info.fapl_get = <void *(*)(H5FD_t *)>H5FD_fileobj_fapl_get + info.fapl_copy = <void *(*)(const void *)>H5FD_fileobj_fapl_copy +-info.fapl_free = <herr_t (*)(void *)>H5FD_fileobj_fapl_free ++ ++info.fapl_free = <file_free_func_ptr>H5FD_fileobj_fapl_free ++ + info.open = <H5FD_t *(*)(const char *name, unsigned flags, hid_t fapl, haddr_t maxaddr)>H5FD_fileobj_open +-info.close = <herr_t (*)(H5FD_t *)>H5FD_fileobj_close +-info.get_eoa = <haddr_t (*)(const H5FD_t *, H5FD_mem_t)>H5FD_fileobj_get_eoa +-info.set_eoa = <herr_t (*)(H5FD_t *, H5FD_mem_t, haddr_t)>H5FD_fileobj_set_eoa +-info.get_eof = <haddr_t (*)(const H5FD_t *, H5FD_mem_t)>H5FD_fileobj_get_eof +-info.read = <herr_t (*)(H5FD_t *, H5FD_mem_t, hid_t, haddr_t, size_t, void *)>H5FD_fileobj_read +-info.write = <herr_t (*)(H5FD_t *, H5FD_mem_t, hid_t, haddr_t, size_t, const void *)>H5FD_fileobj_write +-info.truncate = <herr_t (*)(H5FD_t *, hid_t, hbool_t)>H5FD_fileobj_truncate +-info.flush = <herr_t (*)(H5FD_t *, hid_t, hbool_t)>H5FD_fileobj_flush ++ ++info.close = <file_close_func_ptr>H5FD_fileobj_close ++info.get_eoa = <file_get_eoa_func_ptr>H5FD_fileobj_get_eoa ++info.set_eoa = <file_set_eof_func_ptr>H5FD_fileobj_set_eoa ++info.get_eof = <file_get_eof_func_ptr>H5FD_fileobj_get_eof ++info.read = <file_read_func_ptr>H5FD_fileobj_read ++info.write = <file_write_func_ptr>H5FD_fileobj_write ++info.truncate = <file_truncate_func_ptr>H5FD_fileobj_truncate ++info.flush = <file_flush_func_ptr>H5FD_fileobj_flush + # H5FD_FLMAP_DICHOTOMY + info.fl_map = [H5FD_MEM_SUPER, # default + H5FD_MEM_SUPER, # super +diff --git a/h5py/h5p.pyx b/h5py/h5p.pyx +index 779ea1b5..dc8bf65a 100644 +--- a/h5py/h5p.pyx ++++ b/h5py/h5p.pyx +@@ -1177,7 +1177,7 @@ cdef class PropFAID(PropInstanceID): + size_t block_size IN: File system block size + size_t cbuf_size IN: Copy buffer size + +- Properites with value of 0 indicate that the HDF5 library should ++ Properties with value of 0 indicate that the HDF5 library should + choose the value. + """ + H5Pset_fapl_direct(self.id, alignment, block_size, cbuf_size) +@@ -1761,7 +1761,7 @@ cdef class PropOCID(PropCreateID): + + max_compact -- maximum number of attributes to be stored in compact storage(default:8) + must be greater than or equal to min_dense +- min_dense -- minmum number of attributes to be stored in dense storage(default:6) ++ min_dense -- minimum number of attributes to be stored in dense storage(default:6) + + """ + H5Pset_attr_phase_change(self.id, max_compact, min_dense) +diff --git a/h5py/h5t.pyx b/h5py/h5t.pyx +index e7aae14f..b9d7e74d 100644 +--- a/h5py/h5t.pyx ++++ b/h5py/h5t.pyx +@@ -1938,7 +1938,7 @@ def check_dtype(**kwds): + + vlen = dtype + If the dtype represents an HDF5 vlen, returns the Python base class. +- Currently only builting string vlens (str) are supported. Returns ++ Currently only built-in string vlens (str) are supported. Returns + None if the dtype does not represent an HDF5 vlen. + + enum = dtype +diff --git a/h5py/tests/test_attrs_data.py b/h5py/tests/test_attrs_data.py +index 56481ca0..5083a1aa 100644 +--- a/h5py/tests/test_attrs_data.py ++++ b/h5py/tests/test_attrs_data.py +@@ -262,7 +262,7 @@ class TestEmpty(BaseAttrs): + self.assertTrue(is_empty_dataspace(h5a.open(self.f.id, b'y'))) + + def test_modify(self): +- with self.assertRaises(IOError): ++ with self.assertRaises(OSError): + self.f.attrs.modify('x', 1) + + def test_values(self): +diff --git a/h5py/tests/test_big_endian_file.py b/h5py/tests/test_big_endian_file.py +index 4d81de01..170b5bcc 100644 +--- a/h5py/tests/test_big_endian_file.py ++++ b/h5py/tests/test_big_endian_file.py +@@ -24,14 +24,14 @@ def test_vlen_big_endian(): + assert dset[4] == 1.2 + assert dset.dtype == "<f8" + +- # Same float values with big endianess ++ # Same float values with big endianness + assert f["DSBEfloat"][0] == 3.14 + assert f["DSBEfloat"].dtype == ">f8" + + assert f["DSLEint"][0] == 1 + assert f["DSLEint"].dtype == "<u8" + +- # Same int values with big endianess ++ # Same int values with big endianness + assert f["DSBEint"][0] == 1 + assert f["DSBEint"].dtype == ">i8" + +diff --git a/h5py/tests/test_dataset.py b/h5py/tests/test_dataset.py +index e104dd53..0ffa5c80 100644 +--- a/h5py/tests/test_dataset.py ++++ b/h5py/tests/test_dataset.py +@@ -1939,9 +1939,9 @@ class TestCommutative(BaseDataset): + dset = self.f.create_dataset("test", shape, dtype=float, + data=np.random.rand(*shape)) + +- # grab a value from the elements, ie dset[0] ++ # grab a value from the elements, ie dset[0, 0] + # check that mask arrays are commutative wrt ==, != +- val = np.float64(dset[0]) ++ val = np.float64(dset[0, 0]) + + assert np.all((val == dset) == (dset == val)) + assert np.all((val != dset) == (dset != val)) +diff --git a/h5py/tests/test_file.py b/h5py/tests/test_file.py +index b47d408e..1aa38731 100644 +--- a/h5py/tests/test_file.py ++++ b/h5py/tests/test_file.py +@@ -326,7 +326,7 @@ class TestDrivers(TestCase): + # could be an integer multiple of 512 + # + # To allow HDF5 to do the heavy lifting for different platform, +- # We didn't provide any argumnets to the first call ++ # We didn't provide any arguments to the first call + # and obtained HDF5's default values there. + + # Testing creation with a few different property lists +@@ -639,9 +639,9 @@ class TestUnicode(TestCase): + Modes 'r' and 'r+' do not create files even when given unicode names + """ + fname = self.mktemp(prefix=chr(0x201a)) +- with self.assertRaises(IOError): ++ with self.assertRaises(OSError): + File(fname, 'r') +- with self.assertRaises(IOError): ++ with self.assertRaises(OSError): + File(fname, 'r+') + + +diff --git a/h5py/tests/test_file_alignment.py b/h5py/tests/test_file_alignment.py +index c280bb76..da13ee04 100644 +--- a/h5py/tests/test_file_alignment.py ++++ b/h5py/tests/test_file_alignment.py +@@ -50,7 +50,7 @@ class TestFileAlignment(TestCase): + alignment_interval = 4096 + + for shape in [ +- (1033,), # A prime number above the thresold ++ (1033,), # A prime number above the threshold + (1000,), # Exactly equal to the threshold + (1001,), # one above the threshold + ]: +@@ -75,7 +75,7 @@ class TestFileAlignment(TestCase): + alignment_interval = 1024 + + for shape in [ +- (881,), # A prime number below the thresold ++ (881,), # A prime number below the threshold + (999,), # Exactly one below the threshold + ]: + fname = self.mktemp() +diff --git a/h5py/tests/test_group.py b/h5py/tests/test_group.py +index 328c352a..4af1fb1f 100644 +--- a/h5py/tests/test_group.py ++++ b/h5py/tests/test_group.py +@@ -771,7 +771,7 @@ class TestExternalLinks(TestCase): + with self.assertRaises(KeyError): + self.f['ext'] + +- # I would prefer IOError but there's no way to fix this as the exception ++ # I would prefer OSError but there's no way to fix this as the exception + # class is determined by HDF5. + def test_exc_missingfile(self): + """ KeyError raised when attempting to open missing file """ +@@ -844,7 +844,7 @@ class TestExtLinkBugs(TestCase): + try: + if x: + x.close() +- except IOError: ++ except OSError: + pass + return w + orig_name = self.mktemp() +diff --git a/h5py/tests/test_selections.py b/h5py/tests/test_selections.py +index 0b1722d7..01f6dcb7 100644 +--- a/h5py/tests/test_selections.py ++++ b/h5py/tests/test_selections.py +@@ -65,7 +65,7 @@ class TestTypeGeneration(BaseSelection): + self.assertEqual(out, np.dtype('i')) + self.assertEqual(format, np.dtype( [('a','i')] )) + +- # Field does not apear in named typed ++ # Field does not appear in named typed + with self.assertRaises(ValueError): + out, format = sel2.read_dtypes(dt, ('j', 'k')) + +diff --git a/pylintrc b/pylintrc +index 045df2f7..2401d3b0 100644 +--- a/pylintrc ++++ b/pylintrc +@@ -44,7 +44,7 @@ confidence= + # can either give multiple identifiers separated by comma (,) or put this + # option multiple times (only on the command line, not in the configuration + # file where it should appear only once).You can also use "--disable=all" to +-# disable everything first and then reenable specific checks. For example, if ++# disable everything first and then re-enable specific checks. For example, if + # you want to run only the similarities checker, you can use "--disable=all + # --enable=similarities". If you want to run only the classes checker, but have + # no Warning level messages displayed, use"--disable=all --enable=classes +diff --git a/pyproject.toml b/pyproject.toml +index ee573d2f..717200ef 100644 +--- a/pyproject.toml ++++ b/pyproject.toml +@@ -1,6 +1,6 @@ + [build-system] + requires = [ +- "Cython >=0.29.31,<1", ++ "Cython >=0.29.31,<4", + "oldest-supported-numpy", + "pkgconfig", + "setuptools >=61", +diff --git a/setup_configure.py b/setup_configure.py +index 0fba53ba..c3b86a64 100644 +--- a/setup_configure.py ++++ b/setup_configure.py +@@ -165,7 +165,7 @@ class BuildConfig: + try: + if pkgconfig.exists(pc_name): + pc = pkgconfig.parse(pc_name) +- except EnvironmentError: ++ except OSError: + if os.name != 'nt': + print( + "Building h5py requires pkg-config unless the HDF5 path " +diff --git a/tox.ini b/tox.ini +index 0efb88a6..86a176dd 100644 +--- a/tox.ini ++++ b/tox.ini +@@ -65,7 +65,7 @@ skip_install=True + package_env = DUMMY NON-EXISTENT ENV NAME + changedir=docs + deps= +- sphinx ++ -r docs/requirements-rtd.txt + commands= + sphinx-build -W -b html -d {envtmpdir}/doctrees . {envtmpdir}/html + diff --git a/meta-python/recipes-devtools/python/python3-h5py/0001-setup.py-Fix-numpy-version.patch b/meta-python/recipes-devtools/python/python3-h5py/0001-setup.py-Fix-numpy-version.patch deleted file mode 100644 index 9b79cc5395..0000000000 --- a/meta-python/recipes-devtools/python/python3-h5py/0001-setup.py-Fix-numpy-version.patch +++ /dev/null @@ -1,28 +0,0 @@ -From b1d4d171fd13624f3d8bb917f716b62494066501 Mon Sep 17 00:00:00 2001 -From: Leon Anavi <leon.anavi@konsulko.com> -Date: Mon, 22 Feb 2021 18:42:43 +0200 -Subject: [PATCH] setup.py: Fix numpy version - -Fix numpy version to ensure bitbake will find the pip package. - -Upstream-Status: Inappropriate [oe specific] - -Signed-off-by: Leon Anavi <leon.anavi@konsulko.com> - ---- - setup.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/setup.py b/setup.py -index 4b2890c..42ba21b 100755 ---- a/setup.py -+++ b/setup.py -@@ -49,7 +49,7 @@ SETUP_REQUIRES = [ - "Cython >=0.29.14; python_version=='3.8'", - "Cython >=0.29.15; python_version>='3.9'", - ] + [ -- f"numpy =={np_min}; python_version{py_condition}" -+ f"numpy >={np_min}; python_version{py_condition}" - for np_min, py_condition in NUMPY_MIN_VERSIONS - ] - diff --git a/meta-python/recipes-devtools/python/python3-h5py_3.7.0.bb b/meta-python/recipes-devtools/python/python3-h5py_3.10.0.bb index 1153ea32ce..8a9158525e 100644 --- a/meta-python/recipes-devtools/python/python3-h5py_3.7.0.bb +++ b/meta-python/recipes-devtools/python/python3-h5py_3.10.0.bb @@ -4,11 +4,10 @@ SECTION = "devel/python" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=113251d71fb0384712c719b567261c5c" -SRC_URI[sha256sum] = "3fcf37884383c5da64846ab510190720027dca0768def34dd8dcb659dbe5cbf3" +SRC_URI[sha256sum] = "d93adc48ceeb33347eb24a634fb787efc7ae4644e6ea4ba733d099605045c049" -SRC_URI:append = " \ - file://0001-setup_build.py-avoid-absolute-path.patch \ - " +SRC_URI += "file://0001-setup_build.py-avoid-absolute-path.patch \ + file://0001-Fix-Cython-3-compatibility.patch" inherit pkgconfig pypi setuptools3 @@ -23,9 +22,19 @@ DEPENDS = "python3-pkgconfig-native \ hdf5 \ " +PACKAGESPLITFUNCS =+ "fix_cythonized_sources" + +fix_cythonized_sources() { + for f in `grep -l -r -e '\/* Generated by Cython.*/$' ${PKGD}${TARGET_DBGSRC_DIR}`; do + if [ -e $f ]; then + sed -i -e 's#${RECIPE_SYSROOT_NATIVE}##g' $f + fi + done +} + RDEPENDS:${PN} = "python3-numpy \ python3-six \ python3-json \ " -export HDF5_VERSION="1.8.21" +export HDF5_VERSION="1.14.0" diff --git a/meta-python/recipes-devtools/python/python3-haversine_2.6.0.bb b/meta-python/recipes-devtools/python/python3-haversine_2.8.1.bb index 65779187a1..e45ae79860 100644 --- a/meta-python/recipes-devtools/python/python3-haversine_2.6.0.bb +++ b/meta-python/recipes-devtools/python/python3-haversine_2.8.1.bb @@ -2,7 +2,7 @@ SUMMARY = "Calculate the distance between 2 points on Earth" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" -SRC_URI[sha256sum] = "eb7c308ba721e86662c1d50427cb9b06f9e7eb9984803d9ec200582425cc4fb7" +SRC_URI[sha256sum] = "ab750caa0c8f2168bd7b00a429757a83a8393be1aa30f91c2becf6b523189e2a" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-hexbytes_0.2.3.bb b/meta-python/recipes-devtools/python/python3-hexbytes_1.0.0.bb index 534cc88e1d..951998b5a1 100644 --- a/meta-python/recipes-devtools/python/python3-hexbytes_0.2.3.bb +++ b/meta-python/recipes-devtools/python/python3-hexbytes_1.0.0.bb @@ -2,8 +2,8 @@ SUMMARY = "Python bytes subclass that decodes hex, with a readable console outpu HOMEPAGE = "https://github.com/ethereum/hexbytes" SECTION = "devel/python" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=287820ad3553117aa2f92bf84c219324" +LIC_FILES_CHKSUM = "file://LICENSE;md5=16ffc86adf4293d4cfb204e77d62cfe6" -SRC_URI[sha256sum] = "199daa356aeb14879ee9c43de637acaaa1409febf15151a0e3dbcf1f8df128c0" +SRC_URI[sha256sum] = "18e6e3279a13878b93fb85da77822dc506b7048065a588e74141c2468a65ad8c" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-html2text/run-ptest b/meta-python/recipes-devtools/python/python3-html2text/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-html2text/run-ptest +++ b/meta-python/recipes-devtools/python/python3-html2text/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-html2text_2020.1.16.bb b/meta-python/recipes-devtools/python/python3-html2text_2020.1.16.bb index 64873d2464..d96f61bdc7 100644 --- a/meta-python/recipes-devtools/python/python3-html2text_2020.1.16.bb +++ b/meta-python/recipes-devtools/python/python3-html2text_2020.1.16.bb @@ -14,9 +14,12 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " +RDEPENDS:${PN} += "python3-cgitb" + do_install_ptest() { install -d ${D}${PTEST_PATH}/test cp -rf ${S}/test/* ${D}${PTEST_PATH}/test/ diff --git a/meta-python/recipes-devtools/python/python3-html5lib_1.1.bb b/meta-python/recipes-devtools/python/python3-html5lib_1.1.bb index ee44e837e1..d6272a07c3 100644 --- a/meta-python/recipes-devtools/python/python3-html5lib_1.1.bb +++ b/meta-python/recipes-devtools/python/python3-html5lib_1.1.bb @@ -8,10 +8,10 @@ SRC_URI[sha256sum] = "b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c1 inherit pypi setuptools3 RDEPENDS:${PN} += "\ - ${PYTHON_PN}-lxml \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-webencodings \ - ${PYTHON_PN}-xml \ + python3-lxml \ + python3-six \ + python3-webencodings \ + python3-xml \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-httpcore_1.0.3.bb b/meta-python/recipes-devtools/python/python3-httpcore_1.0.3.bb new file mode 100644 index 0000000000..203bfd48a1 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-httpcore_1.0.3.bb @@ -0,0 +1,26 @@ +SUMMARY = "A minimal low-level HTTP client." +SECTION = "devel/python" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE.md;md5=1c1f23b073da202e1f4f9e426490210c" + +inherit pypi python_hatchling + +SRC_URI[sha256sum] = "5c0f9546ad17dac4d0772b0808856eb616eb8b48ce94f49ed819fd6982a8a544" + +DEPENDS += "\ + python3-hatch-fancy-pypi-readme-native \ +" + +PACKAGECONFIG ??= "" +PACKAGECONFIG[http2] = ",,,python3-h2" +PACKAGECONFIG[socks] = ",,,python3-socksio" +PACKAGECONFIG[asyncio] = ",,,python3-anyio" +# Don't provide "trio" PACKAGECONFIG as nothing provides "python3-trio" currently. +# If somebody needs this please feel free to add python3-trio and enable the +# packageconfig below: +#PACKAGECONFIG[trio] = ",,,python3-trio" + +RDEPENDS:${PN} += "\ + python3-certifi \ + python3-h11 \ +" diff --git a/meta-python/recipes-devtools/python/python3-httplib2_0.20.4.bb b/meta-python/recipes-devtools/python/python3-httplib2_0.22.0.bb index 52fd88ddf5..9318ad9182 100644 --- a/meta-python/recipes-devtools/python/python3-httplib2_0.20.4.bb +++ b/meta-python/recipes-devtools/python/python3-httplib2_0.22.0.bb @@ -4,12 +4,12 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=56e5e931172b6164b62dc7c4aba6c8cf" -SRC_URI[sha256sum] = "58a98e45b4b1a48273073f905d2961666ecf0fbac4250ea5b47aef259eb5c585" +SRC_URI[sha256sum] = "d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81" inherit pypi python_setuptools_build_meta RDEPENDS:${PN} += "\ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-pyparsing \ + python3-compression \ + python3-netclient \ + python3-pyparsing \ " diff --git a/meta-python/recipes-devtools/python/python3-httptools/run-ptest b/meta-python/recipes-devtools/python/python3-httptools/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-httptools/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-httptools_0.6.1.bb b/meta-python/recipes-devtools/python/python3-httptools_0.6.1.bb new file mode 100644 index 0000000000..4192697df2 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-httptools_0.6.1.bb @@ -0,0 +1,22 @@ +SUMMARY = "A collection of framework independent HTTP protocol utils." +HOMEPAGE = "https://github.com/MagicStack/httptools" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=0a2d82955bf3facdf04cb882655e840e" + +inherit pypi setuptools3 ptest + +SRC_URI[sha256sum] = "c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a" + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} diff --git a/meta-python/recipes-devtools/python/python3-httpx_0.27.0.bb b/meta-python/recipes-devtools/python/python3-httpx_0.27.0.bb new file mode 100644 index 0000000000..e4d3cbeee8 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-httpx_0.27.0.bb @@ -0,0 +1,48 @@ +SUMMARY = "A next generation HTTP client for Python." +SECTION = "devel/python" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE.md;md5=c624803bdf6fc1c4ce39f5ae11d7bd05" + +inherit pypi python_hatchling + +SRC_URI[sha256sum] = "a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5" + +DEPENDS += "\ + python3-hatch-fancy-pypi-readme-native \ +" + +PACKAGECONFIG ??= "" +PACKAGECONFIG[brotli] = ",,,python3-brotli" +PACKAGECONFIG[http2] = ",,,python3-h2" +PACKAGECONFIG[socks] = ",,,python3-socksio" + +RDEPENDS:${PN} += "\ + python3-anyio \ + python3-certifi \ + python3-httpcore \ + python3-idna \ + python3-sniffio \ + python3-json \ + python3-core \ + python3-netclient \ + python3-compression \ +" + +PACKAGES += "\ + ${PN}-cli \ +" + +RDEPENDS:${PN}-cli += "\ + ${PN} \ + python3-click \ + python3-pygments \ + python3-rich \ +" + +FILES:${PN} = "\ + ${libdir}/${PYTHON_DIR} \ +" + +FILES:${PN}-cli = "\ + ${bindir}/httpx \ +" diff --git a/meta-python/recipes-devtools/python/python3-huey_2.4.3.bb b/meta-python/recipes-devtools/python/python3-huey_2.5.0.bb index f8f4062a64..c6e5606090 100644 --- a/meta-python/recipes-devtools/python/python3-huey_2.4.3.bb +++ b/meta-python/recipes-devtools/python/python3-huey_2.5.0.bb @@ -5,7 +5,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=5cac039fcc82f01141cc170b48f315d4" PYPI_PACKAGE = "huey" -SRC_URI[sha256sum] = "4fa2f6055d581778c3bcf93fc8c9ce87aecc2a345d5ff35bd955da152c02ef37" +SRC_URI[sha256sum] = "2ffb52fb5c46a1b0d53c79d59df3622312b27e2ab68d81a580985a8ea4ca3480" RDEPENDS:${PN} += " \ python3-datetime \ diff --git a/meta-python/recipes-devtools/python/python3-humanfriendly_10.0.bb b/meta-python/recipes-devtools/python/python3-humanfriendly_10.0.bb index 7d185989d9..b32fe2e1d0 100644 --- a/meta-python/recipes-devtools/python/python3-humanfriendly_10.0.bb +++ b/meta-python/recipes-devtools/python/python3-humanfriendly_10.0.bb @@ -11,14 +11,14 @@ SRC_URI[sha256sum] = "6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2 inherit pypi setuptools3 RDEPENDS:${PN}:class-target += " \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-fcntl \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-math \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-stringold \ + python3-datetime \ + python3-fcntl \ + python3-io \ + python3-logging \ + python3-math \ + python3-numbers \ + python3-shell \ + python3-stringold \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-humanize_4.3.0.bb b/meta-python/recipes-devtools/python/python3-humanize_4.9.0.bb index 55386b6907..da1eea4cf7 100644 --- a/meta-python/recipes-devtools/python/python3-humanize_4.3.0.bb +++ b/meta-python/recipes-devtools/python/python3-humanize_4.9.0.bb @@ -5,17 +5,18 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENCE;md5=4ecc42519e84f6f3e23529464df7bd1d" -SRC_URI[sha256sum] = "0dfac79fe8c1c0c734c14177b07b857bad9ae30dd50daa0a14e2c3d8054ee0c4" +SRC_URI[sha256sum] = "582a265c931c683a7e9b8ed9559089dea7edcf6cc95be39a3cbc2c5d5ac2bcfa" -inherit pypi python_setuptools_build_meta +inherit pypi python_hatchling DEPENDS += "\ - ${PYTHON_PN}-setuptools-scm-native \ + python3-setuptools-scm-native \ + python3-hatch-vcs-native \ " RDEPENDS:${PN} += "\ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-setuptools \ + python3-datetime \ + python3-setuptools \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-hyperlink_21.0.0.bb b/meta-python/recipes-devtools/python/python3-hyperlink_21.0.0.bb index 7cdecf1094..a3fae39c7f 100644 --- a/meta-python/recipes-devtools/python/python3-hyperlink_21.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-hyperlink_21.0.0.bb @@ -7,7 +7,7 @@ SRC_URI[sha256sum] = "427af957daa58bc909471c6c40f74c5450fa123dd093fc53efd2e91d27 inherit pypi python_setuptools_build_meta -RDEPENDS:${PN} += "${PYTHON_PN}-stringold ${PYTHON_PN}-netclient ${PYTHON_PN}-idna" +RDEPENDS:${PN} += "python3-stringold python3-netclient python3-idna" PACKAGES =. "${PN}-test " diff --git a/meta-python/recipes-devtools/python/python3-icecream_2.1.3.bb b/meta-python/recipes-devtools/python/python3-icecream_2.1.3.bb new file mode 100644 index 0000000000..ec3a4b90f1 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-icecream_2.1.3.bb @@ -0,0 +1,17 @@ +SUMMARY = "Never use print() to debug again; inspect variables, expressions, and program execution with a single, simple function call." +HOMEPAGE = "https://github.com/gruns/icecream" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=eca5ce1610d64ed40920efdce85ff8d1" + +SRC_URI[sha256sum] = "0aa4a7c3374ec36153a1d08f81e3080e83d8ac1eefd97d2f4fe9544e8f9b49de" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-asttokens \ + python3-colorama \ + python3-executing \ + python3-numbers \ + python3-pygments \ + python3-pprint \ +" diff --git a/meta-python/recipes-devtools/python/python3-icu/0001-Fix-host-contamination-of-include-files.patch b/meta-python/recipes-devtools/python/python3-icu/0001-Fix-host-contamination-of-include-files.patch index 36485d56ce..7bb5ee58cc 100644 --- a/meta-python/recipes-devtools/python/python3-icu/0001-Fix-host-contamination-of-include-files.patch +++ b/meta-python/recipes-devtools/python/python3-icu/0001-Fix-host-contamination-of-include-files.patch @@ -10,25 +10,25 @@ Also, don't use icu-config Upstream-Status: Inappropriate [OE specific] Signed-off-by: Armin Kuster <akuster808@gmail.com> Signed-off-by: Khem Raj <raj.khem@gmail.com> - +Signed-off-by: Wang Mingyu <wangmy@fujitsu.com> --- setup.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/setup.py b/setup.py -index d308b80..56e9c74 100644 +index 176c9ab..0a10268 100644 --- a/setup.py +++ b/setup.py -@@ -81,7 +81,7 @@ Building PyICU %s for ICU %s (max ICU major version supported: %s) +@@ -68,7 +68,7 @@ elif platform.startswith('freebsd'): CONFIGURE_WITH_ICU_CONFIG = { - 'darwin': True, + 'darwin': False, - 'linux': True, + 'linux': False, 'freebsd': False, # not tested 'win32': False, # no icu-config 'sunos5': False, # not tested -@@ -273,7 +273,6 @@ setup(name="PyICU", +@@ -277,7 +277,6 @@ setup(name="PyICU", ext_modules=[Extension('icu._icu_', [filename for filename in sorted(os.listdir(os.curdir)) if filename.endswith('.cpp')], @@ -36,3 +36,6 @@ index d308b80..56e9c74 100644 extra_compile_args=_cflags, extra_link_args=_lflags, libraries=_libraries)], +-- +2.34.1 + diff --git a/meta-python/recipes-devtools/python/python3-icu_2.8.1.bb b/meta-python/recipes-devtools/python/python3-icu_2.12.bb index 027ef129ee..6394db4e9e 100644 --- a/meta-python/recipes-devtools/python/python3-icu_2.8.1.bb +++ b/meta-python/recipes-devtools/python/python3-icu_2.12.bb @@ -8,7 +8,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=0724597863f1581ab01429e0423e779f" DEPENDS += "icu" PYPI_PACKAGE = "PyICU" -SRC_URI[sha256sum] = "f0b9549a87f87ba7c413f13679d137271e0b37f1f39b0109ace38257d4d148d6" +SRC_URI[sha256sum] = "bd7ab5efa93ad692e6daa29cd249364e521218329221726a113ca3cb281c8611" SRC_URI += "file://0001-Fix-host-contamination-of-include-files.patch" diff --git a/meta-python/recipes-devtools/python/python3-idna-ssl_1.1.0.bb b/meta-python/recipes-devtools/python/python3-idna-ssl_1.1.0.bb index 3643fcfd30..503b79d667 100644 --- a/meta-python/recipes-devtools/python/python3-idna-ssl_1.1.0.bb +++ b/meta-python/recipes-devtools/python/python3-idna-ssl_1.1.0.bb @@ -1,2 +1,17 @@ -inherit setuptools3 -require python-idna-ssl.inc +SUMMARY = "Patch ssl.match_hostname for Unicode(idna) domains support" +HOMEPAGE = "https://github.com/aio-libs/idna-ssl" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=a61b9c5aec8796b64a6bf15d42605073" + +SRC_URI[sha256sum] = "a933e3bb13da54383f9e8f35dc4f9cb9eb9b3b78c6b36f311254d6d0d92c6c7c" + +PYPI_PACKAGE = "idna-ssl" +inherit pypi setuptools3 + +UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/idna_ssl/" +UPSTREAM_CHECK_REGEX = "/idna_ssl/(?P<pver>(\d+[\.\-_]*)+)" + +RDEPENDS:${PN} += " \ + python3-idna \ + python3-io \ +" diff --git a/meta-python/recipes-devtools/python/python3-ifaddr_0.2.0.bb b/meta-python/recipes-devtools/python/python3-ifaddr_0.2.0.bb index 6c97c374e0..371bbf2ab5 100644 --- a/meta-python/recipes-devtools/python/python3-ifaddr_0.2.0.bb +++ b/meta-python/recipes-devtools/python/python3-ifaddr_0.2.0.bb @@ -10,5 +10,5 @@ SRC_URI[sha256sum] = "cc0cbfcaabf765d44595825fb96a99bb12c79716b73b44330ea38ee2b0 inherit pypi setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-ctypes \ + python3-ctypes \ " diff --git a/meta-python/recipes-devtools/python/python3-imageio_2.21.1.bb b/meta-python/recipes-devtools/python/python3-imageio_2.34.0.bb index 5c792a5db8..e38d694408 100644 --- a/meta-python/recipes-devtools/python/python3-imageio_2.21.1.bb +++ b/meta-python/recipes-devtools/python/python3-imageio_2.34.0.bb @@ -5,7 +5,7 @@ SECTION = "devel/python" LICENSE = "BSD-2-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=24cb9a367a9e641b459a01c4d15256ba" -SRC_URI[sha256sum] = "5f0278217c1cf99d90ef855dab948f93d9fce0ab7ab388e13a597c706b7ec4e5" +SRC_URI[sha256sum] = "ae9732e10acf807a22c389aef193f42215718e16bd06eed0c5bb57e1034a4d53" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-imgtool_1.9.0.bb b/meta-python/recipes-devtools/python/python3-imgtool_2.0.0.bb index 1e5efbe187..a25e6a61a8 100644 --- a/meta-python/recipes-devtools/python/python3-imgtool_1.9.0.bb +++ b/meta-python/recipes-devtools/python/python3-imgtool_2.0.0.bb @@ -1,9 +1,9 @@ SUMMARY = "MCUboot's image signing and key management tool" LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://imgtool/main.py;beginline=3;endline=18;md5=9965f09ae52c04886a1f04e13ccdce57" +LIC_FILES_CHKSUM = "file://imgtool/main.py;beginline=3;endline=18;md5=0645fb61e2f961a110302fbfdb227446" -SRC_URI[sha256sum] = "7fa7f6bd6bf069b5ffa07ea47478e16b6206bd2fc5b7607def999de0e9134a43" +SRC_URI[sha256sum] = "7a541255e69eec1f12aa38dce1f1d4fe20d8212677c68a9b6ec634ca91a06612" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-incremental_21.3.0.bb b/meta-python/recipes-devtools/python/python3-incremental_22.10.0.bb index 60c80a2c85..503ef35a9e 100644 --- a/meta-python/recipes-devtools/python/python3-incremental_21.3.0.bb +++ b/meta-python/recipes-devtools/python/python3-incremental_22.10.0.bb @@ -3,17 +3,17 @@ HOMEPAGE = "https://github.com/twisted/incremental" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=6ca9b07f08e2c72d48c74d363d1e0e15" -SRC_URI[sha256sum] = "02f5de5aff48f6b9f665d99d48bfc7ec03b6e3943210de7cfc88856d755d6f57" +SRC_URI[sha256sum] = "912feeb5e0f7e0188e6f42241d2f450002e11bbc0937c65865045854c24c0bd0" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta RDEPENDS:${PN} += " \ - ${PYTHON_PN}-twisted \ - ${PYTHON_PN}-click \ + python3-twisted-core \ + python3-click \ " # -native is needed to build python[3]-twisted, however, we need to take steps to # prevent a circular dependency. The build apparently does not use the part of # python-incremental which uses python-twisted, so this hack is OK. -RDEPENDS:${PYTHON_PN}-incremental-native:remove = "${PYTHON_PN}-twisted-native" +RDEPENDS:python3-incremental-native:remove = "python3-twisted-core-native" BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-inflate64_1.0.0.bb b/meta-python/recipes-devtools/python/python3-inflate64_1.0.0.bb new file mode 100644 index 0000000000..2ccc98e36b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-inflate64_1.0.0.bb @@ -0,0 +1,16 @@ +SUMMARY = "deflate64 compression/decompression library" +HOMEPAGE = "https://codeberg.org/miurahr/inflate64" +LICENSE = "LGPL-2.1-or-later" +SECTION = "devel/python" +LIC_FILES_CHKSUM = "file://COPYING;md5=4fbd65380cdd255951079008b364516c" + +inherit setuptools3 pypi + +SRC_URI[sha256sum] = "3278827b803cf006a1df251f3e13374c7d26db779e5a33329cc11789b804bc2d" + +PYPI_PACKAGE = "inflate64" + +RDEPENDS:${PN} += "\ + python3-core \ + python3-importlib-metadata \ +" diff --git a/meta-python/recipes-devtools/python/python3-inflection/run-ptest b/meta-python/recipes-devtools/python/python3-inflection/run-ptest index 0caffb794c..f1c8729f0e 100644 --- a/meta-python/recipes-devtools/python/python3-inflection/run-ptest +++ b/meta-python/recipes-devtools/python/python3-inflection/run-ptest @@ -1,4 +1,4 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO test_inflection.py | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-inflection_0.5.1.bb b/meta-python/recipes-devtools/python/python3-inflection_0.5.1.bb index ea3b76d511..5c6f4e2356 100644 --- a/meta-python/recipes-devtools/python/python3-inflection_0.5.1.bb +++ b/meta-python/recipes-devtools/python/python3-inflection_0.5.1.bb @@ -13,8 +13,9 @@ SRC_URI +=" \ file://run-ptest \ " -RDEPENDS:${PN}_ptest +=" \ - ${PYTHON_PN}_pytest \ +RDEPENDS:${PN}-ptest +=" \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { @@ -22,6 +23,6 @@ do_install_ptest() { } -RDEPENDS:${PN} += "${PYTHON_PN}-pytest" +RDEPENDS:${PN} += "python3-pytest" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-inotify/new-test-inotify.patch b/meta-python/recipes-devtools/python/python3-inotify/new-test-inotify.patch new file mode 100644 index 0000000000..e462615e14 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-inotify/new-test-inotify.patch @@ -0,0 +1,620 @@ +From 80010e27d774e8b722d569384492eaab2bc4ac61 Mon Sep 17 00:00:00 2001 +From: Joe Slater <joe.slater@windriver.com> +Date: Thu, 27 Jul 2023 15:01:04 +0000 +Subject: [PATCH] working commit + +It is not safe to assume the values returned by add_watch(), +so we add a local helper get_wd() to retrieve them. This fixes +a problem in TestInotifyTree.test__cycle() where the +wd's for the 'aa' and 'bb' paths are not '2' and '3', +respectively. + +A second issue is that Inotify._get_event_names() should +return a set or sorted list to avoid comparison problems, +but that is not addressed here since it could be viewed as +changing the API. + +This test_inotify.py is based on the version in the fix_tests branch of +pyinotify as of commit d7d3c58... + +Upstream-Status: Submitted [github.com/dsoprea/PyInotify/pull/104] + +Signed-off-by: Joe Slater <joe.slater@windriver.com> +--- + tests/test_inotify.py | 346 ++++++++++++++++++++++++++++++++---------- + 1 file changed, 262 insertions(+), 84 deletions(-) + +diff --git a/tests/test_inotify.py b/tests/test_inotify.py +index d9f1f84..d89a49e 100644 +--- a/tests/test_inotify.py ++++ b/tests/test_inotify.py +@@ -2,6 +2,7 @@ + + import os + import unittest ++import time + + import inotify.constants + import inotify.calls +@@ -15,6 +16,11 @@ except NameError: + else: + _HAS_PYTHON2_UNICODE_SUPPORT = True + ++# Inotify does not have a get for watch descriptors ++# ++def get_wd(i, path): ++ return i._Inotify__watches[path] ++ + + class TestInotify(unittest.TestCase): + def __init__(self, *args, **kwargs): +@@ -29,11 +35,11 @@ class TestInotify(unittest.TestCase): + @unittest.skipIf(_HAS_PYTHON2_UNICODE_SUPPORT is True, "Not in Python 3") + def test__international_naming_python3(self): + with inotify.test_support.temp_path() as path: +- inner_path = os.path.join(path, '新增資料夾') ++ inner_path = os.path.join(path, u'新增資料夾') + os.mkdir(inner_path) + + i = inotify.adapters.Inotify() +- i.add_watch(inner_path) ++ wd = i.add_watch(inner_path) + + with open(os.path.join(inner_path, 'filename'), 'w'): + pass +@@ -41,12 +47,27 @@ class TestInotify(unittest.TestCase): + events = self.__read_all_events(i) + + expected = [ +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=256, cookie=0, len=16), ['IN_CREATE'], inner_path, 'filename'), +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=32, cookie=0, len=16), ['IN_OPEN'], inner_path, 'filename'), +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], inner_path, 'filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd, mask=256, cookie=0, len=16), ['IN_CREATE'], inner_path, 'filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd, mask=32, cookie=0, len=16), ['IN_OPEN'], inner_path, 'filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], inner_path, 'filename'), + ] + +- self.assertEquals(events, expected) ++ if events != expected: ++ print("ACTUAL:") ++ print("") ++ ++ for i, event in enumerate(events): ++ print(event) ++ ++ print("") ++ ++ print("EXPECTED:") ++ print("") ++ ++ for i, event in enumerate(expected): ++ print(event) ++ ++ raise Exception("Events not correct.") + + @unittest.skipIf(_HAS_PYTHON2_UNICODE_SUPPORT is False, "Not in Python 2") + def test__international_naming_python2(self): +@@ -55,7 +76,7 @@ class TestInotify(unittest.TestCase): + os.mkdir(inner_path) + + i = inotify.adapters.Inotify() +- i.add_watch(inner_path) ++ wd = i.add_watch(inner_path) + + with open(os.path.join(inner_path, u'filename料夾'), 'w'): + pass +@@ -63,12 +84,28 @@ class TestInotify(unittest.TestCase): + events = self.__read_all_events(i) + + expected = [ +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=256, cookie=0, len=16), ['IN_CREATE'], inner_path, u'filename料夾'), +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=32, cookie=0, len=16), ['IN_OPEN'], inner_path, u'filename料夾'), +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], inner_path, u'filename料夾'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd, mask=256, cookie=0, len=16), ['IN_CREATE'], inner_path, u'filename料夾'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd, mask=32, cookie=0, len=16), ['IN_OPEN'], inner_path, u'filename料夾'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], inner_path, u'filename料夾'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd, mask=16, cookie=0, len=16), ['IN_CLOSE_NOWRITE'], inner_path, u'filename料夾'), + ] + +- self.assertEquals(events, expected) ++ if events != expected: ++ print("ACTUAL:") ++ print("") ++ ++ for i, event in enumerate(events): ++ print(event) ++ ++ print("") ++ ++ print("EXPECTED:") ++ print("") ++ ++ for i, event in enumerate(expected): ++ print(event) ++ ++ raise Exception("Events not correct.") + + def test__cycle(self): + with inotify.test_support.temp_path() as path: +@@ -79,7 +116,7 @@ class TestInotify(unittest.TestCase): + os.mkdir(path2) + + i = inotify.adapters.Inotify() +- i.add_watch(path1) ++ wd = i.add_watch(path1) + + with open('ignored_new_file', 'w'): + pass +@@ -96,32 +133,47 @@ class TestInotify(unittest.TestCase): + + expected = [ + ( +- inotify.adapters._INOTIFY_EVENT(wd=1, mask=256, cookie=0, len=16), ++ inotify.adapters._INOTIFY_EVENT(wd=wd, mask=256, cookie=0, len=16), + ['IN_CREATE'], + path1, + 'seen_new_file' + ), + ( +- inotify.adapters._INOTIFY_EVENT(wd=1, mask=32, cookie=0, len=16), ++ inotify.adapters._INOTIFY_EVENT(wd=wd, mask=32, cookie=0, len=16), + ['IN_OPEN'], + path1, + 'seen_new_file' + ), + ( +- inotify.adapters._INOTIFY_EVENT(wd=1, mask=8, cookie=0, len=16), ++ inotify.adapters._INOTIFY_EVENT(wd=wd, mask=8, cookie=0, len=16), + ['IN_CLOSE_WRITE'], + path1, + 'seen_new_file' + ), + ( +- inotify.adapters._INOTIFY_EVENT(wd=1, mask=512, cookie=0, len=16), ++ inotify.adapters._INOTIFY_EVENT(wd=wd, mask=512, cookie=0, len=16), + ['IN_DELETE'], + path1, + 'seen_new_file' + ) + ] + +- self.assertEquals(events, expected) ++ if events != expected: ++ print("ACTUAL:") ++ print("") ++ ++ for i, event in enumerate(events): ++ print(event) ++ ++ print("") ++ ++ print("EXPECTED:") ++ print("") ++ ++ for i, event in enumerate(expected): ++ print(event) ++ ++ raise Exception("Events not correct.") + + # This can't be removed until *after* we've read the events because + # they'll be flushed the moment we remove the watch. +@@ -131,7 +183,7 @@ class TestInotify(unittest.TestCase): + pass + + events = self.__read_all_events(i) +- self.assertEquals(events, []) ++ self.assertEqual(events, []) + + @staticmethod + def _open_write_close(*args): +@@ -167,23 +219,47 @@ class TestInotify(unittest.TestCase): + with inotify.test_support.temp_path() as path: + path1 = TestInotify._make_temp_path(path, 'aa') + path2 = TestInotify._make_temp_path(path, 'bb') ++ + i = inotify.adapters.Inotify([path1, path2]) ++ + TestInotify._open_write_close('ignored_new_file') + TestInotify._open_write_close(path1, 'seen_new_file') + TestInotify._open_write_close(path2, 'seen_new_file2') ++ ++ wd_path1 = get_wd(i, path1) ++ wd_path2 = get_wd(i, path2) ++ ++ + os.remove(os.path.join(path1, 'seen_new_file')) ++ + events = self.__read_all_events(i) ++ + expected = [ +- TestInotify._event_create(wd=1, path=path1, filename='seen_new_file'), +- TestInotify._event_open(wd=1, path=path1, filename='seen_new_file'), +- TestInotify._event_close_write(wd=1, path=path1, filename='seen_new_file'), +- TestInotify._event_create(wd=2, path=path2, filename='seen_new_file2'), +- TestInotify._event_open(wd=2, path=path2, filename='seen_new_file2'), +- TestInotify._event_close_write(wd=2, path=path2, filename='seen_new_file2'), +- TestInotify._event_general(wd=1, mask=512, type_name='IN_DELETE', +- path=path1, filename='seen_new_file') ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=256, cookie=0, len=16), ['IN_CREATE'], path1, u'seen_new_file'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=32, cookie=0, len=16), ['IN_OPEN'], path1, u'seen_new_file'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path1, u'seen_new_file'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=256, cookie=0, len=16), ['IN_CREATE'], path2, u'seen_new_file2'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=32, cookie=0, len=16), ['IN_OPEN'], path2, u'seen_new_file2'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path2, u'seen_new_file2'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=512, cookie=0, len=16), ['IN_DELETE'], path1, u'seen_new_file'), + ] +- self.assertEquals(events, expected) ++ ++ if events != expected: ++ print("ACTUAL:") ++ print("") ++ ++ for i, event in enumerate(events): ++ print(event) ++ ++ print("") ++ ++ print("EXPECTED:") ++ print("") ++ ++ for i, event in enumerate(expected): ++ print(event) ++ ++ raise Exception("Events not correct.") + + def test__error_on_watch_nonexistent_folder(self): + i = inotify.adapters.Inotify() +@@ -201,7 +277,7 @@ class TestInotify(unittest.TestCase): + i = inotify.adapters.Inotify() + names = i._get_event_names(all_mask) + +- self.assertEquals(names, all_names) ++ self.assertEqual(names, all_names) + + + class TestInotifyTree(unittest.TestCase): +@@ -219,56 +295,101 @@ class TestInotifyTree(unittest.TestCase): + path1 = os.path.join(path, 'aa') + os.mkdir(path1) + ++ time.sleep(.10) ++ + path2 = os.path.join(path, 'bb') + os.mkdir(path2) + ++ time.sleep(.10) ++ + i = inotify.adapters.InotifyTree(path) + + with open('seen_new_file1', 'w'): + pass + ++ time.sleep(.10) ++ + with open(os.path.join(path1, 'seen_new_file2'), 'w'): + pass + ++ time.sleep(.10) ++ + with open(os.path.join(path2, 'seen_new_file3'), 'w'): + pass + ++ time.sleep(.10) ++ ++ wd_path = get_wd(i.inotify, path) ++ wd_path1 = get_wd(i.inotify, path1) ++ wd_path2 = get_wd(i.inotify, path2) ++ + os.remove(os.path.join(path, 'seen_new_file1')) ++ ++ time.sleep(.10) ++ + os.remove(os.path.join(path1, 'seen_new_file2')) ++ ++ time.sleep(.10) ++ + os.remove(os.path.join(path2, 'seen_new_file3')) + ++ time.sleep(.10) ++ + os.rmdir(path1) ++ ++ time.sleep(.10) ++ + os.rmdir(path2) + +- events = self.__read_all_events(i) ++ time.sleep(.10) + ++ events = self.__read_all_events(i) ++ events = sorted(events) ++ + expected = [ +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=256, cookie=0, len=16), ['IN_CREATE'], path, 'seen_new_file1'), +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=32, cookie=0, len=16), ['IN_OPEN'], path, 'seen_new_file1'), +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path, 'seen_new_file1'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path, mask=256, cookie=0, len=16), ['IN_CREATE'], path, 'seen_new_file1'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path, mask=32, cookie=0, len=16), ['IN_OPEN'], path, 'seen_new_file1'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path, 'seen_new_file1'), + +- (inotify.adapters._INOTIFY_EVENT(wd=2, mask=256, cookie=0, len=16), ['IN_CREATE'], path1, 'seen_new_file2'), +- (inotify.adapters._INOTIFY_EVENT(wd=2, mask=32, cookie=0, len=16), ['IN_OPEN'], path1, 'seen_new_file2'), +- (inotify.adapters._INOTIFY_EVENT(wd=2, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path1, 'seen_new_file2'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=256, cookie=0, len=16), ['IN_CREATE'], path1, 'seen_new_file2'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=32, cookie=0, len=16), ['IN_OPEN'], path1, 'seen_new_file2'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path1, 'seen_new_file2'), + +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=256, cookie=0, len=16), ['IN_CREATE'], path2, 'seen_new_file3'), +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=32, cookie=0, len=16), ['IN_OPEN'], path2, 'seen_new_file3'), +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path2, 'seen_new_file3'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=256, cookie=0, len=16), ['IN_CREATE'], path2, 'seen_new_file3'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=32, cookie=0, len=16), ['IN_OPEN'], path2, 'seen_new_file3'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path2, 'seen_new_file3'), + +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=512, cookie=0, len=16), ['IN_DELETE'], path, 'seen_new_file1'), +- (inotify.adapters._INOTIFY_EVENT(wd=2, mask=512, cookie=0, len=16), ['IN_DELETE'], path1, 'seen_new_file2'), +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=512, cookie=0, len=16), ['IN_DELETE'], path2, 'seen_new_file3'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path, mask=512, cookie=0, len=16), ['IN_DELETE'], path, 'seen_new_file1'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=512, cookie=0, len=16), ['IN_DELETE'], path1, 'seen_new_file2'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=512, cookie=0, len=16), ['IN_DELETE'], path2, 'seen_new_file3'), + +- (inotify.adapters._INOTIFY_EVENT(wd=2, mask=1024, cookie=0, len=0), ['IN_DELETE_SELF'], path1, ''), +- (inotify.adapters._INOTIFY_EVENT(wd=2, mask=32768, cookie=0, len=0), ['IN_IGNORED'], path1, ''), +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=1073742336, cookie=0, len=16), ['IN_ISDIR', 'IN_DELETE'], path, 'aa'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=1024, cookie=0, len=0), ['IN_DELETE_SELF'], path1, ''), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=32768, cookie=0, len=0), ['IN_IGNORED'], path1, ''), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path, mask=1073742336, cookie=0, len=16), ['IN_DELETE', 'IN_ISDIR'], path, 'aa'), + +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=1024, cookie=0, len=0), ['IN_DELETE_SELF'], path2, ''), +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=32768, cookie=0, len=0), ['IN_IGNORED'], path2, ''), +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=1073742336, cookie=0, len=16), ['IN_ISDIR', 'IN_DELETE'], path, 'bb'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=1024, cookie=0, len=0), ['IN_DELETE_SELF'], path2, ''), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=32768, cookie=0, len=0), ['IN_IGNORED'], path2, ''), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path, mask=1073742336, cookie=0, len=16), ['IN_DELETE', 'IN_ISDIR'], path, 'bb'), + ] + +- self.assertEquals(events, expected) ++ expected = sorted(expected) ++ ++ if events != expected: ++ print("ACTUAL:") ++ print("") ++ ++ for i, event in enumerate(events): ++ print(event) ++ ++ print("") ++ ++ print("EXPECTED:") ++ print("") ++ ++ for i, event in enumerate(expected): ++ print(event) ++ ++ raise Exception("Events not correct.") + + def test__renames(self): + +@@ -283,26 +404,30 @@ class TestInotifyTree(unittest.TestCase): + new_path = os.path.join(path, 'new_folder') + + os.mkdir(old_path) ++ ++ wd_path = get_wd(i.inotify, path) + + events1 = self.__read_all_events(i) + + expected = [ +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=1073742080, cookie=events1[0][0].cookie, len=16), ['IN_ISDIR', 'IN_CREATE'], path, 'old_folder'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path, mask=1073742080, cookie=events1[0][0].cookie, len=16), ['IN_CREATE', 'IN_ISDIR'], path, 'old_folder'), + ] + +- self.assertEquals(events1, expected) +- ++ self.assertEqual(events1, expected) + + os.rename(old_path, new_path) + ++ wd_old_path = get_wd(i.inotify, old_path) ++ + events2 = self.__read_all_events(i) + + expected = [ +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=1073741888, cookie=events2[0][0].cookie, len=16), ['IN_MOVED_FROM', 'IN_ISDIR'], path, 'old_folder'), +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=1073741952, cookie=events2[1][0].cookie, len=16), ['IN_MOVED_TO', 'IN_ISDIR'], path, 'new_folder'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path, mask=1073741888, cookie=events2[0][0].cookie, len=16), ['IN_MOVED_FROM', 'IN_ISDIR'], path, 'old_folder'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path, mask=1073741952, cookie=events2[1][0].cookie, len=16), ['IN_MOVED_TO', 'IN_ISDIR'], path, 'new_folder'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_old_path, mask=2048, cookie=0, len=0), ['IN_MOVE_SELF'], new_path, '') + ] + +- self.assertEquals(events2, expected) ++ self.assertEqual(events2, expected) + + + with open(os.path.join(new_path, 'old_filename'), 'w'): +@@ -318,21 +443,33 @@ class TestInotifyTree(unittest.TestCase): + events3 = self.__read_all_events(i) + + expected = [ +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=256, cookie=0, len=16), ['IN_CREATE'], new_path, 'old_filename'), +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=32, cookie=0, len=16), ['IN_OPEN'], new_path, 'old_filename'), +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], new_path, 'old_filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_old_path, mask=256, cookie=0, len=16), ['IN_CREATE'], new_path, 'old_filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_old_path, mask=32, cookie=0, len=16), ['IN_OPEN'], new_path, 'old_filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_old_path, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], new_path, 'old_filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_old_path, mask=64, cookie=events3[3][0].cookie, len=16), ['IN_MOVED_FROM'], new_path, 'old_filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_old_path, mask=128, cookie=events3[4][0].cookie, len=16), ['IN_MOVED_TO'], new_path, 'new_filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_old_path, mask=512, cookie=0, len=16), ['IN_DELETE'], new_path, 'new_filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_old_path, mask=1024, cookie=0, len=0), ['IN_DELETE_SELF'], new_path, ''), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_old_path, mask=32768, cookie=0, len=0), ['IN_IGNORED'], new_path, ''), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path, mask=1073742336, cookie=0, len=16), ['IN_DELETE', 'IN_ISDIR'], path, 'new_folder'), ++ ] + +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=64, cookie=events3[3][0].cookie, len=16), ['IN_MOVED_FROM'], new_path, 'old_filename'), +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=128, cookie=events3[4][0].cookie, len=16), ['IN_MOVED_TO'], new_path, 'new_filename'), ++ if events3 != expected: ++ print("ACTUAL:") ++ print("") + +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=512, cookie=0, len=16), ['IN_DELETE'], new_path, 'new_filename'), ++ for i, event in enumerate(events3): ++ print(event) + +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=1024, cookie=0, len=0), ['IN_DELETE_SELF'], new_path, ''), +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=32768, cookie=0, len=0), ['IN_IGNORED'], new_path, ''), +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=1073742336, cookie=0, len=16), ['IN_ISDIR', 'IN_DELETE'], path, 'new_folder'), +- ] ++ print("") ++ ++ print("EXPECTED:") ++ print("") + +- self.assertEquals(events3, expected) ++ for i, event in enumerate(expected): ++ print(event) ++ ++ raise Exception("Events not correct.") + + def test__automatic_new_watches_on_new_paths(self): + +@@ -346,39 +483,60 @@ class TestInotifyTree(unittest.TestCase): + path2 = os.path.join(path1, 'folder2') + + os.mkdir(path1) ++ ++ wd_path = get_wd(i.inotify, path) + + events = self.__read_all_events(i) + + expected = [ +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=1073742080, cookie=0, len=16), ['IN_ISDIR', 'IN_CREATE'], path, 'folder1'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path, mask=1073742080, cookie=0, len=16), ['IN_CREATE', 'IN_ISDIR'], path, 'folder1'), + ] + +- self.assertEquals(events, expected) ++ self.assertEqual(events, expected) + + + os.mkdir(path2) + ++ wd_path1 = get_wd(i.inotify, path1) ++ + events = self.__read_all_events(i) + + expected = [ +- (inotify.adapters._INOTIFY_EVENT(wd=2, mask=1073742080, cookie=0, len=16), ['IN_ISDIR', 'IN_CREATE'], path1, 'folder2'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=1073742080, cookie=0, len=16), ['IN_CREATE', 'IN_ISDIR'], path1, 'folder2'), + ] + +- self.assertEquals(events, expected) ++ self.assertEqual(events, expected) + + + with open(os.path.join(path2,'filename'), 'w'): + pass + ++ wd_path2 = get_wd(i.inotify, path2) ++ + events = self.__read_all_events(i) + + expected = [ +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=256, cookie=0, len=16), ['IN_CREATE'], path2, 'filename'), +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=32, cookie=0, len=16), ['IN_OPEN'], path2, 'filename'), +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path2, 'filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=256, cookie=0, len=16), ['IN_CREATE'], path2, 'filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=32, cookie=0, len=16), ['IN_OPEN'], path2, 'filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path2, 'filename'), + ] + +- self.assertEquals(events, expected) ++ if events != expected: ++ print("ACTUAL:") ++ print("") ++ ++ for i, event in enumerate(events): ++ print(event) ++ ++ print("") ++ ++ print("EXPECTED:") ++ print("") ++ ++ for i, event in enumerate(expected): ++ print(event) ++ ++ raise Exception("Events not correct.") + + def test__automatic_new_watches_on_existing_paths(self): + +@@ -396,16 +554,33 @@ class TestInotifyTree(unittest.TestCase): + + with open(os.path.join(path2,'filename'), 'w'): + pass ++ ++ wd = get_wd(i.inotify, path2) + + events = self.__read_all_events(i) + + expected = [ +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=256, cookie=0, len=16), ['IN_CREATE'], path2, 'filename'), +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=32, cookie=0, len=16), ['IN_OPEN'], path2, 'filename'), +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path2, 'filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd, mask=256, cookie=0, len=16), ['IN_CREATE'], path2, 'filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd, mask=32, cookie=0, len=16), ['IN_OPEN'], path2, 'filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path2, 'filename'), + ] + +- self.assertEquals(events, expected) ++ if events != expected: ++ print("ACTUAL:") ++ print("") ++ ++ for i, event in enumerate(events): ++ print(event) ++ ++ print("") ++ ++ print("EXPECTED:") ++ print("") ++ ++ for i, event in enumerate(expected): ++ print(event) ++ ++ raise Exception("Events not correct.") + + + class TestInotifyTrees(unittest.TestCase): +@@ -428,6 +603,9 @@ class TestInotifyTrees(unittest.TestCase): + + i = inotify.adapters.InotifyTrees([path1, path2]) + ++ wd_path1 = get_wd(i.inotify, path1) ++ wd_path2 = get_wd(i.inotify, path2) ++ + with open(os.path.join(path1, 'seen_new_file1'), 'w'): + pass + +@@ -437,13 +615,13 @@ class TestInotifyTrees(unittest.TestCase): + events = self.__read_all_events(i) + + expected = [ +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=256, cookie=0, len=16), ['IN_CREATE'], path1, 'seen_new_file1'), +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=32, cookie=0, len=16), ['IN_OPEN'], path1, 'seen_new_file1'), +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path1, 'seen_new_file1'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=256, cookie=0, len=16), ['IN_CREATE'], path1, 'seen_new_file1'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=32, cookie=0, len=16), ['IN_OPEN'], path1, 'seen_new_file1'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path1, 'seen_new_file1'), + +- (inotify.adapters._INOTIFY_EVENT(wd=2, mask=256, cookie=0, len=16), ['IN_CREATE'], path2, 'seen_new_file2'), +- (inotify.adapters._INOTIFY_EVENT(wd=2, mask=32, cookie=0, len=16), ['IN_OPEN'], path2, 'seen_new_file2'), +- (inotify.adapters._INOTIFY_EVENT(wd=2, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path2, 'seen_new_file2'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=256, cookie=0, len=16), ['IN_CREATE'], path2, 'seen_new_file2'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=32, cookie=0, len=16), ['IN_OPEN'], path2, 'seen_new_file2'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path2, 'seen_new_file2'), + ] + +- self.assertEquals(events, expected) ++ self.assertEqual(events, expected) +-- +2.35.5 + diff --git a/meta-python/recipes-devtools/python/python3-inotify/run-ptest b/meta-python/recipes-devtools/python/python3-inotify/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-inotify/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-inotify_0.2.10.bb b/meta-python/recipes-devtools/python/python3-inotify_0.2.10.bb deleted file mode 100644 index 524c3a0d29..0000000000 --- a/meta-python/recipes-devtools/python/python3-inotify_0.2.10.bb +++ /dev/null @@ -1,14 +0,0 @@ -SUMMARY = "An adapter to Linux kernel support for inotify directory-watching." -AUTHOR = "Dustin Oprea" -HOMEPAGE = "https://pypi.org/project/inotify/" -LICENSE = "GPL-2.0-only" -LIC_FILES_CHKSUM = "file://setup.py;md5=79b7ec72aa0d446a552d3cceb5799e41;beginline=28;endline=28" - -SRC_URI[sha256sum] = "974a623a338482b62e16d4eb705fb863ed33ec178680fc3e96ccdf0df6c02a07" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += " \ - python3-ctypes \ - python3-logging \ -" diff --git a/meta-python/recipes-devtools/python/python3-inotify_git.bb b/meta-python/recipes-devtools/python/python3-inotify_git.bb new file mode 100644 index 0000000000..582599bca8 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-inotify_git.bb @@ -0,0 +1,33 @@ +SUMMARY = "An adapter to Linux kernel support for inotify directory-watching." +HOMEPAGE = "https://pypi.org/project/inotify/" +LICENSE = "GPL-2.0-only" +LIC_FILES_CHKSUM = "file://setup.py;md5=79b7ec72aa0d446a552d3cceb5799e41;beginline=28;endline=28" + +SRC_URI[sha256sum] = "974a623a338482b62e16d4eb705fb863ed33ec178680fc3e96ccdf0df6c02a07" + +SRC_URI = " \ + git://github.com/dsoprea/pyinotify.git;branch=master;protocol=https \ + file://new-test-inotify.patch \ + file://run-ptest \ +" + +SRCREV = "9be6a51d1660991562eefaaddefa757ca0e0e00f" + +S = "${WORKDIR}/git" + +inherit setuptools3 ptest + +RDEPENDS:${PN} += " \ + python3-ctypes \ + python3-logging \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} diff --git a/meta-python/recipes-devtools/python/python3-intervals/run-ptest b/meta-python/recipes-devtools/python/python3-intervals/run-ptest index 357d8cb987..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-intervals/run-ptest +++ b/meta-python/recipes-devtools/python/python3-intervals/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO test_intervals.py| sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-intervals_1.10.0.bb b/meta-python/recipes-devtools/python/python3-intervals_1.10.0.bb index abf87c597c..3c5be47806 100644 --- a/meta-python/recipes-devtools/python/python3-intervals_1.10.0.bb +++ b/meta-python/recipes-devtools/python/python3-intervals_1.10.0.bb @@ -14,7 +14,8 @@ SRC_URI += " \ inherit pypi setuptools3 ptest RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-invoke_2.2.0.bb b/meta-python/recipes-devtools/python/python3-invoke_2.2.0.bb new file mode 100644 index 0000000000..3f2e6232d6 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-invoke_2.2.0.bb @@ -0,0 +1,18 @@ +SUMMARY = "Pythonic task execution" +HOMEPAGE = "https://www.pyinvoke.org/" +LICENSE = "BSD-2-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=a8815068973f31b78c328dc067e297ab" + +SRC_URI[sha256sum] = "ee6cbb101af1a859c7fe84f2a264c059020b0cb7fe3535f9424300ab568f6bd5" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-fcntl \ + python3-json \ + python3-logging \ + python3-pprint \ + python3-terminal \ + python3-unittest \ + python3-unixadmin \ +" diff --git a/meta-python/recipes-devtools/python/python3-iperf_0.1.11.bb b/meta-python/recipes-devtools/python/python3-iperf_0.1.11.bb index 36d6463051..58af7b77ac 100644 --- a/meta-python/recipes-devtools/python/python3-iperf_0.1.11.bb +++ b/meta-python/recipes-devtools/python/python3-iperf_0.1.11.bb @@ -1,6 +1,5 @@ SUMMARY = "Python wrapper around iperf3" HOMEPAGE = "https://github.com/thiezn/iperf3-python" -AUTHOR = "Mathijs Mortimer <mathijs@mortimer.nl>" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=f7d0900b3d30647cdda002c9549ca40f" @@ -9,3 +8,9 @@ PYPI_PACKAGE = "iperf3" SRC_URI[sha256sum] = "d50eebbf2dcf445a173f98a82f9c433e0302d3dfb7987e1f21b86b35ef63ce26" inherit setuptools3 pypi + +RDEPENDS:${PN} += " \ + python3-ctypes \ + python3-json \ + python3-threading \ +" diff --git a/meta-python/recipes-devtools/python/python3-ipy/run-ptest b/meta-python/recipes-devtools/python/python3-ipy/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-ipy/run-ptest +++ b/meta-python/recipes-devtools/python/python3-ipy/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-ipy_1.01.bb b/meta-python/recipes-devtools/python/python3-ipy_1.01.bb index 8e7b5b987e..36d0b9ae27 100644 --- a/meta-python/recipes-devtools/python/python3-ipy_1.01.bb +++ b/meta-python/recipes-devtools/python/python3-ipy_1.01.bb @@ -19,7 +19,8 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-ipython-genutils_0.2.0.bb b/meta-python/recipes-devtools/python/python3-ipython-genutils_0.2.0.bb index 2a28cf9ecb..3261d80474 100644 --- a/meta-python/recipes-devtools/python/python3-ipython-genutils_0.2.0.bb +++ b/meta-python/recipes-devtools/python/python3-ipython-genutils_0.2.0.bb @@ -1,11 +1,13 @@ SUMMARY = "Vestigial utilities from IPython" HOMEPAGE = "http://ipython.org" -AUTHOR = "IPython Development Team <ipython-dev@scipy.org>" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://COPYING.md;md5=f7c3032c3ac398265224533a0a333a35" PYPI_PACKAGE = "ipython_genutils" +UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/ipython_genutils" +UPSTREAM_CHECK_REGEX = "/ipython_genutils/(?P<pver>(\d+[\.\-_]*)+)" + SRC_URI[md5sum] = "5a4f9781f78466da0ea1a648f3e1f79f" SRC_URI[sha256sum] = "eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8" diff --git a/meta-python/recipes-devtools/python/python3-ipython_8.2.0.bb b/meta-python/recipes-devtools/python/python3-ipython_8.2.0.bb deleted file mode 100644 index 35af7dd4d8..0000000000 --- a/meta-python/recipes-devtools/python/python3-ipython_8.2.0.bb +++ /dev/null @@ -1,28 +0,0 @@ -SUMMARY = "IPython: Productive Interactive Computing" -HOMEPAGE = "https://ipython.org" -AUTHOR = "The IPython Development Team <ipython-dev@python.org>" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://COPYING.rst;md5=59b20262b8663cdd094005bddf47af5f" - -PYPI_PACKAGE = "ipython" - -SRC_URI[sha256sum] = "70e5eb132cac594a34b5f799bd252589009905f05104728aea6a403ec2519dc1" - -RDEPENDS:${PN} = "\ - ${PYTHON_PN}-setuptools \ - ${PYTHON_PN}-jedi \ - ${PYTHON_PN}-decorator \ - ${PYTHON_PN}-pickleshare \ - ${PYTHON_PN}-traitlets \ - ${PYTHON_PN}-prompt-toolkit \ - ${PYTHON_PN}-pygments \ - ${PYTHON_PN}-backcall \ - ${PYTHON_PN}-pydoc \ - ${PYTHON_PN}-debugger \ - ${PYTHON_PN}-pexpect \ - ${PYTHON_PN}-unixadmin \ - ${PYTHON_PN}-misc \ - ${PYTHON_PN}-sqlite3 \ -" - -inherit setuptools3 pypi diff --git a/meta-python/recipes-devtools/python/python3-ipython_8.23.0.bb b/meta-python/recipes-devtools/python/python3-ipython_8.23.0.bb new file mode 100644 index 0000000000..ebfd147229 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-ipython_8.23.0.bb @@ -0,0 +1,28 @@ +SUMMARY = "IPython: Productive Interactive Computing" +HOMEPAGE = "https://ipython.org" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://COPYING.rst;md5=59b20262b8663cdd094005bddf47af5f" + +PYPI_PACKAGE = "ipython" + +SRC_URI[sha256sum] = "7468edaf4f6de3e1b912e57f66c241e6fd3c7099f2ec2136e239e142e800274d" + +RDEPENDS:${PN} = "\ + python3-setuptools \ + python3-jedi \ + python3-decorator \ + python3-pickleshare \ + python3-traitlets \ + python3-prompt-toolkit \ + python3-pygments \ + python3-backcall \ + python3-pydoc \ + python3-debugger \ + python3-pexpect \ + python3-unixadmin \ + python3-misc \ + python3-sqlite3 \ + python3-stack-data \ +" + +inherit setuptools3 pypi diff --git a/meta-python/recipes-devtools/python/python3-iso3166/run-ptest b/meta-python/recipes-devtools/python/python3-iso3166/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-iso3166/run-ptest +++ b/meta-python/recipes-devtools/python/python3-iso3166/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-iso3166_2.1.1.bb b/meta-python/recipes-devtools/python/python3-iso3166_2.1.1.bb index b32cfe5956..3aa084d10a 100644 --- a/meta-python/recipes-devtools/python/python3-iso3166_2.1.1.bb +++ b/meta-python/recipes-devtools/python/python3-iso3166_2.1.1.bb @@ -12,7 +12,8 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-isodate_0.6.1.bb b/meta-python/recipes-devtools/python/python3-isodate_0.6.1.bb deleted file mode 100644 index 2a5dcfca3c..0000000000 --- a/meta-python/recipes-devtools/python/python3-isodate_0.6.1.bb +++ /dev/null @@ -1,13 +0,0 @@ -SUMMARY = "ISO 8601 date/time parser" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e910b35b0ef4e1f665b9a75d6afb7709" - -SRC_URI[sha256sum] = "48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-six \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-isort_5.10.1.bb b/meta-python/recipes-devtools/python/python3-isort_5.13.2.bb index 27977821c6..60d44181c0 100644 --- a/meta-python/recipes-devtools/python/python3-isort_5.10.1.bb +++ b/meta-python/recipes-devtools/python/python3-isort_5.13.2.bb @@ -4,17 +4,19 @@ LICENSE = "MIT" SECTION = "devel/python" LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=6;endline=6;md5=8227180126797a0148f94f483f3e1489" -SRC_URI[sha256sum] = "e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951" +SRC_URI[sha256sum] = "48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109" inherit pypi python_poetry_core -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-profile \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-pprint \ - ${PYTHON_PN}-difflib \ +RDEPENDS:${PN} += " \ + python3-compression \ + python3-datetime \ + python3-difflib \ + python3-email \ + python3-numbers \ + python3-pprint \ + python3-profile \ + python3-shell \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-itsdangerous_2.1.2.bb b/meta-python/recipes-devtools/python/python3-itsdangerous_2.1.2.bb index 2e8c7e7802..5af1d594b3 100644 --- a/meta-python/recipes-devtools/python/python3-itsdangerous_2.1.2.bb +++ b/meta-python/recipes-devtools/python/python3-itsdangerous_2.1.2.bb @@ -10,8 +10,8 @@ inherit pypi setuptools3 CLEANBROKEN = "1" RDEPENDS:${PN} += " \ - ${PYTHON_PN}-simplejson \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-json \ + python3-simplejson \ + python3-netclient \ + python3-compression \ + python3-json \ " diff --git a/meta-python/recipes-devtools/python/python3-janus_1.0.0.bb b/meta-python/recipes-devtools/python/python3-janus_1.0.0.bb new file mode 100644 index 0000000000..c709bcfbff --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-janus_1.0.0.bb @@ -0,0 +1,15 @@ +SUMMARY = "Mixed sync-async queue to interoperate between asyncio tasks and classic threads" +SECTION = "devel/python" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=23878c357ebb4c8ce1109be365043349" + +SRC_URI[sha256sum] = "df976f2cdcfb034b147a2d51edfc34ff6bfb12d4e2643d3ad0e10de058cb1612" + +inherit pypi python_setuptools_build_meta + +RDEPENDS:${PN} += "\ + python3-asyncio \ + python3-threading \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-javaobj-py3_0.4.3.bb b/meta-python/recipes-devtools/python/python3-javaobj-py3_0.4.4.bb index eb93e71733..d71101ee2c 100644 --- a/meta-python/recipes-devtools/python/python3-javaobj-py3_0.4.3.bb +++ b/meta-python/recipes-devtools/python/python3-javaobj-py3_0.4.4.bb @@ -5,10 +5,15 @@ DESCRIPTION = "python-javaobj is a python library that provides functions\ representation is a standard data interchange format in Java world." HOMEPAGE = "https://github.com/tcalmant/python-javaobj" LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57" +LIC_FILES_CHKSUM = "file://LICENSE;md5=d273d63619c9aeaf15cdaf76422c4f87" -SRC_URI[sha256sum] = "38f74db3a57e9998a9774e3614afb95cb396f139f29b3fdb130c5af554435259" +SRC_URI[sha256sum] = "e4e3257ef2cf81a3339787a4d5cf924e54c91f095a723f6d2584dae61d4396ed" inherit pypi setuptools3 BBCLASSEXTEND = "native nativesdk" + +RDEPENDS:${PN} += " \ + python3-compression \ + python3-logging \ +" diff --git a/meta-python/recipes-devtools/python/python3-jdatetime_4.1.0.bb b/meta-python/recipes-devtools/python/python3-jdatetime_5.0.0.bb index c96e5c39ed..f1dd368ea0 100644 --- a/meta-python/recipes-devtools/python/python3-jdatetime_4.1.0.bb +++ b/meta-python/recipes-devtools/python/python3-jdatetime_5.0.0.bb @@ -3,7 +3,7 @@ HOMEPAGE = "https://github.com/slashmili/python-jalali" LICENSE = "Python-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=c80be45b33471b4a23cf53d06a8172be" -SRC_URI[sha256sum] = "4a67a82ee57e35b5f6f9f7fbe6a0eda63f56ce1dd8af409b4c2a26a3340457db" +SRC_URI[sha256sum] = "2cc603d913c0d8e328928454d3d295261cb037e9950227f67c9629ab4710fdf9" PYPI_PACKAGE = "jdatetime" @@ -12,6 +12,6 @@ inherit pypi setuptools3 CLEANBROKEN = "1" RDEPENDS:${PN} += " \ - ${PYTHON_PN}-modules \ + python3-modules \ " diff --git a/meta-python/recipes-devtools/python/python3-jdcal/run-ptest b/meta-python/recipes-devtools/python/python3-jdcal/run-ptest index 5cec711696..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-jdcal/run-ptest +++ b/meta-python/recipes-devtools/python/python3-jdcal/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-jdcal_1.4.1.bb b/meta-python/recipes-devtools/python/python3-jdcal_1.4.1.bb index 8655150b03..afabe14a8a 100644 --- a/meta-python/recipes-devtools/python/python3-jdcal_1.4.1.bb +++ b/meta-python/recipes-devtools/python/python3-jdcal_1.4.1.bb @@ -12,14 +12,15 @@ inherit pypi setuptools3 ptest SRC_URI[md5sum] = "e05bdb60fa80f25bc60e73e0c6b7c5dc" SRC_URI[sha256sum] = "472872e096eb8df219c23f2689fc336668bdb43d194094b5cc1707e1640acfc8" -RDEPENDS:${PN} += "${PYTHON_PN}-compression ${PYTHON_PN}-io ${PYTHON_PN}-pprint ${PYTHON_PN}-shell" +RDEPENDS:${PN} += "python3-compression python3-io python3-pprint python3-shell" SRC_URI += " \ file://run-ptest \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-jedi_0.18.1.bb b/meta-python/recipes-devtools/python/python3-jedi_0.19.1.bb index fb582c54bc..56395c3b5d 100644 --- a/meta-python/recipes-devtools/python/python3-jedi_0.18.1.bb +++ b/meta-python/recipes-devtools/python/python3-jedi_0.19.1.bb @@ -1,20 +1,19 @@ SUMMARY = "An autocompletion tool for Python that can be used for text editors." HOMEPAGE = "https://github.com/davidhalter/jedi" -AUTHOR = "David Halter <davidhalter88@gmail.com>" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=5ed06eebfcb244cd66ebf6cef9c23ab4" PYPI_PACKAGE = "jedi" -SRC_URI[sha256sum] = "74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab" +SRC_URI[sha256sum] = "cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd" RDEPENDS:${PN} = " \ - ${PYTHON_PN}-parso \ - ${PYTHON_PN}-core \ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-pydoc \ - ${PYTHON_PN}-compile \ - ${PYTHON_PN}-json \ + python3-parso \ + python3-core \ + python3-compression \ + python3-pydoc \ + python3-compile \ + python3-json \ " inherit setuptools3 pypi diff --git a/meta-python/recipes-devtools/python/python3-joblib_1.1.0.bb b/meta-python/recipes-devtools/python/python3-joblib_1.4.0.bb index e69cfefd1f..868e3f2114 100644 --- a/meta-python/recipes-devtools/python/python3-joblib_1.1.0.bb +++ b/meta-python/recipes-devtools/python/python3-joblib_1.4.0.bb @@ -4,11 +4,10 @@ LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=2e481820abf0a70a18011a30153df066" inherit setuptools3 pypi -SRC_URI[sha256sum] = "4158fcecd13733f8be669be0683b96ebdbbd38d23559f54dca7205aea1bf1e35" +SRC_URI[sha256sum] = "1eb0dc091919cd384490de890cb5dfd538410a6d4b3b54eef09fb8c50b409b1c" RDEPENDS:${PN} += " \ python3-asyncio \ - python3-distutils \ python3-json \ python3-multiprocessing \ python3-pprint \ diff --git a/meta-python/recipes-devtools/python/python3-jsbeautifier_1.15.1.bb b/meta-python/recipes-devtools/python/python3-jsbeautifier_1.15.1.bb new file mode 100644 index 0000000000..5a0e5a8499 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-jsbeautifier_1.15.1.bb @@ -0,0 +1,19 @@ +SUMMARY = "JavaScript unobfuscator and beautifier." +HOMEPAGE = "https://beautifier.io/" +LICENSE = "MIT" +SECTION = "devel/python" +LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=8227180126797a0148f94f483f3e1489" + +inherit pypi setuptools3 + +SRC_URI[sha256sum] = "ebd733b560704c602d744eafc839db60a1ee9326e30a2a80c4adb8718adc1b24" + +PYPI_PACKAGE="jsbeautifier" + +RDEPENDS:${PN} += "\ + python3-core \ + python3-stringold \ + python3-shell \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-jsmin/7a75d76c2d6bfb917f30ced8f5c0a9a4157f7819.patch b/meta-python/recipes-devtools/python/python3-jsmin/7a75d76c2d6bfb917f30ced8f5c0a9a4157f7819.patch new file mode 100644 index 0000000000..2646e2f5a0 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-jsmin/7a75d76c2d6bfb917f30ced8f5c0a9a4157f7819.patch @@ -0,0 +1,82 @@ +From 7a75d76c2d6bfb917f30ced8f5c0a9a4157f7819 Mon Sep 17 00:00:00 2001 +From: aekoroglu <ali.erdinc.koroglu@intel.com> +Date: Fri, 24 Jun 2022 14:12:59 +0300 +Subject: [PATCH] DeprecationWarning invalid escape sequence fix + +Upstream-Status: Submitted [https://github.com/tikitu/jsmin/pull/38] +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + jsmin/test.py | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +diff --git a/jsmin/test.py b/jsmin/test.py +index 173ac65..afea4e7 100644 +--- a/jsmin/test.py ++++ b/jsmin/test.py +@@ -337,8 +337,8 @@ def testImplicitSemicolon3(self): + self.assertMinified("return//comment...\r\na", "return\na") + + def testSingleComment2(self): +- self.assertMinified('x.replace(/\//, "_")// slash to underscore', +- 'x.replace(/\//,"_")') ++ self.assertMinified('x.replace(/\\//, "_")// slash to underscore', ++ 'x.replace(/\\//,"_")') + + def testSlashesNearComments(self): + original = ''' +@@ -383,8 +383,8 @@ def test_space_in_regex(self): + self.assertMinified(original, original) + + def test_brackets_around_slashed_regex(self): +- original = 'function a() { /\//.test("a") }' +- expected = 'function a(){/\//.test("a")}' ++ original = 'function a() { /\\//.test("a") }' ++ expected = 'function a(){/\\//.test("a")}' + self.assertMinified(original, expected) + + def test_angular_1(self): +@@ -455,12 +455,12 @@ def testBackticksTagged(self): + def test_issue_bitbucket_16(self): + original = """ + f = function() { +- return /DataTree\/(.*)\//.exec(this._url)[1]; ++ return /DataTree\\/(.*)\\//.exec(this._url)[1]; + } + """ + self.assertMinified( + original, +- 'f=function(){return /DataTree\/(.*)\//.exec(this._url)[1];}') ++ 'f=function(){return /DataTree\\/(.*)\\//.exec(this._url)[1];}') + + def test_issue_bitbucket_17(self): + original = "// hi\n/^(get|post|head|put)$/i.test('POST')" +@@ -470,7 +470,7 @@ def test_issue_bitbucket_17(self): + def test_issue_6(self): + original = ''' + respond.regex = { +- comments: /\/\*[^*]*\*+([^/][^*]*\*+)*\//gi, ++ comments: /\\/\\*[^*]*\\*+([^/][^*]*\\*+)*\\//gi, + urls: 'whatever' + }; + ''' +@@ -548,16 +548,16 @@ def test_issue_9_multi_comments(self): + + def test_issue_12_re_nl_if(self): + original = ''' +- var re = /\d{4}/ ++ var re = /\\d{4}/ + if (1) { console.log(2); }''' + self.assertMinified( +- original, 'var re=/\d{4}/\nif(1){console.log(2);}') ++ original, 'var re=/\\d{4}/\nif(1){console.log(2);}') + + def test_issue_12_re_nl_other(self): + original = ''' +- var re = /\d{4}/ ++ var re = /\\d{4}/ + g = 10''' +- self.assertMinified(original , 'var re=/\d{4}/\ng=10') ++ self.assertMinified(original , 'var re=/\\d{4}/\ng=10') + + def test_preserve_copyright(self): + original = ''' diff --git a/meta-python/recipes-devtools/python/python3-jsmin/run-ptest b/meta-python/recipes-devtools/python/python3-jsmin/run-ptest index cbcfffda5b..586608d7b2 100644 --- a/meta-python/recipes-devtools/python/python3-jsmin/run-ptest +++ b/meta-python/recipes-devtools/python/python3-jsmin/run-ptest @@ -1,3 +1,2 @@ #!/bin/sh - -python3 test.py +pytest -vv test.py | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' diff --git a/meta-python/recipes-devtools/python/python3-jsmin_3.0.1.bb b/meta-python/recipes-devtools/python/python3-jsmin_3.0.1.bb index 51b17066ee..c3129e7b53 100644 --- a/meta-python/recipes-devtools/python/python3-jsmin_3.0.1.bb +++ b/meta-python/recipes-devtools/python/python3-jsmin_3.0.1.bb @@ -10,11 +10,12 @@ SRC_URI[sha256sum] = "c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5 BBCLASSEXTEND = "native nativesdk" SRC_URI += " \ + file://7a75d76c2d6bfb917f30ced8f5c0a9a4157f7819.patch \ file://run-ptest \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-jsonpatch_1.32.bb b/meta-python/recipes-devtools/python/python3-jsonpatch_1.32.bb deleted file mode 100644 index 2a653cce88..0000000000 --- a/meta-python/recipes-devtools/python/python3-jsonpatch_1.32.bb +++ /dev/null @@ -1,15 +0,0 @@ -SUMMARY = "Appling JSON patches in Python 2.6+ and 3.x" -HOMEPAGE = "https://github.com/stefankoegl/python-json-patch" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://COPYING;md5=32b15c843b7a329130f4e266a281ebb3" - -inherit pypi setuptools3 - -SRC_URI[sha256sum] = "b6ddfe6c3db30d81a96aaeceb6baf916094ffa23d7dd5fa2c13e13f8b6e600c2" - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-jsonpointer \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-stringold \ -" diff --git a/meta-python/recipes-devtools/python/python3-jsonpatch_1.33.bb b/meta-python/recipes-devtools/python/python3-jsonpatch_1.33.bb new file mode 100644 index 0000000000..6a1715c6df --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-jsonpatch_1.33.bb @@ -0,0 +1,15 @@ +SUMMARY = "Appling JSON patches in Python 2.6+ and 3.x" +HOMEPAGE = "https://github.com/stefankoegl/python-json-patch" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=4f81c84f9a053e31fe9402a2a4e78864" + +inherit pypi setuptools3 + +SRC_URI[sha256sum] = "9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c" + +RDEPENDS:${PN} += " \ + python3-json \ + python3-jsonpointer \ + python3-netclient \ + python3-stringold \ +" diff --git a/meta-python/recipes-devtools/python/python3-jsonpath-rw_1.4.0.bb b/meta-python/recipes-devtools/python/python3-jsonpath-rw_1.4.0.bb index b1af0f0336..4cc39a286a 100644 --- a/meta-python/recipes-devtools/python/python3-jsonpath-rw_1.4.0.bb +++ b/meta-python/recipes-devtools/python/python3-jsonpath-rw_1.4.0.bb @@ -8,4 +8,9 @@ SRC_URI[sha256sum] = "05c471281c45ae113f6103d1268ec7a4831a2e96aa80de45edc89b11fa inherit pypi setuptools3 -RDEPENDS:${PN} += " python3-decorator" +RDEPENDS:${PN} += " \ + python3-decorator \ + python3-logging \ + python3-ply \ + python3-six \ +" diff --git a/meta-python/recipes-devtools/python/python3-jsonrpcclient_4.0.2.bb b/meta-python/recipes-devtools/python/python3-jsonrpcclient_4.0.3.bb index 26ee3786b4..459726199e 100644 --- a/meta-python/recipes-devtools/python/python3-jsonrpcclient_4.0.2.bb +++ b/meta-python/recipes-devtools/python/python3-jsonrpcclient_4.0.3.bb @@ -3,12 +3,17 @@ HOMEPAGE = "https://github.com/explodinglabs/jsonrpcclient" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=10f3d7679914df805c98fb351172e677" -SRC_URI[sha256sum] = "c0d475494b3e1b591ecdee7883739accaf5695edb673f16b7383b8c6bbdb1ca3" +SRCREV = "e5dd11736925a9a8e463fc9420eab95235f181e3" +SRC_URI = "git://github.com/explodinglabs/jsonrpcclient.git;branch=main;protocol=https" -inherit pypi setuptools3 +inherit python_setuptools_build_meta + +S = "${WORKDIR}/git" RDEPENDS:${PN} += "\ - python3-core \ + python3-json \ + python3-math \ + python3-netclient \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-jsonrpcserver_5.0.7.bb b/meta-python/recipes-devtools/python/python3-jsonrpcserver_5.0.7.bb deleted file mode 100644 index 12e9003798..0000000000 --- a/meta-python/recipes-devtools/python/python3-jsonrpcserver_5.0.7.bb +++ /dev/null @@ -1,22 +0,0 @@ -SUMMARY = "Library to process JSON-RPC requests" -HOMEPAGE = "https://github.com/explodinglabs/jsonrpcserver" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=61b63ea9d36f6fb63ddaaaac8265304f" - -SRC_URI[sha256sum] = "b15d3fd043ad0c40b2ff17f7df2ddaec2e880bb923b40d133939a107c97fde5c" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += "\ - python3-apply-defaults \ - python3-asyncio \ - python3-core \ - python3-json \ - python3-jsonschema \ - python3-logging \ - python3-netclient \ - python3-pkgutil \ - python3-oslash \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-jstyleson_0.0.2.bb b/meta-python/recipes-devtools/python/python3-jstyleson_0.0.2.bb index e70ce33efc..237713bf12 100644 --- a/meta-python/recipes-devtools/python/python3-jstyleson_0.0.2.bb +++ b/meta-python/recipes-devtools/python/python3-jstyleson_0.0.2.bb @@ -13,3 +13,5 @@ inherit pypi setuptools3 SRC_URI[sha256sum] = "680003f3b15a2959e4e6a351f3b858e3c07dd3e073a0d54954e34d8ea5e1308e" BBCLASSEXTEND = "native nativesdk" + +RDEPENDS:${PN} += "python3-json" diff --git a/meta-python/recipes-devtools/python/python3-kconfiglib_14.1.0.bb b/meta-python/recipes-devtools/python/python3-kconfiglib_14.1.0.bb index ec09cfc58e..b9c1c4e384 100644 --- a/meta-python/recipes-devtools/python/python3-kconfiglib_14.1.0.bb +++ b/meta-python/recipes-devtools/python/python3-kconfiglib_14.1.0.bb @@ -8,3 +8,9 @@ SRC_URI[sha256sum] = "bed2cc2216f538eca4255a83a4588d8823563cdd50114f86cf1a2674e6 inherit pypi setuptools3 BBCLASSEXTEND = "native nativesdk" + +RDEPENDS:${PN} += " \ + python3-curses \ + python3-shell \ + python3-tkinter \ +" diff --git a/meta-python/recipes-devtools/python/python3-keras-applications_1.0.8.bb b/meta-python/recipes-devtools/python/python3-keras-applications_1.0.8.bb index 6c2af0d4ea..ba1819979b 100644 --- a/meta-python/recipes-devtools/python/python3-keras-applications_1.0.8.bb +++ b/meta-python/recipes-devtools/python/python3-keras-applications_1.0.8.bb @@ -7,11 +7,8 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=366e2fd3c9714f162d3663b6f97cfe41" SRC_URI = "git://github.com/keras-team/keras-applications.git;branch=master;protocol=https" SRCREV ?= "3b180cb10eda683dda7913ecee2e6487288d292d" - inherit setuptools3 -PIP_INSTALL_PACKAGE = "Keras_Applications" - S = "${WORKDIR}/git" BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-kivy/0001-add-support-for-glesv2.patch b/meta-python/recipes-devtools/python/python3-kivy/0001-add-support-for-glesv2.patch index bb236b4195..e38b31d34d 100644 --- a/meta-python/recipes-devtools/python/python3-kivy/0001-add-support-for-glesv2.patch +++ b/meta-python/recipes-devtools/python/python3-kivy/0001-add-support-for-glesv2.patch @@ -1,6 +1,19 @@ +From 98224fec48d6e0f32b28d81220bf1ee1637ce045 Mon Sep 17 00:00:00 2001 +From: William Huang <whuang8933@gmail.com> +Date: Thu, 2 Sep 2021 07:25:07 -0400 +Subject: [PATCH] recipes-devtools: python: add support for Kivy + +Upstream-Status: Pending + +--- + setup.py | 16 +++++++++++++--- + 1 file changed, 13 insertions(+), 3 deletions(-) + +diff --git a/setup.py b/setup.py +index 35e34afdd..0ba3aca72 100644 --- a/setup.py +++ b/setup.py -@@ -695,7 +695,18 @@ def determine_gl_flags(): +@@ -730,7 +730,18 @@ def determine_gl_flags(): c_options['use_x11'] = True c_options['use_egl'] = True else: @@ -20,7 +33,7 @@ return flags, base_flags -@@ -723,14 +734,13 @@ def determine_sdl2(): +@@ -774,14 +785,13 @@ def determine_sdl2(): sdl_inc = join(include, 'SDL2') if isdir(sdl_inc): sdl2_paths.append(sdl_inc) @@ -34,5 +47,5 @@ - ['/usr/local/lib/']) + ['']) - if sdl2_flags: - flags = merge(flags, sdl2_flags) + if kivy_sdl2_path: + # If we have a custom path, we need to add the rpath to the linker diff --git a/meta-python/recipes-devtools/python/python3-kivy_2.1.0..bb b/meta-python/recipes-devtools/python/python3-kivy_2.3.0.bb index 684bca03e1..991aa0f7d8 100644 --- a/meta-python/recipes-devtools/python/python3-kivy_2.1.0..bb +++ b/meta-python/recipes-devtools/python/python3-kivy_2.3.0.bb @@ -2,23 +2,19 @@ SUMMARY = "Open source Python library for rapid development of applications \ that make use of innovative user interfaces, such as multi-touch apps." HOMEPAGE = "https://kivy.org/" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=22e7b4dd8140eec57fd7edfd9fa23dfc" +LIC_FILES_CHKSUM = "file://LICENSE;md5=6d3bc49400e35d5a2279d14c40dcfb09" inherit setuptools3 pkgconfig features_check -PIP_INSTALL_PACKAGE = "Kivy" - -SRC_URI = "\ - git://github.com/kivy/kivy.git;protocol=https;branch=master \ -" # Kivy's setup files only look for GLES libraries for Android, iOS, RPi, # and mali-based OS's. We need to patch the setup file to tell Kivy setup # that our machine has GLES libaries installed as well -# Also, if using SDL2 as backend, SDL2 needs to be configured wth gles -SRC_URI += " \ - file://0001-add-support-for-glesv2.patch \ -" -SRCREV = "960b95dc666753f59eff1b449124490fbec10184" +# Also, if using SDL2 as backend, SDL2 needs to be configured with gles +SRC_URI = "git://github.com/kivy/kivy.git;protocol=https;branch=stable \ + file://0001-add-support-for-glesv2.patch \ + " + +SRCREV = "9ef218027178115a66b417ae34b21f488bdd3617" S = "${WORKDIR}/git" @@ -43,7 +39,9 @@ export KIVY_GRAPHICS KIVY_CROSS_SYSROOT="${RECIPE_SYSROOT}" export KIVY_CROSS_SYSROOT -REQUIRED_DISTRO_FEATURES += "x11 opengl" +REQUIRED_DISTRO_FEATURES += "opengl gobject-introspection-data" + +ANY_OF_DISTRO_FEATURES = "x11 wayland" DEPENDS += " \ gstreamer1.0 \ diff --git a/meta-python/recipes-devtools/python/python3-kiwisolver_1.4.4.bb b/meta-python/recipes-devtools/python/python3-kiwisolver_1.4.5.bb index acc8bd5b6f..a1949b1138 100644 --- a/meta-python/recipes-devtools/python/python3-kiwisolver_1.4.4.bb +++ b/meta-python/recipes-devtools/python/python3-kiwisolver_1.4.5.bb @@ -3,7 +3,7 @@ HOMEPAGE = "https://github.com/nucleic/kiwi" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=f137eeae9cf8004d06830f6ab25b2d52" -SRC_URI[sha256sum] = "d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955" +SRC_URI[sha256sum] = "e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec" inherit pypi python_setuptools_build_meta diff --git a/meta-python/recipes-devtools/python/python3-langtable_0.0.58.bb b/meta-python/recipes-devtools/python/python3-langtable_0.0.65.bb index 025ceb6811..fa9edc67d4 100644 --- a/meta-python/recipes-devtools/python/python3-langtable_0.0.58.bb +++ b/meta-python/recipes-devtools/python/python3-langtable_0.0.65.bb @@ -6,7 +6,7 @@ SECTION = "devel/python" LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504" -SRC_URI[sha256sum] = "47128c06008acedee1745f2d56151461d94526b2be95a4124692013af35496b6" +SRC_URI[sha256sum] = "791ec5403859704e1dee4d2a056a30ec21d1e7bc040658ce62c40e0427ba4333" inherit pypi setuptools3 python3native @@ -16,8 +16,8 @@ DISTUTILS_INSTALL_ARGS += " \ FILES:${PN} += "${datadir}/*" RDEPENDS:${PN} += " \ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-doctest \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-xml \ + python3-compression \ + python3-doctest \ + python3-logging \ + python3-xml \ " diff --git a/meta-python/recipes-devtools/python/python3-lazy-object-proxy_1.10.0.bb b/meta-python/recipes-devtools/python/python3-lazy-object-proxy_1.10.0.bb new file mode 100644 index 0000000000..263c46869f --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-lazy-object-proxy_1.10.0.bb @@ -0,0 +1,11 @@ +SUMMARY = "A fast and thorough lazy object proxy" +HOMEPAGE = "https://python-lazy-object-proxy.readthedocs.io/" +LICENSE = "BSD-2-Clause" +SECTION = "devel/python" +LIC_FILES_CHKSUM = "file://LICENSE;md5=d606e94f56c21c8e0cdde0b622dcdf57" + +DEPENDS += "python3-setuptools-scm-native python3-pip-native" + +SRC_URI[sha256sum] = "78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69" + +inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-lazy-object-proxy_1.7.1.bb b/meta-python/recipes-devtools/python/python3-lazy-object-proxy_1.7.1.bb deleted file mode 100644 index 4c20fcc861..0000000000 --- a/meta-python/recipes-devtools/python/python3-lazy-object-proxy_1.7.1.bb +++ /dev/null @@ -1,11 +0,0 @@ -SUMMARY = "A fast and thorough lazy object proxy" -HOMEPAGE = "https://python-lazy-object-proxy.readthedocs.io/" -LICENSE = "BSD-2-Clause" -SECTION = "devel/python" -LIC_FILES_CHKSUM = "file://LICENSE;md5=9c5c2c74370826468065c5702b8a1fcf" - -DEPENDS += "${PYTHON_PN}-setuptools-scm-native ${PYTHON_PN}-pip-native" - -SRC_URI[sha256sum] = "d609c75b986def706743cdebe5e47553f4a5a1da9c5ff66d76013ef396b5a8a4" - -inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-lazy_1.6.bb b/meta-python/recipes-devtools/python/python3-lazy_1.6.bb new file mode 100644 index 0000000000..97517f89a6 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-lazy_1.6.bb @@ -0,0 +1,8 @@ +SUMMARY = "Lazy attributes are computed attributes that are evaluated only once, the first time they are used." + +LICENSE = "BSD-2-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=7df3865e8640604acfa474235d2db76b" + +SRC_URI[sha256sum] = "7127324ec709e8324f08cb4611c1abe01776bda53bb9ce68dc5dfa46ca0ed3e9" + +inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-libevdev_0.11.bb b/meta-python/recipes-devtools/python/python3-libevdev_0.11.bb new file mode 100644 index 0000000000..27e336710c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-libevdev_0.11.bb @@ -0,0 +1,18 @@ +DESCRIPTION = "python-libevdev is a Python wrapper around the libevdev C library." +HOMEPAGE = "https://gitlab.freedesktop.org/libevdev/python-libevdev" +SECTION = "devel/python" + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" + +SRC_URI[md5sum] = "34b48098c1fba26de79a0d67a17a588a" +SRC_URI[sha256sum] = "e9ca006a4df2488a60bd9a740011ee948d81904be2364f017e560169508f560f" + +inherit pypi setuptools3 + +PYPI_PACKAGE = "libevdev" + +RDEPENDS:${PN} += " \ + libevdev \ + python3-ctypes \ +" diff --git a/meta-python/recipes-devtools/python/python3-license-expression/run-ptest b/meta-python/recipes-devtools/python/python3-license-expression/run-ptest deleted file mode 100644 index 5cec711696..0000000000 --- a/meta-python/recipes-devtools/python/python3-license-expression/run-ptest +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -pytest diff --git a/meta-python/recipes-devtools/python/python3-license-expression_21.6.14.bb b/meta-python/recipes-devtools/python/python3-license-expression_21.6.14.bb deleted file mode 100644 index 2ee4909bd7..0000000000 --- a/meta-python/recipes-devtools/python/python3-license-expression_21.6.14.bb +++ /dev/null @@ -1,32 +0,0 @@ -SUMMARY = "Utility library to parse, compare, simplify and normalize license expressions" -HOMEPAGE = "https://github.com/nexB/license-expression" - -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://apache-2.0.LICENSE;md5=9429839cdc4b292ff46e88b524c6e0c9" - -SRC_URI[sha256sum] = "9de87a427c9a449eee7913472fb9ed03b63036295547369fdbf95f76a8b924b2" - -inherit pypi ptest python_setuptools_build_meta - -DEPENDS += "${PYTHON_PN}-setuptools-scm-native" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-booleanpy \ -" - -BBCLASSEXTEND = "native nativesdk" - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ -" - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/tests - install -d ${D}${PTEST_PATH}/src - cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ - cp -rf ${S}/src/* ${D}${PTEST_PATH}/src/ -} diff --git a/meta-python/recipes-devtools/python/python3-linux-procfs_0.7.3.bb b/meta-python/recipes-devtools/python/python3-linux-procfs_0.7.3.bb new file mode 100644 index 0000000000..8c53d38ce3 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-linux-procfs_0.7.3.bb @@ -0,0 +1,14 @@ +DESCRIPTION = "Python classes to extract information from the Linux kernel /proc files." +HOMEPAGE = "https://git.kernel.org/pub/scm/libs/python/python-linux-procfs/python-linux-procfs.git/" +SECTION = "devel/python" +LICENSE = "GPL-2.0-only" +LIC_FILES_CHKSUM = "file://COPYING;md5=6a6855782848d572347212f667a2d637" + +SRC_URI = "git://git.kernel.org/pub/scm/libs/python/python-linux-procfs/python-linux-procfs.git;branch=main" +SRCREV = "59ecd1ba018141a02ffe59c16a9346991dfd0d48" + +S = "${WORKDIR}/git" + +inherit setuptools3 + +RDEPENDS:${PN} += "python3-six" diff --git a/meta-python/recipes-devtools/python/python3-lockfile_0.12.2.bb b/meta-python/recipes-devtools/python/python3-lockfile_0.12.2.bb index b9dc4722af..af738e08ec 100644 --- a/meta-python/recipes-devtools/python/python3-lockfile_0.12.2.bb +++ b/meta-python/recipes-devtools/python/python3-lockfile_0.12.2.bb @@ -12,6 +12,9 @@ SRC_URI[sha256sum] = "6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361 inherit pypi setuptools3 DEPENDS += "python3-distutils-extra-native python3-pbr-native" -RDEPENDS:${PN} += "python3-sqlite3" +RDEPENDS:${PN} += " \ + python3-io \ + python3-sqlite3 \ +" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-lorem/run-ptest b/meta-python/recipes-devtools/python/python3-lorem/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-lorem/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-lorem_0.1.1.bb b/meta-python/recipes-devtools/python/python3-lorem_0.1.1.bb index 9ce7a6293c..97b3e72364 100644 --- a/meta-python/recipes-devtools/python/python3-lorem_0.1.1.bb +++ b/meta-python/recipes-devtools/python/python3-lorem_0.1.1.bb @@ -5,12 +5,25 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=5301c01b2bcdeedba23645f94db2f179" SRC_URI[md5sum] = "e3f0064a94c13e19780eb724affdb426" SRC_URI[sha256sum] = "785f4109a241fc2891e59705e85d065f6e6d3ed6ad91750a8cb54d4f3e59d934" +SRC_URI += "\ + file://run-ptest \ +" + PYPI_PACKAGE = "lorem" -inherit pypi setuptools3 +inherit pypi setuptools3 ptest CLEANBROKEN = "1" RDEPENDS:${PN} += " \ python3 \ " +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} diff --git a/meta-python/recipes-devtools/python/python3-lrparsing_1.0.17.bb b/meta-python/recipes-devtools/python/python3-lrparsing_1.0.17.bb index 673d32c2d4..8cd60d3a0f 100644 --- a/meta-python/recipes-devtools/python/python3-lrparsing_1.0.17.bb +++ b/meta-python/recipes-devtools/python/python3-lrparsing_1.0.17.bb @@ -17,7 +17,6 @@ RDEPENDS:${PN} = " \ " inherit setuptools3 -PIP_INSTALL_PACKAGE = "lrparsing" S = "${WORKDIR}/lrparsing-${PV}" diff --git a/meta-python/recipes-devtools/python/python3-lru-dict_1.1.8.bb b/meta-python/recipes-devtools/python/python3-lru-dict_1.3.0.bb index b870bc0889..e9535fa6f1 100644 --- a/meta-python/recipes-devtools/python/python3-lru-dict_1.1.8.bb +++ b/meta-python/recipes-devtools/python/python3-lru-dict_1.3.0.bb @@ -4,6 +4,8 @@ SECTION = "devel/python" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=9d10a486ee04034fdef5162fd791f153" -SRC_URI[sha256sum] = "878bc8ef4073e5cfb953dfc1cf4585db41e8b814c0106abde34d00ee0d0b3115" +SRC_URI[sha256sum] = "54fd1966d6bd1fcde781596cb86068214edeebff1db13a2cea11079e3fd07b6b" inherit pypi setuptools3 + +SRC_URI += "${PYPI_SRC_URI}" diff --git a/meta-python/recipes-devtools/python/python3-luma-core_2.3.1.bb b/meta-python/recipes-devtools/python/python3-luma-core_2.4.2.bb index 1d5b146fa9..90967f8e56 100644 --- a/meta-python/recipes-devtools/python/python3-luma-core_2.3.1.bb +++ b/meta-python/recipes-devtools/python/python3-luma-core_2.4.2.bb @@ -2,16 +2,16 @@ SUMMARY = "A component library to support SBC display drivers" DESCRIPTION = "A component library to support SBC display drivers" HOMEPAGE = "https://github.com/rm-hull/luma.core" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=3b1d500f5911ec7522f1f790d616e0ee" +LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=2083293a38df91b8d470d3fe30069262" inherit pypi python_setuptools_build_meta -SRC_URI[sha256sum] = "f293f5fff8946eea62af3a5d5d7da55c37d2b64aac6c9c90180a385da9f7d003" +SRC_URI[sha256sum] = "963c264164d4374f549d57db09599e0ca458cea1bd05e16939897619be4e6dbd" PYPI_PACKAGE = "luma.core" RDEPENDS:${PN} += " \ - ${PYTHON_PN}-pillow \ - ${PYTHON_PN}-threading \ - ${PYTHON_PN}-smbus2 \ + python3-pillow \ + python3-threading \ + python3-smbus2 \ " diff --git a/meta-python/recipes-devtools/python/python3-luma-oled_3.8.1.bb b/meta-python/recipes-devtools/python/python3-luma-oled_3.13.0.bb index a551e46fcb..95f066affe 100644 --- a/meta-python/recipes-devtools/python/python3-luma-oled_3.8.1.bb +++ b/meta-python/recipes-devtools/python/python3-luma-oled_3.13.0.bb @@ -4,16 +4,16 @@ A small library to drive an OLED device with either SSD1306 , SSD1309, SSD1322, SSD1325, SSD1327, SSD1331, SSD1351 or SH1106 chipset" HOMEPAGE = "https://github.com/rm-hull/luma.oled" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=c328c862c3335ad464e1c9a3ba574249" +LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=5ec447eb69733e20a55838de7e8cb991" inherit pypi setuptools3 -SRC_URI[sha256sum] = "a9b445ecc686e9413ddac655544da21d801bbc6b94612736cf59283e6b92bcbb" +SRC_URI[sha256sum] = "7e2a0d6a4c968c64980255d681ec27914d9abd5a66a9019b289bf3ad050c2125" CLEANBROKEN = "1" PYPI_PACKAGE = "luma.oled" RDEPENDS:${PN} += " \ - ${PYTHON_PN}-luma-core \ + python3-luma-core \ " diff --git a/meta-python/recipes-devtools/python/python3-lxml_4.9.1.bb b/meta-python/recipes-devtools/python/python3-lxml_4.9.1.bb deleted file mode 100644 index 92a30f7907..0000000000 --- a/meta-python/recipes-devtools/python/python3-lxml_4.9.1.bb +++ /dev/null @@ -1,42 +0,0 @@ -SUMMARY = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." -DESCRIPTION = "lxml is a Pythonic, mature binding for the libxml2 and \ -libxslt libraries. It provides safe and convenient access to these \ -libraries using the ElementTree API. It extends the ElementTree API \ -significantly to offer support for XPath, RelaxNG, XML Schema, XSLT, \ -C14N and much more." -HOMEPAGE = "https://lxml.de/" -SECTION = "devel/python" -LICENSE = "BSD-3-Clause & GPL-2.0-only & MIT & PSF-2.0" -LIC_FILES_CHKSUM = "file://LICENSES.txt;md5=e4c045ebad958ead4b48008f70838403 \ - file://doc/licenses/elementtree.txt;md5=eb34d036a6e3d56314ee49a6852ac891 \ - file://doc/licenses/BSD.txt;md5=700a1fc17f4797d4f2d34970c8ee694b \ - file://doc/licenses/GPL.txt;md5=94d55d512a9ba36caa9b7df079bae19f \ - file://src/lxml/isoschematron/resources/rng/iso-schematron.rng;beginline=2;endline=7;md5=fc85684a8dd5fa272c086bceb0d99e10 \ - file://src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_schematron_message.xsl;beginline=2;endline=24;md5=cc86b7b2bbc678e13f58ea403eb9929b \ - file://src/lxml/isoschematron/resources/xsl/RNG2Schtrn.xsl;beginline=2;endline=7;md5=5b03236d293dc3784205542b409d2f53 \ - " - -DEPENDS += "libxml2 libxslt" - -SRC_URI[sha256sum] = "fe749b052bb7233fe5d072fcb549221a8cb1a16725c47c37e42b0b9cb3ff2c3f" - -SRC_URI += "${PYPI_SRC_URI}" -inherit pkgconfig pypi setuptools3 - -# {standard input}: Assembler messages: -# {standard input}:1488805: Error: branch out of range -DEBUG_OPTIMIZATION:remove:mips = " -Og" -DEBUG_OPTIMIZATION:append:mips = " -O" -BUILD_OPTIMIZATION:remove:mips = " -Og" -BUILD_OPTIMIZATION:append:mips = " -O" - -DEBUG_OPTIMIZATION:remove:mipsel = " -Og" -DEBUG_OPTIMIZATION:append:mipsel = " -O" -BUILD_OPTIMIZATION:remove:mipsel = " -Og" -BUILD_OPTIMIZATION:append:mipsel = " -O" - -BBCLASSEXTEND = "native nativesdk" - -RDEPENDS:${PN} += "libxml2 libxslt ${PYTHON_PN}-compression" - -CLEANBROKEN = "1" diff --git a/meta-python/recipes-devtools/python/python3-lz4/run-ptest b/meta-python/recipes-devtools/python/python3-lz4/run-ptest index 1b245bcd8f..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-lz4/run-ptest +++ b/meta-python/recipes-devtools/python/python3-lz4/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -v +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-lz4_4.0.2.bb b/meta-python/recipes-devtools/python/python3-lz4_4.3.3.bb index ad006e61b1..746926da4e 100644 --- a/meta-python/recipes-devtools/python/python3-lz4_4.0.2.bb +++ b/meta-python/recipes-devtools/python/python3-lz4_4.3.3.bb @@ -5,17 +5,25 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=6231efa4dd4811e62407314d90a57573" DEPENDS += " \ lz4 \ - ${PYTHON_PN}-setuptools-scm-native \ - ${PYTHON_PN}-pkgconfig-native \ + python3-setuptools-scm-native \ + python3-pkgconfig-native \ " SRC_URI += "file://run-ptest" -SRC_URI[sha256sum] = "083b7172c2938412ae37c3a090250bfdd9e4a6e855442594f86c3608ed12729b" +SRC_URI[sha256sum] = "01fe674ef2889dbb9899d8a67361e0c4a2c833af5aeb37dd505727cf5d2a131e" inherit pkgconfig pypi python_setuptools_build_meta ptest -RDEPENDS:${PN}-ptest += "${PYTHON_PN}-pytest ${PYTHON_PN}-multiprocessing ${PYTHON_PN}-psutil" +RDEPENDS:${PN}-ptest += "\ + python3-coverage \ + python3-pytest \ + python3-pytest-cov \ + python3-pytest-runner \ + python3-multiprocessing \ + python3-psutil \ + python3-unittest-automake-output \ +" do_install_ptest() { cp -rf ${S}/tests/ ${D}${PTEST_PATH}/ diff --git a/meta-python/recipes-devtools/python/python3-m2crypto/0001-setup.py-link-in-sysroot-not-in-host-directories.patch b/meta-python/recipes-devtools/python/python3-m2crypto/0001-setup.py-link-in-sysroot-not-in-host-directories.patch index f4c74384f9..0baadfcaa5 100644 --- a/meta-python/recipes-devtools/python/python3-m2crypto/0001-setup.py-link-in-sysroot-not-in-host-directories.patch +++ b/meta-python/recipes-devtools/python/python3-m2crypto/0001-setup.py-link-in-sysroot-not-in-host-directories.patch @@ -5,7 +5,7 @@ Subject: [PATCH] setup.py: link in sysroot, not in host directories Signed-off-by: Koen Kooi <koen@dominion.thruhere.net> -Upstream-status: Unknown +Upstream-Status: Pending [Unknown] --- setup.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/meta-python/recipes-devtools/python/python3-m2crypto/avoid-host-contamination.patch b/meta-python/recipes-devtools/python/python3-m2crypto/avoid-host-contamination.patch index 9d9b8449ba..3cd6f7c276 100644 --- a/meta-python/recipes-devtools/python/python3-m2crypto/avoid-host-contamination.patch +++ b/meta-python/recipes-devtools/python/python3-m2crypto/avoid-host-contamination.patch @@ -1,6 +1,6 @@ Filter out '/usr/include' for swig to avoid host contamination issue. -Upstream-Status: Upstream-Status: Inappropriate [cross compile specific] +Upstream-Status: Inappropriate [cross compile specific] Signed-off-by: Kai Kang <kai.kang@windriver.com> --- diff --git a/meta-python/recipes-devtools/python/python3-m2crypto_0.38.0.bb b/meta-python/recipes-devtools/python/python3-m2crypto_0.40.1.bb index 51a0dd676e..1d8c22d196 100644 --- a/meta-python/recipes-devtools/python/python3-m2crypto_0.38.0.bb +++ b/meta-python/recipes-devtools/python/python3-m2crypto_0.40.1.bb @@ -7,41 +7,45 @@ LIC_FILES_CHKSUM = "file://LICENCE;md5=b0e1f0b7d0ce8a62c18b1287b991800e" FILESEXTRAPATHS:prepend := "${THISDIR}/python-m2crypto:" SRC_URI += "file://0001-setup.py-link-in-sysroot-not-in-host-directories.patch \ - file://cross-compile-platform.patch \ - file://avoid-host-contamination.patch \ - file://0001-setup.py-address-openssl-3.x-build-issue.patch \ - " -SRC_URI[sha256sum] = "99f2260a30901c949a8dc6d5f82cd5312ffb8abc92e76633baf231bbbcb2decb" + file://cross-compile-platform.patch \ + file://avoid-host-contamination.patch \ + file://0001-setup.py-address-openssl-3.x-build-issue.patch \ + " +SRC_URI[sha256sum] = "bbfd113ec55708c05816252a4f09e4237df4f3bbfc8171cbbc33057d257bbb30" PYPI_PACKAGE = "M2Crypto" inherit pypi siteinfo setuptools3 DEPENDS += "openssl swig-native" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-distutils \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-netserver \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-smtpd \ - ${PYTHON_PN}-xmlrpc \ + python3-datetime \ + python3-setuptools \ + python3-logging \ + python3-netclient \ + python3-netserver \ + python3-numbers \ + python3-xmlrpc \ " DISTUTILS_BUILD_ARGS += "build_ext --openssl=${STAGING_EXECPREFIXDIR} -I${STAGING_INCDIR}" DISTUTILS_INSTALL_ARGS += "build_ext --openssl=${STAGING_EXECPREFIXDIR}" -SWIG_FEATURES:x86 = "-D__i386__" -SWIG_FEATURES:x32 = "-D__ILP32__" - -SWIG_FEATURES ?= "-D__${HOST_ARCH}__ ${@['-D__ILP32__','-D__LP64__'][d.getVar('SITEINFO_BITS') != '32']}" +SWIG_FEATURES ?= "-D__${HOST_ARCH}__ ${@['-D__ILP32__','-D__LP64__'][d.getVar('SITEINFO_BITS') != '32']} -DOPENSSL_NO_FILENAMES" SWIG_FEATURES:append:riscv64 = " -D__SIZEOF_POINTER__=${SITEINFO_BITS}/8 -D__riscv_xlen=${SITEINFO_BITS}" SWIG_FEATURES:append:riscv32 = " -D__SIZEOF_POINTER__=${SITEINFO_BITS}/8 -D__riscv_xlen=${SITEINFO_BITS}" SWIG_FEATURES:append:mipsarch = " -D_MIPS_SZPTR=${SITEINFO_BITS}" SWIG_FEATURES:append:powerpc64le = " -D__powerpc64__" +SWIG_FEATURES:append:x86 = " -D__i386__" +SWIG_FEATURES:append:x32 = " -D__ILP32__" + export SWIG_FEATURES export STAGING_DIR +do_install:append() { + rm -f ${D}${PYTHON_SITEPACKAGES_DIR}/M2Crypto/SSL/__pycache__/*.cpython-*.pyc + rm -f ${D}${PYTHON_SITEPACKAGES_DIR}/M2Crypto/__pycache__/*.cpython-*.pyc +} + BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-marshmallow/run-ptest b/meta-python/recipes-devtools/python/python3-marshmallow/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-marshmallow/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-marshmallow_3.17.0.bb b/meta-python/recipes-devtools/python/python3-marshmallow_3.17.0.bb deleted file mode 100644 index f2f5281d6c..0000000000 --- a/meta-python/recipes-devtools/python/python3-marshmallow_3.17.0.bb +++ /dev/null @@ -1,28 +0,0 @@ -SUMMARY = "Simplified object serialization in python" -DESCRIPTION = "Marshmallow is an ORM/ODM/framework-agnostic library for converting complex datatypes, such as objects, to and from native Python datatypes." -AUTHOR = "Marius Kriegerowski <mk@quakesaver.net>" -HOMEPAGE = "https://github.com/marshmallow-code/marshmallow" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "\ - file://LICENSE;md5=5bccd400dedfa74364481e56aacc0b4a \ - file://docs/license.rst;md5=13da439ad060419fb7cf364523017cfb" - -SRC_URI = "git://github.com/marshmallow-code/marshmallow.git;protocol=https;branch=dev" - -SRCREV = "4a6c08d53f181195c78b505abe155b2f35cbc0c1" - -S = "${WORKDIR}/git" - -inherit setuptools3 - -PIP_INSTALL_PACKAGE = "marshmallow" - -RDEPENDS:${PN} += " \ - python3-core \ - python3-datetime \ - python3-netclient \ - python3-numbers \ - python3-json \ - python3-pprint \ - python3-packaging \ -" diff --git a/meta-python/recipes-devtools/python/python3-marshmallow_3.21.1.bb b/meta-python/recipes-devtools/python/python3-marshmallow_3.21.1.bb new file mode 100644 index 0000000000..bf1d8dd290 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-marshmallow_3.21.1.bb @@ -0,0 +1,38 @@ +SUMMARY = "Simplified object serialization in python" +DESCRIPTION = "Marshmallow is an ORM/ODM/framework-agnostic library for converting complex datatypes, such as objects, to and from native Python datatypes." +HOMEPAGE = "https://github.com/marshmallow-code/marshmallow" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "\ + file://LICENSE;md5=27586b20700d7544c06933afe56f7df4 \ + file://docs/license.rst;md5=13da439ad060419fb7cf364523017cfb" + +SRC_URI[sha256sum] = "4e65e9e0d80fc9e609574b9983cf32579f305c718afb30d7233ab818571768c3" + +inherit python_flit_core pypi ptest + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-pytz \ + python3-simplejson \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + rm -rf ${S}/tests/mypy_test_cases + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} + +RDEPENDS:${PN} += " \ + python3-compression \ + python3-datetime \ + python3-email \ + python3-json \ + python3-numbers \ + python3-pprint \ + python3-packaging \ +" diff --git a/meta-python/recipes-devtools/python/python3-matplotlib-inline_0.1.2.bb b/meta-python/recipes-devtools/python/python3-matplotlib-inline_0.1.2.bb deleted file mode 100644 index f060f93337..0000000000 --- a/meta-python/recipes-devtools/python/python3-matplotlib-inline_0.1.2.bb +++ /dev/null @@ -1,8 +0,0 @@ -SUMMARY = "Inline Matplotlib backend for Jupyter" -HOMEPAGE = "https://pypi.org/project/matplotlib-inline/" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=c2728819a4288030f51c594327977be0" - -SRC_URI[sha256sum] = "f41d5ff73c9f5385775d5c0bc13b424535c8402fe70ea8210f93e11f3683993e" - -inherit pypi diff --git a/meta-python/recipes-devtools/python/python3-matplotlib-inline_0.1.6.bb b/meta-python/recipes-devtools/python/python3-matplotlib-inline_0.1.6.bb new file mode 100644 index 0000000000..13210b9060 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-matplotlib-inline_0.1.6.bb @@ -0,0 +1,8 @@ +SUMMARY = "Inline Matplotlib backend for Jupyter" +HOMEPAGE = "https://pypi.org/project/matplotlib-inline/" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=d4692a0eb42ca54892399db2cb35e61e" + +SRC_URI[sha256sum] = "f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304" + +inherit pypi diff --git a/meta-python/recipes-devtools/python/python3-matplotlib/matplotlib-disable-download.patch b/meta-python/recipes-devtools/python/python3-matplotlib/matplotlib-disable-download.patch index 42ffeb8970..aea8f62ea7 100644 --- a/meta-python/recipes-devtools/python/python3-matplotlib/matplotlib-disable-download.patch +++ b/meta-python/recipes-devtools/python/python3-matplotlib/matplotlib-disable-download.patch @@ -4,19 +4,34 @@ Upstream-Status: Inappropriate [disable feature] Signed-off-by: Mark Hatle <mark.hatle@xilinx.com> +Update patch to fit on 3.7.2. + +Signed-off-by: Trevor Gamblin <tgamblin@baylibre.com> + +diff --git a/setup.py b/setup.py +index 0bea13fa6f..f39d8fc871 100644 --- a/setup.py +++ b/setup.py -@@ -317,7 +317,6 @@ setup( # Finally, pass this all along t - "certifi>=2020.06.20", - "numpy>=1.17", - "setuptools_scm>=4", -- "setuptools_scm_git_archive", - ], - install_requires=[ - "cycler>=0.10", +@@ -327,13 +327,7 @@ setup( # Finally, pass this all along to setuptools to do the heavy lifting. + "pillow>=6.2.0", + "pyparsing>=2.3.1,<3.1", + "python-dateutil>=2.7", +- ] + ( +- # Installing from a git checkout that is not producing a wheel. +- ["setuptools_scm>=7"] if ( +- Path(__file__).with_name(".git").exists() and +- os.environ.get("CIBUILDWHEEL", "0") != "1" +- ) else [] +- ), ++ ], + extras_require={ + ':python_version<"3.10"': [ + "importlib-resources>=3.2.0", +diff --git a/setupext.py b/setupext.py +index a898d642d6..474172ff8f 100644 --- a/setupext.py +++ b/setupext.py -@@ -64,40 +64,7 @@ def get_from_cache_or_download(url, sha) +@@ -66,40 +66,7 @@ def get_from_cache_or_download(url, sha): BytesIO The file loaded into memory. """ diff --git a/meta-python/recipes-devtools/python/python3-matplotlib_3.5.2.bb b/meta-python/recipes-devtools/python/python3-matplotlib_3.7.2.bb index eaa144719b..72c369100a 100644 --- a/meta-python/recipes-devtools/python/python3-matplotlib_3.5.2.bb +++ b/meta-python/recipes-devtools/python/python3-matplotlib_3.7.2.bb @@ -7,7 +7,7 @@ HOMEPAGE = "https://github.com/matplotlib/matplotlib" SECTION = "devel/python" LICENSE = "PSF-2.0" LIC_FILES_CHKSUM = "\ - file://setup.py;beginline=296;endline=296;md5=20e7ab4d2b2b1395a0e4ab800181eb96 \ + file://setup.py;beginline=293;endline=293;md5=20e7ab4d2b2b1395a0e4ab800181eb96 \ file://LICENSE/LICENSE;md5=afec61498aa5f0c45936687da9a53d74 \ " @@ -19,15 +19,17 @@ DEPENDS = "\ python3-dateutil-native \ python3-pytz-native \ python3-certifi-native \ + python3-setuptools-scm-native \ + python3-pybind11-native \ " - -SRC_URI[sha256sum] = "48cf850ce14fa18067f2d9e0d646763681948487a8080ec0af2686468b4607a2" +SRC_URI[sha256sum] = "a8cdb91dddb04436bd2f098b8fdf4b81352e68cf4d2c6756fcc414791076569b" inherit pypi setuptools3 pkgconfig # Stop the component from attempting to download when it detects a missing # dependency -SRC_URI += "file://matplotlib-disable-download.patch" +SRC_URI += "file://matplotlib-disable-download.patch \ +" # This python module requires a full copy of freetype-2.6.1 SRC_URI += "https://downloads.sourceforge.net/project/freetype/freetype2/2.6.1/freetype-2.6.1.tar.gz;name=freetype;subdir=matplotlib-${PV}/build" @@ -40,7 +42,8 @@ SRC_URI[qhull.sha256sum] = "b5c2d7eb833278881b952c8a52d20179eab87766b00b86500046 # LTO with clang needs lld LDFLAGS:append:toolchain-clang = " -fuse-ld=lld" LDFLAGS:remove:toolchain-clang:mips = "-fuse-ld=lld" - +LDFLAGS:remove:toolchain-clang:riscv64 = "-fuse-ld=lld" +LDFLAGS:remove:toolchain-clang:riscv32 = "-fuse-ld=lld" RDEPENDS:${PN} = "\ freetype \ libpng \ @@ -57,6 +60,7 @@ RDEPENDS:${PN} = "\ ENABLELTO:toolchain-clang:riscv64 = "echo enable_lto = False >> ${S}/mplsetup.cfg" ENABLELTO:toolchain-clang:riscv32 = "echo enable_lto = False >> ${S}/mplsetup.cfg" ENABLELTO:toolchain-clang:mips = "echo enable_lto = False >> ${S}/mplsetup.cfg" + do_compile:prepend() { echo [libs] > ${S}/mplsetup.cfg echo system_freetype = True >> ${S}/mplsetup.cfg diff --git a/meta-python/recipes-devtools/python/python3-mccabe_0.7.0.bb b/meta-python/recipes-devtools/python/python3-mccabe_0.7.0.bb index a2c72fcc99..5304917842 100644 --- a/meta-python/recipes-devtools/python/python3-mccabe_0.7.0.bb +++ b/meta-python/recipes-devtools/python/python3-mccabe_0.7.0.bb @@ -8,4 +8,6 @@ SRC_URI[sha256sum] = "348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f inherit pypi setuptools3 -DEPENDS += "${PYTHON_PN}-pytest-runner-native" +DEPENDS += "python3-pytest-runner-native" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-meld3_2.0.1.bb b/meta-python/recipes-devtools/python/python3-meld3_2.0.1.bb index 1223ae9532..7ebf9f1411 100644 --- a/meta-python/recipes-devtools/python/python3-meld3_2.0.1.bb +++ b/meta-python/recipes-devtools/python/python3-meld3_2.0.1.bb @@ -12,3 +12,8 @@ SRC_URI[md5sum] = "1add16caefc9e6b82ef4f40532cb4918" SRC_URI[sha256sum] = "3ea266994f1aa83507679a67b493b852c232a7905e29440a6b868558cad5e775" inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-cgitb \ + python3-xml \ +" diff --git a/meta-python/recipes-devtools/python/python3-mock_4.0.3.bb b/meta-python/recipes-devtools/python/python3-mock_4.0.3.bb deleted file mode 100644 index 8f2305b50b..0000000000 --- a/meta-python/recipes-devtools/python/python3-mock_4.0.3.bb +++ /dev/null @@ -1,16 +0,0 @@ -DESCRIPTION = "A Python Mocking and Patching Library for Testing" -HOMEPAGE = "https://pypi.python.org/pypi/mock" -SECTION = "devel/python" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=de9dfbf780446b18aab11f00baaf5b7e" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += "${PYTHON_PN}-prettytable \ - ${PYTHON_PN}-cmd2 \ - ${PYTHON_PN}-pyparsing \ - ${PYTHON_PN}-mccabe \ - ${PYTHON_PN}-pep8 \ - ${PYTHON_PN}-pyflakes" - -SRC_URI[sha256sum] = "7d3fbbde18228f4ff2f1f119a45cdffa458b4c0dee32eb4d2bb2f82554bac7bc" diff --git a/meta-python/recipes-devtools/python/python3-mock_5.1.0.bb b/meta-python/recipes-devtools/python/python3-mock_5.1.0.bb new file mode 100644 index 0000000000..d9ecb9d4c8 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-mock_5.1.0.bb @@ -0,0 +1,19 @@ +DESCRIPTION = "A Python Mocking and Patching Library for Testing" +HOMEPAGE = "https://pypi.python.org/pypi/mock" +SECTION = "devel/python" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=de9dfbf780446b18aab11f00baaf5b7e" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-cmd2 \ + python3-mccabe \ + python3-pep8 \ + python3-prettytable \ + python3-pyflakes \ + python3-pyparsing \ + python3-unittest \ +" + +SRC_URI[sha256sum] = "5e96aad5ccda4718e0a229ed94b2024df75cc2d55575ba5762d31f5767b8767d" diff --git a/meta-python/recipes-devtools/python/python3-monotonic_1.6.bb b/meta-python/recipes-devtools/python/python3-monotonic_1.6.bb index 2af7b57921..aacc32a6d6 100644 --- a/meta-python/recipes-devtools/python/python3-monotonic_1.6.bb +++ b/meta-python/recipes-devtools/python/python3-monotonic_1.6.bb @@ -11,5 +11,3 @@ SRC_URI = "git://github.com/atdt/monotonic.git;branch=master;protocol=https" S = "${WORKDIR}/git" inherit setuptools3 - -PIP_INSTALL_PACKAGE = "monotonic" diff --git a/meta-python/recipes-devtools/python/python3-moteus/0001-lib-python-remove-self-import-from-setup.py.patch b/meta-python/recipes-devtools/python/python3-moteus/0001-lib-python-remove-self-import-from-setup.py.patch new file mode 100644 index 0000000000..10acd7b8c1 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-moteus/0001-lib-python-remove-self-import-from-setup.py.patch @@ -0,0 +1,32 @@ +From 7490ac4629c7fe0dc329647e6e000d4bc13c610d Mon Sep 17 00:00:00 2001 +From: Richard Leitner <dev@g0hl1n.net> +Date: Wed, 24 Jan 2024 00:49:45 +0100 +Subject: [PATCH] lib: python: remove self-import from setup.py + +Importing moteus itself within the setup.py creates some kind of a +chicken-and-egg problem. Furthermore it isn't used anywhere within +setup.py. Therefore remove the corresponding import. + +Signed-off-by: Richard Leitner <dev@g0hl1n.net> + +Upstream-Status: Backport [https://github.com/mjbots/moteus/commit/7490ac4629c7fe0dc329647e6e000d4bc13c610d] +--- + setup.py | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/setup.py b/setup.py +index 2731685..6c6064d 100644 +--- a/setup.py ++++ b/setup.py +@@ -17,8 +17,6 @@ + import setuptools + import pathlib + +-import moteus +- + here = pathlib.Path(__file__).parent.resolve() + + # Get the long description from the README file +-- +2.40.1 + diff --git a/meta-python/recipes-devtools/python/python3-moteus_0.3.67.bb b/meta-python/recipes-devtools/python/python3-moteus_0.3.67.bb new file mode 100644 index 0000000000..3c93ee44ff --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-moteus_0.3.67.bb @@ -0,0 +1,19 @@ +SUMMARY = "moteus brushless controller library and tools" +HOMEPAGE = "https://github.com/mjbots/moteus" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://setup.py;beginline=3;endline=9;md5=24025d3c660abfc62a83f0e709a45e76" + +inherit pypi setuptools3 + +SRC_URI += "file://0001-lib-python-remove-self-import-from-setup.py.patch" + +SRC_URI[sha256sum] = "a2122f20f59b8962057cf8d3fb583e0aa19006eaf2cde49e30027a4d1b8bf925" + +S = "${WORKDIR}/moteus-${PV}" + +RDEPENDS:${PN} += "\ + python3-can \ + python3-importlib-metadata \ + python3-pyelftools \ + python3-pyserial \ +" diff --git a/meta-python/recipes-devtools/python/python3-mpmath_1.2.1.bb b/meta-python/recipes-devtools/python/python3-mpmath_1.3.0.bb index 3337df4903..236fbd85bc 100644 --- a/meta-python/recipes-devtools/python/python3-mpmath_1.2.1.bb +++ b/meta-python/recipes-devtools/python/python3-mpmath_1.3.0.bb @@ -4,13 +4,16 @@ SUMMARY = "Python library for arbitrary-precision floating-point arithmetic" HOMEPAGE = "https://pypi.org/project/mpmath/" LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=71970bd3749eebe1bfef9f1efff5b37a" +LIC_FILES_CHKSUM = "file://LICENSE;md5=bde3c575382996b75d85702949512751" -SRC_URI[sha256sum] = "79ffb45cf9f4b101a807595bcb3e72e0396202e0b1d25d689134b48c4216a81a" +SRC_URI[sha256sum] = "7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f" inherit pypi setuptools3 -DEPENDS += "${PYTHON_PN}-setuptools-scm-native" -RDEPENDS:${PN} += "python3-image" +DEPENDS += "python3-setuptools-scm-native" +RDEPENDS:${PN} += " \ + python3-image \ + python3-math \ +" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-msgpack/run-ptest b/meta-python/recipes-devtools/python/python3-msgpack/run-ptest index 5cec711696..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-msgpack/run-ptest +++ b/meta-python/recipes-devtools/python/python3-msgpack/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-msgpack_1.0.4.bb b/meta-python/recipes-devtools/python/python3-msgpack_1.0.7.bb index a796d7cb57..5180301f7b 100644 --- a/meta-python/recipes-devtools/python/python3-msgpack_1.0.4.bb +++ b/meta-python/recipes-devtools/python/python3-msgpack_1.0.7.bb @@ -2,13 +2,12 @@ SUMMARY = "MessagePack (de)serializer" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://COPYING;md5=cd9523181d9d4fbf7ffca52eaa2a5751" -PYPI_PACKAGE = "msgpack" inherit pypi setuptools3 ptest -SRC_URI[sha256sum] = "f5d869c18f030202eb412f08b28d2afeea553d6613aee89e200d7aca7ef01f5f" +SRC_URI[sha256sum] = "572efc93db7a4d27e404501975ca6d2d9775705c2d922390d878fcf768d92c87" RDEPENDS:${PN}:class-target += "\ - ${PYTHON_PN}-io \ + python3-io \ " BBCLASSEXTEND = "native nativesdk" @@ -18,7 +17,8 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-msm_0.8.8.bb b/meta-python/recipes-devtools/python/python3-msm_0.8.8.bb index 848b25dae8..966ff86dee 100644 --- a/meta-python/recipes-devtools/python/python3-msm_0.8.8.bb +++ b/meta-python/recipes-devtools/python/python3-msm_0.8.8.bb @@ -8,10 +8,18 @@ SRC_URI[sha256sum] = "a502aee54917cd394217b31c977a1ba3d9541a0120e0a045c49fd77b32 inherit pypi setuptools3 -RDEPENDS:${PN} += "\ - python3-pako \ - python3-monotonic \ +RDEPENDS:${PN} += " \ python3-appdirs \ + python3-git \ + python3-fasteners \ + python3-io \ + python3-json \ + python3-lazy \ + python3-monotonic \ + python3-multiprocessing \ + python3-pako \ + python3-pyyaml \ + python3-requests \ " do_install:append() { diff --git a/meta-python/recipes-devtools/python/python3-multidict/run-ptest b/meta-python/recipes-devtools/python/python3-multidict/run-ptest index 5cec711696..d74acaf564 100644 --- a/meta-python/recipes-devtools/python/python3-multidict/run-ptest +++ b/meta-python/recipes-devtools/python/python3-multidict/run-ptest @@ -1,3 +1,2 @@ #!/bin/sh - -pytest +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-multidict_6.0.2.bb b/meta-python/recipes-devtools/python/python3-multidict_6.0.5.bb index b0e111d643..b12e180d02 100644 --- a/meta-python/recipes-devtools/python/python3-multidict_6.0.2.bb +++ b/meta-python/recipes-devtools/python/python3-multidict_6.0.5.bb @@ -2,18 +2,24 @@ SUMMARY = "Multidicts are useful for working with HTTP headers, URL query args e HOMEPAGE = "https://github.com/aio-libs/multidict/" LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=84c63e2bcd84e619d249af5181e2147f" - -SRC_URI[sha256sum] = "5ff3bd75f38e4c43f1f470f2df7a4d430b821c4ce22be384e1459cb57d6bb013" +LIC_FILES_CHKSUM = "file://LICENSE;md5=b4fef6e4b0828c2401fb983363985b39" inherit pypi setuptools3 ptest +PV .= "+git" + +SRCREV = "a9b281b2ef4ab25d95d6b268aa88c428e75c3696" +PYPI_SRC_URI = "git://github.com/aio-libs/multidict;branch=master;protocol=https" +S = "${WORKDIR}/git" + SRC_URI += " \ file://run-ptest \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-pytest-cov \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-multivolumefile_0.2.3.bb b/meta-python/recipes-devtools/python/python3-multivolumefile_0.2.3.bb new file mode 100644 index 0000000000..2fd698138e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-multivolumefile_0.2.3.bb @@ -0,0 +1,21 @@ +SUMMARY = "Multi volume file wrapper library" +HOMEPAGE = "https://codeberg.org/miurahr/multivolume" +LICENSE = "LGPL-2.1-or-later" +SECTION = "devel/python" +LIC_FILES_CHKSUM = "file://LICENSE;md5=4fbd65380cdd255951079008b364516c" + +SRC_URI[sha256sum] = "a0648d0aafbc96e59198d5c17e9acad7eb531abea51035d08ce8060dcad709d6" + +inherit python_setuptools_build_meta pypi + +DEPENDS += " \ + python3-setuptools-scm-native \ + python3-toml-native \ + python3-wheel-native \ +" + +RDEPENDS:${PN} += "\ + python3-io \ + python3-core \ + python3-mmap \ +" diff --git a/meta-python/recipes-devtools/python/python3-mypy-extensions_0.4.3.bb b/meta-python/recipes-devtools/python/python3-mypy-extensions_1.0.0.bb index 83ac5362d6..4c431431c2 100644 --- a/meta-python/recipes-devtools/python/python3-mypy-extensions_0.4.3.bb +++ b/meta-python/recipes-devtools/python/python3-mypy-extensions_1.0.0.bb @@ -7,6 +7,6 @@ PYPI_PACKAGE = "mypy_extensions" inherit pypi setuptools3 -SRC_URI[sha256sum] = "2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8" +SRC_URI[sha256sum] = "75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-mypy_0.971.bb b/meta-python/recipes-devtools/python/python3-mypy_0.971.bb deleted file mode 100644 index 31fcb06c9e..0000000000 --- a/meta-python/recipes-devtools/python/python3-mypy_0.971.bb +++ /dev/null @@ -1,23 +0,0 @@ -SUMMARY = "Optional static typing for Python 3 and 2 (PEP 484)" -HOMEPAGE = "https://github.com/python/mypy" -LICENSE = "MIT & Python-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=6ba8ec528da02073b7e1f4124c0f836f" - -PYPI_PACKAGE = "mypy" - -inherit pypi python_setuptools_build_meta - -SRC_URI[sha256sum] = "40b0f21484238269ae6a57200c807d80debc6459d444c0489a102d7c6a75fa56" - -BBCLASSEXTEND = "native" - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-mypy-extensions \ - ${PYTHON_PN}-typed-ast \ - ${PYTHON_PN}-typing-extensions \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-pprint \ - ${PYTHON_PN}-difflib \ - ${PYTHON_PN}-toml \ -" diff --git a/meta-python/recipes-devtools/python/python3-mypy_1.9.0.bb b/meta-python/recipes-devtools/python/python3-mypy_1.9.0.bb new file mode 100644 index 0000000000..e51264f8a9 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-mypy_1.9.0.bb @@ -0,0 +1,23 @@ +SUMMARY = "Optional static typing for Python 3 and 2 (PEP 484)" +HOMEPAGE = "https://github.com/python/mypy" +LICENSE = "MIT & Python-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=8d62fd8f8648cb018e52857347e340b9" + +inherit pypi python_setuptools_build_meta + +SRC_URI[sha256sum] = "3cc5da0127e6a478cddd906068496a97a7618a21ce9b54bde5bf7e539c7af974" + +BBCLASSEXTEND = "native" + +DEPENDS += " \ + python3-mypy-extensions-native \ + python3-types-psutil-native \ + python3-types-setuptools-native \ + python3-typing-extensions-native \ +" + +RDEPENDS:${PN} += " \ + python3-modules \ + python3-mypy-extensions \ + python3-typing-extensions \ +" diff --git a/meta-python/recipes-devtools/python/python3-natsort_8.1.0.bb b/meta-python/recipes-devtools/python/python3-natsort_8.4.0.bb index 1ba40d3a14..206e322fbd 100644 --- a/meta-python/recipes-devtools/python/python3-natsort_8.1.0.bb +++ b/meta-python/recipes-devtools/python/python3-natsort_8.4.0.bb @@ -1,10 +1,10 @@ SUMMARY = "Simple yet flexible natural sorting in Python." SECTION = "devel/python" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=58db8ac9e152dd9b700f4d39ff40a31a" +LIC_FILES_CHKSUM = "file://LICENSE;md5=d32431d1b650010945da4e078011c8fa" PYPI_PACKAGE = "natsort" -SRC_URI[sha256sum] = "c7c1f3f27c375719a4dfcab353909fe39f26c2032a062a8c80cc844eaaca0445" +SRC_URI[sha256sum] = "45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-netaddr/run-ptest b/meta-python/recipes-devtools/python/python3-netaddr/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-netaddr/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-netaddr_0.8.0.bb b/meta-python/recipes-devtools/python/python3-netaddr_0.8.0.bb deleted file mode 100644 index ad03eec851..0000000000 --- a/meta-python/recipes-devtools/python/python3-netaddr_0.8.0.bb +++ /dev/null @@ -1,13 +0,0 @@ -SUMMARY = "A network address manipulation library for Python." -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=e6345d695ffe3776f68a56fe7962db44" - -SRC_URI[md5sum] = "34cad578473b66ad77bc3b2a7613ed4a" -SRC_URI[sha256sum] = "d6cc57c7a07b1d9d2e917aa8b36ae8ce61c35ba3fcd1b83ca31c5a0ee2b5a243" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-pprint \ - ${PYTHON_PN}-xml \ -" diff --git a/meta-python/recipes-devtools/python/python3-netaddr_1.2.1.bb b/meta-python/recipes-devtools/python/python3-netaddr_1.2.1.bb new file mode 100644 index 0000000000..bedf0dab01 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-netaddr_1.2.1.bb @@ -0,0 +1,25 @@ +SUMMARY = "A network address manipulation library for Python." +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=8afa43eca873b71d5d85dd0be1f707fa" + +SRC_URI[sha256sum] = "6eb8fedf0412c6d294d06885c110de945cf4d22d2b510d0404f4e06950857987" + +inherit pypi python_setuptools_build_meta ptest + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/netaddr/tests/* ${D}${PTEST_PATH}/tests/ +} + +do_install_ptest:append:libc-musl () { + sed -i -e "/--automake/ s/$/ -k 'not test_strategy_ipv6'/" ${D}${PTEST_PATH}/run-ptest +} diff --git a/meta-python/recipes-devtools/python/python3-netifaces/0001-netifaces-initialize-msghdr-in-a-portable-way.patch b/meta-python/recipes-devtools/python/python3-netifaces/0001-netifaces-initialize-msghdr-in-a-portable-way.patch new file mode 100644 index 0000000000..7ff86cc8be --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-netifaces/0001-netifaces-initialize-msghdr-in-a-portable-way.patch @@ -0,0 +1,49 @@ +From cbcd19f38ae4b31c57c57ce3619b8d2674defb68 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Sun, 28 Aug 2022 08:11:27 -0700 +Subject: [PATCH] netifaces: initialize msghdr in a portable way + +musl has padding bytes inside the msghdr struct which means initializing +full structure will cause wrong assignments, doing partial assignment is +more portable and assign the elements after that + +Fixes +netifaces.c:1808:9: error: incompatible pointer to integer conversion initializing 'int' with an expression of type 'void *' [-Wint-conversion] + NULL, + ^~~~ + +Upstream-Status: Inappropriate [Upstream Repo is read-only] +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + netifaces.c | 15 ++++++--------- + 1 file changed, 6 insertions(+), 9 deletions(-) + +diff --git a/netifaces.c b/netifaces.c +index 839c42c..7da78e7 100644 +--- a/netifaces.c ++++ b/netifaces.c +@@ -1800,15 +1800,12 @@ gateways (PyObject *self) + do { + struct sockaddr_nl sanl_from; + struct iovec iov = { msgbuf, bufsize }; +- struct msghdr msghdr = { +- &sanl_from, +- sizeof(sanl_from), +- &iov, +- 1, +- NULL, +- 0, +- 0 +- }; ++ struct msghdr msghdr = { 0 }; ++ ++ msghdr.msg_name = &sanl_from; ++ msghdr.msg_namelen = sizeof(sanl_from); ++ msghdr.msg_iov = &iov; ++ msghdr.msg_iovlen = 1; + int nllen; + + ret = recvmsg (s, &msghdr, 0); +-- +2.37.2 + diff --git a/meta-python/recipes-devtools/python/python3-netifaces_0.11.0.bb b/meta-python/recipes-devtools/python/python3-netifaces_0.11.0.bb index 09e54b0baa..f211c69543 100644 --- a/meta-python/recipes-devtools/python/python3-netifaces_0.11.0.bb +++ b/meta-python/recipes-devtools/python/python3-netifaces_0.11.0.bb @@ -4,6 +4,8 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=a53cbc7cb75660694e138ba973c148df" -SRC_URI[sha256sum] = "043a79146eb2907edf439899f262b3dfe41717d34124298ed281139a8b93ca32" - inherit pypi setuptools3 + +SRC_URI += "file://0001-netifaces-initialize-msghdr-in-a-portable-way.patch" + +SRC_URI[sha256sum] = "043a79146eb2907edf439899f262b3dfe41717d34124298ed281139a8b93ca32" diff --git a/meta-python/recipes-devtools/python/python3-networkx_2.8.5.bb b/meta-python/recipes-devtools/python/python3-networkx_2.8.5.bb deleted file mode 100644 index 8d0b8dbb31..0000000000 --- a/meta-python/recipes-devtools/python/python3-networkx_2.8.5.bb +++ /dev/null @@ -1,21 +0,0 @@ -DESCRIPTION = "Python package for creating and manipulating graphs and networks" -HOMEPAGE = "http://networkx.github.io/" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=44614b6df7cf3c19be69d0a945e29904" - -SRC_URI[sha256sum] = "15a7b81a360791c458c55a417418ea136c13378cfdc06a2dcdc12bd2f9cf09c1" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-decorator \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-pickle \ - ${PYTHON_PN}-html \ - ${PYTHON_PN}-xml \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-profile \ - ${PYTHON_PN}-threading \ - " diff --git a/meta-python/recipes-devtools/python/python3-networkx_3.1.bb b/meta-python/recipes-devtools/python/python3-networkx_3.1.bb new file mode 100644 index 0000000000..2f2c3cfc3d --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-networkx_3.1.bb @@ -0,0 +1,23 @@ +DESCRIPTION = "Python package for creating and manipulating graphs and networks" +HOMEPAGE = "http://networkx.github.io/" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=4266362445d56549f7b8973d02e5f22a" + +SRC_URI[sha256sum] = "de346335408f84de0eada6ff9fafafff9bcda11f0a0dfaa931133debb146ab61" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "\ + python3-decorator \ + python3-netclient \ + python3-compression \ + python3-numbers \ + python3-pickle \ + python3-html \ + python3-xml \ + python3-json \ + python3-profile \ + python3-threading \ + " + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-ninja-syntax_1.7.2.bb b/meta-python/recipes-devtools/python/python3-ninja-syntax_1.7.2.bb new file mode 100644 index 0000000000..2f94f7a6a5 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-ninja-syntax_1.7.2.bb @@ -0,0 +1,14 @@ +SUMMARY = "Python module for generating .ninja files." + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://setup.py;beginline=38;endline=38;md5=f5441d6119564d4094cf77bee7cf7b0a" + +SRC_URI[sha256sum] = "342dc97b9e88a6495bae22953ee6063f91d2f03db6f727b62ba5c3092a18ef1f" + +inherit pypi setuptools3 + +PYPI_PACKAGE = "ninja_syntax" +UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/ninja_syntax/" +UPSTREAM_CHECK_REGEX = "/ninja_syntax/(?P<pver>(\d+[\.\-_]*)+)" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-ninja/CMakeLists.txt b/meta-python/recipes-devtools/python/python3-ninja/CMakeLists.txt new file mode 100644 index 0000000000..04fa451e72 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-ninja/CMakeLists.txt @@ -0,0 +1,9 @@ +cmake_minimum_required(VERSION 3.15) + +project(NinjaPythonDistributions) + +set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_MODULE_PATH}) + +install(CODE " + message(STATUS \"Install ninja project\") +") diff --git a/meta-python/recipes-devtools/python/python3-ninja/no-scikit-build.patch b/meta-python/recipes-devtools/python/python3-ninja/no-scikit-build.patch new file mode 100644 index 0000000000..b7d191e244 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-ninja/no-scikit-build.patch @@ -0,0 +1,31 @@ +We don't need to build ninja so there's no need to use scikit-build, +as we just need the python module with it's one ninja() function. + +Upstream-Status: Inappropriate +Signed-off-by: Ross Burton <ross.burton@arm.com> + +diff --git a/pyproject.toml b/pyproject.toml +index b895c20..577b642 100644 +--- a/pyproject.toml ++++ b/pyproject.toml +@@ -2,7 +2,6 @@ + requires = [ + "setuptools >=42", + "setuptools-scm[toml]", +- "scikit-build", + ] + build-backend = "setuptools.build_meta" + +diff --git a/setup.py b/setup.py +index dbe1fbc..3259754 100755 +--- a/setup.py ++++ b/setup.py +@@ -5,7 +5,7 @@ import os + import sys + from distutils.text_file import TextFile + +-from skbuild import setup ++from setuptools import setup + + # Add current folder to path + # This is required to import versioneer in an isolated pip build diff --git a/meta-python/recipes-devtools/python/python3-ninja/run-ninja-from-path.patch b/meta-python/recipes-devtools/python/python3-ninja/run-ninja-from-path.patch new file mode 100644 index 0000000000..0068efcc3a --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-ninja/run-ninja-from-path.patch @@ -0,0 +1,44 @@ +There's no need to hunt around source or install trees when we're just running ninja +from PATH. + +Upstream-Status: Inappropriate +Signed-off-by: Ross Burton <ross.burton@arm.com> + +diff --git a/src/ninja/__init__.py b/src/ninja/__init__.py +index f83767e..31bb926 100644 +--- a/src/ninja/__init__.py ++++ b/src/ninja/__init__.py +@@ -19,32 +19,9 @@ except ImportError: + os.path.dirname(__file__), '../../Ninja-src/misc'))) + from ninja_syntax import Writer, escape, expand # noqa: F401 + +-DATA = os.path.join(os.path.dirname(__file__), 'data') +- +-# Support running tests from the source tree +-if not os.path.exists(DATA): +- from skbuild.constants import CMAKE_INSTALL_DIR as SKBUILD_CMAKE_INSTALL_DIR +- from skbuild.constants import set_skbuild_plat_name +- +- if platform.system().lower() == "darwin": +- # Since building the project specifying --plat-name or CMAKE_OSX_* variables +- # leads to different SKBUILD_DIR, the code below attempt to guess the most +- # likely plat-name. +- _skbuild_dirs = os.listdir(os.path.join(os.path.dirname(__file__), '..', '..', '_skbuild')) +- if _skbuild_dirs: +- _likely_plat_name = '-'.join(_skbuild_dirs[0].split('-')[:3]) +- set_skbuild_plat_name(_likely_plat_name) +- +- _data = os.path.abspath(os.path.join( +- os.path.dirname(__file__), '..', '..', SKBUILD_CMAKE_INSTALL_DIR(), 'src/ninja/data')) +- if os.path.exists(_data): +- DATA = _data +- +-BIN_DIR = os.path.join(DATA, 'bin') +- + + def _program(name, args): +- return subprocess.call([os.path.join(BIN_DIR, name)] + args, close_fds=False) ++ return subprocess.call([name] + args, close_fds=False) + + + def ninja(): diff --git a/meta-python/recipes-devtools/python/python3-ninja_1.11.1.1.bb b/meta-python/recipes-devtools/python/python3-ninja_1.11.1.1.bb new file mode 100644 index 0000000000..8f2e6528db --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-ninja_1.11.1.1.bb @@ -0,0 +1,27 @@ +SUMMARY = "Ninja is a small build system with a focus on speed" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE_Apache_20;md5=19cbd64715b51267a47bf3750cc6a8a5" + +PYPI_PACKAGE = "ninja" +PYPI_ARCHIVE_NAME_PREFIX = "pypi-" + +inherit pypi python_setuptools_build_meta +SRC_URI[sha256sum] = "9d793b08dd857e38d0b6ffe9e6b7145d7c485a42dcfea04905ca0cdb6017cc3c" + +SRC_URI += "file://no-scikit-build.patch \ + file://run-ninja-from-path.patch" + +DEPENDS += "python3-setuptools-scm-native" + +do_install:append () { + rm -rf ${D}${bindir} +} + +RDEPENDS:${PN} = " \ + ninja \ + python3-io \ + python3-json \ + python3-ninja-syntax \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-nmap_1.5.4.bb b/meta-python/recipes-devtools/python/python3-nmap_1.6.0.bb index 828d7089b2..5fe9ab4e39 100644 --- a/meta-python/recipes-devtools/python/python3-nmap_1.5.4.bb +++ b/meta-python/recipes-devtools/python/python3-nmap_1.6.0.bb @@ -4,15 +4,15 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" -DEPENDS += "${PYTHON_PN}-wheel-native" +DEPENDS += "python3-wheel-native" PYPI_PACKAGE = "python3-nmap" -SRC_URI[sha256sum] = "cd5b0180d4d8cfe96c33e5e7956fa011379af108e2e8291b84e933b6385856e9" +SRC_URI[sha256sum] = "892b5091cde429fabfb8ba63382b2db8fd795193ba147558d0a7d5534c956255" inherit pypi setuptools3 RDEPENDS:${PN} += "nmap \ - ${PYTHON_PN}-requests \ - ${PYTHON_PN}-simplejson \ + python3-requests \ + python3-simplejson \ " diff --git a/meta-python/recipes-devtools/python/python3-nocasedict_1.0.4.bb b/meta-python/recipes-devtools/python/python3-nocasedict_2.0.1.bb index 006799c8bf..5a29858177 100644 --- a/meta-python/recipes-devtools/python/python3-nocasedict_1.0.4.bb +++ b/meta-python/recipes-devtools/python/python3-nocasedict_2.0.1.bb @@ -3,10 +3,10 @@ HOMEPAGE = "https://github.com/pywbem/nocasedict" LICENSE = "LGPL-2.1-only" LIC_FILES_CHKSUM = "file://LICENSE;md5=1803fa9c2c3ce8cb06b4861d75310742" -SRC_URI[sha256sum] = "7c111da4cefd244433cb63377aff081a40f84bddae9e6f376c67f086c0f806da" +SRC_URI[sha256sum] = "960cb699f1209da80ac39e3ab50aa7342fe8ca9f70606c23447a510550435e50" inherit pypi setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-six \ + python3-six \ " diff --git a/meta-python/recipes-devtools/python/python3-nocaselist_1.0.6.bb b/meta-python/recipes-devtools/python/python3-nocaselist_2.0.0.bb index 9e6842961d..2ad42247d9 100644 --- a/meta-python/recipes-devtools/python/python3-nocaselist_1.0.6.bb +++ b/meta-python/recipes-devtools/python/python3-nocaselist_2.0.0.bb @@ -3,6 +3,10 @@ HOMEPAGE = "https://nocaselist.readthedocs.io/en/latest/" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327" -SRC_URI[sha256sum] = "48f067f8cb841245f34d03120bc1ba9900f13b19cb51bcc6c7bee017f7c874da" +SRC_URI[sha256sum] = "456aa000c6777c5d21b029c52e532f94328d4fb4f15ad2a4dd3dd62db30b3892" inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-six \ +" diff --git a/meta-python/recipes-devtools/python/python3-ntplib_0.4.0.bb b/meta-python/recipes-devtools/python/python3-ntplib_0.4.0.bb index d78bec046f..d0a8d7a823 100644 --- a/meta-python/recipes-devtools/python/python3-ntplib_0.4.0.bb +++ b/meta-python/recipes-devtools/python/python3-ntplib_0.4.0.bb @@ -8,4 +8,4 @@ SRC_URI[sha256sum] = "899d8fb5f8c2555213aea95efca02934c7343df6ace9d7628a5176b176 inherit pypi setuptools3 -RDEPENDS:${PN} += "${PYTHON_PN}-datetime ${PYTHON_PN}-io" +RDEPENDS:${PN} += "python3-datetime python3-io" diff --git a/meta-python/recipes-devtools/python/python3-oauthlib_3.2.0.bb b/meta-python/recipes-devtools/python/python3-oauthlib_3.2.2.bb index e7f7f0b47b..833fdbcc58 100644 --- a/meta-python/recipes-devtools/python/python3-oauthlib_3.2.0.bb +++ b/meta-python/recipes-devtools/python/python3-oauthlib_3.2.2.bb @@ -4,7 +4,7 @@ HOMEPAGE = "https://github.com/idan/oauthlib" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=abd2675e944a2011aed7e505290ba482" -SRC_URI[sha256sum] = "23a8208d75b902797ea29fd31fa80a15ed9dc2c6c16fe73f5d346f83f6fa27a2" +SRC_URI[sha256sum] = "9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918" inherit pypi setuptools3 @@ -14,9 +14,9 @@ inherit pypi setuptools3 # # Uncomment this line to enable all the optional features. #PACKAGECONFIG ?= "test signedtoken signals rsa" -PACKAGECONFIG[test] = ",,,${PYTHON_PN}-blinker ${PYTHON_PN}-cryptography ${PYTHON_PN}-pytest ${PYTHON_PN}-pyjwt" -PACKAGECONFIG[signedtoken] = ",,,${PYTHON_PN}-cryptography ${PYTHON_PN}-pyjwt" -PACKAGECONFIG[signals] = ",,,${PYTHON_PN}-blinker" -PACKAGECONFIG[rsa] = ",,,${PYTHON_PN}-cryptography" +PACKAGECONFIG[test] = ",,,python3-blinker python3-cryptography python3-pytest python3-pyjwt" +PACKAGECONFIG[signedtoken] = ",,,python3-cryptography python3-pyjwt" +PACKAGECONFIG[signals] = ",,,python3-blinker" +PACKAGECONFIG[rsa] = ",,,python3-cryptography" -RDEPENDS:${PN} += "${PYTHON_PN}-core ${PYTHON_PN}-crypt ${PYTHON_PN}-datetime ${PYTHON_PN}-json ${PYTHON_PN}-logging ${PYTHON_PN}-math ${PYTHON_PN}-netclient ${PYTHON_PN}-unittest" +RDEPENDS:${PN} += "python3-core python3-crypt python3-datetime python3-json python3-logging python3-math python3-netclient python3-unittest" diff --git a/meta-python/recipes-devtools/python/python3-obd_0.7.1.bb b/meta-python/recipes-devtools/python/python3-obd_0.7.1.bb deleted file mode 100644 index 0cb1b85e5a..0000000000 --- a/meta-python/recipes-devtools/python/python3-obd_0.7.1.bb +++ /dev/null @@ -1,10 +0,0 @@ -DESCRIPTION = "A python module for handling realtime sensor data from OBD-II vehicle ports"HOMEPAGE = "https://github.com/brendan-w/python-OBD" -LICENSE = "GPL-2.0-only" -LIC_FILES_CHKSUM = "file://README.md;md5=58ba896fa086c96ad23317cebfeab277" - -SRC_URI[md5sum] = "305efcb6c650db7b9583532355ebeb7c" -SRC_URI[sha256sum] = "8b81ea5896157b6e861af12e173c10b001cb6cca6ebb04db2c01d326812ad77b" - -inherit setuptools3 pypi - -RDEPENDS:${PN} += "${PYTHON_PN}-pyserial ${PYTHON_PN}-pint ${PYTHON_PN}-setuptools ${PYTHON_PN}-packaging" diff --git a/meta-python/recipes-devtools/python/python3-obd_0.7.2.bb b/meta-python/recipes-devtools/python/python3-obd_0.7.2.bb new file mode 100644 index 0000000000..cf3daae6ac --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-obd_0.7.2.bb @@ -0,0 +1,9 @@ +DESCRIPTION = "A python module for handling realtime sensor data from OBD-II vehicle ports"HOMEPAGE = "https://github.com/brendan-w/python-OBD" +LICENSE = "GPL-2.0-only" +LIC_FILES_CHKSUM = "file://README.md;md5=176d0f9ad45c10895296260d426fa862" + +SRC_URI[sha256sum] = "20d38c9ded3daad1e8affab3ff367a70788d4f29ac77ab7aacddc6a6d2a43d61" + +inherit setuptools3 pypi + +RDEPENDS:${PN} += "python3-pyserial python3-pint python3-setuptools python3-packaging" diff --git a/meta-python/recipes-devtools/python/python3-objectpath_0.6.1.bb b/meta-python/recipes-devtools/python/python3-objectpath_0.6.1.bb new file mode 100644 index 0000000000..6e82dc13b9 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-objectpath_0.6.1.bb @@ -0,0 +1,9 @@ +DESCRIPTION = "The agile NoSQL query language for semi-structured data" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=a53cbc7cb75660694e138ba973c148df" + +DEPENDS += "dtc-native" + +SRC_URI[sha256sum] = "461263136c79292e42431fbb85cdcaac4c6a256f6b1aa5b3ae9316e4965ad819" + +inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-olefile_0.47.bb b/meta-python/recipes-devtools/python/python3-olefile_0.47.bb new file mode 100644 index 0000000000..bb6fa7a8cc --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-olefile_0.47.bb @@ -0,0 +1,17 @@ +SUMMARY = "Python package to parse, read and write Microsoft OLE2 files" +HOMEPAGE = "https://github.com/decalage2/olefile" +LICENSE = "BSD-2-Clause" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=f18814bd70fd28e11a4545145dcb3822" + +SRC_URI[sha256sum] = "599383381a0bf3dfbd932ca0ca6515acd174ed48870cbf7fee123d698c192c1c" + +inherit pypi setuptools3 + +PYPI_PACKAGE = "olefile" +PYPI_PACKAGE_EXT = "zip" + +RDEPENDS:${PN} += "\ + python3-core \ + python3-datetime \ + python3-logging \ +" diff --git a/meta-python/recipes-devtools/python/python3-oletools_0.60.1.bb b/meta-python/recipes-devtools/python/python3-oletools_0.60.1.bb new file mode 100644 index 0000000000..fbb7955d6f --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-oletools_0.60.1.bb @@ -0,0 +1,11 @@ +SUMMARY = "Python tools to analyze security characteristics of MS Office and OLE files" +HOMEPAGE = "https://github.com/decalage2/olefile" +LICENSE = "BSD-2-Clause" +LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=d7dd4b0d1f7153322a546e89b5a0a632" + +SRC_URI[sha256sum] = "67a796da4c4b8e2feb9a6b2495bef8798a3323a75512de4e5669d9dc9d1fae31" + +inherit pypi setuptools3 + +PYPI_PACKAGE = "oletools" +PYPI_PACKAGE_EXT = "zip" diff --git a/meta-python/recipes-devtools/python/python3-openpyxl_3.0.10.bb b/meta-python/recipes-devtools/python/python3-openpyxl_3.1.2.bb index 447c86ddb7..4a3254cc53 100644 --- a/meta-python/recipes-devtools/python/python3-openpyxl_3.0.10.bb +++ b/meta-python/recipes-devtools/python/python3-openpyxl_3.1.2.bb @@ -9,15 +9,15 @@ LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=8227180126797a0148 inherit pypi setuptools3 -SRC_URI[sha256sum] = "e47805627aebcf860edb4edf7987b1309c1b3632f3750538ed962bbcc3bd7449" +SRC_URI[sha256sum] = "a6f5977418eff3b2d5500d54d9db50c8277a368436f4e4f8ddb1be3422870184" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-pprint \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-jdcal \ - ${PYTHON_PN}-et-xmlfile \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-xml \ + python3-compression \ + python3-io \ + python3-pprint \ + python3-shell \ + python3-jdcal \ + python3-et-xmlfile \ + python3-numbers \ + python3-xml \ " diff --git a/meta-python/recipes-devtools/python/python3-ordered-set/run-ptest b/meta-python/recipes-devtools/python/python3-ordered-set/run-ptest index c27a6c3c57..64799ba008 100644 --- a/meta-python/recipes-devtools/python/python3-ordered-set/run-ptest +++ b/meta-python/recipes-devtools/python/python3-ordered-set/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest test_ordered_set.py +pytest --automake test_ordered_set.py diff --git a/meta-python/recipes-devtools/python/python3-ordered-set_4.1.0.bb b/meta-python/recipes-devtools/python/python3-ordered-set_4.1.0.bb index f2f1cf8e45..64637b858d 100644 --- a/meta-python/recipes-devtools/python/python3-ordered-set_4.1.0.bb +++ b/meta-python/recipes-devtools/python/python3-ordered-set_4.1.0.bb @@ -14,7 +14,8 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-oslash_0.6.3.bb b/meta-python/recipes-devtools/python/python3-oslash_0.6.3.bb deleted file mode 100644 index d9d977b705..0000000000 --- a/meta-python/recipes-devtools/python/python3-oslash_0.6.3.bb +++ /dev/null @@ -1,21 +0,0 @@ -SUMMARY = "Functors, Applicatives, And Monads in Python" -HOMEPAGE = "https://github.com/dbrattli/oslash" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://README.md;md5=ed79d2637878dfe97de89e357b5c02dd" - -DEPENDS += "\ - ${PYTHON_PN}-pip-native \ - ${PYTHON_PN}-pytest-runner-native\ -" - -SRC_URI[sha256sum] = "868aeb58a656f2ed3b73d9dd6abe387b20b74fc9413d3e8653b615b15bf728f3" - -PYPI_PACKAGE = "OSlash" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += "\ - python3-core \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-padaos_0.1.10.bb b/meta-python/recipes-devtools/python/python3-padaos_0.1.10.bb index f506a78636..3af9349d44 100644 --- a/meta-python/recipes-devtools/python/python3-padaos_0.1.10.bb +++ b/meta-python/recipes-devtools/python/python3-padaos_0.1.10.bb @@ -7,3 +7,5 @@ SRC_URI[md5sum] = "dbf852015ef87a6694549779fb475b52" SRC_URI[sha256sum] = "2ac05fcbc826873c574568aa5ce09945d6ea987bee10399e766eb8f7c6356d72" inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-logging" diff --git a/meta-python/recipes-devtools/python/python3-padatious_0.4.8.bb b/meta-python/recipes-devtools/python/python3-padatious_0.4.8.bb index 404a0170dc..fef6376ef7 100644 --- a/meta-python/recipes-devtools/python/python3-padatious_0.4.8.bb +++ b/meta-python/recipes-devtools/python/python3-padatious_0.4.8.bb @@ -7,3 +7,11 @@ SRC_URI[md5sum] = "7dd2f1830737dc142aa199f77dacf32e" SRC_URI[sha256sum] = "e471f251b94e8cadf6e4214f0f3b7b36678848aaa8c51cd5638ab23ecb716f75" inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-fann2 \ + python3-json \ + python3-multiprocessing \ + python3-padaos \ + python3-xxhash \ +" diff --git a/meta-python/recipes-devtools/python/python3-paho-mqtt_1.6.1.bb b/meta-python/recipes-devtools/python/python3-paho-mqtt_2.0.0.bb index 81a6d0a9c9..e4cf77a134 100644 --- a/meta-python/recipes-devtools/python/python3-paho-mqtt_1.6.1.bb +++ b/meta-python/recipes-devtools/python/python3-paho-mqtt_2.0.0.bb @@ -5,11 +5,15 @@ LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=8e5f264c6988aec56808a3a11e77b913 \ " SRCNAME = "paho-mqtt" -inherit pypi setuptools3 +inherit pypi python_hatchling python_setuptools_build_meta -SRC_URI[sha256sum] = "2a8291c81623aec00372b5a85558a372c747cbca8e9934dfe218638b8eefc26f" +SRC_URI[sha256sum] = "13b205f29251e4f2c66a6c923c31fc4fd780561e03b2d775cff8e4f2915cf947" -DEPENDS += "${PYTHON_PN}-pytest-runner-native" +PYPI_SRC_URI = "https://files.pythonhosted.org/packages/73/b7/a4df0f93bbdae237e16ba402752151eceee576cbe80c235a2475fbf81eea/paho_mqtt-${PV}.tar.gz" + +S = "${WORKDIR}/paho_mqtt-${PV}" + +DEPENDS += "python3-pytest-runner-native" do_install:append() { install -d -m0755 ${D}${datadir}/${BPN}/examples @@ -18,16 +22,16 @@ do_install:append() { PACKAGES =+ "${PN}-examples" -RDEPENDS:${PN}-examples += "${PN} ${PYTHON_PN}-core" +RDEPENDS:${PN}-examples += "${PN} python3-core" FILES:${PN}-examples = "${datadir}/${BPN}/examples" RDEPENDS:${PN} = "\ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-math \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-threading \ + python3-io \ + python3-logging \ + python3-math \ + python3-netclient \ + python3-threading \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pako_0.3.1.bb b/meta-python/recipes-devtools/python/python3-pako_0.3.1.bb index 34cd096c9d..046e6571ea 100644 --- a/meta-python/recipes-devtools/python/python3-pako_0.3.1.bb +++ b/meta-python/recipes-devtools/python/python3-pako_0.3.1.bb @@ -11,3 +11,10 @@ do_install:append() { rm -rf ${D}${prefix}/pako/LICENSE rm -rf ${D}${prefix}/pako } + +RDEPENDS:${PN} += " \ + python3-appdirs \ + python3-io \ + python3-json \ + python3-logging \ +" diff --git a/meta-python/recipes-devtools/python/python3-pandas_1.4.3.bb b/meta-python/recipes-devtools/python/python3-pandas_1.4.3.bb deleted file mode 100644 index 2d3333c3ea..0000000000 --- a/meta-python/recipes-devtools/python/python3-pandas_1.4.3.bb +++ /dev/null @@ -1,26 +0,0 @@ -SUMMARY = "pandas library for high-performance data analysis tools" -DESCRIPTION = "pandas is an open source, BSD-licensed library providing \ -high-performance, easy-to-use data structures and data analysis tools for \ -the Python programming language." -HOMEPAGE = "http://pandas.pydata.org/" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=3f23c5c092b74d245d48eeef72bc3fd2" - -SRC_URI[sha256sum] = "2ff7788468e75917574f080cd4681b27e1a7bf36461fe968b49a87b5a54d007c" - -inherit pypi setuptools3 - -DEPENDS += " \ - ${PYTHON_PN}-numpy-native ${PYTHON_PN}-cython-native \ -" - -CFLAGS:append:toolchain-clang = " -Wno-error=deprecated-declarations" - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-numpy \ - ${PYTHON_PN}-dateutil \ - ${PYTHON_PN}-dateutil-zoneinfo \ - ${PYTHON_PN}-pytz \ - ${PYTHON_PN}-profile \ -" diff --git a/meta-python/recipes-devtools/python/python3-pandas_2.0.3.bb b/meta-python/recipes-devtools/python/python3-pandas_2.0.3.bb new file mode 100644 index 0000000000..91e76d9919 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pandas_2.0.3.bb @@ -0,0 +1,38 @@ +SUMMARY = "pandas library for high-performance data analysis tools" +DESCRIPTION = "pandas is an open source, BSD-licensed library providing \ +high-performance, easy-to-use data structures and data analysis tools for \ +the Python programming language." +HOMEPAGE = "http://pandas.pydata.org/" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=cb819092901ddb13a7d0a4f5e05f098a" + +SRC_URI[sha256sum] = "c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c" + +inherit pypi setuptools3 + +DEPENDS += " \ + python3-cython-native \ + python3-numpy-native \ + python3-versioneer-native \ +" + +PACKAGESPLITFUNCS =+ "fix_cythonized_sources" + +fix_cythonized_sources() { + for f in `grep -l -r -e '\/* Generated by Cython.*/$' ${PKGD}${TARGET_DBGSRC_DIR}`; do + if [ -e $f ]; then + sed -i -e 's#${RECIPE_SYSROOT_NATIVE}##g' $f + fi + done +} + +CFLAGS:append:toolchain-clang = " -Wno-error=deprecated-declarations" + +RDEPENDS:${PN} += " \ + python3-json \ + python3-numpy \ + python3-dateutil \ + python3-dateutil-zoneinfo \ + python3-pytz \ + python3-profile \ +" diff --git a/meta-python/recipes-devtools/python/python3-parallax_1.0.6.bb b/meta-python/recipes-devtools/python/python3-parallax_1.0.6.bb index 14c90ffb58..1fc967d953 100644 --- a/meta-python/recipes-devtools/python/python3-parallax_1.0.6.bb +++ b/meta-python/recipes-devtools/python/python3-parallax_1.0.6.bb @@ -8,6 +8,6 @@ SRC_URI[sha256sum] = "c16703202ff67aed4740c0727df304abe9f3e7851e653533b24de21b33 inherit pypi setuptools3 -RDEPENDS:${PN} += "${PYTHON_PN}-fcntl ${PYTHON_PN}-threading ${PYTHON_PN}-unixadmin" +RDEPENDS:${PN} += "python3-fcntl python3-threading python3-unixadmin" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-paramiko_2.11.0.bb b/meta-python/recipes-devtools/python/python3-paramiko_3.4.0.bb index 5c0cb1e1a6..0d32d361cf 100644 --- a/meta-python/recipes-devtools/python/python3-paramiko_2.11.0.bb +++ b/meta-python/recipes-devtools/python/python3-paramiko_3.4.0.bb @@ -3,7 +3,7 @@ HOMEPAGE = "https://github.com/paramiko/paramiko/" LICENSE = "LGPL-2.1-only" LIC_FILES_CHKSUM = "file://LICENSE;md5=fd0120fc2e9f841c73ac707a30389af5" -SRC_URI[sha256sum] = "003e6bee7c034c21fbb051bf83dc0a9ee4106204dd3c53054c71452cc4ec3938" +SRC_URI[sha256sum] = "aac08f26a31dc4dffd92821527d1682d99d52f9ef6851968114a8728f3c274d3" PYPI_PACKAGE = "paramiko" @@ -11,9 +11,10 @@ inherit pypi setuptools3 CLEANBROKEN = "1" -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-bcrypt \ - ${PYTHON_PN}-cryptography \ - ${PYTHON_PN}-pynacl \ - ${PYTHON_PN}-unixadmin \ +RDEPENDS:${PN} += " \ + python3-bcrypt \ + python3-cryptography \ + python3-logging \ + python3-pynacl \ + python3-unixadmin \ " diff --git a/meta-python/recipes-devtools/python/python3-parse-type/run-ptest b/meta-python/recipes-devtools/python/python3-parse-type/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-parse-type/run-ptest +++ b/meta-python/recipes-devtools/python/python3-parse-type/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-parse-type_0.5.2.bb b/meta-python/recipes-devtools/python/python3-parse-type_0.5.2.bb deleted file mode 100644 index 7eebbfb503..0000000000 --- a/meta-python/recipes-devtools/python/python3-parse-type_0.5.2.bb +++ /dev/null @@ -1,30 +0,0 @@ -SUMMARY = "Simplifies building parse types based on the parse module" -HOMEPAGE = "https://github.com/jenisys/parse_type" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=16374dbaeaca1890153edb3f41371222" - -SRC_URI[md5sum] = "b954062f14ab723a91fe1e2be15e859d" -SRC_URI[sha256sum] = "7f690b18d35048c15438d6d0571f9045cffbec5907e0b1ccf006f889e3a38c0b" - -PYPI_PACKAGE = "parse_type" -inherit pypi ptest setuptools3 - -RDEPENDS:${PN} += "${PYTHON_PN}-parse ${PYTHON_PN}-six" - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ -" - -do_configure:prepend() { - sed -i -e "/python_version >= 3.0/d" ${S}/setup.py - sed -i -e "/use_2to3/d" ${S}/setup.py -} - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/tests - cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ -} diff --git a/meta-python/recipes-devtools/python/python3-parse-type_0.6.2.bb b/meta-python/recipes-devtools/python/python3-parse-type_0.6.2.bb new file mode 100644 index 0000000000..a7d8cd86ce --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-parse-type_0.6.2.bb @@ -0,0 +1,25 @@ +SUMMARY = "Simplifies building parse types based on the parse module" +HOMEPAGE = "https://github.com/jenisys/parse_type" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=2e469278ace89c246d52505acc39c3da" + +SRC_URI[sha256sum] = "79b1f2497060d0928bc46016793f1fca1057c4aacdf15ef876aa48d75a73a355" + +PYPI_PACKAGE = "parse_type" +inherit pypi ptest setuptools3 + +RDEPENDS:${PN} += "python3-parse" + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} diff --git a/meta-python/recipes-devtools/python/python3-parse/run-ptest b/meta-python/recipes-devtools/python/python3-parse/run-ptest index 40c284799d..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-parse/run-ptest +++ b/meta-python/recipes-devtools/python/python3-parse/run-ptest @@ -1,2 +1,3 @@ #!/bin/sh -pytest + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-parse_1.19.0.bb b/meta-python/recipes-devtools/python/python3-parse_1.19.0.bb deleted file mode 100644 index 2bf55cbaff..0000000000 --- a/meta-python/recipes-devtools/python/python3-parse_1.19.0.bb +++ /dev/null @@ -1,25 +0,0 @@ -SUMMARY = "Parse strings using a specification based on the Python format() syntax" -HOMEPAGE = "https://github.com/r1chardj0n3s/parse" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=8ab458ad281b60e6f1b39b3feafbfc05" - -SRC_URI[sha256sum] = "9ff82852bcb65d139813e2a5197627a94966245c897796760a3a2a8eb66f020b" - -inherit pypi setuptools3 ptest - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-logging \ - " - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ -" - -do_install_ptest() { - cp -f ${S}/test_parse.py ${D}${PTEST_PATH}/ -} diff --git a/meta-python/recipes-devtools/python/python3-parse_1.20.1.bb b/meta-python/recipes-devtools/python/python3-parse_1.20.1.bb new file mode 100644 index 0000000000..d2b91b3f30 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-parse_1.20.1.bb @@ -0,0 +1,27 @@ +SUMMARY = "Parse strings using a specification based on the Python format() syntax" +HOMEPAGE = "https://github.com/r1chardj0n3s/parse" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=8ab458ad281b60e6f1b39b3feafbfc05" + +SRC_URI[sha256sum] = "09002ca350ad42e76629995f71f7b518670bcf93548bdde3684fd55d2be51975" + +SRC_URI += " \ + file://run-ptest \ +" + +inherit pypi python_setuptools_build_meta ptest + +RDEPENDS:${PN} += "\ + python3-datetime \ + python3-logging \ + python3-numbers \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + cp -f ${S}/tests/test*.py ${D}${PTEST_PATH}/ +} diff --git a/meta-python/recipes-devtools/python/python3-parsimonious_0.9.0.bb b/meta-python/recipes-devtools/python/python3-parsimonious_0.10.0.bb index 5a604fa41c..c2352224ff 100644 --- a/meta-python/recipes-devtools/python/python3-parsimonious_0.9.0.bb +++ b/meta-python/recipes-devtools/python/python3-parsimonious_0.10.0.bb @@ -4,7 +4,7 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=3396ea30f9d21389d7857719816f83b5" -SRC_URI[sha256sum] = "b2ad1ae63a2f65bd78f5e0a8ac510a98f3607a43f1db2a8d46636a5d9e4a30c1" +SRC_URI[sha256sum] = "8281600da180ec8ae35427a4ab4f7b82bfec1e3d1e52f80cb60ea82b9512501c" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-parso_0.8.3.bb b/meta-python/recipes-devtools/python/python3-parso_0.8.4.bb index e14f28ad03..176bf6f277 100644 --- a/meta-python/recipes-devtools/python/python3-parso_0.8.3.bb +++ b/meta-python/recipes-devtools/python/python3-parso_0.8.4.bb @@ -1,17 +1,16 @@ SUMMARY = "A Python Parser" HOMEPAGE = "https://github.com/davidhalter/parso" -AUTHOR = "David Halter <davidhalter88@gmail.com>" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=cbaa2675b2424d771451332a7a69503f" PYPI_PACKAGE = "parso" -SRC_URI[sha256sum] = "8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0" +SRC_URI[sha256sum] = "eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d" inherit setuptools3 pypi RDEPENDS:${PN} = " \ - ${PYTHON_PN}-crypt \ - ${PYTHON_PN}-difflib \ - ${PYTHON_PN}-logging \ + python3-crypt \ + python3-difflib \ + python3-logging \ " diff --git a/meta-python/recipes-devtools/python/python3-passlib_1.7.4.bb b/meta-python/recipes-devtools/python/python3-passlib_1.7.4.bb index dc692303fe..8b66e25922 100644 --- a/meta-python/recipes-devtools/python/python3-passlib_1.7.4.bb +++ b/meta-python/recipes-devtools/python/python3-passlib_1.7.4.bb @@ -15,7 +15,7 @@ SRC_URI[sha256sum] = "defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c415 inherit pypi setuptools3 RDEPENDS:${PN} += "\ - ${PYTHON_PN}-crypt \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-netclient \ + python3-crypt \ + python3-logging \ + python3-netclient \ " diff --git a/meta-python/recipes-devtools/python/python3-pastedeploy_2.1.1.bb b/meta-python/recipes-devtools/python/python3-pastedeploy_3.1.0.bb index 86f29e119d..27f32bf1af 100644 --- a/meta-python/recipes-devtools/python/python3-pastedeploy_2.1.1.bb +++ b/meta-python/recipes-devtools/python/python3-pastedeploy_3.1.0.bb @@ -6,7 +6,7 @@ LIC_FILES_CHKSUM = "file://license.txt;md5=1798f29d55080c60365e6283cb49779c" inherit pypi PYPI_PACKAGE = "PasteDeploy" -SRC_URI[sha256sum] = "6dead6ab9823a85d585ef27f878bc647f787edb9ca8da0716aa9f1261b464817" +SRC_URI[sha256sum] = "9ddbaf152f8095438a9fe81f82c78a6714b92ae8e066bed418b6a7ff6a095a95" S = "${WORKDIR}/PasteDeploy-${PV}" diff --git a/meta-python/recipes-devtools/python/python3-path/run-ptest b/meta-python/recipes-devtools/python/python3-path/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-path/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-path_16.14.0.bb b/meta-python/recipes-devtools/python/python3-path_16.14.0.bb new file mode 100644 index 0000000000..b4d290a230 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-path_16.14.0.bb @@ -0,0 +1,34 @@ +SUMMARY = "A module wrapper for os.path" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=141643e11c48898150daa83802dbc65f" + +SRC_URI[sha256sum] = "dbaaa7efd4602fd6ba8d82890dc7823d69e5de740a6e842d9919b0faaf2b6a8e" + +SRC_URI += "\ + file://run-ptest \ +" + +inherit pypi python_setuptools_build_meta ptest + +DEPENDS += "python3-setuptools-scm-native" + +RDEPENDS:${PN} += " \ + python3-appdirs \ + python3-crypt \ + python3-io \ + python3-numbers \ + python3-shell \ +" +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" + +BBCLASSEXTEND = "nativesdk native" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/test + cp -rf ${S}/test_* ${D}${PTEST_PATH}/test/ + install -d ${D}${PTEST_PATH}/path + cp -rf ${S}/path/* ${D}${PTEST_PATH}/path/ +} diff --git a/meta-python/recipes-devtools/python/python3-path_16.4.0.bb b/meta-python/recipes-devtools/python/python3-path_16.4.0.bb deleted file mode 100644 index 10b112860f..0000000000 --- a/meta-python/recipes-devtools/python/python3-path_16.4.0.bb +++ /dev/null @@ -1,11 +0,0 @@ -SUMMARY = "A module wrapper for os.path" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=7a7126e068206290f3fe9f8d6c713ea6" - -SRC_URI[sha256sum] = "baf2e757c4b19be8208f9e67e48fb475b4a577d5613590ce46693bdbdf082f52" - -inherit pypi python_setuptools_build_meta - -DEPENDS += "python3-setuptools-scm-native" - -BBCLASSEXTEND = "nativesdk native" diff --git a/meta-python/recipes-devtools/python/python3-pcodedmp_1.2.6.bb b/meta-python/recipes-devtools/python/python3-pcodedmp_1.2.6.bb new file mode 100644 index 0000000000..185597dea1 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pcodedmp_1.2.6.bb @@ -0,0 +1,12 @@ +SUMMARY = "A VBA p-code disassembler" +HOMEPAGE = "https://github.com/bontchev/pcodedmp" +LICENSE = "GPL-3.0-only" +LIC_FILES_CHKSUM = "file://LICENSE;md5=84dcc94da3adb52b53ae4fa38fe49e5d" + +SRC_URI[sha256sum] = "025f8c809a126f45a082ffa820893e6a8d990d9d7ddb68694b5a9f0a6dbcd955" + +inherit pypi setuptools3 + +PYPI_PACKAGE="pcodedmp" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pdm-backend_2.1.8.bb b/meta-python/recipes-devtools/python/python3-pdm-backend_2.1.8.bb new file mode 100644 index 0000000000..f1f507243e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pdm-backend_2.1.8.bb @@ -0,0 +1,13 @@ +SUMMARY = "The build backend used by PDM that supports latest packaging standards" +HOMEPAGE = "https://github.com/pdm-project/pdm-backend" +LICENSE = "MIT" +SECTION = "devel/python" +LIC_FILES_CHKSUM = "file://LICENSE;md5=4a564297b3c5b629a528b92fd8ff61ea" + +SRC_URI[sha256sum] = "2487dfbd13f69d80fb4e6a08006a3ee68272833970813047dc5fcfacdfdc0151" + +inherit pypi python_setuptools_build_meta + +PYPI_PACKAGE= "pdm_backend" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pdm_2.14.0.bb b/meta-python/recipes-devtools/python/python3-pdm_2.14.0.bb new file mode 100644 index 0000000000..011ba5b3dd --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pdm_2.14.0.bb @@ -0,0 +1,15 @@ +SUMMARY = "A modern Python package and dependency manager supporting the latest PEP standards" +HOMEPAGE = "https://pdm-project.org/latest/" +LICENSE = "MIT" +SECTION = "devel/python" +LIC_FILES_CHKSUM = "file://LICENSE;md5=2eb31a2cc1a758c34b499f287dd04ef2" + +SRC_URI[sha256sum] = "7ae6c4b5518085a703e0824ab10cbc3b7246b599ef07b8c4dcb2af1e42859190" + +inherit pypi python_setuptools_build_meta + +DEPENDS += " \ + python3-pdm-backend-native \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pefile_2023.2.7.bb b/meta-python/recipes-devtools/python/python3-pefile_2023.2.7.bb new file mode 100644 index 0000000000..50dae7b407 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pefile_2023.2.7.bb @@ -0,0 +1,16 @@ +SUMMARY = "Python PE parsing module" +DESCRIPTION = "A multi-platform Python module to parse and work with Portable Executable (PE) files." +HOMEPAGE = "https://github.com/erocarrera/pefile" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=38066667888b01d8118ff9cc23da1873" + +inherit setuptools3 pypi ptest +SRC_URI[sha256sum] = "82e6114004b3d6911c77c3953e3838654b04511b8b66e8583db70c65998017dc" + +BBCLASSEXTEND = "native nativesdk" + +RDEPENDS:${PN} += " \ + python3-mmap \ + python3-netclient \ + python3-stringold \ +" diff --git a/meta-python/recipes-devtools/python/python3-pep8_1.7.1.bb b/meta-python/recipes-devtools/python/python3-pep8_1.7.1.bb index f3e03ed309..68507e2482 100644 --- a/meta-python/recipes-devtools/python/python3-pep8_1.7.1.bb +++ b/meta-python/recipes-devtools/python/python3-pep8_1.7.1.bb @@ -9,9 +9,9 @@ SRC_URI[sha256sum] = "603a46e5c358ce20ac4807a0eeafac7505d1125a4c1bd8378757ada06f inherit pypi setuptools3 -RDEPENDS:${PN} += "${PYTHON_PN}-prettytable \ - ${PYTHON_PN}-cmd2 \ - ${PYTHON_PN}-pyparsing" +RDEPENDS:${PN} += "python3-prettytable \ + python3-cmd2 \ + python3-pyparsing" SRC_URI[md5sum] = "603821d06db945c71d811b5a8d78423c" SRC_URI[sha256sum] = "fe249b52e20498e59e0b5c5256aa52ee99fc295b26ec9eaa85776ffdb9fe6374" diff --git a/meta-python/recipes-devtools/python/python3-periphery_2.3.0.bb b/meta-python/recipes-devtools/python/python3-periphery_2.4.1.bb index 4d81b8d244..c2764b27d2 100644 --- a/meta-python/recipes-devtools/python/python3-periphery_2.3.0.bb +++ b/meta-python/recipes-devtools/python/python3-periphery_2.4.1.bb @@ -2,14 +2,14 @@ DESCRIPTION = "A pure Python 2/3 library for peripheral I/O (GPIO, LED, PWM, SPI HOMEPAGE = "http://pythonhosted.org/python-periphery/" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=fed1784a083509430580a913df680706" +LIC_FILES_CHKSUM = "file://LICENSE;md5=30fe6f023a80fb33989fb3b9d773fea0" -SRC_URI[sha256sum] = "8a8ec019d9b330a6a6f69a7de61d14b4c98b102d76359047c5ce0263e12246a6" +SRC_URI[sha256sum] = "61d461d736982a6f766e878720ab10a68151e2e8c1086600d9389ac47e40e88a" inherit pypi setuptools3 PYPI_PACKAGE = "python-periphery" -RDEPENDS:${PN} += "${PYTHON_PN}-mmap \ - ${PYTHON_PN}-ctypes \ - ${PYTHON_PN}-fcntl" +RDEPENDS:${PN} += "python3-mmap \ + python3-ctypes \ + python3-fcntl" diff --git a/meta-python/recipes-devtools/python/python3-petact_0.1.2.bb b/meta-python/recipes-devtools/python/python3-petact_0.1.2.bb index 58cd05e222..b7fa69ffa8 100644 --- a/meta-python/recipes-devtools/python/python3-petact_0.1.2.bb +++ b/meta-python/recipes-devtools/python/python3-petact_0.1.2.bb @@ -7,3 +7,9 @@ SRC_URI[md5sum] = "47e9a6abc91b4022953e4007ddae9e68" SRC_URI[sha256sum] = "5dcb0d44f86a601e41a2def9770993cd0ea45c76d37eb3f35e3dd61aa50350e6" inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-compression \ + python3-crypt \ + python3-io \ +" diff --git a/meta-python/recipes-devtools/python/python3-pexpect_4.8.0.bb b/meta-python/recipes-devtools/python/python3-pexpect_4.9.0.bb index ed25406085..521df9dcd4 100644 --- a/meta-python/recipes-devtools/python/python3-pexpect_4.8.0.bb +++ b/meta-python/recipes-devtools/python/python3-pexpect_4.9.0.bb @@ -6,20 +6,19 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=1c7a725251880af8c6a148181665385b" SRC_URI += "file://0001-FSM.py-change-shebang-from-python-to-python3.patch" -SRC_URI[md5sum] = "153eb25184249d6a85fde9acf4804085" -SRC_URI[sha256sum] = "fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c" +SRC_URI[sha256sum] = "ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f" inherit pypi setuptools3 UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/pexpect" RDEPENDS:${PN} = "\ - ${PYTHON_PN}-core \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-terminal \ - ${PYTHON_PN}-resource \ - ${PYTHON_PN}-fcntl \ - ${PYTHON_PN}-ptyprocess \ + python3-core \ + python3-io \ + python3-terminal \ + python3-resource \ + python3-fcntl \ + python3-ptyprocess \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pickleshare_0.7.5.bb b/meta-python/recipes-devtools/python/python3-pickleshare_0.7.5.bb index 9d67e4f338..bb16c78ce8 100644 --- a/meta-python/recipes-devtools/python/python3-pickleshare_0.7.5.bb +++ b/meta-python/recipes-devtools/python/python3-pickleshare_0.7.5.bb @@ -1,6 +1,5 @@ SUMMARY = "Tiny 'shelve'-like database with concurrency support" HOMEPAGE = "https://github.com/pickleshare/pickleshare" -AUTHOR = "Ville Vainio <vivainio@gmail.com>" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=905c08218089ffebea3a64c82fc4d7d0" @@ -10,3 +9,5 @@ SRC_URI[md5sum] = "44ab782615894a812ab96669a122a634" SRC_URI[sha256sum] = "87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca" inherit setuptools3 pypi + +RDEPENDS:${PN} += "python3-pickle" diff --git a/meta-python/recipes-devtools/python/python3-pid_3.0.4.bb b/meta-python/recipes-devtools/python/python3-pid_3.0.4.bb index 412dcfce40..c90f551056 100644 --- a/meta-python/recipes-devtools/python/python3-pid_3.0.4.bb +++ b/meta-python/recipes-devtools/python/python3-pid_3.0.4.bb @@ -9,4 +9,4 @@ SRC_URI[sha256sum] = "0e33670e83f6a33ebb0822e43a609c3247178d4a375ff50a4689e266d8 inherit pypi setuptools3 -RDEPENDS:${PN} += "${PYTHON_PN}-fcntl ${PYTHON_PN}-logging ${PYTHON_PN}-io" +RDEPENDS:${PN} += "python3-fcntl python3-logging python3-io" diff --git a/meta-python/recipes-devtools/python/python3-pika_1.3.0.bb b/meta-python/recipes-devtools/python/python3-pika_1.3.2.bb index 7ffec26e55..865accc595 100644 --- a/meta-python/recipes-devtools/python/python3-pika_1.3.0.bb +++ b/meta-python/recipes-devtools/python/python3-pika_1.3.2.bb @@ -8,19 +8,19 @@ HOMEPAGE = "https://pika.readthedocs.io" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=678ec81495ba50edf81e84e4f1aa69f3" -SRC_URI[sha256sum] = "15357ddc47a5c28f0b07d80e93d504cbbf7a1ad5e1cd129ecd27afe76472c529" +SRC_URI[sha256sum] = "b2a327ddddf8570b4965b3576ac77091b850262d34ce8c1d8cb4e4146aa4145f" inherit pypi python_setuptools_build_meta PYPI_PACKAGE = "pika" DEPENDS += " \ - ${PYTHON_PN}-setuptools-scm-native \ - ${PYTHON_PN}-toml-native \ + python3-setuptools-scm-native \ + python3-toml-native \ " RDEPENDS:${PN} += " \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-tornado \ - ${PYTHON_PN}-twisted \ + python3-logging \ + python3-tornado \ + python3-twisted \ " diff --git a/meta-python/recipes-devtools/python/python3-pillow/0001-explicitly-set-compile-options.patch b/meta-python/recipes-devtools/python/python3-pillow/0001-explicitly-set-compile-options.patch deleted file mode 100644 index 005fea5c66..0000000000 --- a/meta-python/recipes-devtools/python/python3-pillow/0001-explicitly-set-compile-options.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 27bfa4028453dc79a72569823e97da8fd1994ffc Mon Sep 17 00:00:00 2001 -From: Leon Anavi <leon.anavi@konsulko.com> -Date: Tue, 1 Sep 2020 11:53:53 +0000 -Subject: [PATCH] explicitly set compile options - -OE does not support to install egg package, so -explicitly set build_ext options for oe-core's -`setup.py install' - -Upstream-Status: Inappropriate [oe specific] - -Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> -Signed-off-by: Leon Anavi <leon.anavi@konsulko.com> ---- - setup.cfg | 12 ++++++++++++ - 1 file changed, 12 insertions(+) - -diff --git a/setup.cfg b/setup.cfg -index 19979cf7..ed27dfe1 100644 ---- a/setup.cfg -+++ b/setup.cfg -@@ -11,3 +11,15 @@ multi_line_output = 3 - [tool:pytest] - addopts = -ra --color=yes - testpaths = Tests -+ -+[build_ext] -+disable-platform-guessing = 1 -+enable-zlib = 1 -+enable-jpeg = 1 -+enable-tiff = 1 -+enable-freetype = 1 -+enable-lcms = 1 -+enable-jpeg2000 = 1 -+disable-webp = 1 -+disable-webpmux = 1 -+disable-imagequant = 1 --- -2.17.1 - diff --git a/meta-python/recipes-devtools/python/python3-pillow/run-ptest b/meta-python/recipes-devtools/python/python3-pillow/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pillow/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-pillow_10.3.0.bb b/meta-python/recipes-devtools/python/python3-pillow_10.3.0.bb new file mode 100644 index 0000000000..debf488154 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pillow_10.3.0.bb @@ -0,0 +1,72 @@ +SUMMARY = "Python Imaging Library (Fork). Pillow is the friendly PIL fork by Alex \ +Clark and Contributors. PIL is the Python Imaging Library by Fredrik Lundh and \ +Contributors." +HOMEPAGE = "https://pillow.readthedocs.io" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=c349a4b4b9ec2377a8fd6a7df87dbffe" + +SRC_URI = "git://github.com/python-pillow/Pillow.git;branch=main;protocol=https \ + file://0001-support-cross-compiling.patch \ + file://run-ptest \ + " +SRCREV = "5c89d88eee199ba53f64581ea39b6a1bc52feb1a" + +inherit python_setuptools_build_meta ptest + +PEP517_BUILD_OPTS += " \ + -C platform-guessing=disable \ + -C zlib=enable \ + -C jpeg=enable \ + -C tiff=enable \ + -C freetype=enable \ + -C lcms=enable \ + -C jpeg2000=enable \ + -C webp=disable \ + -C webpmux=disable \ + -C imagequant=disable \ +" + +DEPENDS += " \ + zlib \ + jpeg \ + tiff \ + freetype \ + lcms \ + openjpeg \ +" + +RDEPENDS:${PN} += " \ + python3-misc \ + python3-logging \ + python3-numbers \ + ${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'libxcb', '', d)} \ +" + +RDEPENDS:${PN}-ptest += " \ + bash \ + ghostscript \ + jpeg-tools \ + libwebp \ + python3-core \ + python3-image \ + python3-mmap \ + python3-pytest \ + python3-pytest-timeout \ + python3-resource \ + python3-unittest-automake-output \ + python3-unixadmin\ + ${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'tk', '', d)} \ +" + +CVE_PRODUCT = "pillow" + +S = "${WORKDIR}/git" + +RPROVIDES:${PN} += "python3-imaging" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/Tests + cp -rf ${S}/Tests ${D}${PTEST_PATH}/ +} + +BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-pillow_9.2.0.bb b/meta-python/recipes-devtools/python/python3-pillow_9.2.0.bb deleted file mode 100644 index 454d61a48e..0000000000 --- a/meta-python/recipes-devtools/python/python3-pillow_9.2.0.bb +++ /dev/null @@ -1,42 +0,0 @@ -SUMMARY = "Python Imaging Library (Fork). Pillow is the friendly PIL fork by Alex \ -Clark and Contributors. PIL is the Python Imaging Library by Fredrik Lundh and \ -Contributors." -HOMEPAGE = "https://pillow.readthedocs.io" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=ad081a0aede51e89f8da13333a8fb849" - -SRC_URI = "git://github.com/python-pillow/Pillow.git;branch=9.2.x;protocol=https \ - file://0001-support-cross-compiling.patch \ - file://0001-explicitly-set-compile-options.patch \ - " -SRCREV ?= "82541b6dec8452cb612067fcebba1c5a1a2bfdc8" - -inherit setuptools3 - -PIP_INSTALL_PACKAGE = "Pillow" -PIP_INSTALL_DIST_PATH = "${S}/dist" - -DEPENDS += " \ - zlib \ - jpeg \ - tiff \ - freetype \ - lcms \ - openjpeg \ -" - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-misc \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-numbers \ -" - -CVE_PRODUCT = "pillow" - -S = "${WORKDIR}/git" - -RPROVIDES:${PN} += "python3-imaging" - -BBCLASSEXTEND = "native" - -SRCREV = "58acec3312fb8671c9d84829197e1c8150085589" diff --git a/meta-python/recipes-devtools/python/python3-pint_0.19.2.bb b/meta-python/recipes-devtools/python/python3-pint_0.23.bb index 06337edb62..370cd7017b 100644 --- a/meta-python/recipes-devtools/python/python3-pint_0.19.2.bb +++ b/meta-python/recipes-devtools/python/python3-pint_0.23.bb @@ -8,9 +8,12 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=bccf824202692270a1e0829a62e3f47b" PYPI_PACKAGE := "Pint" -inherit pypi ptest python_setuptools_build_meta +inherit ptest python_setuptools_build_meta -SRC_URI[sha256sum] = "e1d4989ff510b378dad64f91711e7bdabe5ca78d75b06a18569ac454678c4baf" +SRCREV = "f2e4081aee38f850938048beac7fb69c4908bc5e" +SRC_URI = "git://github.com/hgrecco/pint;protocol=https;branch=master" +S = "${WORKDIR}/git" +#SRC_URI[sha256sum] = "e1509b91606dbc52527c600a4ef74ffac12fff70688aff20e9072409346ec9b4" DEPENDS += "python3-setuptools-scm-native" @@ -21,15 +24,18 @@ SRC_URI += " \ " RDEPENDS:${PN} += " \ - ${PYTHON_PN}-setuptools \ - ${PYTHON_PN}-packaging \ + python3-setuptools \ + python3-packaging \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-appdirs \ + python3-flexcache \ + python3-flexparser \ + python3-pytest \ " do_install_ptest() { install -d ${D}${PTEST_PATH}/testsuite - cp -rf ${S}/pint/testsuite/* ${D}${PTEST_PATH}/testsuite/ + cp -rf ${S}/pint/* ${D}${PTEST_PATH}/ } diff --git a/meta-python/recipes-devtools/python/python3-pkgconfig_1.5.5.bb b/meta-python/recipes-devtools/python/python3-pkgconfig_1.5.5.bb index 1aa91deac5..9ff4d1318d 100644 --- a/meta-python/recipes-devtools/python/python3-pkgconfig_1.5.5.bb +++ b/meta-python/recipes-devtools/python/python3-pkgconfig_1.5.5.bb @@ -7,7 +7,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=faa7f82be8f220bff6156be4790344fc" SRC_URI[sha256sum] = "deb4163ef11f75b520d822d9505c1f462761b4309b1bb713d08689759ea8b899" RDEPENDS:${PN} = "pkgconfig \ - ${PYTHON_PN}-shell \ + python3-shell \ " inherit pypi python_poetry_core diff --git a/meta-python/recipes-devtools/python/python3-platformdirs/run-ptest b/meta-python/recipes-devtools/python/python3-platformdirs/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-platformdirs/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-platformdirs_4.2.0.bb b/meta-python/recipes-devtools/python/python3-platformdirs_4.2.0.bb new file mode 100644 index 0000000000..19c95b374a --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-platformdirs_4.2.0.bb @@ -0,0 +1,32 @@ +SUMMARY = "A small Python module for determining appropriate platform-specific dirs" +HOMEPAGE = "https://github.com/platformdirs/platformdirs" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ea4f5a41454746a9ed111e3d8723d17a" + +SRC_URI += " \ + file://run-ptest \ +" + +SRC_URI[sha256sum] = "ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768" + +inherit pypi python_hatchling ptest + +DEPENDS += " \ + python3-hatch-vcs-native \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-appdirs \ + python3-covdefaults \ + python3-pytest \ + python3-pytest-cov \ + python3-pytest-mock \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH} + cp -rf ${S}/tests ${D}${PTEST_PATH}/ +} + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pocketsphinx/0001-cython-Use-cythyon3-in-cmake-check.patch b/meta-python/recipes-devtools/python/python3-pocketsphinx/0001-cython-Use-cythyon3-in-cmake-check.patch new file mode 100644 index 0000000000..40b2544d55 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pocketsphinx/0001-cython-Use-cythyon3-in-cmake-check.patch @@ -0,0 +1,29 @@ +From 5e6eb640f54a0d716d62ab4db8d96d3b6f3aa7bc Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Mon, 19 Feb 2024 22:11:41 -0800 +Subject: [PATCH] cython: Use cythyon3 in cmake check + +OE does not install cython anymore, it only has cython3 +therefore point the build system to find cython3 + +Upstream-Status: Inappropriate [ OE-Specific ] + +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + cython/CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/cython/CMakeLists.txt b/cython/CMakeLists.txt +index daa4f76..93dd030 100644 +--- a/cython/CMakeLists.txt ++++ b/cython/CMakeLists.txt +@@ -1,5 +1,5 @@ + find_package(Python COMPONENTS Interpreter Development.Module REQUIRED) +-find_program(CYTHON "cython") ++find_program(CYTHON "cython3") + + if(NOT USE_INSTALLED_POCKETSPHINX) + set_property(TARGET pocketsphinx PROPERTY POSITION_INDEPENDENT_CODE on) +-- +2.43.2 + diff --git a/meta-python/recipes-devtools/python/python3-pocketsphinx_0.1.15.bb b/meta-python/recipes-devtools/python/python3-pocketsphinx_0.1.15.bb deleted file mode 100644 index f7ffd9d268..0000000000 --- a/meta-python/recipes-devtools/python/python3-pocketsphinx_0.1.15.bb +++ /dev/null @@ -1,14 +0,0 @@ -SUMMARY = "This package provides a python interface to CMU Sphinxbase and Pocketsphinx libraries created with SWIG and Setuptools." -DESCRIPTION = "Python interface to CMU Sphinxbase and Pocketsphinx libraries" -HOMEPAGE = "https://github.com/bambocher/pocketsphinx-python" -SECTION = "devel/python" -LICENSE = "BSD-2-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=826ebda787eb48e78aec2624f9faba72" - -SRC_URI[md5sum] = "94d008eebea16acb60a9ffe614575dee" -SRC_URI[sha256sum] = "34d290745c7dbe6fa2cac9815b5c19d10f393e528ecd70e779c21ebc448f9b63" - -inherit pypi setuptools3 features_check - -DEPENDS += "swig-native pulseaudio" -REQUIRED_DISTRO_FEATURES += "pulseaudio" diff --git a/meta-python/recipes-devtools/python/python3-pocketsphinx_5.0.3.bb b/meta-python/recipes-devtools/python/python3-pocketsphinx_5.0.3.bb new file mode 100644 index 0000000000..4ffcb4db82 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pocketsphinx_5.0.3.bb @@ -0,0 +1,20 @@ +SUMMARY = "Python interface to Pocketsphinx libraries." +DESCRIPTION = "Pythonsphinx is an Open source large vocabulary, speaker-independent continuous speech recognition engines." +HOMEPAGE = "https://github.com/cmusphinx/pocketsphinx" +SECTION = "devel/python" +LICENSE = "BSD-2-Clause | BSD-3-Clause | MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=c4d720cdc9c6953091f65e8b01524bb4" + +SRC_URI += "file://0001-cython-Use-cythyon3-in-cmake-check.patch" +SRC_URI[sha256sum] = "27f4de0ca2d2bce391ce87eaab84fe6f0bc059b306fd1702d5fe6549b66e1586" + +inherit cmake pkgconfig pypi python3native + +DEPENDS += "swig-native python3-cython-native python3-scikit-build-native gstreamer1.0 gstreamer1.0-plugins-base" + +EXTRA_OECMAKE += "-DBUILD_GSTREAMER=ON" + +PACKAGES += "${PN}-models ${MLPREFIX}gstreamer1.0-pocketsphinx" + +FILES:${MLPREFIX}gstreamer1.0-pocketsphinx = "${libdir}/gstreamer-1.0/" +FILES:${PN}-models = "${datadir}/pocketsphinx/model" diff --git a/meta-python/recipes-devtools/python/python3-polyline/run-ptest b/meta-python/recipes-devtools/python/python3-polyline/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-polyline/run-ptest +++ b/meta-python/recipes-devtools/python/python3-polyline/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-polyline_1.4.0.bb b/meta-python/recipes-devtools/python/python3-polyline_1.4.0.bb deleted file mode 100644 index 486e70c8fd..0000000000 --- a/meta-python/recipes-devtools/python/python3-polyline_1.4.0.bb +++ /dev/null @@ -1,26 +0,0 @@ -SUMMARY = "A Python implementation of Google's Encoded Polyline Algorithm Format" -HOMEPAGE = "https://pypi.org/project/polyline/" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=0fbd13500cabd06dd751ba6b2be304c6" - -SRC_URI[md5sum] = "b97c57378605c4a856c437569f95a0cb" -SRC_URI[sha256sum] = "7c7f89d09a09c7b6161bdbfb4fd304b186fc7a2060fa4f31cb3f61c646a5c074" - -inherit pypi setuptools3 ptest - -RDEPENDS:${PN} += "python3-six" - -BBCLASSEXTEND = "native nativesdk" - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ -" - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/test - cp -rf ${S}/test/* ${D}${PTEST_PATH}/test/ -} diff --git a/meta-python/recipes-devtools/python/python3-polyline_2.0.2.bb b/meta-python/recipes-devtools/python/python3-polyline_2.0.2.bb new file mode 100644 index 0000000000..00cb51be41 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-polyline_2.0.2.bb @@ -0,0 +1,26 @@ +SUMMARY = "A Python implementation of Google's Encoded Polyline Algorithm Format" +HOMEPAGE = "https://github.com/frederickjansen/polyline" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=1fb8d1dc685695195bb3c1e48adfef48" + +SRC_URI[sha256sum] = "10541e759c5fd51f746ee304e9af94744089a4055b6257b293b3afd1df64e369" + +inherit pypi python_setuptools_build_meta ptest + +RDEPENDS:${PN} += "python3-six" + +BBCLASSEXTEND = "native nativesdk" + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/test + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/test/ +} diff --git a/meta-python/recipes-devtools/python/python3-portion_2.2.0.bb b/meta-python/recipes-devtools/python/python3-portion_2.4.2.bb index 0dad8b0ce9..3af94b48f1 100644 --- a/meta-python/recipes-devtools/python/python3-portion_2.2.0.bb +++ b/meta-python/recipes-devtools/python/python3-portion_2.4.2.bb @@ -7,6 +7,10 @@ LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=05f1e16a8e59ce3e9a979e881816c2ab" inherit pypi setuptools3 -SRC_URI[sha256sum] = "b6bfb08a7834787aca076da1200b735d97beef61b60a462b05213e7354a099cf" +SRC_URI[sha256sum] = "5289b40d98959b16b3f6927781678935d3df1b7c14947f5d7778e5e04dd9a065" + +RDEPENDS:${PN} = "\ + python3-sortedcontainers \ +" BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-posix-ipc_1.0.5.bb b/meta-python/recipes-devtools/python/python3-posix-ipc_1.0.5.bb deleted file mode 100644 index d66ef0e3c4..0000000000 --- a/meta-python/recipes-devtools/python/python3-posix-ipc_1.0.5.bb +++ /dev/null @@ -1,15 +0,0 @@ -DESCRIPTION = "POSIX IPC primitives (semaphores, shared memory and message queues) for Python" -HOMEPAGE = "http://semanchuk.com/philip/posix_ipc/" -SECTION = "devel/python" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=dc089fb2f37e90799a54c19a20c9880f" - -PYPI_PACKAGE = "posix_ipc" - -# Archived version so we need to overwrite what the pypi class will derive -PYPI_SRC_URI = "https://pypi.python.org/packages/source/p/${PYPI_PACKAGE}/${PYPI_PACKAGE}-${PV}.tar.gz" - -SRC_URI[md5sum] = "8c9443859492ecf3aae9182aa6b5c78c" -SRC_URI[sha256sum] = "6cddb1ce2cf4aae383f2a0079c26c69bee257fe2720f372201ef047f8ceb8b97" - -inherit setuptools3 pypi diff --git a/meta-python/recipes-devtools/python/python3-posix-ipc_1.1.1.bb b/meta-python/recipes-devtools/python/python3-posix-ipc_1.1.1.bb new file mode 100644 index 0000000000..a71187399b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-posix-ipc_1.1.1.bb @@ -0,0 +1,11 @@ +DESCRIPTION = "POSIX IPC primitives (semaphores, shared memory and message queues) for Python" +HOMEPAGE = "http://semanchuk.com/philip/posix_ipc/" +SECTION = "devel/python" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=513d94a7390d4d72f3475e2d45c739b5" + +PYPI_PACKAGE = "posix_ipc" + +SRC_URI[sha256sum] = "e2456ba0cfb2ee5ba14121450e8d825b3c4a1461fca0761220aab66d4111cbb7" + +inherit setuptools3 pypi diff --git a/meta-python/recipes-devtools/python/python3-prctl_1.8.1.bb b/meta-python/recipes-devtools/python/python3-prctl_1.8.1.bb index a45ef45f32..a4732993f8 100644 --- a/meta-python/recipes-devtools/python/python3-prctl_1.8.1.bb +++ b/meta-python/recipes-devtools/python/python3-prctl_1.8.1.bb @@ -15,7 +15,6 @@ SRC_URI = "git://github.com/seveas/python-prctl;protocol=https;branch=main \ file://0001-support-cross-complication.patch \ " inherit setuptools3 python3native -PIP_INSTALL_PACKAGE = "python_prctl" DEPENDS += "libcap" diff --git a/meta-python/recipes-devtools/python/python3-precise-runner/run-ptest b/meta-python/recipes-devtools/python/python3-precise-runner/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-precise-runner/run-ptest +++ b/meta-python/recipes-devtools/python/python3-precise-runner/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-precise-runner_0.3.1.bb b/meta-python/recipes-devtools/python/python3-precise-runner_0.3.1.bb index 9e5435bada..1fb72de126 100644 --- a/meta-python/recipes-devtools/python/python3-precise-runner_0.3.1.bb +++ b/meta-python/recipes-devtools/python/python3-precise-runner_0.3.1.bb @@ -13,7 +13,8 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-prettytable/run-ptest b/meta-python/recipes-devtools/python/python3-prettytable/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-prettytable/run-ptest +++ b/meta-python/recipes-devtools/python/python3-prettytable/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-prettytable_3.1.1.bb b/meta-python/recipes-devtools/python/python3-prettytable_3.1.1.bb deleted file mode 100644 index 5520edc067..0000000000 --- a/meta-python/recipes-devtools/python/python3-prettytable_3.1.1.bb +++ /dev/null @@ -1,44 +0,0 @@ -SUMMARY = "Python library for displaying tabular data in a ASCII table format" -HOMEPAGE = "http://code.google.com/p/prettytable" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://COPYING;md5=c9a6829fcd174d9535b46211917c7671" - -SRC_URI[sha256sum] = "43c9e23272ca253d038ae76fe3adde89794e92e7fcab2ddf5b94b38642ef4f21" - -do_install:append() { - perm_files=`find "${D}${PYTHON_SITEPACKAGES_DIR}/" -name "*.txt" -o -name "PKG-INFO"` - for f in $perm_files; do - chmod 644 "${f}" - done -} - -UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/PrettyTable/" -UPSTREAM_CHECK_REGEX = "/PrettyTable/(?P<pver>(\d+[\.\-_]*)+)" - -BBCLASSEXTEND = "native nativesdk" -inherit pypi ptest setuptools3 - -SRC_URI += " \ - file://run-ptest \ -" - -DEPENDS += "${PYTHON_PN}-setuptools-scm-native" - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-math \ - ${PYTHON_PN}-html \ - ${PYTHON_PN}-wcwidth \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-importlib-metadata \ -" - -RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-pytest-lazy-fixture \ - ${PYTHON_PN}-sqlite3 \ -" - -do_install_ptest() { - cp -f ${S}/tests/test_prettytable.py ${D}${PTEST_PATH}/ -} diff --git a/meta-python/recipes-devtools/python/python3-prettytable_3.10.0.bb b/meta-python/recipes-devtools/python/python3-prettytable_3.10.0.bb new file mode 100644 index 0000000000..35e9ab1798 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-prettytable_3.10.0.bb @@ -0,0 +1,45 @@ +SUMMARY = "Python library for displaying tabular data in a ASCII table format" +HOMEPAGE = "http://code.google.com/p/prettytable" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=c9a6829fcd174d9535b46211917c7671" + + +SRC_URI[sha256sum] = "9665594d137fb08a1117518c25551e0ede1687197cf353a4fdc78d27e1073568" +SRC_URI += " \ + file://run-ptest \ +" +inherit pypi ptest python_hatchling + +do_install:append() { + perm_files=`find "${D}${PYTHON_SITEPACKAGES_DIR}/" -name "*.txt" -o -name "PKG-INFO"` + for f in $perm_files; do + chmod 644 "${f}" + done +} + +DEPENDS += "\ + python3-hatch-vcs-native \ +" + +RDEPENDS:${PN} += " \ + python3-compression \ + python3-html \ + python3-importlib-metadata \ + python3-json \ + python3-math \ + python3-wcwidth \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-pytest-lazy-fixtures \ + python3-sqlite3 \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-process-tests_2.1.2.bb b/meta-python/recipes-devtools/python/python3-process-tests_3.0.0.bb index 24ab0399f9..a16497b984 100644 --- a/meta-python/recipes-devtools/python/python3-process-tests_2.1.2.bb +++ b/meta-python/recipes-devtools/python/python3-process-tests_3.0.0.bb @@ -4,12 +4,18 @@ SUMMARY = "Tools for testing processes." HOMEPAGE = "https://github.com/ionelmc/python-process-tests" LICENSE = "BSD-2-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=37031056aff37e4b3310872a9a3d0b1e" +LIC_FILES_CHKSUM = "file://LICENSE;md5=aea36d49429f53e06868d87cd9d62349" -SRC_URI[sha256sum] = "a3747ad947bdfc93e5c986bdb17a6d718f3f26e8577a0807a00962f29e26deba" +SRC_URI[sha256sum] = "e5d57dea7161251e91cadb84bf3ecc85275fb121fd478e579f800777b1d424bd" inherit pypi setuptools3 RDEPENDS:${PN} += "python3-core" BBCLASSEXTEND = "native nativesdk" + +RDEPENDS:${PN} += " \ + python3-io \ + python3-logging \ + python3-unittest \ +" diff --git a/meta-python/recipes-devtools/python/python3-progress_1.6.bb b/meta-python/recipes-devtools/python/python3-progress_1.6.bb index 1333da98da..59d1f90e98 100644 --- a/meta-python/recipes-devtools/python/python3-progress_1.6.bb +++ b/meta-python/recipes-devtools/python/python3-progress_1.6.bb @@ -8,8 +8,8 @@ SRC_URI[sha256sum] = "c9c86e98b5c03fa1fe11e3b67c1feda4788b8d0fe7336c2ff7d5644ccf inherit pypi setuptools3 RDEPENDS:${PN}:class-target += " \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-math \ + python3-datetime \ + python3-math \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.24.bb b/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.43.bb index 9a6798ad35..8b3b709763 100644 --- a/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.24.bb +++ b/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.43.bb @@ -3,23 +3,23 @@ HOMEPAGE = "https://python-prompt-toolkit.readthedocs.io/" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=b2cde7da89f0c1f3e49bf968d00d554f" -SRC_URI[sha256sum] = "1bb05628c7d87b645974a1bad3f17612be0c29fa39af9f7688030163f680bad6" +SRC_URI[sha256sum] = "3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d" inherit pypi setuptools3 PYPI_PACKAGE = "prompt_toolkit" RDEPENDS:${PN} += " \ - ${PYTHON_PN}-core \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-terminal \ - ${PYTHON_PN}-threading \ - ${PYTHON_PN}-wcwidth \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-image \ - ${PYTHON_PN}-asyncio \ - ${PYTHON_PN}-xml \ + python3-core \ + python3-six \ + python3-terminal \ + python3-threading \ + python3-wcwidth \ + python3-datetime \ + python3-shell \ + python3-image \ + python3-asyncio \ + python3-xml \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-protobuf_4.21.5.bb b/meta-python/recipes-devtools/python/python3-protobuf_4.25.3.bb index 537683000d..8bb8a93f76 100644 --- a/meta-python/recipes-devtools/python/python3-protobuf_4.21.5.bb +++ b/meta-python/recipes-devtools/python/python3-protobuf_4.25.3.bb @@ -6,8 +6,7 @@ LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=53dbfa56f61b90215a9f8f0d527c043d" inherit pypi setuptools3 - -SRC_URI[sha256sum] = "eb1106e87e095628e96884a877a51cdb90087106ee693925ec0a300468a9be3a" +SRC_URI[sha256sum] = "25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c" # http://errors.yoctoproject.org/Errors/Details/184715/ # Can't find required file: ../src/google/protobuf/descriptor.proto @@ -18,14 +17,14 @@ UPSTREAM_CHECK_REGEX = "protobuf/(?P<pver>\d+(\.\d+)+)/" DEPENDS += "protobuf" RDEPENDS:${PN} += " \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-pkgutil \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-unittest \ + python3-datetime \ + python3-json \ + python3-logging \ + python3-netclient \ + python3-numbers \ + python3-pkgutil \ + python3-six \ + python3-unittest \ " # For usage in other recipies when compiling protobuf files (e.g. by grpcio-tools) diff --git a/meta-python/recipes-devtools/python/python3-ptyprocess/run-ptest b/meta-python/recipes-devtools/python/python3-ptyprocess/run-ptest index 15c3f6282d..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-ptyprocess/run-ptest +++ b/meta-python/recipes-devtools/python/python3-ptyprocess/run-ptest @@ -1,3 +1,3 @@ -#!/bin/sh +#!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-ptyprocess_0.7.0.bb b/meta-python/recipes-devtools/python/python3-ptyprocess_0.7.0.bb index 2a8b8730c4..4abec0a01c 100644 --- a/meta-python/recipes-devtools/python/python3-ptyprocess_0.7.0.bb +++ b/meta-python/recipes-devtools/python/python3-ptyprocess_0.7.0.bb @@ -15,10 +15,10 @@ UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/ptyprocess" S = "${WORKDIR}/${SRCNAME}-${PV}" RDEPENDS:${PN} = "\ - ${PYTHON_PN}-core \ - ${PYTHON_PN}-fcntl \ - ${PYTHON_PN}-terminal \ - ${PYTHON_PN}-resource \ + python3-core \ + python3-fcntl \ + python3-terminal \ + python3-resource \ " BBCLASSEXTEND = "native nativesdk" @@ -30,11 +30,12 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-fcntl \ - ${PYTHON_PN}-terminal \ - ${PYTHON_PN}-resource \ - bash \ + bash \ + python3-fcntl \ + python3-pytest \ + python3-resource \ + python3-terminal \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-pulsectl_22.3.2.bb b/meta-python/recipes-devtools/python/python3-pulsectl_24.4.0.bb index c13c677899..3bc15bb08a 100644 --- a/meta-python/recipes-devtools/python/python3-pulsectl_22.3.2.bb +++ b/meta-python/recipes-devtools/python/python3-pulsectl_24.4.0.bb @@ -3,7 +3,7 @@ HOMEPAGE = "https://github.com/mk-fg/python-pulse-control" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://COPYING;md5=f1d10048469ff90123263eb5e214061d" -SRC_URI[sha256sum] = "cc174e1ceebd4e6222c5b78f4f415f12e80753c9ab75ab354159b4cb5950b084" +SRC_URI[sha256sum] = "697ed50e7d452e78678ae38e2ab935843008bec448955283cd0fb362867e3165" RDEPENDS:${PN} += " \ libpulse \ diff --git a/meta-python/recipes-devtools/python/python3-pure-eval_0.2.2.bb b/meta-python/recipes-devtools/python/python3-pure-eval_0.2.2.bb new file mode 100644 index 0000000000..66e4673a70 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pure-eval_0.2.2.bb @@ -0,0 +1,16 @@ +SUMMARY = "Safely evaluate AST nodes without side effects" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=a3d6c15f7859ae235a78f2758e5a48cf" + +DEPENDS = "python3-setuptools-scm-native" + +PYPI_PACKAGE = "pure_eval" + +inherit pypi python_setuptools_build_meta + +SRC_URI[sha256sum] = "2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3" + +RDEPENDS:${PN} += " \ + python3-datetime \ + python3-numbers \ +" diff --git a/meta-python/recipes-devtools/python/python3-py-cpuinfo/0001-test_cli.py-disable.patch b/meta-python/recipes-devtools/python/python3-py-cpuinfo/0001-test_cli.py-disable.patch new file mode 100644 index 0000000000..e4165d2d66 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-py-cpuinfo/0001-test_cli.py-disable.patch @@ -0,0 +1,32 @@ +From 620cb80b0bb5ec58fe15592f033487a4e1cd3859 Mon Sep 17 00:00:00 2001 +From: Trevor Gamblin <tgamblin@baylibre.com> +Date: Thu, 12 Oct 2023 16:46:53 -0400 +Subject: [PATCH] test_cli.py: disable + +These tests fail if .../site-packages/cpuinfo/cpuinfo.py isn't +executable, but setting it so during do_install doesn't seem to work. +Disable them for now so that the ptests work with the remaining ~150 +successes. + +Upstream-Status: Inappropriate [OE-Specific] + +Signed-off-by: Trevor Gamblin <tgamblin@baylibre.com> +--- + tests/test_cli.py | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/tests/test_cli.py b/tests/test_cli.py +index a6b1985..43c4334 100644 +--- a/tests/test_cli.py ++++ b/tests/test_cli.py +@@ -6,6 +6,7 @@ import helpers + + + ++@unittest.skip("Disable while permissions issues are figured out") + class TestCLI(unittest.TestCase): + def setUp(self): + helpers.backup_data_source(cpuinfo) +-- +2.41.0 + diff --git a/meta-python/recipes-devtools/python/python3-py-cpuinfo/run-ptest b/meta-python/recipes-devtools/python/python3-py-cpuinfo/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-py-cpuinfo/run-ptest +++ b/meta-python/recipes-devtools/python/python3-py-cpuinfo/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-py-cpuinfo_8.0.0.bb b/meta-python/recipes-devtools/python/python3-py-cpuinfo_9.0.0.bb index 6de2f17459..857afd1db7 100644 --- a/meta-python/recipes-devtools/python/python3-py-cpuinfo_8.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-py-cpuinfo_9.0.0.bb @@ -4,15 +4,23 @@ SUMMARY = "Get CPU info with pure Python 2 & 3" HOMEPAGE = "https://github.com/workhorsy/py-cpuinfo" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=b0b97c022f12b14d9e02de0b283ee9e9" +LIC_FILES_CHKSUM = "file://LICENSE;md5=d2379ecb0d7a8299101b1e4c160cd1f7" -SRC_URI[sha256sum] = "5f269be0e08e33fd959de96b34cd4aeeeacac014dd8305f70eb28d06de2345c5" +SRC_URI[sha256sum] = "3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690" inherit ptest pypi setuptools3 SRC_URI += "file://run-ptest \ + file://0001-test_cli.py-disable.patch \ " +do_install:append() { + # Make sure we use /usr/bin/env python3 + for PYTHSCRIPT in `grep -rIl '^#!.*python' ${D}`; do + sed -i -e '1s|^#!.*|#!/usr/bin/env python3|' $PYTHSCRIPT + done +} + do_install_ptest() { install -d ${D}${PTEST_PATH}/tests cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ @@ -20,6 +28,7 @@ do_install_ptest() { RDEPENDS:${PN}-ptest += "\ python3-pytest \ + python3-unittest-automake-output \ " RDEPENDS:${PN} += "python3-core python3-ctypes python3-datetime python3-json python3-io python3-mmap python3-multiprocessing python3-netclient python3-pickle python3-pprint python3-shell" diff --git a/meta-python/recipes-devtools/python/python3-py-ubjson_0.16.1.bb b/meta-python/recipes-devtools/python/python3-py-ubjson_0.16.1.bb index 222eb1e0e8..0db9d65fd3 100644 --- a/meta-python/recipes-devtools/python/python3-py-ubjson_0.16.1.bb +++ b/meta-python/recipes-devtools/python/python3-py-ubjson_0.16.1.bb @@ -8,7 +8,7 @@ SRC_URI[sha256sum] = "b9bfb8695a1c7e3632e800fb83c943bf67ed45ddd87cd0344851610c69 inherit pypi setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-numbers \ + python3-numbers \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-py7zr_0.20.8.bb b/meta-python/recipes-devtools/python/python3-py7zr_0.20.8.bb new file mode 100644 index 0000000000..3d48b5116f --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-py7zr_0.20.8.bb @@ -0,0 +1,29 @@ +SUMMARY = "Pure Python 7-zip library" +HOMEPAGE = "https://py7zr.readthedocs.io/en/latest/" +LICENSE = "LGPL-2.1-or-later" +SECTION = "devel/python" +LIC_FILES_CHKSUM = "file://LICENSE;md5=4fbd65380cdd255951079008b364516c" + +SRC_URI[sha256sum] = "2a6b0db0441e63a2dd74cbd18f5d9ae7e08dc0e54685aa486361d0db6a0b4f78" + +inherit pypi python_setuptools_build_meta + +DEPENDS += " \ + python3-setuptools-scm-native \ + python3-toml-native \ + python3-wheel-native \ +" + +RDEPENDS:${PN} += "\ + python3-pycryptodomex \ + python3-multivolumefile \ + python3-pybcj \ + python3-inflate64 \ + python3-pyppmd \ + python3-pyzstd \ + python3-brotli \ + python3-multiprocessing \ + python3-datetime \ + python3-core \ + python3-threading \ +" diff --git a/meta-python/recipes-devtools/python/python3-pyalsaaudio_0.9.2.bb b/meta-python/recipes-devtools/python/python3-pyalsaaudio_0.10.0.bb index e7e706c6cf..8b22faad3a 100644 --- a/meta-python/recipes-devtools/python/python3-pyalsaaudio_0.9.2.bb +++ b/meta-python/recipes-devtools/python/python3-pyalsaaudio_0.10.0.bb @@ -5,7 +5,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=1a3b161aa0fcec32a0c8907a2219ad9d" inherit pypi setuptools3 -SRC_URI[sha256sum] = "e74a66d6c7a6bcceb990df66d3ebc0fe382fc9d765f35f050f9d98c695304b36" +SRC_URI[sha256sum] = "e21175500a2bd310ae3867e7991639defc1e2a5c92cf1b9f7083296b346738ab" DEPENDS += "alsa-lib" diff --git a/meta-python/recipes-devtools/python/python3-pyasn1-modules/run-ptest b/meta-python/recipes-devtools/python/python3-pyasn1-modules/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-pyasn1-modules/run-ptest +++ b/meta-python/recipes-devtools/python/python3-pyasn1-modules/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-pyasn1-modules_0.2.8.bb b/meta-python/recipes-devtools/python/python3-pyasn1-modules_0.4.0.bb index d6a2749c24..34f3639e53 100644 --- a/meta-python/recipes-devtools/python/python3-pyasn1-modules_0.2.8.bb +++ b/meta-python/recipes-devtools/python/python3-pyasn1-modules_0.4.0.bb @@ -4,14 +4,15 @@ DESCRIPTION = "A collection of ASN.1 modules expressed in form of pyasn1\ data structures (X.509, PKCS etc.)." HOMEPAGE = "https://github.com/etingof/pyasn1-modules" LICENSE = "BSD-2-Clause" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=a14482d15c2249de3b6f0e8a47e021fd" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=190f79253908c986e6cacf380c3a5f6d" -SRC_URI[md5sum] = "107e1ece7d0a41d782f69f8a95a4d9bc" -SRC_URI[sha256sum] = "905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e" +SRC_URI[sha256sum] = "831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6" + +PYPI_PACKAGE = "pyasn1_modules" inherit pypi ptest setuptools3 -RDEPENDS:${PN} = "${PYTHON_PN}-pyasn1" +RDEPENDS:${PN} = "python3-pyasn1" BBCLASSEXTEND = "native nativesdk" @@ -20,7 +21,8 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-pyatspi_2.38.2.bb b/meta-python/recipes-devtools/python/python3-pyatspi_2.46.1.bb index 7c822ac23f..2b6a6c2c0e 100644 --- a/meta-python/recipes-devtools/python/python3-pyatspi_2.38.2.bb +++ b/meta-python/recipes-devtools/python/python3-pyatspi_2.46.1.bb @@ -8,14 +8,17 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=db29218e6ba3794c56df7d4987dc7e4d \ DEPENDS = "python3-dbus-native glib-2.0 dbus-glib libxml2 atk gtk+ python3-pygobject" SRC_URI = "git://github.com/GNOME/pyatspi2.git;protocol=https;branch=master" -SRCREV = "141a53029b3e16bfa5f100ae54a77234a9bf3426" +SRCREV = "8c69016b38d0e4caaf4c986938ea3410fb7351b6" S = "${WORKDIR}/git" # Same restriction as gtk+ inherit features_check setuptools3 ANY_OF_DISTRO_FEATURES = "${GTK2DISTROFEATURES}" +REQUIRED_DISTRO_FEATURES = "gobject-introspection-data" inherit pkgconfig autotools python3native FILES:${PN} += "${PYTHON_SITEPACKAGES_DIR}/pyatspi/*" + +RDEPENDS:${PN} += "python3-pygobject" diff --git a/meta-python/recipes-devtools/python/python3-pyaudio/0001-Remove-absolute-paths-into-build-machine-system-dirs.patch b/meta-python/recipes-devtools/python/python3-pyaudio/0001-Remove-absolute-paths-into-build-machine-system-dirs.patch new file mode 100644 index 0000000000..a71902a362 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyaudio/0001-Remove-absolute-paths-into-build-machine-system-dirs.patch @@ -0,0 +1,28 @@ +From d94518b558c1812aecb87d8ef19d75c2df1b98a5 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Wed, 26 Jul 2023 19:54:19 -0700 +Subject: [PATCH] Remove absolute paths into build machine system dirs + +This ensures that it does not add /usr/include and /usr/local/include/ +into cflags + +Upstream-Status: Pending +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + setup.py | 2 -- + 1 file changed, 2 deletions(-) + +--- a/setup.py ++++ b/setup.py +@@ -111,11 +111,6 @@ def setup_extension(): + # the standard portaudio cmake settings. For details, see: + # https://devblogs.microsoft.com/cppblog/vcpkg-updates-static-linking-is-now-available/ + extra_compile_args += ["/MT"] +- else: +- # GNU/Linux and other posix-like OSes will dynamically link to +- # portaudio, installed by the package manager. +- include_dirs += ['/usr/local/include', '/usr/include'] +- external_libraries_path += ['/usr/local/lib', '/usr/lib'] + + return Extension( + 'pyaudio._portaudio', diff --git a/meta-python/recipes-devtools/python/python3-pyaudio_0.2.11.bb b/meta-python/recipes-devtools/python/python3-pyaudio_0.2.14.bb index 802ca35100..1599ea8347 100644 --- a/meta-python/recipes-devtools/python/python3-pyaudio_0.2.11.bb +++ b/meta-python/recipes-devtools/python/python3-pyaudio_0.2.14.bb @@ -1,15 +1,16 @@ SUMMARY = "PyAudio provides Python bindings for PortAudio, the cross-platform audio I/O library" SECTION = "devel/python" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://README;md5=288793c2b9b05bd67abbd2a8f5d144f7" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=7c3152b432b96d6dc4a1cb35397da9ec" PYPI_PACKAGE = "PyAudio" -SRC_URI[md5sum] = "7e4c88139284033f67b4336c74eda3b8" -SRC_URI[sha256sum] = "93bfde30e0b64e63a46f2fd77e85c41fd51182a4a3413d9edfaf9ffaa26efb74" +SRC_URI[sha256sum] = "78dfff3879b4994d1f4fc6485646a57755c6ee3c19647a491f790a0895bd2f87" inherit pypi setuptools3 +SRC_URI += "file://0001-Remove-absolute-paths-into-build-machine-system-dirs.patch" + DEPENDS += "portaudio-v19" RDEPENDS:${PN} += "portaudio-v19" diff --git a/meta-python/recipes-devtools/python/python3-pybcj_1.0.2.bb b/meta-python/recipes-devtools/python/python3-pybcj_1.0.2.bb new file mode 100644 index 0000000000..8cb176f2b5 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pybcj_1.0.2.bb @@ -0,0 +1,24 @@ +SUMMARY = "bcj filter library" +HOMEPAGE = "https://codeberg.org/miurahr/pybcj" +LICENSE = "LGPL-2.1-or-later" +SECTION = "devel/python" +LIC_FILES_CHKSUM = "file://LICENSE;md5=4fbd65380cdd255951079008b364516c" + +SRC_URI[sha256sum] = "c7f5bef7f47723c53420e377bc64d2553843bee8bcac5f0ad076ab1524780018" + +inherit pypi python_setuptools_build_meta pypi + +#PROVIDES = "python3-pybcj" + +DEPENDS += " \ + python3-setuptools-scm-native \ + python3-toml-native \ + python3-wheel-native \ +" + +RDEPENDS:${PN} += "\ + python3-email \ + python3-importlib-metadata \ + python3-core \ + python3-compression \ +" diff --git a/meta-python/recipes-devtools/python/python3-pybind11-json_0.2.11.bb b/meta-python/recipes-devtools/python/python3-pybind11-json_0.2.13.bb index e06579a6cc..67bd2a33a7 100644 --- a/meta-python/recipes-devtools/python/python3-pybind11-json_0.2.11.bb +++ b/meta-python/recipes-devtools/python/python3-pybind11-json_0.2.13.bb @@ -2,7 +2,7 @@ SUMMARY = "Using nlohmann::json with pybind11" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=0e25ff0ec476d06d366439e1120cce98" -SRCREV = "0fbbe3bbb27bd07a5ec7d71cbb1f17eaf4d37702" +SRCREV = "b02a2ad597d224c3faee1f05a56d81d4c4453092" SRC_URI = "git://github.com/pybind/pybind11_json;branch=master;protocol=https" DEPENDS += "nlohmann-json python3-pybind11" diff --git a/meta-python/recipes-devtools/python/python3-pybind11/0001-Do-not-check-pointer-size-when-cross-compiling.patch b/meta-python/recipes-devtools/python/python3-pybind11/0001-Do-not-check-pointer-size-when-cross-compiling.patch deleted file mode 100644 index 761422e07e..0000000000 --- a/meta-python/recipes-devtools/python/python3-pybind11/0001-Do-not-check-pointer-size-when-cross-compiling.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 2e9318f7a70699eed239aee6301d1d0bbd2457ee Mon Sep 17 00:00:00 2001 -From: Philip Balister <philip@balister.org> -Date: Fri, 10 Jul 2020 10:14:59 -0400 -Subject: [PATCH] Do not check pointer size when cross compiling. - -It is reasonable to build for 32 machine on a 64 bit build machine. Prevents: -| CMake Error at tools/FindPythonLibsNew.cmake:127 (message): -| Python config failure: Python is 64-bit, chosen compiler is 32-bit - -Signed-off-by: Philip Balister <philip@balister.org> -Signed-off-by: Leon Anavi <leon.anavi@konsulko.com> ---- - tools/FindPythonLibsNew.cmake | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/tools/FindPythonLibsNew.cmake b/tools/FindPythonLibsNew.cmake -index 3605aebc..67f4d4a0 100644 ---- a/tools/FindPythonLibsNew.cmake -+++ b/tools/FindPythonLibsNew.cmake -@@ -156,7 +156,7 @@ list(GET _PYTHON_VALUES 9 PYTHON_MULTIARCH) - - # Make sure the Python has the same pointer-size as the chosen compiler - # Skip if CMAKE_SIZEOF_VOID_P is not defined --if(CMAKE_SIZEOF_VOID_P AND (NOT "${PYTHON_SIZEOF_VOID_P}" STREQUAL "${CMAKE_SIZEOF_VOID_P}")) -+if((NOT CMAKE_CROSSCOMPILING) AND CMAKE_SIZEOF_VOID_P AND (NOT "${PYTHON_SIZEOF_VOID_P}" STREQUAL "${CMAKE_SIZEOF_VOID_P}")) - if(PythonLibsNew_FIND_REQUIRED) - math(EXPR _PYTHON_BITS "${PYTHON_SIZEOF_VOID_P} * 8") - math(EXPR _CMAKE_BITS "${CMAKE_SIZEOF_VOID_P} * 8") --- -2.17.1 - diff --git a/meta-python/recipes-devtools/python/python3-pybind11/0001-Do-not-strip-binaries.patch b/meta-python/recipes-devtools/python/python3-pybind11/0001-Do-not-strip-binaries.patch index 699eb61550..91575d2712 100644 --- a/meta-python/recipes-devtools/python/python3-pybind11/0001-Do-not-strip-binaries.patch +++ b/meta-python/recipes-devtools/python/python3-pybind11/0001-Do-not-strip-binaries.patch @@ -7,20 +7,24 @@ Subject: [PATCH] Do not strip binaries. Signed-off-by: Philip Balister <philip@balister.org> Signed-off-by: Leon Anavi <leon.anavi@konsulko.com> + +Upstream-Status: Pending --- - tools/pybind11NewTools.cmake | 5 ----- - tools/pybind11Tools.cmake | 4 ---- - 2 files changed, 9 deletions(-) + tools/pybind11NewTools.cmake | 7 ------- + tools/pybind11Tools.cmake | 6 ------ + 2 files changed, 13 deletions(-) diff --git a/tools/pybind11NewTools.cmake b/tools/pybind11NewTools.cmake -index 18da8be1..82ebf5e7 100644 +index 7d7424a7..accd90c4 100644 --- a/tools/pybind11NewTools.cmake +++ b/tools/pybind11NewTools.cmake -@@ -246,11 +246,6 @@ function(pybind11_add_module target_name) +@@ -233,13 +233,6 @@ function(pybind11_add_module target_name) endif() endif() -- if(NOT MSVC AND NOT ${CMAKE_BUILD_TYPE} MATCHES Debug|RelWithDebInfo) +- # Use case-insensitive comparison to match the result of $<CONFIG:cfgs> +- string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE) +- if(NOT MSVC AND NOT "${uppercase_CMAKE_BUILD_TYPE}" MATCHES DEBUG|RELWITHDEBINFO) - # Strip unnecessary sections of the binary on Linux/macOS - pybind11_strip(${target_name}) - endif() @@ -29,14 +33,16 @@ index 18da8be1..82ebf5e7 100644 target_link_libraries(${target_name} PRIVATE pybind11::windows_extras) endif() diff --git a/tools/pybind11Tools.cmake b/tools/pybind11Tools.cmake -index 32313539..a7d81012 100644 +index 66ad00a4..855ede41 100644 --- a/tools/pybind11Tools.cmake +++ b/tools/pybind11Tools.cmake -@@ -201,10 +201,6 @@ function(pybind11_add_module target_name) +@@ -212,12 +212,6 @@ function(pybind11_add_module target_name) endif() endif() -- if(NOT MSVC AND NOT ${CMAKE_BUILD_TYPE} MATCHES Debug|RelWithDebInfo) +- # Use case-insensitive comparison to match the result of $<CONFIG:cfgs> +- string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE) +- if(NOT MSVC AND NOT "${uppercase_CMAKE_BUILD_TYPE}" MATCHES DEBUG|RELWITHDEBINFO) - pybind11_strip(${target_name}) - endif() - @@ -44,5 +50,5 @@ index 32313539..a7d81012 100644 target_link_libraries(${target_name} PRIVATE pybind11::windows_extras) endif() -- -2.17.1 +2.39.2 diff --git a/meta-python/recipes-devtools/python/python3-pybind11_2.11.1.bb b/meta-python/recipes-devtools/python/python3-pybind11_2.11.1.bb new file mode 100644 index 0000000000..78662fe3cd --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pybind11_2.11.1.bb @@ -0,0 +1,34 @@ +SUMMARY = "Seamless operability between C++11 and Python" +HOMEPAGE = "https://github.com/pybind/pybind11" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=774f65abd8a7fe3124be2cdf766cd06f" +DEPENDS = "\ + python3-cmake-native \ + python3-ninja-native \ +" + +SRCREV = "8a099e44b3d5f85b20f05828d919d2332a8de841" +SRC_URI = "\ + git://github.com/pybind/pybind11.git;branch=stable;protocol=https \ + file://0001-Do-not-strip-binaries.patch \ +" + +S = "${WORKDIR}/git" + +inherit cmake python_setuptools_build_meta + +EXTRA_OECMAKE = "-DPYBIND11_TEST=OFF" + +do_configure:append() { + cmake_do_configure +} + +do_compile:append() { + cmake_do_compile +} + +do_install:append() { + cmake_do_install +} + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pybind11_2.9.2.bb b/meta-python/recipes-devtools/python/python3-pybind11_2.9.2.bb deleted file mode 100644 index 433bfd60e8..0000000000 --- a/meta-python/recipes-devtools/python/python3-pybind11_2.9.2.bb +++ /dev/null @@ -1,39 +0,0 @@ -SUMMARY = "Seamless operability between C++11 and Python" -HOMEPAGE = "https://github.com/wjakob/pybind11" -LICENSE = "BSD-2-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=774f65abd8a7fe3124be2cdf766cd06f" - -DEPENDS = "boost" - -SRC_URI = "git://github.com/pybind/pybind11.git;branch=stable;protocol=https \ - file://0001-Do-not-strip-binaries.patch \ - file://0001-Do-not-check-pointer-size-when-cross-compiling.patch \ -" -SRCREV = "914c06fb252b6cc3727d0eedab6736e88a3fcb01" - -S = "${WORKDIR}/git" - -BBCLASSEXTEND = "native" - -EXTRA_OECMAKE = "-DPYBIND11_TEST=OFF" - -inherit cmake setuptools3 python3native - -PIP_INSTALL_DIST_PATH = "${S}/dist" -PIP_INSTALL_PACKAGE = "pybind11" - -do_configure() { - cmake_do_configure -} - -do_compile() { - setuptools3_do_compile - cmake_do_compile -} - -do_install() { - setuptools3_do_install - cmake_do_install -} - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pybluez/0001-Use-Py_ssize_t-when-parsing-buffer-length-fix-426-42.patch b/meta-python/recipes-devtools/python/python3-pybluez/0001-Use-Py_ssize_t-when-parsing-buffer-length-fix-426-42.patch index 9126aba8d3..fea87a2ff0 100644 --- a/meta-python/recipes-devtools/python/python3-pybluez/0001-Use-Py_ssize_t-when-parsing-buffer-length-fix-426-42.patch +++ b/meta-python/recipes-devtools/python/python3-pybluez/0001-Use-Py_ssize_t-when-parsing-buffer-length-fix-426-42.patch @@ -19,9 +19,10 @@ From python 3.8 changes: > values for detail. (Contributed by Inada Naoki in bpo-36381.) Fixes https://github.com/pybluez/pybluez/issues/426 ---- -Upstream-Status: Accepted +Upstream-Status: Backport [https://github.com/pybluez/pybluez/pull/427] +Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl> +--- bluez/btmodule.c | 23 ++++++++++++++--------- msbt/_msbt.c | 6 ++++-- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/meta-python/recipes-devtools/python/python3-pybluez/py-3.11.patch b/meta-python/recipes-devtools/python/python3-pybluez/py-3.11.patch new file mode 100644 index 0000000000..af4869f735 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pybluez/py-3.11.patch @@ -0,0 +1,454 @@ +From f83d38687fec2239c517037453ed4a2191279796 Mon Sep 17 00:00:00 2001 +From: Victor Stinner <vstinner@python.org> +Date: Fri, 28 Jan 2022 00:14:04 +0100 +Subject: [PATCH] Port to Python 3.11 (#410) + +* Replace "arg == Py_None" with Py_IsNone(arg) +* Replace arg->ob_type with Py_TYPE(arg) +* Replace "Py_TYPE(obj) = type" with Py_SET_TYPE(obj, type). +* Copy pythoncapi_compat.h from: + https://github.com/pythoncapi/pythoncapi_compat +* pythoncapi_compat.h provides Py_SET_TYPE() and Py_IsNone() to old + Python versions. + +Upstream-Status: Backport [https://github.com/pybluez/pybluez/commit/5096047f90a1f6a74ceb250aef6243e144170f92] +Signed-off-by: Alexander Kanavin <alex@linutronix.de> +--- + bluez/btmodule.c | 14 +- + bluez/pythoncapi_compat.h | 364 ++++++++++++++++++++++++++++++++++++++ + 2 files changed, 372 insertions(+), 6 deletions(-) + create mode 100644 bluez/pythoncapi_compat.h + +diff --git a/bluez/btmodule.c b/bluez/btmodule.c +index 912a489..b61f74a 100644 +--- a/bluez/btmodule.c ++++ b/bluez/btmodule.c +@@ -21,6 +21,8 @@ Local naming conventions: + #include "btmodule.h" + #include "structmember.h" + ++#include "pythoncapi_compat.h" ++ + #include <stdio.h> + #include <unistd.h> + #include <stdlib.h> +@@ -678,7 +680,7 @@ sock_settimeout(PySocketSockObject *s, PyObject *arg) + { + double timeout; + +- if (arg == Py_None) ++ if (Py_IsNone(arg)) + timeout = -1.0; + else { + timeout = PyFloat_AsDouble(arg); +@@ -1752,7 +1754,7 @@ bt_btohl(PyObject *self, PyObject *args) + else + return PyErr_Format(PyExc_TypeError, + "expected int/long, %s found", +- arg->ob_type->tp_name); ++ Py_TYPE(arg)->tp_name); + if (x == (unsigned long) -1 && PyErr_Occurred()) + return NULL; + return PyInt_FromLong(btohl(x)); +@@ -1816,7 +1818,7 @@ bt_htobl(PyObject *self, PyObject *args) + else + return PyErr_Format(PyExc_TypeError, + "expected int/long, %s found", +- arg->ob_type->tp_name); ++ Py_TYPE(arg)->tp_name); + return PyInt_FromLong(htobl(x)); + } + +@@ -1889,7 +1891,7 @@ bt_setdefaulttimeout(PyObject *self, PyObject *arg) + { + double timeout; + +- if (arg == Py_None) ++ if (Py_IsNone(arg)) + timeout = -1.0; + else { + timeout = PyFloat_AsDouble(arg); +@@ -2980,8 +2982,8 @@ PyMODINIT_FUNC + init_bluetooth(void) + #endif + { +- Py_TYPE(&sock_type) = &PyType_Type; +- Py_TYPE(&sdp_session_type) = &PyType_Type; ++ Py_SET_TYPE(&sock_type, &PyType_Type); ++ Py_SET_TYPE(&sdp_session_type, &PyType_Type); + #if PY_MAJOR_VERSION >= 3 + PyObject *m = PyModule_Create(&moduledef); + #else +diff --git a/bluez/pythoncapi_compat.h b/bluez/pythoncapi_compat.h +new file mode 100644 +index 0000000..e660b61 +--- /dev/null ++++ b/bluez/pythoncapi_compat.h +@@ -0,0 +1,364 @@ ++// Header file providing new functions of the Python C API to old Python ++// versions. ++// ++// File distributed under the MIT license. ++// Copyright Contributors to the pythoncapi_compat project. ++// ++// Homepage: ++// https://github.com/pythoncapi/pythoncapi_compat ++// ++// Latest version: ++// https://raw.githubusercontent.com/pythoncapi/pythoncapi_compat/master/pythoncapi_compat.h ++// ++// SPDX-License-Identifier: MIT ++ ++#ifndef PYTHONCAPI_COMPAT ++#define PYTHONCAPI_COMPAT ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#include <Python.h> ++#include "frameobject.h" // PyFrameObject, PyFrame_GetBack() ++ ++ ++// Compatibility with Visual Studio 2013 and older which don't support ++// the inline keyword in C (only in C++): use __inline instead. ++#if (defined(_MSC_VER) && _MSC_VER < 1900 \ ++ && !defined(__cplusplus) && !defined(inline)) ++# define inline __inline ++# define PYTHONCAPI_COMPAT_MSC_INLINE ++ // These two macros are undefined at the end of this file ++#endif ++ ++ ++// Cast argument to PyObject* type. ++#ifndef _PyObject_CAST ++# define _PyObject_CAST(op) ((PyObject*)(op)) ++#endif ++#ifndef _PyObject_CAST_CONST ++# define _PyObject_CAST_CONST(op) ((const PyObject*)(op)) ++#endif ++ ++ ++// bpo-42262 added Py_NewRef() to Python 3.10.0a3 ++#if PY_VERSION_HEX < 0x030A00A3 && !defined(Py_NewRef) ++static inline PyObject* _Py_NewRef(PyObject *obj) ++{ ++ Py_INCREF(obj); ++ return obj; ++} ++#define Py_NewRef(obj) _Py_NewRef(_PyObject_CAST(obj)) ++#endif ++ ++ ++// bpo-42262 added Py_XNewRef() to Python 3.10.0a3 ++#if PY_VERSION_HEX < 0x030A00A3 && !defined(Py_XNewRef) ++static inline PyObject* _Py_XNewRef(PyObject *obj) ++{ ++ Py_XINCREF(obj); ++ return obj; ++} ++#define Py_XNewRef(obj) _Py_XNewRef(_PyObject_CAST(obj)) ++#endif ++ ++ ++// See https://bugs.python.org/issue42522 ++#if !defined(_Py_StealRef) ++static inline PyObject* __Py_StealRef(PyObject *obj) ++{ ++ Py_DECREF(obj); ++ return obj; ++} ++#define _Py_StealRef(obj) __Py_StealRef(_PyObject_CAST(obj)) ++#endif ++ ++ ++// See https://bugs.python.org/issue42522 ++#if !defined(_Py_XStealRef) ++static inline PyObject* __Py_XStealRef(PyObject *obj) ++{ ++ Py_XDECREF(obj); ++ return obj; ++} ++#define _Py_XStealRef(obj) __Py_XStealRef(_PyObject_CAST(obj)) ++#endif ++ ++ ++// bpo-39573 added Py_SET_REFCNT() to Python 3.9.0a4 ++#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_REFCNT) ++static inline void _Py_SET_REFCNT(PyObject *ob, Py_ssize_t refcnt) ++{ ++ ob->ob_refcnt = refcnt; ++} ++#define Py_SET_REFCNT(ob, refcnt) _Py_SET_REFCNT(_PyObject_CAST(ob), refcnt) ++#endif ++ ++ ++// Py_SETREF() and Py_XSETREF() were added to Python 3.5.2. ++// It is excluded from the limited C API. ++#if (PY_VERSION_HEX < 0x03050200 && !defined(Py_SETREF)) && !defined(Py_LIMITED_API) ++#define Py_SETREF(op, op2) \ ++ do { \ ++ PyObject *_py_tmp = _PyObject_CAST(op); \ ++ (op) = (op2); \ ++ Py_DECREF(_py_tmp); \ ++ } while (0) ++ ++#define Py_XSETREF(op, op2) \ ++ do { \ ++ PyObject *_py_tmp = _PyObject_CAST(op); \ ++ (op) = (op2); \ ++ Py_XDECREF(_py_tmp); \ ++ } while (0) ++#endif ++ ++ ++// bpo-43753 added Py_Is(), Py_IsNone(), Py_IsTrue() and Py_IsFalse() ++// to Python 3.10.0b1. ++#if PY_VERSION_HEX < 0x030A00B1 && !defined(Py_Is) ++# define Py_Is(x, y) ((x) == (y)) ++#endif ++#if PY_VERSION_HEX < 0x030A00B1 && !defined(Py_IsNone) ++# define Py_IsNone(x) Py_Is(x, Py_None) ++#endif ++#if PY_VERSION_HEX < 0x030A00B1 && !defined(Py_IsTrue) ++# define Py_IsTrue(x) Py_Is(x, Py_True) ++#endif ++#if PY_VERSION_HEX < 0x030A00B1 && !defined(Py_IsFalse) ++# define Py_IsFalse(x) Py_Is(x, Py_False) ++#endif ++ ++ ++// bpo-39573 added Py_SET_TYPE() to Python 3.9.0a4 ++#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_TYPE) ++static inline void ++_Py_SET_TYPE(PyObject *ob, PyTypeObject *type) ++{ ++ ob->ob_type = type; ++} ++#define Py_SET_TYPE(ob, type) _Py_SET_TYPE(_PyObject_CAST(ob), type) ++#endif ++ ++ ++// bpo-39573 added Py_SET_SIZE() to Python 3.9.0a4 ++#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_SIZE) ++static inline void ++_Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size) ++{ ++ ob->ob_size = size; ++} ++#define Py_SET_SIZE(ob, size) _Py_SET_SIZE((PyVarObject*)(ob), size) ++#endif ++ ++ ++// bpo-40421 added PyFrame_GetCode() to Python 3.9.0b1 ++#if PY_VERSION_HEX < 0x030900B1 ++static inline PyCodeObject* ++PyFrame_GetCode(PyFrameObject *frame) ++{ ++ assert(frame != NULL); ++ assert(frame->f_code != NULL); ++ return (PyCodeObject*)Py_NewRef(frame->f_code); ++} ++#endif ++ ++static inline PyCodeObject* ++_PyFrame_GetCodeBorrow(PyFrameObject *frame) ++{ ++ return (PyCodeObject *)_Py_StealRef(PyFrame_GetCode(frame)); ++} ++ ++ ++// bpo-40421 added PyFrame_GetCode() to Python 3.9.0b1 ++#if PY_VERSION_HEX < 0x030900B1 && !defined(PYPY_VERSION) ++static inline PyFrameObject* ++PyFrame_GetBack(PyFrameObject *frame) ++{ ++ assert(frame != NULL); ++ return (PyFrameObject*)Py_XNewRef(frame->f_back); ++} ++#endif ++ ++#if !defined(PYPY_VERSION) ++static inline PyFrameObject* ++_PyFrame_GetBackBorrow(PyFrameObject *frame) ++{ ++ return (PyFrameObject *)_Py_XStealRef(PyFrame_GetBack(frame)); ++} ++#endif ++ ++ ++// bpo-39947 added PyThreadState_GetInterpreter() to Python 3.9.0a5 ++#if PY_VERSION_HEX < 0x030900A5 ++static inline PyInterpreterState * ++PyThreadState_GetInterpreter(PyThreadState *tstate) ++{ ++ assert(tstate != NULL); ++ return tstate->interp; ++} ++#endif ++ ++ ++// bpo-40429 added PyThreadState_GetFrame() to Python 3.9.0b1 ++#if PY_VERSION_HEX < 0x030900B1 && !defined(PYPY_VERSION) ++static inline PyFrameObject* ++PyThreadState_GetFrame(PyThreadState *tstate) ++{ ++ assert(tstate != NULL); ++ return (PyFrameObject *)Py_XNewRef(tstate->frame); ++} ++#endif ++ ++#if !defined(PYPY_VERSION) ++static inline PyFrameObject* ++_PyThreadState_GetFrameBorrow(PyThreadState *tstate) ++{ ++ return (PyFrameObject *)_Py_XStealRef(PyThreadState_GetFrame(tstate)); ++} ++#endif ++ ++ ++// bpo-39947 added PyInterpreterState_Get() to Python 3.9.0a5 ++#if PY_VERSION_HEX < 0x030900A5 ++static inline PyInterpreterState * ++PyInterpreterState_Get(void) ++{ ++ PyThreadState *tstate; ++ PyInterpreterState *interp; ++ ++ tstate = PyThreadState_GET(); ++ if (tstate == NULL) { ++ Py_FatalError("GIL released (tstate is NULL)"); ++ } ++ interp = tstate->interp; ++ if (interp == NULL) { ++ Py_FatalError("no current interpreter"); ++ } ++ return interp; ++} ++#endif ++ ++ ++// bpo-39947 added PyInterpreterState_Get() to Python 3.9.0a6 ++#if 0x030700A1 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x030900A6 && !defined(PYPY_VERSION) ++static inline uint64_t ++PyThreadState_GetID(PyThreadState *tstate) ++{ ++ assert(tstate != NULL); ++ return tstate->id; ++} ++#endif ++ ++ ++// bpo-37194 added PyObject_CallNoArgs() to Python 3.9.0a1 ++#if PY_VERSION_HEX < 0x030900A1 ++static inline PyObject* ++PyObject_CallNoArgs(PyObject *func) ++{ ++ return PyObject_CallFunctionObjArgs(func, NULL); ++} ++#endif ++ ++ ++// bpo-39245 made PyObject_CallOneArg() public (previously called ++// _PyObject_CallOneArg) in Python 3.9.0a4 ++#if PY_VERSION_HEX < 0x030900A4 ++static inline PyObject* ++PyObject_CallOneArg(PyObject *func, PyObject *arg) ++{ ++ return PyObject_CallFunctionObjArgs(func, arg, NULL); ++} ++#endif ++ ++ ++// bpo-1635741 added PyModule_AddObjectRef() to Python 3.10.0a3 ++#if PY_VERSION_HEX < 0x030A00A3 ++static inline int ++PyModule_AddObjectRef(PyObject *module, const char *name, PyObject *value) ++{ ++ Py_XINCREF(value); ++ int res = PyModule_AddObject(module, name, value); ++ if (res < 0) { ++ Py_XDECREF(value); ++ } ++ return res; ++} ++#endif ++ ++ ++// bpo-40024 added PyModule_AddType() to Python 3.9.0a5 ++#if PY_VERSION_HEX < 0x030900A5 ++static inline int ++PyModule_AddType(PyObject *module, PyTypeObject *type) ++{ ++ const char *name, *dot; ++ ++ if (PyType_Ready(type) < 0) { ++ return -1; ++ } ++ ++ // inline _PyType_Name() ++ name = type->tp_name; ++ assert(name != NULL); ++ dot = strrchr(name, '.'); ++ if (dot != NULL) { ++ name = dot + 1; ++ } ++ ++ return PyModule_AddObjectRef(module, name, (PyObject *)type); ++} ++#endif ++ ++ ++// bpo-40241 added PyObject_GC_IsTracked() to Python 3.9.0a6. ++// bpo-4688 added _PyObject_GC_IS_TRACKED() to Python 2.7.0a2. ++#if PY_VERSION_HEX < 0x030900A6 && !defined(PYPY_VERSION) ++static inline int ++PyObject_GC_IsTracked(PyObject* obj) ++{ ++ return (PyObject_IS_GC(obj) && _PyObject_GC_IS_TRACKED(obj)); ++} ++#endif ++ ++// bpo-40241 added PyObject_GC_IsFinalized() to Python 3.9.0a6. ++// bpo-18112 added _PyGCHead_FINALIZED() to Python 3.4.0 final. ++#if PY_VERSION_HEX < 0x030900A6 && PY_VERSION_HEX >= 0x030400F0 && !defined(PYPY_VERSION) ++static inline int ++PyObject_GC_IsFinalized(PyObject *obj) ++{ ++ return (PyObject_IS_GC(obj) && _PyGCHead_FINALIZED((PyGC_Head *)(obj)-1)); ++} ++#endif ++ ++ ++// bpo-39573 added Py_IS_TYPE() to Python 3.9.0a4 ++#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_IS_TYPE) ++static inline int ++_Py_IS_TYPE(const PyObject *ob, const PyTypeObject *type) { ++ return ob->ob_type == type; ++} ++#define Py_IS_TYPE(ob, type) _Py_IS_TYPE(_PyObject_CAST_CONST(ob), type) ++#endif ++ ++ ++// Py_UNUSED() was added to Python 3.4.0b2. ++#if PY_VERSION_HEX < 0x030400B2 && !defined(Py_UNUSED) ++# if defined(__GNUC__) || defined(__clang__) ++# define Py_UNUSED(name) _unused_ ## name __attribute__((unused)) ++# else ++# define Py_UNUSED(name) _unused_ ## name ++# endif ++#endif ++ ++ ++#ifdef PYTHONCAPI_COMPAT_MSC_INLINE ++# undef inline ++# undef PYTHONCAPI_COMPAT_MSC_INLINE ++#endif ++ ++#ifdef __cplusplus ++} ++#endif ++#endif // PYTHONCAPI_COMPAT +-- +2.30.2 + diff --git a/meta-python/recipes-devtools/python/python3-pybluez_0.23.bb b/meta-python/recipes-devtools/python/python3-pybluez_0.23.bb index 6a1df273a2..a38e10eec0 100644 --- a/meta-python/recipes-devtools/python/python3-pybluez_0.23.bb +++ b/meta-python/recipes-devtools/python/python3-pybluez_0.23.bb @@ -7,7 +7,8 @@ DEPENDS = "bluez5" LICENSE = "GPL-2.0-only" LIC_FILES_CHKSUM = "file://COPYING;md5=8a71d0475d08eee76d8b6d0c6dbec543" -SRC_URI += "file://0001-Use-Py_ssize_t-when-parsing-buffer-length-fix-426-42.patch" +SRC_URI += "file://0001-Use-Py_ssize_t-when-parsing-buffer-length-fix-426-42.patch \ + file://py-3.11.patch " SRC_URI[md5sum] = "afbe8429bb82d2c46a3d0f5f4f898f9d" SRC_URI[sha256sum] = "c8f04d2e78951eaa9de486b4d49381704e8943d0a6e6e58f55fcd7b8582e90de" @@ -21,5 +22,5 @@ do_configure:prepend() { RDEPENDS:${PN} += "\ bluez5 \ - ${PYTHON_PN}-fcntl \ + python3-fcntl \ " diff --git a/meta-python/recipes-devtools/python/python3-pycares_4.2.2.bb b/meta-python/recipes-devtools/python/python3-pycares_4.4.0.bb index d2de4d3b74..b6b0de8809 100644 --- a/meta-python/recipes-devtools/python/python3-pycares_4.2.2.bb +++ b/meta-python/recipes-devtools/python/python3-pycares_4.4.0.bb @@ -6,15 +6,17 @@ HOMEPAGE = "https://github.com/saghul/pycares" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=b1538fcaea82ebf2313ed648b96c69b1" -SRC_URI[sha256sum] = "e1f57a8004370080694bd6fb969a1ffc9171a59c6824d54f791c1b2e4d298385" +SRC_URI[sha256sum] = "f47579d508f2f56eddd16ce72045782ad3b1b3b678098699e2b6a1b30733e1c2" PYPI_PACKAGE = "pycares" inherit pypi setuptools3 -DEPENDS += "${PYTHON_PN}-cffi-native" +DEPENDS += "python3-cffi-native" RDEPENDS:${PN} += " \ - ${PYTHON_PN}-cffi \ - ${PYTHON_PN}-idna \ + python3-cffi \ + python3-idna \ " + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pychromecast/0001-Allow-newer-version-of-wheel-and-setuptools.patch b/meta-python/recipes-devtools/python/python3-pychromecast/0001-Allow-newer-version-of-wheel-and-setuptools.patch new file mode 100644 index 0000000000..447f679070 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pychromecast/0001-Allow-newer-version-of-wheel-and-setuptools.patch @@ -0,0 +1,22 @@ +From 5ee73f91b7f13dd5c700c69e7fc43cecab5868da Mon Sep 17 00:00:00 2001 +From: Tom Geelen <t.f.g.geelen@gmail.com> +Date: Sun, 7 Apr 2024 22:39:35 +0000 +Subject: [PATCH] Allow newer version of wheel and setuptools + +Upstream-Status: Pending +Signed-off-by: Tom Geelen <t.f.g.geelen@gmail.com> +--- + pyproject.toml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/pyproject.toml b/pyproject.toml +index 56df5bd..17ca62d 100644 +--- a/pyproject.toml ++++ b/pyproject.toml +@@ -1,5 +1,5 @@ + [build-system] +-requires = ["setuptools~=65.6", "wheel~=0.37.1"] ++requires = ["setuptools>=65.6", "wheel>=0.37.1"] + build-backend = "setuptools.build_meta" + + [project] diff --git a/meta-python/recipes-devtools/python/python3-pychromecast_12.1.4.bb b/meta-python/recipes-devtools/python/python3-pychromecast_12.1.4.bb deleted file mode 100644 index 69372060bc..0000000000 --- a/meta-python/recipes-devtools/python/python3-pychromecast_12.1.4.bb +++ /dev/null @@ -1,19 +0,0 @@ -SUMMARY = "Library for Python 3.6+ to communicate with the Google Chromecast." -HOMEPAGE = "https://github.com/balloob/pychromecast" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=b1dbd4e85f47b389bdadee9c694669f5" - -SRC_URI[sha256sum] = "9e57dc985a4a05db5bdcd5da219cbf6ced25548ca093f8d74bc107b3c554ec00" - -PYPI_PACKAGE = "PyChromecast" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-zeroconf \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-requests \ - ${PYTHON_PN}-protobuf \ - ${PYTHON_PN}-compression \ -" diff --git a/meta-python/recipes-devtools/python/python3-pychromecast_14.0.1.bb b/meta-python/recipes-devtools/python/python3-pychromecast_14.0.1.bb new file mode 100644 index 0000000000..dee4bf6ebe --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pychromecast_14.0.1.bb @@ -0,0 +1,17 @@ +SUMMARY = "Library for Python 3.6+ to communicate with the Google Chromecast." +HOMEPAGE = "https://github.com/balloob/pychromecast" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=b1dbd4e85f47b389bdadee9c694669f5" + +SRC_URI += "file://0001-Allow-newer-version-of-wheel-and-setuptools.patch" +SRC_URI[sha256sum] = "e16e0a7f9488319191b8b4fa21ca0beb4bf12eeda5c9bf640241188f2bea0a3e" + +PYPI_PACKAGE = "PyChromecast" + +inherit pypi python_setuptools_build_meta + +RDEPENDS:${PN} += "\ + python3-zeroconf (>=0.131.0) \ + python3-protobuf (>=4.25.2) \ + python3-casttube (>=0.2.1) \ +" diff --git a/meta-python/recipes-devtools/python/python3-pycocotools_2.0.4.bb b/meta-python/recipes-devtools/python/python3-pycocotools_2.0.7.bb index ec8585e619..bebfb128f2 100644 --- a/meta-python/recipes-devtools/python/python3-pycocotools_2.0.4.bb +++ b/meta-python/recipes-devtools/python/python3-pycocotools_2.0.7.bb @@ -5,7 +5,7 @@ LIC_FILES_CHKSUM = "file://pycocotools/coco.py;beginline=45;endline=45;md5=12cb5 inherit setuptools3 pypi -SRC_URI[sha256sum] = "2ab586aa389b9657b6d73c2b9a827a3681f8d00f36490c2e8ab05902e3fd9e93" +SRC_URI[sha256sum] = "da8b7815196eebf0adabf67fcc459126cbc6498bbc6ab1fd144c371465d86879" DEPENDS = "python3-cython-native python3-numpy-native virtual/crypt" RDEPENDS:${PN} = "python3-matplotlib python3-pillow python3-profile" diff --git a/meta-python/recipes-devtools/python/python3-pycodestyle_2.9.1.bb b/meta-python/recipes-devtools/python/python3-pycodestyle_2.11.1.bb index 928e2b2ae7..a282afb466 100644 --- a/meta-python/recipes-devtools/python/python3-pycodestyle_2.9.1.bb +++ b/meta-python/recipes-devtools/python/python3-pycodestyle_2.11.1.bb @@ -4,7 +4,7 @@ LICENSE = "MIT" SECTION = "devel/python" LIC_FILES_CHKSUM = "file://LICENSE;md5=a8546d0e77f416fb05a26acd89c8b3bd" -SRC_URI[sha256sum] = "2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785" +SRC_URI[sha256sum] = "41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-pycurl_7.45.1.bb b/meta-python/recipes-devtools/python/python3-pycurl_7.45.2.bb index 407c264845..a6863e21ff 100644 --- a/meta-python/recipes-devtools/python/python3-pycurl_7.45.1.bb +++ b/meta-python/recipes-devtools/python/python3-pycurl_7.45.2.bb @@ -12,8 +12,10 @@ LIC_FILES_CHKSUM = "file://COPYING-LGPL;md5=4fbd65380cdd255951079008b364516c \ file://COPYING-MIT;md5=be42e1b1e58c8d59c2901fd747bfc55d \ " -SRC_URI[sha256sum] = "a863ad18ff478f5545924057887cdae422e1b2746e41674615f687498ea5b88a" +SRC_URI[sha256sum] = "5730590be0271364a5bddd9e245c9cc0fb710c4cbacbdd95264a3122d23224ca" DEPENDS = "curl" inherit pypi setuptools3 + +BBCLASSEXTEND += "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pydantic-core-crates.inc b/meta-python/recipes-devtools/python/python3-pydantic-core-crates.inc new file mode 100644 index 0000000000..dd2027948c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pydantic-core-crates.inc @@ -0,0 +1,170 @@ +# Autogenerated with 'bitbake -c update_crates python3-pydantic-core' + +# from Cargo.lock +SRC_URI += " \ + crate://crates.io/ahash/0.8.7 \ + crate://crates.io/aho-corasick/1.0.2 \ + crate://crates.io/allocator-api2/0.2.16 \ + crate://crates.io/autocfg/1.1.0 \ + crate://crates.io/base64/0.21.7 \ + crate://crates.io/bitflags/1.3.2 \ + crate://crates.io/cc/1.0.79 \ + crate://crates.io/cfg-if/1.0.0 \ + crate://crates.io/enum_dispatch/0.3.12 \ + crate://crates.io/equivalent/1.0.1 \ + crate://crates.io/form_urlencoded/1.2.1 \ + crate://crates.io/getrandom/0.2.10 \ + crate://crates.io/hashbrown/0.14.3 \ + crate://crates.io/heck/0.4.1 \ + crate://crates.io/idna/0.5.0 \ + crate://crates.io/indexmap/2.0.0 \ + crate://crates.io/indoc/2.0.4 \ + crate://crates.io/itoa/1.0.8 \ + crate://crates.io/jiter/0.0.6 \ + crate://crates.io/lexical-core/0.8.5 \ + crate://crates.io/lexical-parse-float/0.8.5 \ + crate://crates.io/lexical-parse-integer/0.8.6 \ + crate://crates.io/lexical-util/0.8.5 \ + crate://crates.io/lexical-write-float/0.8.5 \ + crate://crates.io/lexical-write-integer/0.8.5 \ + crate://crates.io/libc/0.2.147 \ + crate://crates.io/lock_api/0.4.10 \ + crate://crates.io/memchr/2.6.3 \ + crate://crates.io/memoffset/0.9.0 \ + crate://crates.io/num-bigint/0.4.4 \ + crate://crates.io/num-integer/0.1.45 \ + crate://crates.io/num-traits/0.2.16 \ + crate://crates.io/once_cell/1.18.0 \ + crate://crates.io/parking_lot/0.12.1 \ + crate://crates.io/parking_lot_core/0.9.8 \ + crate://crates.io/percent-encoding/2.3.1 \ + crate://crates.io/portable-atomic/1.6.0 \ + crate://crates.io/proc-macro2/1.0.76 \ + crate://crates.io/pyo3/0.20.3 \ + crate://crates.io/pyo3-build-config/0.20.3 \ + crate://crates.io/pyo3-ffi/0.20.3 \ + crate://crates.io/pyo3-macros/0.20.3 \ + crate://crates.io/pyo3-macros-backend/0.20.3 \ + crate://crates.io/python3-dll-a/0.2.9 \ + crate://crates.io/quote/1.0.35 \ + crate://crates.io/redox_syscall/0.3.5 \ + crate://crates.io/regex/1.10.2 \ + crate://crates.io/regex-automata/0.4.3 \ + crate://crates.io/regex-syntax/0.8.2 \ + crate://crates.io/rustversion/1.0.13 \ + crate://crates.io/ryu/1.0.14 \ + crate://crates.io/scopeguard/1.1.0 \ + crate://crates.io/serde/1.0.195 \ + crate://crates.io/serde_derive/1.0.195 \ + crate://crates.io/serde_json/1.0.109 \ + crate://crates.io/smallvec/1.11.2 \ + crate://crates.io/speedate/0.13.0 \ + crate://crates.io/static_assertions/1.1.0 \ + crate://crates.io/strum/0.25.0 \ + crate://crates.io/strum_macros/0.25.3 \ + crate://crates.io/syn/2.0.48 \ + crate://crates.io/target-lexicon/0.12.9 \ + crate://crates.io/tinyvec/1.6.0 \ + crate://crates.io/tinyvec_macros/0.1.1 \ + crate://crates.io/unicode-bidi/0.3.13 \ + crate://crates.io/unicode-ident/1.0.10 \ + crate://crates.io/unicode-normalization/0.1.22 \ + crate://crates.io/unindent/0.2.3 \ + crate://crates.io/url/2.5.0 \ + crate://crates.io/uuid/1.6.1 \ + crate://crates.io/version_check/0.9.4 \ + crate://crates.io/wasi/0.11.0+wasi-snapshot-preview1 \ + crate://crates.io/windows-targets/0.48.1 \ + crate://crates.io/windows_aarch64_gnullvm/0.48.0 \ + crate://crates.io/windows_aarch64_msvc/0.48.0 \ + crate://crates.io/windows_i686_gnu/0.48.0 \ + crate://crates.io/windows_i686_msvc/0.48.0 \ + crate://crates.io/windows_x86_64_gnu/0.48.0 \ + crate://crates.io/windows_x86_64_gnullvm/0.48.0 \ + crate://crates.io/windows_x86_64_msvc/0.48.0 \ + crate://crates.io/zerocopy/0.7.32 \ + crate://crates.io/zerocopy-derive/0.7.32 \ +" + +SRC_URI[ahash-0.8.7.sha256sum] = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" +SRC_URI[aho-corasick-1.0.2.sha256sum] = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +SRC_URI[allocator-api2-0.2.16.sha256sum] = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +SRC_URI[autocfg-1.1.0.sha256sum] = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +SRC_URI[base64-0.21.7.sha256sum] = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +SRC_URI[bitflags-1.3.2.sha256sum] = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +SRC_URI[cc-1.0.79.sha256sum] = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +SRC_URI[cfg-if-1.0.0.sha256sum] = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +SRC_URI[enum_dispatch-0.3.12.sha256sum] = "8f33313078bb8d4d05a2733a94ac4c2d8a0df9a2b84424ebf4f33bfc224a890e" +SRC_URI[equivalent-1.0.1.sha256sum] = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +SRC_URI[form_urlencoded-1.2.1.sha256sum] = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +SRC_URI[getrandom-0.2.10.sha256sum] = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +SRC_URI[hashbrown-0.14.3.sha256sum] = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +SRC_URI[heck-0.4.1.sha256sum] = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +SRC_URI[idna-0.5.0.sha256sum] = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +SRC_URI[indexmap-2.0.0.sha256sum] = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +SRC_URI[indoc-2.0.4.sha256sum] = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8" +SRC_URI[itoa-1.0.8.sha256sum] = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a" +SRC_URI[jiter-0.0.6.sha256sum] = "87db066a99f69382be06d02313f8ce989996b53a04a8a70cfd1a6483a56227f7" +SRC_URI[lexical-core-0.8.5.sha256sum] = "2cde5de06e8d4c2faabc400238f9ae1c74d5412d03a7bd067645ccbc47070e46" +SRC_URI[lexical-parse-float-0.8.5.sha256sum] = "683b3a5ebd0130b8fb52ba0bdc718cc56815b6a097e28ae5a6997d0ad17dc05f" +SRC_URI[lexical-parse-integer-0.8.6.sha256sum] = "6d0994485ed0c312f6d965766754ea177d07f9c00c9b82a5ee62ed5b47945ee9" +SRC_URI[lexical-util-0.8.5.sha256sum] = "5255b9ff16ff898710eb9eb63cb39248ea8a5bb036bea8085b1a767ff6c4e3fc" +SRC_URI[lexical-write-float-0.8.5.sha256sum] = "accabaa1c4581f05a3923d1b4cfd124c329352288b7b9da09e766b0668116862" +SRC_URI[lexical-write-integer-0.8.5.sha256sum] = "e1b6f3d1f4422866b68192d62f77bc5c700bee84f3069f2469d7bc8c77852446" +SRC_URI[libc-0.2.147.sha256sum] = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +SRC_URI[lock_api-0.4.10.sha256sum] = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +SRC_URI[memchr-2.6.3.sha256sum] = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" +SRC_URI[memoffset-0.9.0.sha256sum] = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +SRC_URI[num-bigint-0.4.4.sha256sum] = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +SRC_URI[num-integer-0.1.45.sha256sum] = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +SRC_URI[num-traits-0.2.16.sha256sum] = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +SRC_URI[once_cell-1.18.0.sha256sum] = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +SRC_URI[parking_lot-0.12.1.sha256sum] = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +SRC_URI[parking_lot_core-0.9.8.sha256sum] = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +SRC_URI[percent-encoding-2.3.1.sha256sum] = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +SRC_URI[portable-atomic-1.6.0.sha256sum] = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" +SRC_URI[proc-macro2-1.0.76.sha256sum] = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" +SRC_URI[pyo3-0.20.3.sha256sum] = "53bdbb96d49157e65d45cc287af5f32ffadd5f4761438b527b055fb0d4bb8233" +SRC_URI[pyo3-build-config-0.20.3.sha256sum] = "deaa5745de3f5231ce10517a1f5dd97d53e5a2fd77aa6b5842292085831d48d7" +SRC_URI[pyo3-ffi-0.20.3.sha256sum] = "62b42531d03e08d4ef1f6e85a2ed422eb678b8cd62b762e53891c05faf0d4afa" +SRC_URI[pyo3-macros-0.20.3.sha256sum] = "7305c720fa01b8055ec95e484a6eca7a83c841267f0dd5280f0c8b8551d2c158" +SRC_URI[pyo3-macros-backend-0.20.3.sha256sum] = "7c7e9b68bb9c3149c5b0cade5d07f953d6d125eb4337723c4ccdb665f1f96185" +SRC_URI[python3-dll-a-0.2.9.sha256sum] = "d5f07cd4412be8fa09a721d40007c483981bbe072cd6a21f2e83e04ec8f8343f" +SRC_URI[quote-1.0.35.sha256sum] = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +SRC_URI[redox_syscall-0.3.5.sha256sum] = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +SRC_URI[regex-1.10.2.sha256sum] = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +SRC_URI[regex-automata-0.4.3.sha256sum] = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +SRC_URI[regex-syntax-0.8.2.sha256sum] = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +SRC_URI[rustversion-1.0.13.sha256sum] = "dc31bd9b61a32c31f9650d18add92aa83a49ba979c143eefd27fe7177b05bd5f" +SRC_URI[ryu-1.0.14.sha256sum] = "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9" +SRC_URI[scopeguard-1.1.0.sha256sum] = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +SRC_URI[serde-1.0.195.sha256sum] = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" +SRC_URI[serde_derive-1.0.195.sha256sum] = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" +SRC_URI[serde_json-1.0.109.sha256sum] = "cb0652c533506ad7a2e353cce269330d6afd8bdfb6d75e0ace5b35aacbd7b9e9" +SRC_URI[smallvec-1.11.2.sha256sum] = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +SRC_URI[speedate-0.13.0.sha256sum] = "242f76c50fd18cbf098607090ade73a08d39cfd84ea835f3796a2c855223b19b" +SRC_URI[static_assertions-1.1.0.sha256sum] = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +SRC_URI[strum-0.25.0.sha256sum] = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +SRC_URI[strum_macros-0.25.3.sha256sum] = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +SRC_URI[syn-2.0.48.sha256sum] = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +SRC_URI[target-lexicon-0.12.9.sha256sum] = "df8e77cb757a61f51b947ec4a7e3646efd825b73561db1c232a8ccb639e611a0" +SRC_URI[tinyvec-1.6.0.sha256sum] = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +SRC_URI[tinyvec_macros-0.1.1.sha256sum] = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +SRC_URI[unicode-bidi-0.3.13.sha256sum] = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +SRC_URI[unicode-ident-1.0.10.sha256sum] = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73" +SRC_URI[unicode-normalization-0.1.22.sha256sum] = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +SRC_URI[unindent-0.2.3.sha256sum] = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce" +SRC_URI[url-2.5.0.sha256sum] = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +SRC_URI[uuid-1.6.1.sha256sum] = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +SRC_URI[version_check-0.9.4.sha256sum] = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +SRC_URI[wasi-0.11.0+wasi-snapshot-preview1.sha256sum] = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +SRC_URI[windows-targets-0.48.1.sha256sum] = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +SRC_URI[windows_aarch64_gnullvm-0.48.0.sha256sum] = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +SRC_URI[windows_aarch64_msvc-0.48.0.sha256sum] = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +SRC_URI[windows_i686_gnu-0.48.0.sha256sum] = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +SRC_URI[windows_i686_msvc-0.48.0.sha256sum] = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +SRC_URI[windows_x86_64_gnu-0.48.0.sha256sum] = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +SRC_URI[windows_x86_64_gnullvm-0.48.0.sha256sum] = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +SRC_URI[windows_x86_64_msvc-0.48.0.sha256sum] = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +SRC_URI[zerocopy-0.7.32.sha256sum] = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +SRC_URI[zerocopy-derive-0.7.32.sha256sum] = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" diff --git a/meta-python/recipes-devtools/python/python3-pydantic-core/0001-Bumps-pyo3-https-github.com-pyo3-pyo3-from-0.20.2-to.patch b/meta-python/recipes-devtools/python/python3-pydantic-core/0001-Bumps-pyo3-https-github.com-pyo3-pyo3-from-0.20.2-to.patch new file mode 100644 index 0000000000..32777e1d03 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pydantic-core/0001-Bumps-pyo3-https-github.com-pyo3-pyo3-from-0.20.2-to.patch @@ -0,0 +1,126 @@ +From a5690f973384bf8cbf4deb3b83d822b7aaefbdd8 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Tue, 27 Feb 2024 11:00:46 -0800 +Subject: [PATCH] Bumps [pyo3](https://github.com/pyo3/pyo3) from 0.20.2 to + 0.20.3. + +Upstream-Status: Pending +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + Cargo.lock | 26 +++++++++++++++++--------- + Cargo.toml | 2 +- + 2 files changed, 18 insertions(+), 10 deletions(-) + +--- a/Cargo.lock ++++ b/Cargo.lock +@@ -322,6 +322,12 @@ source = "registry+https://github.com/ru + checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + + [[package]] ++name = "portable-atomic" ++version = "1.6.0" ++source = "registry+https://github.com/rust-lang/crates.io-index" ++checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" ++ ++[[package]] + name = "proc-macro2" + version = "1.0.76" + source = "registry+https://github.com/rust-lang/crates.io-index" +@@ -357,9 +363,9 @@ dependencies = [ + + [[package]] + name = "pyo3" +-version = "0.20.2" ++version = "0.20.3" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "9a89dc7a5850d0e983be1ec2a463a171d20990487c3cfcd68b5363f1ee3d6fe0" ++checksum = "53bdbb96d49157e65d45cc287af5f32ffadd5f4761438b527b055fb0d4bb8233" + dependencies = [ + "cfg-if", + "indoc", +@@ -367,6 +373,7 @@ dependencies = [ + "memoffset", + "num-bigint", + "parking_lot", ++ "portable-atomic", + "pyo3-build-config", + "pyo3-ffi", + "pyo3-macros", +@@ -375,9 +382,9 @@ dependencies = [ + + [[package]] + name = "pyo3-build-config" +-version = "0.20.2" ++version = "0.20.3" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "07426f0d8fe5a601f26293f300afd1a7b1ed5e78b2a705870c5f30893c5163be" ++checksum = "deaa5745de3f5231ce10517a1f5dd97d53e5a2fd77aa6b5842292085831d48d7" + dependencies = [ + "once_cell", + "python3-dll-a", +@@ -386,9 +393,9 @@ dependencies = [ + + [[package]] + name = "pyo3-ffi" +-version = "0.20.2" ++version = "0.20.3" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "dbb7dec17e17766b46bca4f1a4215a85006b4c2ecde122076c562dd058da6cf1" ++checksum = "62b42531d03e08d4ef1f6e85a2ed422eb678b8cd62b762e53891c05faf0d4afa" + dependencies = [ + "libc", + "pyo3-build-config", +@@ -396,9 +403,9 @@ dependencies = [ + + [[package]] + name = "pyo3-macros" +-version = "0.20.2" ++version = "0.20.3" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "05f738b4e40d50b5711957f142878cfa0f28e054aa0ebdfc3fd137a843f74ed3" ++checksum = "7305c720fa01b8055ec95e484a6eca7a83c841267f0dd5280f0c8b8551d2c158" + dependencies = [ + "proc-macro2", + "pyo3-macros-backend", +@@ -408,12 +415,13 @@ dependencies = [ + + [[package]] + name = "pyo3-macros-backend" +-version = "0.20.2" ++version = "0.20.3" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "0fc910d4851847827daf9d6cdd4a823fbdaab5b8818325c5e97a86da79e8881f" ++checksum = "7c7e9b68bb9c3149c5b0cade5d07f953d6d125eb4337723c4ccdb665f1f96185" + dependencies = [ + "heck", + "proc-macro2", ++ "pyo3-build-config", + "quote", + "syn", + ] +--- a/Cargo.toml ++++ b/Cargo.toml +@@ -26,7 +26,7 @@ include = [ + ] + + [dependencies] +-pyo3 = { version = "0.20.2", features = ["generate-import-lib", "num-bigint"] } ++pyo3 = { version = "0.20.3", features = ["generate-import-lib", "num-bigint"] } + regex = "1.10.2" + strum = { version = "0.25.0", features = ["derive"] } + strum_macros = "0.25.3" +@@ -70,12 +70,12 @@ debug = true + strip = false + + [dev-dependencies] +-pyo3 = { version = "0.20.2", features = ["auto-initialize"] } ++pyo3 = { version = "0.20.3", features = ["auto-initialize"] } + + [build-dependencies] + version_check = "0.9.4" + # used where logic has to be version/distribution specific, e.g. pypy +-pyo3-build-config = { version = "0.20.2" } ++pyo3-build-config = { version = "0.20.3" } + + [lints.clippy] + dbg_macro = "warn" diff --git a/meta-python/recipes-devtools/python/python3-pydantic-core/run-ptest b/meta-python/recipes-devtools/python/python3-pydantic-core/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pydantic-core/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-pydantic-core_2.16.3.bb b/meta-python/recipes-devtools/python/python3-pydantic-core_2.16.3.bb new file mode 100644 index 0000000000..faa291ea6d --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pydantic-core_2.16.3.bb @@ -0,0 +1,52 @@ +SUMMARY = "Provides the core functionality for pydantic validation and serialization." +DESCRIPTION = "This package provides the core functionality for \ +pydantic validation and serialization.\ +\ +Pydantic-core is currently around 17x faster than pydantic V1." +HOMEPAGE = "https://github.com/pydantic/pydantic-core" + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ab599c188b4a314d2856b3a55030c75c" + +SRC_URI += "file://0001-Bumps-pyo3-https-github.com-pyo3-pyo3-from-0.20.2-to.patch" +SRC_URI[sha256sum] = "1cac689f80a3abab2d3c0048b29eea5751114054f032a941a32de4c852c59cad" + +DEPENDS = "python3-maturin-native python3-typing-extensions" + +require ${BPN}-crates.inc + +inherit pypi cargo-update-recipe-crates python_maturin + +PYPI_PACKAGE = "pydantic_core" + +RDEPENDS:${PN} += "python3-typing-extensions" + +INSANE_SKIP:${PN} = "already-stripped" + +inherit ptest +SRC_URI += "file://run-ptest" +RDEPENDS:${PN}-ptest += "\ + python3-dirty-equals \ + python3-hypothesis \ + python3-pytest \ + python3-pytest-mock \ + python3-pytest-timeout \ + python3-pytest-benchmark \ + python3-unittest-automake-output \ +" + +do_install:append() { + for f in ${D}/${PYTHON_SITEPACKAGES_DIR}/pydantic_core/_pydantic_core.*.so + do + fname=`basename $f` + lname=`echo $fname | sed 's/musl/gnu/'` + if [ "$fname" != "$lname" ]; then + mv $f ${D}/${PYTHON_SITEPACKAGES_DIR}/pydantic_core/$lname + fi + done +} + +do_install_ptest() { + cp -rf ${S}/tests/ ${D}${PTEST_PATH}/ + sed -i -e "/--automake/ s/$/ -k 'not test_model_class_root_validator_wrap and not test_model_class_root_validator_before and not test_model_class_root_validator_after'/" ${D}${PTEST_PATH}/run-ptest +} diff --git a/meta-python/recipes-devtools/python/python3-pydantic/run-ptest b/meta-python/recipes-devtools/python/python3-pydantic/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pydantic/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-pydantic_1.9.1.bb b/meta-python/recipes-devtools/python/python3-pydantic_1.9.1.bb deleted file mode 100644 index 1d113c9c50..0000000000 --- a/meta-python/recipes-devtools/python/python3-pydantic_1.9.1.bb +++ /dev/null @@ -1,11 +0,0 @@ -SUMMARY = "Data validation and settings management using Python type hinting" -HOMEPAGE = "https://github.com/samuelcolvin/pydantic" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=2c02ea30650b91528657db64baea1757" -RDEPENDS:${PN} += "\ - python3-typing-extensions \ -" - -inherit pypi setuptools3 - -SRC_URI[sha256sum] = "1ed987c3ff29fff7fd8c3ea3a3ea877ad310aae2ef9889a119e22d3f2db0691a" diff --git a/meta-python/recipes-devtools/python/python3-pydantic_2.7.0.bb b/meta-python/recipes-devtools/python/python3-pydantic_2.7.0.bb new file mode 100644 index 0000000000..36ad83527d --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pydantic_2.7.0.bb @@ -0,0 +1,53 @@ +SUMMARY = "Data validation using Python type hinting" +DESCRIPTION = "Data validation and settings management using Python \ +type hints.\ +\ +Fast and extensible, Pydantic plays nicely with your linters/IDE/brain. \ +Define how data should be in pure, canonical Python 3.7+; validate it with \ +Pydantic." +HOMEPAGE = "https://github.com/samuelcolvin/pydantic" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=09280955509d1c4ca14bae02f21d49a6" + +inherit pypi python_hatchling + +SRC_URI[sha256sum] = "b5ecdd42262ca2462e2624793551e80911a1e989f462910bb81aef974b4bb383" + +DEPENDS += "python3-hatch-fancy-pypi-readme-native" + +RDEPENDS:${PN} += "\ + python3-annotated-types \ + python3-core \ + python3-datetime \ + python3-image \ + python3-io \ + python3-json \ + python3-logging \ + python3-netclient \ + python3-numbers \ + python3-profile \ + python3-pydantic-core \ + python3-typing-extensions \ +" + +inherit ptest +SRC_URI += "file://run-ptest" +RDEPENDS:${PN}-ptest += "\ + python3-cloudpickle \ + python3-dirty-equals \ + python3-pytest \ + python3-pytest-mock \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + cp -rf ${S}/tests/ ${D}${PTEST_PATH}/ + # Requires 'ruff' (python3-ruff) which we cannot build + # until we have Rust 1.71+ in oe-core + rm -f ${D}${PTEST_PATH}/tests/test_docs.py + # We are not trying to support mypy + rm -f ${D}${PTEST_PATH}/tests/test_mypy.py + # We are not trying to run benchmarks + rm -rf ${D}${PTEST_PATH}/tests/benchmarks + sed -i -e "/--automake/ s/$/ -k 'not test_config_validation_error_cause and not test_dataclass_config_validate_default and not test_annotated_validator_nested and not test_use_bare and not test_use_no_fields and not test_validator_bad_fields_throws_configerror and not test_assert_raises_validation_error and not test_model_config_validate_default'/" ${D}${PTEST_PATH}/run-ptest +} diff --git a/meta-python/recipes-devtools/python/python3-pydbus-manager_git.bb b/meta-python/recipes-devtools/python/python3-pydbus-manager_git.bb deleted file mode 100644 index 796f7219ac..0000000000 --- a/meta-python/recipes-devtools/python/python3-pydbus-manager_git.bb +++ /dev/null @@ -1,15 +0,0 @@ -SUMMARY = "DBus.ObjectManager implementation for pydbus" -AUTHOR = "Sébastien Corne" - -LICENSE = "WTFPL" -LIC_FILES_CHKSUM = "file://LICENSE;md5=0fd5bb1dae91ba145745db55870be6a7" - -inherit setuptools3 - -SRC_URI = "git://github.com/seebz/pydbus-manager.git;branch=master;protocol=https" -SRCREV = "6b576b969cbda50521dca62a7df929167207f9fc" -PV = "git${SRCPV}" - -S = "${WORKDIR}/git" - -RDEPENDS:${PN} += "python3-pydbus" diff --git a/meta-python/recipes-devtools/python/python3-pydbus/0001-Support-asynchronous-calls-58.patch b/meta-python/recipes-devtools/python/python3-pydbus/0001-Support-asynchronous-calls-58.patch deleted file mode 100644 index c5cb9a8780..0000000000 --- a/meta-python/recipes-devtools/python/python3-pydbus/0001-Support-asynchronous-calls-58.patch +++ /dev/null @@ -1,93 +0,0 @@ -From 39a7d79ee6c548902fbac8b95c934af7e4c69260 Mon Sep 17 00:00:00 2001 -From: Vendula Poncova <vponcova@redhat.com> -Date: Thu, 2 Aug 2018 15:30:45 +0800 -Subject: [PATCH 1/2] Support asynchronous calls (#58) - -Added support for asynchronous calls of methods. A method is called -synchronously unless its callback parameter is specified. A callback -is a function f(*args, returned=None, error=None), where args is -callback_args specified in the method call, returned is a return -value of the method and error is an exception raised by the method. - -Example of an asynchronous call: - -def func(x, y, returned=None, error=None): - pass - -proxy.Method(a, b, callback=func, callback_args=(x, y)) - -Upstream-Status: Cherry-pick [https://src.fedoraproject.org/cgit/rpms/python-pydbus.git/] - -Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> ---- - pydbus/proxy_method.py | 44 ++++++++++++++++++++++++++++++++++++++------ - 1 file changed, 38 insertions(+), 6 deletions(-) - -diff --git a/pydbus/proxy_method.py b/pydbus/proxy_method.py -index 8798edd..4ea4304 100644 ---- a/pydbus/proxy_method.py -+++ b/pydbus/proxy_method.py -@@ -65,15 +65,34 @@ class ProxyMethod(object): - - # Python 2 sux - for kwarg in kwargs: -- if kwarg not in ("timeout",): -+ if kwarg not in ("timeout", "callback", "callback_args"): - raise TypeError(self.__qualname__ + " got an unexpected keyword argument '{}'".format(kwarg)) - timeout = kwargs.get("timeout", None) -+ callback = kwargs.get("callback", None) -+ callback_args = kwargs.get("callback_args", tuple()) -+ -+ call_args = ( -+ instance._bus_name, -+ instance._path, -+ self._iface_name, -+ self.__name__, -+ GLib.Variant(self._sinargs, args), -+ GLib.VariantType.new(self._soutargs), -+ 0, -+ timeout_to_glib(timeout), -+ None -+ ) -+ -+ if callback: -+ call_args += (self._finish_async_call, (callback, callback_args)) -+ instance._bus.con.call(*call_args) -+ return None -+ else: -+ ret = instance._bus.con.call_sync(*call_args) -+ return self._unpack_return(ret) - -- ret = instance._bus.con.call_sync( -- instance._bus_name, instance._path, -- self._iface_name, self.__name__, GLib.Variant(self._sinargs, args), GLib.VariantType.new(self._soutargs), -- 0, timeout_to_glib(timeout), None).unpack() -- -+ def _unpack_return(self, values): -+ ret = values.unpack() - if len(self._outargs) == 0: - return None - elif len(self._outargs) == 1: -@@ -81,6 +100,19 @@ class ProxyMethod(object): - else: - return ret - -+ def _finish_async_call(self, source, result, user_data): -+ error = None -+ return_args = None -+ -+ try: -+ ret = source.call_finish(result) -+ return_args = self._unpack_return(ret) -+ except Exception as err: -+ error = err -+ -+ callback, callback_args = user_data -+ callback(*callback_args, returned=return_args, error=error) -+ - def __get__(self, instance, owner): - if instance is None: - return self --- -2.7.4 - diff --git a/meta-python/recipes-devtools/python/python3-pydbus/0001-make-direction-attribute-conforming-to-introspect.dt.patch b/meta-python/recipes-devtools/python/python3-pydbus/0001-make-direction-attribute-conforming-to-introspect.dt.patch new file mode 100644 index 0000000000..1bd17986e6 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pydbus/0001-make-direction-attribute-conforming-to-introspect.dt.patch @@ -0,0 +1,40 @@ +From 5fe65a35e0e7106347639f0258206fadb451c439 Mon Sep 17 00:00:00 2001 +From: Hiroaki KAWAI <hiroaki.kawai@gmail.com> +Date: Wed, 1 Feb 2017 18:00:33 +0900 +Subject: [PATCH 1/3] make direction attribute conforming to introspect.dtd + +direction attribute defaults to "in" as +in the DTD(*1), direction attribute is defined as following: + +``` +<!ATTRLIST arg direction (in|out) "in"> +``` + +*1) http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd + +Adapted from Fedora [https://src.fedoraproject.org/cgit/rpms/python-pydbus.git/] + +Upstream-Status: Inactive-Upstream (Last release 12/18/2016; Last commit 05/6/2018) + +Signed-off-by: Derek Straka <derek@asterius.io> +--- + pydbus/proxy_method.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/pydbus/proxy_method.py b/pydbus/proxy_method.py +index 8798edd..3e6e6ee 100644 +--- a/pydbus/proxy_method.py ++++ b/pydbus/proxy_method.py +@@ -33,8 +33,8 @@ class ProxyMethod(object): + self.__name__ = method.attrib["name"] + self.__qualname__ = self._iface_name + "." + self.__name__ + +- self._inargs = [(arg.attrib.get("name", ""), arg.attrib["type"]) for arg in method if arg.tag == "arg" and arg.attrib["direction"] == "in"] +- self._outargs = [arg.attrib["type"] for arg in method if arg.tag == "arg" and arg.attrib["direction"] == "out"] ++ self._inargs = [(arg.attrib.get("name", ""), arg.attrib["type"]) for arg in method if arg.tag == "arg" and arg.attrib.get("direction", "in") == "in"] ++ self._outargs = [arg.attrib["type"] for arg in method if arg.tag == "arg" and arg.attrib.get("direction", "in") == "out"] + self._sinargs = "(" + "".join(x[1] for x in self._inargs) + ")" + self._soutargs = "(" + "".join(self._outargs) + ")" + +-- +2.13.5 diff --git a/meta-python/recipes-devtools/python/python3-pydbus/0002-Support-asynchronous-calls-58.patch b/meta-python/recipes-devtools/python/python3-pydbus/0002-Support-asynchronous-calls-58.patch new file mode 100644 index 0000000000..b3c57edade --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pydbus/0002-Support-asynchronous-calls-58.patch @@ -0,0 +1,206 @@ +From 31d6dd7893a5e1bb9eb14bfcee861a5b62f64960 Mon Sep 17 00:00:00 2001 +From: Vendula Poncova <vponcova@redhat.com> +Date: Thu, 27 Jul 2017 18:41:29 +0200 +Subject: [PATCH 2/3] Support asynchronous calls (#58) + +Added support for asynchronous calls of methods. A method is called +synchronously unless its callback parameter is specified. A callback +is a function f(*args, returned=None, error=None), where args is +callback_args specified in the method call, returned is a return +value of the method and error is an exception raised by the method. + +Example of an asynchronous call: + +def func(x, y, returned=None, error=None): + pass + +proxy.Method(a, b, callback=func, callback_args=(x, y)) + +Adapted from Fedora [https://src.fedoraproject.org/cgit/rpms/python-pydbus.git/] + +Upstream-Status: Inactive-Upstream (Last release 12/18/2016; Last commit 05/6/2018) + +Signed-off-by: Derek Straka <derek@asterius.io> +--- + doc/tutorial.rst | 11 ++++++++- + pydbus/proxy_method.py | 44 ++++++++++++++++++++++++++++++----- + tests/publish_async.py | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++ + tests/run.sh | 1 + + 4 files changed, 112 insertions(+), 7 deletions(-) + create mode 100644 tests/publish_async.py + +diff --git a/doc/tutorial.rst b/doc/tutorial.rst +index 7474de3..b8479cf 100644 +--- a/doc/tutorial.rst ++++ b/doc/tutorial.rst +@@ -84,7 +84,8 @@ All objects have methods, properties and signals. + Setting up an event loop + ======================== + +-To handle signals emitted by exported objects, or to export your own objects, you need to setup an event loop. ++To handle signals emitted by exported objects, to asynchronously call methods ++or to export your own objects, you need to setup an event loop. + + The only main loop supported by ``pydbus`` is GLib.MainLoop. + +@@ -156,6 +157,14 @@ To call a method:: + + dev.Disconnect() + ++To asynchronously call a method:: ++ ++ def print_result(returned=None, error=None): ++ print(returned, error) ++ ++ dev.GetAppliedConnection(0, callback=print_result) ++ loop.run() ++ + To read a property:: + + print(dev.Autoconnect) +diff --git a/pydbus/proxy_method.py b/pydbus/proxy_method.py +index 3e6e6ee..442fe07 100644 +--- a/pydbus/proxy_method.py ++++ b/pydbus/proxy_method.py +@@ -65,15 +65,34 @@ class ProxyMethod(object): + + # Python 2 sux + for kwarg in kwargs: +- if kwarg not in ("timeout",): ++ if kwarg not in ("timeout", "callback", "callback_args"): + raise TypeError(self.__qualname__ + " got an unexpected keyword argument '{}'".format(kwarg)) + timeout = kwargs.get("timeout", None) ++ callback = kwargs.get("callback", None) ++ callback_args = kwargs.get("callback_args", tuple()) ++ ++ call_args = ( ++ instance._bus_name, ++ instance._path, ++ self._iface_name, ++ self.__name__, ++ GLib.Variant(self._sinargs, args), ++ GLib.VariantType.new(self._soutargs), ++ 0, ++ timeout_to_glib(timeout), ++ None ++ ) ++ ++ if callback: ++ call_args += (self._finish_async_call, (callback, callback_args)) ++ instance._bus.con.call(*call_args) ++ return None ++ else: ++ ret = instance._bus.con.call_sync(*call_args) ++ return self._unpack_return(ret) + +- ret = instance._bus.con.call_sync( +- instance._bus_name, instance._path, +- self._iface_name, self.__name__, GLib.Variant(self._sinargs, args), GLib.VariantType.new(self._soutargs), +- 0, timeout_to_glib(timeout), None).unpack() +- ++ def _unpack_return(self, values): ++ ret = values.unpack() + if len(self._outargs) == 0: + return None + elif len(self._outargs) == 1: +@@ -81,6 +100,19 @@ class ProxyMethod(object): + else: + return ret + ++ def _finish_async_call(self, source, result, user_data): ++ error = None ++ return_args = None ++ ++ try: ++ ret = source.call_finish(result) ++ return_args = self._unpack_return(ret) ++ except Exception as err: ++ error = err ++ ++ callback, callback_args = user_data ++ callback(*callback_args, returned=return_args, error=error) ++ + def __get__(self, instance, owner): + if instance is None: + return self +diff --git a/tests/publish_async.py b/tests/publish_async.py +new file mode 100644 +index 0000000..3f79b62 +--- /dev/null ++++ b/tests/publish_async.py +@@ -0,0 +1,63 @@ ++from pydbus import SessionBus ++from gi.repository import GLib ++from threading import Thread ++import sys ++ ++done = 0 ++loop = GLib.MainLoop() ++ ++class TestObject(object): ++ ''' ++<node> ++ <interface name='net.lew21.pydbus.tests.publish_async'> ++ <method name='HelloWorld'> ++ <arg type='i' name='x' direction='in'/> ++ <arg type='s' name='response' direction='out'/> ++ </method> ++ </interface> ++</node> ++ ''' ++ def __init__(self, id): ++ self.id = id ++ ++ def HelloWorld(self, x): ++ res = self.id + ": " + str(x) ++ print(res) ++ return res ++ ++bus = SessionBus() ++ ++with bus.publish("net.lew21.pydbus.tests.publish_async", TestObject("Obj")): ++ remote = bus.get("net.lew21.pydbus.tests.publish_async") ++ ++ def callback(x, returned=None, error=None): ++ print("asyn: " + returned) ++ assert (returned is not None) ++ assert(error is None) ++ assert(x == int(returned.split()[1])) ++ ++ global done ++ done += 1 ++ if done == 3: ++ loop.quit() ++ ++ def t1_func(): ++ remote.HelloWorld(1, callback=callback, callback_args=(1,)) ++ remote.HelloWorld(2, callback=callback, callback_args=(2,)) ++ print("sync: " + remote.HelloWorld(3)) ++ remote.HelloWorld(4, callback=callback, callback_args=(4,)) ++ ++ t1 = Thread(None, t1_func) ++ t1.daemon = True ++ ++ def handle_timeout(): ++ print("ERROR: Timeout.") ++ sys.exit(1) ++ ++ GLib.timeout_add_seconds(2, handle_timeout) ++ ++ t1.start() ++ ++ loop.run() ++ ++ t1.join() +diff --git a/tests/run.sh b/tests/run.sh +index 8d93644..271c58a 100755 +--- a/tests/run.sh ++++ b/tests/run.sh +@@ -15,4 +15,5 @@ then + "$PYTHON" $TESTS_DIR/publish.py + "$PYTHON" $TESTS_DIR/publish_properties.py + "$PYTHON" $TESTS_DIR/publish_multiface.py ++ "$PYTHON" $TESTS_DIR/publish_async.py + fi +-- +2.13.5 diff --git a/meta-python/recipes-devtools/python/python3-pydbus/0002-Support-transformation-between-D-Bus-errors-and-exce.patch b/meta-python/recipes-devtools/python/python3-pydbus/0002-Support-transformation-between-D-Bus-errors-and-exce.patch deleted file mode 100644 index f5c0390c54..0000000000 --- a/meta-python/recipes-devtools/python/python3-pydbus/0002-Support-transformation-between-D-Bus-errors-and-exce.patch +++ /dev/null @@ -1,203 +0,0 @@ -From 69968dec867053e38de0b91d76ac41d5a5735e36 Mon Sep 17 00:00:00 2001 -From: Vendula Poncova <vponcova@redhat.com> -Date: Thu, 2 Aug 2018 15:31:56 +0800 -Subject: [PATCH 2/2] Support transformation between D-Bus errors and - exceptions. - -Exceptions can be registered with decorators, raised in a remote -method and recreated after return from the remote call. - -Upstream-Status: Cherry-pick [https://src.fedoraproject.org/cgit/rpms/python-pydbus.git/] - -Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> ---- - pydbus/error.py | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++ - pydbus/proxy_method.py | 18 ++++++++-- - pydbus/registration.py | 16 ++++++--- - 3 files changed, 123 insertions(+), 8 deletions(-) - create mode 100644 pydbus/error.py - -diff --git a/pydbus/error.py b/pydbus/error.py -new file mode 100644 -index 0000000..aaa3510 ---- /dev/null -+++ b/pydbus/error.py -@@ -0,0 +1,97 @@ -+from gi.repository import GLib, Gio -+ -+ -+def register_error(name, domain, code): -+ """Register and map decorated exception class to a DBus error.""" -+ def decorated(cls): -+ error_registration.register_error(cls, name, domain, code) -+ return cls -+ -+ return decorated -+ -+ -+def map_error(error_name): -+ """Map decorated exception class to a DBus error.""" -+ def decorated(cls): -+ error_registration.map_error(cls, error_name) -+ return cls -+ -+ return decorated -+ -+ -+def map_by_default(cls): -+ """Map decorated exception class to all unknown DBus errors.""" -+ error_registration.map_by_default(cls) -+ return cls -+ -+ -+class ErrorRegistration(object): -+ """Class for mapping exceptions to DBus errors.""" -+ -+ _default = None -+ _map = dict() -+ _reversed_map = dict() -+ -+ def map_by_default(self, exception_cls): -+ """Set the exception class as a default.""" -+ self._default = exception_cls -+ -+ def map_error(self, exception_cls, name): -+ """Map the exception class to a DBus name.""" -+ self._map[name] = exception_cls -+ self._reversed_map[exception_cls] = name -+ -+ def register_error(self, exception_cls, name, domain, code): -+ """Map and register the exception class to a DBus name.""" -+ self.map_error(exception_cls, name) -+ return Gio.DBusError.register_error(domain, code, name) -+ -+ def is_registered_exception(self, obj): -+ """Is the exception registered?""" -+ return obj.__class__ in self._reversed_map -+ -+ def get_dbus_name(self, obj): -+ """Get the DBus name of the exception.""" -+ return self._reversed_map.get(obj.__class__) -+ -+ def get_exception_class(self, name): -+ """Get the exception class mapped to the DBus name.""" -+ return self._map.get(name, self._default) -+ -+ def transform_message(self, name, message): -+ """Transform the message of the exception.""" -+ prefix = "{}:{}: ".format("GDBus.Error", name) -+ -+ if message.startswith(prefix): -+ return message[len(prefix):] -+ -+ return message -+ -+ def transform_exception(self, e): -+ """Transform the remote error to the exception.""" -+ if not isinstance(e, GLib.Error): -+ return e -+ -+ if not Gio.DBusError.is_remote_error(e): -+ return e -+ -+ # Get DBus name of the error. -+ name = Gio.DBusError.get_remote_error(e) -+ # Get the exception class. -+ exception_cls = self.get_exception_class(name) -+ -+ # Return the original exception. -+ if not exception_cls: -+ return e -+ -+ # Return new exception. -+ message = self.transform_message(name, e.message) -+ exception = exception_cls(message) -+ exception.dbus_name = name -+ exception.dbus_domain = e.domain -+ exception.dbus_code = e.code -+ return exception -+ -+ -+# Default error registration. -+error_registration = ErrorRegistration() -diff --git a/pydbus/proxy_method.py b/pydbus/proxy_method.py -index 4ea4304..e9496f5 100644 ---- a/pydbus/proxy_method.py -+++ b/pydbus/proxy_method.py -@@ -2,6 +2,7 @@ from gi.repository import GLib - from .generic import bound_method - from .identifier import filter_identifier - from .timeout import timeout_to_glib -+from .error import error_registration - - try: - from inspect import Signature, Parameter -@@ -87,9 +88,20 @@ class ProxyMethod(object): - call_args += (self._finish_async_call, (callback, callback_args)) - instance._bus.con.call(*call_args) - return None -+ - else: -- ret = instance._bus.con.call_sync(*call_args) -- return self._unpack_return(ret) -+ result = None -+ error = None -+ -+ try: -+ result = instance._bus.con.call_sync(*call_args) -+ except Exception as e: -+ error = error_registration.transform_exception(e) -+ -+ if error: -+ raise error -+ -+ return self._unpack_return(result) - - def _unpack_return(self, values): - ret = values.unpack() -@@ -108,7 +120,7 @@ class ProxyMethod(object): - ret = source.call_finish(result) - return_args = self._unpack_return(ret) - except Exception as err: -- error = err -+ error = error_registration.transform_exception(err) - - callback, callback_args = user_data - callback(*callback_args, returned=return_args, error=error) -diff --git a/pydbus/registration.py b/pydbus/registration.py -index f531539..1d2cbcb 100644 ---- a/pydbus/registration.py -+++ b/pydbus/registration.py -@@ -5,6 +5,7 @@ from . import generic - from .exitable import ExitableWithAliases - from functools import partial - from .method_call_context import MethodCallContext -+from .error import error_registration - import logging - - try: -@@ -91,11 +92,16 @@ class ObjectWrapper(ExitableWithAliases("unwrap")): - logger = logging.getLogger(__name__) - logger.exception("Exception while handling %s.%s()", interface_name, method_name) - -- #TODO Think of a better way to translate Python exception types to DBus error types. -- e_type = type(e).__name__ -- if not "." in e_type: -- e_type = "unknown." + e_type -- invocation.return_dbus_error(e_type, str(e)) -+ if error_registration.is_registered_exception(e): -+ name = error_registration.get_dbus_name(e) -+ invocation.return_dbus_error(name, str(e)) -+ else: -+ logger.info("name is not registered") -+ e_type = type(e).__name__ -+ if not "." in e_type: -+ e_type = "unknown." + e_type -+ -+ invocation.return_dbus_error(e_type, str(e)) - - def Get(self, interface_name, property_name): - type = self.readable_properties[interface_name + "." + property_name] --- -2.7.4 - diff --git a/meta-python/recipes-devtools/python/python3-pydbus/0003-Support-transformation-between-D-Bus-errors-and-exce.patch b/meta-python/recipes-devtools/python/python3-pydbus/0003-Support-transformation-between-D-Bus-errors-and-exce.patch new file mode 100644 index 0000000000..a1b8a6c38c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pydbus/0003-Support-transformation-between-D-Bus-errors-and-exce.patch @@ -0,0 +1,495 @@ +From 773858e1afd21cdf3ceef2cd35509f0b4882bf16 Mon Sep 17 00:00:00 2001 +From: Vendula Poncova <vponcova@redhat.com> +Date: Tue, 1 Aug 2017 16:54:24 +0200 +Subject: [PATCH 3/3] Support transformation between D-Bus errors and + exceptions. + +Exceptions can be registered with decorators, raised in a remote +method and recreated after return from the remote call. + +Adapted from Fedora [https://src.fedoraproject.org/cgit/rpms/python-pydbus.git/] + +Upstream-Status: Inactive-Upstream (Last release 12/18/2016; Last commit 05/6/2018) + +Signed-off-by: Derek Straka <derek@asterius.io> +--- + doc/tutorial.rst | 47 ++++++++++++++++++ + pydbus/error.py | 97 ++++++++++++++++++++++++++++++++++++ + pydbus/proxy_method.py | 18 +++++-- + pydbus/registration.py | 16 ++++-- + tests/error.py | 67 +++++++++++++++++++++++++ + tests/publish_error.py | 132 +++++++++++++++++++++++++++++++++++++++++++++++++ + tests/run.sh | 2 + + 7 files changed, 371 insertions(+), 8 deletions(-) + create mode 100644 pydbus/error.py + create mode 100644 tests/error.py + create mode 100644 tests/publish_error.py + +diff --git a/doc/tutorial.rst b/doc/tutorial.rst +index b8479cf..7fe55e1 100644 +--- a/doc/tutorial.rst ++++ b/doc/tutorial.rst +@@ -341,6 +341,53 @@ See ``help(bus.request_name)`` and ``help(bus.register_object)`` for details. + + .. -------------------------------------------------------------------- + ++Error handling ++============== ++ ++You can map D-Bus errors to your exception classes for better error handling. ++To handle D-Bus errors, use the ``@map_error`` decorator:: ++ ++ from pydbus.error import map_error ++ ++ @map_error("org.freedesktop.DBus.Error.InvalidArgs") ++ class InvalidArgsException(Exception): ++ pass ++ ++ try: ++ ... ++ catch InvalidArgsException as e: ++ print(e) ++ ++To register new D-Bus errors, use the ``@register_error`` decorator:: ++ ++ from pydbus.error import register_error ++ ++ @map_error("net.lew21.pydbus.TutorialExample.MyError", MY_DOMAIN, MY_EXCEPTION_CODE) ++ class MyException(Exception): ++ pass ++ ++Then you can raise ``MyException`` from the D-Bus method of the remote object:: ++ ++ def Method(): ++ raise MyException("Message") ++ ++And catch the same exception on the client side:: ++ ++ try: ++ proxy.Method() ++ catch MyException as e: ++ print(e) ++ ++To handle all unknown D-Bus errors, use the ``@map_by_default`` decorator to specify the default exception:: ++ ++ from pydbus.error import map_by_default ++ ++ @map_by_default ++ class DefaultException(Exception): ++ pass ++ ++.. -------------------------------------------------------------------- ++ + Data types + ========== + +diff --git a/pydbus/error.py b/pydbus/error.py +new file mode 100644 +index 0000000..aaa3510 +--- /dev/null ++++ b/pydbus/error.py +@@ -0,0 +1,97 @@ ++from gi.repository import GLib, Gio ++ ++ ++def register_error(name, domain, code): ++ """Register and map decorated exception class to a DBus error.""" ++ def decorated(cls): ++ error_registration.register_error(cls, name, domain, code) ++ return cls ++ ++ return decorated ++ ++ ++def map_error(error_name): ++ """Map decorated exception class to a DBus error.""" ++ def decorated(cls): ++ error_registration.map_error(cls, error_name) ++ return cls ++ ++ return decorated ++ ++ ++def map_by_default(cls): ++ """Map decorated exception class to all unknown DBus errors.""" ++ error_registration.map_by_default(cls) ++ return cls ++ ++ ++class ErrorRegistration(object): ++ """Class for mapping exceptions to DBus errors.""" ++ ++ _default = None ++ _map = dict() ++ _reversed_map = dict() ++ ++ def map_by_default(self, exception_cls): ++ """Set the exception class as a default.""" ++ self._default = exception_cls ++ ++ def map_error(self, exception_cls, name): ++ """Map the exception class to a DBus name.""" ++ self._map[name] = exception_cls ++ self._reversed_map[exception_cls] = name ++ ++ def register_error(self, exception_cls, name, domain, code): ++ """Map and register the exception class to a DBus name.""" ++ self.map_error(exception_cls, name) ++ return Gio.DBusError.register_error(domain, code, name) ++ ++ def is_registered_exception(self, obj): ++ """Is the exception registered?""" ++ return obj.__class__ in self._reversed_map ++ ++ def get_dbus_name(self, obj): ++ """Get the DBus name of the exception.""" ++ return self._reversed_map.get(obj.__class__) ++ ++ def get_exception_class(self, name): ++ """Get the exception class mapped to the DBus name.""" ++ return self._map.get(name, self._default) ++ ++ def transform_message(self, name, message): ++ """Transform the message of the exception.""" ++ prefix = "{}:{}: ".format("GDBus.Error", name) ++ ++ if message.startswith(prefix): ++ return message[len(prefix):] ++ ++ return message ++ ++ def transform_exception(self, e): ++ """Transform the remote error to the exception.""" ++ if not isinstance(e, GLib.Error): ++ return e ++ ++ if not Gio.DBusError.is_remote_error(e): ++ return e ++ ++ # Get DBus name of the error. ++ name = Gio.DBusError.get_remote_error(e) ++ # Get the exception class. ++ exception_cls = self.get_exception_class(name) ++ ++ # Return the original exception. ++ if not exception_cls: ++ return e ++ ++ # Return new exception. ++ message = self.transform_message(name, e.message) ++ exception = exception_cls(message) ++ exception.dbus_name = name ++ exception.dbus_domain = e.domain ++ exception.dbus_code = e.code ++ return exception ++ ++ ++# Default error registration. ++error_registration = ErrorRegistration() +diff --git a/pydbus/proxy_method.py b/pydbus/proxy_method.py +index 442fe07..a73f9eb 100644 +--- a/pydbus/proxy_method.py ++++ b/pydbus/proxy_method.py +@@ -2,6 +2,7 @@ from gi.repository import GLib + from .generic import bound_method + from .identifier import filter_identifier + from .timeout import timeout_to_glib ++from .error import error_registration + + try: + from inspect import Signature, Parameter +@@ -87,9 +88,20 @@ class ProxyMethod(object): + call_args += (self._finish_async_call, (callback, callback_args)) + instance._bus.con.call(*call_args) + return None ++ + else: +- ret = instance._bus.con.call_sync(*call_args) +- return self._unpack_return(ret) ++ result = None ++ error = None ++ ++ try: ++ result = instance._bus.con.call_sync(*call_args) ++ except Exception as e: ++ error = error_registration.transform_exception(e) ++ ++ if error: ++ raise error ++ ++ return self._unpack_return(result) + + def _unpack_return(self, values): + ret = values.unpack() +@@ -108,7 +120,7 @@ class ProxyMethod(object): + ret = source.call_finish(result) + return_args = self._unpack_return(ret) + except Exception as err: +- error = err ++ error = error_registration.transform_exception(err) + + callback, callback_args = user_data + callback(*callback_args, returned=return_args, error=error) +diff --git a/pydbus/registration.py b/pydbus/registration.py +index f531539..1d2cbcb 100644 +--- a/pydbus/registration.py ++++ b/pydbus/registration.py +@@ -5,6 +5,7 @@ from . import generic + from .exitable import ExitableWithAliases + from functools import partial + from .method_call_context import MethodCallContext ++from .error import error_registration + import logging + + try: +@@ -91,11 +92,16 @@ class ObjectWrapper(ExitableWithAliases("unwrap")): + logger = logging.getLogger(__name__) + logger.exception("Exception while handling %s.%s()", interface_name, method_name) + +- #TODO Think of a better way to translate Python exception types to DBus error types. +- e_type = type(e).__name__ +- if not "." in e_type: +- e_type = "unknown." + e_type +- invocation.return_dbus_error(e_type, str(e)) ++ if error_registration.is_registered_exception(e): ++ name = error_registration.get_dbus_name(e) ++ invocation.return_dbus_error(name, str(e)) ++ else: ++ logger.info("name is not registered") ++ e_type = type(e).__name__ ++ if not "." in e_type: ++ e_type = "unknown." + e_type ++ ++ invocation.return_dbus_error(e_type, str(e)) + + def Get(self, interface_name, property_name): + type = self.readable_properties[interface_name + "." + property_name] +diff --git a/tests/error.py b/tests/error.py +new file mode 100644 +index 0000000..3ec507d +--- /dev/null ++++ b/tests/error.py +@@ -0,0 +1,67 @@ ++from pydbus.error import ErrorRegistration ++ ++ ++class ExceptionA(Exception): ++ pass ++ ++ ++class ExceptionB(Exception): ++ pass ++ ++ ++class ExceptionC(Exception): ++ pass ++ ++ ++class ExceptionD(Exception): ++ pass ++ ++ ++class ExceptionE(Exception): ++ pass ++ ++ ++def test_error_mapping(): ++ r = ErrorRegistration() ++ r.map_error(ExceptionA, "net.lew21.pydbus.tests.ErrorA") ++ r.map_error(ExceptionB, "net.lew21.pydbus.tests.ErrorB") ++ r.map_error(ExceptionC, "net.lew21.pydbus.tests.ErrorC") ++ ++ assert r.is_registered_exception(ExceptionA("Test")) ++ assert r.is_registered_exception(ExceptionB("Test")) ++ assert r.is_registered_exception(ExceptionC("Test")) ++ assert not r.is_registered_exception(ExceptionD("Test")) ++ assert not r.is_registered_exception(ExceptionE("Test")) ++ ++ assert r.get_dbus_name(ExceptionA("Test")) == "net.lew21.pydbus.tests.ErrorA" ++ assert r.get_dbus_name(ExceptionB("Test")) == "net.lew21.pydbus.tests.ErrorB" ++ assert r.get_dbus_name(ExceptionC("Test")) == "net.lew21.pydbus.tests.ErrorC" ++ ++ assert r.get_exception_class("net.lew21.pydbus.tests.ErrorA") == ExceptionA ++ assert r.get_exception_class("net.lew21.pydbus.tests.ErrorB") == ExceptionB ++ assert r.get_exception_class("net.lew21.pydbus.tests.ErrorC") == ExceptionC ++ assert r.get_exception_class("net.lew21.pydbus.tests.ErrorD") is None ++ assert r.get_exception_class("net.lew21.pydbus.tests.ErrorE") is None ++ ++ r.map_by_default(ExceptionD) ++ assert not r.is_registered_exception(ExceptionD("Test")) ++ assert r.get_exception_class("net.lew21.pydbus.tests.ErrorD") == ExceptionD ++ assert r.get_exception_class("net.lew21.pydbus.tests.ErrorE") == ExceptionD ++ ++ ++def test_transform_message(): ++ r = ErrorRegistration() ++ n1 = "net.lew21.pydbus.tests.ErrorA" ++ m1 = "GDBus.Error:net.lew21.pydbus.tests.ErrorA: Message1" ++ ++ n2 = "net.lew21.pydbus.tests.ErrorB" ++ m2 = "GDBus.Error:net.lew21.pydbus.tests.ErrorB: Message2" ++ ++ assert r.transform_message(n1, m1) == "Message1" ++ assert r.transform_message(n2, m2) == "Message2" ++ assert r.transform_message(n1, m2) == m2 ++ assert r.transform_message(n2, m1) == m1 ++ ++ ++test_error_mapping() ++test_transform_message() +diff --git a/tests/publish_error.py b/tests/publish_error.py +new file mode 100644 +index 0000000..aa8a18a +--- /dev/null ++++ b/tests/publish_error.py +@@ -0,0 +1,132 @@ ++import sys ++from threading import Thread ++from gi.repository import GLib, Gio ++from pydbus import SessionBus ++from pydbus.error import register_error, map_error, map_by_default, error_registration ++ ++import logging ++logger = logging.getLogger('pydbus.registration') ++logger.disabled = True ++ ++loop = GLib.MainLoop() ++DOMAIN = Gio.DBusError.quark() # TODO: Register new domain. ++ ++ ++@register_error("net.lew21.pydbus.tests.ErrorA", DOMAIN, 1000) ++class ExceptionA(Exception): ++ pass ++ ++ ++@register_error("net.lew21.pydbus.tests.ErrorB", DOMAIN, 2000) ++class ExceptionB(Exception): ++ pass ++ ++ ++@map_error("org.freedesktop.DBus.Error.InvalidArgs") ++class ExceptionC(Exception): ++ pass ++ ++ ++@map_by_default ++class ExceptionD(Exception): ++ pass ++ ++ ++class ExceptionE(Exception): ++ pass ++ ++ ++class TestObject(object): ++ ''' ++<node> ++ <interface name='net.lew21.pydbus.tests.TestInterface'> ++ <method name='RaiseA'> ++ <arg type='s' name='msg' direction='in'/> ++ </method> ++ <method name='RaiseB'> ++ <arg type='s' name='msg' direction='in'/> ++ </method> ++ <method name='RaiseD'> ++ <arg type='s' name='msg' direction='in'/> ++ </method> ++ <method name='RaiseE'> ++ <arg type='s' name='msg' direction='in'/> ++ </method> ++ </interface> ++</node> ++ ''' ++ ++ def RaiseA(self, msg): ++ raise ExceptionA(msg) ++ ++ def RaiseB(self, msg): ++ raise ExceptionB(msg) ++ ++ def RaiseD(self, msg): ++ raise ExceptionD(msg) ++ ++ def RaiseE(self, msg): ++ raise ExceptionE(msg) ++ ++bus = SessionBus() ++ ++with bus.publish("net.lew21.pydbus.tests.Test", TestObject()): ++ remote = bus.get("net.lew21.pydbus.tests.Test") ++ ++ def t_func(): ++ # Test new registered errors. ++ try: ++ remote.RaiseA("Test A") ++ except ExceptionA as e: ++ assert str(e) == "Test A" ++ ++ try: ++ remote.RaiseB("Test B") ++ except ExceptionB as e: ++ assert str(e) == "Test B" ++ ++ # Test mapped errors. ++ try: ++ remote.Get("net.lew21.pydbus.tests.TestInterface", "Foo") ++ except ExceptionC as e: ++ assert str(e) == "No such property 'Foo'" ++ ++ # Test default errors. ++ try: ++ remote.RaiseD("Test D") ++ except ExceptionD as e: ++ assert str(e) == "Test D" ++ ++ try: ++ remote.RaiseE("Test E") ++ except ExceptionD as e: ++ assert str(e) == "Test E" ++ ++ # Test with no default errors. ++ error_registration.map_by_default(None) ++ ++ try: ++ remote.RaiseD("Test D") ++ except Exception as e: ++ assert not isinstance(e, ExceptionD) ++ ++ try: ++ remote.RaiseE("Test E") ++ except Exception as e: ++ assert not isinstance(e, ExceptionD) ++ assert not isinstance(e, ExceptionE) ++ ++ loop.quit() ++ ++ t = Thread(None, t_func) ++ t.daemon = True ++ ++ def handle_timeout(): ++ print("ERROR: Timeout.") ++ sys.exit(1) ++ ++ GLib.timeout_add_seconds(4, handle_timeout) ++ ++ t.start() ++ loop.run() ++ t.join() +diff --git a/tests/run.sh b/tests/run.sh +index 271c58a..a08baf8 100755 +--- a/tests/run.sh ++++ b/tests/run.sh +@@ -10,10 +10,11 @@ PYTHON=${1:-python} + + "$PYTHON" $TESTS_DIR/context.py + "$PYTHON" $TESTS_DIR/identifier.py ++"$PYTHON" $TESTS_DIR/error.py + if [ "$2" != "dontpublish" ] + then + "$PYTHON" $TESTS_DIR/publish.py + "$PYTHON" $TESTS_DIR/publish_properties.py + "$PYTHON" $TESTS_DIR/publish_multiface.py + "$PYTHON" $TESTS_DIR/publish_async.py + fi +-- +2.13.5 diff --git a/meta-python/recipes-devtools/python/python3-pydbus/run-ptest b/meta-python/recipes-devtools/python/python3-pydbus/run-ptest new file mode 100644 index 0000000000..782ceed3bb --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pydbus/run-ptest @@ -0,0 +1,15 @@ +#!/bin/sh + +for case in `find tests -type f -name '*.sh'`; do + bash $case python3 >$case.output 2>&1 + ret=$? + if [ $ret -ne 0 ]; then + cat $case.output + echo "FAIL: ${case}" + elif grep -i 'SKIP' $case.output; then + echo "SKIP: ${case}" + else + echo "PASS: ${case}" + fi + rm -f $case.output +done
\ No newline at end of file diff --git a/meta-python/recipes-devtools/python/python3-pydbus_0.6.0.bb b/meta-python/recipes-devtools/python/python3-pydbus_0.6.0.bb index a1b9fffea6..5754fd2adf 100644 --- a/meta-python/recipes-devtools/python/python3-pydbus_0.6.0.bb +++ b/meta-python/recipes-devtools/python/python3-pydbus_0.6.0.bb @@ -3,17 +3,26 @@ HOMEPAGE = "https://pypi.python.org/pypi/pydbus/" LICENSE = "LGPL-2.1-only" LIC_FILES_CHKSUM = "file://LICENSE;md5=a916467b91076e631dd8edb7424769c7" -SRC_URI += "file://0001-Support-asynchronous-calls-58.patch \ - file://0002-Support-transformation-between-D-Bus-errors-and-exce.patch \ +SRCREV = "f2e6355a88351e7d644ccb2b4d67b19305507312" +SRC_URI = " \ + git://github.com/LEW21/pydbus.git;protocol=https;branch=master \ + file://0001-make-direction-attribute-conforming-to-introspect.dt.patch \ + file://0002-Support-asynchronous-calls-58.patch \ + file://0003-Support-transformation-between-D-Bus-errors-and-exce.patch \ + file://run-ptest \ " -SRC_URI[md5sum] = "c6abd44862322679bd4e907bebc3e0d0" -SRC_URI[sha256sum] = "4207162eff54223822c185da06c1ba8a34137a9602f3da5a528eedf3f78d0f2c" +inherit ptest setuptools3 -inherit pypi setuptools3 +S = "${WORKDIR}/git" -S = "${WORKDIR}/pydbus-${PV}" +RDEPENDS:${PN} = "python3-pygobject \ + python3-io \ + python3-logging" -RDEPENDS:${PN} = "${PYTHON_PN}-pygobject \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-logging" +RDEPENDS:${PN}-ptest += "bash" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} diff --git a/meta-python/recipes-devtools/python/python3-pydicti_1.1.6.bb b/meta-python/recipes-devtools/python/python3-pydicti_1.2.1.bb index 17c52881ed..2363c29059 100644 --- a/meta-python/recipes-devtools/python/python3-pydicti_1.1.6.bb +++ b/meta-python/recipes-devtools/python/python3-pydicti_1.2.1.bb @@ -3,6 +3,6 @@ HOMEPAGE = "https://github.com/coldfix/pydicti" LICENSE = "WTFPL" LIC_FILES_CHKSUM = "file://COPYING;md5=389a9e29629d1f05e115f8f05c283df5" -SRC_URI[sha256sum] = "32eb329de2023c92158ac6c2d67837adf96195f188ba8d768b3248a0218b5a65" +SRC_URI[sha256sum] = "63e0756ff27a335e92916ff40be589a21a58894b3a93099edf0f3cbf695690dc" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-pyexpect_1.0.21.bb b/meta-python/recipes-devtools/python/python3-pyexpect_1.0.22.bb index 1b80770d73..1cbd2384a3 100644 --- a/meta-python/recipes-devtools/python/python3-pyexpect_1.0.21.bb +++ b/meta-python/recipes-devtools/python/python3-pyexpect_1.0.22.bb @@ -7,5 +7,6 @@ LIC_FILES_CHKSUM = "file://README.md;md5=a6aa1e7097aca5955f9a2e1c8b0ce158" inherit pypi setuptools3 -SRC_URI[md5sum] = "c661939158d6a1acbcc2191bedc47751" -SRC_URI[sha256sum] = "96e900d6af928a94c2a75b4935ddda44872c218121d0467c549ae19e7608a9a2" +SRC_URI[sha256sum] = "659351e7ee8923b42de8a774fabfc806acf07377d7fd19f2ea4412ef8f619c6a" + +RDEPENDS:${PN} += "python3-numbers" diff --git a/meta-python/recipes-devtools/python/python3-pyfanotify/0001-ext-define-FNM_EXTMATCH-if-not-already-defined.patch b/meta-python/recipes-devtools/python/python3-pyfanotify/0001-ext-define-FNM_EXTMATCH-if-not-already-defined.patch index 933e086265..4c279bbcda 100644 --- a/meta-python/recipes-devtools/python/python3-pyfanotify/0001-ext-define-FNM_EXTMATCH-if-not-already-defined.patch +++ b/meta-python/recipes-devtools/python/python3-pyfanotify/0001-ext-define-FNM_EXTMATCH-if-not-already-defined.patch @@ -1,31 +1,29 @@ -From 9e7894b97ae7afe43a9901b774de5aef401549ac Mon Sep 17 00:00:00 2001 +From 87f1bf7d1e0ca2a841706d1c41d14382f11264db Mon Sep 17 00:00:00 2001 From: Bartosz Golaszewski <brgl@bgdev.pl> Date: Thu, 28 Apr 2022 16:32:06 +0200 Subject: [PATCH] ext: define FNM_EXTMATCH if not already defined On musl this constant is not defined. Define it locally if not present. -Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl> ---- Upstream-Status: Inappropriate +Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl> + +--- src/ext.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ext.c b/src/ext.c -index 2ba9a14..98ffc20 100644 +index fb33de1..fa01a81 100644 --- a/src/ext.c +++ b/src/ext.c -@@ -18,6 +18,9 @@ - #include <sys/un.h> +@@ -19,6 +19,9 @@ + #include <sys/vfs.h> #include <unistd.h> +#ifndef FNM_EXTMATCH +#define FNM_EXTMATCH 0 +#endif - PyDoc_STRVAR(ext__doc__, - "Wrapper for fanotify.\n" --- -2.32.0 - + #define FUNUSED __attribute__((unused)) + diff --git a/meta-python/recipes-devtools/python/python3-pyfanotify_0.2.0.bb b/meta-python/recipes-devtools/python/python3-pyfanotify_0.2.2.bb index d887901443..292ceab2e3 100644 --- a/meta-python/recipes-devtools/python/python3-pyfanotify_0.2.0.bb +++ b/meta-python/recipes-devtools/python/python3-pyfanotify_0.2.2.bb @@ -1,12 +1,11 @@ SUMMARY = "Python wrapper for Linux fanotify." HOMEPAGE = "https://github.com/baskiton/pyfanotify" -AUTHOR = "Alexander Baskikh" SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=636a36c9df04efcfacf839b8866d9a37" SRC_URI += "file://0001-ext-define-FNM_EXTMATCH-if-not-already-defined.patch" -SRC_URI[sha256sum] = "1ec1c61fba9dea96cf8eac7f1a0cca2517613da20d156b7da2a06f9d63c77aca" +SRC_URI[sha256sum] = "90219aa9f8b78fa732f24aa7b21c7bb6ac97a6eb47f1763c899b8194e23af1df" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-pyfirmata_1.1.0.bb b/meta-python/recipes-devtools/python/python3-pyfirmata_1.1.0.bb index 5bbc33ade0..02ebeaad79 100644 --- a/meta-python/recipes-devtools/python/python3-pyfirmata_1.1.0.bb +++ b/meta-python/recipes-devtools/python/python3-pyfirmata_1.1.0.bb @@ -4,7 +4,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=84ddcef430b7c44caa22b2ff4b37a3df" PYPI_PACKAGE = "pyFirmata" RDEPENDS:${PN} = "\ - ${PYTHON_PN}-pyserial \ + python3-pyserial \ " SRC_URI[md5sum] = "159673cfb56c72ceafc30fe91eedd847" diff --git a/meta-python/recipes-devtools/python/python3-pyflakes_2.5.0.bb b/meta-python/recipes-devtools/python/python3-pyflakes_3.2.0.bb index 5c75ea48aa..b7ee20ebe4 100644 --- a/meta-python/recipes-devtools/python/python3-pyflakes_2.5.0.bb +++ b/meta-python/recipes-devtools/python/python3-pyflakes_3.2.0.bb @@ -3,7 +3,7 @@ HOMEPAGE = "https://github.com/PyCQA/pyflakes" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=690c2d09203dc9e07c4083fc45ea981f" -SRC_URI[sha256sum] = "491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3" +SRC_URI[sha256sum] = "1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-pyhamcrest_2.0.4.bb b/meta-python/recipes-devtools/python/python3-pyhamcrest_2.0.4.bb deleted file mode 100644 index 888278af80..0000000000 --- a/meta-python/recipes-devtools/python/python3-pyhamcrest_2.0.4.bb +++ /dev/null @@ -1,15 +0,0 @@ -SUMMARY = "Hamcrest framework for matcher objects" -HOMEPAGE = "https://github.com/hamcrest/PyHamcrest" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=79391bf1501c898472d043f36e960612" - -SRC_URI[sha256sum] = "b5d9ce6b977696286cf232ce2adf8969b4d0b045975b0936ac9005e84e67e9c1" - -inherit pypi python_setuptools_build_meta - -DEPENDS += "${PYTHON_PN}-hatch-vcs-native" - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-numbers \ -" diff --git a/meta-python/recipes-devtools/python/python3-pyhamcrest_2.1.0.bb b/meta-python/recipes-devtools/python/python3-pyhamcrest_2.1.0.bb new file mode 100644 index 0000000000..eaa24eefe5 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyhamcrest_2.1.0.bb @@ -0,0 +1,18 @@ +SUMMARY = "Hamcrest framework for matcher objects" +HOMEPAGE = "https://github.com/hamcrest/PyHamcrest" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=79391bf1501c898472d043f36e960612" + +SRC_URI[sha256sum] = "c6acbec0923d0cb7e72c22af1926f3e7c97b8e8d69fc7498eabacaf7c975bd9c" + +inherit pypi python_setuptools_build_meta + +DEPENDS += "python3-hatch-vcs-native" + +UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/PyHamcrest/" +UPSTREAM_CHECK_REGEX = "/PyHamcrest/(?P<pver>(\d+[\.\-_]*)+)" + +RDEPENDS:${PN} += " \ + python3-six \ + python3-numbers \ +" diff --git a/meta-python/recipes-devtools/python/python3-pyiface_git.bb b/meta-python/recipes-devtools/python/python3-pyiface_0.0.11.bb index 5e0d2de916..b5bd89de76 100644 --- a/meta-python/recipes-devtools/python/python3-pyiface_git.bb +++ b/meta-python/recipes-devtools/python/python3-pyiface_0.0.11.bb @@ -1,18 +1,18 @@ SUMMARY = "Pyiface is a package that exposes the network interfaces of the operating system in a easy to use and transparent way" -SECTION = "devel/python" HOMEPAGE = "https://pypi.python.org/pypi/pyiface/" +SECTION = "devel/python" LICENSE = "GPL-3.0-or-later" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=4fe869ee987a340198fb0d54c55c47f1" DEPENDS += "python3-setuptools-scm-native" -inherit setuptools3 - -SRC_URI = "git://github.com/bat-serjo/PyIface.git;protocol=https;branch=master" -SRCREV = "4557dbda96d2e4b1142c60603d4a27d007a9ffe6" -PV = "0.1.dev33+g4557dbd" +SRC_URI[sha256sum] = "e231e5735d329c5b2d4fc8854f069fdaa5436d3ef91ed64ee49e41e3f5e8a3f5" -PIP_INSTALL_PACKAGE = "pyiface" +inherit pypi setuptools3 -S = "${WORKDIR}/git" +RDEPENDS:${PN} += " \ + python3-ctypes \ + python3-fcntl \ + python3-io \ +" diff --git a/meta-python/recipes-devtools/python/python3-pyinotify_0.9.6.bb b/meta-python/recipes-devtools/python/python3-pyinotify_0.9.6.bb deleted file mode 100644 index 8dd5e1580a..0000000000 --- a/meta-python/recipes-devtools/python/python3-pyinotify_0.9.6.bb +++ /dev/null @@ -1,19 +0,0 @@ -DESCRIPTION = "Python pyinotify: Linux filesystem events monitoring" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://COPYING;md5=ab173cade7965b411528464589a08382" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-ctypes \ - ${PYTHON_PN}-fcntl \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-misc \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-smtpd \ - ${PYTHON_PN}-threading \ -" - -SRC_URI[md5sum] = "8e580fa1ff3971f94a6f81672b76c406" -SRC_URI[sha256sum] = "9c998a5d7606ca835065cdabc013ae6c66eb9ea76a00a1e3bc6e0cfe2b4f71f4" - -inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-pyjks_20.0.0.bb b/meta-python/recipes-devtools/python/python3-pyjks_20.0.0.bb index 87e212d9dc..c0cca98ff6 100644 --- a/meta-python/recipes-devtools/python/python3-pyjks_20.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-pyjks_20.0.0.bb @@ -11,12 +11,12 @@ SRC_URI[sha256sum] = "0378cec15fb11b2ed27ba54dad9fd987d48e6f62f49fcff138f5f7a8b3 inherit pypi setuptools3 -RDEPENDS:${PN} = "\ - ${PYTHON_PN}-javaobj-py3 \ - ${PYTHON_PN}-pyasn1 \ - ${PYTHON_PN}-pyasn1-modules \ - ${PYTHON_PN}-pycryptodome \ - ${PYTHON_PN}-twofish\ +RDEPENDS:${PN} = " \ + python3-javaobj-py3 \ + python3-pyasn1 \ + python3-pyasn1-modules \ + python3-pycryptodomex \ + python3-twofish \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pyjwt_2.4.0.bb b/meta-python/recipes-devtools/python/python3-pyjwt_2.8.0.bb index a540e36515..92a8f44c6b 100644 --- a/meta-python/recipes-devtools/python/python3-pyjwt_2.4.0.bb +++ b/meta-python/recipes-devtools/python/python3-pyjwt_2.8.0.bb @@ -5,11 +5,14 @@ HOMEPAGE = "http://github.com/jpadilla/pyjwt" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=e4b56d2c9973d8cf54655555be06e551" -SRC_URI[sha256sum] = "d42908208c699b3b973cbeb01a969ba6a96c821eefb1c5bfe4c390c01d67abba" +SRC_URI[sha256sum] = "57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de" PYPI_PACKAGE = "PyJWT" inherit pypi setuptools3 -RDEPENDS:${PN} = "${PYTHON_PN}-cryptography" +RDEPENDS:${PN} = " \ + python3-json \ + python3-cryptography \ +" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pykwalify_1.8.0.bb b/meta-python/recipes-devtools/python/python3-pykwalify_1.8.0.bb index 6d93f384e0..d94051df89 100644 --- a/meta-python/recipes-devtools/python/python3-pykwalify_1.8.0.bb +++ b/meta-python/recipes-devtools/python/python3-pykwalify_1.8.0.bb @@ -11,9 +11,10 @@ PYPI_PACKAGE = "pykwalify" inherit setuptools3 pypi RDEPENDS:${PN} = "\ - ${PYTHON_PN}-docopt \ - ${PYTHON_PN}-dateutil \ - ${PYTHON_PN}-ruamel-yaml \ + python3-dateutil \ + python3-docopt \ + python3-logging \ + python3-ruamel-yaml \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pylint/0001-Adjust-test-expectations-for-ptest.patch b/meta-python/recipes-devtools/python/python3-pylint/0001-Adjust-test-expectations-for-ptest.patch new file mode 100644 index 0000000000..8edecbf1bd --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pylint/0001-Adjust-test-expectations-for-ptest.patch @@ -0,0 +1,44 @@ +From f3a213cf4922c122e554277ea2031c0c54cd3fe5 Mon Sep 17 00:00:00 2001 +From: Dan McGregor <dan.mcgregor@vecima.com> +Date: Wed, 13 Mar 2024 14:08:25 -0600 +Subject: [PATCH] Adjust test expectations for ptest + +Because of the way we install ptests, some first party imports +became third party. Reflect that in the test case. + +Upstream-Status: Inappropriate (embedded specific) +Signed-off-by: Dan McGregor <dan.mcgregor@vecima.com> +--- + tests/functional/w/wrong_import_order.txt | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +diff --git a/tests/functional/w/wrong_import_order.txt b/tests/functional/w/wrong_import_order.txt +index 068d2140d..9594ff9e0 100644 +--- a/tests/functional/w/wrong_import_order.txt ++++ b/tests/functional/w/wrong_import_order.txt +@@ -3,14 +3,14 @@ wrong-import-order:14:0:14:10::"standard import ""sys"" should be placed before + wrong-import-order:15:0:15:15::"standard import ""datetime"" should be placed before third party imports ""six"", ""astroid.are_exclusive""":UNDEFINED
+ wrong-import-order:18:0:18:22::"third party import ""totally_missing"" should be placed before local import ""package.Class""":UNDEFINED
+ wrong-import-order:20:0:20:14::"third party import ""astroid"" should be placed before local imports ""package.Class"", "".package""":UNDEFINED
+-wrong-import-order:22:0:22:22::"first party import ""pylint.checkers"" should be placed before local imports ""package.Class"", "".package"", "".package2""":UNDEFINED
+-wrong-import-order:23:0:23:25::"first party import ""pylint.config"" should be placed before local imports ""package.Class"", "".package"", "".package2""":UNDEFINED
+-wrong-import-order:24:0:24:17::"first party import ""pylint.sys"" should be placed before local imports ""package.Class"", "".package"", "".package2""":UNDEFINED
+-wrong-import-order:25:0:25:28::"first party import ""pylint.pyreverse"" should be placed before local imports ""package.Class"", "".package"", "".package2""":UNDEFINED
+-wrong-import-order:30:0:30:40::"third party import ""six.moves.urllib.parse.quote"" should be placed before first party imports ""pylint.checkers"", ""pylint.config"", ""pylint.sys"", ""pylint.pyreverse"" and local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
+-wrong-import-order:31:0:31:23::"first party import ""pylint.constants"" should be placed before local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
+-wrong-import-order:32:0:32:19::"standard import ""re"" should be placed before third party imports ""six"", ""astroid.are_exclusive"", ""unused_import"", ""totally_missing"", ""astroid"", ""six.moves.urllib.parse.quote"", first party imports ""pylint.checkers"", ""pylint.config"", ""pylint.sys"", ""pylint.pyreverse"", ""pylint.constants"", and local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
+-wrong-import-order:32:0:32:19::"third party import ""requests"" should be placed before first party imports ""pylint.checkers"", ""pylint.config"", ""pylint.sys"", ""pylint.pyreverse"", ""pylint.constants"" and local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
+-wrong-import-order:33:0:33:24::"first party import ""pylint.exceptions"" should be placed before local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
+-wrong-import-order:34:0:34:21::"first party import ""pylint.message"" should be placed before local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
+-wrong-import-order:35:0:35:11::"standard import ""time"" should be placed before third party imports ""six"", ""astroid.are_exclusive"", ""unused_import"" (...) ""astroid"", ""six.moves.urllib.parse.quote"", ""requests"", first party imports ""pylint.checkers"", ""pylint.config"", ""pylint.sys"" (...) ""pylint.constants"", ""pylint.exceptions"", ""pylint.message"", and local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
++wrong-import-order:22:0:22:22::"third party import ""pylint.checkers"" should be placed before local imports ""package.Class"", "".package"", "".package2""":UNDEFINED
++wrong-import-order:23:0:23:25::"third party import ""pylint.config"" should be placed before local imports ""package.Class"", "".package"", "".package2""":UNDEFINED
++wrong-import-order:24:0:24:17::"third party import ""pylint.sys"" should be placed before local imports ""package.Class"", "".package"", "".package2""":UNDEFINED
++wrong-import-order:25:0:25:28::"third party import ""pylint.pyreverse"" should be placed before local imports ""package.Class"", "".package"", "".package2""":UNDEFINED
++wrong-import-order:30:0:30:40::"third party import ""six.moves.urllib.parse.quote"" should be placed before local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
++wrong-import-order:31:0:31:23::"third party import ""pylint.constants"" should be placed before local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
++wrong-import-order:32:0:32:19::"standard import ""re"" should be placed before third party imports ""six"", ""astroid.are_exclusive"", ""unused_import"" (...) ""pylint.pyreverse"", ""six.moves.urllib.parse.quote"", ""pylint.constants"" and local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
++wrong-import-order:32:0:32:19::"third party import ""requests"" should be placed before local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
++wrong-import-order:33:0:33:24::"third party import ""pylint.exceptions"" should be placed before local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
++wrong-import-order:34:0:34:21::"third party import ""pylint.message"" should be placed before local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
++wrong-import-order:35:0:35:11::"standard import ""time"" should be placed before third party imports ""six"", ""astroid.are_exclusive"", ""unused_import"" (...) ""requests"", ""pylint.exceptions"", ""pylint.message"" and local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
diff --git a/meta-python/recipes-devtools/python/python3-pylint/run-ptest b/meta-python/recipes-devtools/python/python3-pylint/run-ptest new file mode 100644 index 0000000000..ed424cb879 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pylint/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --benchmark-disable -vv --minimal-messages-config --automake tests/test_functional.py diff --git a/meta-python/recipes-devtools/python/python3-pylint_2.14.5.bb b/meta-python/recipes-devtools/python/python3-pylint_2.14.5.bb deleted file mode 100644 index 738b9250c0..0000000000 --- a/meta-python/recipes-devtools/python/python3-pylint_2.14.5.bb +++ /dev/null @@ -1,18 +0,0 @@ -SUMMARY="Pylint is a Python source code analyzer" -HOMEPAGE= "http://www.pylint.org/" -LICENSE = "GPL-2.0-only" -LIC_FILES_CHKSUM = "file://LICENSE;md5=c107cf754550e65755c42985a5d4e9c9" - -SRC_URI[sha256sum] = "487ce2192eee48211269a0e976421f334cf94de1806ca9d0a99449adcdf0285e" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += "${PYTHON_PN}-astroid \ - ${PYTHON_PN}-isort \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-pkgutil \ - ${PYTHON_PN}-difflib \ - ${PYTHON_PN}-netserver \ - " diff --git a/meta-python/recipes-devtools/python/python3-pylint_3.1.0.bb b/meta-python/recipes-devtools/python/python3-pylint_3.1.0.bb new file mode 100644 index 0000000000..12f4f908af --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pylint_3.1.0.bb @@ -0,0 +1,57 @@ +SUMMARY="Pylint is a Python source code analyzer" +HOMEPAGE= "http://www.pylint.org/" +LICENSE = "GPL-2.0-only" +LIC_FILES_CHKSUM = "file://LICENSE;md5=c107cf754550e65755c42985a5d4e9c9" + +SRC_URI += "git://github.com/pylint-dev/pylint;branch=maintenance/3.1.x;protocol=https \ + file://0001-Adjust-test-expectations-for-ptest.patch \ + file://run-ptest \ + " +SRCREV = "053c2c3a25f97f043e10cdd41d2609e495a68f57" + +inherit python_setuptools_build_meta ptest + +RDEPENDS:${PN} += "\ + python3-astroid \ + python3-difflib \ + python3-dill \ + python3-isort \ + python3-json \ + python3-mccabe \ + python3-netserver \ + python3-numbers \ + python3-pkgutil \ + python3-platformdirs \ + python3-shell \ + python3-tomlkit \ + " + +RDEPENDS:${PN}-ptest += " \ + python3-core \ + python3-git \ + python3-py \ + python3-pytest \ + python3-pytest-benchmark \ + python3-pytest-runner \ + python3-pytest-timeout \ + python3-pytest-xdist \ + python3-requests \ + python3-statistics \ + python3-tomllib \ + python3-typing-extensions \ + python3-unittest-automake-output \ + " + +S = "${WORKDIR}/git" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ + install -Dm 0644 ${S}/tests/.pylint_primer_tests/.gitkeep ${D}${PTEST_PATH}/tests/.pylint_primer_tests/.gitkeep + sed -i 's#/usr/bin/python$#/usr/bin/python3#g' ${D}${PTEST_PATH}/tests/data/ascript + # regression_distutil_import_error_73.py fails to run see + # https://lists.openembedded.org/g/openembedded-devel/topic/103181847 + rm ${D}${PTEST_PATH}/tests/functional/r/regression_02/regression_distutil_import_error_73.py +} + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pylyrics_1.1.0.bb b/meta-python/recipes-devtools/python/python3-pylyrics_1.1.0.bb index 207751c451..1ac95e8be3 100644 --- a/meta-python/recipes-devtools/python/python3-pylyrics_1.1.0.bb +++ b/meta-python/recipes-devtools/python/python3-pylyrics_1.1.0.bb @@ -9,4 +9,10 @@ SRC_URI[sha256sum] = "c5f36e8ef0ed3b487a9242ce34c19f9684e418a5bbffd5d367dc1d1604 PYPI_PACKAGE = "PyLyrics" PYPI_PACKAGE_EXT = "zip" -inherit pypi setuptools3
\ No newline at end of file +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-beautifulsoup4 \ + python3-classes \ + python3-requests \ +" diff --git a/meta-python/recipes-devtools/python/python3-pymemcache_4.0.0.bb b/meta-python/recipes-devtools/python/python3-pymemcache_4.0.0.bb new file mode 100644 index 0000000000..8d966cfb63 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pymemcache_4.0.0.bb @@ -0,0 +1,22 @@ +DESCRIPTION = "A comprehensive, fast, pure Python memcached client" +HOMEPAGE = "https://github.com/pinterest/pymemcache" +SECTION = "devel/python" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=3b83ef96387f14655fc854ddc3c6bd57" + +PYPI_PACKAGE = "pymemcache" + +SRC_URI[sha256sum] = "27bf9bd1bbc1e20f83633208620d56de50f14185055e49504f4f5e94e94aff94" + +inherit pypi setuptools3 + +DEPENDS += " \ + python3-setuptools-scm-native \ + python3-six-native \ +" + +RDEPENDS:${PN} += "\ + python3-io \ + python3-core \ + python3-logging \ +" diff --git a/meta-python/recipes-devtools/python/python3-pymetno_0.9.0.bb b/meta-python/recipes-devtools/python/python3-pymetno_0.12.0.bb index 50b202b042..5be6e6319b 100644 --- a/meta-python/recipes-devtools/python/python3-pymetno_0.9.0.bb +++ b/meta-python/recipes-devtools/python/python3-pymetno_0.12.0.bb @@ -4,15 +4,13 @@ LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=5d503272f52c35147ec960cb56a03bf4" SRC_URI = "git://github.com/Danielhiversen/pyMetno.git;protocol=https;branch=master" -SRCREV = "3b18971fb882deaaebb9aa511627c5fc6fb97526" +SRCREV = "50f427aad264a4793abb94a3c8cbf987fadcd4ae" S = "${WORKDIR}/git" inherit setuptools3 -PIP_INSTALL_PACKAGE = "PyMetno" - RDEPENDS:${PN} = "\ - ${PYTHON_PN}-aiohttp (>=3.6.1) \ - ${PYTHON_PN}-async-timeout (>=3.0.1) \ - ${PYTHON_PN}-pytz (>=2019.3) \ + python3-aiohttp (>=3.6.1) \ + python3-async-timeout (>=3.0.1) \ + python3-pytz (>=2019.3) \ " diff --git a/meta-python/recipes-devtools/python/python3-pymisp_2.4.157.bb b/meta-python/recipes-devtools/python/python3-pymisp_2.4.157.bb deleted file mode 100644 index a900e70279..0000000000 --- a/meta-python/recipes-devtools/python/python3-pymisp_2.4.157.bb +++ /dev/null @@ -1,26 +0,0 @@ -DESCRIPTION = "Python API for MISP" -HOMEPAGE = "https://github.com/MISP/PyMISP" -LICENSE = "BSD-2-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=a3639cf5780f71b125d3e9d1dc127c20" - -SRC_URI = "git://github.com/MISP/PyMISP.git;protocol=https;branch=main" -SRCREV = "b1892efb6a078d1370cee51c9103f3a591c628d2" -S = "${WORKDIR}/git" - -inherit python_poetry_core - -PIP_INSTALL_PACKAGE = "pymisp" - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-dateutil \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-jsonschema \ - ${PYTHON_PN}-requests \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-deprecated \ - ${PYTHON_PN}-wrapt \ -" - -# Fixes: python3-pymisp requires /bin/bash, but no -# providers found in RDEPENDS:python3-pymisp? [file-rdep] -RDEPENDS:${PN} += "bash" diff --git a/meta-python/recipes-devtools/python/python3-pymisp_2.4.190.bb b/meta-python/recipes-devtools/python/python3-pymisp_2.4.190.bb new file mode 100644 index 0000000000..c1389982d4 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pymisp_2.4.190.bb @@ -0,0 +1,22 @@ +DESCRIPTION = "Python API for MISP" +HOMEPAGE = "https://github.com/MISP/PyMISP" +LICENSE = "BSD-2-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=a3639cf5780f71b125d3e9d1dc127c20" + +SRC_URI[sha256sum] = "e7374295bfd8c7d25f56867e4395a029433360d95420e39b7f78eb1d4f8b48b4" + +inherit python_poetry_core pypi + +RDEPENDS:${PN} += " \ + python3-dateutil \ + python3-json \ + python3-jsonschema \ + python3-requests \ + python3-six \ + python3-deprecated \ + python3-wrapt \ +" + +# Fixes: python3-pymisp requires /bin/bash, but no +# providers found in RDEPENDS:python3-pymisp? [file-rdep] +RDEPENDS:${PN} += "bash" diff --git a/meta-python/recipes-devtools/python/python3-pymodbus_2.5.3.bb b/meta-python/recipes-devtools/python/python3-pymodbus_3.6.7.bb index 46565876fe..323377253e 100644 --- a/meta-python/recipes-devtools/python/python3-pymodbus_2.5.3.bb +++ b/meta-python/recipes-devtools/python/python3-pymodbus_3.6.7.bb @@ -1,13 +1,11 @@ SUMMARY = "A fully featured modbus protocol stack in python" HOMEPAGE = "https://github.com/riptideio/pymodbus/" LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=2c2223d66c7e674b40527b5a4c35bd76" -DEPENDS += "python3-six-native" +LIC_FILES_CHKSUM = "file://LICENSE;md5=eba8057aa82c058d2042b4b0a0e9cc63" -SRC_URI[sha256sum] = "5ef68c1a109bdb467c830ef003ef2db6494349a5248e4af946fe21c9eefe7e74" -S = "${WORKDIR}/pymodbus-${PV}" +SRC_URI[sha256sum] = "e6cefac57f8d0e887ef49a705743787d8f1f005df94bd148e3da43c2599c77f3" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta PACKAGECONFIG ??= "" PACKAGECONFIG[repl] = ",,,python3-aiohttp python3-click python3-prompt-toolkit python3-pygments python3-pyserial-asyncio" @@ -31,5 +29,3 @@ RDEPENDS:${PN} += " \ python3-pyserial \ python3-six \ " - - diff --git a/meta-python/recipes-devtools/python/python3-pymongo_4.2.0.bb b/meta-python/recipes-devtools/python/python3-pymongo_4.6.1.bb index 62b6a941b0..260e134cd2 100644 --- a/meta-python/recipes-devtools/python/python3-pymongo_4.2.0.bb +++ b/meta-python/recipes-devtools/python/python3-pymongo_4.6.1.bb @@ -8,23 +8,23 @@ HOMEPAGE = "http://github.com/mongodb/mongo-python-driver" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327" -SRC_URI[sha256sum] = "72f338f6aabd37d343bd9d1fdd3de921104d395766bcc5cdc4039e4c2dd97766" +SRC_URI[sha256sum] = "31dab1f3e1d0cdd57e8df01b645f52d43cc1b653ed3afd535d2891f4fc4f9712" inherit pypi setuptools3 -PACKAGES =+ "${PYTHON_PN}-bson" +PACKAGES =+ "python3-bson" -FILES:${PYTHON_PN}-bson = "${PYTHON_SITEPACKAGES_DIR}/bson/*" +FILES:python3-bson = "${PYTHON_SITEPACKAGES_DIR}/bson/*" -RDEPENDS:${PYTHON_PN}-bson += " \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-threading \ +RDEPENDS:python3-bson += " \ + python3-datetime \ + python3-json \ + python3-netclient \ + python3-numbers \ + python3-threading \ " RDEPENDS:${PN} += " \ - ${PYTHON_PN}-bson \ - ${PYTHON_PN}-pprint \ + python3-bson \ + python3-pprint \ " diff --git a/meta-python/recipes-devtools/python/python3-pymysql_1.0.2.bb b/meta-python/recipes-devtools/python/python3-pymysql_1.1.0.bb index 1f6fbd3bb1..5e56a64aa1 100644 --- a/meta-python/recipes-devtools/python/python3-pymysql_1.0.2.bb +++ b/meta-python/recipes-devtools/python/python3-pymysql_1.1.0.bb @@ -8,9 +8,12 @@ HOMEPAGE = "https://pymysql.readthedocs.io" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=528175c84163bb800d23ad835c7fa0fc" -SRC_URI[sha256sum] = "816927a350f38d56072aeca5dfb10221fe1dc653745853d30a216637f5d7ad36" +SRC_URI[sha256sum] = "4f13a7df8bf36a51e81dd9f3605fede45a4878fe02f9236349fd82a3f0612f96" PYPI_PACKAGE = "PyMySQL" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta -RDEPENDS:${PN} += "${PYTHON_PN}-cryptography" +UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/pymysql/" +UPSTREAM_CHECK_REGEX = "/pymysql/(?P<pver>(\d+[\.\-_]*)+)" + +RDEPENDS:${PN} += "python3-cryptography" diff --git a/meta-python/recipes-devtools/python/python3-pynacl_1.5.0.bb b/meta-python/recipes-devtools/python/python3-pynacl_1.5.0.bb index 6e53461979..a2f2ab4df4 100644 --- a/meta-python/recipes-devtools/python/python3-pynacl_1.5.0.bb +++ b/meta-python/recipes-devtools/python/python3-pynacl_1.5.0.bb @@ -11,13 +11,7 @@ PYPI_PACKAGE = "PyNaCl" inherit pypi python_setuptools_build_meta DEPENDS += "\ - ${PYTHON_PN}-cffi-native \ - libsodium \ -" - -RDEPENDS:${PN} = "\ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-cffi \ + python3-cffi-native \ libsodium \ " @@ -28,3 +22,17 @@ do_compile:prepend() { do_install:prepend() { export SODIUM_INSTALL=system } + +RDEPENDS:${PN} = "\ + python3-six \ + python3-cffi \ + libsodium \ +" + +RPROVIDES:${PN} = "python3-nacl" + +# in meta-virtualization layer +# +RCONFLICTS:${PN} = "python3-nacl" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pynetlinux/0002-Fixed-relative-imports.patch b/meta-python/recipes-devtools/python/python3-pynetlinux/0002-Fixed-relative-imports.patch new file mode 100644 index 0000000000..65f38814c3 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pynetlinux/0002-Fixed-relative-imports.patch @@ -0,0 +1,60 @@ +From afb778669efbc658a29e6bdb1c4834fee42931aa Mon Sep 17 00:00:00 2001 +From: Robert Grant <rgrant@mdi.us.com> +Date: Wed, 10 Sep 2014 14:56:33 -0400 +Subject: [PATCH] Fixed relative imports + +Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> + +--- +Upstream-Status: Backport [https://github.com/rlisagor/pynetlinux/commit/afb778669efbc658a29e6bdb1c4834fee42931aa] + + pynetlinux/__init__.py | 8 ++++---- + pynetlinux/brctl.py | 2 +- + pynetlinux/tap.py | 2 +- + 3 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/pynetlinux/__init__.py b/pynetlinux/__init__.py +index dbbf392..b6e1b8e 100644 +--- a/pynetlinux/__init__.py ++++ b/pynetlinux/__init__.py +@@ -2,7 +2,7 @@ + # import pylinux + # does a reasonable thing. + +-import brctl +-import ifconfig +-import tap +-import route ++from . import brctl ++from . import ifconfig ++from . import tap ++from . import route +diff --git a/pynetlinux/brctl.py b/pynetlinux/brctl.py +index f54d176..a8b926e 100644 +--- a/pynetlinux/brctl.py ++++ b/pynetlinux/brctl.py +@@ -3,7 +3,7 @@ import fcntl + import os + import struct + +-import ifconfig ++from . import ifconfig + + SYSFS_NET_PATH = "/sys/class/net" + +diff --git a/pynetlinux/tap.py b/pynetlinux/tap.py +index 0a0d59c..3f8ad3a 100644 +--- a/pynetlinux/tap.py ++++ b/pynetlinux/tap.py +@@ -2,7 +2,7 @@ import fcntl + import os + import struct + +-import ifconfig ++from . import ifconfig + + # From linux/if_tun.h + +-- +2.39.2 + diff --git a/meta-python/recipes-devtools/python/python3-pynetlinux_1.1.bb b/meta-python/recipes-devtools/python/python3-pynetlinux_1.1.bb index a5ac74fd68..b1abac17aa 100644 --- a/meta-python/recipes-devtools/python/python3-pynetlinux_1.1.bb +++ b/meta-python/recipes-devtools/python/python3-pynetlinux_1.1.bb @@ -7,6 +7,15 @@ LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=74e1861736ee959824fe7542323c12e9" SRC_URI[sha256sum] = "4ad08298c9f5ba15a11cddc639ba8778cabdfc402b51066d9e0a325e5a5b391c" -SRC_URI += "file://0001-setup.py-switch-to-setuptools.patch" +SRC_URI += " \ + file://0001-setup.py-switch-to-setuptools.patch \ + file://0002-Fixed-relative-imports.patch \ +" inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-ctypes \ + python3-fcntl \ + python3-io \ +" diff --git a/meta-python/recipes-devtools/python/python3-pyperclip_1.8.2.bb b/meta-python/recipes-devtools/python/python3-pyperclip_1.8.2.bb index 2870ec9c01..dcf0015c59 100644 --- a/meta-python/recipes-devtools/python/python3-pyperclip_1.8.2.bb +++ b/meta-python/recipes-devtools/python/python3-pyperclip_1.8.2.bb @@ -8,7 +8,7 @@ SRC_URI[sha256sum] = "105254a8b04934f0bc84e9c24eb360a591aaf6535c9def5f29d92af107 inherit pypi setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-ctypes \ + python3-ctypes \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pyperf_2.4.1.bb b/meta-python/recipes-devtools/python/python3-pyperf_2.6.3.bb index cb8282566a..6b37e1864a 100644 --- a/meta-python/recipes-devtools/python/python3-pyperf_2.4.1.bb +++ b/meta-python/recipes-devtools/python/python3-pyperf_2.6.3.bb @@ -13,11 +13,11 @@ Features: \ LICENSE = "MIT" LIC_FILES_CHKSUM = "file://COPYING;md5=78bc2e6e87c8c61272937b879e6dc2f8" -SRC_URI[sha256sum] = "38cf5e90c56f906a8320ce82a50bfa92c902b93affd72e4dc81580115f355853" +SRC_URI[sha256sum] = "9752fe749c21e460a564bb3f52fc319b892c62ee61c5138b4a9bbf94ad2755e6" -DEPENDS += "${PYTHON_PN}-six-native" +DEPENDS += "python3-six-native" PYPI_PACKAGE = "pyperf" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta -RDEPENDS:${PN} += "${PYTHON_PN}-misc ${PYTHON_PN}-statistics" +RDEPENDS:${PN} += "python3-misc python3-statistics" diff --git a/meta-python/recipes-devtools/python/python3-pypng_0.20220715.0.bb b/meta-python/recipes-devtools/python/python3-pypng_0.20220715.0.bb new file mode 100644 index 0000000000..9e30f67dc6 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pypng_0.20220715.0.bb @@ -0,0 +1,8 @@ +SUMMARY = "PNG module for Python." +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENCE;md5=5b60f319c8cf51f825b4f40aadee3243" + +SRC_URI[sha256sum] = "739c433ba96f078315de54c0db975aee537cbc3e1d0ae4ed9aab0ca1e427e2c1" + +inherit pypi python_setuptools_build_meta diff --git a/meta-python/recipes-devtools/python/python3-pyppmd_1.1.0.bb b/meta-python/recipes-devtools/python/python3-pyppmd_1.1.0.bb new file mode 100644 index 0000000000..cec21007a2 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyppmd_1.1.0.bb @@ -0,0 +1,20 @@ +SUMMARY = "PPMd compression/decompression library" +HOMEPAGE = "https://pyppmd.readthedocs.io/en/latest/" +LICENSE = "LGPL-2.1-or-later" +SECTION = "devel/python" +LIC_FILES_CHKSUM = "file://LICENSE;md5=4fbd65380cdd255951079008b364516c" + +inherit pypi python_setuptools_build_meta + +SRC_URI[sha256sum] = "1d38ce2e4b7eb84b53bc8a52380b94f66ba6c39328b8800b30c2b5bf31693973" + +DEPENDS += " \ + python3-setuptools-scm-native \ + python3-toml-native \ + python3-wheel-native \ +" + +RDEPENDS:${PN} += "\ + python3-email \ + python3-importlib-metadata \ +" diff --git a/meta-python/recipes-devtools/python/python3-pyproj_3.3.1.bb b/meta-python/recipes-devtools/python/python3-pyproj_3.6.1.bb index 6085e48b3a..a4121c3934 100644 --- a/meta-python/recipes-devtools/python/python3-pyproj_3.3.1.bb +++ b/meta-python/recipes-devtools/python/python3-pyproj_3.6.1.bb @@ -1,6 +1,6 @@ SUMMARY = "Python interface to PROJ (cartographic projections and coordinate transformations library)" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=dc4bb2668871655e24030dfe8d2a7ce7" +LIC_FILES_CHKSUM = "file://LICENSE;md5=873757af01d2d221eedb422c4c1dd163" DEPENDS = "python3-cython proj" DEPENDS:append:class-target = " python3-cython-native proj-native" @@ -8,9 +8,16 @@ PYPI_PACKAGE = "pyproj" inherit pypi setuptools3 -SRC_URI[sha256sum] = "b3d8e14d91cc95fb3dbc03a9d0588ac58326803eefa5bbb0978d109de3304fbe" +SRC_URI[sha256sum] = "44aa7c704c2b7d8fb3d483bbf75af6cb2350d30a63b144279a09b75fead501bf" -RDEPENDS:${PN} = "${PYTHON_PN}-certifi proj" +RDEPENDS:${PN} = " \ + python3-certifi \ + python3-compression \ + python3-json \ + python3-logging \ + python3-profile \ +" export PROJ_INCDIR = "${STAGING_INCDIR}" export PROJ_LIBDIR = "${STAGING_LIBDIR}" +export PROJ_DIR = "${STAGING_BINDIR_NATIVE}/.." diff --git a/meta-python/recipes-devtools/python/python3-pyproject-api_1.6.1.bb b/meta-python/recipes-devtools/python/python3-pyproject-api_1.6.1.bb new file mode 100644 index 0000000000..aec19949d2 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyproject-api_1.6.1.bb @@ -0,0 +1,23 @@ +# SPDX-License-Identifier: MIT +# Copyright (C) 2023 iris-GmbH infrared & intelligent sensors + +SUMMARY = "pyproject-api aims to abstract away interaction with pyproject.toml style projects in a flexible way." +HOMEPAGE = "https://pyproject-api.readthedocs.io" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=11610a9d8fd95649cf8159be12b98cb7" + +SRC_URI[sha256sum] = "1817dc018adc0d1ff9ca1ed8c60e1623d5aaca40814b953af14a9cf9a5cae538" + +PYPI_PACKAGE = "pyproject_api" + +BBCLASSEXTEND = "native nativesdk" +inherit pypi python_hatchling + +DEPENDS += "\ + python3-hatch-vcs-native \ +" + +RDEPENDS:${PN} += "\ + python3-packaging \ + python3-tomli \ +" diff --git a/meta-python/recipes-devtools/python/python3-pyrad_2.4.bb b/meta-python/recipes-devtools/python/python3-pyrad_2.4.bb index bce1e2fd14..801233a026 100644 --- a/meta-python/recipes-devtools/python/python3-pyrad_2.4.bb +++ b/meta-python/recipes-devtools/python/python3-pyrad_2.4.bb @@ -9,3 +9,11 @@ SRC_URI[sha256sum] = "057de4b7e89d8da57ba782c1bde45c63ebee720ae2c0b0a69beaff15c4 SRC_URI += "file://use-poetry-core.patch" inherit pypi python_poetry_core + +RDEPENDS:${PN} += " \ + python3-crypt \ + python3-io \ + python3-logging \ + python3-netaddr \ + python3-six \ +" diff --git a/meta-python/recipes-devtools/python/python3-pyroute2/run-ptest b/meta-python/recipes-devtools/python/python3-pyroute2/run-ptest index ea429ba21e..f1c8729f0e 100644 --- a/meta-python/recipes-devtools/python/python3-pyroute2/run-ptest +++ b/meta-python/recipes-devtools/python/python3-pyroute2/run-ptest @@ -1,4 +1,4 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-pyroute2_0.5.19.bb b/meta-python/recipes-devtools/python/python3-pyroute2_0.5.19.bb deleted file mode 100644 index fa5b3a522a..0000000000 --- a/meta-python/recipes-devtools/python/python3-pyroute2_0.5.19.bb +++ /dev/null @@ -1,36 +0,0 @@ -SUMMARY = "A pure Python netlink and Linux network configuration library" -LICENSE = "GPL-2.0-only & Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE.GPL.v2;md5=b234ee4d69f5fce4486a80fdaf4a4263 \ - file://LICENSE.Apache.v2;md5=34281e312165f843a2b7d1f114fe65ce" - -SRC_URI[sha256sum] = "45460d12ed2a5caf272a357a3360b36d1e346f17afe1425b66fc21d70f462b29" - -inherit setuptools3 pypi ptest - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-ctypes \ - ${PYTHON_PN}-distutils \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-multiprocessing \ - ${PYTHON_PN}-pickle \ - ${PYTHON_PN}-pkgutil \ - ${PYTHON_PN}-pprint \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-unixadmin \ -" - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-fcntl \ -" - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/tests - cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ -} diff --git a/meta-python/recipes-devtools/python/python3-pyroute2_0.7.10.bb b/meta-python/recipes-devtools/python/python3-pyroute2_0.7.10.bb new file mode 100644 index 0000000000..740a6d7f73 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyroute2_0.7.10.bb @@ -0,0 +1,41 @@ +SUMMARY = "A pure Python netlink and Linux network configuration library" +LICENSE = "GPL-2.0-or-later | Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=dccbff78d7d79ae7e53953d43445c6e6 \ + file://LICENSE.GPL-2.0-or-later;md5=b234ee4d69f5fce4486a80fdaf4a4263 \ + file://LICENSE.Apache-2.0;md5=34281e312165f843a2b7d1f114fe65ce" + +SRC_URI[sha256sum] = "cc2f90aad1517cb0b301041f678cc8d3c3427c26e53f15c78c93c67928d89a02" + +inherit setuptools3 pypi ptest + +RDEPENDS:${PN} += " \ + python3-ctypes \ + python3-io \ + python3-json \ + python3-fcntl \ + python3-logging \ + python3-multiprocessing \ + python3-pickle \ + python3-pkgutil \ + python3-pprint \ + python3-shell \ + python3-unixadmin \ +" + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-fcntl \ + python3-pytest \ + python3-sqlite3 \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ + sed -e "s|'test_unit|'tests/test_unit|g" -i ${D}${PTEST_PATH}/tests/test_unit/test_nlmsg/test_marshal.py \ + ${D}${PTEST_PATH}/tests/test_unit/test_iproute_match/test_match.py +} diff --git a/meta-python/recipes-devtools/python/python3-pyruvate-crates.inc b/meta-python/recipes-devtools/python/python3-pyruvate-crates.inc new file mode 100644 index 0000000000..b8a74e617f --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyruvate-crates.inc @@ -0,0 +1,216 @@ +# Autogenerated with 'bitbake -c update_crates python3-pyruvate' + +# from Cargo.lock +SRC_URI += " \ + crate://crates.io/aho-corasick/0.7.20 \ + crate://crates.io/autocfg/1.1.0 \ + crate://crates.io/bitflags/1.3.2 \ + crate://crates.io/block-buffer/0.10.3 \ + crate://crates.io/cc/1.0.78 \ + crate://crates.io/cfg-if/1.0.0 \ + crate://crates.io/cpufeatures/0.2.5 \ + crate://crates.io/cpython/0.7.1 \ + crate://crates.io/crossbeam/0.8.2 \ + crate://crates.io/crossbeam-channel/0.5.6 \ + crate://crates.io/crossbeam-deque/0.8.2 \ + crate://crates.io/crossbeam-epoch/0.9.13 \ + crate://crates.io/crossbeam-queue/0.3.8 \ + crate://crates.io/crossbeam-utils/0.8.14 \ + crate://crates.io/crypto-common/0.1.6 \ + crate://crates.io/digest/0.10.6 \ + crate://crates.io/encoding/0.2.33 \ + crate://crates.io/encoding-index-japanese/1.20141219.5 \ + crate://crates.io/encoding-index-korean/1.20141219.5 \ + crate://crates.io/encoding-index-simpchinese/1.20141219.5 \ + crate://crates.io/encoding-index-singlebyte/1.20141219.5 \ + crate://crates.io/encoding-index-tradchinese/1.20141219.5 \ + crate://crates.io/encoding_index_tests/0.1.4 \ + crate://crates.io/env_logger/0.10.0 \ + crate://crates.io/errno/0.2.8 \ + crate://crates.io/errno-dragonfly/0.1.2 \ + crate://crates.io/fastrand/1.8.0 \ + crate://crates.io/generic-array/0.14.6 \ + crate://crates.io/getrandom/0.2.8 \ + crate://crates.io/hermit-abi/0.1.19 \ + crate://crates.io/hermit-abi/0.2.6 \ + crate://crates.io/hmac/0.12.1 \ + crate://crates.io/httparse/1.8.0 \ + crate://crates.io/humantime/2.1.0 \ + crate://crates.io/instant/0.1.12 \ + crate://crates.io/io-lifetimes/1.0.3 \ + crate://crates.io/is-terminal/0.4.1 \ + crate://crates.io/itoa/1.0.5 \ + crate://crates.io/libc/0.2.138 \ + crate://crates.io/libsystemd/0.5.0 \ + crate://crates.io/linux-raw-sys/0.1.4 \ + crate://crates.io/log/0.4.17 \ + crate://crates.io/memchr/2.5.0 \ + crate://crates.io/memoffset/0.6.5 \ + crate://crates.io/memoffset/0.7.1 \ + crate://crates.io/minimal-lexical/0.2.1 \ + crate://crates.io/mio/0.8.5 \ + crate://crates.io/nix/0.23.2 \ + crate://crates.io/nix/0.26.1 \ + crate://crates.io/nom/7.1.1 \ + crate://crates.io/num-traits/0.2.15 \ + crate://crates.io/num_cpus/1.14.0 \ + crate://crates.io/num_threads/0.1.6 \ + crate://crates.io/once_cell/1.16.0 \ + crate://crates.io/paste/1.0.11 \ + crate://crates.io/pin-utils/0.1.0 \ + crate://crates.io/ppv-lite86/0.2.17 \ + crate://crates.io/proc-macro2/1.0.49 \ + crate://crates.io/python3-sys/0.7.1 \ + crate://crates.io/quote/1.0.23 \ + crate://crates.io/rand/0.8.5 \ + crate://crates.io/rand_chacha/0.3.1 \ + crate://crates.io/rand_core/0.6.4 \ + crate://crates.io/redox_syscall/0.2.16 \ + crate://crates.io/regex/1.7.0 \ + crate://crates.io/regex-syntax/0.6.28 \ + crate://crates.io/remove_dir_all/0.5.3 \ + crate://crates.io/rustix/0.36.5 \ + crate://crates.io/scopeguard/1.1.0 \ + crate://crates.io/serde/1.0.151 \ + crate://crates.io/serde_derive/1.0.151 \ + crate://crates.io/sha2/0.10.6 \ + crate://crates.io/signal-hook/0.3.14 \ + crate://crates.io/signal-hook-registry/1.4.0 \ + crate://crates.io/simplelog/0.12.0 \ + crate://crates.io/spmc/0.3.0 \ + crate://crates.io/static_assertions/1.1.0 \ + crate://crates.io/subtle/2.4.1 \ + crate://crates.io/syn/1.0.107 \ + crate://crates.io/tempfile/3.3.0 \ + crate://crates.io/termcolor/1.1.3 \ + crate://crates.io/thiserror/1.0.38 \ + crate://crates.io/thiserror-impl/1.0.38 \ + crate://crates.io/threadpool/1.8.1 \ + crate://crates.io/time/0.3.17 \ + crate://crates.io/time-core/0.1.0 \ + crate://crates.io/time-macros/0.2.6 \ + crate://crates.io/typenum/1.16.0 \ + crate://crates.io/unicode-ident/1.0.6 \ + crate://crates.io/urlencoding/2.1.2 \ + crate://crates.io/uuid/0.8.2 \ + crate://crates.io/version_check/0.9.4 \ + crate://crates.io/wasi/0.11.0+wasi-snapshot-preview1 \ + crate://crates.io/winapi/0.3.9 \ + crate://crates.io/winapi-i686-pc-windows-gnu/0.4.0 \ + crate://crates.io/winapi-util/0.1.5 \ + crate://crates.io/winapi-x86_64-pc-windows-gnu/0.4.0 \ + crate://crates.io/windows-sys/0.42.0 \ + crate://crates.io/windows_aarch64_gnullvm/0.42.0 \ + crate://crates.io/windows_aarch64_msvc/0.42.0 \ + crate://crates.io/windows_i686_gnu/0.42.0 \ + crate://crates.io/windows_i686_msvc/0.42.0 \ + crate://crates.io/windows_x86_64_gnu/0.42.0 \ + crate://crates.io/windows_x86_64_gnullvm/0.42.0 \ + crate://crates.io/windows_x86_64_msvc/0.42.0 \ +" + +SRC_URI[aho-corasick-0.7.20.sha256sum] = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +SRC_URI[autocfg-1.1.0.sha256sum] = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +SRC_URI[bitflags-1.3.2.sha256sum] = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +SRC_URI[block-buffer-0.10.3.sha256sum] = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +SRC_URI[cc-1.0.78.sha256sum] = "a20104e2335ce8a659d6dd92a51a767a0c062599c73b343fd152cb401e828c3d" +SRC_URI[cfg-if-1.0.0.sha256sum] = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +SRC_URI[cpufeatures-0.2.5.sha256sum] = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +SRC_URI[cpython-0.7.1.sha256sum] = "3052106c29da7390237bc2310c1928335733b286287754ea85e6093d2495280e" +SRC_URI[crossbeam-0.8.2.sha256sum] = "2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c" +SRC_URI[crossbeam-channel-0.5.6.sha256sum] = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" +SRC_URI[crossbeam-deque-0.8.2.sha256sum] = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" +SRC_URI[crossbeam-epoch-0.9.13.sha256sum] = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a" +SRC_URI[crossbeam-queue-0.3.8.sha256sum] = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +SRC_URI[crossbeam-utils-0.8.14.sha256sum] = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" +SRC_URI[crypto-common-0.1.6.sha256sum] = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +SRC_URI[digest-0.10.6.sha256sum] = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +SRC_URI[encoding-0.2.33.sha256sum] = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" +SRC_URI[encoding-index-japanese-1.20141219.5.sha256sum] = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" +SRC_URI[encoding-index-korean-1.20141219.5.sha256sum] = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" +SRC_URI[encoding-index-simpchinese-1.20141219.5.sha256sum] = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" +SRC_URI[encoding-index-singlebyte-1.20141219.5.sha256sum] = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" +SRC_URI[encoding-index-tradchinese-1.20141219.5.sha256sum] = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" +SRC_URI[encoding_index_tests-0.1.4.sha256sum] = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" +SRC_URI[env_logger-0.10.0.sha256sum] = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" +SRC_URI[errno-0.2.8.sha256sum] = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" +SRC_URI[errno-dragonfly-0.1.2.sha256sum] = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +SRC_URI[fastrand-1.8.0.sha256sum] = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" +SRC_URI[generic-array-0.14.6.sha256sum] = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +SRC_URI[getrandom-0.2.8.sha256sum] = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +SRC_URI[hermit-abi-0.1.19.sha256sum] = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +SRC_URI[hermit-abi-0.2.6.sha256sum] = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +SRC_URI[hmac-0.12.1.sha256sum] = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +SRC_URI[httparse-1.8.0.sha256sum] = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +SRC_URI[humantime-2.1.0.sha256sum] = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +SRC_URI[instant-0.1.12.sha256sum] = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +SRC_URI[io-lifetimes-1.0.3.sha256sum] = "46112a93252b123d31a119a8d1a1ac19deac4fac6e0e8b0df58f0d4e5870e63c" +SRC_URI[is-terminal-0.4.1.sha256sum] = "927609f78c2913a6f6ac3c27a4fe87f43e2a35367c0c4b0f8265e8f49a104330" +SRC_URI[itoa-1.0.5.sha256sum] = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" +SRC_URI[libc-0.2.138.sha256sum] = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" +SRC_URI[libsystemd-0.5.0.sha256sum] = "8144587c71c16756b1055d3dcb0c75cb605a10ecd6523cc33702d5f90902bf6d" +SRC_URI[linux-raw-sys-0.1.4.sha256sum] = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" +SRC_URI[log-0.4.17.sha256sum] = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +SRC_URI[memchr-2.5.0.sha256sum] = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +SRC_URI[memoffset-0.6.5.sha256sum] = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +SRC_URI[memoffset-0.7.1.sha256sum] = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +SRC_URI[minimal-lexical-0.2.1.sha256sum] = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +SRC_URI[mio-0.8.5.sha256sum] = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" +SRC_URI[nix-0.23.2.sha256sum] = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" +SRC_URI[nix-0.26.1.sha256sum] = "46a58d1d356c6597d08cde02c2f09d785b09e28711837b1ed667dc652c08a694" +SRC_URI[nom-7.1.1.sha256sum] = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" +SRC_URI[num-traits-0.2.15.sha256sum] = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +SRC_URI[num_cpus-1.14.0.sha256sum] = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5" +SRC_URI[num_threads-0.1.6.sha256sum] = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +SRC_URI[once_cell-1.16.0.sha256sum] = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" +SRC_URI[paste-1.0.11.sha256sum] = "d01a5bd0424d00070b0098dd17ebca6f961a959dead1dbcbbbc1d1cd8d3deeba" +SRC_URI[pin-utils-0.1.0.sha256sum] = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +SRC_URI[ppv-lite86-0.2.17.sha256sum] = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +SRC_URI[proc-macro2-1.0.49.sha256sum] = "57a8eca9f9c4ffde41714334dee777596264c7825420f521abc92b5b5deb63a5" +SRC_URI[python3-sys-0.7.1.sha256sum] = "49f8b50d72fb3015735aa403eebf19bbd72c093bfeeae24ee798be5f2f1aab52" +SRC_URI[quote-1.0.23.sha256sum] = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +SRC_URI[rand-0.8.5.sha256sum] = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +SRC_URI[rand_chacha-0.3.1.sha256sum] = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +SRC_URI[rand_core-0.6.4.sha256sum] = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +SRC_URI[redox_syscall-0.2.16.sha256sum] = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +SRC_URI[regex-1.7.0.sha256sum] = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" +SRC_URI[regex-syntax-0.6.28.sha256sum] = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" +SRC_URI[remove_dir_all-0.5.3.sha256sum] = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +SRC_URI[rustix-0.36.5.sha256sum] = "a3807b5d10909833d3e9acd1eb5fb988f79376ff10fce42937de71a449c4c588" +SRC_URI[scopeguard-1.1.0.sha256sum] = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +SRC_URI[serde-1.0.151.sha256sum] = "97fed41fc1a24994d044e6db6935e69511a1153b52c15eb42493b26fa87feba0" +SRC_URI[serde_derive-1.0.151.sha256sum] = "255abe9a125a985c05190d687b320c12f9b1f0b99445e608c21ba0782c719ad8" +SRC_URI[sha2-0.10.6.sha256sum] = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +SRC_URI[signal-hook-0.3.14.sha256sum] = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d" +SRC_URI[signal-hook-registry-1.4.0.sha256sum] = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +SRC_URI[simplelog-0.12.0.sha256sum] = "48dfff04aade74dd495b007c831cd6f4e0cee19c344dd9dc0884c0289b70a786" +SRC_URI[spmc-0.3.0.sha256sum] = "02a8428da277a8e3a15271d79943e80ccc2ef254e78813a166a08d65e4c3ece5" +SRC_URI[static_assertions-1.1.0.sha256sum] = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +SRC_URI[subtle-2.4.1.sha256sum] = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +SRC_URI[syn-1.0.107.sha256sum] = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" +SRC_URI[tempfile-3.3.0.sha256sum] = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +SRC_URI[termcolor-1.1.3.sha256sum] = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +SRC_URI[thiserror-1.0.38.sha256sum] = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +SRC_URI[thiserror-impl-1.0.38.sha256sum] = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" +SRC_URI[threadpool-1.8.1.sha256sum] = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +SRC_URI[time-0.3.17.sha256sum] = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" +SRC_URI[time-core-0.1.0.sha256sum] = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" +SRC_URI[time-macros-0.2.6.sha256sum] = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" +SRC_URI[typenum-1.16.0.sha256sum] = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +SRC_URI[unicode-ident-1.0.6.sha256sum] = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" +SRC_URI[urlencoding-2.1.2.sha256sum] = "e8db7427f936968176eaa7cdf81b7f98b980b18495ec28f1b5791ac3bfe3eea9" +SRC_URI[uuid-0.8.2.sha256sum] = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +SRC_URI[version_check-0.9.4.sha256sum] = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +SRC_URI[wasi-0.11.0+wasi-snapshot-preview1.sha256sum] = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +SRC_URI[winapi-0.3.9.sha256sum] = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +SRC_URI[winapi-i686-pc-windows-gnu-0.4.0.sha256sum] = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +SRC_URI[winapi-util-0.1.5.sha256sum] = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +SRC_URI[winapi-x86_64-pc-windows-gnu-0.4.0.sha256sum] = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +SRC_URI[windows-sys-0.42.0.sha256sum] = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +SRC_URI[windows_aarch64_gnullvm-0.42.0.sha256sum] = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" +SRC_URI[windows_aarch64_msvc-0.42.0.sha256sum] = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" +SRC_URI[windows_i686_gnu-0.42.0.sha256sum] = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" +SRC_URI[windows_i686_msvc-0.42.0.sha256sum] = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" +SRC_URI[windows_x86_64_gnu-0.42.0.sha256sum] = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" +SRC_URI[windows_x86_64_gnullvm-0.42.0.sha256sum] = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" +SRC_URI[windows_x86_64_msvc-0.42.0.sha256sum] = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" diff --git a/meta-python/recipes-devtools/python/python3-pyruvate/0001-check-for-mips-targets-for-stat.st_dev-definitions.patch b/meta-python/recipes-devtools/python/python3-pyruvate/0001-check-for-mips-targets-for-stat.st_dev-definitions.patch index f41e6cf116..3f8256b027 100644 --- a/meta-python/recipes-devtools/python/python3-pyruvate/0001-check-for-mips-targets-for-stat.st_dev-definitions.patch +++ b/meta-python/recipes-devtools/python/python3-pyruvate/0001-check-for-mips-targets-for-stat.st_dev-definitions.patch @@ -19,7 +19,9 @@ currently the build fails on mips archirecture with type mismatches 296 | device: stat.st_dev, | ^^^^^^^^^^^ expected `u64`, found `u32` -Upstream-Status: Submitted [https://github.com/lucab/libsystemd-rs/pull/103] +Drop this patch when libsystemd-rs crate bumps to 0.6.0+ + +Upstream-Status: Backport [https://github.com/lucab/libsystemd-rs/pull/104] Signed-off-by: Khem Raj <raj.khem@gmail.com> --- src/logging.rs | 3 +++ diff --git a/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Define-O_LARGEFILE-for-riscv32.patch b/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Define-O_LARGEFILE-for-riscv32.patch new file mode 100644 index 0000000000..621249c483 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Define-O_LARGEFILE-for-riscv32.patch @@ -0,0 +1,21 @@ +From fdf98602ad20d06ebf65574541caac68ca421ac4 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Sat, 8 Apr 2023 09:19:53 -0700 +Subject: [PATCH] musl: Define O_LARGEFILE for riscv32 + +Upstream-Status: Submitted [https://github.com/rust-lang/libc/pull/3191] +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + src/unix/linux_like/linux/musl/b32/riscv32/mod.rs | 1 + + 1 file changed, 1 insertion(+) + +--- a/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs ++++ b/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs +@@ -370,6 +370,7 @@ pub const __SIZEOF_PTHREAD_CONDATTR_T: u + pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; + pub const O_DIRECT: ::c_int = 16384; + pub const O_DIRECTORY: ::c_int = 65536; ++pub const O_LARGEFILE: ::c_int = 0o0100000; + pub const O_NOFOLLOW: ::c_int = 131072; + pub const MAP_HUGETLB: ::c_int = 262144; + pub const MAP_LOCKED: ::c_int = 8192; diff --git a/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Define-SOCK_NONBLOCK-with-O_NONBLOCK.patch b/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Define-SOCK_NONBLOCK-with-O_NONBLOCK.patch new file mode 100644 index 0000000000..e19b50d30d --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Define-SOCK_NONBLOCK-with-O_NONBLOCK.patch @@ -0,0 +1,99 @@ +From f2b06fa4ea6ec9a33f8b269f0a1730a26276c5b0 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Sat, 8 Apr 2023 08:25:46 -0700 +Subject: [PATCH] musl: Define SOCK_NONBLOCK with O_NONBLOCK + +Much like glibc, these defines are same on musl [1] [2] +therefore consolidate the definition in one place +for SOCK_NONBLOCK + +[1] https://github.com/search?q=repo%3Abminor%2Fmusl++%22%23define+SOCK_NONBLOCK%22&type=code +[2] https://github.com/search?q=repo%3Abminor%2Fmusl++%22%23define+O_NONBLOCK%22&type=code + +Upstream-Status: Submitted [https://github.com/rust-lang/libc/pull/3191] +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + src/unix/linux_like/linux/musl/b32/arm/mod.rs | 2 -- + src/unix/linux_like/linux/musl/b32/hexagon.rs | 1 - + src/unix/linux_like/linux/musl/b32/mips/mod.rs | 2 -- + src/unix/linux_like/linux/musl/b32/powerpc.rs | 2 -- + src/unix/linux_like/linux/musl/b32/x86/mod.rs | 2 -- + src/unix/linux_like/linux/musl/b64/mod.rs | 2 -- + src/unix/linux_like/linux/musl/mod.rs | 1 + + 7 files changed, 1 insertion(+), 11 deletions(-) + +--- a/src/unix/linux_like/linux/musl/b32/arm/mod.rs ++++ b/src/unix/linux_like/linux/musl/b32/arm/mod.rs +@@ -311,8 +311,6 @@ pub const O_SYNC: ::c_int = 1052672; + pub const O_RSYNC: ::c_int = 1052672; + pub const O_DSYNC: ::c_int = 4096; + +-pub const SOCK_NONBLOCK: ::c_int = 2048; +- + pub const MAP_ANON: ::c_int = 0x0020; + pub const MAP_GROWSDOWN: ::c_int = 0x0100; + pub const MAP_DENYWRITE: ::c_int = 0x0800; +--- a/src/unix/linux_like/linux/musl/b32/hexagon.rs ++++ b/src/unix/linux_like/linux/musl/b32/hexagon.rs +@@ -295,7 +295,6 @@ pub const SIG_SETMASK: ::c_int = 2; // F + pub const SIG_BLOCK: ::c_int = 0x000000; + pub const SIG_UNBLOCK: ::c_int = 0x01; + pub const SOCK_DGRAM: ::c_int = 2; +-pub const SOCK_NONBLOCK: ::c_int = 2048; + pub const SOCK_SEQPACKET: ::c_int = 5; + pub const SOCK_STREAM: ::c_int = 1; + pub const SOL_CAIF: ::c_int = 278; +--- a/src/unix/linux_like/linux/musl/b32/mips/mod.rs ++++ b/src/unix/linux_like/linux/musl/b32/mips/mod.rs +@@ -250,8 +250,6 @@ pub const O_SYNC: ::c_int = 0o40020; + pub const O_RSYNC: ::c_int = 0o40020; + pub const O_DSYNC: ::c_int = 0o020; + +-pub const SOCK_NONBLOCK: ::c_int = 0o200; +- + pub const MAP_ANON: ::c_int = 0x800; + pub const MAP_GROWSDOWN: ::c_int = 0x1000; + pub const MAP_DENYWRITE: ::c_int = 0x2000; +--- a/src/unix/linux_like/linux/musl/b32/powerpc.rs ++++ b/src/unix/linux_like/linux/musl/b32/powerpc.rs +@@ -243,8 +243,6 @@ pub const O_SYNC: ::c_int = 1052672; + pub const O_RSYNC: ::c_int = 1052672; + pub const O_DSYNC: ::c_int = 4096; + +-pub const SOCK_NONBLOCK: ::c_int = 2048; +- + pub const MAP_ANON: ::c_int = 0x0020; + pub const MAP_GROWSDOWN: ::c_int = 0x0100; + pub const MAP_DENYWRITE: ::c_int = 0x0800; +--- a/src/unix/linux_like/linux/musl/b32/x86/mod.rs ++++ b/src/unix/linux_like/linux/musl/b32/x86/mod.rs +@@ -300,8 +300,6 @@ pub const O_SYNC: ::c_int = 1052672; + pub const O_RSYNC: ::c_int = 1052672; + pub const O_DSYNC: ::c_int = 4096; + +-pub const SOCK_NONBLOCK: ::c_int = 2048; +- + pub const MAP_ANON: ::c_int = 0x0020; + pub const MAP_GROWSDOWN: ::c_int = 0x0100; + pub const MAP_DENYWRITE: ::c_int = 0x0800; +--- a/src/unix/linux_like/linux/musl/b64/mod.rs ++++ b/src/unix/linux_like/linux/musl/b64/mod.rs +@@ -133,8 +133,6 @@ s! { + pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; + pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; + +-pub const SOCK_NONBLOCK: ::c_int = 2048; +- + pub const SOCK_SEQPACKET: ::c_int = 5; + + extern "C" { +--- a/src/unix/linux_like/linux/musl/mod.rs ++++ b/src/unix/linux_like/linux/musl/mod.rs +@@ -527,6 +527,7 @@ pub const POSIX_MADV_DONTNEED: ::c_int = + pub const MAP_ANONYMOUS: ::c_int = MAP_ANON; + + pub const SOCK_DCCP: ::c_int = 6; ++pub const SOCK_NONBLOCK: ::c_int = O_NONBLOCK; + pub const SOCK_PACKET: ::c_int = 10; + + pub const SOMAXCONN: ::c_int = 128; diff --git a/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Define-SOCK_SEQPACKET-in-common-place.patch b/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Define-SOCK_SEQPACKET-in-common-place.patch new file mode 100644 index 0000000000..2da3a43154 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Define-SOCK_SEQPACKET-in-common-place.patch @@ -0,0 +1,92 @@ +From e00da82cd46221bfb650895c9cea65082da66b4e Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Sat, 8 Apr 2023 09:25:31 -0700 +Subject: [PATCH] musl: Define SOCK_SEQPACKET in common place + +This define is not architecture specific in musl [1] + +[1] https://git.musl-libc.org/cgit/musl/tree/include/sys/socket.h#n90 + +Upstream-Status: Submitted [https://github.com/rust-lang/libc/pull/3191] +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + src/unix/linux_like/linux/musl/b32/arm/mod.rs | 1 - + src/unix/linux_like/linux/musl/b32/hexagon.rs | 1 - + src/unix/linux_like/linux/musl/b32/mips/mod.rs | 1 - + src/unix/linux_like/linux/musl/b32/powerpc.rs | 1 - + src/unix/linux_like/linux/musl/b32/x86/mod.rs | 1 - + src/unix/linux_like/linux/musl/b64/mod.rs | 2 -- + src/unix/linux_like/linux/musl/mod.rs | 1 + + 7 files changed, 1 insertion(+), 7 deletions(-) + +--- a/src/unix/linux_like/linux/musl/b32/arm/mod.rs ++++ b/src/unix/linux_like/linux/musl/b32/arm/mod.rs +@@ -324,7 +324,6 @@ pub const MAP_SYNC: ::c_int = 0x080000; + + pub const SOCK_STREAM: ::c_int = 1; + pub const SOCK_DGRAM: ::c_int = 2; +-pub const SOCK_SEQPACKET: ::c_int = 5; + + pub const EDEADLK: ::c_int = 35; + pub const ENAMETOOLONG: ::c_int = 36; +--- a/src/unix/linux_like/linux/musl/b32/hexagon.rs ++++ b/src/unix/linux_like/linux/musl/b32/hexagon.rs +@@ -292,7 +292,6 @@ pub const SIG_SETMASK: ::c_int = 2; // F + pub const SIG_BLOCK: ::c_int = 0x000000; + pub const SIG_UNBLOCK: ::c_int = 0x01; + pub const SOCK_DGRAM: ::c_int = 2; +-pub const SOCK_SEQPACKET: ::c_int = 5; + pub const SOCK_STREAM: ::c_int = 1; + pub const SOL_CAIF: ::c_int = 278; + pub const SOL_IUCV: ::c_int = 277; +--- a/src/unix/linux_like/linux/musl/b32/mips/mod.rs ++++ b/src/unix/linux_like/linux/musl/b32/mips/mod.rs +@@ -348,7 +348,6 @@ pub const ERFKILL: ::c_int = 167; + + pub const SOCK_STREAM: ::c_int = 2; + pub const SOCK_DGRAM: ::c_int = 1; +-pub const SOCK_SEQPACKET: ::c_int = 5; + + pub const SA_ONSTACK: ::c_int = 0x08000000; + pub const SA_SIGINFO: ::c_int = 8; +--- a/src/unix/linux_like/linux/musl/b32/powerpc.rs ++++ b/src/unix/linux_like/linux/musl/b32/powerpc.rs +@@ -255,7 +255,6 @@ pub const MAP_STACK: ::c_int = 0x020000; + + pub const SOCK_STREAM: ::c_int = 1; + pub const SOCK_DGRAM: ::c_int = 2; +-pub const SOCK_SEQPACKET: ::c_int = 5; + + pub const EDEADLK: ::c_int = 35; + pub const ENAMETOOLONG: ::c_int = 36; +--- a/src/unix/linux_like/linux/musl/b32/x86/mod.rs ++++ b/src/unix/linux_like/linux/musl/b32/x86/mod.rs +@@ -313,7 +313,6 @@ pub const MAP_SYNC: ::c_int = 0x080000; + + pub const SOCK_STREAM: ::c_int = 1; + pub const SOCK_DGRAM: ::c_int = 2; +-pub const SOCK_SEQPACKET: ::c_int = 5; + + pub const EDEADLK: ::c_int = 35; + pub const ENAMETOOLONG: ::c_int = 36; +--- a/src/unix/linux_like/linux/musl/b64/mod.rs ++++ b/src/unix/linux_like/linux/musl/b64/mod.rs +@@ -133,8 +133,6 @@ s! { + pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; + pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; + +-pub const SOCK_SEQPACKET: ::c_int = 5; +- + extern "C" { + pub fn getrandom(buf: *mut ::c_void, buflen: ::size_t, flags: ::c_uint) -> ::ssize_t; + } +--- a/src/unix/linux_like/linux/musl/mod.rs ++++ b/src/unix/linux_like/linux/musl/mod.rs +@@ -530,6 +530,7 @@ pub const POSIX_MADV_DONTNEED: ::c_int = + + pub const MAP_ANONYMOUS: ::c_int = MAP_ANON; + ++pub const SOCK_SEQPACKET: ::c_int = 5; + pub const SOCK_DCCP: ::c_int = 6; + pub const SOCK_NONBLOCK: ::c_int = O_NONBLOCK; + pub const SOCK_PACKET: ::c_int = 10; diff --git a/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Move-F_OFD_GETLK-F_OFD_SETLK-and-F_OFD_SETLKW-t.patch b/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Move-F_OFD_GETLK-F_OFD_SETLK-and-F_OFD_SETLKW-t.patch new file mode 100644 index 0000000000..9c93434e03 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Move-F_OFD_GETLK-F_OFD_SETLK-and-F_OFD_SETLKW-t.patch @@ -0,0 +1,140 @@ +From e4f6d7b6d57e83633814c54d93dff292ed0e4609 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Sat, 8 Apr 2023 09:01:54 -0700 +Subject: [PATCH] musl: Move F_OFD_GETLK, F_OFD_SETLK and F_OFD_SETLKW to + common location + +These defines are not architecture specific in musl [1] therefore move them +to be common + +[1] https://git.musl-libc.org/cgit/musl/tree/include/fcntl.h#n48 + +Upstream-Status: Submitted [https://github.com/rust-lang/libc/pull/3191] +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + src/unix/linux_like/linux/musl/b32/arm/mod.rs | 3 --- + src/unix/linux_like/linux/musl/b32/hexagon.rs | 3 --- + src/unix/linux_like/linux/musl/b32/mips/mod.rs | 3 --- + src/unix/linux_like/linux/musl/b32/powerpc.rs | 3 --- + src/unix/linux_like/linux/musl/b32/x86/mod.rs | 3 --- + src/unix/linux_like/linux/musl/b64/aarch64/mod.rs | 3 --- + src/unix/linux_like/linux/musl/b64/mips64.rs | 3 --- + src/unix/linux_like/linux/musl/mod.rs | 4 ++++ + 8 files changed, 4 insertions(+), 21 deletions(-) + +diff --git a/src/unix/linux_like/linux/musl/b32/arm/mod.rs b/src/unix/linux_like/linux/musl/b32/arm/mod.rs +index c47fa2c4c..3c8978e4f 100644 +--- a/src/unix/linux_like/linux/musl/b32/arm/mod.rs ++++ b/src/unix/linux_like/linux/musl/b32/arm/mod.rs +@@ -451,9 +451,6 @@ pub const F_GETOWN: ::c_int = 9; + pub const F_SETLK: ::c_int = 13; + pub const F_SETLKW: ::c_int = 14; + pub const F_SETOWN: ::c_int = 8; +-pub const F_OFD_GETLK: ::c_int = 36; +-pub const F_OFD_SETLK: ::c_int = 37; +-pub const F_OFD_SETLKW: ::c_int = 38; + + pub const VEOF: usize = 4; + pub const VEOL: usize = 11; +diff --git a/src/unix/linux_like/linux/musl/b32/hexagon.rs b/src/unix/linux_like/linux/musl/b32/hexagon.rs +index f83d208d5..720c603da 100644 +--- a/src/unix/linux_like/linux/musl/b32/hexagon.rs ++++ b/src/unix/linux_like/linux/musl/b32/hexagon.rs +@@ -225,9 +225,6 @@ pub const F_GETOWN_EX: ::c_int = 16; + pub const F_GETSIG: ::c_int = 11; + pub const F_LINUX_SPECIFIC_BASE: ::c_int = 1024; + pub const FLUSHO: ::c_int = 4096; +-pub const F_OFD_GETLK: ::c_int = 36; +-pub const F_OFD_SETLK: ::c_int = 37; +-pub const F_OFD_SETLKW: ::c_int = 38; + pub const F_OWNER_PGRP: ::c_int = 2; + pub const F_OWNER_PID: ::c_int = 1; + pub const F_OWNER_TID: ::c_int = 0; +diff --git a/src/unix/linux_like/linux/musl/b32/mips/mod.rs b/src/unix/linux_like/linux/musl/b32/mips/mod.rs +index d09b8278e..69e20ce32 100644 +--- a/src/unix/linux_like/linux/musl/b32/mips/mod.rs ++++ b/src/unix/linux_like/linux/musl/b32/mips/mod.rs +@@ -388,9 +388,6 @@ pub const F_GETOWN: ::c_int = 23; + pub const F_SETLK: ::c_int = 34; + pub const F_SETLKW: ::c_int = 35; + pub const F_SETOWN: ::c_int = 24; +-pub const F_OFD_GETLK: ::c_int = 36; +-pub const F_OFD_SETLK: ::c_int = 37; +-pub const F_OFD_SETLKW: ::c_int = 38; + + pub const VEOF: usize = 16; + pub const VEOL: usize = 17; +diff --git a/src/unix/linux_like/linux/musl/b32/powerpc.rs b/src/unix/linux_like/linux/musl/b32/powerpc.rs +index 3b998329b..63bc9163d 100644 +--- a/src/unix/linux_like/linux/musl/b32/powerpc.rs ++++ b/src/unix/linux_like/linux/musl/b32/powerpc.rs +@@ -384,9 +384,6 @@ pub const F_GETOWN: ::c_int = 9; + pub const F_SETLK: ::c_int = 13; + pub const F_SETLKW: ::c_int = 14; + pub const F_SETOWN: ::c_int = 8; +-pub const F_OFD_GETLK: ::c_int = 36; +-pub const F_OFD_SETLK: ::c_int = 37; +-pub const F_OFD_SETLKW: ::c_int = 38; + + pub const VEOF: usize = 4; + pub const VEOL: usize = 6; +diff --git a/src/unix/linux_like/linux/musl/b32/x86/mod.rs b/src/unix/linux_like/linux/musl/b32/x86/mod.rs +index c319b91b6..52ecf3c7e 100644 +--- a/src/unix/linux_like/linux/musl/b32/x86/mod.rs ++++ b/src/unix/linux_like/linux/musl/b32/x86/mod.rs +@@ -441,9 +441,6 @@ pub const F_GETOWN: ::c_int = 9; + pub const F_SETLK: ::c_int = 13; + pub const F_SETLKW: ::c_int = 14; + pub const F_SETOWN: ::c_int = 8; +-pub const F_OFD_GETLK: ::c_int = 36; +-pub const F_OFD_SETLK: ::c_int = 37; +-pub const F_OFD_SETLKW: ::c_int = 38; + + pub const VEOF: usize = 4; + pub const VEOL: usize = 11; +diff --git a/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs b/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs +index 14b4bc6d6..522493ff3 100644 +--- a/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs ++++ b/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs +@@ -250,9 +250,6 @@ pub const F_GETOWN: ::c_int = 9; + pub const F_SETLK: ::c_int = 6; + pub const F_SETLKW: ::c_int = 7; + pub const F_SETOWN: ::c_int = 8; +-pub const F_OFD_GETLK: ::c_int = 36; +-pub const F_OFD_SETLK: ::c_int = 37; +-pub const F_OFD_SETLKW: ::c_int = 38; + + pub const VEOF: usize = 4; + +diff --git a/src/unix/linux_like/linux/musl/b64/mips64.rs b/src/unix/linux_like/linux/musl/b64/mips64.rs +index 22ac91690..c7f041260 100644 +--- a/src/unix/linux_like/linux/musl/b64/mips64.rs ++++ b/src/unix/linux_like/linux/musl/b64/mips64.rs +@@ -612,9 +612,6 @@ pub const F_GETOWN: ::c_int = 23; + pub const F_SETOWN: ::c_int = 24; + pub const F_SETLK: ::c_int = 6; + pub const F_SETLKW: ::c_int = 7; +-pub const F_OFD_GETLK: ::c_int = 36; +-pub const F_OFD_SETLK: ::c_int = 37; +-pub const F_OFD_SETLKW: ::c_int = 38; + + pub const MCL_CURRENT: ::c_int = 0x0001; + pub const MCL_FUTURE: ::c_int = 0x0002; +diff --git a/src/unix/linux_like/linux/musl/mod.rs b/src/unix/linux_like/linux/musl/mod.rs +index 37a8ca2af..9a4fa7ca7 100644 +--- a/src/unix/linux_like/linux/musl/mod.rs ++++ b/src/unix/linux_like/linux/musl/mod.rs +@@ -506,6 +506,10 @@ pub const ECOMM: ::c_int = 70; + pub const EPROTO: ::c_int = 71; + pub const EDOTDOT: ::c_int = 73; + ++pub const F_OFD_GETLK: ::c_int = 36; ++pub const F_OFD_SETLK: ::c_int = 37; ++pub const F_OFD_SETLKW: ::c_int = 38; ++ + pub const F_RDLCK: ::c_int = 0; + pub const F_WRLCK: ::c_int = 1; + pub const F_UNLCK: ::c_int = 2; +-- +2.40.0 + diff --git a/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-riscv32-Define-F_SETLK-F_SETLKW-and-fix-F_GETLK.patch b/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-riscv32-Define-F_SETLK-F_SETLKW-and-fix-F_GETLK.patch new file mode 100644 index 0000000000..47969542c8 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-riscv32-Define-F_SETLK-F_SETLKW-and-fix-F_GETLK.patch @@ -0,0 +1,35 @@ +From b87552c504b53a5e5df2438adfe24e35b0168aba Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Sat, 8 Apr 2023 08:51:02 -0700 +Subject: [PATCH] musl/riscv32: Define F_SETLK, F_SETLKW and fix F_GETLK + +F_SETLK and F_SETLKW were not defined therefore define them +and F_GETLK value was not matching the musl port hence fixed + +Upstream-Status: Submitted [https://github.com/rust-lang/libc/pull/3191] +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + src/unix/linux_like/linux/musl/b32/riscv32/mod.rs | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs b/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs +index 9ce6a9fd3..e56ff4853 100644 +--- a/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs ++++ b/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs +@@ -339,9 +339,11 @@ pub const POLLWRBAND: ::c_short = 512; + pub const O_ASYNC: ::c_int = 8192; + pub const O_NDELAY: ::c_int = 2048; + pub const EFD_NONBLOCK: ::c_int = 2048; +-pub const F_GETLK: ::c_int = 5; +-pub const F_GETOWN: ::c_int = 9; + pub const F_SETOWN: ::c_int = 8; ++pub const F_GETOWN: ::c_int = 9; ++pub const F_GETLK: ::c_int = 12; ++pub const F_SETLK: ::c_int = 13; ++pub const F_SETLKW: ::c_int = 14; + pub const SFD_NONBLOCK: ::c_int = 2048; + pub const TCSANOW: ::c_int = 0; + pub const TCSADRAIN: ::c_int = 1; +-- +2.40.0 + diff --git a/meta-python/recipes-devtools/python/python3-pyruvate_1.1.2.bb b/meta-python/recipes-devtools/python/python3-pyruvate_1.1.2.bb deleted file mode 100644 index 1f1c186d31..0000000000 --- a/meta-python/recipes-devtools/python/python3-pyruvate_1.1.2.bb +++ /dev/null @@ -1,133 +0,0 @@ -SUMMARY = "WSGI server implemented in Rust." -DESCRIPTION = "Pyruvate is a reasonably fast, multithreaded, non-blocking \ -WSGI server implemented in Rust." -HOMEPAGE = "https://gitlab.com/tschorr/pyruvate" -BUGTRACKER = "https://gitlab.com/tschorr/pyruvate/-/issues" - -LICENSE = "GPL-2.0-only" -LIC_FILES_CHKSUM = "file://LICENSE;md5=051b48e640a6e2d795eac75542d9417c \ - file://LICENSE.GPL;md5=b234ee4d69f5fce4486a80fdaf4a4263" - -SRC_URI[sha256sum] = "10befedd97e73fc18b902d02aa3b24e8978aa162242c1b664849c886c0675899" - -S = "${WORKDIR}/pyruvate-${PV}" - -inherit pypi python_setuptools3_rust - -PIP_INSTALL_DIST_PATH = "${S}/dist" - -# crossbeam-* -> std::sync::atomic AtomicI64, AtomicU64 -# not supported on mips/powerpc with 32-bit pointers -# https://doc.rust-lang.org/std/sync/atomic/#portability -RUSTFLAGS:append:mips = " --cfg crossbeam_no_atomic_64" -RUSTFLAGS:append:mipsel = " --cfg crossbeam_no_atomic_64" -RUSTFLAGS:append:powerpc = " --cfg crossbeam_no_atomic_64" -RUSTFLAGS:append:riscv32 = " --cfg crossbeam_no_atomic_64" - -SRC_URI += " \ - crate://crates.io/aho-corasick/0.7.18 \ - crate://crates.io/atty/0.2.14 \ - crate://crates.io/autocfg/1.0.1 \ - crate://crates.io/bitflags/1.3.2 \ - crate://crates.io/block-buffer/0.9.0 \ - crate://crates.io/cc/1.0.72 \ - crate://crates.io/cfg-if/1.0.0 \ - crate://crates.io/chrono/0.4.19 \ - crate://crates.io/cpufeatures/0.2.1 \ - crate://crates.io/cpython/0.7.0 \ - crate://crates.io/crossbeam-channel/0.5.2 \ - crate://crates.io/crossbeam-deque/0.8.1 \ - crate://crates.io/crossbeam-epoch/0.9.6 \ - crate://crates.io/crossbeam-queue/0.3.3 \ - crate://crates.io/crossbeam-utils/0.8.6 \ - crate://crates.io/crossbeam/0.8.1 \ - crate://crates.io/crypto-mac/0.11.1 \ - crate://crates.io/ctrlc/3.2.1 \ - crate://crates.io/digest/0.9.0 \ - crate://crates.io/encoding-index-japanese/1.20141219.5 \ - crate://crates.io/encoding-index-korean/1.20141219.5 \ - crate://crates.io/encoding-index-simpchinese/1.20141219.5 \ - crate://crates.io/encoding-index-singlebyte/1.20141219.5 \ - crate://crates.io/encoding-index-tradchinese/1.20141219.5 \ - crate://crates.io/encoding/0.2.33 \ - crate://crates.io/encoding_index_tests/0.1.4 \ - crate://crates.io/env_logger/0.9.0 \ - crate://crates.io/errno-dragonfly/0.1.2 \ - crate://crates.io/errno/0.2.8 \ - crate://crates.io/fastrand/1.6.0 \ - crate://crates.io/generic-array/0.14.5 \ - crate://crates.io/getrandom/0.2.3 \ - crate://crates.io/hermit-abi/0.1.19 \ - crate://crates.io/hmac/0.11.0 \ - crate://crates.io/httparse/1.5.1 \ - crate://crates.io/humantime/2.1.0 \ - crate://crates.io/instant/0.1.12 \ - crate://crates.io/lazy_static/1.4.0 \ - crate://crates.io/libc/0.2.120 \ - crate://crates.io/libsystemd/0.4.1 \ - crate://crates.io/log/0.4.14 \ - crate://crates.io/memchr/2.4.1 \ - crate://crates.io/memoffset/0.6.5 \ - crate://crates.io/mio/0.8.0 \ - crate://crates.io/miow/0.3.7 \ - crate://crates.io/nix/0.23.1 \ - crate://crates.io/ntapi/0.3.6 \ - crate://crates.io/num-integer/0.1.44 \ - crate://crates.io/num-traits/0.2.14 \ - crate://crates.io/num_cpus/1.13.1 \ - crate://crates.io/once_cell/1.9.0 \ - crate://crates.io/opaque-debug/0.3.0 \ - crate://crates.io/paste/1.0.6 \ - crate://crates.io/ppv-lite86/0.2.16 \ - crate://crates.io/proc-macro2/1.0.36 \ - crate://crates.io/python3-sys/0.7.0 \ - crate://crates.io/quote/1.0.14 \ - crate://crates.io/rand/0.8.4 \ - crate://crates.io/rand_chacha/0.3.1 \ - crate://crates.io/rand_core/0.6.3 \ - crate://crates.io/rand_hc/0.3.1 \ - crate://crates.io/redox_syscall/0.2.10 \ - crate://crates.io/regex-syntax/0.6.25 \ - crate://crates.io/regex/1.5.4 \ - crate://crates.io/remove_dir_all/0.5.3 \ - crate://crates.io/scopeguard/1.1.0 \ - crate://crates.io/serde/1.0.133 \ - crate://crates.io/serde_derive/1.0.133 \ - crate://crates.io/sha2/0.9.9 \ - crate://crates.io/simplelog/0.11.1 \ - crate://crates.io/spmc/0.3.0 \ - crate://crates.io/subtle/2.4.1 \ - crate://crates.io/syn/1.0.85 \ - crate://crates.io/tempfile/3.3.0 \ - crate://crates.io/termcolor/1.1.2 \ - crate://crates.io/thiserror-impl/1.0.30 \ - crate://crates.io/thiserror/1.0.30 \ - crate://crates.io/threadpool/1.8.1 \ - crate://crates.io/time/0.1.44 \ - crate://crates.io/typenum/1.15.0 \ - crate://crates.io/unicode-xid/0.2.2 \ - crate://crates.io/urlencoding/2.1.0 \ - crate://crates.io/uuid/0.8.2 \ - crate://crates.io/version_check/0.9.4 \ - crate://crates.io/wasi/0.10.0+wasi-snapshot-preview1 \ - crate://crates.io/winapi-i686-pc-windows-gnu/0.4.0 \ - crate://crates.io/winapi-util/0.1.5 \ - crate://crates.io/winapi-x86_64-pc-windows-gnu/0.4.0 \ - crate://crates.io/winapi/0.3.9 \ -" -SRC_URI += "\ - file://0001-linux.rs-Define-consts-for-rv32-architecture.patch;patchdir=../cargo_home/bitbake/nix-0.23.1/ \ - " -SRC_URI:append:mips = " file://0001-check-for-mips-targets-for-stat.st_dev-definitions.patch;patchdir=../cargo_home/bitbake/libsystemd-0.4.1/" - -# The following configs & dependencies are from setuptools extras_require. -# These dependencies are optional, hence can be controlled via PACKAGECONFIG. -# The upstream names may not correspond exactly to bitbake package names. -# -# Uncomment this line to enable all the optional features. -#PACKAGECONFIG ?= "test" -PACKAGECONFIG[test] = ",,,python3-pytest python3-requests" - -# WARNING: the following rdepends are determined through basic analysis of the -# python sources, and might not be 100% accurate. -RDEPENDS:${PN} += "python3-core" diff --git a/meta-python/recipes-devtools/python/python3-pyruvate_1.2.1.bb b/meta-python/recipes-devtools/python/python3-pyruvate_1.2.1.bb new file mode 100644 index 0000000000..2807c054d9 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyruvate_1.2.1.bb @@ -0,0 +1,47 @@ +SUMMARY = "WSGI server implemented in Rust." +DESCRIPTION = "Pyruvate is a reasonably fast, multithreaded, non-blocking \ +WSGI server implemented in Rust." +HOMEPAGE = "https://gitlab.com/tschorr/pyruvate" +BUGTRACKER = "https://gitlab.com/tschorr/pyruvate/-/issues" + +LICENSE = "GPL-2.0-only" +LIC_FILES_CHKSUM = "file://LICENSE;md5=b234ee4d69f5fce4486a80fdaf4a4263" + +SRC_URI += "\ + git://gitlab.com/tschorr/pyruvate.git;protocol=https;branch=main \ + file://0001-linux.rs-Define-consts-for-rv32-architecture.patch;patchdir=../cargo_home/bitbake/nix-0.23.2/ \ + file://0001-musl-Define-SOCK_NONBLOCK-with-O_NONBLOCK.patch;patchdir=../cargo_home/bitbake/libc-0.2.138/ \ + file://0001-musl-riscv32-Define-F_SETLK-F_SETLKW-and-fix-F_GETLK.patch;patchdir=../cargo_home/bitbake/libc-0.2.138/ \ + file://0001-musl-Move-F_OFD_GETLK-F_OFD_SETLK-and-F_OFD_SETLKW-t.patch;patchdir=../cargo_home/bitbake/libc-0.2.138/ \ + file://0001-musl-Define-O_LARGEFILE-for-riscv32.patch;patchdir=../cargo_home/bitbake/libc-0.2.138/ \ + file://0001-musl-Define-SOCK_SEQPACKET-in-common-place.patch;patchdir=../cargo_home/bitbake/libc-0.2.138/ \ +" +SRCREV = "57db64c9f65ced05c71b8d786c1cedfaa2991597" + +SRC_URI:append:mips = " file://0001-check-for-mips-targets-for-stat.st_dev-definitions.patch;patchdir=../cargo_home/bitbake/libsystemd-0.5.0/" + +S = "${WORKDIR}/git" + +inherit python_setuptools3_rust cargo-update-recipe-crates + +# crossbeam-* -> std::sync::atomic AtomicI64, AtomicU64 +# not supported on mips/powerpc with 32-bit pointers +# https://doc.rust-lang.org/std/sync/atomic/#portability +RUSTFLAGS:append:mips = " --cfg crossbeam_no_atomic_64" +RUSTFLAGS:append:mipsel = " --cfg crossbeam_no_atomic_64" +RUSTFLAGS:append:powerpc = " --cfg crossbeam_no_atomic_64" +RUSTFLAGS:append:riscv32 = " --cfg crossbeam_no_atomic_64" + +require ${BPN}-crates.inc + +# The following configs & dependencies are from setuptools extras_require. +# These dependencies are optional, hence can be controlled via PACKAGECONFIG. +# The upstream names may not correspond exactly to bitbake package names. +# +# Uncomment this line to enable all the optional features. +#PACKAGECONFIG ?= "test" +PACKAGECONFIG[test] = ",,,python3-pytest python3-requests" + +# WARNING: the following rdepends are determined through basic analysis of the +# python sources, and might not be 100% accurate. +RDEPENDS:${PN} += "python3-core" diff --git a/meta-python/recipes-devtools/python/python3-pyscaffold_4.3.bb b/meta-python/recipes-devtools/python/python3-pyscaffold_4.5.bb index 027d7b9029..dda81e2256 100644 --- a/meta-python/recipes-devtools/python/python3-pyscaffold_4.3.bb +++ b/meta-python/recipes-devtools/python/python3-pyscaffold_4.5.bb @@ -9,7 +9,7 @@ LICENSE = "0BSD & MIT" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=14a49c74a1d91829908ac756c07e6b91" DEPENDS += "python3-setuptools-scm-native" -SRC_URI[sha256sum] = "1a8c39bbad9abc121d6e126035740ba5f043434abb432f368a3a76596184b3ed" +SRC_URI[sha256sum] = "d849f9a2e15bdcf165e19f96835f0b17e1a2d59d4c561c445b827a081de6d262" inherit pypi python_setuptools_build_meta PYPI_PACKAGE = "PyScaffold" diff --git a/meta-python/recipes-devtools/python/python3-pyserial/run-ptest b/meta-python/recipes-devtools/python/python3-pyserial/run-ptest index e301963f96..b651411db7 100644 --- a/meta-python/recipes-devtools/python/python3-pyserial/run-ptest +++ b/meta-python/recipes-devtools/python/python3-pyserial/run-ptest @@ -1,4 +1,4 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-pyserial_3.5.bb b/meta-python/recipes-devtools/python/python3-pyserial_3.5.bb index 15646235df..ade137a385 100644 --- a/meta-python/recipes-devtools/python/python3-pyserial_3.5.bb +++ b/meta-python/recipes-devtools/python/python3-pyserial_3.5.bb @@ -37,14 +37,14 @@ FILES:${PN}-win32 = " \ " RDEPENDS:${PN} = "\ - ${PYTHON_PN}-fcntl \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-stringold \ - ${PYTHON_PN}-threading \ + python3-fcntl \ + python3-io \ + python3-logging \ + python3-netclient \ + python3-numbers \ + python3-shell \ + python3-stringold \ + python3-threading \ " BBCLASSEXTEND = "native nativesdk" @@ -54,7 +54,8 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-pysonos_0.0.54.bb b/meta-python/recipes-devtools/python/python3-pysonos_0.0.54.bb index e8d75e9d75..6a484b8ae9 100644 --- a/meta-python/recipes-devtools/python/python3-pysonos_0.0.54.bb +++ b/meta-python/recipes-devtools/python/python3-pysonos_0.0.54.bb @@ -9,7 +9,7 @@ SRC_URI[sha256sum] = "2a72897cfd342382573632d80d38776884a38c8d02353d9d5da4e9e8e8 inherit pypi setuptools3 RDEPENDS:${PN} += "\ - ${PYTHON_PN}-ifaddr \ - ${PYTHON_PN}-requests \ - ${PYTHON_PN}-xmltodict \ + python3-ifaddr \ + python3-requests \ + python3-xmltodict \ " diff --git a/meta-python/recipes-devtools/python/python3-pystemd_0.10.0.bb b/meta-python/recipes-devtools/python/python3-pystemd_0.10.0.bb deleted file mode 100644 index da263fe94e..0000000000 --- a/meta-python/recipes-devtools/python/python3-pystemd_0.10.0.bb +++ /dev/null @@ -1,13 +0,0 @@ -SUMMARY = "Python bindings for interacting with systemd over DBus" -LICENSE = "LGPL-2.1-only" -LIC_FILES_CHKSUM = "file://LICENSE;md5=4fbd65380cdd255951079008b364516c" - -SRC_URI[sha256sum] = "d74a814bfda01085db1a8ad90be3cb27daf23a51ab6b03e7e29ec811fa2ae859" - -DEPENDS = "systemd" -RDEPENDS:${PN} += "python3-xml python3-pprint" -REQUIRED_DISTRO_FEATURES = "systemd" - -inherit pypi setuptools3 features_check pkgconfig - -BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-pystemd_0.13.2.bb b/meta-python/recipes-devtools/python/python3-pystemd_0.13.2.bb new file mode 100644 index 0000000000..3bfa20fcd9 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pystemd_0.13.2.bb @@ -0,0 +1,24 @@ +SUMMARY = "Python bindings for interacting with systemd over DBus" +LICENSE = "LGPL-2.1-only" +LIC_FILES_CHKSUM = "file://LICENSE;md5=4fbd65380cdd255951079008b364516c" + +SRC_URI[sha256sum] = "4dcfa4b13a55685c49d3d17c10631eca18c33770f66316f8ef2337b8951cc144" + +DEPENDS = "systemd python3-cython-native" +RDEPENDS:${PN} += "\ + python3-xml \ + python3-lxml \ + python3-pprint \ + python3-core \ + python3-shell \ + python3-io \ +" +REQUIRED_DISTRO_FEATURES = "systemd" + +inherit pypi setuptools3 features_check pkgconfig + +do_configure:prepend() { + rm -rf ${S}/pystemd/*.c +} + +BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-pytest-asyncio_0.16.0.bb b/meta-python/recipes-devtools/python/python3-pytest-asyncio_0.16.0.bb deleted file mode 100644 index 1dfeab6332..0000000000 --- a/meta-python/recipes-devtools/python/python3-pytest-asyncio_0.16.0.bb +++ /dev/null @@ -1,14 +0,0 @@ -DESCRIPTION = "pytest-asyncio is an Apache2 licensed library, written in Python, for testing asyncio code with pytest" - -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=d2794c0df5b907fdace235a619d80314" - -SRC_URI[sha256sum] = "7496c5977ce88c34379df64a66459fe395cd05543f0a2f837016e7144391fcfb" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-pytest \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pytest-asyncio_0.23.6.bb b/meta-python/recipes-devtools/python/python3-pytest-asyncio_0.23.6.bb new file mode 100644 index 0000000000..492020477e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pytest-asyncio_0.23.6.bb @@ -0,0 +1,16 @@ +DESCRIPTION = "pytest-asyncio is an Apache2 licensed library, written in Python, for testing asyncio code with pytest" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=136e4f49dbf29942c572a3a8f6e88a77" + +SRC_URI[sha256sum] = "ffe523a89c1c222598c76856e76852b787504ddb72dd5d9b6617ffa8aa2cde5f" + +inherit pypi python_setuptools_build_meta + +DEPENDS += "python3-setuptools-scm-native" + +RDEPENDS:${PN} += " \ + python3-pytest \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pytest-benchmark_3.4.1.bb b/meta-python/recipes-devtools/python/python3-pytest-benchmark_4.0.0.bb index bde9935ffe..98ba6c3822 100644 --- a/meta-python/recipes-devtools/python/python3-pytest-benchmark_3.4.1.bb +++ b/meta-python/recipes-devtools/python/python3-pytest-benchmark_4.0.0.bb @@ -1,12 +1,9 @@ -# Copyright (C) 2021 Khem Raj <raj.khem@gmail.com> -# Released under the MIT license (see COPYING.MIT for the terms) - SUMMARY = "A ``pytest`` fixture for benchmarking code. It will group the tests into rounds that are calibrated to the chosen timer." HOMEPAGE = "https://github.com/ionelmc/pytest-benchmark" LICENSE = "BSD-2-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=9c5c2c74370826468065c5702b8a1fcf" +LIC_FILES_CHKSUM = "file://LICENSE;md5=c7d2e9d24c2b5bad57ca894da972e22e" -SRC_URI[sha256sum] = "40e263f912de5a81d891619032983557d62a3d85843f9a9f30b98baea0cd7b47" +SRC_URI[sha256sum] = "fb0785b83efe599a6a956361c0691ae1dbb5318018561af10f3e915caa0048d1" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-pytest-cov_5.0.0.bb b/meta-python/recipes-devtools/python/python3-pytest-cov_5.0.0.bb new file mode 100644 index 0000000000..e3e4affb9d --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pytest-cov_5.0.0.bb @@ -0,0 +1,15 @@ +SUMMARY = "Pytest plugin for measuring coverage." +HOMEPAGE = "https://github.com/pytest-dev/pytest-cov" +LICENSE = "MIT" +LIC_FILES_CHKSUM = " \ + file://LICENSE;md5=cbc4e25353c748c817db2daffe605e43 \ +" + +SRC_URI[sha256sum] = "5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857" + +inherit pypi setuptools3 + +DEPENDS += "python3-setuptools-scm-native" +RDEPENDS:${PN} += "python3-coverage python3-pytest" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pytest-forked_1.4.0.bb b/meta-python/recipes-devtools/python/python3-pytest-forked_1.6.0.bb index 34dd9c407e..f573bf0523 100644 --- a/meta-python/recipes-devtools/python/python3-pytest-forked_1.4.0.bb +++ b/meta-python/recipes-devtools/python/python3-pytest-forked_1.6.0.bb @@ -3,11 +3,11 @@ HOMEPAGE = "https://github.com/pytest-dev/pytest-forked" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=772fcdaca14b378878d05c7d857e6c3e" -SRC_URI[sha256sum] = "8b67587c8f98cbbadfdd804539ed5455b6ed03802203485dd2f53c1422d7440e" +SRC_URI[sha256sum] = "4dafd46a9a600f65d822b8f605133ecf5b3e1941ebb3588e943b4e3eb71a5a3f" inherit pypi python_setuptools_build_meta -PEP517_PICOBUILD_OPTS = "--loose-depends" +PEP517_BUILD_OPTS = "--skip-dependency-check" DEPENDS += "python3-setuptools-scm-native" diff --git a/meta-python/recipes-devtools/python/python3-pytest-helpers-namespace_2021.12.29.bb b/meta-python/recipes-devtools/python/python3-pytest-helpers-namespace_2021.12.29.bb index cf62e1f03b..6698b6dde3 100644 --- a/meta-python/recipes-devtools/python/python3-pytest-helpers-namespace_2021.12.29.bb +++ b/meta-python/recipes-devtools/python/python3-pytest-helpers-namespace_2021.12.29.bb @@ -11,5 +11,5 @@ inherit pypi python_setuptools_build_meta DEPENDS += "python3-setuptools-scm-native python3-setuptools-declarative-requirements-native" RDEPENDS:${PN} += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ " diff --git a/meta-python/recipes-devtools/python/python3-pytest-html/no-pip.patch b/meta-python/recipes-devtools/python/python3-pytest-html/no-pip.patch deleted file mode 100644 index e120498846..0000000000 --- a/meta-python/recipes-devtools/python/python3-pytest-html/no-pip.patch +++ /dev/null @@ -1,24 +0,0 @@ -Upstream-Status: Submitted [https://github.com/pytest-dev/pytest-html/pull/516] -Signed-off-by: Ross Burton <ross.burton@arm.com> - -From d7fbc79d428323c838ce68a51e1e1806c2096a76 Mon Sep 17 00:00:00 2001 -From: Ross Burton <ross.burton@arm.com> -Date: Mon, 23 May 2022 13:46:50 +0100 -Subject: [PATCH] pip isn't a build dependency - -It's possible, and even desirable, to build modern Python code without pip, for example by using the `build` and `installer` packages. ---- - pyproject.toml | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/pyproject.toml b/pyproject.toml -index 2683f072..e3f25bf7 100644 ---- a/pyproject.toml -+++ b/pyproject.toml -@@ -1,6 +1,5 @@ - [build-system] - requires = [ -- "pip >= 19.3.1", - "setuptools >= 42", - "setuptools_scm[toml] >= 3.5.0", - "setuptools_scm_git_archive >= 1.1", diff --git a/meta-python/recipes-devtools/python/python3-pytest-html_3.1.1.bb b/meta-python/recipes-devtools/python/python3-pytest-html_3.1.1.bb deleted file mode 100644 index 1bbdfb633b..0000000000 --- a/meta-python/recipes-devtools/python/python3-pytest-html_3.1.1.bb +++ /dev/null @@ -1,21 +0,0 @@ -DESCRIPTION = "pytest plugin for generating html reports from test results" -DEPENDS += "${PYTHON_PN}-setuptools-scm-native" - -LICENSE = "MPL-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=5d425c8f3157dbf212db2ec53d9e5132" - -SRC_URI[sha256sum] = "3ee1cf319c913d19fe53aeb0bc400e7b0bc2dbeb477553733db1dad12eb75ee3" - -PYPI_PACKAGE = "pytest-html" - -inherit pypi python_setuptools_build_meta - -DEPENDS += "python3-setuptools-scm-git-archive-native" - -SRC_URI += "file://no-pip.patch" - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-pytest \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pytest-html_4.1.1.bb b/meta-python/recipes-devtools/python/python3-pytest-html_4.1.1.bb new file mode 100644 index 0000000000..37478ee0ae --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pytest-html_4.1.1.bb @@ -0,0 +1,21 @@ +DESCRIPTION = "pytest plugin for generating html reports from test results" +DEPENDS += "python3-setuptools-scm-native" + +LICENSE = "MPL-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=5d425c8f3157dbf212db2ec53d9e5132" + +SRC_URI[sha256sum] = "70a01e8ae5800f4a074b56a4cb1025c8f4f9b038bba5fe31e3c98eb996686f07" + +PYPI_PACKAGE = "pytest_html" + +inherit pypi python_hatchling + +DEPENDS += "\ + python3-hatch-vcs-native \ +" + +RDEPENDS:${PN} += " \ + python3-pytest \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pytest-json-report_1.5.0.bb b/meta-python/recipes-devtools/python/python3-pytest-json-report_1.5.0.bb new file mode 100644 index 0000000000..6b108a2d0a --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pytest-json-report_1.5.0.bb @@ -0,0 +1,18 @@ +SUMMARY = "pytest-json-report is a plugin that creates test reports as JSON" +HOMEPAGE = "https://github.com/numirias/pytest-json-report" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=8b4ca2f2ad5aaaebd8eb24f262f8fe60" + +SRC_URI[sha256sum] = "2dde3c647851a19b5f3700729e8310a6e66efb2077d674f27ddea3d34dc615de" + +PYPI_PACKAGE = "pytest-json-report" + +inherit pypi setuptools3 + +DEPENDS += "python3-setuptools-scm-native" + +RDEPENDS:${PN} = "\ + python3-pytest \ + python3-pytest-metadata \ +" + diff --git a/meta-python/recipes-devtools/python/python3-pytest-lazy-fixture/run-ptest b/meta-python/recipes-devtools/python/python3-pytest-lazy-fixture/run-ptest deleted file mode 100644 index b63c4de0d9..0000000000 --- a/meta-python/recipes-devtools/python/python3-pytest-lazy-fixture/run-ptest +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' diff --git a/meta-python/recipes-devtools/python/python3-pytest-lazy-fixture_0.6.3.bb b/meta-python/recipes-devtools/python/python3-pytest-lazy-fixture_0.6.3.bb deleted file mode 100644 index 32b5677f1a..0000000000 --- a/meta-python/recipes-devtools/python/python3-pytest-lazy-fixture_0.6.3.bb +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) 2022 Wind River Systems - -SUMMARY = "Use your fixtures in @pytest.mark.parametrize." -HOMEPAGE = "https://github.com/tvorog/pytest-lazy-fixture" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=aae6f2b7c9b3ced83e0b5bb42346d4dd" - -SRC_URI[sha256sum] = "0e7d0c7f74ba33e6e80905e9bfd81f9d15ef9a790de97993e34213deb5ad10ac" - -SRC_URI += "file://run-ptest \ - " - - -inherit ptest pypi setuptools3 - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/tests - cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ -} - - -RDEPENDS:${PN} += "python3-core python3-pytest" -RDEPENDS:${PN}-ptest = " python3-unixadmin" diff --git a/meta-python/recipes-devtools/python/python3-pytest-lazy-fixtures_1.0.7.bb b/meta-python/recipes-devtools/python/python3-pytest-lazy-fixtures_1.0.7.bb new file mode 100644 index 0000000000..f5e6dbfcd2 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pytest-lazy-fixtures_1.0.7.bb @@ -0,0 +1,21 @@ +SUMMARY = "Allows you to use fixtures in @pytest.mark.parametrize." +DESCRIPTION = "Use your fixtures in @pytest.mark.parametrize. \ +\ +This project was inspired by pytest-lazy-fixture.\ +\ +Improvements that have been made in this project:\ +\ +* You can use fixtures in any data structures\ +* You can access the attributes of fixtures\ +* You can use functions in fixtures" +HOMEPAGE = "https://github.com/dev-petrov/pytest-lazy-fixtures" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=4475e66fcfabe27395e6764c8f69c876" + +SRC_URI[sha256sum] = "87ef7424dc0229ff9cb72d482f49b7806535c3500641f612c13ddf243c9adacb" + +inherit pypi python_poetry_core + +PYPI_PACKAGE = "pytest_lazy_fixtures" + +RDEPENDS:${PN} = "python3-pytest" diff --git a/meta-python/recipes-devtools/python/python3-pytest-localserver/run-ptest b/meta-python/recipes-devtools/python/python3-pytest-localserver/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pytest-localserver/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-pytest-localserver_0.8.1.bb b/meta-python/recipes-devtools/python/python3-pytest-localserver_0.8.1.bb new file mode 100644 index 0000000000..669817829d --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pytest-localserver_0.8.1.bb @@ -0,0 +1,29 @@ +SUMMARY = "pytest plugin to test server connections locally." +HOMEPAGE = "https://github.com/pytest-dev/pytest-localserver" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=b8da7a541d738b054dcbf70c31530432" + +DEPENDS += "python3-setuptools-scm-native" + +inherit pypi python_setuptools_build_meta ptest + +SRC_URI[sha256sum] = "66569c34fef31a5750b16effd1cd1288a7a90b59155d005e7f916accd3dee4f1" + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-requests \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} + +RDEPENDS:${PN} += " \ + python3-werkzeug \ +" diff --git a/meta-python/recipes-devtools/python/python3-pytest-metadata_2.0.2.bb b/meta-python/recipes-devtools/python/python3-pytest-metadata_2.0.2.bb index e82213cbe5..163a363f82 100644 --- a/meta-python/recipes-devtools/python/python3-pytest-metadata_2.0.2.bb +++ b/meta-python/recipes-devtools/python/python3-pytest-metadata_2.0.2.bb @@ -1,5 +1,5 @@ DESCRIPTION = "pytest-metadata is a plugin that allowed for accessing pytest metadata" -DEPENDS += "${PYTHON_PN}-setuptools-scm-native" +DEPENDS += "python3-setuptools-scm-native" LICENSE = "MPL-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=5d425c8f3157dbf212db2ec53d9e5132" @@ -11,7 +11,7 @@ PYPI_PACKAGE = "pytest-metadata" inherit pypi setuptools3 RDEPENDS:${PN} = " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pytest-mock/0001-test_pytest_mock-skip-args-introspection-tests.patch b/meta-python/recipes-devtools/python/python3-pytest-mock/0001-test_pytest_mock-skip-args-introspection-tests.patch new file mode 100644 index 0000000000..f024e79d93 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pytest-mock/0001-test_pytest_mock-skip-args-introspection-tests.patch @@ -0,0 +1,38 @@ +From e184fb950ad3b52c5c16438d39fe4d516c784e30 Mon Sep 17 00:00:00 2001 +From: Trevor Gamblin <tgamblin@baylibre.com> +Date: Thu, 12 Oct 2023 17:32:40 -0400 +Subject: [PATCH] test_pytest_mock: skip args introspection tests + +Disable these two tests for now so that python3-pytest-mock can have +successful ptest runs. + +Upstream-Status: Inappropriate [OE-Specific] + +Signed-off-by: Trevor Gamblin <tgamblin@baylibre.com> +--- + tests/test_pytest_mock.py | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/tests/test_pytest_mock.py b/tests/test_pytest_mock.py +index 3d53241..157b6c3 100644 +--- a/tests/test_pytest_mock.py ++++ b/tests/test_pytest_mock.py +@@ -581,6 +581,7 @@ def test_assert_called_wrapper(mocker: MockerFixture) -> None: + stub.assert_called() + + ++@pytest.mark.skip("Async not correctly detected, skip for now") + @pytest.mark.usefixtures("needs_assert_rewrite") + def test_assert_called_args_with_introspection(mocker: MockerFixture) -> None: + stub = mocker.stub() +@@ -597,6 +598,7 @@ def test_assert_called_args_with_introspection(mocker: MockerFixture) -> None: + stub.assert_called_once_with(*wrong_args) + + ++@pytest.mark.skip("Async not correctly detected, skip for now") + @pytest.mark.usefixtures("needs_assert_rewrite") + def test_assert_called_kwargs_with_introspection(mocker: MockerFixture) -> None: + stub = mocker.stub() +-- +2.41.0 + diff --git a/meta-python/recipes-devtools/python/python3-pytest-mock/403.patch b/meta-python/recipes-devtools/python/python3-pytest-mock/403.patch new file mode 100644 index 0000000000..6787c2a3dc --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pytest-mock/403.patch @@ -0,0 +1,92 @@ +From 8480bb6d0500f933be039cfec65e04157e6ecffe Mon Sep 17 00:00:00 2001 +From: Bruno Oliveira <nicoddemus@gmail.com> +Date: Tue, 19 Dec 2023 08:24:23 -0300 +Subject: [PATCH 1/3] Fix tests for Python 3.11 and 3.12 + +Fixes #401. +Upstream-Status: Backport [https://github.com/pytest-dev/pytest-mock/pull/403] +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + tests/test_pytest_mock.py | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/tests/test_pytest_mock.py b/tests/test_pytest_mock.py +index 3ee00da..7acb361 100644 +--- a/tests/test_pytest_mock.py ++++ b/tests/test_pytest_mock.py +@@ -246,9 +246,8 @@ def __test_failure_message(self, mocker: MockerFixture, **kwargs: Any) -> None: + msg = "Expected call: {0}()\nNot called" + expected_message = msg.format(expected_name) + stub = mocker.stub(**kwargs) +- with pytest.raises(AssertionError) as exc_info: ++ with pytest.raises(AssertionError, match=re.escape(expected_message)) as exc_info: + stub.assert_called_with() +- assert str(exc_info.value) == expected_message + + def test_failure_message_with_no_name(self, mocker: MagicMock) -> None: + self.__test_failure_message(mocker) + +From c596504e062be06475b03122c9c0cc732ae87840 Mon Sep 17 00:00:00 2001 +From: "pre-commit-ci[bot]" + <66853113+pre-commit-ci[bot]@users.noreply.github.com> +Date: Tue, 19 Dec 2023 11:24:38 +0000 +Subject: [PATCH 2/3] [pre-commit.ci] auto fixes from pre-commit.com hooks + +for more information, see https://pre-commit.ci +--- + tests/test_pytest_mock.py | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/tests/test_pytest_mock.py b/tests/test_pytest_mock.py +index 7acb361..c185f2a 100644 +--- a/tests/test_pytest_mock.py ++++ b/tests/test_pytest_mock.py +@@ -246,7 +246,9 @@ def __test_failure_message(self, mocker: MockerFixture, **kwargs: Any) -> None: + msg = "Expected call: {0}()\nNot called" + expected_message = msg.format(expected_name) + stub = mocker.stub(**kwargs) +- with pytest.raises(AssertionError, match=re.escape(expected_message)) as exc_info: ++ with pytest.raises( ++ AssertionError, match=re.escape(expected_message) ++ ) as exc_info: + stub.assert_called_with() + + def test_failure_message_with_no_name(self, mocker: MagicMock) -> None: + +From 6da5b0506d6378a8dbe5ae314d5134e6868aeabd Mon Sep 17 00:00:00 2001 +From: danigm <daniel.garcia@suse.com> +Date: Wed, 20 Dec 2023 16:02:13 +0100 +Subject: [PATCH 3/3] Update expected message to match python 3.11.7 (#404) + +https://github.com/python/cpython/issues/111019 + +Fixes #401. +Closes #403. +--- + tests/test_pytest_mock.py | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/tests/test_pytest_mock.py b/tests/test_pytest_mock.py +index c185f2a..01534a4 100644 +--- a/tests/test_pytest_mock.py ++++ b/tests/test_pytest_mock.py +@@ -25,6 +25,8 @@ + + # Python 3.8 changed the output formatting (bpo-35500), which has been ported to mock 3.0 + NEW_FORMATTING = sys.version_info >= (3, 8) ++# Python 3.11.7 changed the output formatting, https://github.com/python/cpython/issues/111019 ++NEWEST_FORMATTING = sys.version_info >= (3, 11, 7) + + if sys.version_info[:2] >= (3, 8): + from unittest.mock import AsyncMock +@@ -240,7 +242,9 @@ def test_repr_with_name(self, mocker: MockerFixture) -> None: + + def __test_failure_message(self, mocker: MockerFixture, **kwargs: Any) -> None: + expected_name = kwargs.get("name") or "mock" +- if NEW_FORMATTING: ++ if NEWEST_FORMATTING: ++ msg = "expected call not found.\nExpected: {0}()\n Actual: not called." ++ elif NEW_FORMATTING: + msg = "expected call not found.\nExpected: {0}()\nActual: not called." + else: + msg = "Expected call: {0}()\nNot called" diff --git a/meta-python/recipes-devtools/python/python3-pytest-mock/run-ptest b/meta-python/recipes-devtools/python/python3-pytest-mock/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pytest-mock/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-pytest-mock_3.12.0.bb b/meta-python/recipes-devtools/python/python3-pytest-mock_3.12.0.bb new file mode 100644 index 0000000000..e9a9a4fbc5 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pytest-mock_3.12.0.bb @@ -0,0 +1,33 @@ +SUMMARY = "Thin-wrapper around the mock package for easier use with pytest" +HOMEPAGE = "https://github.com/pytest-dev/pytest-mock/" +LICENSE = "MIT" +LIC_FILES_CHKSUM = " \ + file://LICENSE;md5=b2ddb1e69238461b7e4ef2a84d874109 \ +" + +SRC_URI = " \ + git://github.com/pytest-dev/pytest-mock;branch=main;protocol=https \ + file://run-ptest \ + file://0001-test_pytest_mock-skip-args-introspection-tests.patch \ + file://403.patch \ +" +SRCREV = "69adc6f76c1a7baf4e7a728da9eec38741d5783e" + +inherit setuptools3 ptest + +DEPENDS += "python3-setuptools-scm-native" + +RDEPENDS:${PN} += " \ + python3-asyncio \ + python3-pytest \ + python3-pytest-asyncio \ + python3-unittest \ + python3-unittest-automake-output \ +" + +S = "${WORKDIR}/git" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests ${D}${PTEST_PATH}/ +} diff --git a/meta-python/recipes-devtools/python/python3-pytest-tempdir_2019.10.12.bb b/meta-python/recipes-devtools/python/python3-pytest-tempdir_2019.10.12.bb index 972c99e38f..dff6af4e0a 100644 --- a/meta-python/recipes-devtools/python/python3-pytest-tempdir_2019.10.12.bb +++ b/meta-python/recipes-devtools/python/python3-pytest-tempdir_2019.10.12.bb @@ -10,5 +10,5 @@ SRC_URI[sha256sum] = "e7d91813a9aa991db87dacdef8cfd3f1657632d731d56d06238c5ffb63 inherit pypi setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ " diff --git a/meta-python/recipes-devtools/python/python3-pytest-timeout_2.1.0.bb b/meta-python/recipes-devtools/python/python3-pytest-timeout_2.3.1.bb index c4faec6c61..b56c26aada 100644 --- a/meta-python/recipes-devtools/python/python3-pytest-timeout_2.1.0.bb +++ b/meta-python/recipes-devtools/python/python3-pytest-timeout_2.3.1.bb @@ -5,8 +5,8 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=d8048cd156eda3df2e7f111b0ae9ceff" PYPI_PACKAGE = "pytest-timeout" -SRC_URI[sha256sum] = "c07ca07404c612f8abbe22294b23c368e2e5104b521c1790195561f37e1ac3d9" +SRC_URI[sha256sum] = "12397729125c6ecbdaca01035b9e5239d4db97352320af155b3f5de1ba5165d9" inherit pypi setuptools3 -RDEPENDS:${PN} = "${PYTHON_PN}-pytest" +RDEPENDS:${PN} = "python3-pytest" diff --git a/meta-python/recipes-devtools/python/python3-pytest-xdist_2.5.0.bb b/meta-python/recipes-devtools/python/python3-pytest-xdist_3.5.0.bb index c3e69e3e0a..89b5039571 100644 --- a/meta-python/recipes-devtools/python/python3-pytest-xdist_2.5.0.bb +++ b/meta-python/recipes-devtools/python/python3-pytest-xdist_3.5.0.bb @@ -3,7 +3,7 @@ HOMEPAGE = "https://github.com/pytest-dev/pytest-xdist" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=772fcdaca14b378878d05c7d857e6c3e" -SRC_URI[sha256sum] = "4580deca3ff04ddb2ac53eba39d76cb5dd5edeac050cb6fbc768b0dd712b4edf" +SRC_URI[sha256sum] = "cbb36f3d67e0c478baa57fa4edc8843887e0f6cfc42d677530a36d7472b32d8a" inherit pypi python_setuptools_build_meta diff --git a/meta-python/recipes-devtools/python/python3-python-vlc_3.0.16120.bb b/meta-python/recipes-devtools/python/python3-python-vlc_3.0.20123.bb index a4d21a50e8..960da1437c 100644 --- a/meta-python/recipes-devtools/python/python3-python-vlc_3.0.16120.bb +++ b/meta-python/recipes-devtools/python/python3-python-vlc_3.0.20123.bb @@ -3,6 +3,11 @@ HOMEPAGE = "wiki.videolan.org/PythonBinding" LICENSE = "LGPL-2.0-only" LIC_FILES_CHKSUM = "file://COPYING;md5=4fbd65380cdd255951079008b364516c" -SRC_URI[sha256sum] = "92f98fee088f72bd6d063b3b3312d0bd29b37e7ad65ddeb3a7303320300c2807" +SRC_URI[sha256sum] = "244fbb9e392a0326841fca926d6d12a2a36c546982191f493f148fa19e66b1d4" inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-ctypes \ + python3-logging \ +" diff --git a/meta-python/recipes-devtools/python/python3-pythonping_1.1.2.bb b/meta-python/recipes-devtools/python/python3-pythonping_1.1.4.bb index 3fce07b43d..62f5c0caad 100644 --- a/meta-python/recipes-devtools/python/python3-pythonping_1.1.2.bb +++ b/meta-python/recipes-devtools/python/python3-pythonping_1.1.4.bb @@ -4,7 +4,7 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://setup.py;beginline=12;endline=12;md5=2d33c00f47720c7e35e1fdb4b9fab027" -SRC_URI[sha256sum] = "7f783688268334fbfdec31b3a3b105a347844bd621de48d63f38e6ecfaf14af2" +SRC_URI[sha256sum] = "acef84640fee6f20b725f2a1d2392771f2845554cfabcef30b1fdea5030161af" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-pytoml/run-ptest b/meta-python/recipes-devtools/python/python3-pytoml/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-pytoml/run-ptest +++ b/meta-python/recipes-devtools/python/python3-pytoml/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-pytoml_0.1.21.bb b/meta-python/recipes-devtools/python/python3-pytoml_0.1.21.bb index 0f04a12039..1717085967 100644 --- a/meta-python/recipes-devtools/python/python3-pytoml_0.1.21.bb +++ b/meta-python/recipes-devtools/python/python3-pytoml_0.1.21.bb @@ -16,12 +16,13 @@ SRC_URI += " \ " RDEPENDS:${PN} += " \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-stringold \ + python3-datetime \ + python3-stringold \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-pytz-deprecation-shim_0.1.0.post0.bb b/meta-python/recipes-devtools/python/python3-pytz-deprecation-shim_0.1.0.post0.bb deleted file mode 100644 index d116c3bd4c..0000000000 --- a/meta-python/recipes-devtools/python/python3-pytz-deprecation-shim_0.1.0.post0.bb +++ /dev/null @@ -1,11 +0,0 @@ -SUMMARY = "Shims to help you safely remove pytz" -HOMEPAGE = "https://github.com/pganssle/pytz-deprecation-shim" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=fca9fd5c15a28eb874ba38577a585d48" - -SRC_URI[sha256sum] = "af097bae1b616dde5c5744441e2ddc69e74dfdcb0c263129610d85b87445a59d" - -PYPI_PACKAGE = "pytz_deprecation_shim" -PYPI_SRC_URI = "https://files.pythonhosted.org/packages/94/f0/909f94fea74759654390a3e1a9e4e185b6cd9aa810e533e3586f39da3097/${PYPI_PACKAGE}-${PV}.tar.gz" - -inherit pypi python_setuptools_build_meta diff --git a/meta-python/recipes-devtools/python/python3-pyu2f_0.1.5.bb b/meta-python/recipes-devtools/python/python3-pyu2f_0.1.5.bb new file mode 100644 index 0000000000..5a2899e132 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyu2f_0.1.5.bb @@ -0,0 +1,20 @@ +SUMMARY = "U2F host library for interacting with a U2F device over USB." +HOMEPAGE = "https://github.com/google/pyu2f/" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57" + +SRC_URI[sha256sum] = "a3caa3a11842fc7d5746376f37195e6af5f17c0a15737538bb1cebf656fb306b" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-core \ + python3-crypt \ + python3-ctypes \ + python3-io \ + python3-json \ + python3-logging \ + python3-netclient \ + python3-threading \ + python3-six \ +" diff --git a/meta-python/recipes-devtools/python/python3-pyudev_0.23.2.bb b/meta-python/recipes-devtools/python/python3-pyudev_0.24.1.bb index 4c4c959eba..ed5175fcf7 100644 --- a/meta-python/recipes-devtools/python/python3-pyudev_0.23.2.bb +++ b/meta-python/recipes-devtools/python/python3-pyudev_0.24.1.bb @@ -3,7 +3,7 @@ SUMMARY = "A libudev binding" LICENSE = "LGPL-2.1-or-later" LIC_FILES_CHKSUM = "file://COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343" -SRC_URI[sha256sum] = "32ae3585b320a51bc283e0a04000fd8a25599edb44541e2f5034f6afee5d15cc" +SRC_URI[sha256sum] = "75e54d37218f5ac45b0da1f0fd9cc5e526a3cac3ef1cfad410cf7ab338b01471" inherit pypi setuptools3 @@ -13,12 +13,10 @@ do_configure:prepend() { } RDEPENDS:${PN} = "\ - ${PYTHON_PN}-ctypes \ - ${PYTHON_PN}-misc \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-threading \ - ${PYTHON_PN}-fcntl \ + python3-ctypes \ + python3-misc \ + python3-six \ + python3-threading \ + python3-fcntl \ libudev \ " - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pyunormalize_15.1.0.bb b/meta-python/recipes-devtools/python/python3-pyunormalize_15.1.0.bb new file mode 100644 index 0000000000..6992ca24cc --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyunormalize_15.1.0.bb @@ -0,0 +1,8 @@ +SUMMARY = "Unicode normalization forms (NFC, NFKC, NFD, NFKD). A library independent from the Python core Unicode database." +HOMEPAGE = "https://github.com/mlodewijck/pyunormalize" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=dc15b678c3bac1f5b2c873591a330eae" + +SRC_URI[sha256sum] = "cf4a87451a0f1cb76911aa97f432f4579e1f564a2f0c84ce488c73a73901b6c1" + +inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-pyusb_1.2.1.bb b/meta-python/recipes-devtools/python/python3-pyusb_1.2.1.bb index 286e9672b1..2282e0300b 100644 --- a/meta-python/recipes-devtools/python/python3-pyusb_1.2.1.bb +++ b/meta-python/recipes-devtools/python/python3-pyusb_1.2.1.bb @@ -3,7 +3,7 @@ HOMEPAGE = "http://pyusb.sourceforge.net/" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=e64a29fcd3c3dd356a24e235dfcb3905" -DEPENDS += "libusb1 ${PYTHON_PN}-setuptools-scm-native" +DEPENDS += "libusb1 python3-setuptools-scm-native" RDEPENDS:${PN} += " \ python3-logging \ @@ -13,6 +13,6 @@ SRC_URI[sha256sum] = "a4cc7404a203144754164b8b40994e2849fde1cfff06b08492f12fff9d inherit pypi setuptools3 -RDEPENDS:${PN} += "libusb1" +RDEPENDS:${PN} += "python3-ctypes" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pyyaml-include/run-ptest b/meta-python/recipes-devtools/python/python3-pyyaml-include/run-ptest new file mode 100755 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyyaml-include/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-pyyaml-include_1.3.2.bb b/meta-python/recipes-devtools/python/python3-pyyaml-include_1.3.2.bb new file mode 100644 index 0000000000..3a5bd99a78 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyyaml-include_1.3.2.bb @@ -0,0 +1,29 @@ +SUMMARY = "Extending PyYAML with a custom constructor for including YAML files within YAML files" +HOMEPAGE = "https://github.com/tanbro/pyyaml-include" +LICENSE = "GPL-3.0-only" +LIC_FILES_CHKSUM = "file://LICENSE;md5=d32239bcb673463ab874e80d47fae504" +DEPENDS += "python3-setuptools-scm-native" +SRCREV = "36b6975aa8fc7a6cbf37de40aa2ed6d996b2f7be" + +SRC_URI = " \ + git://github.com/tanbro/pyyaml-include;protocol=https;branch=main \ + file://run-ptest \ + " + +S = "${WORKDIR}/git" + +inherit python_setuptools_build_meta ptest + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} + +RDEPENDS:${PN} += " \ + python3-pyyaml \ +" +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" + diff --git a/meta-python/recipes-devtools/python/python3-pyzmq/run-ptest b/meta-python/recipes-devtools/python/python3-pyzmq/run-ptest index b63c4de0d9..beefefa663 100644 --- a/meta-python/recipes-devtools/python/python3-pyzmq/run-ptest +++ b/meta-python/recipes-devtools/python/python3-pyzmq/run-ptest @@ -1,3 +1,4 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake \ +-k 'not test_callable_check and not test_on_recv_basic and not test_on_recv_wake and not test_on_recv_async and not test_on_recv_async_error and not test_curve' diff --git a/meta-python/recipes-devtools/python/python3-pyzmq_23.2.1.bb b/meta-python/recipes-devtools/python/python3-pyzmq_25.1.2.bb index 40cb22b5e1..2a6993c141 100644 --- a/meta-python/recipes-devtools/python/python3-pyzmq_23.2.1.bb +++ b/meta-python/recipes-devtools/python/python3-pyzmq_25.1.2.bb @@ -3,17 +3,17 @@ DESCRIPTION = "This package contains Python bindings for ZeroMQ. ZMQ is a lightw HOMEPAGE = "http://zeromq.org/bindings:python" LICENSE = "BSD-3-Clause & LGPL-3.0-only" LIC_FILES_CHKSUM = "\ - file://COPYING.BSD;md5=11c65680f637c3df7f58bbc8d133e96e \ - file://COPYING.LESSER;md5=12c592fa0bcfff3fb0977b066e9cb69e \ + file://LICENSE.BSD;md5=1787206f198344195a671b60326c59dc \ + file://LICENSE.LESSER;md5=0e99bfbdd8b9d33b0221986fe3be89ed \ " -DEPENDS = "python3-packaging-native zeromq" +DEPENDS = "python3-packaging-native python3-cython-native python3-setuptools-scm-native zeromq" SRC_URI:append = " \ file://club-rpath-out.patch \ file://run-ptest \ " -SRC_URI[sha256sum] = "2b381aa867ece7d0a82f30a0c7f3d4387b7cf2e0697e33efaa5bed6c5784abcd" +SRC_URI[sha256sum] = "93f1aa311e8bb912e34f004cf186407a4e90eec4f0ecc0efd26056bf7eda0226" inherit pypi pkgconfig python_setuptools_build_meta ptest @@ -22,16 +22,20 @@ PACKAGES =+ "\ " FILES:${PN}-test += "\ - ${libdir}/${PYTHON_DIR}/site-packages/*/tests \ + ${PYTHON_SITEPACKAGES_DIR}/*/tests \ " RDEPENDS:${PN} += "\ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-multiprocessing \ + python3-json \ + python3-multiprocessing \ + python3-tornado \ " RDEPENDS:${PN}-ptest += "\ - ${PN}-test \ + ${PN}-test \ + python3-pytest \ + python3-unittest-automake-output \ + python3-unixadmin \ " do_compile:prepend() { @@ -43,6 +47,11 @@ do_compile:prepend() { echo no_libzmq_extension = True >> ${S}/setup.cfg } +do_install:append() { + sed -i -e 's#${RECIPE_SYSROOT}##g' ${D}${PYTHON_SITEPACKAGES_DIR}/zmq/utils/config.json + sed -i -e 's#${RECIPE_SYSROOT}##g' ${D}${PYTHON_SITEPACKAGES_DIR}/zmq/utils/compiler.json +} + do_install_ptest() { install -d ${D}${PTEST_PATH}/tests cp -rf ${S}/zmq/tests/* ${D}${PTEST_PATH}/tests/ diff --git a/meta-python/recipes-devtools/python/python3-pyzstd_0.15.10.bb b/meta-python/recipes-devtools/python/python3-pyzstd_0.15.10.bb new file mode 100644 index 0000000000..c094a8d6f0 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyzstd_0.15.10.bb @@ -0,0 +1,18 @@ +DESCRIPTION = "Pyzstd module provides classes and functions for compressing and \ +decompressing data, using Facebook’s Zstandard (or zstd as short name) algorithm." +HOMEPAGE = "https://github.com/animalize/pyzstd" +SECTION = "devel/python" + +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=aedb5a2679cd1552fb61c181ef974b9e" + +PYPI_PACKAGE = "pyzstd" + +SRC_URI[sha256sum] = "83603a97fdbcf2139f475c940789f09e32703f931f29f4a8ddf3551e6700108b" + +inherit pypi setuptools3 + +# clang-16 with -flto segfaults on arm, therefore ignore flto for now +do_configure:append:arm:toolchain-clang() { + sed -i -e "s|'-flto'|''|" ${S}/setup.py +} diff --git a/meta-python/recipes-devtools/python/python3-qrcode_7.3.1.bb b/meta-python/recipes-devtools/python/python3-qrcode_7.4.2.bb index f6de60e1a9..204f4eceec 100644 --- a/meta-python/recipes-devtools/python/python3-qrcode_7.3.1.bb +++ b/meta-python/recipes-devtools/python/python3-qrcode_7.4.2.bb @@ -4,8 +4,13 @@ LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=4b802d2a65df4626623c79757f486af9" PYPI_PACKAGE = "qrcode" -SRC_URI[sha256sum] = "375a6ff240ca9bd41adc070428b5dfc1dcfbb0f2507f1ac848f6cded38956578" +SRC_URI[sha256sum] = "9dd969454827e127dbd93696b20747239e6d540e082937c90f14ac95b30f5845" inherit pypi setuptools3 -RDEPENDS:${PN} = "python3-six python3-pillow" +RDEPENDS:${PN} = " \ + python3-six \ + python3-pillow \ + python3-pypng \ + python3-typing-extensions \ +" diff --git a/meta-python/recipes-devtools/python/python3-rapidjson/run-ptest b/meta-python/recipes-devtools/python/python3-rapidjson/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-rapidjson/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-rapidjson_1.14.bb b/meta-python/recipes-devtools/python/python3-rapidjson_1.14.bb new file mode 100644 index 0000000000..22868d8df0 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-rapidjson_1.14.bb @@ -0,0 +1,40 @@ +SUMMARY = "Python wrapper around rapidjson" +HOMEPAGE = "https://github.com/python-rapidjson/python-rapidjson" + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=4daf3929156304df67003c33274a98bd" + +SRC_URI[sha256sum] = "26806f0a658c34b48d2951d8d3f846ca9deb93a34e664ef436db632a188b6779" + +# Inheriting ptest provides functionality for packaging and installing runtime tests for this recipe +inherit setuptools3 pypi ptest + +PYPI_PACKAGE = "python-rapidjson" + +SETUPTOOLS_BUILD_ARGS += " --rj-include-dir=${RECIPE_SYSROOT}${includedir}" + +# run-ptest is a shell script that starts the test suite +SRC_URI += " \ + file://run-ptest \ +" + +DEPENDS += " \ + rapidjson \ +" + +# Adding required python package for the ptest (pytest and pytest->automake report translation) +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ + python3-pytz \ +" + +RDEPENDS:${PN} += " \ + python3-core \ +" + +# Installing the test suite on the target +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} diff --git a/meta-python/recipes-devtools/python/python3-rarfile_4.2.bb b/meta-python/recipes-devtools/python/python3-rarfile_4.2.bb new file mode 100644 index 0000000000..41cff4bfc4 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-rarfile_4.2.bb @@ -0,0 +1,23 @@ +SUMMARY = "RAR archive reader for Python" +HOMEPAGE = "https://github.com/markokr/rarfile" +LICENSE = "ISC" +SECTION = "devel/python" +LIC_FILES_CHKSUM = "file://LICENSE;md5=1916695551f7eec48dfd97db9467b831" + +inherit setuptools3 + +SRC_URI[sha256sum] = "8e1c8e72d0845ad2b32a47ab11a719bc2e41165ec101fd4d3fe9e92aa3f469ef" + +inherit pypi + +PYPI_PACKAGE="rarfile" + +RDEPENDS:${PN} += "\ + p7zip \ + python3-core \ + python3-datetime \ + python3-crypt \ + python3-io \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-raven_6.10.0.bb b/meta-python/recipes-devtools/python/python3-raven_6.10.0.bb index b0d19c31ad..79a38983de 100644 --- a/meta-python/recipes-devtools/python/python3-raven_6.10.0.bb +++ b/meta-python/recipes-devtools/python/python3-raven_6.10.0.bb @@ -11,3 +11,8 @@ SRC_URI[sha256sum] = "3fa6de6efa2493a7c827472e984ce9b020797d0da16f1db67197bcc23c PYPI_PACKAGE = "raven" inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-json \ + python3-logging \ +" diff --git a/meta-python/recipes-devtools/python/python3-rdflib_6.1.1.bb b/meta-python/recipes-devtools/python/python3-rdflib_6.1.1.bb deleted file mode 100644 index 27f65dced0..0000000000 --- a/meta-python/recipes-devtools/python/python3-rdflib_6.1.1.bb +++ /dev/null @@ -1,17 +0,0 @@ -SUMMARY = "RDFLib is a pure Python package for working with RDF" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=b6cde159c801514e0e45a40cf0a9d3d9" - -SRC_URI[sha256sum] = "8dbfa0af2990b98471dacbc936d6494c997ede92fd8ed693fb84ee700ef6f754" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-isodate \ - ${PYTHON_PN}-pyparsing \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-xml \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-redis_4.3.4.bb b/meta-python/recipes-devtools/python/python3-redis_4.3.4.bb deleted file mode 100644 index e0f953ca4e..0000000000 --- a/meta-python/recipes-devtools/python/python3-redis_4.3.4.bb +++ /dev/null @@ -1,16 +0,0 @@ -SUMMARY = "Python client for Redis key-value store" -DESCRIPTION = "The Python interface to the Redis key-value store." -HOMEPAGE = "http://github.com/andymccurdy/redis-py" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=51d9ad56299ab60ba7be65a621004f27" - -SRC_URI[sha256sum] = "ddf27071df4adf3821c4f2ca59d67525c3a82e5f268bed97b813cb4fabf87880" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-cryptography \ - ${PYTHON_PN}-packaging \ - ${PYTHON_PN}-asyncio \ -" diff --git a/meta-python/recipes-devtools/python/python3-redis_5.0.1.bb b/meta-python/recipes-devtools/python/python3-redis_5.0.1.bb new file mode 100644 index 0000000000..2c473c03ea --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-redis_5.0.1.bb @@ -0,0 +1,18 @@ +SUMMARY = "Python client for Redis key-value store" +DESCRIPTION = "The Python interface to the Redis key-value store." +HOMEPAGE = "http://github.com/andymccurdy/redis-py" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=609ded3add9111c4c6e102f1d421d3f8" + +SRC_URI[sha256sum] = "0dab495cd5753069d3bc650a0dde8a8f9edde16fc5691b689a566eda58100d0f" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-asyncio \ + python3-compression \ + python3-cryptography \ + python3-datetime \ + python3-json \ + python3-packaging \ +" diff --git a/meta-python/recipes-devtools/python/python3-regex_2022.7.25.bb b/meta-python/recipes-devtools/python/python3-regex_2024.4.16.bb index 437563b1c0..18a6f3d65b 100644 --- a/meta-python/recipes-devtools/python/python3-regex_2022.7.25.bb +++ b/meta-python/recipes-devtools/python/python3-regex_2024.4.16.bb @@ -5,7 +5,7 @@ LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=7b5751ddd6b643203c31ff873051d069" inherit pypi setuptools3 -SRC_URI[sha256sum] = "bd0883e86964cd61360ffc36dbebbc49b928e92a306f886eab02c11dfde5b7aa" +SRC_URI[sha256sum] = "fa454d26f2e87ad661c4f0c5a5fe4cf6aab1e307d1b94f16ffdfcb089ba685c0" RDEPENDS:${PN} += " \ python3-stringold \ diff --git a/meta-python/recipes-devtools/python/python3-requests-file/run-ptest b/meta-python/recipes-devtools/python/python3-requests-file/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-requests-file/run-ptest +++ b/meta-python/recipes-devtools/python/python3-requests-file/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-requests-file_1.5.1.bb b/meta-python/recipes-devtools/python/python3-requests-file_1.5.1.bb index 21cdb8c127..7ff984a933 100644 --- a/meta-python/recipes-devtools/python/python3-requests-file_1.5.1.bb +++ b/meta-python/recipes-devtools/python/python3-requests-file_1.5.1.bb @@ -13,7 +13,8 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-requests-futures_1.0.0.bb b/meta-python/recipes-devtools/python/python3-requests-futures_1.0.1.bb index 4b57e13a9a..28f034f7e3 100644 --- a/meta-python/recipes-devtools/python/python3-requests-futures_1.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-requests-futures_1.0.1.bb @@ -3,8 +3,7 @@ HOMEPAGE = "https://github.com/ross/requests-futures" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=e1e50798d0afe0e1f87594c6619a2fa5" -SRC_URI[md5sum] = "601b5e90413bb00e06148752d31f0cc7" -SRC_URI[sha256sum] = "35547502bf1958044716a03a2f47092a89efe8f9789ab0c4c528d9c9c30bc148" +SRC_URI[sha256sum] = "f55a4ef80070e2858e7d1e73123d2bfaeaf25b93fd34384d8ddf148e2b676373" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-requests-oauthlib_1.3.1.bb b/meta-python/recipes-devtools/python/python3-requests-oauthlib_1.3.1.bb deleted file mode 100644 index e02ff7911e..0000000000 --- a/meta-python/recipes-devtools/python/python3-requests-oauthlib_1.3.1.bb +++ /dev/null @@ -1,8 +0,0 @@ -LICENSE = "ISC" -LIC_FILES_CHKSUM = "file://LICENSE;md5=22d117a849df10d047ed9b792838e863" - -SRC_URI[sha256sum] = "75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += "${PYTHON_PN}-requests ${PYTHON_PN}-oauthlib" diff --git a/meta-python/recipes-devtools/python/python3-requests-oauthlib_2.0.0.bb b/meta-python/recipes-devtools/python/python3-requests-oauthlib_2.0.0.bb new file mode 100644 index 0000000000..71cafb513d --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-requests-oauthlib_2.0.0.bb @@ -0,0 +1,8 @@ +LICENSE = "ISC" +LIC_FILES_CHKSUM = "file://LICENSE;md5=22d117a849df10d047ed9b792838e863" + +SRC_URI[sha256sum] = "b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-requests python3-oauthlib" diff --git a/meta-python/recipes-devtools/python/python3-requests-toolbelt/090856f4159c40a2927fb88546419f2e1697ad5f.patch b/meta-python/recipes-devtools/python/python3-requests-toolbelt/090856f4159c40a2927fb88546419f2e1697ad5f.patch new file mode 100644 index 0000000000..948dd2ad55 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-requests-toolbelt/090856f4159c40a2927fb88546419f2e1697ad5f.patch @@ -0,0 +1,1492 @@ +From 090856f4159c40a2927fb88546419f2e1697ad5f Mon Sep 17 00:00:00 2001 +From: Quentin Pradet <quentin.pradet@gmail.com> +Date: Fri, 28 Apr 2023 22:03:46 +0400 +Subject: [PATCH] Indent cassettes files to help track changes in git + +Upstream-Status: Submitted [https://github.com/requests/toolbelt/pull/356] +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + tests/cassettes/file_for_download.json | 56 ++++- + tests/cassettes/http2bin_cookies.json | 133 +++++++++- + tests/cassettes/http2bin_fingerprint.json | 65 ++++- + tests/cassettes/httpbin_guess_auth_basic.json | 115 ++++++++- + .../cassettes/httpbin_guess_auth_digest.json | 124 +++++++++- + tests/cassettes/httpbin_guess_auth_none.json | 59 ++++- + tests/cassettes/klevas_vu_lt_ssl3.json | 36 ++- + .../redirect_request_for_dump_all.json | 233 +++++++++++++++++- + tests/cassettes/simple_get_request.json | 65 ++++- + tests/cassettes/stream_response_to_file.json | 181 +++++++++++++- + ...sponse_without_content_length_to_file.json | 175 ++++++++++++- + tests/cassettes/test_x509_adapter_der.json | 69 +++++- + tests/cassettes/test_x509_adapter_pem.json | 69 +++++- + 13 files changed, 1367 insertions(+), 13 deletions(-) + +diff --git a/tests/cassettes/file_for_download.json b/tests/cassettes/file_for_download.json +index 9e4bb8f..d171443 100644 +--- a/tests/cassettes/file_for_download.json ++++ b/tests/cassettes/file_for_download.json +@@ -1 +1,55 @@ +-{"http_interactions": [{"request": {"uri": "https://stxnext.com/static/img/logo.830ebe551641.svg", "body": {"encoding": "utf-8", "string": ""}, "method": "GET", "headers": {"User-Agent": ["python-requests/2.2.1 CPython/3.5.2 Darwin/17.3.0"], "Accept-Encoding": ["gzip, deflate, compress"], "Accept": ["*/*"]}}, "recorded_at": "2018-01-04T23:00:12", "response": {"url": "https://stxnext.com/static/img/logo.830ebe551641.svg", "status": {"message": "OK", "code": 200}, "body": {"encoding": null, "string": "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"-16169 -10492.84 144.98 39.947\"><defs><style>.a{fill:url(#a);}</style><linearGradient id=\"a\" x2=\"1\" y2=\"1\" gradientUnits=\"objectBoundingBox\"><stop offset=\"0\" stop-color=\"#15c9c2\"/><stop offset=\"1\" stop-color=\"#39769b\"/></linearGradient></defs><path class=\"a\" d=\"M88.841,54.948V48.514a3.665,3.665,0,0,1,1.541-.336,2.169,2.169,0,0,1,2.266,2.435A2.182,2.182,0,0,1,90.435,53.1a2.9,2.9,0,0,1-.85-.125v1.974Zm.744-6.019v3.46a2.558,2.558,0,0,0,.8.125c1,0,1.523-.807,1.523-1.9s-.525-1.84-1.506-1.84h-.041A1.986,1.986,0,0,0,89.585,48.929ZM62.838,54.948l.717-1.9-1.788-4.769h.805l1.187,3.472a5.008,5.008,0,0,1,.167.682h.019a5.01,5.01,0,0,1,.167-.682l1.177-3.472h.815l-2.5,6.672Zm-5.749,0V48.514a3.669,3.669,0,0,1,1.541-.336A2.169,2.169,0,0,1,60.9,50.613,2.185,2.185,0,0,1,58.683,53.1a2.9,2.9,0,0,1-.85-.125v1.974Zm.74-6.019v3.46a2.558,2.558,0,0,0,.8.125c1,0,1.523-.807,1.523-1.9s-.529-1.84-1.513-1.84H58.6A1.986,1.986,0,0,0,57.829,48.929Zm79.213,4.213a2.19,2.19,0,0,1-2.282-2.487c0-1.462.788-2.478,2.08-2.478a1.825,1.825,0,0,1,1.9,2.044c0,.1,0,.205-.008.318l-3.257.469a1.5,1.5,0,0,0,1.6,1.532,2.886,2.886,0,0,0,1.3-.292l.23.557a3.431,3.431,0,0,1-1.484.336ZM135.432,50.5l2.6-.366c-.011-.944-.488-1.386-1.2-1.386C135.989,48.744,135.45,49.416,135.432,50.5ZM130.4,52.8l.265-.567a2.665,2.665,0,0,0,1.143.3c.611,0,1.018-.3,1.018-.77,0-.5-.407-.7-.965-.9-.673-.248-1.336-.549-1.336-1.408,0-.744.575-1.279,1.585-1.279a2.6,2.6,0,0,1,1.327.336l-.257.523a2.054,2.054,0,0,0-1-.283c-.576,0-.9.309-.9.707,0,.5.388.682.913.875.708.265,1.4.549,1.4,1.434.006.823-.649,1.372-1.772,1.372A3.261,3.261,0,0,1,130.4,52.8Zm-3.008.34c-1.187,0-1.841-.523-1.841-1.672V48.276h.744v3.2c0,.707.366,1.043,1.1,1.043a2.914,2.914,0,0,0,1.008-.158V48.276h.73V52.8a4.263,4.263,0,0,1-1.664.34Zm-7.256-2.487c0-1.417.708-2.478,2.028-2.478s2.026,1.061,2.026,2.478-.709,2.487-2.026,2.487S120.14,52.071,120.14,50.655Zm.735-.007c0,1.1.424,1.884,1.292,1.884s1.291-.788,1.291-1.884-.425-1.866-1.291-1.866v0C121.3,48.779,120.875,49.549,120.875,50.648Zm-12.187,2.494a2.19,2.19,0,0,1-2.282-2.487c0-1.462.788-2.478,2.08-2.478a1.825,1.825,0,0,1,1.9,2.044c0,.1,0,.205-.009.318l-3.256.469a1.494,1.494,0,0,0,1.6,1.532,2.886,2.886,0,0,0,1.3-.292l.23.557a3.431,3.431,0,0,1-1.484.336ZM107.079,50.5l2.6-.366c-.01-.944-.488-1.386-1.2-1.386C107.636,48.744,107.1,49.416,107.079,50.5Zm-13.249.159c0-1.417.708-2.478,2.028-2.478s2.026,1.061,2.026,2.478-.707,2.487-2.026,2.487S93.83,52.071,93.83,50.655Zm.735-.007c0,1.1.424,1.884,1.292,1.884s1.291-.788,1.291-1.884-.424-1.866-1.291-1.866v0C94.989,48.779,94.565,49.549,94.565,50.648Zm-18.973.007c0-1.417.708-2.478,2.028-2.478s2.032,1.061,2.032,2.478-.715,2.487-2.032,2.487S75.592,52.071,75.592,50.655Zm.735-.007c0,1.1.424,1.884,1.292,1.884s1.292-.788,1.292-1.884-.426-1.866-1.292-1.866v0C76.752,48.779,76.328,49.549,76.328,50.648ZM68.85,53.1a1.149,1.149,0,0,1-1.257-1.292V48.833H66.9v-.557h.688V47.123l.716-.239v1.389h1.027v.557H68.306v2.939a.634.634,0,0,0,.716.673,1.006,1.006,0,0,0,.309-.044v.619a1.308,1.308,0,0,1-.453.081Zm15.078-.053V49.823c0-.638-.39-1.044-1.158-1.044a2.968,2.968,0,0,0-1.018.169v4.1h-.745V48.513a4.5,4.5,0,0,1,1.753-.336c1.257,0,1.9.584,1.9,1.585v3.289Zm34.114-3.212c0-.7-.461-1.037-1.187-1.037a2.036,2.036,0,0,0-.989.265v3.983h-.744V46.1h.744v2.376A2.616,2.616,0,0,1,117,48.191c1.1,0,1.778.557,1.778,1.585v3.265l-.734,0Zm-6.285,3.212V48.513a4.493,4.493,0,0,1,1.743-.336,3.273,3.273,0,0,1,.47.034l-.143.621a2.031,2.031,0,0,0-.424-.034,2.461,2.461,0,0,0-.9.15v4.1Zm-8.485,0-.974-3.327a5.884,5.884,0,0,1-.14-.654h-.019s-.062.354-.15.654l-.974,3.327h-.753l-1.45-4.769h.744l.93,3.371a7.42,7.42,0,0,1,.15.732h.019s.07-.407.158-.732l.974-3.371h.709l.966,3.371c.088.318.167.732.167.732h.019a6.418,6.418,0,0,1,.143-.732l.947-3.371h.731l-1.442,4.769ZM73.5,49.833c0-.7-.461-1.037-1.187-1.037a2.044,2.044,0,0,0-.991.265v3.983h-.744V46.1h.744v2.376a2.612,2.612,0,0,1,1.133-.283c1.1,0,1.778.557,1.778,1.585v3.265l-.734,0Zm-27.141-6,8.837-14.534L46.91,15.475h7.926l7.925,13.819L54.32,43.828Zm-15.478,0V21.688H23.911V15.474H44.819v6.213H37.846V43.828ZM0,40.086l4.455-4.463c1.473,1.473,4.064,1.99,6.331,1.99,2.741,0,4.062-.913,4.062-2.548a2.4,2.4,0,0,0-.548-1.671,3.133,3.133,0,0,0-1.872-.757L9,32.158A9.631,9.631,0,0,1,3.31,29.651a7.847,7.847,0,0,1-1.953-5.7C1.358,18.778,5.26,15,11.712,15c4.06,0,7.127.956,9.558,3.385l-4.387,4.385C15.092,20.98,12.742,21.1,11.506,21.1c-2.429,0-3.424,1.394-3.424,2.63a1.868,1.868,0,0,0,.557,1.315,3.179,3.179,0,0,0,1.952.836l3.426.48a9.569,9.569,0,0,1,5.576,2.348c1.513,1.473,2.111,3.584,2.111,6.213,0,5.761-4.982,8.907-10.95,8.907C6.412,43.828,2.866,43.031,0,40.086Zm111.6,3.73,6.958-11.665-6.518-11.076h2.81l5.048,8.975,5.046-8.975h2.812L121.2,32.15l7.027,11.658-2.812.006L119.9,34.265l-5.558,9.55Zm24.376,0V23.245h-6.579V21.074h15.588v2.171H138.4V43.814ZM95.878,21.074H109.99v2.173h-11.7v8.018h9.966v2.165H98.3v8.21H110v2.173l-14.123,0ZM90.192,43.814,78.12,25.571V43.808H75.692V21.074h2.3L90.069,39.247V21.074H92.5V43.814ZM63.528,43.8l-2.683-5.029,3.7-6.344,6.611,11.379Zm-2.7-24.291,2.094-4.046h7.919L64.668,26.125Z\" transform=\"translate(-16169 -10507.84)\"/></svg>"}, "headers": {"date": ["Thu, 04 Jan 2018 23:00:15 GMT"], "strict-transport-security": ["max-age=0; includeSubdomains; preload"], "last-modified": ["Wed, 22 Nov 2017 09:22:00 GMT"], "content-type": ["image/svg+xml"], "content-length": ["5177"]}}}], "recorded_with": "betamax/0.8.0"} +\ No newline at end of file ++{ ++ "http_interactions": [ ++ { ++ "recorded_at": "2018-01-04T23:00:12", ++ "request": { ++ "body": { ++ "encoding": "utf-8", ++ "string": "" ++ }, ++ "headers": { ++ "Accept": [ ++ "*/*" ++ ], ++ "Accept-Encoding": [ ++ "gzip, deflate, compress" ++ ], ++ "User-Agent": [ ++ "python-requests/2.2.1 CPython/3.5.2 Darwin/17.3.0" ++ ] ++ }, ++ "method": "GET", ++ "uri": "https://stxnext.com/static/img/logo.830ebe551641.svg" ++ }, ++ "response": { ++ "body": { ++ "encoding": null, ++ "string": "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"-16169 -10492.84 144.98 39.947\"><defs><style>.a{fill:url(#a);}</style><linearGradient id=\"a\" x2=\"1\" y2=\"1\" gradientUnits=\"objectBoundingBox\"><stop offset=\"0\" stop-color=\"#15c9c2\"/><stop offset=\"1\" stop-color=\"#39769b\"/></linearGradient></defs><path class=\"a\" d=\"M88.841,54.948V48.514a3.665,3.665,0,0,1,1.541-.336,2.169,2.169,0,0,1,2.266,2.435A2.182,2.182,0,0,1,90.435,53.1a2.9,2.9,0,0,1-.85-.125v1.974Zm.744-6.019v3.46a2.558,2.558,0,0,0,.8.125c1,0,1.523-.807,1.523-1.9s-.525-1.84-1.506-1.84h-.041A1.986,1.986,0,0,0,89.585,48.929ZM62.838,54.948l.717-1.9-1.788-4.769h.805l1.187,3.472a5.008,5.008,0,0,1,.167.682h.019a5.01,5.01,0,0,1,.167-.682l1.177-3.472h.815l-2.5,6.672Zm-5.749,0V48.514a3.669,3.669,0,0,1,1.541-.336A2.169,2.169,0,0,1,60.9,50.613,2.185,2.185,0,0,1,58.683,53.1a2.9,2.9,0,0,1-.85-.125v1.974Zm.74-6.019v3.46a2.558,2.558,0,0,0,.8.125c1,0,1.523-.807,1.523-1.9s-.529-1.84-1.513-1.84H58.6A1.986,1.986,0,0,0,57.829,48.929Zm79.213,4.213a2.19,2.19,0,0,1-2.282-2.487c0-1.462.788-2.478,2.08-2.478a1.825,1.825,0,0,1,1.9,2.044c0,.1,0,.205-.008.318l-3.257.469a1.5,1.5,0,0,0,1.6,1.532,2.886,2.886,0,0,0,1.3-.292l.23.557a3.431,3.431,0,0,1-1.484.336ZM135.432,50.5l2.6-.366c-.011-.944-.488-1.386-1.2-1.386C135.989,48.744,135.45,49.416,135.432,50.5ZM130.4,52.8l.265-.567a2.665,2.665,0,0,0,1.143.3c.611,0,1.018-.3,1.018-.77,0-.5-.407-.7-.965-.9-.673-.248-1.336-.549-1.336-1.408,0-.744.575-1.279,1.585-1.279a2.6,2.6,0,0,1,1.327.336l-.257.523a2.054,2.054,0,0,0-1-.283c-.576,0-.9.309-.9.707,0,.5.388.682.913.875.708.265,1.4.549,1.4,1.434.006.823-.649,1.372-1.772,1.372A3.261,3.261,0,0,1,130.4,52.8Zm-3.008.34c-1.187,0-1.841-.523-1.841-1.672V48.276h.744v3.2c0,.707.366,1.043,1.1,1.043a2.914,2.914,0,0,0,1.008-.158V48.276h.73V52.8a4.263,4.263,0,0,1-1.664.34Zm-7.256-2.487c0-1.417.708-2.478,2.028-2.478s2.026,1.061,2.026,2.478-.709,2.487-2.026,2.487S120.14,52.071,120.14,50.655Zm.735-.007c0,1.1.424,1.884,1.292,1.884s1.291-.788,1.291-1.884-.425-1.866-1.291-1.866v0C121.3,48.779,120.875,49.549,120.875,50.648Zm-12.187,2.494a2.19,2.19,0,0,1-2.282-2.487c0-1.462.788-2.478,2.08-2.478a1.825,1.825,0,0,1,1.9,2.044c0,.1,0,.205-.009.318l-3.256.469a1.494,1.494,0,0,0,1.6,1.532,2.886,2.886,0,0,0,1.3-.292l.23.557a3.431,3.431,0,0,1-1.484.336ZM107.079,50.5l2.6-.366c-.01-.944-.488-1.386-1.2-1.386C107.636,48.744,107.1,49.416,107.079,50.5Zm-13.249.159c0-1.417.708-2.478,2.028-2.478s2.026,1.061,2.026,2.478-.707,2.487-2.026,2.487S93.83,52.071,93.83,50.655Zm.735-.007c0,1.1.424,1.884,1.292,1.884s1.291-.788,1.291-1.884-.424-1.866-1.291-1.866v0C94.989,48.779,94.565,49.549,94.565,50.648Zm-18.973.007c0-1.417.708-2.478,2.028-2.478s2.032,1.061,2.032,2.478-.715,2.487-2.032,2.487S75.592,52.071,75.592,50.655Zm.735-.007c0,1.1.424,1.884,1.292,1.884s1.292-.788,1.292-1.884-.426-1.866-1.292-1.866v0C76.752,48.779,76.328,49.549,76.328,50.648ZM68.85,53.1a1.149,1.149,0,0,1-1.257-1.292V48.833H66.9v-.557h.688V47.123l.716-.239v1.389h1.027v.557H68.306v2.939a.634.634,0,0,0,.716.673,1.006,1.006,0,0,0,.309-.044v.619a1.308,1.308,0,0,1-.453.081Zm15.078-.053V49.823c0-.638-.39-1.044-1.158-1.044a2.968,2.968,0,0,0-1.018.169v4.1h-.745V48.513a4.5,4.5,0,0,1,1.753-.336c1.257,0,1.9.584,1.9,1.585v3.289Zm34.114-3.212c0-.7-.461-1.037-1.187-1.037a2.036,2.036,0,0,0-.989.265v3.983h-.744V46.1h.744v2.376A2.616,2.616,0,0,1,117,48.191c1.1,0,1.778.557,1.778,1.585v3.265l-.734,0Zm-6.285,3.212V48.513a4.493,4.493,0,0,1,1.743-.336,3.273,3.273,0,0,1,.47.034l-.143.621a2.031,2.031,0,0,0-.424-.034,2.461,2.461,0,0,0-.9.15v4.1Zm-8.485,0-.974-3.327a5.884,5.884,0,0,1-.14-.654h-.019s-.062.354-.15.654l-.974,3.327h-.753l-1.45-4.769h.744l.93,3.371a7.42,7.42,0,0,1,.15.732h.019s.07-.407.158-.732l.974-3.371h.709l.966,3.371c.088.318.167.732.167.732h.019a6.418,6.418,0,0,1,.143-.732l.947-3.371h.731l-1.442,4.769ZM73.5,49.833c0-.7-.461-1.037-1.187-1.037a2.044,2.044,0,0,0-.991.265v3.983h-.744V46.1h.744v2.376a2.612,2.612,0,0,1,1.133-.283c1.1,0,1.778.557,1.778,1.585v3.265l-.734,0Zm-27.141-6,8.837-14.534L46.91,15.475h7.926l7.925,13.819L54.32,43.828Zm-15.478,0V21.688H23.911V15.474H44.819v6.213H37.846V43.828ZM0,40.086l4.455-4.463c1.473,1.473,4.064,1.99,6.331,1.99,2.741,0,4.062-.913,4.062-2.548a2.4,2.4,0,0,0-.548-1.671,3.133,3.133,0,0,0-1.872-.757L9,32.158A9.631,9.631,0,0,1,3.31,29.651a7.847,7.847,0,0,1-1.953-5.7C1.358,18.778,5.26,15,11.712,15c4.06,0,7.127.956,9.558,3.385l-4.387,4.385C15.092,20.98,12.742,21.1,11.506,21.1c-2.429,0-3.424,1.394-3.424,2.63a1.868,1.868,0,0,0,.557,1.315,3.179,3.179,0,0,0,1.952.836l3.426.48a9.569,9.569,0,0,1,5.576,2.348c1.513,1.473,2.111,3.584,2.111,6.213,0,5.761-4.982,8.907-10.95,8.907C6.412,43.828,2.866,43.031,0,40.086Zm111.6,3.73,6.958-11.665-6.518-11.076h2.81l5.048,8.975,5.046-8.975h2.812L121.2,32.15l7.027,11.658-2.812.006L119.9,34.265l-5.558,9.55Zm24.376,0V23.245h-6.579V21.074h15.588v2.171H138.4V43.814ZM95.878,21.074H109.99v2.173h-11.7v8.018h9.966v2.165H98.3v8.21H110v2.173l-14.123,0ZM90.192,43.814,78.12,25.571V43.808H75.692V21.074h2.3L90.069,39.247V21.074H92.5V43.814ZM63.528,43.8l-2.683-5.029,3.7-6.344,6.611,11.379Zm-2.7-24.291,2.094-4.046h7.919L64.668,26.125Z\" transform=\"translate(-16169 -10507.84)\"/></svg>" ++ }, ++ "headers": { ++ "content-length": [ ++ "5177" ++ ], ++ "content-type": [ ++ "image/svg+xml" ++ ], ++ "date": [ ++ "Thu, 04 Jan 2018 23:00:15 GMT" ++ ], ++ "last-modified": [ ++ "Wed, 22 Nov 2017 09:22:00 GMT" ++ ], ++ "strict-transport-security": [ ++ "max-age=0; includeSubdomains; preload" ++ ] ++ }, ++ "status": { ++ "code": 200, ++ "message": "OK" ++ }, ++ "url": "https://stxnext.com/static/img/logo.830ebe551641.svg" ++ } ++ } ++ ], ++ "recorded_with": "betamax/0.8.0" ++} +\ No newline at end of file +diff --git a/tests/cassettes/http2bin_cookies.json b/tests/cassettes/http2bin_cookies.json +index a8368ed..3d907da 100644 +--- a/tests/cassettes/http2bin_cookies.json ++++ b/tests/cassettes/http2bin_cookies.json +@@ -1 +1,132 @@ +-{"recorded_with": "betamax/0.5.1", "http_interactions": [{"response": {"status": {"code": 302, "message": "FOUND"}, "body": {"string": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<title>Redirecting...</title>\n<h1>Redirecting...</h1>\n<p>You should be redirected automatically to target URL: <a href=\"/cookies\">/cookies</a>. If not click the link.", "encoding": "utf-8"}, "url": "https://httpbin.org/cookies/set?cookie0=value0", "headers": {"Location": ["/cookies"], "Content-Length": ["223"], "Date": ["Fri, 13 Nov 2015 00:23:20 GMT"], "Access-Control-Allow-Credentials": ["true"], "Access-Control-Allow-Origin": ["*"], "Connection": ["keep-alive"], "Server": ["nginx"], "Set-Cookie": ["cookie0=value0; Path=/"], "Content-Type": ["text/html; charset=utf-8"]}}, "recorded_at": "2015-11-13T00:23:19", "request": {"uri": "https://httpbin.org/cookies/set?cookie0=value0", "method": "GET", "body": {"string": "", "encoding": "utf-8"}, "headers": {"Connection": ["keep-alive"], "User-Agent": ["python-requests/2.8.1"], "Accept-Encoding": ["gzip, deflate"], "Accept": ["*/*"]}}}, {"response": {"status": {"code": 200, "message": "OK"}, "body": {"string": "{\n \"cookies\": {\n \"cookie0\": \"value0\"\n }\n}\n", "encoding": null}, "url": "https://httpbin.org/cookies", "headers": {"Access-Control-Allow-Credentials": ["true"], "Content-Length": ["47"], "Date": ["Fri, 13 Nov 2015 00:23:20 GMT"], "Content-Type": ["application/json"], "Connection": ["keep-alive"], "Server": ["nginx"], "Access-Control-Allow-Origin": ["*"]}}, "recorded_at": "2015-11-13T00:23:19", "request": {"uri": "https://httpbin.org/cookies", "method": "GET", "body": {"string": "", "encoding": "utf-8"}, "headers": {"Connection": ["keep-alive"], "User-Agent": ["python-requests/2.8.1"], "Accept-Encoding": ["gzip, deflate"], "Accept": ["*/*"], "Cookie": ["cookie0=value0"]}}}]} +\ No newline at end of file ++{ ++ "http_interactions": [ ++ { ++ "recorded_at": "2015-11-13T00:23:19", ++ "request": { ++ "body": { ++ "encoding": "utf-8", ++ "string": "" ++ }, ++ "headers": { ++ "Accept": [ ++ "*/*" ++ ], ++ "Accept-Encoding": [ ++ "gzip, deflate" ++ ], ++ "Connection": [ ++ "keep-alive" ++ ], ++ "User-Agent": [ ++ "python-requests/2.8.1" ++ ] ++ }, ++ "method": "GET", ++ "uri": "https://httpbin.org/cookies/set?cookie0=value0" ++ }, ++ "response": { ++ "body": { ++ "encoding": "utf-8", ++ "string": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<title>Redirecting...</title>\n<h1>Redirecting...</h1>\n<p>You should be redirected automatically to target URL: <a href=\"/cookies\">/cookies</a>. If not click the link." ++ }, ++ "headers": { ++ "Access-Control-Allow-Credentials": [ ++ "true" ++ ], ++ "Access-Control-Allow-Origin": [ ++ "*" ++ ], ++ "Connection": [ ++ "keep-alive" ++ ], ++ "Content-Length": [ ++ "223" ++ ], ++ "Content-Type": [ ++ "text/html; charset=utf-8" ++ ], ++ "Date": [ ++ "Fri, 13 Nov 2015 00:23:20 GMT" ++ ], ++ "Location": [ ++ "/cookies" ++ ], ++ "Server": [ ++ "nginx" ++ ], ++ "Set-Cookie": [ ++ "cookie0=value0; Path=/" ++ ] ++ }, ++ "status": { ++ "code": 302, ++ "message": "FOUND" ++ }, ++ "url": "https://httpbin.org/cookies/set?cookie0=value0" ++ } ++ }, ++ { ++ "recorded_at": "2015-11-13T00:23:19", ++ "request": { ++ "body": { ++ "encoding": "utf-8", ++ "string": "" ++ }, ++ "headers": { ++ "Accept": [ ++ "*/*" ++ ], ++ "Accept-Encoding": [ ++ "gzip, deflate" ++ ], ++ "Connection": [ ++ "keep-alive" ++ ], ++ "Cookie": [ ++ "cookie0=value0" ++ ], ++ "User-Agent": [ ++ "python-requests/2.8.1" ++ ] ++ }, ++ "method": "GET", ++ "uri": "https://httpbin.org/cookies" ++ }, ++ "response": { ++ "body": { ++ "encoding": null, ++ "string": "{\n \"cookies\": {\n \"cookie0\": \"value0\"\n }\n}\n" ++ }, ++ "headers": { ++ "Access-Control-Allow-Credentials": [ ++ "true" ++ ], ++ "Access-Control-Allow-Origin": [ ++ "*" ++ ], ++ "Connection": [ ++ "keep-alive" ++ ], ++ "Content-Length": [ ++ "47" ++ ], ++ "Content-Type": [ ++ "application/json" ++ ], ++ "Date": [ ++ "Fri, 13 Nov 2015 00:23:20 GMT" ++ ], ++ "Server": [ ++ "nginx" ++ ] ++ }, ++ "status": { ++ "code": 200, ++ "message": "OK" ++ }, ++ "url": "https://httpbin.org/cookies" ++ } ++ } ++ ], ++ "recorded_with": "betamax/0.5.1" ++} +\ No newline at end of file +diff --git a/tests/cassettes/http2bin_fingerprint.json b/tests/cassettes/http2bin_fingerprint.json +index fd2fd35..75eb143 100644 +--- a/tests/cassettes/http2bin_fingerprint.json ++++ b/tests/cassettes/http2bin_fingerprint.json +@@ -1 +1,64 @@ +-{"recorded_with": "betamax/0.4.1", "http_interactions": [{"response": {"status": {"message": "OK", "code": 200}, "body": {"string": "{\n \"args\": {}, \n \"headers\": {\n \"Accept\": \"*/*\", \n \"Accept-Encoding\": \"gzip, deflate\", \n \"Connection\": \"keep-alive\", \n \"Host\": \"http2bin.org\", \n \"User-Agent\": \"python-requests/2.5.3 CPython/2.7.9 Darwin/14.1.0\"\n }, \n \"origin\": \"77.99.146.203\", \n \"url\": \"https://http2bin.org/get\"\n}\n", "encoding": null}, "headers": {"access-control-allow-origin": ["*"], "date": ["Tue, 03 Mar 2015 21:29:55 GMT"], "server": ["h2o/1.0.2-alpha1"], "content-length": ["301"], "access-control-allow-credentials": ["true"], "connection": ["keep-alive"], "content-type": ["application/json"]}, "url": "https://http2bin.org/get"}, "recorded_at": "2015-03-03T21:29:55", "request": {"method": "GET", "uri": "https://http2bin.org/get", "body": {"string": "", "encoding": "utf-8"}, "headers": {"Accept": ["*/*"], "Accept-Encoding": ["gzip, deflate"], "Connection": ["keep-alive"], "User-Agent": ["python-requests/2.5.3 CPython/2.7.9 Darwin/14.1.0"]}}}]} +\ No newline at end of file ++{ ++ "http_interactions": [ ++ { ++ "recorded_at": "2015-03-03T21:29:55", ++ "request": { ++ "body": { ++ "encoding": "utf-8", ++ "string": "" ++ }, ++ "headers": { ++ "Accept": [ ++ "*/*" ++ ], ++ "Accept-Encoding": [ ++ "gzip, deflate" ++ ], ++ "Connection": [ ++ "keep-alive" ++ ], ++ "User-Agent": [ ++ "python-requests/2.5.3 CPython/2.7.9 Darwin/14.1.0" ++ ] ++ }, ++ "method": "GET", ++ "uri": "https://http2bin.org/get" ++ }, ++ "response": { ++ "body": { ++ "encoding": null, ++ "string": "{\n \"args\": {}, \n \"headers\": {\n \"Accept\": \"*/*\", \n \"Accept-Encoding\": \"gzip, deflate\", \n \"Connection\": \"keep-alive\", \n \"Host\": \"http2bin.org\", \n \"User-Agent\": \"python-requests/2.5.3 CPython/2.7.9 Darwin/14.1.0\"\n }, \n \"origin\": \"77.99.146.203\", \n \"url\": \"https://http2bin.org/get\"\n}\n" ++ }, ++ "headers": { ++ "access-control-allow-credentials": [ ++ "true" ++ ], ++ "access-control-allow-origin": [ ++ "*" ++ ], ++ "connection": [ ++ "keep-alive" ++ ], ++ "content-length": [ ++ "301" ++ ], ++ "content-type": [ ++ "application/json" ++ ], ++ "date": [ ++ "Tue, 03 Mar 2015 21:29:55 GMT" ++ ], ++ "server": [ ++ "h2o/1.0.2-alpha1" ++ ] ++ }, ++ "status": { ++ "code": 200, ++ "message": "OK" ++ }, ++ "url": "https://http2bin.org/get" ++ } ++ } ++ ], ++ "recorded_with": "betamax/0.4.1" ++} +\ No newline at end of file +diff --git a/tests/cassettes/httpbin_guess_auth_basic.json b/tests/cassettes/httpbin_guess_auth_basic.json +index db72722..2daca54 100644 +--- a/tests/cassettes/httpbin_guess_auth_basic.json ++++ b/tests/cassettes/httpbin_guess_auth_basic.json +@@ -1 +1,114 @@ +-{"http_interactions": [{"request": {"body": {"string": "", "encoding": "utf-8"}, "headers": {"Accept-Encoding": ["gzip, deflate, compress"], "Accept": ["*/*"], "User-Agent": ["python-requests/2.2.1 CPython/2.7.6 Linux/3.14.1-1-ARCH"]}, "method": "GET", "uri": "http://httpbin.org/basic-auth/user/passwd"}, "response": {"body": {"string": "", "encoding": null}, "headers": {"content-length": ["0"], "server": ["gunicorn/0.17.4"], "connection": ["keep-alive"], "date": ["Sat, 03 May 2014 17:23:06 GMT"], "access-control-allow-origin": ["*"], "www-authenticate": ["Basic realm=\"Fake Realm\""]}, "status": {"message": "UNAUTHORIZED", "code": 401}, "url": "http://httpbin.org/basic-auth/user/passwd"}, "recorded_at": "2014-05-03T17:23:06"}, {"request": {"body": {"string": "", "encoding": "utf-8"}, "headers": {"Accept": ["*/*"], "Accept-Encoding": ["gzip, deflate, compress"], "Authorization": ["Basic dXNlcjpwYXNzd2Q="], "User-Agent": ["python-requests/2.2.1 CPython/2.7.6 Linux/3.14.1-1-ARCH"]}, "method": "GET", "uri": "http://httpbin.org/basic-auth/user/passwd"}, "response": {"body": {"string": "{\n \"user\": \"user\",\n \"authenticated\": true\n}", "encoding": null}, "headers": {"content-length": ["45"], "server": ["gunicorn/0.17.4"], "connection": ["keep-alive"], "date": ["Sat, 03 May 2014 17:23:06 GMT"], "access-control-allow-origin": ["*"], "content-type": ["application/json"]}, "status": {"message": "OK", "code": 200}, "url": "http://httpbin.org/basic-auth/user/passwd"}, "recorded_at": "2014-05-03T17:23:06"}], "recorded_with": "betamax/{version}"} +\ No newline at end of file ++{ ++ "http_interactions": [ ++ { ++ "recorded_at": "2014-05-03T17:23:06", ++ "request": { ++ "body": { ++ "encoding": "utf-8", ++ "string": "" ++ }, ++ "headers": { ++ "Accept": [ ++ "*/*" ++ ], ++ "Accept-Encoding": [ ++ "gzip, deflate, compress" ++ ], ++ "User-Agent": [ ++ "python-requests/2.2.1 CPython/2.7.6 Linux/3.14.1-1-ARCH" ++ ] ++ }, ++ "method": "GET", ++ "uri": "http://httpbin.org/basic-auth/user/passwd" ++ }, ++ "response": { ++ "body": { ++ "encoding": null, ++ "string": "" ++ }, ++ "headers": { ++ "access-control-allow-origin": [ ++ "*" ++ ], ++ "connection": [ ++ "keep-alive" ++ ], ++ "content-length": [ ++ "0" ++ ], ++ "date": [ ++ "Sat, 03 May 2014 17:23:06 GMT" ++ ], ++ "server": [ ++ "gunicorn/0.17.4" ++ ], ++ "www-authenticate": [ ++ "Basic realm=\"Fake Realm\"" ++ ] ++ }, ++ "status": { ++ "code": 401, ++ "message": "UNAUTHORIZED" ++ }, ++ "url": "http://httpbin.org/basic-auth/user/passwd" ++ } ++ }, ++ { ++ "recorded_at": "2014-05-03T17:23:06", ++ "request": { ++ "body": { ++ "encoding": "utf-8", ++ "string": "" ++ }, ++ "headers": { ++ "Accept": [ ++ "*/*" ++ ], ++ "Accept-Encoding": [ ++ "gzip, deflate, compress" ++ ], ++ "Authorization": [ ++ "Basic dXNlcjpwYXNzd2Q=" ++ ], ++ "User-Agent": [ ++ "python-requests/2.2.1 CPython/2.7.6 Linux/3.14.1-1-ARCH" ++ ] ++ }, ++ "method": "GET", ++ "uri": "http://httpbin.org/basic-auth/user/passwd" ++ }, ++ "response": { ++ "body": { ++ "encoding": null, ++ "string": "{\n \"user\": \"user\",\n \"authenticated\": true\n}" ++ }, ++ "headers": { ++ "access-control-allow-origin": [ ++ "*" ++ ], ++ "connection": [ ++ "keep-alive" ++ ], ++ "content-length": [ ++ "45" ++ ], ++ "content-type": [ ++ "application/json" ++ ], ++ "date": [ ++ "Sat, 03 May 2014 17:23:06 GMT" ++ ], ++ "server": [ ++ "gunicorn/0.17.4" ++ ] ++ }, ++ "status": { ++ "code": 200, ++ "message": "OK" ++ }, ++ "url": "http://httpbin.org/basic-auth/user/passwd" ++ } ++ } ++ ], ++ "recorded_with": "betamax/{version}" ++} +\ No newline at end of file +diff --git a/tests/cassettes/httpbin_guess_auth_digest.json b/tests/cassettes/httpbin_guess_auth_digest.json +index 94cf3a3..3b46fac 100644 +--- a/tests/cassettes/httpbin_guess_auth_digest.json ++++ b/tests/cassettes/httpbin_guess_auth_digest.json +@@ -1 +1,123 @@ +-{"http_interactions": [{"request": {"body": {"string": "", "encoding": "utf-8"}, "headers": {"Accept-Encoding": ["gzip, deflate, compress"], "Accept": ["*/*"], "User-Agent": ["python-requests/2.2.1 CPython/2.7.6 Linux/3.14.1-1-ARCH"]}, "method": "GET", "uri": "http://httpbin.org/digest-auth/auth/user/passwd"}, "response": {"body": {"string": "", "encoding": "utf-8"}, "headers": {"content-length": ["0"], "set-cookie": ["fake=fake_value"], "server": ["gunicorn/0.17.4"], "connection": ["keep-alive"], "date": ["Sat, 03 May 2014 17:23:07 GMT"], "access-control-allow-origin": ["*"], "content-type": ["text/html; charset=utf-8"], "www-authenticate": ["Digest qop=auth, nonce=\"713b4eb6d0ad0ac25d75b50c4d044d5e\", realm=\"me@kennethreitz.com\", opaque=\"d0033bc1960ca78a2fc4497c1e8a8cbd\""]}, "status": {"message": "UNAUTHORIZED", "code": 401}, "url": "http://httpbin.org/digest-auth/auth/user/passwd"}, "recorded_at": "2014-05-03T17:23:07"}, {"request": {"body": {"string": "", "encoding": "utf-8"}, "headers": {"Accept": ["*/*"], "Cookie": ["fake=fake_value"], "Accept-Encoding": ["gzip, deflate, compress"], "Authorization": ["Digest username=\"user\", realm=\"me@kennethreitz.com\", nonce=\"713b4eb6d0ad0ac25d75b50c4d044d5e\", uri=\"/digest-auth/auth/user/passwd\", response=\"30276b25ef0031e65e3bccc719031388\", opaque=\"d0033bc1960ca78a2fc4497c1e8a8cbd\", qop=\"auth\", nc=00000001, cnonce=\"e94e00be64d66bcb\""], "User-Agent": ["python-requests/2.2.1 CPython/2.7.6 Linux/3.14.1-1-ARCH"]}, "method": "GET", "uri": "http://httpbin.org/digest-auth/auth/user/passwd"}, "response": {"body": {"string": "{\n \"user\": \"user\",\n \"authenticated\": true\n}", "encoding": null}, "headers": {"content-length": ["45"], "server": ["gunicorn/0.17.4"], "connection": ["keep-alive"], "date": ["Sat, 03 May 2014 17:23:07 GMT"], "access-control-allow-origin": ["*"], "content-type": ["application/json"]}, "status": {"message": "OK", "code": 200}, "url": "http://httpbin.org/digest-auth/auth/user/passwd"}, "recorded_at": "2014-05-03T17:23:07"}], "recorded_with": "betamax/{version}"} +\ No newline at end of file ++{ ++ "http_interactions": [ ++ { ++ "recorded_at": "2014-05-03T17:23:07", ++ "request": { ++ "body": { ++ "encoding": "utf-8", ++ "string": "" ++ }, ++ "headers": { ++ "Accept": [ ++ "*/*" ++ ], ++ "Accept-Encoding": [ ++ "gzip, deflate, compress" ++ ], ++ "User-Agent": [ ++ "python-requests/2.2.1 CPython/2.7.6 Linux/3.14.1-1-ARCH" ++ ] ++ }, ++ "method": "GET", ++ "uri": "http://httpbin.org/digest-auth/auth/user/passwd" ++ }, ++ "response": { ++ "body": { ++ "encoding": "utf-8", ++ "string": "" ++ }, ++ "headers": { ++ "access-control-allow-origin": [ ++ "*" ++ ], ++ "connection": [ ++ "keep-alive" ++ ], ++ "content-length": [ ++ "0" ++ ], ++ "content-type": [ ++ "text/html; charset=utf-8" ++ ], ++ "date": [ ++ "Sat, 03 May 2014 17:23:07 GMT" ++ ], ++ "server": [ ++ "gunicorn/0.17.4" ++ ], ++ "set-cookie": [ ++ "fake=fake_value" ++ ], ++ "www-authenticate": [ ++ "Digest qop=auth, nonce=\"713b4eb6d0ad0ac25d75b50c4d044d5e\", realm=\"me@kennethreitz.com\", opaque=\"d0033bc1960ca78a2fc4497c1e8a8cbd\"" ++ ] ++ }, ++ "status": { ++ "code": 401, ++ "message": "UNAUTHORIZED" ++ }, ++ "url": "http://httpbin.org/digest-auth/auth/user/passwd" ++ } ++ }, ++ { ++ "recorded_at": "2014-05-03T17:23:07", ++ "request": { ++ "body": { ++ "encoding": "utf-8", ++ "string": "" ++ }, ++ "headers": { ++ "Accept": [ ++ "*/*" ++ ], ++ "Accept-Encoding": [ ++ "gzip, deflate, compress" ++ ], ++ "Authorization": [ ++ "Digest username=\"user\", realm=\"me@kennethreitz.com\", nonce=\"713b4eb6d0ad0ac25d75b50c4d044d5e\", uri=\"/digest-auth/auth/user/passwd\", response=\"30276b25ef0031e65e3bccc719031388\", opaque=\"d0033bc1960ca78a2fc4497c1e8a8cbd\", qop=\"auth\", nc=00000001, cnonce=\"e94e00be64d66bcb\"" ++ ], ++ "Cookie": [ ++ "fake=fake_value" ++ ], ++ "User-Agent": [ ++ "python-requests/2.2.1 CPython/2.7.6 Linux/3.14.1-1-ARCH" ++ ] ++ }, ++ "method": "GET", ++ "uri": "http://httpbin.org/digest-auth/auth/user/passwd" ++ }, ++ "response": { ++ "body": { ++ "encoding": null, ++ "string": "{\n \"user\": \"user\",\n \"authenticated\": true\n}" ++ }, ++ "headers": { ++ "access-control-allow-origin": [ ++ "*" ++ ], ++ "connection": [ ++ "keep-alive" ++ ], ++ "content-length": [ ++ "45" ++ ], ++ "content-type": [ ++ "application/json" ++ ], ++ "date": [ ++ "Sat, 03 May 2014 17:23:07 GMT" ++ ], ++ "server": [ ++ "gunicorn/0.17.4" ++ ] ++ }, ++ "status": { ++ "code": 200, ++ "message": "OK" ++ }, ++ "url": "http://httpbin.org/digest-auth/auth/user/passwd" ++ } ++ } ++ ], ++ "recorded_with": "betamax/{version}" ++} +\ No newline at end of file +diff --git a/tests/cassettes/httpbin_guess_auth_none.json b/tests/cassettes/httpbin_guess_auth_none.json +index 2ebbb0f..4ddfbc5 100644 +--- a/tests/cassettes/httpbin_guess_auth_none.json ++++ b/tests/cassettes/httpbin_guess_auth_none.json +@@ -1 +1,58 @@ +-{"http_interactions": [{"request": {"body": {"string": "", "encoding": "utf-8"}, "headers": {"Accept-Encoding": ["gzip, deflate, compress"], "Accept": ["*/*"], "User-Agent": ["python-requests/2.2.1 CPython/2.7.6 Linux/3.14.1-1-ARCH"]}, "method": "GET", "uri": "http://httpbin.org/get?a=1"}, "response": {"body": {"string": "{\n \"args\": {\n \"a\": \"1\"\n },\n \"url\": \"http://httpbin.org/get?a=1\",\n \"headers\": {\n \"Connection\": \"close\",\n \"Host\": \"httpbin.org\",\n \"Accept-Encoding\": \"gzip, deflate, compress\",\n \"X-Request-Id\": \"f9f71f12-5705-4a0f-85d4-3d63f9140b1f\",\n \"User-Agent\": \"python-requests/2.2.1 CPython/2.7.6 Linux/3.14.1-1-ARCH\",\n \"Accept\": \"*/*\"\n },\n \"origin\": \"62.47.252.115\"\n}", "encoding": null}, "headers": {"content-length": ["381"], "server": ["gunicorn/0.17.4"], "connection": ["keep-alive"], "date": ["Sat, 03 May 2014 17:23:07 GMT"], "access-control-allow-origin": ["*"], "content-type": ["application/json"]}, "status": {"message": "OK", "code": 200}, "url": "http://httpbin.org/get?a=1"}, "recorded_at": "2014-05-03T17:23:07"}], "recorded_with": "betamax/{version}"} +\ No newline at end of file ++{ ++ "http_interactions": [ ++ { ++ "recorded_at": "2014-05-03T17:23:07", ++ "request": { ++ "body": { ++ "encoding": "utf-8", ++ "string": "" ++ }, ++ "headers": { ++ "Accept": [ ++ "*/*" ++ ], ++ "Accept-Encoding": [ ++ "gzip, deflate, compress" ++ ], ++ "User-Agent": [ ++ "python-requests/2.2.1 CPython/2.7.6 Linux/3.14.1-1-ARCH" ++ ] ++ }, ++ "method": "GET", ++ "uri": "http://httpbin.org/get?a=1" ++ }, ++ "response": { ++ "body": { ++ "encoding": null, ++ "string": "{\n \"args\": {\n \"a\": \"1\"\n },\n \"url\": \"http://httpbin.org/get?a=1\",\n \"headers\": {\n \"Connection\": \"close\",\n \"Host\": \"httpbin.org\",\n \"Accept-Encoding\": \"gzip, deflate, compress\",\n \"X-Request-Id\": \"f9f71f12-5705-4a0f-85d4-3d63f9140b1f\",\n \"User-Agent\": \"python-requests/2.2.1 CPython/2.7.6 Linux/3.14.1-1-ARCH\",\n \"Accept\": \"*/*\"\n },\n \"origin\": \"62.47.252.115\"\n}" ++ }, ++ "headers": { ++ "access-control-allow-origin": [ ++ "*" ++ ], ++ "connection": [ ++ "keep-alive" ++ ], ++ "content-length": [ ++ "381" ++ ], ++ "content-type": [ ++ "application/json" ++ ], ++ "date": [ ++ "Sat, 03 May 2014 17:23:07 GMT" ++ ], ++ "server": [ ++ "gunicorn/0.17.4" ++ ] ++ }, ++ "status": { ++ "code": 200, ++ "message": "OK" ++ }, ++ "url": "http://httpbin.org/get?a=1" ++ } ++ } ++ ], ++ "recorded_with": "betamax/{version}" ++} +\ No newline at end of file +diff --git a/tests/cassettes/klevas_vu_lt_ssl3.json b/tests/cassettes/klevas_vu_lt_ssl3.json +index 3c667ba..1608e48 100644 +--- a/tests/cassettes/klevas_vu_lt_ssl3.json ++++ b/tests/cassettes/klevas_vu_lt_ssl3.json +@@ -1 +1,35 @@ +-{"http_interactions": [{"request": {"body": "", "headers": {"Accept-Encoding": "gzip, deflate, compress", "Accept": "*/*", "User-Agent": "python-requests/2.1.0 CPython/2.7.3 Linux/3.2.29"}, "method": "GET", "uri": "https://klevas.vu.lt/"}, "response": {"body": {"string": "<html>\n<title>\nKlevas\n</title>\n<head>\n<script language=\"javascript\" type=\"text/javascript\">\n <!--\n window.location=\"https://klevas.vu.lt/pls/klevas/logon\";\n // -->\n </script>\n</head>\n</html>\n\n", "encoding": "ISO-8859-1"}, "headers": {"content-length": "204", "accept-ranges": "bytes", "server": "Oracle-Application-Server-10g/10.1.3.1.0 Oracle-HTTP-Server", "last-modified": "Wed, 13 Apr 2011 05:00:23 GMT", "etag": "\"7f9b-cc-4da52de7\"", "date": "Sun, 05 Jan 2014 01:35:40 GMT", "content-type": "text/html"}, "url": "https://klevas.vu.lt/", "status_code": 200}, "recorded_at": "2014-01-05T01:34:40"}], "recorded_with": "betamax"} +\ No newline at end of file ++{ ++ "http_interactions": [ ++ { ++ "recorded_at": "2014-01-05T01:34:40", ++ "request": { ++ "body": "", ++ "headers": { ++ "Accept": "*/*", ++ "Accept-Encoding": "gzip, deflate, compress", ++ "User-Agent": "python-requests/2.1.0 CPython/2.7.3 Linux/3.2.29" ++ }, ++ "method": "GET", ++ "uri": "https://klevas.vu.lt/" ++ }, ++ "response": { ++ "body": { ++ "encoding": "ISO-8859-1", ++ "string": "<html>\n<title>\nKlevas\n</title>\n<head>\n<script language=\"javascript\" type=\"text/javascript\">\n <!--\n window.location=\"https://klevas.vu.lt/pls/klevas/logon\";\n // -->\n </script>\n</head>\n</html>\n\n" ++ }, ++ "headers": { ++ "accept-ranges": "bytes", ++ "content-length": "204", ++ "content-type": "text/html", ++ "date": "Sun, 05 Jan 2014 01:35:40 GMT", ++ "etag": "\"7f9b-cc-4da52de7\"", ++ "last-modified": "Wed, 13 Apr 2011 05:00:23 GMT", ++ "server": "Oracle-Application-Server-10g/10.1.3.1.0 Oracle-HTTP-Server" ++ }, ++ "status_code": 200, ++ "url": "https://klevas.vu.lt/" ++ } ++ } ++ ], ++ "recorded_with": "betamax" ++} +\ No newline at end of file +diff --git a/tests/cassettes/redirect_request_for_dump_all.json b/tests/cassettes/redirect_request_for_dump_all.json +index 38b037d..f713ff3 100644 +--- a/tests/cassettes/redirect_request_for_dump_all.json ++++ b/tests/cassettes/redirect_request_for_dump_all.json +@@ -1 +1,232 @@ +-{"recorded_with": "betamax/0.5.1", "http_interactions": [{"recorded_at": "2015-11-14T22:53:20", "request": {"uri": "https://httpbin.org/redirect/5", "method": "GET", "body": {"string": "", "encoding": "utf-8"}, "headers": {"Connection": "keep-alive", "Accept": "*/*", "User-Agent": "python-requests/2.8.1", "Accept-Encoding": "gzip, deflate"}}, "response": {"url": "https://httpbin.org/redirect/5", "status": {"code": 302, "message": "FOUND"}, "body": {"string": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<title>Redirecting...</title>\n<h1>Redirecting...</h1>\n<p>You should be redirected automatically to target URL: <a href=\"/relative-redirect/4\">/relative-redirect/4</a>. If not click the link.", "encoding": "utf-8"}, "headers": {"Location": "/relative-redirect/4", "Access-Control-Allow-Credentials": "true", "Server": "nginx", "Date": "Sat, 14 Nov 2015 22:53:18 GMT", "Content-Length": "247", "Connection": "keep-alive", "Access-Control-Allow-Origin": "*", "Content-Type": "text/html; charset=utf-8"}}}, {"recorded_at": "2015-11-14T22:53:20", "request": {"uri": "https://httpbin.org/relative-redirect/4", "method": "GET", "body": {"string": "", "encoding": "utf-8"}, "headers": {"Connection": "keep-alive", "Accept": "*/*", "User-Agent": "python-requests/2.8.1", "Accept-Encoding": "gzip, deflate"}}, "response": {"url": "https://httpbin.org/relative-redirect/4", "status": {"code": 302, "message": "FOUND"}, "body": {"string": "", "encoding": "utf-8"}, "headers": {"Location": "/relative-redirect/3", "Access-Control-Allow-Credentials": "true", "Server": "nginx", "Date": "Sat, 14 Nov 2015 22:53:18 GMT", "Content-Length": "0", "Connection": "keep-alive", "Access-Control-Allow-Origin": "*", "Content-Type": "text/html; charset=utf-8"}}}, {"recorded_at": "2015-11-14T22:53:20", "request": {"uri": "https://httpbin.org/relative-redirect/3", "method": "GET", "body": {"string": "", "encoding": "utf-8"}, "headers": {"Connection": "keep-alive", "Accept": "*/*", "User-Agent": "python-requests/2.8.1", "Accept-Encoding": "gzip, deflate"}}, "response": {"url": "https://httpbin.org/relative-redirect/3", "status": {"code": 302, "message": "FOUND"}, "body": {"string": "", "encoding": "utf-8"}, "headers": {"Location": "/relative-redirect/2", "Access-Control-Allow-Credentials": "true", "Server": "nginx", "Date": "Sat, 14 Nov 2015 22:53:18 GMT", "Content-Length": "0", "Connection": "keep-alive", "Access-Control-Allow-Origin": "*", "Content-Type": "text/html; charset=utf-8"}}}, {"recorded_at": "2015-11-14T22:53:20", "request": {"uri": "https://httpbin.org/relative-redirect/2", "method": "GET", "body": {"string": "", "encoding": "utf-8"}, "headers": {"Connection": "keep-alive", "Accept": "*/*", "User-Agent": "python-requests/2.8.1", "Accept-Encoding": "gzip, deflate"}}, "response": {"url": "https://httpbin.org/relative-redirect/2", "status": {"code": 302, "message": "FOUND"}, "body": {"string": "", "encoding": "utf-8"}, "headers": {"Location": "/relative-redirect/1", "Access-Control-Allow-Credentials": "true", "Server": "nginx", "Date": "Sat, 14 Nov 2015 22:53:18 GMT", "Content-Length": "0", "Connection": "keep-alive", "Access-Control-Allow-Origin": "*", "Content-Type": "text/html; charset=utf-8"}}}, {"recorded_at": "2015-11-14T22:53:20", "request": {"uri": "https://httpbin.org/relative-redirect/1", "method": "GET", "body": {"string": "", "encoding": "utf-8"}, "headers": {"Connection": "keep-alive", "Accept": "*/*", "User-Agent": "python-requests/2.8.1", "Accept-Encoding": "gzip, deflate"}}, "response": {"url": "https://httpbin.org/relative-redirect/1", "status": {"code": 302, "message": "FOUND"}, "body": {"string": "", "encoding": "utf-8"}, "headers": {"Location": "/get", "Access-Control-Allow-Credentials": "true", "Server": "nginx", "Date": "Sat, 14 Nov 2015 22:53:18 GMT", "Content-Length": "0", "Connection": "keep-alive", "Access-Control-Allow-Origin": "*", "Content-Type": "text/html; charset=utf-8"}}}, {"recorded_at": "2015-11-14T22:53:20", "request": {"uri": "https://httpbin.org/get", "method": "GET", "body": {"string": "", "encoding": "utf-8"}, "headers": {"Connection": "keep-alive", "Accept": "*/*", "User-Agent": "python-requests/2.8.1", "Accept-Encoding": "gzip, deflate"}}, "response": {"url": "https://httpbin.org/get", "status": {"code": 200, "message": "OK"}, "body": {"string": "{\n \"args\": {}, \n \"headers\": {\n \"Accept\": \"*/*\", \n \"Accept-Encoding\": \"gzip, deflate\", \n \"Host\": \"httpbin.org\", \n \"User-Agent\": \"python-requests/2.8.1\"\n }, \n \"origin\": \"<IPADDR>\", \n \"url\": \"https://httpbin.org/get\"\n}\n", "encoding": null}, "headers": {"Access-Control-Allow-Credentials": "true", "Server": "nginx", "Date": "Sat, 14 Nov 2015 22:53:18 GMT", "Content-Length": "239", "Connection": "keep-alive", "Access-Control-Allow-Origin": "*", "Content-Type": "application/json"}}}]} +\ No newline at end of file ++{ ++ "http_interactions": [ ++ { ++ "recorded_at": "2015-11-14T22:53:20", ++ "request": { ++ "body": { ++ "encoding": "utf-8", ++ "string": "" ++ }, ++ "headers": { ++ "Accept": "*/*", ++ "Accept-Encoding": "gzip, deflate", ++ "Connection": "keep-alive", ++ "User-Agent": "python-requests/2.8.1" ++ }, ++ "method": "GET", ++ "uri": "https://httpbin.org/redirect/5" ++ }, ++ "response": { ++ "body": { ++ "encoding": "utf-8", ++ "string": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<title>Redirecting...</title>\n<h1>Redirecting...</h1>\n<p>You should be redirected automatically to target URL: <a href=\"/relative-redirect/4\">/relative-redirect/4</a>. If not click the link." ++ }, ++ "headers": { ++ "Access-Control-Allow-Credentials": "true", ++ "Access-Control-Allow-Origin": "*", ++ "Connection": "keep-alive", ++ "Content-Length": "247", ++ "Content-Type": "text/html; charset=utf-8", ++ "Date": "Sat, 14 Nov 2015 22:53:18 GMT", ++ "Location": "/relative-redirect/4", ++ "Server": "nginx" ++ }, ++ "status": { ++ "code": 302, ++ "message": "FOUND" ++ }, ++ "url": "https://httpbin.org/redirect/5" ++ } ++ }, ++ { ++ "recorded_at": "2015-11-14T22:53:20", ++ "request": { ++ "body": { ++ "encoding": "utf-8", ++ "string": "" ++ }, ++ "headers": { ++ "Accept": "*/*", ++ "Accept-Encoding": "gzip, deflate", ++ "Connection": "keep-alive", ++ "User-Agent": "python-requests/2.8.1" ++ }, ++ "method": "GET", ++ "uri": "https://httpbin.org/relative-redirect/4" ++ }, ++ "response": { ++ "body": { ++ "encoding": "utf-8", ++ "string": "" ++ }, ++ "headers": { ++ "Access-Control-Allow-Credentials": "true", ++ "Access-Control-Allow-Origin": "*", ++ "Connection": "keep-alive", ++ "Content-Length": "0", ++ "Content-Type": "text/html; charset=utf-8", ++ "Date": "Sat, 14 Nov 2015 22:53:18 GMT", ++ "Location": "/relative-redirect/3", ++ "Server": "nginx" ++ }, ++ "status": { ++ "code": 302, ++ "message": "FOUND" ++ }, ++ "url": "https://httpbin.org/relative-redirect/4" ++ } ++ }, ++ { ++ "recorded_at": "2015-11-14T22:53:20", ++ "request": { ++ "body": { ++ "encoding": "utf-8", ++ "string": "" ++ }, ++ "headers": { ++ "Accept": "*/*", ++ "Accept-Encoding": "gzip, deflate", ++ "Connection": "keep-alive", ++ "User-Agent": "python-requests/2.8.1" ++ }, ++ "method": "GET", ++ "uri": "https://httpbin.org/relative-redirect/3" ++ }, ++ "response": { ++ "body": { ++ "encoding": "utf-8", ++ "string": "" ++ }, ++ "headers": { ++ "Access-Control-Allow-Credentials": "true", ++ "Access-Control-Allow-Origin": "*", ++ "Connection": "keep-alive", ++ "Content-Length": "0", ++ "Content-Type": "text/html; charset=utf-8", ++ "Date": "Sat, 14 Nov 2015 22:53:18 GMT", ++ "Location": "/relative-redirect/2", ++ "Server": "nginx" ++ }, ++ "status": { ++ "code": 302, ++ "message": "FOUND" ++ }, ++ "url": "https://httpbin.org/relative-redirect/3" ++ } ++ }, ++ { ++ "recorded_at": "2015-11-14T22:53:20", ++ "request": { ++ "body": { ++ "encoding": "utf-8", ++ "string": "" ++ }, ++ "headers": { ++ "Accept": "*/*", ++ "Accept-Encoding": "gzip, deflate", ++ "Connection": "keep-alive", ++ "User-Agent": "python-requests/2.8.1" ++ }, ++ "method": "GET", ++ "uri": "https://httpbin.org/relative-redirect/2" ++ }, ++ "response": { ++ "body": { ++ "encoding": "utf-8", ++ "string": "" ++ }, ++ "headers": { ++ "Access-Control-Allow-Credentials": "true", ++ "Access-Control-Allow-Origin": "*", ++ "Connection": "keep-alive", ++ "Content-Length": "0", ++ "Content-Type": "text/html; charset=utf-8", ++ "Date": "Sat, 14 Nov 2015 22:53:18 GMT", ++ "Location": "/relative-redirect/1", ++ "Server": "nginx" ++ }, ++ "status": { ++ "code": 302, ++ "message": "FOUND" ++ }, ++ "url": "https://httpbin.org/relative-redirect/2" ++ } ++ }, ++ { ++ "recorded_at": "2015-11-14T22:53:20", ++ "request": { ++ "body": { ++ "encoding": "utf-8", ++ "string": "" ++ }, ++ "headers": { ++ "Accept": "*/*", ++ "Accept-Encoding": "gzip, deflate", ++ "Connection": "keep-alive", ++ "User-Agent": "python-requests/2.8.1" ++ }, ++ "method": "GET", ++ "uri": "https://httpbin.org/relative-redirect/1" ++ }, ++ "response": { ++ "body": { ++ "encoding": "utf-8", ++ "string": "" ++ }, ++ "headers": { ++ "Access-Control-Allow-Credentials": "true", ++ "Access-Control-Allow-Origin": "*", ++ "Connection": "keep-alive", ++ "Content-Length": "0", ++ "Content-Type": "text/html; charset=utf-8", ++ "Date": "Sat, 14 Nov 2015 22:53:18 GMT", ++ "Location": "/get", ++ "Server": "nginx" ++ }, ++ "status": { ++ "code": 302, ++ "message": "FOUND" ++ }, ++ "url": "https://httpbin.org/relative-redirect/1" ++ } ++ }, ++ { ++ "recorded_at": "2015-11-14T22:53:20", ++ "request": { ++ "body": { ++ "encoding": "utf-8", ++ "string": "" ++ }, ++ "headers": { ++ "Accept": "*/*", ++ "Accept-Encoding": "gzip, deflate", ++ "Connection": "keep-alive", ++ "User-Agent": "python-requests/2.8.1" ++ }, ++ "method": "GET", ++ "uri": "https://httpbin.org/get" ++ }, ++ "response": { ++ "body": { ++ "encoding": null, ++ "string": "{\n \"args\": {}, \n \"headers\": {\n \"Accept\": \"*/*\", \n \"Accept-Encoding\": \"gzip, deflate\", \n \"Host\": \"httpbin.org\", \n \"User-Agent\": \"python-requests/2.8.1\"\n }, \n \"origin\": \"<IPADDR>\", \n \"url\": \"https://httpbin.org/get\"\n}\n" ++ }, ++ "headers": { ++ "Access-Control-Allow-Credentials": "true", ++ "Access-Control-Allow-Origin": "*", ++ "Connection": "keep-alive", ++ "Content-Length": "239", ++ "Content-Type": "application/json", ++ "Date": "Sat, 14 Nov 2015 22:53:18 GMT", ++ "Server": "nginx" ++ }, ++ "status": { ++ "code": 200, ++ "message": "OK" ++ }, ++ "url": "https://httpbin.org/get" ++ } ++ } ++ ], ++ "recorded_with": "betamax/0.5.1" ++} +\ No newline at end of file +diff --git a/tests/cassettes/simple_get_request.json b/tests/cassettes/simple_get_request.json +index a61fb5f..68378cd 100644 +--- a/tests/cassettes/simple_get_request.json ++++ b/tests/cassettes/simple_get_request.json +@@ -1 +1,64 @@ +-{"recorded_with": "betamax/0.5.1", "http_interactions": [{"request": {"body": {"encoding": "utf-8", "string": ""}, "uri": "https://httpbin.org/get", "headers": {"Connection": ["keep-alive"], "User-Agent": ["python-requests/2.8.1"], "Accept": ["*/*"], "Accept-Encoding": ["gzip, deflate"]}, "method": "GET"}, "recorded_at": "2015-11-14T22:33:32", "response": {"status": {"code": 200, "message": "OK"}, "url": "https://httpbin.org/get", "body": {"encoding": null, "string": "{\n \"args\": {}, \n \"headers\": {\n \"Accept\": \"*/*\", \n \"Accept-Encoding\": \"gzip, deflate\", \n \"Host\": \"httpbin.org\", \n \"User-Agent\": \"python-requests/2.8.1\"\n }, \n \"origin\": \"<IPADDR>\", \n \"url\": \"https://httpbin.org/get\"\n}\n"}, "headers": {"Content-Type": ["application/json"], "Date": ["Sat, 14 Nov 2015 22:33:30 GMT"], "Connection": ["keep-alive"], "Server": ["nginx"], "Access-Control-Allow-Credentials": ["true"], "Content-Length": ["239"], "Access-Control-Allow-Origin": ["*"]}}}]} ++{ ++ "http_interactions": [ ++ { ++ "recorded_at": "2015-11-14T22:33:32", ++ "request": { ++ "body": { ++ "encoding": "utf-8", ++ "string": "" ++ }, ++ "headers": { ++ "Accept": [ ++ "*/*" ++ ], ++ "Accept-Encoding": [ ++ "gzip, deflate" ++ ], ++ "Connection": [ ++ "keep-alive" ++ ], ++ "User-Agent": [ ++ "python-requests/2.8.1" ++ ] ++ }, ++ "method": "GET", ++ "uri": "https://httpbin.org/get" ++ }, ++ "response": { ++ "body": { ++ "encoding": null, ++ "string": "{\n \"args\": {}, \n \"headers\": {\n \"Accept\": \"*/*\", \n \"Accept-Encoding\": \"gzip, deflate\", \n \"Host\": \"httpbin.org\", \n \"User-Agent\": \"python-requests/2.8.1\"\n }, \n \"origin\": \"<IPADDR>\", \n \"url\": \"https://httpbin.org/get\"\n}\n" ++ }, ++ "headers": { ++ "Access-Control-Allow-Credentials": [ ++ "true" ++ ], ++ "Access-Control-Allow-Origin": [ ++ "*" ++ ], ++ "Connection": [ ++ "keep-alive" ++ ], ++ "Content-Length": [ ++ "239" ++ ], ++ "Content-Type": [ ++ "application/json" ++ ], ++ "Date": [ ++ "Sat, 14 Nov 2015 22:33:30 GMT" ++ ], ++ "Server": [ ++ "nginx" ++ ] ++ }, ++ "status": { ++ "code": 200, ++ "message": "OK" ++ }, ++ "url": "https://httpbin.org/get" ++ } ++ } ++ ], ++ "recorded_with": "betamax/0.5.1" ++} +\ No newline at end of file +diff --git a/tests/cassettes/stream_response_to_file.json b/tests/cassettes/stream_response_to_file.json +index 9807e41..ff407da 100644 +--- a/tests/cassettes/stream_response_to_file.json ++++ b/tests/cassettes/stream_response_to_file.json +@@ -1 +1,180 @@ +-{"recorded_with": "betamax/0.4.1", "http_interactions": [{"request": {"uri": "https://api.github.com/repos/sigmavirus24/github3.py/releases/assets/37944", "method": "GET", "headers": {"Accept": ["application/octet-stream"], "Accept-Encoding": ["gzip, deflate"], "Connection": ["keep-alive"], "User-Agent": ["python-requests/2.5.3 CPython/2.7.9 Darwin/14.1.0"]}, "body": {"base64_string": "", "encoding": "utf-8"}}, "response": {"status": {"code": 302, "message": "Found"}, "url": "https://api.github.com/repos/sigmavirus24/github3.py/releases/assets/37944", "headers": {"access-control-allow-credentials": ["true"], "x-xss-protection": ["1; mode=block"], "vary": ["Accept-Encoding"], "location": ["https://s3.amazonaws.com/github-cloud/releases/3710711/365425c2-4e46-11e3-86fb-bb0d50a886e7.whl?response-content-disposition=attachment%3B%20filename%3Dgithub3.py-0.7.1-py2.py3-none-any.whl&response-content-type=application/octet-stream&AWSAccessKeyId=AKIAISTNZFOVBIJMK3TQ&Expires=1426166613&Signature=78anFgNgXLm3TIbo%2FbTEEk7m%2F34%3D"], "x-content-type-options": ["nosniff"], "content-security-policy": ["default-src 'none'"], "x-ratelimit-limit": ["60"], "content-length": ["0"], "status": ["302 Found"], "x-frame-options": ["deny"], "x-served-by": ["8dd185e423974a7e13abbbe6e060031e"], "server": ["GitHub.com"], "access-control-allow-origin": ["*"], "strict-transport-security": ["max-age=31536000; includeSubdomains; preload"], "x-github-request-id": ["48A0C951:54E7:48B5311:55019319"], "date": ["Thu, 12 Mar 2015 13:22:33 GMT"], "access-control-expose-headers": ["ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval"], "x-ratelimit-remaining": ["58"], "content-type": ["text/html;charset=utf-8"], "x-ratelimit-reset": ["1426170017"]}, "body": {"base64_string": "", "encoding": "utf-8"}}, "recorded_at": "2015-03-12T13:22:33"}, {"request": {"uri": "https://s3.amazonaws.com/github-cloud/releases/3710711/365425c2-4e46-11e3-86fb-bb0d50a886e7.whl?response-content-disposition=attachment%3B%20filename%3Dgithub3.py-0.7.1-py2.py3-none-any.whl&response-content-type=application/octet-stream&AWSAccessKeyId=AKIAISTNZFOVBIJMK3TQ&Expires=1426166613&Signature=78anFgNgXLm3TIbo%2FbTEEk7m%2F34%3D", "method": "GET", "headers": {"Accept": ["application/octet-stream"], "Accept-Encoding": ["gzip, deflate"], "Connection": ["keep-alive"], "User-Agent": ["python-requests/2.5.3 CPython/2.7.9 Darwin/14.1.0"]}, "body": {"base64_string": "", "encoding": "utf-8"}}, "response": {"status": {"code": 200, "message": "OK"}, "url": "https://s3.amazonaws.com/github-cloud/releases/3710711/365425c2-4e46-11e3-86fb-bb0d50a886e7.whl?response-content-disposition=attachment%3B%20filename%3Dgithub3.py-0.7.1-py2.py3-none-any.whl&response-content-type=application/octet-stream&AWSAccessKeyId=AKIAISTNZFOVBIJMK3TQ&Expires=1426166613&Signature=78anFgNgXLm3TIbo%2FbTEEk7m%2F34%3D", "headers": {"accept-ranges": ["bytes"], "content-disposition": ["attachment; filename=github3.py-0.7.1-py2.py3-none-any.whl"], "x-amz-id-2": ["9+TuHhbd7y2BUJaEV+mFpaDgjl1g9uSAPiZxwc6b2cYydhlhZSyKSuB7PQyiPBPD"], "content-length": ["117140"], "x-amz-meta-surrogate-key": ["repository-3710711 user-240830"], "x-amz-request-id": ["4B4BFE6BF5135B8D"], "last-modified": ["Fri, 15 Nov 2013 22:35:23 GMT"], "x-amz-meta-surrogate-control": ["max-age=31557600"], "etag": ["\"6550854f02f7bf10b944070b84f38313\""], "date": ["Thu, 12 Mar 2015 13:22:35 GMT"], "cache-control": ["max-age=31557600"], "content-type": ["application/octet-stream"], "server": ["AmazonS3"]}, "body": {"base64_string": "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", "encoding": null}}, "recorded_at": "2015-03-12T13:22:34"}]} +\ No newline at end of file ++{ ++ "http_interactions": [ ++ { ++ "recorded_at": "2015-03-12T13:22:33", ++ "request": { ++ "body": { ++ "base64_string": "", ++ "encoding": "utf-8" ++ }, ++ "headers": { ++ "Accept": [ ++ "application/octet-stream" ++ ], ++ "Accept-Encoding": [ ++ "gzip, deflate" ++ ], ++ "Connection": [ ++ "keep-alive" ++ ], ++ "User-Agent": [ ++ "python-requests/2.5.3 CPython/2.7.9 Darwin/14.1.0" ++ ] ++ }, ++ "method": "GET", ++ "uri": "https://api.github.com/repos/sigmavirus24/github3.py/releases/assets/37944" ++ }, ++ "response": { ++ "body": { ++ "base64_string": "", ++ "encoding": "utf-8" ++ }, ++ "headers": { ++ "access-control-allow-credentials": [ ++ "true" ++ ], ++ "access-control-allow-origin": [ ++ "*" ++ ], ++ "access-control-expose-headers": [ ++ "ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval" ++ ], ++ "content-length": [ ++ "0" ++ ], ++ "content-security-policy": [ ++ "default-src 'none'" ++ ], ++ "content-type": [ ++ "text/html;charset=utf-8" ++ ], ++ "date": [ ++ "Thu, 12 Mar 2015 13:22:33 GMT" ++ ], ++ "location": [ ++ "https://s3.amazonaws.com/github-cloud/releases/3710711/365425c2-4e46-11e3-86fb-bb0d50a886e7.whl?response-content-disposition=attachment%3B%20filename%3Dgithub3.py-0.7.1-py2.py3-none-any.whl&response-content-type=application/octet-stream&AWSAccessKeyId=AKIAISTNZFOVBIJMK3TQ&Expires=1426166613&Signature=78anFgNgXLm3TIbo%2FbTEEk7m%2F34%3D" ++ ], ++ "server": [ ++ "GitHub.com" ++ ], ++ "status": [ ++ "302 Found" ++ ], ++ "strict-transport-security": [ ++ "max-age=31536000; includeSubdomains; preload" ++ ], ++ "vary": [ ++ "Accept-Encoding" ++ ], ++ "x-content-type-options": [ ++ "nosniff" ++ ], ++ "x-frame-options": [ ++ "deny" ++ ], ++ "x-github-request-id": [ ++ "48A0C951:54E7:48B5311:55019319" ++ ], ++ "x-ratelimit-limit": [ ++ "60" ++ ], ++ "x-ratelimit-remaining": [ ++ "58" ++ ], ++ "x-ratelimit-reset": [ ++ "1426170017" ++ ], ++ "x-served-by": [ ++ "8dd185e423974a7e13abbbe6e060031e" ++ ], ++ "x-xss-protection": [ ++ "1; mode=block" ++ ] ++ }, ++ "status": { ++ "code": 302, ++ "message": "Found" ++ }, ++ "url": "https://api.github.com/repos/sigmavirus24/github3.py/releases/assets/37944" ++ } ++ }, ++ { ++ "recorded_at": "2015-03-12T13:22:34", ++ "request": { ++ "body": { ++ "base64_string": "", ++ "encoding": "utf-8" ++ }, ++ "headers": { ++ "Accept": [ ++ "application/octet-stream" ++ ], ++ "Accept-Encoding": [ ++ "gzip, deflate" ++ ], ++ "Connection": [ ++ "keep-alive" ++ ], ++ "User-Agent": [ ++ "python-requests/2.5.3 CPython/2.7.9 Darwin/14.1.0" ++ ] ++ }, ++ "method": "GET", ++ "uri": "https://s3.amazonaws.com/github-cloud/releases/3710711/365425c2-4e46-11e3-86fb-bb0d50a886e7.whl?response-content-disposition=attachment%3B%20filename%3Dgithub3.py-0.7.1-py2.py3-none-any.whl&response-content-type=application/octet-stream&AWSAccessKeyId=AKIAISTNZFOVBIJMK3TQ&Expires=1426166613&Signature=78anFgNgXLm3TIbo%2FbTEEk7m%2F34%3D" ++ }, ++ "response": { ++ "body": { ++ "base64_string": "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", ++ "encoding": null ++ }, ++ "headers": { ++ "accept-ranges": [ ++ "bytes" ++ ], ++ "cache-control": [ ++ "max-age=31557600" ++ ], ++ "content-disposition": [ ++ "attachment; filename=github3.py-0.7.1-py2.py3-none-any.whl" ++ ], ++ "content-length": [ ++ "117140" ++ ], ++ "content-type": [ ++ "application/octet-stream" ++ ], ++ "date": [ ++ "Thu, 12 Mar 2015 13:22:35 GMT" ++ ], ++ "etag": [ ++ "\"6550854f02f7bf10b944070b84f38313\"" ++ ], ++ "last-modified": [ ++ "Fri, 15 Nov 2013 22:35:23 GMT" ++ ], ++ "server": [ ++ "AmazonS3" ++ ], ++ "x-amz-id-2": [ ++ "9+TuHhbd7y2BUJaEV+mFpaDgjl1g9uSAPiZxwc6b2cYydhlhZSyKSuB7PQyiPBPD" ++ ], ++ "x-amz-meta-surrogate-control": [ ++ "max-age=31557600" ++ ], ++ "x-amz-meta-surrogate-key": [ ++ "repository-3710711 user-240830" ++ ], ++ "x-amz-request-id": [ ++ "4B4BFE6BF5135B8D" ++ ] ++ }, ++ "status": { ++ "code": 200, ++ "message": "OK" ++ }, ++ "url": "https://s3.amazonaws.com/github-cloud/releases/3710711/365425c2-4e46-11e3-86fb-bb0d50a886e7.whl?response-content-disposition=attachment%3B%20filename%3Dgithub3.py-0.7.1-py2.py3-none-any.whl&response-content-type=application/octet-stream&AWSAccessKeyId=AKIAISTNZFOVBIJMK3TQ&Expires=1426166613&Signature=78anFgNgXLm3TIbo%2FbTEEk7m%2F34%3D" ++ } ++ } ++ ], ++ "recorded_with": "betamax/0.4.1" ++} +\ No newline at end of file +diff --git a/tests/cassettes/stream_response_without_content_length_to_file.json b/tests/cassettes/stream_response_without_content_length_to_file.json +index f2bf898..75944d0 100644 +--- a/tests/cassettes/stream_response_without_content_length_to_file.json ++++ b/tests/cassettes/stream_response_without_content_length_to_file.json +@@ -1 +1,174 @@ +-{"recorded_with": "betamax/0.4.1", "http_interactions": [{"request": {"uri": "https://api.github.com/repos/sigmavirus24/github3.py/releases/assets/37944", "method": "GET", "headers": {"Accept": ["application/octet-stream"], "Accept-Encoding": ["gzip, deflate"], "Connection": ["keep-alive"], "User-Agent": ["python-requests/2.5.3 CPython/2.7.9 Darwin/14.1.0"]}, "body": {"base64_string": "", "encoding": "utf-8"}}, "response": {"status": {"code": 302, "message": "Found"}, "url": "https://api.github.com/repos/sigmavirus24/github3.py/releases/assets/37944", "headers": {"access-control-allow-credentials": ["true"], "x-xss-protection": ["1; mode=block"], "vary": ["Accept-Encoding"], "location": ["https://s3.amazonaws.com/github-cloud/releases/3710711/365425c2-4e46-11e3-86fb-bb0d50a886e7.whl?response-content-disposition=attachment%3B%20filename%3Dgithub3.py-0.7.1-py2.py3-none-any.whl&response-content-type=application/octet-stream&AWSAccessKeyId=AKIAISTNZFOVBIJMK3TQ&Expires=1426166613&Signature=78anFgNgXLm3TIbo%2FbTEEk7m%2F34%3D"], "x-content-type-options": ["nosniff"], "content-security-policy": ["default-src 'none'"], "x-ratelimit-limit": ["60"], "status": ["302 Found"], "x-frame-options": ["deny"], "x-served-by": ["8dd185e423974a7e13abbbe6e060031e"], "server": ["GitHub.com"], "access-control-allow-origin": ["*"], "strict-transport-security": ["max-age=31536000; includeSubdomains; preload"], "x-github-request-id": ["48A0C951:54E7:48B5311:55019319"], "date": ["Thu, 12 Mar 2015 13:22:33 GMT"], "access-control-expose-headers": ["ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval"], "x-ratelimit-remaining": ["58"], "content-type": ["text/html;charset=utf-8"], "x-ratelimit-reset": ["1426170017"]}, "body": {"base64_string": "", "encoding": "utf-8"}}, "recorded_at": "2015-03-12T13:22:33"}, {"request": {"uri": "https://s3.amazonaws.com/github-cloud/releases/3710711/365425c2-4e46-11e3-86fb-bb0d50a886e7.whl?response-content-disposition=attachment%3B%20filename%3Dgithub3.py-0.7.1-py2.py3-none-any.whl&response-content-type=application/octet-stream&AWSAccessKeyId=AKIAISTNZFOVBIJMK3TQ&Expires=1426166613&Signature=78anFgNgXLm3TIbo%2FbTEEk7m%2F34%3D", "method": "GET", "headers": {"Accept": ["application/octet-stream"], "Accept-Encoding": ["gzip, deflate"], "Connection": ["keep-alive"], "User-Agent": ["python-requests/2.5.3 CPython/2.7.9 Darwin/14.1.0"]}, "body": {"base64_string": "", "encoding": "utf-8"}}, "response": {"status": {"code": 200, "message": "OK"}, "url": "https://s3.amazonaws.com/github-cloud/releases/3710711/365425c2-4e46-11e3-86fb-bb0d50a886e7.whl?response-content-disposition=attachment%3B%20filename%3Dgithub3.py-0.7.1-py2.py3-none-any.whl&response-content-type=application/octet-stream&AWSAccessKeyId=AKIAISTNZFOVBIJMK3TQ&Expires=1426166613&Signature=78anFgNgXLm3TIbo%2FbTEEk7m%2F34%3D", "headers": {"accept-ranges": ["bytes"], "content-disposition": ["attachment; filename=github3.py-0.7.1-py2.py3-none-any.whl"], "x-amz-id-2": ["9+TuHhbd7y2BUJaEV+mFpaDgjl1g9uSAPiZxwc6b2cYydhlhZSyKSuB7PQyiPBPD"], "x-amz-meta-surrogate-key": ["repository-3710711 user-240830"], "x-amz-request-id": ["4B4BFE6BF5135B8D"], "last-modified": ["Fri, 15 Nov 2013 22:35:23 GMT"], "x-amz-meta-surrogate-control": ["max-age=31557600"], "etag": ["\"6550854f02f7bf10b944070b84f38313\""], "date": ["Thu, 12 Mar 2015 13:22:35 GMT"], "cache-control": ["max-age=31557600"], "content-type": ["application/octet-stream"], "server": ["AmazonS3"]}, "body": {"base64_string": "", "encoding": null}}, "recorded_at": "2015-03-12T13:22:34"}]} ++{ ++ "http_interactions": [ ++ { ++ "recorded_at": "2015-03-12T13:22:33", ++ "request": { ++ "body": { ++ "base64_string": "", ++ "encoding": "utf-8" ++ }, ++ "headers": { ++ "Accept": [ ++ "application/octet-stream" ++ ], ++ "Accept-Encoding": [ ++ "gzip, deflate" ++ ], ++ "Connection": [ ++ "keep-alive" ++ ], ++ "User-Agent": [ ++ "python-requests/2.5.3 CPython/2.7.9 Darwin/14.1.0" ++ ] ++ }, ++ "method": "GET", ++ "uri": "https://api.github.com/repos/sigmavirus24/github3.py/releases/assets/37944" ++ }, ++ "response": { ++ "body": { ++ "base64_string": "", ++ "encoding": "utf-8" ++ }, ++ "headers": { ++ "access-control-allow-credentials": [ ++ "true" ++ ], ++ "access-control-allow-origin": [ ++ "*" ++ ], ++ "access-control-expose-headers": [ ++ "ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval" ++ ], ++ "content-security-policy": [ ++ "default-src 'none'" ++ ], ++ "content-type": [ ++ "text/html;charset=utf-8" ++ ], ++ "date": [ ++ "Thu, 12 Mar 2015 13:22:33 GMT" ++ ], ++ "location": [ ++ "https://s3.amazonaws.com/github-cloud/releases/3710711/365425c2-4e46-11e3-86fb-bb0d50a886e7.whl?response-content-disposition=attachment%3B%20filename%3Dgithub3.py-0.7.1-py2.py3-none-any.whl&response-content-type=application/octet-stream&AWSAccessKeyId=AKIAISTNZFOVBIJMK3TQ&Expires=1426166613&Signature=78anFgNgXLm3TIbo%2FbTEEk7m%2F34%3D" ++ ], ++ "server": [ ++ "GitHub.com" ++ ], ++ "status": [ ++ "302 Found" ++ ], ++ "strict-transport-security": [ ++ "max-age=31536000; includeSubdomains; preload" ++ ], ++ "vary": [ ++ "Accept-Encoding" ++ ], ++ "x-content-type-options": [ ++ "nosniff" ++ ], ++ "x-frame-options": [ ++ "deny" ++ ], ++ "x-github-request-id": [ ++ "48A0C951:54E7:48B5311:55019319" ++ ], ++ "x-ratelimit-limit": [ ++ "60" ++ ], ++ "x-ratelimit-remaining": [ ++ "58" ++ ], ++ "x-ratelimit-reset": [ ++ "1426170017" ++ ], ++ "x-served-by": [ ++ "8dd185e423974a7e13abbbe6e060031e" ++ ], ++ "x-xss-protection": [ ++ "1; mode=block" ++ ] ++ }, ++ "status": { ++ "code": 302, ++ "message": "Found" ++ }, ++ "url": "https://api.github.com/repos/sigmavirus24/github3.py/releases/assets/37944" ++ } ++ }, ++ { ++ "recorded_at": "2015-03-12T13:22:34", ++ "request": { ++ "body": { ++ "base64_string": "", ++ "encoding": "utf-8" ++ }, ++ "headers": { ++ "Accept": [ ++ "application/octet-stream" ++ ], ++ "Accept-Encoding": [ ++ "gzip, deflate" ++ ], ++ "Connection": [ ++ "keep-alive" ++ ], ++ "User-Agent": [ ++ "python-requests/2.5.3 CPython/2.7.9 Darwin/14.1.0" ++ ] ++ }, ++ "method": "GET", ++ "uri": "https://s3.amazonaws.com/github-cloud/releases/3710711/365425c2-4e46-11e3-86fb-bb0d50a886e7.whl?response-content-disposition=attachment%3B%20filename%3Dgithub3.py-0.7.1-py2.py3-none-any.whl&response-content-type=application/octet-stream&AWSAccessKeyId=AKIAISTNZFOVBIJMK3TQ&Expires=1426166613&Signature=78anFgNgXLm3TIbo%2FbTEEk7m%2F34%3D" ++ }, ++ "response": { ++ "body": { ++ "base64_string": "", ++ "encoding": null ++ }, ++ "headers": { ++ "accept-ranges": [ ++ "bytes" ++ ], ++ "cache-control": [ ++ "max-age=31557600" ++ ], ++ "content-disposition": [ ++ "attachment; filename=github3.py-0.7.1-py2.py3-none-any.whl" ++ ], ++ "content-type": [ ++ "application/octet-stream" ++ ], ++ "date": [ ++ "Thu, 12 Mar 2015 13:22:35 GMT" ++ ], ++ "etag": [ ++ "\"6550854f02f7bf10b944070b84f38313\"" ++ ], ++ "last-modified": [ ++ "Fri, 15 Nov 2013 22:35:23 GMT" ++ ], ++ "server": [ ++ "AmazonS3" ++ ], ++ "x-amz-id-2": [ ++ "9+TuHhbd7y2BUJaEV+mFpaDgjl1g9uSAPiZxwc6b2cYydhlhZSyKSuB7PQyiPBPD" ++ ], ++ "x-amz-meta-surrogate-control": [ ++ "max-age=31557600" ++ ], ++ "x-amz-meta-surrogate-key": [ ++ "repository-3710711 user-240830" ++ ], ++ "x-amz-request-id": [ ++ "4B4BFE6BF5135B8D" ++ ] ++ }, ++ "status": { ++ "code": 200, ++ "message": "OK" ++ }, ++ "url": "https://s3.amazonaws.com/github-cloud/releases/3710711/365425c2-4e46-11e3-86fb-bb0d50a886e7.whl?response-content-disposition=attachment%3B%20filename%3Dgithub3.py-0.7.1-py2.py3-none-any.whl&response-content-type=application/octet-stream&AWSAccessKeyId=AKIAISTNZFOVBIJMK3TQ&Expires=1426166613&Signature=78anFgNgXLm3TIbo%2FbTEEk7m%2F34%3D" ++ } ++ } ++ ], ++ "recorded_with": "betamax/0.4.1" ++} +\ No newline at end of file +diff --git a/tests/cassettes/test_x509_adapter_der.json b/tests/cassettes/test_x509_adapter_der.json +index 0f4072a..8fd5c0c 100644 +--- a/tests/cassettes/test_x509_adapter_der.json ++++ b/tests/cassettes/test_x509_adapter_der.json +@@ -1 +1,68 @@ +-{"http_interactions": [{"request": {"body": {"encoding": "utf-8", "string": ""}, "headers": {"User-Agent": ["python-requests/2.21.0"], "Accept-Encoding": ["gzip, deflate"], "Accept": ["*/*"], "Connection": ["keep-alive"]}, "method": "GET", "uri": "https://pkiprojecttest01.dev.labs.internal/"}, "response": {"body": {"encoding": "ISO-8859-1", "base64_string": "H4sIAAAAAAAAA7NRdPF3DokMcFXIKMnNseOygVJJ+SmVdlxArqFdSGpxiY0+kAHkFoB5CsGlycmpxcU2+gUgQX2IYqAasBEAYvDs5FMAAAA=", "string": ""}, "headers": {"Server": ["nginx/1.10.3 (Ubuntu)"], "Date": ["Thu, 20 Dec 2018 20:02:30 GMT"], "Content-Type": ["text/html"], "Last-Modified": ["Mon, 19 Nov 2018 20:48:30 GMT"], "Transfer-Encoding": ["chunked"], "Connection": ["keep-alive"], "ETag": ["W/\"5bf3219e-53\""], "Content-Encoding": ["gzip"]}, "status": {"code": 200, "message": "OK"}, "url": "https://pkiprojecttest01.dev.labs.internal/"}, "recorded_at": "2018-12-20T20:02:30"}], "recorded_with": "betamax/0.8.1"} +\ No newline at end of file ++{ ++ "http_interactions": [ ++ { ++ "recorded_at": "2018-12-20T20:02:30", ++ "request": { ++ "body": { ++ "encoding": "utf-8", ++ "string": "" ++ }, ++ "headers": { ++ "Accept": [ ++ "*/*" ++ ], ++ "Accept-Encoding": [ ++ "gzip, deflate" ++ ], ++ "Connection": [ ++ "keep-alive" ++ ], ++ "User-Agent": [ ++ "python-requests/2.21.0" ++ ] ++ }, ++ "method": "GET", ++ "uri": "https://pkiprojecttest01.dev.labs.internal/" ++ }, ++ "response": { ++ "body": { ++ "base64_string": "H4sIAAAAAAAAA7NRdPF3DokMcFXIKMnNseOygVJJ+SmVdlxArqFdSGpxiY0+kAHkFoB5CsGlycmpxcU2+gUgQX2IYqAasBEAYvDs5FMAAAA=", ++ "encoding": "ISO-8859-1", ++ "string": "" ++ }, ++ "headers": { ++ "Connection": [ ++ "keep-alive" ++ ], ++ "Content-Encoding": [ ++ "gzip" ++ ], ++ "Content-Type": [ ++ "text/html" ++ ], ++ "Date": [ ++ "Thu, 20 Dec 2018 20:02:30 GMT" ++ ], ++ "ETag": [ ++ "W/\"5bf3219e-53\"" ++ ], ++ "Last-Modified": [ ++ "Mon, 19 Nov 2018 20:48:30 GMT" ++ ], ++ "Server": [ ++ "nginx/1.10.3 (Ubuntu)" ++ ], ++ "Transfer-Encoding": [ ++ "chunked" ++ ] ++ }, ++ "status": { ++ "code": 200, ++ "message": "OK" ++ }, ++ "url": "https://pkiprojecttest01.dev.labs.internal/" ++ } ++ } ++ ], ++ "recorded_with": "betamax/0.8.1" ++} +\ No newline at end of file +diff --git a/tests/cassettes/test_x509_adapter_pem.json b/tests/cassettes/test_x509_adapter_pem.json +index 0f4072a..8fd5c0c 100644 +--- a/tests/cassettes/test_x509_adapter_pem.json ++++ b/tests/cassettes/test_x509_adapter_pem.json +@@ -1 +1,68 @@ +-{"http_interactions": [{"request": {"body": {"encoding": "utf-8", "string": ""}, "headers": {"User-Agent": ["python-requests/2.21.0"], "Accept-Encoding": ["gzip, deflate"], "Accept": ["*/*"], "Connection": ["keep-alive"]}, "method": "GET", "uri": "https://pkiprojecttest01.dev.labs.internal/"}, "response": {"body": {"encoding": "ISO-8859-1", "base64_string": "H4sIAAAAAAAAA7NRdPF3DokMcFXIKMnNseOygVJJ+SmVdlxArqFdSGpxiY0+kAHkFoB5CsGlycmpxcU2+gUgQX2IYqAasBEAYvDs5FMAAAA=", "string": ""}, "headers": {"Server": ["nginx/1.10.3 (Ubuntu)"], "Date": ["Thu, 20 Dec 2018 20:02:30 GMT"], "Content-Type": ["text/html"], "Last-Modified": ["Mon, 19 Nov 2018 20:48:30 GMT"], "Transfer-Encoding": ["chunked"], "Connection": ["keep-alive"], "ETag": ["W/\"5bf3219e-53\""], "Content-Encoding": ["gzip"]}, "status": {"code": 200, "message": "OK"}, "url": "https://pkiprojecttest01.dev.labs.internal/"}, "recorded_at": "2018-12-20T20:02:30"}], "recorded_with": "betamax/0.8.1"} +\ No newline at end of file ++{ ++ "http_interactions": [ ++ { ++ "recorded_at": "2018-12-20T20:02:30", ++ "request": { ++ "body": { ++ "encoding": "utf-8", ++ "string": "" ++ }, ++ "headers": { ++ "Accept": [ ++ "*/*" ++ ], ++ "Accept-Encoding": [ ++ "gzip, deflate" ++ ], ++ "Connection": [ ++ "keep-alive" ++ ], ++ "User-Agent": [ ++ "python-requests/2.21.0" ++ ] ++ }, ++ "method": "GET", ++ "uri": "https://pkiprojecttest01.dev.labs.internal/" ++ }, ++ "response": { ++ "body": { ++ "base64_string": "H4sIAAAAAAAAA7NRdPF3DokMcFXIKMnNseOygVJJ+SmVdlxArqFdSGpxiY0+kAHkFoB5CsGlycmpxcU2+gUgQX2IYqAasBEAYvDs5FMAAAA=", ++ "encoding": "ISO-8859-1", ++ "string": "" ++ }, ++ "headers": { ++ "Connection": [ ++ "keep-alive" ++ ], ++ "Content-Encoding": [ ++ "gzip" ++ ], ++ "Content-Type": [ ++ "text/html" ++ ], ++ "Date": [ ++ "Thu, 20 Dec 2018 20:02:30 GMT" ++ ], ++ "ETag": [ ++ "W/\"5bf3219e-53\"" ++ ], ++ "Last-Modified": [ ++ "Mon, 19 Nov 2018 20:48:30 GMT" ++ ], ++ "Server": [ ++ "nginx/1.10.3 (Ubuntu)" ++ ], ++ "Transfer-Encoding": [ ++ "chunked" ++ ] ++ }, ++ "status": { ++ "code": 200, ++ "message": "OK" ++ }, ++ "url": "https://pkiprojecttest01.dev.labs.internal/" ++ } ++ } ++ ], ++ "recorded_with": "betamax/0.8.1" ++} +\ No newline at end of file diff --git a/meta-python/recipes-devtools/python/python3-requests-toolbelt/720240501dca0b4eacc3295665d7ced8719e11d2.patch b/meta-python/recipes-devtools/python/python3-requests-toolbelt/720240501dca0b4eacc3295665d7ced8719e11d2.patch new file mode 100644 index 0000000000..0439b09829 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-requests-toolbelt/720240501dca0b4eacc3295665d7ced8719e11d2.patch @@ -0,0 +1,546 @@ +From 720240501dca0b4eacc3295665d7ced8719e11d2 Mon Sep 17 00:00:00 2001 +From: Quentin Pradet <quentin.pradet@gmail.com> +Date: Fri, 28 Apr 2023 23:28:43 +0400 +Subject: [PATCH] Test urllib3 2.0 + +Upstream-Status: Submitted [https://github.com/requests/toolbelt/pull/356] +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + .../redirect_request_for_dump_all.json | 302 +++++++++++++----- + tests/cassettes/simple_get_request.json | 16 +- + tox.ini | 11 +- + 3 files changed, 239 insertions(+), 90 deletions(-) + +diff --git a/tests/cassettes/redirect_request_for_dump_all.json b/tests/cassettes/redirect_request_for_dump_all.json +index f713ff3..dc8fefe 100644 +--- a/tests/cassettes/redirect_request_for_dump_all.json ++++ b/tests/cassettes/redirect_request_for_dump_all.json +@@ -1,17 +1,25 @@ + { + "http_interactions": [ + { +- "recorded_at": "2015-11-14T22:53:20", ++ "recorded_at": "2023-04-28T18:04:50", + "request": { + "body": { + "encoding": "utf-8", + "string": "" + }, + "headers": { +- "Accept": "*/*", +- "Accept-Encoding": "gzip, deflate", +- "Connection": "keep-alive", +- "User-Agent": "python-requests/2.8.1" ++ "Accept": [ ++ "*/*" ++ ], ++ "Accept-Encoding": [ ++ "gzip, deflate" ++ ], ++ "Connection": [ ++ "keep-alive" ++ ], ++ "User-Agent": [ ++ "python-requests/2.28.1" ++ ] + }, + "method": "GET", + "uri": "https://httpbin.org/redirect/5" +@@ -22,14 +30,30 @@ + "string": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<title>Redirecting...</title>\n<h1>Redirecting...</h1>\n<p>You should be redirected automatically to target URL: <a href=\"/relative-redirect/4\">/relative-redirect/4</a>. If not click the link." + }, + "headers": { +- "Access-Control-Allow-Credentials": "true", +- "Access-Control-Allow-Origin": "*", +- "Connection": "keep-alive", +- "Content-Length": "247", +- "Content-Type": "text/html; charset=utf-8", +- "Date": "Sat, 14 Nov 2015 22:53:18 GMT", +- "Location": "/relative-redirect/4", +- "Server": "nginx" ++ "Access-Control-Allow-Credentials": [ ++ "true" ++ ], ++ "Access-Control-Allow-Origin": [ ++ "*" ++ ], ++ "Connection": [ ++ "keep-alive" ++ ], ++ "Content-Length": [ ++ "247" ++ ], ++ "Content-Type": [ ++ "text/html; charset=utf-8" ++ ], ++ "Date": [ ++ "Fri, 28 Apr 2023 18:04:50 GMT" ++ ], ++ "Location": [ ++ "/relative-redirect/4" ++ ], ++ "Server": [ ++ "gunicorn/19.9.0" ++ ] + }, + "status": { + "code": 302, +@@ -39,17 +63,25 @@ + } + }, + { +- "recorded_at": "2015-11-14T22:53:20", ++ "recorded_at": "2023-04-28T18:04:52", + "request": { + "body": { + "encoding": "utf-8", + "string": "" + }, + "headers": { +- "Accept": "*/*", +- "Accept-Encoding": "gzip, deflate", +- "Connection": "keep-alive", +- "User-Agent": "python-requests/2.8.1" ++ "Accept": [ ++ "*/*" ++ ], ++ "Accept-Encoding": [ ++ "gzip, deflate" ++ ], ++ "Connection": [ ++ "keep-alive" ++ ], ++ "User-Agent": [ ++ "python-requests/2.28.1" ++ ] + }, + "method": "GET", + "uri": "https://httpbin.org/relative-redirect/4" +@@ -60,14 +92,30 @@ + "string": "" + }, + "headers": { +- "Access-Control-Allow-Credentials": "true", +- "Access-Control-Allow-Origin": "*", +- "Connection": "keep-alive", +- "Content-Length": "0", +- "Content-Type": "text/html; charset=utf-8", +- "Date": "Sat, 14 Nov 2015 22:53:18 GMT", +- "Location": "/relative-redirect/3", +- "Server": "nginx" ++ "Access-Control-Allow-Credentials": [ ++ "true" ++ ], ++ "Access-Control-Allow-Origin": [ ++ "*" ++ ], ++ "Connection": [ ++ "keep-alive" ++ ], ++ "Content-Length": [ ++ "0" ++ ], ++ "Content-Type": [ ++ "text/html; charset=utf-8" ++ ], ++ "Date": [ ++ "Fri, 28 Apr 2023 18:04:52 GMT" ++ ], ++ "Location": [ ++ "/relative-redirect/3" ++ ], ++ "Server": [ ++ "gunicorn/19.9.0" ++ ] + }, + "status": { + "code": 302, +@@ -77,17 +125,25 @@ + } + }, + { +- "recorded_at": "2015-11-14T22:53:20", ++ "recorded_at": "2023-04-28T18:04:53", + "request": { + "body": { + "encoding": "utf-8", + "string": "" + }, + "headers": { +- "Accept": "*/*", +- "Accept-Encoding": "gzip, deflate", +- "Connection": "keep-alive", +- "User-Agent": "python-requests/2.8.1" ++ "Accept": [ ++ "*/*" ++ ], ++ "Accept-Encoding": [ ++ "gzip, deflate" ++ ], ++ "Connection": [ ++ "keep-alive" ++ ], ++ "User-Agent": [ ++ "python-requests/2.28.1" ++ ] + }, + "method": "GET", + "uri": "https://httpbin.org/relative-redirect/3" +@@ -98,14 +154,30 @@ + "string": "" + }, + "headers": { +- "Access-Control-Allow-Credentials": "true", +- "Access-Control-Allow-Origin": "*", +- "Connection": "keep-alive", +- "Content-Length": "0", +- "Content-Type": "text/html; charset=utf-8", +- "Date": "Sat, 14 Nov 2015 22:53:18 GMT", +- "Location": "/relative-redirect/2", +- "Server": "nginx" ++ "Access-Control-Allow-Credentials": [ ++ "true" ++ ], ++ "Access-Control-Allow-Origin": [ ++ "*" ++ ], ++ "Connection": [ ++ "keep-alive" ++ ], ++ "Content-Length": [ ++ "0" ++ ], ++ "Content-Type": [ ++ "text/html; charset=utf-8" ++ ], ++ "Date": [ ++ "Fri, 28 Apr 2023 18:04:53 GMT" ++ ], ++ "Location": [ ++ "/relative-redirect/2" ++ ], ++ "Server": [ ++ "gunicorn/19.9.0" ++ ] + }, + "status": { + "code": 302, +@@ -115,17 +187,25 @@ + } + }, + { +- "recorded_at": "2015-11-14T22:53:20", ++ "recorded_at": "2023-04-28T18:04:55", + "request": { + "body": { + "encoding": "utf-8", + "string": "" + }, + "headers": { +- "Accept": "*/*", +- "Accept-Encoding": "gzip, deflate", +- "Connection": "keep-alive", +- "User-Agent": "python-requests/2.8.1" ++ "Accept": [ ++ "*/*" ++ ], ++ "Accept-Encoding": [ ++ "gzip, deflate" ++ ], ++ "Connection": [ ++ "keep-alive" ++ ], ++ "User-Agent": [ ++ "python-requests/2.28.1" ++ ] + }, + "method": "GET", + "uri": "https://httpbin.org/relative-redirect/2" +@@ -136,14 +216,30 @@ + "string": "" + }, + "headers": { +- "Access-Control-Allow-Credentials": "true", +- "Access-Control-Allow-Origin": "*", +- "Connection": "keep-alive", +- "Content-Length": "0", +- "Content-Type": "text/html; charset=utf-8", +- "Date": "Sat, 14 Nov 2015 22:53:18 GMT", +- "Location": "/relative-redirect/1", +- "Server": "nginx" ++ "Access-Control-Allow-Credentials": [ ++ "true" ++ ], ++ "Access-Control-Allow-Origin": [ ++ "*" ++ ], ++ "Connection": [ ++ "keep-alive" ++ ], ++ "Content-Length": [ ++ "0" ++ ], ++ "Content-Type": [ ++ "text/html; charset=utf-8" ++ ], ++ "Date": [ ++ "Fri, 28 Apr 2023 18:04:55 GMT" ++ ], ++ "Location": [ ++ "/relative-redirect/1" ++ ], ++ "Server": [ ++ "gunicorn/19.9.0" ++ ] + }, + "status": { + "code": 302, +@@ -153,17 +249,25 @@ + } + }, + { +- "recorded_at": "2015-11-14T22:53:20", ++ "recorded_at": "2023-04-28T18:04:56", + "request": { + "body": { + "encoding": "utf-8", + "string": "" + }, + "headers": { +- "Accept": "*/*", +- "Accept-Encoding": "gzip, deflate", +- "Connection": "keep-alive", +- "User-Agent": "python-requests/2.8.1" ++ "Accept": [ ++ "*/*" ++ ], ++ "Accept-Encoding": [ ++ "gzip, deflate" ++ ], ++ "Connection": [ ++ "keep-alive" ++ ], ++ "User-Agent": [ ++ "python-requests/2.28.1" ++ ] + }, + "method": "GET", + "uri": "https://httpbin.org/relative-redirect/1" +@@ -174,14 +278,30 @@ + "string": "" + }, + "headers": { +- "Access-Control-Allow-Credentials": "true", +- "Access-Control-Allow-Origin": "*", +- "Connection": "keep-alive", +- "Content-Length": "0", +- "Content-Type": "text/html; charset=utf-8", +- "Date": "Sat, 14 Nov 2015 22:53:18 GMT", +- "Location": "/get", +- "Server": "nginx" ++ "Access-Control-Allow-Credentials": [ ++ "true" ++ ], ++ "Access-Control-Allow-Origin": [ ++ "*" ++ ], ++ "Connection": [ ++ "keep-alive" ++ ], ++ "Content-Length": [ ++ "0" ++ ], ++ "Content-Type": [ ++ "text/html; charset=utf-8" ++ ], ++ "Date": [ ++ "Fri, 28 Apr 2023 18:04:56 GMT" ++ ], ++ "Location": [ ++ "/get" ++ ], ++ "Server": [ ++ "gunicorn/19.9.0" ++ ] + }, + "status": { + "code": 302, +@@ -191,34 +311,56 @@ + } + }, + { +- "recorded_at": "2015-11-14T22:53:20", ++ "recorded_at": "2023-04-28T18:04:58", + "request": { + "body": { + "encoding": "utf-8", + "string": "" + }, + "headers": { +- "Accept": "*/*", +- "Accept-Encoding": "gzip, deflate", +- "Connection": "keep-alive", +- "User-Agent": "python-requests/2.8.1" ++ "Accept": [ ++ "*/*" ++ ], ++ "Accept-Encoding": [ ++ "gzip, deflate" ++ ], ++ "Connection": [ ++ "keep-alive" ++ ], ++ "User-Agent": [ ++ "python-requests/2.28.1" ++ ] + }, + "method": "GET", + "uri": "https://httpbin.org/get" + }, + "response": { + "body": { +- "encoding": null, +- "string": "{\n \"args\": {}, \n \"headers\": {\n \"Accept\": \"*/*\", \n \"Accept-Encoding\": \"gzip, deflate\", \n \"Host\": \"httpbin.org\", \n \"User-Agent\": \"python-requests/2.8.1\"\n }, \n \"origin\": \"<IPADDR>\", \n \"url\": \"https://httpbin.org/get\"\n}\n" ++ "encoding": "utf-8", ++ "string": "{\n \"args\": {}, \n \"headers\": {\n \"Accept\": \"*/*\", \n \"Accept-Encoding\": \"gzip, deflate\", \n \"Host\": \"httpbin.org\", \n \"User-Agent\": \"python-requests/2.28.1\", \n \"X-Amzn-Trace-Id\": \"Root=1-644c0ac8-450daa2735c478ca518c5c8d\"\n }, \n \"origin\": \"83.198.52.66\", \n \"url\": \"https://httpbin.org/get\"\n}\n" + }, + "headers": { +- "Access-Control-Allow-Credentials": "true", +- "Access-Control-Allow-Origin": "*", +- "Connection": "keep-alive", +- "Content-Length": "239", +- "Content-Type": "application/json", +- "Date": "Sat, 14 Nov 2015 22:53:18 GMT", +- "Server": "nginx" ++ "Access-Control-Allow-Credentials": [ ++ "true" ++ ], ++ "Access-Control-Allow-Origin": [ ++ "*" ++ ], ++ "Connection": [ ++ "keep-alive" ++ ], ++ "Content-Length": [ ++ "306" ++ ], ++ "Content-Type": [ ++ "application/json" ++ ], ++ "Date": [ ++ "Fri, 28 Apr 2023 18:04:58 GMT" ++ ], ++ "Server": [ ++ "gunicorn/19.9.0" ++ ] + }, + "status": { + "code": 200, +@@ -228,5 +370,5 @@ + } + } + ], +- "recorded_with": "betamax/0.5.1" ++ "recorded_with": "betamax/0.8.2" + } +\ No newline at end of file +diff --git a/tests/cassettes/simple_get_request.json b/tests/cassettes/simple_get_request.json +index 68378cd..a97bcf1 100644 +--- a/tests/cassettes/simple_get_request.json ++++ b/tests/cassettes/simple_get_request.json +@@ -1,7 +1,7 @@ + { + "http_interactions": [ + { +- "recorded_at": "2015-11-14T22:33:32", ++ "recorded_at": "2023-04-28T18:04:48", + "request": { + "body": { + "encoding": "utf-8", +@@ -18,7 +18,7 @@ + "keep-alive" + ], + "User-Agent": [ +- "python-requests/2.8.1" ++ "python-requests/2.28.1" + ] + }, + "method": "GET", +@@ -26,8 +26,8 @@ + }, + "response": { + "body": { +- "encoding": null, +- "string": "{\n \"args\": {}, \n \"headers\": {\n \"Accept\": \"*/*\", \n \"Accept-Encoding\": \"gzip, deflate\", \n \"Host\": \"httpbin.org\", \n \"User-Agent\": \"python-requests/2.8.1\"\n }, \n \"origin\": \"<IPADDR>\", \n \"url\": \"https://httpbin.org/get\"\n}\n" ++ "encoding": "utf-8", ++ "string": "{\n \"args\": {}, \n \"headers\": {\n \"Accept\": \"*/*\", \n \"Accept-Encoding\": \"gzip, deflate\", \n \"Host\": \"httpbin.org\", \n \"User-Agent\": \"python-requests/2.28.1\", \n \"X-Amzn-Trace-Id\": \"Root=1-644c0ac0-4986bed42b965a007af785e1\"\n }, \n \"origin\": \"83.198.52.66\", \n \"url\": \"https://httpbin.org/get\"\n}\n" + }, + "headers": { + "Access-Control-Allow-Credentials": [ +@@ -40,16 +40,16 @@ + "keep-alive" + ], + "Content-Length": [ +- "239" ++ "306" + ], + "Content-Type": [ + "application/json" + ], + "Date": [ +- "Sat, 14 Nov 2015 22:33:30 GMT" ++ "Fri, 28 Apr 2023 18:04:48 GMT" + ], + "Server": [ +- "nginx" ++ "gunicorn/19.9.0" + ] + }, + "status": { +@@ -60,5 +60,5 @@ + } + } + ], +- "recorded_with": "betamax/0.5.1" ++ "recorded_with": "betamax/0.8.2" + } +\ No newline at end of file +diff --git a/tox.ini b/tox.ini +index 64b6ab3..e27c275 100644 +--- a/tox.ini ++++ b/tox.ini +@@ -1,5 +1,5 @@ + [tox] +-envlist = py{27,37,38,39,310,311,py,py3},py{27,37}-flake8,noopenssl,docstrings ++envlist = py{27,37,38,39,310,311,py,py3},py{27,37}-flake8,noopenssl,docstrings,urllib3-2.0 + + [gh-actions] + python = +@@ -8,12 +8,13 @@ python = + 3.8: py38 + 3.9: py39 + 3.10: py310 +- 3.11: py311 ++ 3.11: py311, urllib3-2.0 + + [testenv] + pip_pre = False + deps = + requests{env:REQUESTS_VERSION:>=2.0.1,<3.0.0} ++ urllib3<2.0.0 + pytest + mock;python_version<"3.3" + pyopenssl +@@ -34,6 +35,12 @@ deps = + commands = + pytest -W error::DeprecationWarning {posargs} + ++[testenv:urllib3-2.0] ++basepython = python3.11 ++commands = ++ pip install -U urllib3>=2.0.0 ++ pytest -W error::DeprecationWarning {posargs} ++ + [testenv:py27-flake8] + basepython = python2.7 + deps = diff --git a/meta-python/recipes-devtools/python/python3-requests-toolbelt/run-ptest b/meta-python/recipes-devtools/python/python3-requests-toolbelt/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-requests-toolbelt/run-ptest +++ b/meta-python/recipes-devtools/python/python3-requests-toolbelt/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-requests-toolbelt_0.9.1.bb b/meta-python/recipes-devtools/python/python3-requests-toolbelt_1.0.0.bb index 366f41ca81..9cbe4927a2 100644 --- a/meta-python/recipes-devtools/python/python3-requests-toolbelt_0.9.1.bb +++ b/meta-python/recipes-devtools/python/python3-requests-toolbelt_1.0.0.bb @@ -1,27 +1,29 @@ DESCRIPTION = "A utility belt for advanced users of python-requests." HOMEPAGE = "https://toolbelt.readthedocs.org" -AUTHOR = "Ian Cordasco, Cory Benfield" LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=71760e0f1dda8cff91b0bc9246caf571" +LIC_FILES_CHKSUM = "file://LICENSE;md5=6f14302a4b4099009ab38b4dde5f1075" SRC_URI = "file://run-ptest \ + file://090856f4159c40a2927fb88546419f2e1697ad5f.patch \ + file://720240501dca0b4eacc3295665d7ced8719e11d2.patch \ " -SRC_URI[md5sum] = "b1509735c4b4cf95df2619facbc3672e" -SRC_URI[sha256sum] = "968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0" +SRC_URI[sha256sum] = "7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6" inherit pypi setuptools3 ptest RDEPENDS:${PN} += " \ - ${PYTHON_PN}-requests (>=2.0.1) \ + python3-requests (>=2.0.1) \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-betamax \ - ${PYTHON_PN}-mock \ - ${PYTHON_PN}-multiprocessing \ + python3-betamax \ + python3-mock \ + python3-multiprocessing \ + python3-pytest \ + python3-trustme \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-requests-unixsocket_0.3.0.bb b/meta-python/recipes-devtools/python/python3-requests-unixsocket_0.3.0.bb index 330ab7c066..94497b609b 100644 --- a/meta-python/recipes-devtools/python/python3-requests-unixsocket_0.3.0.bb +++ b/meta-python/recipes-devtools/python/python3-requests-unixsocket_0.3.0.bb @@ -11,4 +11,4 @@ inherit pypi inherit setuptools3 DEPENDS += "python3-pbr-native" -RDEPENDS_${PN} = "python3-requests python3-urllib3" +RDEPENDS:${PN} = "python3-requests python3-urllib3" diff --git a/meta-python/recipes-devtools/python/python3-responses_0.25.0.bb b/meta-python/recipes-devtools/python/python3-responses_0.25.0.bb new file mode 100644 index 0000000000..f4b59c7506 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-responses_0.25.0.bb @@ -0,0 +1,15 @@ +DESCRIPTION = "A utility library for mocking out the requests Python library." +HOMEPAGE = "https://github.com/getsentry/responses" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=0e601511a8517f4daf688a8eb95be7a2" + +inherit pypi setuptools3 + +SRC_URI[sha256sum] = "01ae6a02b4f34e39bffceb0fc6786b67a25eae919c6368d05eabc8d9576c2a66" + +RDEPENDS:${PN} += " \ + python3-mock \ + python3-pyyaml \ + python3-requests \ + python3-urllib3 \ +" diff --git a/meta-python/recipes-devtools/python/python3-rlp/0001-setup-don-t-use-setuptools-markdown.patch b/meta-python/recipes-devtools/python/python3-rlp/0001-setup-don-t-use-setuptools-markdown.patch deleted file mode 100644 index 643d296394..0000000000 --- a/meta-python/recipes-devtools/python/python3-rlp/0001-setup-don-t-use-setuptools-markdown.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 5a2db801c6520be296cee9cba0e0e4ffac68430c Mon Sep 17 00:00:00 2001 -From: Bartosz Golaszewski <brgl@bgdev.pl> -Date: Wed, 11 May 2022 15:11:19 +0200 -Subject: [PATCH] setup: don't use setuptools-markdown - -This project is deprecated and irrelevant for the functionality of -pyrlp. We don't support it in meta-python so just drop it from the -dependencies. - -Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl> ---- - setup.py | 2 -- - 1 file changed, 2 deletions(-) - -diff --git a/setup.py b/setup.py -index 1055fb1..55fca24 100755 ---- a/setup.py -+++ b/setup.py -@@ -46,13 +46,11 @@ setup( - # *IMPORTANT*: Don't manually change the version here. See README for more. - version='3.0.0', - description="A package for Recursive Length Prefix encoding and decoding", -- long_description_markdown_filename='README.md', - author="jnnk", - author_email='jnnknnj@gmail.com', - url='https://github.com/ethereum/pyrlp', - packages=find_packages(exclude=["tests", "tests.*"]), - include_package_data=True, -- setup_requires=['setuptools-markdown'], - install_requires=[ - "eth-utils>=2.0.0,<3", - ], --- -2.34.1 - diff --git a/meta-python/recipes-devtools/python/python3-rlp_3.0.0.bb b/meta-python/recipes-devtools/python/python3-rlp_4.0.0.bb index e747ae33ba..7df8ac07c5 100644 --- a/meta-python/recipes-devtools/python/python3-rlp_3.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-rlp_4.0.0.bb @@ -4,11 +4,13 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=00854fa80a84236706b11f47f23e61e7" -SRC_URI[sha256sum] = "63b0465d2948cd9f01de449d7adfb92d207c1aef3982f20310f8009be4a507e8" -SRC_URI += "file://0001-setup-don-t-use-setuptools-markdown.patch" +SRC_URI[sha256sum] = "61a5541f86e4684ab145cb849a5929d2ced8222930a570b3941cf4af16b72a78" inherit pypi setuptools3 DEPENDS += "python3-pip-native" -RDEPENDS:${PN} += "python3-eth-utils" +RDEPENDS:${PN} += " \ + python3-eth-utils \ + python3-typing-extensions \ +" diff --git a/meta-python/recipes-devtools/python/python3-robotframework-seriallibrary_0.4.3.bb b/meta-python/recipes-devtools/python/python3-robotframework-seriallibrary_0.4.3.bb index 4ad5c3601d..0f34a1366d 100644 --- a/meta-python/recipes-devtools/python/python3-robotframework-seriallibrary_0.4.3.bb +++ b/meta-python/recipes-devtools/python/python3-robotframework-seriallibrary_0.4.3.bb @@ -10,8 +10,6 @@ PYPI_PACKAGE = "robotframework-seriallibrary" inherit pypi setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-pyserial \ - ${PYTHON_PN}-robotframework \ + python3-pyserial \ + python3-robotframework \ " - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-robotframework_5.0.1.bb b/meta-python/recipes-devtools/python/python3-robotframework_7.0.bb index 49c97ad102..beb71e6a18 100644 --- a/meta-python/recipes-devtools/python/python3-robotframework_5.0.1.bb +++ b/meta-python/recipes-devtools/python/python3-robotframework_7.0.bb @@ -13,18 +13,18 @@ inherit pypi setuptools3 PYPI_PACKAGE_EXT = "zip" -SRC_URI[sha256sum] = "cf5dc59777ed9d8c3e1e91fb4403454890242867735681f22f4f22dbb2a20fc8" +SRC_URI[sha256sum] = "04623f758346c917db182e17591ffa474090560c02ed5a64343902e72b7b4bd5" RDEPENDS:${PN} += " \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-pprint \ - ${PYTHON_PN}-xml \ - ${PYTHON_PN}-difflib \ - ${PYTHON_PN}-threading \ - ${PYTHON_PN}-html \ - ${PYTHON_PN}-docutils \ - ${PYTHON_PN}-ctypes \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-profile \ + python3-shell \ + python3-pprint \ + python3-xml \ + python3-difflib \ + python3-threading \ + python3-html \ + python3-docutils \ + python3-ctypes \ + python3-logging \ + python3-numbers \ + python3-profile \ " diff --git a/meta-python/recipes-devtools/python/python3-rsa_4.9.bb b/meta-python/recipes-devtools/python/python3-rsa_4.9.bb index ed5018f49e..c27cd1d68a 100644 --- a/meta-python/recipes-devtools/python/python3-rsa_4.9.bb +++ b/meta-python/recipes-devtools/python/python3-rsa_4.9.bb @@ -1,6 +1,5 @@ SUMMARY = "Pure-Python RSA implementation" SECTION = "devel/python" -AUTHOR = "Sybren A. Stuvel" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=c403f6882d4f97a9cd927df987d55634" @@ -27,14 +26,14 @@ ALTERNATIVE_PRIORITY = "30" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-crypt \ - ${PYTHON_PN}-doctest \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-math \ - ${PYTHON_PN}-multiprocessing \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-pickle \ + python3-compression \ + python3-crypt \ + python3-doctest \ + python3-logging \ + python3-math \ + python3-multiprocessing \ + python3-netclient \ + python3-pickle \ " -RDEPENDS:${PN} += "${PYTHON_PN}-pyasn1" +RDEPENDS:${PN} += "python3-pyasn1" diff --git a/meta-python/recipes-devtools/python/python3-schedule_1.2.1.bb b/meta-python/recipes-devtools/python/python3-schedule_1.2.1.bb new file mode 100644 index 0000000000..6ebde30e61 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-schedule_1.2.1.bb @@ -0,0 +1,10 @@ +SUMMARY = "Job scheduling for humans" +HOMEPAGE = "https://github.com/dbader/schedule" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=6400f153491d45ea3459761627ca24b2" + +SRC_URI[sha256sum] = "843bc0538b99c93f02b8b50e3e39886c06f2d003b24f48e1aa4cadfa3f341279" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-datetime python3-logging python3-math" diff --git a/meta-python/recipes-devtools/python/python3-schedutils_0.6.bb b/meta-python/recipes-devtools/python/python3-schedutils_0.6.bb new file mode 100644 index 0000000000..50868b9c40 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-schedutils_0.6.bb @@ -0,0 +1,12 @@ +DESCRIPTION = "Python interface for the Linux scheduler functions etc." +HOMEPAGE = "https://git.kernel.org/pub/scm/libs/python/python-schedutils/python-schedutils.git/" +SECTION = "devel/python" +LICENSE = "GPL-2.0-only" +LIC_FILES_CHKSUM = "file://COPYING;md5=8ca43cbc842c2336e835926c2166c28b" + +SRC_URI = "git://git.kernel.org/pub/scm/libs/python/python-schedutils/python-schedutils.git;branch=main" +SRCREV = "46469f425f9844f355f6496785ee1ce993b58747" + +S = "${WORKDIR}/git" + +inherit setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-scikit-build_0.17.6.bb b/meta-python/recipes-devtools/python/python3-scikit-build_0.17.6.bb new file mode 100644 index 0000000000..dde0941ef1 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-scikit-build_0.17.6.bb @@ -0,0 +1,22 @@ +SUMMARY = "Improved build system generator for Python C/C++/Fortran/Cython extensions" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=7c96d2b08b3cec6d3c67fb864d1fd8cc" + +DEPENDS = "python3-hatch-vcs-native python3-hatch-fancy-pypi-readme-native" + +PYPI_PACKAGE = "scikit_build" + +inherit pypi python_hatchling + +SRC_URI[sha256sum] = "b51a51a36b37c42650994b5047912f59b22e3210b23e321f287611f9ef6e5c9d" + +RDEPENDS:${PN} = " \ + python3-distro \ + python3-packaging \ + python3-setuptools \ + python3-typing-extensions \ + python3-wheel \ + cmake \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-screeninfo_0.8.1.bb b/meta-python/recipes-devtools/python/python3-screeninfo_0.8.1.bb new file mode 100644 index 0000000000..19ac3f67f0 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-screeninfo_0.8.1.bb @@ -0,0 +1,16 @@ +DESCRIPTION = "Fetch location and size of physical screens." +HOMEPAGE = "https://github.com/rr-/screeninfo" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE.md;md5=a23813181e06852d377bc25ae5563a97" + +PYPI_PACKAGE = "screeninfo" + +SRC_URI[sha256sum] = "9983076bcc7e34402a1a9e4d7dabf3729411fd2abb3f3b4be7eba73519cd2ed1" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "\ + python3-core \ + python3-profile \ +" diff --git a/meta-python/recipes-devtools/python/python3-scrypt/0001-py-scrypt-remove-the-hard-coded-include-paths.patch b/meta-python/recipes-devtools/python/python3-scrypt/0001-py-scrypt-remove-the-hard-coded-include-paths.patch index d535e43261..3678d46cf6 100644 --- a/meta-python/recipes-devtools/python/python3-scrypt/0001-py-scrypt-remove-the-hard-coded-include-paths.patch +++ b/meta-python/recipes-devtools/python/python3-scrypt/0001-py-scrypt-remove-the-hard-coded-include-paths.patch @@ -1,4 +1,4 @@ -From d8db473ce9346cd6254c90e13ac45b3bbde494c4 Mon Sep 17 00:00:00 2001 +From 47ede0950740e8919c28774840e77f223d5f3124 Mon Sep 17 00:00:00 2001 From: Derek Straka <derek@asterius.io> Date: Sun, 11 Mar 2018 19:55:38 -0400 Subject: [PATCH] py-scrypt: remove the hard coded include paths @@ -11,16 +11,14 @@ Signed-off-by: Derek Straka <derek@asterius.io> 1 file changed, 1 deletion(-) diff --git a/setup.py b/setup.py -index e36adc4..2ebfbf1 100644 +index 419a982..3f1fe52 100644 --- a/setup.py +++ b/setup.py -@@ -24,7 +24,6 @@ if sys.platform.startswith('linux'): - ('HAVE_SYS_SYSINFO_H', '1'), - ('_FILE_OFFSET_BITS', '64')] +@@ -26,7 +26,6 @@ if sys.platform.startswith('linux'): + ('_FILE_OFFSET_BITS', '64'), + ] libraries = ['crypto', 'rt'] - includes = ['/usr/local/include', '/usr/include'] CFLAGS.append('-O2') - elif sys.platform.startswith('win32'): - define_macros = [('inline', '__inline')] --- -2.7.4 + elif sys.platform.startswith('win32') and os.environ.get('MSYSTEM'): + msys2_env = os.getenv('MSYSTEM') diff --git a/meta-python/recipes-devtools/python/python3-scrypt/run-ptest b/meta-python/recipes-devtools/python/python3-scrypt/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-scrypt/run-ptest +++ b/meta-python/recipes-devtools/python/python3-scrypt/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-scrypt_0.8.20.bb b/meta-python/recipes-devtools/python/python3-scrypt_0.8.24.bb index c386932683..94c83e4952 100644 --- a/meta-python/recipes-devtools/python/python3-scrypt_0.8.20.bb +++ b/meta-python/recipes-devtools/python/python3-scrypt_0.8.24.bb @@ -5,7 +5,7 @@ HOMEPAGE="https://github.com/holgern/py-scrypt" SRC_URI += "file://0001-py-scrypt-remove-the-hard-coded-include-paths.patch" -SRC_URI[sha256sum] = "0d226c1c6744fb2e308b391410669b1df5cfe82637ffcb5ed489bf82b2d2eb78" +SRC_URI[sha256sum] = "98ffde45e4a95461d73ded54ba7a26857679920d4f8ff320f6f7ade6e29531bd" inherit pypi ptest setuptools3 dos2unix @@ -14,11 +14,12 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " RDEPENDS:${PN} += " \ - ${PYTHON_PN}-ctypes \ + python3-ctypes \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-sdbus_0.11.1.bb b/meta-python/recipes-devtools/python/python3-sdbus_0.11.1.bb new file mode 100644 index 0000000000..26bc71762e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-sdbus_0.11.1.bb @@ -0,0 +1,17 @@ +SUMMARY = "Modern Python library for the systemd D-Bus" +HOMEPAGE = "https://python-sdbus.readthedocs.io/en/latest/" +LICENSE = "LGPL-2.1-or-later" +LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e77986dc8e2ee22d44a7c863e96852ae" + +SRC_URI[sha256sum] = "adb97718ce996bb308520682c50b1a13e606d65a6edb1c1967a15d2e570cb3b7" + +REQUIRED_DISTRO_FEATURES = "systemd" +DEPENDS += "systemd" + +RDEPENDS:${PN} += " \ + python3-asyncio \ + python3-numbers \ + python3-core \ +" + +inherit pypi setuptools3 features_check pkgconfig diff --git a/meta-python/recipes-devtools/python/python3-sdnotify_0.3.2.bb b/meta-python/recipes-devtools/python/python3-sdnotify_0.3.2.bb index dc1961ac30..ebf000135a 100644 --- a/meta-python/recipes-devtools/python/python3-sdnotify_0.3.2.bb +++ b/meta-python/recipes-devtools/python/python3-sdnotify_0.3.2.bb @@ -17,3 +17,5 @@ SRC_URI[sha256sum] = "73977fc746b36cc41184dd43c3fe81323e7b8b06c2bb0826c4f59a20c5 SRC_URI += "file://0001-setup.py-switch-to-setuptools.patch" inherit setuptools3 pypi + +RDEPENDS:${PN} += "python3-io" diff --git a/meta-python/recipes-devtools/python/python3-semver/run-ptest b/meta-python/recipes-devtools/python/python3-semver/run-ptest index 43c03b594b..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-semver/run-ptest +++ b/meta-python/recipes-devtools/python/python3-semver/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO test_semver.py --disable-warnings| sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-semver_2.13.0.bb b/meta-python/recipes-devtools/python/python3-semver_2.13.0.bb deleted file mode 100644 index b47bcae008..0000000000 --- a/meta-python/recipes-devtools/python/python3-semver_2.13.0.bb +++ /dev/null @@ -1,24 +0,0 @@ -DESCRIPTION = "Python module for Semantic Versioning" -HOMEPAGE = "https://github.com/k-bx/python-semver" -BUGTRACKER = "https://github.com/k-bx/python-semver/issues" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e910b35b0ef4e1f665b9a75d6afb7709" - -SRC_URI[md5sum] = "e98b5fb283ea84daa5195087de83ebf1" -SRC_URI[sha256sum] = "fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f" - -inherit pypi setuptools3 ptest - -BBCLASSEXTEND = "native nativesdk" - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ -" - -do_install_ptest() { - cp -f ${S}/test_semver.py ${D}${PTEST_PATH}/ -} diff --git a/meta-python/recipes-devtools/python/python3-semver_3.0.2.bb b/meta-python/recipes-devtools/python/python3-semver_3.0.2.bb new file mode 100644 index 0000000000..25222bb5ff --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-semver_3.0.2.bb @@ -0,0 +1,26 @@ +DESCRIPTION = "Python module for Semantic Versioning" +HOMEPAGE = "https://github.com/python-semver/python-semver" +BUGTRACKER = "https://github.com/python-semver/python-semver" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=d9da679db3bdce30a1b4328d5c474f98" + +SRC_URI[sha256sum] = "6253adb39c70f6e51afed2fa7152bcd414c411286088fb4b9effb133885ab4cc" + +inherit pypi python_setuptools_build_meta ptest + +BBCLASSEXTEND = "native nativesdk" + +SRC_URI += " \ + file://run-ptest \ +" + +DEPENDS += " python3-setuptools-scm-native" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + cp -rf ${S}/tests ${D}${PTEST_PATH}/ +} diff --git a/meta-python/recipes-devtools/python/python3-sentry-sdk_1.45.0.bb b/meta-python/recipes-devtools/python/python3-sentry-sdk_1.45.0.bb new file mode 100644 index 0000000000..c3e53b5183 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-sentry-sdk_1.45.0.bb @@ -0,0 +1,22 @@ +SUMMARY = "The new Python SDK for Sentry.io" +DESCRIPTION = "This is the next line of the Python SDK \ +for Sentry, intended to replace the raven package on PyPI." +HOMEPAGE = "https://github.com/getsentry/sentry-python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=03dc788d9a9486be5e6a1d99c2c1ce3a" + +RDEPENDS:${PN} += "\ + python3-urllib3 \ + python3-core \ + python3-json \ + python3-logging \ + python3-threading \ + python3-compression \ + python3-datetime \ +" + +SRC_URI[sha256sum] = "509aa9678c0512344ca886281766c2e538682f8acfa50fd8d405f8c417ad0625" + +PYPI_PACKAGE = "sentry-sdk" + +inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-sentry-sdk_1.5.12.bb b/meta-python/recipes-devtools/python/python3-sentry-sdk_1.5.12.bb deleted file mode 100644 index 36e48f97a2..0000000000 --- a/meta-python/recipes-devtools/python/python3-sentry-sdk_1.5.12.bb +++ /dev/null @@ -1,14 +0,0 @@ -SUMMARY = "The new Python SDK for Sentry.io" -DESCRIPTION = "This is the next line of the Python SDK \ -for Sentry, intended to replace the raven package on PyPI." -HOMEPAGE = "https://github.com/getsentry/sentry-python" -LICENSE = "BSD-2-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=0c79f8d3c91fc847350efd28bfe0a341" - -RDEPENDS:${PN} += "python3-urllib3" - -SRC_URI[sha256sum] = "259535ba66933eacf85ab46524188c84dcb4c39f40348455ce15e2c0aca68863" - -PYPI_PACKAGE = "sentry-sdk" - -inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-serpent/run-ptest b/meta-python/recipes-devtools/python/python3-serpent/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-serpent/run-ptest +++ b/meta-python/recipes-devtools/python/python3-serpent/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-serpent_1.41.bb b/meta-python/recipes-devtools/python/python3-serpent_1.41.bb index 480e3ab388..941b5ee0f3 100644 --- a/meta-python/recipes-devtools/python/python3-serpent_1.41.bb +++ b/meta-python/recipes-devtools/python/python3-serpent_1.41.bb @@ -11,8 +11,9 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-pytz \ + python3-pytest \ + python3-pytz \ + python3-unittest-automake-output \ " do_install_ptest() { @@ -21,6 +22,6 @@ do_install_ptest() { } RDEPENDS:${PN} += "\ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-numbers \ -" + python3-netclient \ + python3-numbers \ +" diff --git a/meta-python/recipes-devtools/python/python3-service-identity/run-ptest b/meta-python/recipes-devtools/python/python3-service-identity/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-service-identity/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-service-identity_21.1.0.bb b/meta-python/recipes-devtools/python/python3-service-identity_21.1.0.bb new file mode 100644 index 0000000000..006fae290d --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-service-identity_21.1.0.bb @@ -0,0 +1,32 @@ +DESCRIPTION = "The tools for verifying whether a certificate is valid for the intended purposes." +HOMEPAGE = "https://pypi.org/project/service-identity" + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=8a0f079f4e6a215d6bd6f9d97cab4d5f" + +SRC_URI[md5sum] = "5e5c195d8fcedc72f9068be2ad9b5a13" +SRC_URI[sha256sum] = "6e6c6086ca271dc11b033d17c3a8bea9f24ebff920c587da090afc9519419d34" + +inherit pypi setuptools3 ptest + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN} += " \ + python3-attr \ + python3-cryptography \ + python3-pyasn1-modules \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ + python3-pyopenssl \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ + cp -rf ${S}/setup.py ${D}${PTEST_PATH} +} diff --git a/meta-python/recipes-devtools/python/python3-setuptools-scm-git-archive_1.1.bb b/meta-python/recipes-devtools/python/python3-setuptools-scm-git-archive_1.1.bb deleted file mode 100644 index 472c4eb1c8..0000000000 --- a/meta-python/recipes-devtools/python/python3-setuptools-scm-git-archive_1.1.bb +++ /dev/null @@ -1,15 +0,0 @@ -SUMMARY = "setuptools_scm plugin for git archives" -HOMEPAGE = "https://pypi.org/project/setuptools-scm-git-archive/" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=838c366f69b72c5df05c96dff79b35f2" - -SRC_URI[sha256sum] = "6026f61089b73fa1b5ee737e95314f41cb512609b393530385ed281d0b46c062" - -inherit pypi setuptools3 - -PYPI_PACKAGE = "setuptools_scm_git_archive" -PYPI_SRC_URI = "https://files.pythonhosted.org/packages/7e/2c/0c15b29a1b5940250bfdc4a4f53272e35cd7cf8a34159291b6b4ec9eb291/${PYPI_ARCHIVE_NAME}" - -DEPENDS += "python3-setuptools-scm-native" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-sh_1.14.3.bb b/meta-python/recipes-devtools/python/python3-sh_1.14.3.bb deleted file mode 100644 index 317f648dcd..0000000000 --- a/meta-python/recipes-devtools/python/python3-sh_1.14.3.bb +++ /dev/null @@ -1,23 +0,0 @@ -SUMMARY = "Python subprocess replacement" -HOMEPAGE = "https://github.com/amoffat/sh" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=5317094292296f03405f59ae5f6544b6" - -SRC_URI[sha256sum] = "e4045b6c732d9ce75d571c79f5ac2234edd9ae4f5fa9d59b09705082bdca18c7" - -PYPI_PACKAGE = "sh" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-codecs \ - ${PYTHON_PN}-core \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-resource \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-terminal \ - ${PYTHON_PN}-threading \ - ${PYTHON_PN}-unixadmin \ - ${PYTHON_PN}-fcntl \ -" diff --git a/meta-python/recipes-devtools/python/python3-sh_2.0.6.bb b/meta-python/recipes-devtools/python/python3-sh_2.0.6.bb new file mode 100644 index 0000000000..cbe000e31c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-sh_2.0.6.bb @@ -0,0 +1,25 @@ +SUMMARY = "Python subprocess replacement" +HOMEPAGE = "https://github.com/amoffat/sh" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=5317094292296f03405f59ae5f6544b6" + +SRC_URI[sha256sum] = "9b2998f313f201c777e2c0061f0b1367497097ef13388595be147e2a00bf7ba1" + +PYPI_PACKAGE = "sh" + +inherit pypi python_poetry_core + +RDEPENDS:${PN} += " \ + python3-asyncio \ + python3-codecs \ + python3-compression \ + python3-core \ + python3-io \ + python3-logging \ + python3-resource \ + python3-shell \ + python3-terminal \ + python3-threading \ + python3-unixadmin \ + python3-fcntl \ +" diff --git a/meta-python/recipes-devtools/python/python3-shellingham_1.5.4.bb b/meta-python/recipes-devtools/python/python3-shellingham_1.5.4.bb new file mode 100644 index 0000000000..e519e8e229 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-shellingham_1.5.4.bb @@ -0,0 +1,10 @@ +SUMMARY = "Tool to Detect Surrounding Shell" +SECTION = "devel/python" +LICENSE = "ISC" +LIC_FILES_CHKSUM = "file://LICENSE;md5=78e1c0248051c32a38a7f820c30bd7a5" + +SRC_URI[sha256sum] = "8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de" + +inherit pypi setuptools3 + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-simpleeval/no-build.patch b/meta-python/recipes-devtools/python/python3-simpleeval/no-build.patch deleted file mode 100644 index b090755f8a..0000000000 --- a/meta-python/recipes-devtools/python/python3-simpleeval/no-build.patch +++ /dev/null @@ -1,24 +0,0 @@ -Upstream-Status: Submitted [https://github.com/danthedeckie/simpleeval/pull/119] -Signed-off-by: Ross Burton <ross.burton@arm.com> - -From 08bc99211aec32882d5f1c83896eb5d72b9fb125 Mon Sep 17 00:00:00 2001 -From: Ross Burton <ross.burton@arm.com> -Date: Mon, 23 May 2022 11:35:00 +0100 -Subject: [PATCH] pyproject.toml: remove build as a build-dependency - -pypa/build is one possible build tool, but not the only build tool. Forcing build to be present as a build dependency is meaningless: either the user is using build so obviously have build, or are using something else so having build is irrelevant. ---- - pyproject.toml | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/pyproject.toml b/pyproject.toml -index 052a55a..416482b 100644 ---- a/pyproject.toml -+++ b/pyproject.toml -@@ -1,5 +1,5 @@ - [build-system] --requires = ["setuptools>=30.3.0", "wheel", "build"] -+requires = ["setuptools>=30.3.0", "wheel"] - build-backend = "setuptools.build_meta" - - [tool.black] diff --git a/meta-python/recipes-devtools/python/python3-simpleeval/run-ptest b/meta-python/recipes-devtools/python/python3-simpleeval/run-ptest index 3385d68939..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-simpleeval/run-ptest +++ b/meta-python/recipes-devtools/python/python3-simpleeval/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-simpleeval_0.9.12.bb b/meta-python/recipes-devtools/python/python3-simpleeval_0.9.13.bb index c9cf33d023..af2c4a1e2e 100644 --- a/meta-python/recipes-devtools/python/python3-simpleeval_0.9.12.bb +++ b/meta-python/recipes-devtools/python/python3-simpleeval_0.9.13.bb @@ -3,23 +3,21 @@ HOMEPAGE = "https://pypi.org/project/simpleeval/" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENCE;md5=dc9277482effe59b734b004cbcc1fee7" -SRC_URI[sha256sum] = "3e0be507486d4e21cf9d08847c7e57dd61a1603950399985f7c5a0be7fd33e36" +SRC_URI[sha256sum] = "4a30f9cc01825fe4c719c785e3762623e350c4840d5e6855c2a8496baaa65fac" inherit pypi python_setuptools_build_meta ptest BBCLASSEXTEND = "native nativesdk" -SRC_URI += " \ - file://no-build.patch \ - file://run-ptest \ -" +SRC_URI += "file://run-ptest" RDEPENDS:${PN} += " \ - ${PYTHON_PN}-math \ + python3-math \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-simplejson_3.17.6.bb b/meta-python/recipes-devtools/python/python3-simplejson_3.19.2.bb index b836f97fe0..cc5b1bc90a 100644 --- a/meta-python/recipes-devtools/python/python3-simplejson_3.17.6.bb +++ b/meta-python/recipes-devtools/python/python3-simplejson_3.19.2.bb @@ -4,18 +4,18 @@ HOMEPAGE = "http://cheeseshop.python.org/pypi/simplejson" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=c6338d7abd321c0b50a2a547e441c52e" -SRC_URI[sha256sum] = "cf98038d2abf63a1ada5730e91e84c642ba6c225b0198c3684151b1f80c5f8a6" +SRC_URI[sha256sum] = "9eb442a2442ce417801c912df68e1f6ccfcd41577ae7274953ab3ad24ef7d82c" inherit pypi setuptools3 RDEPENDS:${PN} += "\ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-netserver \ - ${PYTHON_PN}-numbers \ + python3-io \ + python3-netserver \ + python3-numbers \ " PACKAGES =+ "${PN}-tests" -RDEPENDS:${PN}-tests = "${PN} ${PYTHON_PN}-unittest" +RDEPENDS:${PN}-tests = "${PN} python3-unittest" FILES:${PN}-tests+= " \ ${PYTHON_SITEPACKAGES_DIR}/simplejson/tests \ ${PYTHON_SITEPACKAGES_DIR}/simplejson/tool.py* \ diff --git a/meta-python/recipes-devtools/python/python3-slip-dbus/9b939c0b534c1b7958fa0a3c7aedf30bca910431.patch b/meta-python/recipes-devtools/python/python3-slip-dbus/9b939c0b534c1b7958fa0a3c7aedf30bca910431.patch index b0e9d2215f..7080047b79 100644 --- a/meta-python/recipes-devtools/python/python3-slip-dbus/9b939c0b534c1b7958fa0a3c7aedf30bca910431.patch +++ b/meta-python/recipes-devtools/python/python3-slip-dbus/9b939c0b534c1b7958fa0a3c7aedf30bca910431.patch @@ -9,6 +9,8 @@ the collections module in Python 3.10. https://docs.python.org/3.10/whatsnew/changelog.html#python-3-10-0-alpha-5 https://bugs.python.org/issue37324 --- +Upstream-Status: Pending + slip/dbus/polkit.py | 6 +++--- slip/util/hookable.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/meta-python/recipes-devtools/python/python3-slip-dbus_0.6.5.bb b/meta-python/recipes-devtools/python/python3-slip-dbus_0.6.5.bb index ae4e6f72da..b6680568b4 100644 --- a/meta-python/recipes-devtools/python/python3-slip-dbus_0.6.5.bb +++ b/meta-python/recipes-devtools/python/python3-slip-dbus_0.6.5.bb @@ -27,11 +27,10 @@ do_compile:prepend() { } RDEPENDS:${PN} += "\ - ${PYTHON_PN}-six \ + python3-six \ " # http://errors.yoctoproject.org/Errors/Details/184713/ # python-native/python: can't open file 'setup.py': [Errno 2] No such file or directory CLEANBROKEN = "1" inherit setuptools3 -PIP_INSTALL_PACKAGE = "slip" diff --git a/meta-python/recipes-devtools/python/python3-smbus2_0.4.2.bb b/meta-python/recipes-devtools/python/python3-smbus2_0.4.3.bb index f22a402df1..b54cdb005f 100644 --- a/meta-python/recipes-devtools/python/python3-smbus2_0.4.2.bb +++ b/meta-python/recipes-devtools/python/python3-smbus2_0.4.3.bb @@ -6,13 +6,13 @@ LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda inherit pypi setuptools3 -SRC_URI[sha256sum] = "634541ed794068a822fe7499f1577468b9d4641b68dd9bfb6d0eb7270f4d2a32" +SRC_URI[sha256sum] = "36f2288a8e1a363cb7a7b2244ec98d880eb5a728a2494ac9c71e9de7bf6a803a" CLEANBROKEN = "1" PYPI_PACKAGE = "smbus2" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-ctypes \ - ${PYTHON_PN}-fcntl \ + python3-ctypes \ + python3-fcntl \ " diff --git a/meta-python/recipes-devtools/python/python3-smpplib/run-ptest b/meta-python/recipes-devtools/python/python3-smpplib/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-smpplib/run-ptest +++ b/meta-python/recipes-devtools/python/python3-smpplib/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-smpplib_2.2.1.bb b/meta-python/recipes-devtools/python/python3-smpplib_2.2.3.bb index be0bafd33f..7979f04c5b 100644 --- a/meta-python/recipes-devtools/python/python3-smpplib_2.2.1.bb +++ b/meta-python/recipes-devtools/python/python3-smpplib_2.2.3.bb @@ -4,7 +4,7 @@ LICENSE = "GPL-3.0-only" LIC_FILES_CHKSUM = "file://README.md;md5=8b4e2ac8cf248f7b991784f88b630852" PYPI_PACKAGE = "smpplib" -SRC_URI[sha256sum] = "c0b01947b47e404f42ccb59e906b6e4eb507963c971d59b44350db0f29c76166" +SRC_URI[sha256sum] = "5215a95b0538d26f189600e0982b31da8281f7453cd6e2862c5b21e3e1002331" inherit pypi setuptools3 ptest @@ -13,15 +13,16 @@ SRC_URI += " \ " RDEPENDS:${PN} += " \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-six \ + python3-logging \ + python3-six \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-unittest \ - ${PYTHON_PN}-profile \ - ${PYTHON_PN}-mock \ + python3-mock \ + python3-profile \ + python3-pytest \ + python3-unittest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-snagboot_1.2.bb b/meta-python/recipes-devtools/python/python3-snagboot_1.2.bb new file mode 100644 index 0000000000..57a3280de4 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-snagboot_1.2.bb @@ -0,0 +1,21 @@ +SUMMARY = "Snagboot intends to be an open-source replacement vendor-specific tools used to recover and/or reflash embedded platforms." + +LICENSE = "GPL-2.0-only" +LIC_FILES_CHKSUM = "file://LICENSE;md5=b234ee4d69f5fce4486a80fdaf4a4263" + +SRC_URI[sha256sum] = "3d5cdd5ffe7355deba27657e6f45d45538a398f92215d219a8cfd6e716f67c34" + +inherit pypi python_setuptools_build_meta + +RDEPENDS:${PN} += " \ + bash \ + python3-fcntl \ + python3-pyusb \ + python3-pyyaml \ + python3-setuptools \ + python3-six \ +" + +do_install:append() { + install -D -m 0644 ${S}/src/snagrecover/50-snagboot.rules ${D}${sysconfdir}/udev/rules.d/50-snagboot.rules +} diff --git a/meta-python/recipes-devtools/python/python3-snappy_0.6.1.bb b/meta-python/recipes-devtools/python/python3-snappy_0.6.1.bb index 8a30f7cb78..bd0979d0b4 100644 --- a/meta-python/recipes-devtools/python/python3-snappy_0.6.1.bb +++ b/meta-python/recipes-devtools/python/python3-snappy_0.6.1.bb @@ -11,5 +11,3 @@ inherit pypi setuptools3 PYPI_PACKAGE = "python-snappy" RDEPENDS:${PN} += "snappy" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-sniffio_1.3.0.bb b/meta-python/recipes-devtools/python/python3-sniffio_1.3.0.bb new file mode 100644 index 0000000000..448ac34f54 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-sniffio_1.3.0.bb @@ -0,0 +1,12 @@ +SUMMARY = "Sniff out which async library your code is running under" +SECTION = "devel/python" +LICENSE = "MIT | Apache-2.0" +LIC_FILES_CHKSUM = "\ + file://LICENSE;md5=fa7b86389e58dd4087a8d2b833e5fe96 \ + file://LICENSE.MIT;md5=e62ba5042d5983462ad229f5aec1576c \ + file://LICENSE.APACHE2;md5=3b83ef96387f14655fc854ddc3c6bd57 \ +" + +inherit pypi setuptools3 + +SRC_URI[sha256sum] = "e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101" diff --git a/meta-python/recipes-devtools/python/python3-socketio_5.11.2.bb b/meta-python/recipes-devtools/python/python3-socketio_5.11.2.bb new file mode 100644 index 0000000000..4251a81d6c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-socketio_5.11.2.bb @@ -0,0 +1,28 @@ +SUMMARY = "Socket.IO server" +HOMEPAGE = "https://github.com/miguelgrinberg/python-socketio/" +SECTION = "devel/python" + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=42d0a9e728978f0eeb759c3be91536b8" + +inherit pypi python_setuptools_build_meta + +PYPI_PACKAGE = "python-socketio" + +SRC_URI[sha256sum] = "ae6a1de5c5209ca859dc574dccc8931c4be17ee003e74ce3b8d1306162bb4a37" + +PACKAGECONFIG ?= "asyncio_client client" +PACKAGECONFIG[asyncio_client] = ",,,python3-aiohttp python3-websockets" +PACKAGECONFIG[client] = ",,,python3-requests python3-websocket-client" + +RDEPENDS:${PN} += "\ + python3-engineio \ + python3-logging \ + python3-math \ + python3-pickle \ + python3-json \ + python3-threading \ + python3-six \ + python3-attrs \ + python3-bidict \ + " diff --git a/meta-python/recipes-devtools/python/python3-socketio_5.7.1.bb b/meta-python/recipes-devtools/python/python3-socketio_5.7.1.bb deleted file mode 100644 index f71d4dad64..0000000000 --- a/meta-python/recipes-devtools/python/python3-socketio_5.7.1.bb +++ /dev/null @@ -1,28 +0,0 @@ -SUMMARY = "Socket.IO server" -HOMEPAGE = "https://github.com/miguelgrinberg/python-socketio/" -SECTION = "devel/python" - -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=42d0a9e728978f0eeb759c3be91536b8" - -inherit pypi python_setuptools_build_meta - -PYPI_PACKAGE = "python-socketio" - -SRC_URI[sha256sum] = "5011a0cd2545c954d7df09eef7489ec424c93b001cc146599cd72f1dd20f0d46" - -PACKAGECONFIG ?= "asyncio_client client" -PACKAGECONFIG[asyncio_client] = ",,,${PYTHON_PN}-aiohttp ${PYTHON_PN}-websockets" -PACKAGECONFIG[client] = ",,,${PYTHON_PN}-requests ${PYTHON_PN}-websocket-client" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-engineio \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-math \ - ${PYTHON_PN}-pickle \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-threading \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-attrs \ - ${PYTHON_PN}-bidict \ - " diff --git a/meta-python/recipes-devtools/python/python3-socksio/0001-Unpin-flit-core-dependency.patch b/meta-python/recipes-devtools/python/python3-socksio/0001-Unpin-flit-core-dependency.patch new file mode 100644 index 0000000000..75be61fc4f --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-socksio/0001-Unpin-flit-core-dependency.patch @@ -0,0 +1,21 @@ +From 5c50fd76e7459bb822ff8f712172a78e21b8dd04 Mon Sep 17 00:00:00 2001 +From: Theodore Ni <3806110+tjni@users.noreply.github.com> +Date: Sun, 13 Aug 2023 09:21:49 -0700 +Subject: [PATCH] Unpin flit-core dependency + +Upstream-Status: Submitted [https://github.com/sethmlarson/socksio/pull/61] +--- + pyproject.toml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/pyproject.toml b/pyproject.toml +index 2d6c5a3..60c63ea 100644 +--- a/pyproject.toml ++++ b/pyproject.toml +@@ -1,5 +1,5 @@ + [build-system] +-requires = ["flit_core >=2,<3"] ++requires = ["flit_core >=2"] + build-backend = "flit_core.buildapi" + + [tool.flit.metadata] diff --git a/meta-python/recipes-devtools/python/python3-socksio_1.0.0.bb b/meta-python/recipes-devtools/python/python3-socksio_1.0.0.bb new file mode 100644 index 0000000000..4353a52ee1 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-socksio_1.0.0.bb @@ -0,0 +1,10 @@ +SUMMARY = "Sans-I/O implementation of SOCKS4, SOCKS4A, and SOCKS5." +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=0b4dda8edb09eec767aaded3cbf8f6b1" + +inherit pypi python_flit_core + +SRC_URI += "file://0001-Unpin-flit-core-dependency.patch" + +SRC_URI[sha256sum] = "f88beb3da5b5c38b9890469de67d0cb0f9d494b78b106ca1845f96c10b91c4ac" diff --git a/meta-python/recipes-devtools/python/python3-soupsieve/run-ptest b/meta-python/recipes-devtools/python/python3-soupsieve/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-soupsieve/run-ptest +++ b/meta-python/recipes-devtools/python/python3-soupsieve/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-soupsieve_2.3.1.bb b/meta-python/recipes-devtools/python/python3-soupsieve_2.5.bb index 7cb76b426f..d26a13dfbd 100644 --- a/meta-python/recipes-devtools/python/python3-soupsieve_2.3.1.bb +++ b/meta-python/recipes-devtools/python/python3-soupsieve_2.5.bb @@ -2,23 +2,20 @@ SUMMARY = "CSS selector library for python-beautifulsoup4" HOMEPAGE = "https://github.com/facelessuser/soupsieve" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE.md;md5=33c3a77def9b3ad83e01c65bdcc1af67" +LIC_FILES_CHKSUM = "file://LICENSE.md;md5=520586fa71ed2cbda50b4a8c89621e09" -SRC_URI[sha256sum] = "b8d49b1cd4f037c7082a9683dfa1801aa2597fb11c3a1155b7a5b94829b4f1f9" +SRC_URI[sha256sum] = "5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690" -inherit pypi python_setuptools_build_meta ptest +inherit pypi python_hatchling python_setuptools_build_meta ptest SRC_URI += " \ file://run-ptest \ " -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-beautifulsoup4 \ -" - RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-beautifulsoup4 \ + python3-beautifulsoup4 \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-spidev_3.5.bb b/meta-python/recipes-devtools/python/python3-spidev_3.6.bb index ca5a1eb523..e3fdc435ac 100644 --- a/meta-python/recipes-devtools/python/python3-spidev_3.5.bb +++ b/meta-python/recipes-devtools/python/python3-spidev_3.6.bb @@ -10,7 +10,6 @@ LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" SRCNAME = "spidev" -SRC_URI[md5sum] = "7007e4fff2750025e233d8dfe46be670" -SRC_URI[sha256sum] = "8a7f5c289f161ea2ac4697fa8a10918232c990678dd0053084b3c43b1363910d" +SRC_URI[sha256sum] = "14dbc37594a4aaef85403ab617985d3c3ef464d62bc9b769ef552db53701115b" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-sqlalchemy_1.4.40.bb b/meta-python/recipes-devtools/python/python3-sqlalchemy_1.4.40.bb deleted file mode 100644 index f61030fc10..0000000000 --- a/meta-python/recipes-devtools/python/python3-sqlalchemy_1.4.40.bb +++ /dev/null @@ -1,23 +0,0 @@ -DESCRIPTION = "Python SQL toolkit and Object Relational Mapper that gives \ -application developers the full power and flexibility of SQL" -HOMEPAGE = "http://www.sqlalchemy.org/" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=f4001d1ca15b69d096fa1b4fd1bdce79" - -SRC_URI[sha256sum] = "44a660506080cc975e1dfa5776fe5f6315ddc626a77b50bf0eee18b0389ea265" - -PYPI_PACKAGE = "SQLAlchemy" -inherit pypi setuptools3 - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-pickle \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-threading \ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-profile \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-sqlalchemy_2.0.29.bb b/meta-python/recipes-devtools/python/python3-sqlalchemy_2.0.29.bb new file mode 100644 index 0000000000..e646bd0d9c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-sqlalchemy_2.0.29.bb @@ -0,0 +1,25 @@ +DESCRIPTION = "Python SQL toolkit and Object Relational Mapper that gives \ +application developers the full power and flexibility of SQL" +HOMEPAGE = "http://www.sqlalchemy.org/" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=c78b979ae6c20775a28a287d32092cbb" + +SRC_URI[sha256sum] = "bd9566b8e58cabd700bc367b60e90d9349cd16f0984973f98a9a09f9c64e86f0" + +PYPI_PACKAGE = "SQLAlchemy" +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-asyncio \ + python3-compression \ + python3-json \ + python3-logging \ + python3-netclient \ + python3-numbers \ + python3-pickle \ + python3-profile \ + python3-threading \ + python3-typing-extensions \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-sqlparse/0001-sqlparse-change-shebang-to-python3.patch b/meta-python/recipes-devtools/python/python3-sqlparse/0001-sqlparse-change-shebang-to-python3.patch index 94121340d5..0c9f29a6b8 100644 --- a/meta-python/recipes-devtools/python/python3-sqlparse/0001-sqlparse-change-shebang-to-python3.patch +++ b/meta-python/recipes-devtools/python/python3-sqlparse/0001-sqlparse-change-shebang-to-python3.patch @@ -1,4 +1,4 @@ -From 7fd00ab8c1b663052d57e735b6b956d5c92fbaed Mon Sep 17 00:00:00 2001 +From f236a30dc8528b6f114201580f1efdcc1c447d43 Mon Sep 17 00:00:00 2001 From: Changqing Li <changqing.li@windriver.com> Date: Mon, 9 Mar 2020 13:10:37 +0800 Subject: [PATCH] sqlparse: change shebang to python3 @@ -12,80 +12,10 @@ dropped. Signed-off-by: Changqing Li <changqing.li@windriver.com> Signed-off-by: Leon Anavi <leon.anavi@konsulko.com> --- - 0001-sqlparse-change-shebang-to-python3.patch | 51 +++++++++++++++++++ - setup.py | 2 +- - sqlparse/__main__.py | 2 +- - sqlparse/cli.py | 2 +- - 4 files changed, 54 insertions(+), 3 deletions(-) - create mode 100644 0001-sqlparse-change-shebang-to-python3.patch + sqlparse/__main__.py | 2 +- + sqlparse/cli.py | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) -diff --git a/0001-sqlparse-change-shebang-to-python3.patch b/0001-sqlparse-change-shebang-to-python3.patch -new file mode 100644 -index 0000000..ad6c50f ---- /dev/null -+++ b/0001-sqlparse-change-shebang-to-python3.patch -@@ -0,0 +1,51 @@ -+From 10c9d3341d64d697f678a64ae707f6bda21565bb Mon Sep 17 00:00:00 2001 -+From: Changqing Li <changqing.li@windriver.com> -+Date: Mon, 9 Mar 2020 13:10:37 +0800 -+Subject: [PATCH] sqlparse: change shebang to python3 -+ -+Upstream-Status: Pending -+ -+Don't send upstream since upstream still support python2, -+we can only make this change after python2 is offcially -+dropped. -+ -+Signed-off-by: Changqing Li <changqing.li@windriver.com> -+--- -+ setup.py | 2 +- -+ sqlparse/__main__.py | 2 +- -+ sqlparse/cli.py | 2 +- -+ 3 files changed, 3 insertions(+), 3 deletions(-) -+ -+diff --git a/setup.py b/setup.py -+index 345d0ce..ce3abc3 100644 -+--- a/setup.py -++++ b/setup.py -+@@ -1,4 +1,4 @@ -+-#!/usr/bin/env python -++#!/usr/bin/env python3 -+ # -*- coding: utf-8 -*- -+ # -+ # Copyright (C) 2009-2018 the sqlparse authors and contributors -+diff --git a/sqlparse/__main__.py b/sqlparse/__main__.py -+index 867d75d..dd0c074 100644 -+--- a/sqlparse/__main__.py -++++ b/sqlparse/__main__.py -+@@ -1,4 +1,4 @@ -+-#!/usr/bin/env python -++#!/usr/bin/env python3 -+ # -*- coding: utf-8 -*- -+ # -+ # Copyright (C) 2009-2018 the sqlparse authors and contributors -+diff --git a/sqlparse/cli.py b/sqlparse/cli.py -+index 25555a5..8bf050a 100755 -+--- a/sqlparse/cli.py -++++ b/sqlparse/cli.py -+@@ -1,4 +1,4 @@ -+-#!/usr/bin/env python -++#!/usr/bin/env python3 -+ # -*- coding: utf-8 -*- -+ # -+ # Copyright (C) 2009-2018 the sqlparse authors and contributors -+-- -+2.7.4 -+ -diff --git a/setup.py b/setup.py -index ede0aff..dc6a323 100644 ---- a/setup.py -+++ b/setup.py -@@ -1,4 +1,4 @@ --#!/usr/bin/env python -+#!/usr/bin/env python3 - # - # Copyright (C) 2009-2020 the sqlparse authors and contributors - # <see AUTHORS file> diff --git a/sqlparse/__main__.py b/sqlparse/__main__.py index 2bf2513..6a3a115 100644 --- a/sqlparse/__main__.py @@ -107,5 +37,5 @@ index 7a8aacb..9c727e8 100755 # Copyright (C) 2009-2020 the sqlparse authors and contributors # <see AUTHORS file> -- -2.17.1 +2.41.0 diff --git a/meta-python/recipes-devtools/python/python3-sqlparse/run-ptest b/meta-python/recipes-devtools/python/python3-sqlparse/run-ptest index 3385d68939..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-sqlparse/run-ptest +++ b/meta-python/recipes-devtools/python/python3-sqlparse/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-sqlparse_0.4.2.bb b/meta-python/recipes-devtools/python/python3-sqlparse_0.4.4.bb index 0980ff9c24..c04971ee8f 100644 --- a/meta-python/recipes-devtools/python/python3-sqlparse_0.4.2.bb +++ b/meta-python/recipes-devtools/python/python3-sqlparse_0.4.4.bb @@ -8,16 +8,17 @@ SRC_URI += "file://0001-sqlparse-change-shebang-to-python3.patch \ file://run-ptest \ " -SRC_URI[sha256sum] = "0c00730c74263a94e5a9919ade150dfc3b19c574389985446148402998287dae" +SRC_URI[sha256sum] = "d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c" export BUILD_SYS export HOST_SYS -inherit pypi ptest setuptools3 +inherit pypi ptest python_flit_core RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-unixadmin \ + python3-pytest \ + python3-unittest-automake-output \ + python3-unixadmin \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-sqlsoup_0.9.1.bb b/meta-python/recipes-devtools/python/python3-sqlsoup_0.9.1.bb index 592ba72043..e7f329e9bb 100644 --- a/meta-python/recipes-devtools/python/python3-sqlsoup_0.9.1.bb +++ b/meta-python/recipes-devtools/python/python3-sqlsoup_0.9.1.bb @@ -7,3 +7,5 @@ PYPI_PACKAGE = "sqlsoup" SRC_URI[sha256sum] = "2fafb7732a663dcd59b37e64d1c94d5fb20d4fad32cd8ee260aa1cd9a10340d6" inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-sqlalchemy" diff --git a/meta-python/recipes-devtools/python/python3-stack-data_0.6.3.bb b/meta-python/recipes-devtools/python/python3-stack-data_0.6.3.bb new file mode 100644 index 0000000000..55ddff383f --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-stack-data_0.6.3.bb @@ -0,0 +1,19 @@ +SUMMARY = "Extract data from python stack frames and tracebacks for informative displays" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=a3d6c15f7859ae235a78f2758e5a48cf" + +DEPENDS = "python3-setuptools-scm-native" + +PYPI_PACKAGE = "stack_data" + +inherit pypi python_setuptools_build_meta + +SRC_URI[sha256sum] = "836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9" + +RDEPENDS:${PN} = " \ + python3-asttokens \ + python3-executing \ + python3-html \ + python3-logging \ + python3-pure-eval \ +" diff --git a/meta-python/recipes-devtools/python/python3-stevedore_4.0.0.bb b/meta-python/recipes-devtools/python/python3-stevedore_5.1.0.bb index 46c6d831aa..ce71796339 100644 --- a/meta-python/recipes-devtools/python/python3-stevedore_4.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-stevedore_5.1.0.bb @@ -3,12 +3,12 @@ HOMEPAGE = "https://docs.openstack.org/stevedore/latest/" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57" -SRC_URI[sha256sum] = "f82cc99a1ff552310d19c379827c2c64dd9f85a38bcd5559db2470161867b786" +SRC_URI[sha256sum] = "a54534acf9b89bc7ed264807013b505bf07f74dbe4bcfa37d32bd063870b087c" -DEPENDS += "${PYTHON_PN}-pbr-native" +DEPENDS += "python3-pbr-native" inherit pypi setuptools3 -RDEPENDS:${PN} += "${PYTHON_PN}-pbr ${PYTHON_PN}-six" +RDEPENDS:${PN} += "python3-pbr python3-six" BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-stopit/LICENSE b/meta-python/recipes-devtools/python/python3-stopit/LICENSE new file mode 100644 index 0000000000..0b9a5bec37 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-stopit/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Gilles Lenfant + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.
\ No newline at end of file diff --git a/meta-python/recipes-devtools/python/python3-stopit_1.1.2.bb b/meta-python/recipes-devtools/python/python3-stopit_1.1.2.bb new file mode 100644 index 0000000000..e119a0f11a --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-stopit_1.1.2.bb @@ -0,0 +1,17 @@ +SUMMARY = "Raise asynchronous exceptions in other threads, control the timeout of blocks or callables with two context managers and two decorators." +HOMEPAGE = "https://pypi.org/project/stopit/" +SECTION = "devel/python" + +SRC_URI += " file://LICENSE " +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${WORKDIR}/LICENSE;md5=497c556f42b1355b64190da2f3d88f93" + +SRC_URI[sha256sum] = "f7f39c583fd92027bd9d06127b259aee7a5b7945c1f1fa56263811e1e766996d" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "\ + python3-setuptools \ + " + +BBCLASSEXTEND = "native nativesdk"
\ No newline at end of file diff --git a/meta-python/recipes-devtools/python/python3-strenum/0001-patch-versioneer-for-python-3.12-compatibility.patch b/meta-python/recipes-devtools/python/python3-strenum/0001-patch-versioneer-for-python-3.12-compatibility.patch new file mode 100644 index 0000000000..cdf3f1acb7 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-strenum/0001-patch-versioneer-for-python-3.12-compatibility.patch @@ -0,0 +1,37 @@ +From 3a71c9bc3747201e5bebe0e80b98ac6219209875 Mon Sep 17 00:00:00 2001 +From: alperak <alperyasinak1@gmail.com> +Date: Thu, 8 Feb 2024 14:09:32 +0300 +Subject: [PATCH] Patch versioneer for Python 3.12 compatibility + +AttributeError: 'ConfigParser' object has no attribute 'readfp'. Did you mean: 'read'? +AttributeError: module 'configparser' has no attribute 'SafeConfigParser'. Did you mean: 'RawConfigParser'? + +readfp and SafeConfigParser has been deprecated since Python 3.2 and removed in Python 3.12 (due October 2023). Use read_file and ConfigParser instead. + +https://docs.python.org/3/whatsnew/3.12.html#configparser + +Upstream-Status: Submitted [https://github.com/irgeek/StrEnum/pull/34] +Signed-off-by: alperak <alperyasinak1@gmail.com> +--- + versioneer.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/versioneer.py b/versioneer.py +index 64fea1c..3aa5da3 100644 +--- a/versioneer.py ++++ b/versioneer.py +@@ -339,9 +339,9 @@ def get_config_from_root(root): + # configparser.NoOptionError (if it lacks "VCS="). See the docstring at + # the top of versioneer.py for instructions on writing your setup.cfg . + setup_cfg = os.path.join(root, "setup.cfg") +- parser = configparser.SafeConfigParser() ++ parser = configparser.ConfigParser() + with open(setup_cfg, "r") as f: +- parser.readfp(f) ++ parser.read_file(f) + VCS = parser.get("versioneer", "VCS") # mandatory + + def get(parser, name): +-- +2.25.1 + diff --git a/meta-python/recipes-devtools/python/python3-strenum_0.4.15.bb b/meta-python/recipes-devtools/python/python3-strenum_0.4.15.bb new file mode 100644 index 0000000000..cbe7fcc215 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-strenum_0.4.15.bb @@ -0,0 +1,14 @@ +SUMMARY = "An Enum that inherits from str" +HOMEPAGE = "https://github.com/irgeek/StrEnum" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ba0eb3de1df70bde0ed48488cfd81269" + +SRC_URI += "file://0001-patch-versioneer-for-python-3.12-compatibility.patch" + +DEPENDS = "python3-pytest-runner-native" + +SRC_URI[sha256sum] = "878fb5ab705442070e4dd1929bb5e2249511c0bcf2b0eeacf3bcd80875c82eff" + +PYPI_PACKAGE = "StrEnum" + +inherit pypi python_setuptools_build_meta diff --git a/meta-python/recipes-devtools/python/python3-supervisor_4.2.4.bb b/meta-python/recipes-devtools/python/python3-supervisor_4.2.5.bb index d677075570..06b08e78a3 100644 --- a/meta-python/recipes-devtools/python/python3-supervisor_4.2.4.bb +++ b/meta-python/recipes-devtools/python/python3-supervisor_4.2.5.bb @@ -7,7 +7,7 @@ HOMEPAGE = "https://github.com/Supervisor/supervisor" LICENSE = "BSD-4-Clause" LIC_FILES_CHKSUM = "file://LICENSES.txt;md5=5b4e3a2172bba4c47cded5885e7e507e" -SRC_URI[sha256sum] = "40dc582ce1eec631c3df79420b187a6da276bbd68a4ec0a8f1f123ea616b97a2" +SRC_URI[sha256sum] = "34761bae1a23c58192281a5115fb07fbf22c9b0133c08166beffc70fed3ebc12" PYPI_PACKAGE = "supervisor" inherit pypi systemd setuptools3 @@ -17,7 +17,6 @@ RDEPENDS:${PN} = "\ python3-xmlrpc \ python3-resource \ python3-setuptools \ - python3-smtpd \ " SRC_URI += "file://supervisord.conf \ diff --git a/meta-python/recipes-devtools/python/python3-sympy_1.10.1.bb b/meta-python/recipes-devtools/python/python3-sympy_1.10.1.bb deleted file mode 100644 index d8ac23dd5e..0000000000 --- a/meta-python/recipes-devtools/python/python3-sympy_1.10.1.bb +++ /dev/null @@ -1,12 +0,0 @@ -SUMMARY = "Computer algebra system (CAS) in Python" -HOMEPAGE = "https://pypi.org/project/sympy/" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=42976c55ba05d15b32a7b4757dee5e64" - -SRC_URI[sha256sum] = "5939eeffdf9e152172601463626c022a2c27e75cf6278de8d401d50c9d58787b" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += "python3-mpmath" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-sympy_1.12.bb b/meta-python/recipes-devtools/python/python3-sympy_1.12.bb new file mode 100644 index 0000000000..088dda3a2a --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-sympy_1.12.bb @@ -0,0 +1,15 @@ +SUMMARY = "Computer algebra system (CAS) in Python" +HOMEPAGE = "https://pypi.org/project/sympy/" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ea48085d7dff75b49271b25447e8cdca" + +SRC_URI[sha256sum] = "ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-misc \ + python3-mpmath \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python-systemd/0001-Provide-implementation-of-strndupa-for-musl.patch b/meta-python/recipes-devtools/python/python3-systemd/0001-Provide-implementation-of-strndupa-for-musl.patch index d7085a8565..d7085a8565 100644 --- a/meta-python/recipes-devtools/python/python-systemd/0001-Provide-implementation-of-strndupa-for-musl.patch +++ b/meta-python/recipes-devtools/python/python3-systemd/0001-Provide-implementation-of-strndupa-for-musl.patch diff --git a/meta-python/recipes-devtools/python/python3-systemd_234.bb b/meta-python/recipes-devtools/python/python3-systemd_234.bb deleted file mode 100644 index 10614fe374..0000000000 --- a/meta-python/recipes-devtools/python/python3-systemd_234.bb +++ /dev/null @@ -1,23 +0,0 @@ -SUMMARY = "Python interface for libsystemd" -HOMEPAGE = "https://github.com/systemd/python-systemd" -LICENSE = "LGPL-2.1-or-later" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=4fbd65380cdd255951079008b364516c" - -PYPI_PACKAGE = "systemd-python" -DEPENDS += "systemd (<=234)" -RDEPENDS:${PN} += "systemd ${PYTHON_PN}-syslog ${PYTHON_PN}-logging python3-syslog" -REQUIRED_DISTRO_FEATURES = "systemd" -inherit pypi features_check pkgconfig setuptools3 - -SRC_URI[md5sum] = "5071ea5bcb976186e92a3f5e75df221d" -SRC_URI[sha256sum] = "fd0e44bf70eadae45aadc292cb0a7eb5b0b6372cd1b391228047d33895db83e7" - -# allow for common patches for python- and python3-systemd -FILESEXTRAPATHS:prepend := "${THISDIR}/python-systemd:" - -SRC_URI += " \ - file://endian.patch \ - file://0002-setup.py-switch-from-distutils-to-setuptools.patch \ -" - -SRC_URI:append:libc-musl = " file://0001-Provide-implementation-of-strndupa-for-musl.patch" diff --git a/meta-python/recipes-devtools/python/python3-systemd_235.bb b/meta-python/recipes-devtools/python/python3-systemd_235.bb new file mode 100644 index 0000000000..7a7d5a5053 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-systemd_235.bb @@ -0,0 +1,12 @@ +SUMMARY = "Python interface for libsystemd" +HOMEPAGE = "https://github.com/systemd/python-systemd" +LICENSE = "LGPL-2.1-or-later" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=4fbd65380cdd255951079008b364516c" + +PYPI_PACKAGE = "systemd-python" +DEPENDS += "systemd (<=235)" +RDEPENDS:${PN} += "systemd python3-syslog python3-logging python3-syslog" +REQUIRED_DISTRO_FEATURES = "systemd" +inherit pypi features_check pkgconfig setuptools3 +SRC_URI:append:libc-musl = " file://0001-Provide-implementation-of-strndupa-for-musl.patch" +SRC_URI[sha256sum] = "4e57f39797fd5d9e2d22b8806a252d7c0106c936039d1e71c8c6b8008e695c0a" diff --git a/meta-python/recipes-devtools/python/python3-tabulate_0.8.10.bb b/meta-python/recipes-devtools/python/python3-tabulate_0.8.10.bb deleted file mode 100644 index 222e6e7bb4..0000000000 --- a/meta-python/recipes-devtools/python/python3-tabulate_0.8.10.bb +++ /dev/null @@ -1,8 +0,0 @@ -SUMMARY = "Pretty-print tabular data" -HOMEPAGE = "https://github.com/astanin/python-tabulate" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=6ad1430c0c4824ec6a5dbb9754b011d7" - -SRC_URI[sha256sum] = "6c57f3f3dd7ac2782770155f3adb2db0b1a269637e42f27599925e64b114f519" - -inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-tabulate_0.9.0.bb b/meta-python/recipes-devtools/python/python3-tabulate_0.9.0.bb new file mode 100644 index 0000000000..75e97355f5 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-tabulate_0.9.0.bb @@ -0,0 +1,21 @@ +SUMMARY = "Pretty-print tabular data" +HOMEPAGE = "https://github.com/astanin/python-tabulate" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=6ad1430c0c4824ec6a5dbb9754b011d7" + +SRC_URI[sha256sum] = "0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c" + +inherit pypi python_setuptools_build_meta + +DEPENDS += " \ + python3-setuptools-scm-native \ + python3-toml-native \ +" + +RDEPENDS:${PN} += " \ + python3-html \ + python3-core \ + python3-io \ + python3-math \ + python3-profile \ +" diff --git a/meta-python/recipes-devtools/python/python3-telnetlib3_2.0.4.bb b/meta-python/recipes-devtools/python/python3-telnetlib3_2.0.4.bb new file mode 100644 index 0000000000..c1e7c8e1f7 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-telnetlib3_2.0.4.bb @@ -0,0 +1,15 @@ +SUMMARY = "Telnet server and client library based on asyncio" +HOMEPAGE = "https://github.com/jquast/telnetlib3" +LICENSE = "ISC" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=fc2166986ad8169d334a342e0d8db8e0" + +SRC_URI[md5sum] = "2dfac7e10ed63c408da50ea712415f87" +SRC_URI[sha256sum] = "dbcbc16456a0e03a62431be7cfefff00515ab2f4ce2afbaf0d3a0e51a98c948d" + +PYPI_PACKAGE = "telnetlib3" + +inherit pypi setuptools3 + +RDEPENDS:${PN} = "\ + python3-asyncio \ +" diff --git a/meta-python/recipes-devtools/python/python3-term_2.4.bb b/meta-python/recipes-devtools/python/python3-term_2.5.bb index bc6a4c3df6..7d508ad809 100644 --- a/meta-python/recipes-devtools/python/python3-term_2.4.bb +++ b/meta-python/recipes-devtools/python/python3-term_2.5.bb @@ -3,10 +3,10 @@ SECTION = "devel/python" LICENSE = "Python-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=d90e2d280a4836c607520383d1639be1" -SRC_URI[sha256sum] = "2cca4cf5f83035ca12627c4bbeff2891ad4711666247a790fd8200d73f38c3f0" +SRC_URI[sha256sum] = "846fda941dbb8a7c9f246e99bf5ee731910fc4a4cc54b7e36457c133c9f6b78b" inherit pypi setuptools3 RDEPENDS:${PN} = "\ - ${PYTHON_PN}-io \ + python3-io \ " diff --git a/meta-python/recipes-devtools/python/python3-termcolor/0001-setup.py-Use-setuptools-instead-of-distutils.patch b/meta-python/recipes-devtools/python/python3-termcolor/0001-setup.py-Use-setuptools-instead-of-distutils.patch deleted file mode 100644 index a55a6a914b..0000000000 --- a/meta-python/recipes-devtools/python/python3-termcolor/0001-setup.py-Use-setuptools-instead-of-distutils.patch +++ /dev/null @@ -1,27 +0,0 @@ -From e30308284c721210e2ba50d8b3d159cedf5eada8 Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Mon, 28 Feb 2022 14:44:42 -0800 -Subject: [PATCH] setup.py: Use setuptools instead of distutils - -Upstream-Status: Pending -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- - setup.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/setup.py b/setup.py -index c4fe4ed..dad1d29 100755 ---- a/setup.py -+++ b/setup.py -@@ -23,7 +23,7 @@ - # Author: Konstantin Lepa <konstantin.lepa@gmail.com> - - import os --from distutils.core import setup -+from setuptools import setup - - prjdir = os.path.dirname(__file__) - --- -2.35.1 - diff --git a/meta-python/recipes-devtools/python/python3-termcolor_1.1.0.bb b/meta-python/recipes-devtools/python/python3-termcolor_1.1.0.bb deleted file mode 100644 index 15bab622a6..0000000000 --- a/meta-python/recipes-devtools/python/python3-termcolor_1.1.0.bb +++ /dev/null @@ -1,13 +0,0 @@ -SUMMARY = "ANSII Color formatting for output in terminal" -HOMEPAGE = "https://pypi.python.org/pypi/termcolor" -SECTION = "devel/python" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://COPYING.txt;md5=809e8749b63567978acfbd81d9f6a27d" - -inherit pypi setuptools3 - -SRC_URI += "file://0001-setup.py-Use-setuptools-instead-of-distutils.patch" - -SRC_URI[sha256sum] = "1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b" - -BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-termcolor_2.4.0.bb b/meta-python/recipes-devtools/python/python3-termcolor_2.4.0.bb new file mode 100644 index 0000000000..ea6b683991 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-termcolor_2.4.0.bb @@ -0,0 +1,16 @@ +SUMMARY = "ANSII Color formatting for output in terminal" +HOMEPAGE = "https://pypi.python.org/pypi/termcolor" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://COPYING.txt;md5=e5f5f7c9b280511f124dba5dda3d180e" + +inherit pypi python_setuptools_build_meta + +SRC_URI[sha256sum] = "aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a" + +DEPENDS += " \ + python3-toml-native \ + python3-hatch-vcs-native \ +" + +BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-texttable_1.6.4.bb b/meta-python/recipes-devtools/python/python3-texttable_1.7.0.bb index 6916a72d34..56448f738e 100644 --- a/meta-python/recipes-devtools/python/python3-texttable_1.6.4.bb +++ b/meta-python/recipes-devtools/python/python3-texttable_1.7.0.bb @@ -5,6 +5,6 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=7a97cdac2d9679ffdcfef3dc036d24f6" inherit pypi setuptools3 -SRC_URI[sha256sum] = "42ee7b9e15f7b225747c3fa08f43c5d6c83bc899f80ff9bae9319334824076e9" +SRC_URI[sha256sum] = "2d2068fb55115807d3ac77a4ca68fa48803e84ebb0ee2340f858107a36522638" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-tomli-w/run-ptest b/meta-python/recipes-devtools/python/python3-tomli-w/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-tomli-w/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-tomli-w_1.0.0.bb b/meta-python/recipes-devtools/python/python3-tomli-w_1.0.0.bb new file mode 100644 index 0000000000..8a8a48467d --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-tomli-w_1.0.0.bb @@ -0,0 +1,34 @@ +DESCRIPTION = "Tomli-W is a Python library for writing TOML. It is a write-only counterpart to Tomli, which is a read-only TOML parser." +HOMEPAGE = "https://github.com/hukkin/tomli-w" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=aaaaf0879d17df0110d1aa8c8c9f46f5" + +SRCREV = "19099125f32e7c491603e393263754262b356956" +PYPI_SRC_URI = "git://github.com/hukkin/tomli-w.git;protocol=https;branch=master" + +inherit pypi python_flit_core ptest + +S = "${WORKDIR}/git" + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-tomli \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + install -d ${D}${PTEST_PATH}/benchmark + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ + cp -rf ${S}/benchmark/* ${D}${PTEST_PATH}/benchmark/ +} + +RDEPENDS:${PN} += " \ + python3-datetime \ + python3-numbers \ + python3-stringold \ +" diff --git a/meta-python/recipes-devtools/python/python3-tomlkit/run-ptest b/meta-python/recipes-devtools/python/python3-tomlkit/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-tomlkit/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-tomlkit_0.12.3.bb b/meta-python/recipes-devtools/python/python3-tomlkit_0.12.3.bb new file mode 100644 index 0000000000..d4162a110b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-tomlkit_0.12.3.bb @@ -0,0 +1,32 @@ +SUMMARY = "Style preserving TOML library" +HOMEPAGE = "https://pypi.org/project/tomlkit/" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=31aac0dbc1babd278d5386dadb7f8e82" + +SRC_URI[sha256sum] = "75baf5012d06501f07bee5bf8e801b9f343e7aac5a92581f20f80ce632e6b5a4" + +inherit pypi python_poetry_core ptest + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN} += " \ + python3-datetime \ + python3-profile \ + python3-stringold \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-poetry-core \ + python3-pytest \ + python3-pyyaml \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-toolz_0.12.0.bb b/meta-python/recipes-devtools/python/python3-toolz_0.12.1.bb index 4025fa3e0e..f1763ee518 100644 --- a/meta-python/recipes-devtools/python/python3-toolz_0.12.0.bb +++ b/meta-python/recipes-devtools/python/python3-toolz_0.12.1.bb @@ -4,7 +4,7 @@ SECTION = "devel/python" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=ca09cab178326d18433aae982d1edf5d" -SRC_URI[sha256sum] = "88c570861c440ee3f2f6037c4654613228ff40c93a6c25e0eba70d17282c6194" +SRC_URI[sha256sum] = "ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-tornado_6.2.bb b/meta-python/recipes-devtools/python/python3-tornado_6.4.bb index d94fd39273..b01c1cec2a 100644 --- a/meta-python/recipes-devtools/python/python3-tornado_6.2.bb +++ b/meta-python/recipes-devtools/python/python3-tornado_6.4.bb @@ -6,22 +6,36 @@ HOMEPAGE = "http://www.tornadoweb.org/en/stable/" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57" -SRC_URI[sha256sum] = "9b630419bde84ec666bfd7ea0a4cb2a8a651c2d5cccdbdd1972a0c859dfc3c13" +SRC_URI[sha256sum] = "72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee" inherit pypi setuptools3 # Requires _compression which is currently located in misc -RDEPENDS:${PN} += "${PYTHON_PN}-compression ${PYTHON_PN}-numbers ${PYTHON_PN}-email \ - ${PYTHON_PN}-pkgutil ${PYTHON_PN}-html ${PYTHON_PN}-json ${PYTHON_PN}-certifi ${PYTHON_PN}-threading \ - ${PYTHON_PN}-ctypes ${PYTHON_PN}-misc" +RDEPENDS:${PN} += " \ + python3-asyncio \ + python3-certifi \ + python3-compression \ + python3-ctypes \ + python3-email \ + python3-html \ + python3-json \ + python3-misc \ + python3-multiprocessing \ + python3-numbers \ + python3-pkgutil \ + python3-pycurl \ + python3-threading \ + python3-unittest \ +" -RDEPENDS:${PN}-test += "${PN} ${PYTHON_PN}-unittest" +RDEPENDS:${PN}-test += "python3-unittest" PACKAGES =+ "\ ${PN}-test \ " FILES:${PN}-test = " \ - ${libdir}/${PYTHON_DIR}/site-packages/*/test \ - ${libdir}/${PYTHON_DIR}/site-packages/*/testing.py* \ + ${PYTHON_SITEPACKAGES_DIR}/*/test \ " + +BBCLASSEXTEND += "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-tox_4.14.2.bb b/meta-python/recipes-devtools/python/python3-tox_4.14.2.bb new file mode 100644 index 0000000000..f451de3218 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-tox_4.14.2.bb @@ -0,0 +1,34 @@ +# SPDX-License-Identifier: MIT +# Copyright (C) 2023 iris-GmbH infrared & intelligent sensors + +SUMMARY = "Automate and standardize testing in Python. It is part of a larger vision of easing the packaging, testing and release process of Python software (alongside pytest and devpi)." +HOMEPAGE = "http://tox.readthedocs.org/" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=11610a9d8fd95649cf8159be12b98cb7" + +SRC_URI[sha256sum] = "0defb44f6dafd911b61788325741cc6b2e12ea71f987ac025ad4d649f1f1a104" + +BBCLASSEXTEND = "native nativesdk" +inherit pypi python_hatchling + +DEPENDS += "\ + python3-hatch-vcs-native \ +" + +RDEPENDS:${PN} += "\ + python3-cachetools \ + python3-chardet \ + python3-colorama \ + python3-filelock \ + python3-packaging \ + python3-platformdirs \ + python3-pluggy \ + python3-pyproject-api \ + python3-tomli \ + python3-virtualenv \ +" + +# Install all built-in python3 modules, as the software tested with tox might +# depend on it. Tox will attempt to install all required dependencies +# in a virtualenv using pip, but this obviously does not include the built-in modules. +RDEPENDS:${PN} += "python3-modules" diff --git a/meta-python/recipes-devtools/python/python3-tqdm_4.64.0.bb b/meta-python/recipes-devtools/python/python3-tqdm_4.66.2.bb index 3cb45f1a6e..77d26f54b2 100644 --- a/meta-python/recipes-devtools/python/python3-tqdm_4.64.0.bb +++ b/meta-python/recipes-devtools/python/python3-tqdm_4.66.2.bb @@ -3,13 +3,13 @@ HOMEPAGE = "http://tqdm.github.io/" SECTION = "devel/python" LICENSE = "MIT & MPL-2.0" -LIC_FILES_CHKSUM = "file://LICENCE;md5=1672e2674934fd93a31c09cf17f34100" +LIC_FILES_CHKSUM = "file://LICENCE;md5=42dfa9e8c616dbc295df3f58d756b2a1" -SRC_URI[sha256sum] = "40be55d30e200777a307a7585aee69e4eabb46b4ec6a4b4a5f2d9f11e7d5408d" +SRC_URI[sha256sum] = "6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531" inherit pypi python_setuptools_build_meta -DEPENDS += "${PYTHON_PN}-setuptools-scm-native" +DEPENDS += "python3-setuptools-scm-native" RDEPENDS:${PN} += " \ python3-logging \ diff --git a/meta-python/recipes-devtools/python/python3-trafaret-config_2.0.2.bb b/meta-python/recipes-devtools/python/python3-trafaret-config_2.0.2.bb index 5c5754740b..eee9ab88ba 100644 --- a/meta-python/recipes-devtools/python/python3-trafaret-config_2.0.2.bb +++ b/meta-python/recipes-devtools/python/python3-trafaret-config_2.0.2.bb @@ -8,8 +8,8 @@ SRC_URI[sha256sum] = "440b6b49e5e975f9a640a2519abb2feddd96eb2aeb1715f87f947a7a07 inherit pypi setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-trafaret \ - ${PYTHON_PN}-pyyaml \ + python3-trafaret \ + python3-pyyaml \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-trafaret_2.1.1.bb b/meta-python/recipes-devtools/python/python3-trafaret_2.1.1.bb index 97c56abde4..5b24206a27 100644 --- a/meta-python/recipes-devtools/python/python3-trafaret_2.1.1.bb +++ b/meta-python/recipes-devtools/python/python3-trafaret_2.1.1.bb @@ -8,9 +8,9 @@ SRC_URI[sha256sum] = "d9d00800318fbd343fdfb3353e947b2ebb5557159c844696c5ac24846f inherit pypi setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-urllib3 \ + python3-datetime \ + python3-numbers \ + python3-urllib3 \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-traitlets/run-ptest b/meta-python/recipes-devtools/python/python3-traitlets/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-traitlets/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-traitlets_5.14.3.bb b/meta-python/recipes-devtools/python/python3-traitlets_5.14.3.bb new file mode 100644 index 0000000000..5142e92a04 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-traitlets_5.14.3.bb @@ -0,0 +1,26 @@ +SUMMARY = "Traitlets Python config system" +HOMEPAGE = "https://github.com/ipython/traitlets" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=13bed0ee6f46a6f6dbf1f9f9572f250a" + +SRC_URI[sha256sum] = "9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7" + +inherit pypi python_hatchling ptest + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-argcomplete \ + bash \ + python3-mypy \ + python3-pytest \ + python3-pytest-mock \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} diff --git a/meta-python/recipes-devtools/python/python3-traitlets_5.3.0.bb b/meta-python/recipes-devtools/python/python3-traitlets_5.3.0.bb deleted file mode 100644 index 7c81867075..0000000000 --- a/meta-python/recipes-devtools/python/python3-traitlets_5.3.0.bb +++ /dev/null @@ -1,14 +0,0 @@ -SUMMARY = "Traitlets Python config system" -HOMEPAGE = "http://ipython.org" -AUTHOR = "IPython Development Team <ipython-dev@scipy.org>" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://COPYING.md;md5=9c125dfc5ff5364d40b5f56f02cd9de3" - -SRC_URI[sha256sum] = "0bb9f1f9f017aa8ec187d8b1b2a7a6626a2a1d877116baba52a129bfa124f8e2" - -inherit pypi python_hatchling - -RDEPENDS:${PN} = "\ - ${PYTHON_PN}-ipython-genutils \ - ${PYTHON_PN}-decorator \ -" diff --git a/meta-python/recipes-devtools/python/python3-transitions_0.8.11.bb b/meta-python/recipes-devtools/python/python3-transitions_0.9.0.bb index 14189424a2..980351bf14 100644 --- a/meta-python/recipes-devtools/python/python3-transitions_0.8.11.bb +++ b/meta-python/recipes-devtools/python/python3-transitions_0.9.0.bb @@ -1,9 +1,9 @@ SUMMARY = "A lightweight, object-oriented Python state machine implementation with many extensions." LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=baac7be1f4c17620df74188e23da6d47" +LIC_FILES_CHKSUM = "file://LICENSE;md5=de0a0876a688a4483bfafa764773ab39" inherit pypi setuptools3 -SRC_URI[sha256sum] = "7b20d32906ea4d60ee6f6c1f5dc9c9f178802425c5b155213eb0f25c277f04e4" +SRC_URI[sha256sum] = "2f54d11bdb225779d7e729011e93a9fb717668ce3dc65f8d4f5a5d7ba2f48e10" RDEPENDS:${PN} += "python3-six python3-logging" diff --git a/meta-python/recipes-devtools/python/python3-trustme/run-ptest b/meta-python/recipes-devtools/python/python3-trustme/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-trustme/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-trustme_1.1.0.bb b/meta-python/recipes-devtools/python/python3-trustme_1.1.0.bb new file mode 100644 index 0000000000..21161a0e0f --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-trustme_1.1.0.bb @@ -0,0 +1,34 @@ +DESCRIPTION = "A utility provides a fake certificate authority (CA)" +HOMEPAGE = "https://pypi.org/project/trustme" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=d5a7af1a4b73e57431e25d15a2da745a" + +SRC_URI[sha256sum] = "5375ad7fb427074bec956592e0d4ee2a4cf4da68934e1ba4bcf4217126bc45e6" + +inherit pypi setuptools3 ptest + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN} += " \ + python3-cryptography \ + python3-datetime \ + python3-idna \ + python3-io \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pyopenssl \ + python3-pyasn1-modules \ + python3-pytest \ + python3-service-identity \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ + cp -rf ${S}/setup.py ${D}${PTEST_PATH} +} diff --git a/meta-python/recipes-devtools/python/python3-twine_4.0.1.bb b/meta-python/recipes-devtools/python/python3-twine_5.0.0.bb index 0178dde738..cb45074811 100644 --- a/meta-python/recipes-devtools/python/python3-twine_4.0.1.bb +++ b/meta-python/recipes-devtools/python/python3-twine_5.0.0.bb @@ -3,16 +3,16 @@ HOMEPAGE = "https://twine.readthedocs.io/" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=a3d1106b253a8d50dd82a4202a045b4c" -SRC_URI[sha256sum] = "96b1cf12f7ae611a4a40b6ae8e9570215daff0611828f5fe1f37a16255ab24a0" +SRC_URI[sha256sum] = "89b0cc7d370a4b66421cc6102f269aa910fe0f1861c124f573cf2ddedbc10cf4" inherit pypi python_setuptools_build_meta DEPENDS += "\ - ${PYTHON_PN}-setuptools-scm-native \ + python3-setuptools-scm-native \ " RDEPENDS:${PN} += " \ - ${PYTHON_PN}-importlib-metadata \ + python3-importlib-metadata \ " BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-twisted_22.4.0.bb b/meta-python/recipes-devtools/python/python3-twisted_22.4.0.bb deleted file mode 100644 index 9429f8faab..0000000000 --- a/meta-python/recipes-devtools/python/python3-twisted_22.4.0.bb +++ /dev/null @@ -1,310 +0,0 @@ -DESCRIPTION = "Twisted is an event-driven networking framework written in Python and licensed under the LGPL. \ -Twisted supports TCP, UDP, SSL/TLS, multicast, Unix sockets, a large number of protocols \ -(including HTTP, NNTP, IMAP, SSH, IRC, FTP, and others), and much more." -HOMEPAGE = "http://www.twistedmatrix.com" - -#twisted/topfiles/NEWS:655: - Relicensed: Now under the MIT license, rather than LGPL. -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=0f8d67f84b6e178c92d471011b2245fc" - -SRC_URI[sha256sum] = "a047990f57dfae1e0bd2b7df2526d4f16dcdc843774dc108b78c52f2a5f13680" - -PYPI_PACKAGE = "Twisted" - -inherit pypi python_setuptools_build_meta - -do_install:append() { - # remove some useless files before packaging - find ${D} \( -name "*.bat" -o -name "*.c" -o -name "*.h" \) -exec rm -f {} \; -} - -PACKAGES += "\ - ${PN}-zsh \ - ${PN}-test \ - ${PN}-protocols \ - ${PN}-conch \ - ${PN}-mail \ - ${PN}-names \ - ${PN}-news \ - ${PN}-runner \ - ${PN}-web \ - ${PN}-words \ - ${PN}-flow \ - ${PN}-pair \ - ${PN}-core \ -" - -PACKAGES =+ "\ - ${PN}-bin \ -" - -DEPENDS += " \ - ${PYTHON_PN}-incremental-native \ -" - -RDEPENDS:${PN} = "\ - ${PN}-bin \ - ${PN}-core \ - ${PN}-conch \ - ${PN}-mail \ - ${PN}-names \ - ${PN}-pair \ - ${PN}-protocols \ - ${PN}-runner \ - ${PN}-web \ - ${PN}-words \ - ${PN}-zsh \ -" - -RDEPENDS:${PN}-core = "${PYTHON_PN}-appdirs \ - ${PYTHON_PN}-automat \ - ${PYTHON_PN}-constantly \ - ${PYTHON_PN}-core \ - ${PYTHON_PN}-debugger \ - ${PYTHON_PN}-hyperlink \ - ${PYTHON_PN}-incremental \ - ${PYTHON_PN}-pyhamcrest \ - ${PYTHON_PN}-pyserial \ - ${PYTHON_PN}-unixadmin \ - ${PYTHON_PN}-zopeinterface \ -" -RDEPENDS:${PN}-test = "${PN}" -RDEPENDS:${PN}-conch = "${PN}-core ${PN}-protocols ${PYTHON_PN}-bcrypt ${PYTHON_PN}-cryptography ${PYTHON_PN}-pyasn1 ${PYTHON_PN}-pickle" -RDEPENDS:${PN}-mail = "${PN}-core ${PN}-protocols" -RDEPENDS:${PN}-names = "${PN}-core" -RDEPENDS:${PN}-news = "${PN}-core ${PN}-protocols" -RDEPENDS:${PN}-runner = "${PN}-core ${PN}-protocols" -RDEPENDS:${PN}-web += "${PN}-core ${PN}-protocols" -RDEPENDS:${PN}-words += "${PN}-core" -RDEPENDS:${PN}-flow += "${PN}-core" -RDEPENDS:${PN}-pair += "${PN}-core" - -FILES:${PN} = "${PYTHON_SITEPACKAGES_DIR}/${PYPI_PACKAGE}-${PV}.dist-info/*" - -FILES:${PN}-test = " \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/test \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/*/test \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/protocols/haproxy/test/ \ -" - -FILES:${PN}-protocols = " \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/protocols/*.py* \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/protocols/gps/ \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/protocols/mice/ \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/protocols/haproxy \ -" - -FILES:${PN}-zsh = " \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/python/zsh \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/python/zshcomp.* \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/python/twisted-completion.zsh \ -" - -FILES:${PN}-conch = " \ - ${bindir}/ckeygen \ - ${bindir}/tkconch \ - ${bindir}/conch \ - ${bindir}/conchftp \ - ${bindir}/cftp \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_conch.py* \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/conch \ -" - -FILES:${PN}-core = " \ -${bindir}/manhole \ -${bindir}/mktap \ -${bindir}/twistd \ -${bindir}/tap2deb \ -${bindir}/tap2rpm \ -${bindir}/tapconvert \ -${bindir}/tkmktap \ -${bindir}/trial \ -${bindir}/easy_install* \ -${bindir}/pyhtmlizer \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/*.so \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/*.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__init__.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/notestplugin.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/testplugin.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_ftp.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_inet.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_manhole.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_portforward.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_socks.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_telnet.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_trial.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/dropin.cache \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/application \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/cred \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/enterprise \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/internet \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/manhole \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/manhole \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/persisted \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/protocols\ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python\ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/timeoutqueue.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/filepath.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/dxprofile.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/plugin.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/htmlizer.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/__init__.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/dispatch.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/hook.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/threadpool.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/otp.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/usage.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/roots.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/versions.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/urlpath.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/util.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/components.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/logfile.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/runtime.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/reflect.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/context.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/threadable.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/rebuild.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/failure.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/lockfile.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/formmethod.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/finalize.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/win32.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/dist.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/shortcut.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/zipstream.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/release.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/syslog.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/log.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/compat.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/zshcomp.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/procutils.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/text.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/_twisted_zsh_stub \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/scripts/ \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/spread/ \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/tap/ \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/trial/ \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/__init__.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/_version.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/copyright.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/im.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/*.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/python/*.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/*.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/topfiles \ -${libdir}/${PYTHON_DIR}/site-packages/Twisted*egg-info \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/logger/ \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/_threads/ \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/positioning/ \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/py.typed \ -" - -FILES:${PN}-mail = " \ -${bindir}/mailmail \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_mail.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/mail \ -" - -FILES:${PN}-names = " \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_names.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/names \ -" - -FILES:${PN}-news = " \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_news.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/news \ -" - -FILES:${PN}-runner = " \ -${libdir}/site-packages/twisted/runner/portmap.so \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/runner\ -" - -FILES:${PN}-web = " \ -${bindir}/websetroot \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_web.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/web\ -" - -FILES:${PN}-words = " \ -${bindir}/im \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_words.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/words\ -" - -FILES:${PN}-flow = " \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_flow.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/flow \" - -FILES:${PN}-pair = " \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/twisted_pair.py* \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/pair \ -" - -FILES:${PN}-doc += " \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/python/_pydoctortemplates/ \ -" - -FILES:${PN}-core:append = " \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/__pycache__ \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/python/__pycache__/*pyc \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/__init__*.pyc \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/notestplugin*.pyc \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/testplugin*.pyc \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_ftp*.pyc \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_inet*.pyc \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_manhole*.pyc \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_portforward*.pyc \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_socks*.pyc \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_telnet*.pyc \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_trial*.pyc \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_core*.pyc \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_qtstub*.pyc \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_reactors*.pyc \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/cred*.pyc \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/dropin*.cache \ -" - -FILES:${PN}-names:append = " \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_names*.pyc \ -" - -FILES:${PN}-news:append = " \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_news*.pyc \ -" - -FILES:${PN}-protocols:append = " \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/protocols/__pycache__/*pyc \ -" - -FILES:${PN}-conch:append = " \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_conch*.pyc \ -" - -FILES:${PN}-lore:append = " \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_lore*.pyc \ -" -FILES:${PN}-mail:append = " \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_mail*.pyc \ -" - -FILES:${PN}-web:append = " \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_web*.pyc \ -" - -FILES:${PN}-words:append = " \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_words*.pyc \ -" - -FILES:${PN}-flow:append = " \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_flow*.pyc \ -" - -FILES:${PN}-pair:append = " \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_pair*.pyc \ -" - -FILES:${PN}-runner:append = " \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_runner*.pyc \ -" diff --git a/meta-python/recipes-devtools/python/python3-twisted_24.3.0.bb b/meta-python/recipes-devtools/python/python3-twisted_24.3.0.bb new file mode 100644 index 0000000000..e5223ccd65 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-twisted_24.3.0.bb @@ -0,0 +1,194 @@ +DESCRIPTION = "Twisted is an event-driven networking framework written in Python and licensed under the LGPL. \ +Twisted supports TCP, UDP, SSL/TLS, multicast, Unix sockets, a large number of protocols \ +(including HTTP, NNTP, IMAP, SSH, IRC, FTP, and others), and much more." +HOMEPAGE = "https://twisted.org" + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=c1c5d2c2493b848f83864bdedd67bbf5" + +SRC_URI[sha256sum] = "6b38b6ece7296b5e122c9eb17da2eeab3d98a198f50ca9efd00fb03e5b4fd4ae" + +inherit pypi python_hatchling + +do_install:append() { + # remove some useless files before packaging + find ${D} \( -name "*.bat" -o -name "*.c" -o -name "*.h" \) -exec rm -f {} \; +} + +PACKAGES += "\ + ${PN}-zsh \ + ${PN}-test \ + ${PN}-protocols \ + ${PN}-conch \ + ${PN}-mail \ + ${PN}-names \ + ${PN}-news \ + ${PN}-runner \ + ${PN}-web \ + ${PN}-words \ + ${PN}-flow \ + ${PN}-pair \ + ${PN}-core \ +" + +DEPENDS += " \ + python3-hatch-fancy-pypi-readme-native \ + python3-incremental-native \ +" + +RDEPENDS:${PN} = "\ + ${PN}-core \ + ${PN}-conch \ + ${PN}-mail \ + ${PN}-names \ + ${PN}-pair \ + ${PN}-protocols \ + ${PN}-runner \ + ${PN}-web \ + ${PN}-words \ + ${PN}-zsh \ +" + +RDEPENDS:${PN}-core = "python3-appdirs \ + python3-asyncio \ + python3-automat \ + python3-constantly \ + python3-core \ + python3-debugger \ + python3-hyperlink \ + python3-incremental \ + python3-pyserial \ + python3-typing-extensions \ + python3-unixadmin \ + python3-zopeinterface \ +" +RDEPENDS:${PN}-test = "${PN} python3-pyhamcrest" +RDEPENDS:${PN}-conch = "${PN}-core ${PN}-protocols python3-bcrypt python3-cryptography python3-pickle" +RDEPENDS:${PN}-mail = "${PN}-core ${PN}-protocols" +RDEPENDS:${PN}-names = "${PN}-core" +RDEPENDS:${PN}-news = "${PN}-core ${PN}-protocols" +RDEPENDS:${PN}-runner = "${PN}-core ${PN}-protocols" +RDEPENDS:${PN}-web += "${PN}-core ${PN}-protocols" +RDEPENDS:${PN}-words += "${PN}-core" +RDEPENDS:${PN}-flow += "${PN}-core" +RDEPENDS:${PN}-pair += "${PN}-core" + +FILES:${PN}-test = " \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/test \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/*/test \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/protocols/haproxy/test/ \ +" + +FILES:${PN}-protocols = " \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/protocols/*.py* \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/protocols/haproxy \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/protocols/__pycache__/*pyc \ +" + +FILES:${PN}-zsh = " \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/python/twisted-completion.zsh \ +" + +FILES:${PN}-conch = " \ + ${bindir}/ckeygen \ + ${bindir}/tkconch \ + ${bindir}/conch \ + ${bindir}/cftp \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_conch.py* \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_conch*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/conch \ +" + +FILES:${PN}-core = " \ + ${bindir}/twist \ + ${bindir}/twistd \ + ${bindir}/trial \ + ${bindir}/pyhtmlizer \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/*.py* \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/application \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/cred \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/enterprise \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/internet \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/persisted \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/protocols \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/scripts \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/spread \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/tap \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/trial \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/*.py* \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/python/*.py* \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/*.py* \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/logger \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/_threads \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/positioning \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/py.typed \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/__pycache__/*pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/python/__pycache__/*pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/__init__*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/cred_anonymous*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/cred_file*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/cred_memory*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/cred_sshkeys*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/cred_unix*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_core*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_ftp*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_inet*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_portforward*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_reactors*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_socks*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_trial*.pyc \ +" + +FILES:${PN}-mail = " \ + ${bindir}/mailmail \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_mail.py* \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_mail*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/mail \ +" + +FILES:${PN}-names = " \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_names.py* \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_names*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/names \ +" + +FILES:${PN}-news = " \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_news.py* \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_news*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/news \ +" + +FILES:${PN}-runner = " \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_runner.py* \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_runner*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/runner \ +" + +FILES:${PN}-web = " \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_web.py* \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_web*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/web \ +" + +FILES:${PN}-words = " \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_words.py* \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_words*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/words \ +" + +FILES:${PN}-flow = " \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_flow.py* \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_flow*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/flow \ +" + +FILES:${PN}-pair = " \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_pair.py* \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_pair*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/pair \ +" + +FILES:${PN}-doc += " \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/python/_pydoctortemplates \ +" + diff --git a/meta-python/recipes-devtools/python/python3-twitter_4.14.0.bb b/meta-python/recipes-devtools/python/python3-twitter_4.14.0.bb new file mode 100644 index 0000000000..23ea996258 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-twitter_4.14.0.bb @@ -0,0 +1,19 @@ +SUMMARY = "Twitter for Python" +DESCRIPTION = "Python module to support twitter API" + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=9;endline=9;md5=8227180126797a0148f94f483f3e1489" + +SRC_URI[sha256sum] = "1f9f1707d6972de6cff6c5fd90dfe6a449cd2e0d70bd40043ffab01e07a06c8c" + +PYPI_PACKAGE = "tweepy" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "\ + python3-pip \ + python3-pysocks \ + python3-requests \ + python3-requests-oauthlib \ + python3-six \ +" diff --git a/meta-python/recipes-devtools/python/python3-twitter_4.8.0.bb b/meta-python/recipes-devtools/python/python3-twitter_4.8.0.bb deleted file mode 100644 index 247b4e5840..0000000000 --- a/meta-python/recipes-devtools/python/python3-twitter_4.8.0.bb +++ /dev/null @@ -1,18 +0,0 @@ -SUMMARY = "Twitter for Python" -DESCRIPTION = "Python module to support twitter API" - -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=8227180126797a0148f94f483f3e1489" - -SRC_URI[sha256sum] = "8ba5774ac1663b09e5fce1b030daf076f2c9b3ddbf2e7e7ea0bae762e3b1fe3e" - -PYPI_PACKAGE = "tweepy" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-pip \ - ${PYTHON_PN}-pysocks \ - ${PYTHON_PN}-requests \ - ${PYTHON_PN}-six \ -" diff --git a/meta-python/recipes-devtools/python/python3-twofish_0.3.0.bb b/meta-python/recipes-devtools/python/python3-twofish_0.3.0.bb index f45772d507..a8ad4bbdfb 100644 --- a/meta-python/recipes-devtools/python/python3-twofish_0.3.0.bb +++ b/meta-python/recipes-devtools/python/python3-twofish_0.3.0.bb @@ -15,3 +15,5 @@ SRC_URI[sha256sum] = "b09d8bb50d33b23ff34cafb1f9209f858f752935c6a5c901efb92a41ac inherit pypi setuptools3 BBCLASSEXTEND = "native nativesdk" + +RDEPENDS:${PN} += "python3-ctypes" diff --git a/meta-python/recipes-devtools/python/python3-txaio_22.2.1.bb b/meta-python/recipes-devtools/python/python3-txaio_22.2.1.bb deleted file mode 100644 index e2102695ec..0000000000 --- a/meta-python/recipes-devtools/python/python3-txaio_22.2.1.bb +++ /dev/null @@ -1,14 +0,0 @@ -DESCRIPTION = "Compatibility API between asyncio/Twisted/Trollius" - -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=97c0bda20ad1d845c6369c0e47a1cd98" - -SRC_URI[sha256sum] = "2e4582b70f04b2345908254684a984206c0d9b50e3074a24a4c55aba21d24d01" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-twisted \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-txaio_23.1.1.bb b/meta-python/recipes-devtools/python/python3-txaio_23.1.1.bb new file mode 100644 index 0000000000..b14e353818 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-txaio_23.1.1.bb @@ -0,0 +1,12 @@ +DESCRIPTION = "Compatibility API between asyncio/Twisted/Trollius" + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3e2c2c2cc2915edc5321b0e6b1d3f5f8" + +SRC_URI[sha256sum] = "f9a9216e976e5e3246dfd112ad7ad55ca915606b60b84a757ac769bd404ff704" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-twisted \ +" diff --git a/meta-python/recipes-devtools/python/python3-txdbus_1.1.2.bb b/meta-python/recipes-devtools/python/python3-txdbus_1.1.2.bb index a117f17202..1232f5e99f 100644 --- a/meta-python/recipes-devtools/python/python3-txdbus_1.1.2.bb +++ b/meta-python/recipes-devtools/python/python3-txdbus_1.1.2.bb @@ -1,5 +1,4 @@ SUMMARY = "A native Python implementation of the DBus protocol for Twisted applications." -AUTHOR = "Tom Cocagne" HOMEPAGE = "https://pypi.org/project/txdbus/" SECTION = "devel/python" LICENSE = "MIT" @@ -10,4 +9,4 @@ SRC_URI[sha256sum] = "8375a5fb68a12054f0def91af800c821fb2232949337756ed975f88d8e inherit pypi setuptools3 -RDEPENDS:${PN} += "python3-six python3-twisted" +RDEPENDS:${PN} += "python3-twisted-core" diff --git a/meta-python/recipes-devtools/python/python3-typed-ast_1.5.2.bb b/meta-python/recipes-devtools/python/python3-typed-ast_1.5.2.bb deleted file mode 100644 index 55cd78ce8f..0000000000 --- a/meta-python/recipes-devtools/python/python3-typed-ast_1.5.2.bb +++ /dev/null @@ -1,12 +0,0 @@ -SUMMARY = "Modified fork of CPython's ast module that parses `# type:` comments" -HOMEPAGE = "https://github.com/python/typed_ast" -LICENSE = "Apache-2.0 & MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=97f1494e93daf66a5df47118407a4c4f" - -PYPI_PACKAGE = "typed_ast" - -inherit pypi setuptools3 - -SRC_URI[sha256sum] = "525a2d4088e70a9f75b08b3f87a51acc9cde640e19cc523c7e41aa355564ae27" - -BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-typeguard/run-ptest b/meta-python/recipes-devtools/python/python3-typeguard/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-typeguard/run-ptest +++ b/meta-python/recipes-devtools/python/python3-typeguard/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-typeguard_2.13.3.bb b/meta-python/recipes-devtools/python/python3-typeguard_4.2.1.bb index e9fce61452..e0e84df28a 100644 --- a/meta-python/recipes-devtools/python/python3-typeguard_2.13.3.bb +++ b/meta-python/recipes-devtools/python/python3-typeguard_4.2.1.bb @@ -3,7 +3,7 @@ HOMEPAGE = "https://pypi.org/project/typeguard/" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=f0e423eea5c91e7aa21bdb70184b3e53" -SRC_URI[sha256sum] = "00edaa8da3a133674796cf5ea87d9f4b4c367d77476e185e80251cc13dfbb8c4" +SRC_URI[sha256sum] = "c556a1b95948230510070ca53fa0341fb0964611bd05d598d87fb52115d65fee" inherit pypi python_setuptools_build_meta ptest @@ -11,10 +11,19 @@ SRC_URI += " \ file://run-ptest \ " +RDEPENDS:${PN} += " \ + python3-core \ + python3-compression \ + python3-unittest \ + python3-typing-extensions \ +" + RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-typing-extensions \ - ${PYTHON_PN}-unixadmin \ + python3-pytest \ + python3-typing-extensions \ + python3-unittest-automake-output \ + python3-unixadmin \ + python3-mypy \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-types-psutil_5.9.5.20240316.bb b/meta-python/recipes-devtools/python/python3-types-psutil_5.9.5.20240316.bb new file mode 100644 index 0000000000..c6f15696e9 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-types-psutil_5.9.5.20240316.bb @@ -0,0 +1,10 @@ +SUMMARY = "Typing stubs for psutil" +HOMEPAGE = "https://github.com/python/typeshed" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=6;endline=6;md5=ef4dc1e740f5c928f1608a4a9c7b578e" + +inherit pypi setuptools3 + +SRC_URI[sha256sum] = "5636f5714bb930c64bb34c4d47a59dc92f9d610b778b5364a31daa5584944848" + +BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-types-python-dateutil_2.9.0.20240316.bb b/meta-python/recipes-devtools/python/python3-types-python-dateutil_2.9.0.20240316.bb new file mode 100644 index 0000000000..4b786066f7 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-types-python-dateutil_2.9.0.20240316.bb @@ -0,0 +1,8 @@ +SUMMARY = "Typing stubs for python-dateutil" +HOMEPAGE = "https://github.com/python/typeshed" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=6;endline=6;md5=ef4dc1e740f5c928f1608a4a9c7b578e" + +SRC_URI[sha256sum] = "5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202" + +inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-types-setuptools_69.0.0.20240125.bb b/meta-python/recipes-devtools/python/python3-types-setuptools_69.0.0.20240125.bb new file mode 100644 index 0000000000..7e15dcb13a --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-types-setuptools_69.0.0.20240125.bb @@ -0,0 +1,10 @@ +SUMMARY = "Typing stubs for setuptools" +HOMEPAGE = "https://github.com/python/typeshed" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=6;endline=6;md5=ef4dc1e740f5c928f1608a4a9c7b578e" + +inherit pypi setuptools3 + +SRC_URI[sha256sum] = "22ad498cb585b22ce8c97ada1fccdf294a2e0dd7dc984a28535a84ea82f45b3f" + +BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-tzlocal_4.2.bb b/meta-python/recipes-devtools/python/python3-tzlocal_5.2.bb index b9307f100f..da58964f2c 100644 --- a/meta-python/recipes-devtools/python/python3-tzlocal_4.2.bb +++ b/meta-python/recipes-devtools/python/python3-tzlocal_5.2.bb @@ -3,11 +3,12 @@ HOMEPAGE = "https://pypi.org/project/tzlocal/" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=57e0bd61643d81d05683cdce65b11d10" -SRC_URI[sha256sum] = "ee5842fa3a795f023514ac2d801c4a81d1743bbe642e3940143326b3a00addd7" +SRC_URI[sha256sum] = "8d399205578f1a9342816409cc1e46a93ebd5755e39ea2d85334bea911bf0e6e" inherit pypi python_setuptools_build_meta -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-pytz-deprecation-shim \ - ${PYTHON_PN}-datetime \ +RDEPENDS:${PN} += " \ + python3-datetime \ + python3-logging \ + python3-zoneinfo \ " diff --git a/meta-python/recipes-devtools/python/python3-u-msgpack-python/run-ptest b/meta-python/recipes-devtools/python/python3-u-msgpack-python/run-ptest index 7110f6bc40..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-u-msgpack-python/run-ptest +++ b/meta-python/recipes-devtools/python/python3-u-msgpack-python/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO test_umsgpack.py| sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-u-msgpack-python_2.7.1.bb b/meta-python/recipes-devtools/python/python3-u-msgpack-python_2.8.0.bb index 3f26ba011c..6cde243fe8 100644 --- a/meta-python/recipes-devtools/python/python3-u-msgpack-python_2.7.1.bb +++ b/meta-python/recipes-devtools/python/python3-u-msgpack-python_2.8.0.bb @@ -1,10 +1,9 @@ DESCRIPTION = "A portable, lightweight MessagePack serializer and deserializer written in pure Python." LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=9eb4691bcb66360acee473a8cf75f594" +LIC_FILES_CHKSUM = "file://LICENSE;md5=17df11353545c53a2df0ce7655859306" -SRC_URI[md5sum] = "8691cea6bc7b44bce6e2115260a54323" -SRC_URI[sha256sum] = "b7e7d433cab77171a4c752875d91836f3040306bab5063fb6dbe11f64ea69551" +SRC_URI[sha256sum] = "b801a83d6ed75e6df41e44518b4f2a9c221dc2da4bcd5380e3a0feda520bc61a" inherit pypi setuptools3 ptest @@ -13,7 +12,8 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { @@ -21,7 +21,7 @@ do_install_ptest() { } RDEPENDS:${PN} += " \ - ${PYTHON_PN}-datetime \ + python3-datetime \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-uefi-firmware_1.11.bb b/meta-python/recipes-devtools/python/python3-uefi-firmware_1.11.bb new file mode 100644 index 0000000000..67e668ac69 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-uefi-firmware_1.11.bb @@ -0,0 +1,21 @@ +SUMMARY = "Various data structures and parsing tools for UEFI firmware." +DESCRIPTION = "This package contains Python UEFI firmware parser tool. The \ +UEFI firmware parser is a simple module and set of scripts for parsing, \ +extracting, and recreating UEFI firmware volumes. This includes parsing \ +modules for BIOS, OptionROM, Intel ME and other formats too." +HOMEPAGE = "https://github.com/theopolis/uefi-firmware-parser" +LICENSE = "BSD-2-Clause & BSD-3-Clause" +LIC_FILES_CHKSUM = "file://setup.py;md5=5a59066a8676f17262ef7e691f8ef253" + +SRC_URI = "git://github.com/theopolis/uefi-firmware-parser;protocol=https;branch=master" + +SRCREV = "f289219b99eb525cbc58e4dc2b07df3811f92ef7" + +S = "${WORKDIR}/git" + +inherit setuptools3 + +RDEPENDS:${PN} += " \ + python3-ctypes \ + python3-logging \ +" diff --git a/meta-python/recipes-devtools/python/python3-uinput/0001-Deal-with-64bit-time_t-default-on-32bit-architecture.patch b/meta-python/recipes-devtools/python/python3-uinput/0001-Deal-with-64bit-time_t-default-on-32bit-architecture.patch deleted file mode 100644 index 4095fc9095..0000000000 --- a/meta-python/recipes-devtools/python/python3-uinput/0001-Deal-with-64bit-time_t-default-on-32bit-architecture.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 69adf9e32f5b11e15c0cbe17f9331c77fed65bf8 Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Sat, 28 May 2022 15:50:50 -0700 -Subject: [PATCH] Deal with 64bit time_t default on 32bit architectures - -Deal with Y2K38 concerns related to Linux input events on more recent -kernels and libcs on 32-bit systems - -Upstream-Status: Pending -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- - libsuinput/src/suinput.c | 11 ++++++++++- - 1 file changed, 10 insertions(+), 1 deletion(-) - -diff --git a/libsuinput/src/suinput.c b/libsuinput/src/suinput.c -index 8d5fb71..13ff16a 100644 ---- a/libsuinput/src/suinput.c -+++ b/libsuinput/src/suinput.c -@@ -45,11 +45,20 @@ int suinput_emit(int uinput_fd, uint16_t ev_type, uint16_t ev_code, - struct input_event event; - - memset(&event, 0, sizeof(event)); -- gettimeofday(&event.time, 0); - event.type = ev_type; - event.code = ev_code; - event.value = ev_value; - -+/* attempt to deal with 64-bit time keeping on recent 32-bit systems */ -+#if (__BITS_PER_LONG != 32 || !defined(__USE_TIME_BITS64)) -+ gettimeofday(&event.time, 0); -+#else -+ struct timeval now; -+ memset(&now, 0, sizeof(now)); -+ gettimeofday(&now, 0); -+ event.input_event_sec = now.tv_sec; -+ event.input_event_usec = now.tv_usec; -+#endif - return suinput_write_event(uinput_fd, &event); - } - --- -2.36.1 - diff --git a/meta-python/recipes-devtools/python/python3-uinput/0001-setup-use-setuptools-instead-of-distutils.patch b/meta-python/recipes-devtools/python/python3-uinput/0001-setup-use-setuptools-instead-of-distutils.patch deleted file mode 100644 index 54a3c18676..0000000000 --- a/meta-python/recipes-devtools/python/python3-uinput/0001-setup-use-setuptools-instead-of-distutils.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 7a4dde83a9584adb42c7f810d882b1fbf5767e2c Mon Sep 17 00:00:00 2001 -From: Bartosz Golaszewski <brgl@bgdev.pl> -Date: Tue, 24 May 2022 21:43:35 +0200 -Subject: [PATCH] setup: use setuptools instead of distutils - -The latter is deprecated, use setuptools instead. - -Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl> ---- - setup.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/setup.py b/setup.py -index 3fa3343..4900b8b 100644 ---- a/setup.py -+++ b/setup.py -@@ -3,7 +3,7 @@ - import errno - import subprocess - --from distutils.core import setup, Extension -+from setuptools import setup, Extension - - libudev_so = "libudev.so.1" - --- -2.34.1 - diff --git a/meta-python/recipes-devtools/python/python3-uinput_0.11.2.bb b/meta-python/recipes-devtools/python/python3-uinput_0.11.2.bb deleted file mode 100644 index ef466539bd..0000000000 --- a/meta-python/recipes-devtools/python/python3-uinput_0.11.2.bb +++ /dev/null @@ -1,20 +0,0 @@ -SUMMARY = "Python interface to Linux uinput kernel module." -HOMEPAGE = "https://pypi.org/project/python-uinput/" -LICENSE = "GPL-3.0-only" -LIC_FILES_CHKSUM = "file://COPYING;md5=f27defe1e96c2e1ecd4e0c9be8967949" - -SRC_URI += "file://0001-setup-use-setuptools-instead-of-distutils.patch \ - file://0001-Deal-with-64bit-time_t-default-on-32bit-architecture.patch \ -" -SRC_URI[sha256sum] = "99392b676c77b5795b86b7d75274db33fe754fd1e06fb3d58b167c797dc47f0c" - -PYPI_PACKAGE = "python-uinput" - -inherit pypi setuptools3 - -DEPENDS += "udev" -RDEPENDS:${PN} += " \ - python3-ctypes \ - python3-distutils \ -" -RRECOMMENDS:${PN} += "kernel-module-uinput" diff --git a/meta-python/recipes-devtools/python/python3-ujson/0001-setup.py-Do-not-strip-debugging-symbols.patch b/meta-python/recipes-devtools/python/python3-ujson/0001-setup.py-Do-not-strip-debugging-symbols.patch index 42cd99a895..8ba8ada556 100644 --- a/meta-python/recipes-devtools/python/python3-ujson/0001-setup.py-Do-not-strip-debugging-symbols.patch +++ b/meta-python/recipes-devtools/python/python3-ujson/0001-setup.py-Do-not-strip-debugging-symbols.patch @@ -8,6 +8,8 @@ bitbake build errors related to already-stripped. Signed-off-by: Leon Anavi <leon.anavi@konsulko.com> --- +Upstream-Status: Pending + setup.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/meta-python/recipes-devtools/python/python3-ujson/run-ptest b/meta-python/recipes-devtools/python/python3-ujson/run-ptest index b1539453a6..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-ujson/run-ptest +++ b/meta-python/recipes-devtools/python/python3-ujson/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -python3 tests/test_ujson.py +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-ujson_5.4.0.bb b/meta-python/recipes-devtools/python/python3-ujson_5.9.0.bb index 15cf80e36f..b5f6be9f27 100644 --- a/meta-python/recipes-devtools/python/python3-ujson_5.4.0.bb +++ b/meta-python/recipes-devtools/python/python3-ujson_5.9.0.bb @@ -4,7 +4,7 @@ DESCRIPTION = "UltraJSON is an ultra fast JSON encoder and decoder written in pu LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e0039a83d8a99726b5418f0b03302d0a" -SRC_URI[sha256sum] = "6b953e09441e307504130755e5bd6b15850178d591f66292bba4608c4f7f9b00" +SRC_URI[sha256sum] = "89cc92e73d5501b8a7f48575eeb14ad27156ad092c2e9fc7e3cf949f07e75532" inherit pypi ptest setuptools3 @@ -13,17 +13,18 @@ SRC_URI += " \ file://0001-setup.py-Do-not-strip-debugging-symbols.patch \ " -DEPENDS += "${PYTHON_PN}-setuptools-scm-native" +DEPENDS += "python3-setuptools-scm-native" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-numbers \ + python3-datetime \ + python3-numbers \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-pytz \ + python3-json \ + python3-pytest \ + python3-pytz \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-unidiff/run-ptest b/meta-python/recipes-devtools/python/python3-unidiff/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-unidiff/run-ptest +++ b/meta-python/recipes-devtools/python/python3-unidiff/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-unidiff_0.7.4.bb b/meta-python/recipes-devtools/python/python3-unidiff_0.7.5.bb index 3f6d2850fd..d77252beac 100644 --- a/meta-python/recipes-devtools/python/python3-unidiff_0.7.4.bb +++ b/meta-python/recipes-devtools/python/python3-unidiff_0.7.5.bb @@ -3,7 +3,7 @@ HOMEPAGE = "http://github.com/matiasb/python-unidiff" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=4c434b08ef42fea235bb019b5e5a97b3" -SRC_URI[sha256sum] = "2bbcbc986e1fb97f04b1d7b864aa6002ab02f4d8a996bf03aa6e5a81447d1fc5" +SRC_URI[sha256sum] = "2e5f0162052248946b9f0970a40e9e124236bf86c82b70821143a6fc1dea2574" inherit pypi setuptools3 ptest @@ -12,7 +12,8 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { @@ -21,6 +22,6 @@ do_install_ptest() { } RDEPENDS:${PN} += " \ - ${PYTHON_PN}-codecs \ - ${PYTHON_PN}-io \ + python3-codecs \ + python3-io \ " diff --git a/meta-python/recipes-devtools/python/python3-unoconv_0.9.0.bb b/meta-python/recipes-devtools/python/python3-unoconv_0.9.0.bb new file mode 100644 index 0000000000..8bfb8a6deb --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-unoconv_0.9.0.bb @@ -0,0 +1,23 @@ +SUMMARY = "Universal Office Converter - Office document conversion" +HOMEPAGE = "https://github.com/unoconv/unoconv" +LICENSE = "GPL-2.0-only" +SECTION = "devel/python" +LIC_FILES_CHKSUM = "file://COPYING;md5=94d55d512a9ba36caa9b7df079bae19f" + +SRC_URI[sha256sum] = "308ebfd98e67d898834876348b27caf41470cd853fbe2681cc7dacd8fd5e6031" + +inherit pypi setuptools3 + +PYPI_PACKAGE="unoconv" + +RDEPENDS:${PN} += "\ + python3-setuptools \ + python3-core \ + python3-shell \ +" + +do_install:append() { + sed -i -e 's:^#!/usr/bin/env python$:#!/usr/bin/env python3:' ${D}/usr/bin/unoconv +} + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-uritemplate/run-ptest b/meta-python/recipes-devtools/python/python3-uritemplate/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-uritemplate/run-ptest +++ b/meta-python/recipes-devtools/python/python3-uritemplate/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-uritemplate_4.1.1.bb b/meta-python/recipes-devtools/python/python3-uritemplate_4.1.1.bb index eaf8bda846..e741b6268d 100644 --- a/meta-python/recipes-devtools/python/python3-uritemplate_4.1.1.bb +++ b/meta-python/recipes-devtools/python/python3-uritemplate_4.1.1.bb @@ -2,7 +2,6 @@ # https://git.yoctoproject.org/cgit/cgit.cgi/meta-cloud-services/tree/meta-openstack/recipes-devtools/python/python3-uritemplate_3.0.0.bb?h=master SUMMARY = "Simple python library to deal with URI Templates." -AUTHOR = "Ian Cordasco" LICENSE = "Apache-2.0 | BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=0f6d769bdcfacac3c1a1ffa568937fe0" @@ -15,7 +14,8 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-uswid_0.4.7.bb b/meta-python/recipes-devtools/python/python3-uswid_0.4.7.bb new file mode 100644 index 0000000000..4499edb216 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-uswid_0.4.7.bb @@ -0,0 +1,19 @@ +SUMMARY = "A pure-python library for embedding CoSWID data" +HOMEPAGE = "https://github.com/hughsie/python-uswid" +SECTION = "devel/python" +LICENSE = "LGPL-2.1-or-later" +LIC_FILES_CHKSUM = "file://LICENSE;md5=40d2542b8c43a3ec2b7f5da31a697b88" + +SRC_URI[sha256sum] = "de15c2421bedaa5f54606558700c1f628f07d73da49ec69d1888214ac52c49e6" + +inherit setuptools3 python3native pypi + +DEPENDS += " python3-cbor2 python3-lxml python3-pefile" +RDEPENDS:${PN} += " \ + python3-cbor2 \ + python3-json \ + python3-lxml \ + python3-netclient \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-validators/run-ptest b/meta-python/recipes-devtools/python/python3-validators/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-validators/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-validators_0.28.0.bb b/meta-python/recipes-devtools/python/python3-validators_0.28.0.bb new file mode 100644 index 0000000000..36444c0bfc --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-validators_0.28.0.bb @@ -0,0 +1,30 @@ +SUMMARY = "Python Data Validation for Humans" +HOMEPAGE = "https://python-validators.github.io/validators" +LICENSE = "MIT" + +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=b3fb4b9e6db86c69a33d5e3ee013ab59" +SRC_URI[sha256sum] = "85bc82511f6ccd0800f4c15d8c0dc546c15e369640c5ea1f24349ba0b3b17815" + +inherit pypi python_setuptools_build_meta ptest + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} + +RDEPENDS:${PN} += " \ + python3-crypt \ + python3-datetime \ + python3-netclient \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-versioneer_0.29.bb b/meta-python/recipes-devtools/python/python3-versioneer_0.29.bb new file mode 100644 index 0000000000..bdfbfd1be1 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-versioneer_0.29.bb @@ -0,0 +1,18 @@ +SUMMARY = "Easy VCS-based management of project version strings" +HOMEPAGE = "https://github.com/python-versioneer/python-versioneer" +SECTION = "devel/python" + +LICENSE = "Unlicense" +LIC_FILES_CHKSUM = "file://LICENSE;md5=f4c62131f879a8445e16a7f265aea635" + +SRC_URI[sha256sum] = "5ab283b9857211d61b53318b7c792cf68e798e765ee17c27ade9f6c924235731" + +inherit pypi python_setuptools_build_meta + +RDEPENDS:${PN} += "\ + python3-json \ + python3-netclient \ + python3-tomllib \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-versiontools_1.9.1.bb b/meta-python/recipes-devtools/python/python3-versiontools_1.9.1.bb index ea40d5f6bb..02639b5900 100644 --- a/meta-python/recipes-devtools/python/python3-versiontools_1.9.1.bb +++ b/meta-python/recipes-devtools/python/python3-versiontools_1.9.1.bb @@ -8,3 +8,5 @@ SRC_URI[md5sum] = "602b7db8eea30dd29a1d451997adf251" SRC_URI[sha256sum] = "a969332887a18a9c98b0df0ea4d4ca75972f24ca94f06fb87d591377e83414f6" inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-setuptools" diff --git a/meta-python/recipes-devtools/python/python3-virtualenv_20.25.0.bb b/meta-python/recipes-devtools/python/python3-virtualenv_20.25.0.bb new file mode 100644 index 0000000000..1858fee25a --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-virtualenv_20.25.0.bb @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: MIT +# Copyright (C) 2023 iris-GmbH infrared & intelligent sensors + +SUMMARY = "A tool for creating isolated virtual python environments." +HOMEPAGE = "https://github.com/pypa/virtualenv" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=0ce089158cf60a8ab6abb452b6405538" + +SRC_URI[sha256sum] = "bf51c0d9c7dd63ea8e44086fa1e4fb1093a31e963b86959257378aef020e1f1b" + +BBCLASSEXTEND = "native nativesdk" +inherit pypi python_hatchling + +DEPENDS += "\ + python3-hatch-vcs-native \ +" + +RDEPENDS:${PN} += " \ + python3-distlib \ + python3-filelock \ + python3-platformdirs \ +" diff --git a/meta-python/recipes-devtools/python/python3-waitress_2.1.2.bb b/meta-python/recipes-devtools/python/python3-waitress_3.0.0.bb index 061586b5df..7470fc02a0 100644 --- a/meta-python/recipes-devtools/python/python3-waitress_2.1.2.bb +++ b/meta-python/recipes-devtools/python/python3-waitress_3.0.0.bb @@ -10,6 +10,6 @@ RDEPENDS:${PN} += " \ python3-logging \ " -SRC_URI[sha256sum] = "780a4082c5fbc0fde6a2fcfe5e26e6efc1e8f425730863c04085769781f51eba" +SRC_URI[sha256sum] = "005da479b04134cdd9dd602d1ee7c49d79de0537610d653674cc6cbde222b8a1" inherit python_setuptools_build_meta pypi diff --git a/meta-python/recipes-devtools/python/python3-wand_0.6.13.bb b/meta-python/recipes-devtools/python/python3-wand_0.6.13.bb new file mode 100644 index 0000000000..85e05ad97b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-wand_0.6.13.bb @@ -0,0 +1,15 @@ +SUMMARY = "Ctypes-based simple MagickWand API binding for Python" +HOMEPAGE = "https://docs.wand-py.org/" +LICENSE = "MIT" +SECTION = "devel/python" +LIC_FILES_CHKSUM = "file://LICENSE;md5=0bf19e5c00d047fee994ae332db3aab6" + +SRC_URI[sha256sum] = "f5013484eaf7a20eb22d1821aaefe60b50cc329722372b5f8565d46d4aaafcca" + +inherit pypi setuptools3 + +PYPI_PACKAGE="Wand" + +FILES:${PN}-doc += "${datadir}/README.rst" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-watchdog_2.1.9.bb b/meta-python/recipes-devtools/python/python3-watchdog_2.1.9.bb deleted file mode 100644 index 8c7c6dd476..0000000000 --- a/meta-python/recipes-devtools/python/python3-watchdog_2.1.9.bb +++ /dev/null @@ -1,18 +0,0 @@ -SUMMARY = "Filesystem events monitoring" -DEPENDS = "${PYTHON_PN}-argh" - -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57" - -SRC_URI[sha256sum] = "43ce20ebb36a51f21fa376f76d1d4692452b2527ccd601950d69ed36b9e21609" - -inherit pypi setuptools3 - -RDEPENDS:${PN} = " \ - ${PYTHON_PN}-argh \ - ${PYTHON_PN}-pathtools3 \ - ${PYTHON_PN}-pyyaml \ - ${PYTHON_PN}-requests \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-watchdog_4.0.0.bb b/meta-python/recipes-devtools/python/python3-watchdog_4.0.0.bb new file mode 100644 index 0000000000..9e36264d62 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-watchdog_4.0.0.bb @@ -0,0 +1,18 @@ +SUMMARY = "Filesystem events monitoring" +DEPENDS = "python3-argh" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57" + +SRC_URI[sha256sum] = "e3e7065cbdabe6183ab82199d7a4f6b3ba0a438c5a512a68559846ccb76a78ec" + +inherit pypi setuptools3 + +RDEPENDS:${PN} = " \ + python3-argh \ + python3-pathtools3 \ + python3-pyyaml \ + python3-requests \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-watchdogdev_1.0.0.bb b/meta-python/recipes-devtools/python/python3-watchdogdev_1.0.0.bb new file mode 100644 index 0000000000..3acb366c1d --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-watchdogdev_1.0.0.bb @@ -0,0 +1,9 @@ +SUMMARY = "Linux watchdog device API for Python." +HOMEPAGE = "https://github.com/timka/watchdogdev" +SECTION = "devel/python" +LICENSE = "Python-2.0" +LIC_FILES_CHKSUM = "file://setup.py;beginline=47;endline=47;md5=ad880087bee2eb64e368954eb7b99bfd" + +inherit pypi setuptools3 + +SRC_URI[sha256sum] = "776ba57a07aef0084466493f40ce20814a29f8914a10ef8177317d02559fd017" diff --git a/meta-python/recipes-devtools/python/python3-web3_5.30.0.bb b/meta-python/recipes-devtools/python/python3-web3_5.30.0.bb deleted file mode 100644 index a35c05e065..0000000000 --- a/meta-python/recipes-devtools/python/python3-web3_5.30.0.bb +++ /dev/null @@ -1,20 +0,0 @@ -SUMMARY = "A Python library for interacting with Ethereum." -HOMEPAGE = "https://github.com/ethereum/web3.py" -SECTION = "devel/python" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=1dc2732bdc5e50382737979791cbb3b7" - -SRC_URI[sha256sum] = "e141d90408fd9fe5156e2ef22884a160bef8bfd55e6cecd51181af3162ea84dd" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += " \ - python3-aiohttp \ - python3-distutils \ - python3-eth-account \ - python3-idna \ - python3-lru-dict \ - python3-requests \ - python3-setuptools \ - python3-websockets \ -" diff --git a/meta-python/recipes-devtools/python/python3-web3_6.17.0.bb b/meta-python/recipes-devtools/python/python3-web3_6.17.0.bb new file mode 100644 index 0000000000..f1be4dcf4d --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-web3_6.17.0.bb @@ -0,0 +1,26 @@ +SUMMARY = "A Python library for interacting with Ethereum." +HOMEPAGE = "https://github.com/ethereum/web3.py" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=373fede350846fdffd23648fba504635" + +SRC_URI[sha256sum] = "1b535272a40da3d8d2b120856edb53b84b0c08bcc8fe1a5bbd5f816fd72f4ec6" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-aiohttp \ + python3-eth-abi \ + python3-eth-account \ + python3-eth-hash \ + python3-eth-typing \ + python3-eth-utils \ + python3-hexbytes \ + python3-jsonschema \ + python3-protobuf \ + python3-pydantic \ + python3-requests \ + python3-typing-extensions \ + python3-websockets \ + python3-pyunormalize \ +" diff --git a/meta-python/recipes-devtools/python/python3-webargs_8.4.0.bb b/meta-python/recipes-devtools/python/python3-webargs_8.4.0.bb new file mode 100644 index 0000000000..78af013320 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-webargs_8.4.0.bb @@ -0,0 +1,17 @@ +SUMMARY = "Declarative parsing and validation of HTTP request objects, with built-in support for popular web frameworks." +HOMEPAGE = "https://github.com/marshmallow-code/webargs" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=dfbd4ae0074716275fc229c775723e8f" + +inherit pypi setuptools3 + +SRC_URI[sha256sum] = "ea99368214a4ce613924be99d71db58c269631e95eff4fa09b7354e52dc006a5" + +RDEPENDS:${PN} += "\ + python3-marshmallow \ + python3-packaging \ + python3-core \ + python3-json \ + python3-asyncio \ + python3-logging \ +" diff --git a/meta-python/recipes-devtools/python/python3-webencodings_0.5.1.bb b/meta-python/recipes-devtools/python/python3-webencodings_0.5.1.bb index ab33ce66e8..cedc790815 100644 --- a/meta-python/recipes-devtools/python/python3-webencodings_0.5.1.bb +++ b/meta-python/recipes-devtools/python/python3-webencodings_0.5.1.bb @@ -8,8 +8,8 @@ SRC_URI[sha256sum] = "b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab1674858 inherit pypi setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-codecs \ - ${PYTHON_PN}-json \ + python3-codecs \ + python3-json \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-websocket-client_1.3.3.bb b/meta-python/recipes-devtools/python/python3-websocket-client_1.7.0.bb index 9c3ff02e9f..fc73f1b0a5 100644 --- a/meta-python/recipes-devtools/python/python3-websocket-client_1.3.3.bb +++ b/meta-python/recipes-devtools/python/python3-websocket-client_1.7.0.bb @@ -5,13 +5,13 @@ This provide the low level APIs for WebSocket. All APIs \ are the synchronous functions." HOMEPAGE = "https://github.com/websocket-client/websocket-client" LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=b969e9612325987c823fc0737063ebc8" +LIC_FILES_CHKSUM = "file://LICENSE;md5=6eae3bb7247ccb2c3a087ea8de759c01" -SRC_URI[sha256sum] = "d58c5f284d6a9bf8379dab423259fe8f85b70d5fa5d2916d5791a84594b122b1" +SRC_URI[sha256sum] = "10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6" inherit pypi setuptools3 RDEPENDS:${PN} = "\ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-logging \ + python3-six \ + python3-logging \ " diff --git a/meta-python/recipes-devtools/python/python3-websockets_10.3.bb b/meta-python/recipes-devtools/python/python3-websockets_10.3.bb deleted file mode 100644 index 64b96d3ed7..0000000000 --- a/meta-python/recipes-devtools/python/python3-websockets_10.3.bb +++ /dev/null @@ -1,15 +0,0 @@ -SUMMARY = "An implementation of the WebSocket Protocol (RFC 6455)" -HOMEPAGE = "https://github.com/aaugustin/websockets" - -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=78c2cc91e172ca96d6f8e4a76c739ec6" - -inherit pypi setuptools3 - -SRC_URI[sha256sum] = "fc06cc8073c8e87072138ba1e431300e2d408f054b27047d047b549455066ff4" - -BBCLASSEXTEND = "native nativesdk" - -RDEPENDS:${PN} = "\ - ${PYTHON_PN}-asyncio \ -" diff --git a/meta-python/recipes-devtools/python/python3-werkzeug_2.2.2.bb b/meta-python/recipes-devtools/python/python3-werkzeug_2.2.2.bb deleted file mode 100644 index 92302f9cd7..0000000000 --- a/meta-python/recipes-devtools/python/python3-werkzeug_2.2.2.bb +++ /dev/null @@ -1,40 +0,0 @@ -SUMMARY = "The Swiss Army knife of Python web development" -DESCRIPTION = "\ -Werkzeug started as simple collection of various utilities for WSGI \ -applications and has become one of the most advanced WSGI utility modules. \ -It includes a powerful debugger, full featured request and response objects, \ -HTTP utilities to handle entity tags, cache control headers, HTTP dates, \ -cookie handling, file uploads, a powerful URL routing system and a bunch \ -of community contributed addon modules." -HOMEPAGE = "http://werkzeug.pocoo.org/" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=5dc88300786f1c214c1e9827a5229462" - -PYPI_PACKAGE = "Werkzeug" - -SRC_URI[sha256sum] = "7ea2d48322cc7c0f8b3a215ed73eabd7b5d75d0b50e31ab006286ccff9e00b8f" - -inherit pypi setuptools3 - -CLEANBROKEN = "1" - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-difflib \ - ${PYTHON_PN}-email \ - ${PYTHON_PN}-html \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-netserver \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-pkgutil \ - ${PYTHON_PN}-pprint \ - ${PYTHON_PN}-simplejson \ - ${PYTHON_PN}-threading \ - ${PYTHON_PN}-unixadmin \ - ${PYTHON_PN}-misc \ - ${PYTHON_PN}-profile \ - ${PYTHON_PN}-markupsafe \ -" diff --git a/meta-python/recipes-devtools/python/python3-werkzeug_3.0.1.bb b/meta-python/recipes-devtools/python/python3-werkzeug_3.0.1.bb new file mode 100644 index 0000000000..f8d2769b41 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-werkzeug_3.0.1.bb @@ -0,0 +1,23 @@ +SUMMARY = "The comprehensive WSGI web application library" +DESCRIPTION = "\ +Werkzeug started as simple collection of various utilities for WSGI \ +applications and has become one of the most advanced WSGI utility modules. \ +It includes a powerful debugger, full featured request and response objects, \ +HTTP utilities to handle entity tags, cache control headers, HTTP dates, \ +cookie handling, file uploads, a powerful URL routing system and a bunch \ +of community contributed addon modules." +HOMEPAGE = "https://werkzeug.palletsprojects.com" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=5dc88300786f1c214c1e9827a5229462" + +SRC_URI[sha256sum] = "507e811ecea72b18a404947aded4b3390e1db8f826b494d76550ef45bb3b1dcc" + +inherit pypi python_flit_core + +RDEPENDS:${PN} += " \ + python3-markupsafe \ + python3-logging \ + python3-profile \ + python3-compression \ + python3-json \ +" diff --git a/meta-python/recipes-devtools/python/python3-whitenoise_6.6.0.bb b/meta-python/recipes-devtools/python/python3-whitenoise_6.6.0.bb new file mode 100644 index 0000000000..352a53769a --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-whitenoise_6.6.0.bb @@ -0,0 +1,19 @@ +SUMMARY = "Radically simplified static file serving for WSGI applications" +AUTHOR = "David Evans <d@evans.io>" +HOMEPAGE = "https://whitenoise.evans.io" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=aba4901cc64e401cea5a267eac2a2e1e" + +PYPI_PACKAGE = "whitenoise" + +SRC_URI[sha256sum] = "8998f7370973447fac1e8ef6e8ded2c5209a7b1f67c1012866dbcd09681c3251" + +inherit pypi python_setuptools_build_meta + +RDEPENDS:${PN}:append = " \ + python3-brotli \ + python3-coverage \ + python3-django \ + python3-pytest \ + python3-requests \ +" diff --git a/meta-python/recipes-devtools/python/python3-whoosh/0001-Mark-non-determinstic-test_minimize_dfa-test-as-XFAI.patch b/meta-python/recipes-devtools/python/python3-whoosh/0001-Mark-non-determinstic-test_minimize_dfa-test-as-XFAI.patch new file mode 100644 index 0000000000..91fea24524 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-whoosh/0001-Mark-non-determinstic-test_minimize_dfa-test-as-XFAI.patch @@ -0,0 +1,29 @@ +From ede95a4f4487b4fc3cad8452ae388376966fca0e Mon Sep 17 00:00:00 2001 +From: Chris Lamb <lamby@debian.org> +Date: Fri, 5 Apr 2019 15:48:23 +0200 +Subject: [PATCH] Mark non-determinstic test_minimize_dfa test as XFAIL + +Sourced from Debian [1] +[1] https://sources.debian.org/src/python-whoosh/2.7.4%2Bgit6-g9134ad92-8/debian/patches/0003-Mark-non-determinstic-test_minimize_dfa-test-as-XFAI.patch/ + +Upstream-Status: Pending +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + tests/test_automata.py | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/tests/test_automata.py b/tests/test_automata.py +index daab96c..7031dc3 100644 +--- a/tests/test_automata.py ++++ b/tests/test_automata.py +@@ -327,6 +327,7 @@ def test_regular(): + assert not ex.accept("bc") + + ++@pytest.mark.xfail(strict=False) + def test_minimize_dfa(): + # Example from www.cs.odu.edu/~toida/nerzic/390teched/regular/fa/min-fa.html + +-- +2.44.0 + diff --git a/meta-python/recipes-devtools/python/python3-whoosh/run-ptest b/meta-python/recipes-devtools/python/python3-whoosh/run-ptest index 3385d68939..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-whoosh/run-ptest +++ b/meta-python/recipes-devtools/python/python3-whoosh/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-whoosh_2.7.4.bb b/meta-python/recipes-devtools/python/python3-whoosh_2.7.4.bb index ed2a6d423f..406de2e525 100644 --- a/meta-python/recipes-devtools/python/python3-whoosh_2.7.4.bb +++ b/meta-python/recipes-devtools/python/python3-whoosh_2.7.4.bb @@ -7,6 +7,8 @@ Whoosh works can be extended or replaced to meet your needs exactly." LICENSE = "BSD-2-Clause" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=05303186defc6141143629961c7c8a60" +SRC_URI += "file://0001-Mark-non-determinstic-test_minimize_dfa-test-as-XFAI.patch" + SRC_URI[md5sum] = "893433e9c0525ac043df33e6e04caab2" SRC_URI[sha256sum] = "e0857375f63e9041e03fedd5b7541f97cf78917ac1b6b06c1fcc9b45375dda69" @@ -16,13 +18,13 @@ PYPI_PACKAGE_EXT = "zip" inherit ptest pypi setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-email \ - ${PYTHON_PN}-multiprocessing \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-pickle \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-stringold \ + python3-email \ + python3-multiprocessing \ + python3-netclient \ + python3-numbers \ + python3-pickle \ + python3-shell \ + python3-stringold \ " SRC_URI += " \ @@ -30,8 +32,9 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-fcntl \ + python3-fcntl \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-wpa-supplicant_0.2.bb b/meta-python/recipes-devtools/python/python3-wpa-supplicant_0.2.bb index 5ac7786ad3..b9c62ced78 100644 --- a/meta-python/recipes-devtools/python/python3-wpa-supplicant_0.2.bb +++ b/meta-python/recipes-devtools/python/python3-wpa-supplicant_0.2.bb @@ -10,6 +10,8 @@ SRC_URI[sha256sum] = "3ad0f40a696763bb0f4d4dec5b51f6b53ccfeb7c16ebb5897349303045 SRC_URI += "file://0001-cli-drop-the-second-argument-from-click.argument-dec.patch" PYPI_PACKAGE = "wpa_supplicant" +UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/wpa_supplicant" +UPSTREAM_CHECK_REGEX = "/wpa_supplicant/(?P<pver>(\d+[\.\-_]*)+)" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-wrapt/run-ptest b/meta-python/recipes-devtools/python/python3-wrapt/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-wrapt/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-wrapt_1.14.1.bb b/meta-python/recipes-devtools/python/python3-wrapt_1.14.1.bb deleted file mode 100644 index 54bf1ee99a..0000000000 --- a/meta-python/recipes-devtools/python/python3-wrapt_1.14.1.bb +++ /dev/null @@ -1,16 +0,0 @@ -SUMMARY = "A Python module for decorators, wrappers and monkey patching." -HOMEPAGE = "http://wrapt.readthedocs.org/" -LICENSE = "BSD-2-Clause" -SECTION = "devel/python" -LIC_FILES_CHKSUM = "file://LICENSE;md5=7a4e084dbc322d180bc74f26cdf8236e" - -SRC_URI[sha256sum] = "380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d" - -inherit pypi setuptools3 - -RDEPENDS:${PN}:class-target += "\ - ${PYTHON_PN}-stringold \ - ${PYTHON_PN}-threading \ -" - -BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-wrapt_1.16.0.bb b/meta-python/recipes-devtools/python/python3-wrapt_1.16.0.bb new file mode 100644 index 0000000000..056323cd39 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-wrapt_1.16.0.bb @@ -0,0 +1,30 @@ +SUMMARY = "A Python module for decorators, wrappers and monkey patching." +HOMEPAGE = "http://wrapt.readthedocs.org/" +LICENSE = "BSD-2-Clause" +SECTION = "devel/python" +LIC_FILES_CHKSUM = "file://LICENSE;md5=dc34cbad60bc961452eb7ade801d25f7" + +SRC_URI[sha256sum] = "5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d" + +inherit pypi setuptools3 ptest + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} + +RDEPENDS:${PN}:class-target += "\ + python3-stringold \ + python3-threading \ +" + +BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-wsproto/run-ptest b/meta-python/recipes-devtools/python/python3-wsproto/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-wsproto/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-wsproto_1.2.0.bb b/meta-python/recipes-devtools/python/python3-wsproto_1.2.0.bb new file mode 100644 index 0000000000..09f5565a94 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-wsproto_1.2.0.bb @@ -0,0 +1,27 @@ +SUMMARY = "WebSockets state-machine based protocol implementation" +HOMEPAGE = "https://github.com/python-hyper/wsproto/" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=69fabf732409f4ac61875827b258caaf" + +inherit pypi setuptools3 ptest + +SRC_URI[sha256sum] = "ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065" + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/test/* ${D}${PTEST_PATH}/tests/ +} + +RDEPENDS:${PN} += " \ + python3-h11 \ + python3-netclient \ +" diff --git a/meta-python/recipes-devtools/python/python3-wtforms_3.0.1.bb b/meta-python/recipes-devtools/python/python3-wtforms_3.0.1.bb deleted file mode 100644 index 36a0191dc9..0000000000 --- a/meta-python/recipes-devtools/python/python3-wtforms_3.0.1.bb +++ /dev/null @@ -1,23 +0,0 @@ -DESCRIPTION = "A flexible forms validation and rendering library for python web development." -HOMEPAGE = "https://pypi.python.org/pypi/WTForms" -SECTION = "devel/python" -LICENSE = "BSD-3-Clause" - -LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=53dbfa56f61b90215a9f8f0d527c043d" - -SRC_URI[sha256sum] = "6b351bbb12dd58af57ffef05bc78425d08d1914e0fd68ee14143b7ade023c5bc" - -PYPI_PACKAGE = "WTForms" - -inherit pypi setuptools3 - -DEPENDS += "\ - ${PYTHON_PN}-pip-native \ - ${PYTHON_PN}-babel-native \ - " - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-netserver \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-markupsafe \ - " diff --git a/meta-python/recipes-devtools/python/python3-wtforms_3.1.2.bb b/meta-python/recipes-devtools/python/python3-wtforms_3.1.2.bb new file mode 100644 index 0000000000..b3ba14ff7f --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-wtforms_3.1.2.bb @@ -0,0 +1,24 @@ +DESCRIPTION = "A flexible forms validation and rendering library for python web development." +HOMEPAGE = "https://pypi.python.org/pypi/WTForms" +SECTION = "devel/python" +LICENSE = "BSD-3-Clause" + +LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=17ed54aa95f4a6cd0d7a4747d14b64d0" + +SRC_URI[sha256sum] = "f8d76180d7239c94c6322f7990ae1216dae3659b7aa1cee94b6318bdffb474b9" + +UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/WTForms" +UPSTREAM_CHECK_REGEX = "/WTForms/(?P<pver>(\d+[\.\-_]*)+)" + +inherit pypi python_hatchling + +DEPENDS += "\ + python3-pip-native \ + python3-babel-native \ + " + +RDEPENDS:${PN} += "\ + python3-netserver \ + python3-numbers \ + python3-markupsafe \ + " diff --git a/meta-python/recipes-devtools/python/python3-xlrd/run-ptest b/meta-python/recipes-devtools/python/python3-xlrd/run-ptest index 3385d68939..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-xlrd/run-ptest +++ b/meta-python/recipes-devtools/python/python3-xlrd/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-xlrd_2.0.1.bb b/meta-python/recipes-devtools/python/python3-xlrd_2.0.1.bb index da0dc26715..aedf483bef 100644 --- a/meta-python/recipes-devtools/python/python3-xlrd_2.0.1.bb +++ b/meta-python/recipes-devtools/python/python3-xlrd_2.0.1.bb @@ -17,13 +17,18 @@ SRCREV = "b8d573e11ec149da695d695c81a156232b89a949" S = "${WORKDIR}/git" inherit ptest setuptools3 -PIP_INSTALL_PACKAGE = "xlrd" -PIP_INSTALL_DIST_PATH = "${S}/dist" -RDEPENDS:${PN} += "${PYTHON_PN}-compression ${PYTHON_PN}-io ${PYTHON_PN}-pprint ${PYTHON_PN}-shell" +RDEPENDS:${PN} += " \ + python3-compression \ + python3-io \ + python3-mmap \ + python3-pprint \ + python3-shell \ +" RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-xlsxwriter_3.0.3.bb b/meta-python/recipes-devtools/python/python3-xlsxwriter_3.1.9.bb index 0f8dd35e0f..ee7dab35cb 100644 --- a/meta-python/recipes-devtools/python/python3-xlsxwriter_3.0.3.bb +++ b/meta-python/recipes-devtools/python/python3-xlsxwriter_3.1.9.bb @@ -2,7 +2,7 @@ SUMMARY = "Python 2 and 3 compatibility library" HOMEPAGE = "https://xlsxwriter.readthedocs.io" SECTION = "devel/python" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=2b9a26d1a52d2c66df334bbdad23896a" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=12d9fac1f0049be71ab5aa4a78da02b0" inherit pypi setuptools3 @@ -16,6 +16,6 @@ RDEPENDS:${PN} += " \ python3-io \ " -SRC_URI[sha256sum] = "e89f4a1d2fa2c9ea15cde77de95cd3fd8b0345d0efb3964623f395c8c4988b7f" +SRC_URI[sha256sum] = "de810bf328c6a4550f4ffd6b0b34972aeb7ffcf40f3d285a0413734f9b63a929" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-xmlrunner_1.7.7.bb b/meta-python/recipes-devtools/python/python3-xmlrunner_1.7.7.bb deleted file mode 100644 index e81e4dabee..0000000000 --- a/meta-python/recipes-devtools/python/python3-xmlrunner_1.7.7.bb +++ /dev/null @@ -1,9 +0,0 @@ -SUMMARY = "unittest-based test runner with Ant/JUnit like XML reporting" -HOMEPAGE = "https://github.com/pycontribs/xmlrunner" -LICENSE = "LGPL-3.0-only" -LIC_FILES_CHKSUM = "file://PKG-INFO;md5=fa964f202b6ae067ed5828fe43c77c1a" - -SRC_URI[md5sum] = "7b0b152ed2d278516aedbc0cac22dfb3" -SRC_URI[sha256sum] = "5a6113d049eca7646111ee657266966e5bbfb0b5ceb2e83ee0772e16d7110f39" - -inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-xmlschema_2.0.2.bb b/meta-python/recipes-devtools/python/python3-xmlschema_3.0.1.bb index eb9d4f511b..97dc683785 100644 --- a/meta-python/recipes-devtools/python/python3-xmlschema_2.0.2.bb +++ b/meta-python/recipes-devtools/python/python3-xmlschema_3.0.1.bb @@ -1,20 +1,20 @@ SUMMARY = "The xmlschema library is an implementation of XML Schema for Python (supports Python 3.6+)." HOMEPAGE = "https://github.com/sissaschool/xmlschema" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=47489cb18c469474afeb259ed1d4832f" +LIC_FILES_CHKSUM = "file://LICENSE;md5=26aa26eda991a3a2b61c11b62d3fda65" -SRC_URI[sha256sum] = "ce915696b3a819fe0f986824517b9281dbd5626fd2d213363fab40f34edf05bd" +SRC_URI[sha256sum] = "bb24a5f4738e49d85d9eb03a2b5af26bbbbfdb055517ad953d98925094b8c026" PYPI_PACKAGE = "xmlschema" inherit pypi setuptools3 DEPENDS += "\ - ${PYTHON_PN}-elementpath-native \ + python3-elementpath-native \ " RDEPENDS:${PN} += "\ - ${PYTHON_PN}-elementpath \ - ${PYTHON_PN}-modules \ + python3-elementpath \ + python3-modules \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-xmltodict/run-ptest b/meta-python/recipes-devtools/python/python3-xmltodict/run-ptest deleted file mode 100644 index 3385d68939..0000000000 --- a/meta-python/recipes-devtools/python/python3-xmltodict/run-ptest +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' diff --git a/meta-python/recipes-devtools/python/python3-xmltodict_0.12.0.bb b/meta-python/recipes-devtools/python/python3-xmltodict_0.12.0.bb deleted file mode 100644 index 1d871b2d35..0000000000 --- a/meta-python/recipes-devtools/python/python3-xmltodict_0.12.0.bb +++ /dev/null @@ -1,25 +0,0 @@ -SUMMARY = "Makes working with XML feel like you are working with JSON" -AUTHOR = "Martin Blech" -HOMEPAGE = "https://github.com/martinblech/xmltodict" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=01441d50dc74476db58a41ac10cb9fa2" - -SRC_URI[md5sum] = "ddb2bd078cef4f7e3021a578034ad941" -SRC_URI[sha256sum] = "50d8c638ed7ecb88d90561beedbf720c9b4e851a9fa6c47ebd64e99d166d8a21" - -PYPI_PACKAGE = "xmltodict" - -inherit pypi setuptools3 ptest - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ -" - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/tests - cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ -} diff --git a/meta-python/recipes-devtools/python/python3-xmodem_0.4.6.bb b/meta-python/recipes-devtools/python/python3-xmodem_0.4.7.bb index 6df392e2d6..482f0c641b 100644 --- a/meta-python/recipes-devtools/python/python3-xmodem_0.4.6.bb +++ b/meta-python/recipes-devtools/python/python3-xmodem_0.4.7.bb @@ -3,7 +3,7 @@ DESCRIPTION = "XMODEM protocol implementation" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" -SRC_URI[sha256sum] = "089737298f5738eabc43f2519efdc80b402693768f16383f7013b9e6f8f279d7" +SRC_URI[sha256sum] = "2f1068aa8676f0d1d112498b5786c4f8ea4f89d8f25d07d3a0f293cd21db1c35" inherit pypi setuptools3 @@ -14,6 +14,6 @@ do_install:append() { } RDEPENDS:${PN} += " \ - ${PYTHON_PN}-logging \ + python3-logging \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-xstatic-font-awesome_4.7.0.0.bb b/meta-python/recipes-devtools/python/python3-xstatic-font-awesome_6.2.1.1.bb index ccd1cd787d..f4a51f318e 100644 --- a/meta-python/recipes-devtools/python/python3-xstatic-font-awesome_4.7.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-xstatic-font-awesome_6.2.1.1.bb @@ -2,16 +2,15 @@ DESCRIPTION = "Font Awesome icons packaged for setuptools (easy_install) / pip." HOMEPAGE = "https://pypi.python.org/pypi/XStatic-Font-Awesome" SECTION = "devel/python" LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://PKG-INFO;md5=313d021898694cd2b0ea6508bdfe51a2" +LIC_FILES_CHKSUM = "file://PKG-INFO;md5=f1a2fe131dcb2fc6243c26cf05ecdb36" PYPI_PACKAGE = "XStatic-Font-Awesome" -SRC_URI[md5sum] = "141a0e9a7e21e82f922573a00ae0c166" -SRC_URI[sha256sum] = "e01fb480caaa7c7963dcb3328a4700e631bef6070db0e8b685816d220e685f6c" +SRC_URI[sha256sum] = "f075871096128638f2e1539020d8227754c3d885dd68e7ee6de9a01235076828" DEPENDS += " \ - ${PYTHON_PN}-xstatic \ - ${PYTHON_PN}-pip \ + python3-xstatic \ + python3-pip \ " inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-xstatic_1.0.2.bb b/meta-python/recipes-devtools/python/python3-xstatic_1.0.3.bb index 8de3959450..22bfa365ff 100644 --- a/meta-python/recipes-devtools/python/python3-xstatic_1.0.2.bb +++ b/meta-python/recipes-devtools/python/python3-xstatic_1.0.3.bb @@ -6,11 +6,10 @@ LIC_FILES_CHKSUM = "file://README.txt;md5=1418684272f85f400cebf1b1a255c5cd" PYPI_PACKAGE = "XStatic" -SRC_URI[md5sum] = "dea172b7b14b0dbcd5ed63075221af4b" -SRC_URI[sha256sum] = "80b78dfe37bce6dee4343d64c65375a80bcf399b46dd47c0c7d56161568a23a8" +SRC_URI[sha256sum] = "402544cc9e179489441054f09c807804e115ea246907de87c0355fb4f5a31268" DEPENDS += " \ - ${PYTHON_PN}-pip \ + python3-pip \ " inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-xxhash/run-ptest b/meta-python/recipes-devtools/python/python3-xxhash/run-ptest index e398fa8ca0..72c918c1a1 100644 --- a/meta-python/recipes-devtools/python/python3-xxhash/run-ptest +++ b/meta-python/recipes-devtools/python/python3-xxhash/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest tests/test.py -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake tests/test.py diff --git a/meta-python/recipes-devtools/python/python3-xxhash_3.0.0.bb b/meta-python/recipes-devtools/python/python3-xxhash_3.4.1.bb index ca8ed3b01e..be9ce005ea 100644 --- a/meta-python/recipes-devtools/python/python3-xxhash_3.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-xxhash_3.4.1.bb @@ -3,16 +3,19 @@ SECTION = "devel/python" LICENSE = "BSD-2-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=3a9dab7f159514231249aa3e108ab26b" -SRC_URI[sha256sum] = "30b2d97aaf11fb122023f6b44ebb97c6955e9e00d7461a96415ca030b5ceb9c7" +DEPENDS += "python3-setuptools-scm-native" + +SRC_URI[sha256sum] = "0379d6cf1ff987cd421609a264ce025e74f346e3e145dd106c0cc2e3ec3f99a9" SRC_URI += " \ file://run-ptest \ " -inherit pypi setuptools3 ptest +inherit pypi python_setuptools_build_meta ptest RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-yamlloader_1.1.0.bb b/meta-python/recipes-devtools/python/python3-yamlloader_1.4.1.bb index 0deb1b7dd4..55c48f889c 100644 --- a/meta-python/recipes-devtools/python/python3-yamlloader_1.1.0.bb +++ b/meta-python/recipes-devtools/python/python3-yamlloader_1.4.1.bb @@ -3,10 +3,10 @@ HOMEPAGE = "https://github.com/Phynix/yamlloader" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=6831ef36faa29329bce2420c5356f97e" -SRC_URI[sha256sum] = "8a297c7a197683ba02e5e2b882ffd6c6180d01bdefb534b69cd3962df020bfe6" +SRC_URI[sha256sum] = "b6fe40ecf5af596d840e920670ed3475f9813492bf6e55b24f2ad450c212bab5" inherit pypi python_setuptools_build_meta RDEPENDS:${PN}:class-target += "\ - ${PYTHON_PN}-pyyaml \ + python3-pyyaml \ " diff --git a/meta-python/recipes-devtools/python/python3-yappi/0001-Fix-imports-for-ptests.patch b/meta-python/recipes-devtools/python/python3-yappi/0001-test_functionality-convert-line-endings-to-Unix.patch index fa58897e68..70d4607c29 100644 --- a/meta-python/recipes-devtools/python/python3-yappi/0001-Fix-imports-for-ptests.patch +++ b/meta-python/recipes-devtools/python/python3-yappi/0001-test_functionality-convert-line-endings-to-Unix.patch @@ -1,43 +1,23 @@ -From 0dedc1c573ddc4e87475eb03c64555cd54a72e92 Mon Sep 17 00:00:00 2001 -From: Trevor Gamblin <trevor.gamblin@windriver.com> -Date: Mon, 7 Jun 2021 09:40:20 -0400 -Subject: [PATCH] Fix imports for tests +From 0136ca731cba8b056b3f2ff0e7df3953b94f1e87 Mon Sep 17 00:00:00 2001 +From: Tim Orling <tim.orling@konsulko.com> +Date: Sun, 24 Dec 2023 09:41:57 -0800 +Subject: [PATCH 1/2] test_functionality: convert line endings to Unix -Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> +Convert the Windows line endings with dos2unix to be like the +other files in tests/* + +Upstream-Status: Submitted [https://github.com/sumerc/yappi/pull/164] + +Signed-off-by: Tim Orling <tim.orling@konsulko.com> --- - tests/test_asyncio.py | 2 +- - tests/test_asyncio_context_vars.py | 2 +- - tests/test_functionality.py | 2 +- - tests/test_gevent.py | 2 +- - tests/test_hooks.py | 2 +- - tests/test_tags.py | 2 +- - 6 files changed, 6 insertions(+), 6 deletions(-) + tests/test_functionality.py | 3822 +++++++++++++++++------------------ + 1 file changed, 1911 insertions(+), 1911 deletions(-) ---- a/tests/test_asyncio.py -+++ b/tests/test_asyncio.py -@@ -2,7 +2,7 @@ import unittest - import yappi - import asyncio - import threading --from utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io -+from .utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io - - - @asyncio.coroutine ---- a/tests/test_asyncio_context_vars.py -+++ b/tests/test_asyncio_context_vars.py -@@ -5,7 +5,7 @@ import contextvars - import functools - import time - import os --import utils -+import tests.utils as utils - import yappi - - async_context_id = contextvars.ContextVar('async_context_id') +diff --git a/tests/test_functionality.py b/tests/test_functionality.py +index 0e99c47..38bbe67 100644 --- a/tests/test_functionality.py +++ b/tests/test_functionality.py -@@ -1,1916 +1,1916 @@ +@@ -1,1911 +1,1911 @@ -import os
-import sys
-import time
@@ -46,7 +26,7 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> -import yappi
-import _yappi
-import utils
--import multiprocessing # added to fix http://bugs.python.org/issue15881 for > Py2.6
+-import multiprocessing
-import subprocess
-
-_counter = 0
@@ -317,10 +297,10 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> - def test_profile_decorator(self):
-
- def aggregate(func, stats):
-- fname = "tests/%s.profile" % (func.__name__)
+- fname = f"tests/{func.__name__}.profile"
- try:
- stats.add(fname)
-- except IOError:
+- except OSError:
- pass
- stats.save(fname)
- raise Exception("messing around")
@@ -1231,7 +1211,7 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> - # TODO: I put dummy() to fix below, remove the comments after a while.
- self.assertTrue( # FIX: I see this fails sometimes?
- tsm is not None,
-- 'Could not find "_MainThread". Found: %s' % (', '.join(utils.get_stat_names(tstats))))
+- f"Could not find \"_MainThread\". Found: {', '.join(utils.get_stat_names(tstats))}")
-
- def test_ctx_stats(self):
- from threading import Thread
@@ -1311,7 +1291,7 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> - # TODO: I put dummy() to fix below, remove the comments after a while.
- self.assertTrue( # FIX: I see this fails sometimes
- tsmain is not None,
-- 'Could not find "_MainThread". Found: %s' % (', '.join(utils.get_stat_names(stats))))
+- f"Could not find \"_MainThread\". Found: {', '.join(utils.get_stat_names(stats))}")
- self.assertTrue(1.0 > tst2.ttot >= 0.5)
- self.assertTrue(1.0 > tst1.ttot >= 0.5)
-
@@ -1368,7 +1348,7 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> - ts = []
- for i in (0.01, 0.05, 0.1):
- t = threading.Thread(target=burn_cpu, args=(i, ))
-- t.name = "burn_cpu-%s" % str(i)
+- t.name = f"burn_cpu-{str(i)}"
- t.start()
- ts.append(t)
- for t in ts:
@@ -1395,10 +1375,7 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> - def test_producer_consumer_with_queues(self):
- # we currently just stress yappi, no functionality test is done here.
- yappi.start()
-- if utils.is_py3x():
-- from queue import Queue
-- else:
-- from Queue import Queue
+- from queue import Queue
- from threading import Thread
- WORKER_THREAD_COUNT = 50
- WORK_ITEM_COUNT = 2000
@@ -1457,7 +1434,6 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> - fsh = utils.find_stat_by_name(stats, "handler")
- self.assertTrue(fsh is not None)
-
-- @unittest.skipIf(not sys.version_info >= (3, 2), "requires Python 3.2")
- def test_concurrent_futures(self):
- yappi.start()
- from concurrent.futures import ThreadPoolExecutor
@@ -1467,7 +1443,6 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> - time.sleep(1.0)
- yappi.stop()
-
-- @unittest.skipIf(not sys.version_info >= (3, 2), "requires Python 3.2")
- def test_barrier(self):
- yappi.start()
- b = threading.Barrier(2, timeout=1)
@@ -1961,8 +1936,8 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> +import unittest +import yappi +import _yappi -+import tests.utils as utils -+import multiprocessing # added to fix http://bugs.python.org/issue15881 for > Py2.6 ++import utils ++import multiprocessing +import subprocess + +_counter = 0 @@ -2233,10 +2208,10 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> + def test_profile_decorator(self): + + def aggregate(func, stats): -+ fname = "tests/%s.profile" % (func.__name__) ++ fname = f"tests/{func.__name__}.profile" + try: + stats.add(fname) -+ except IOError: ++ except OSError: + pass + stats.save(fname) + raise Exception("messing around") @@ -3006,8 +2981,8 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> + + def test_issue_32(self): + ''' -+ Start yappi from different thread and we get Internal Error(15) as -+ the current_ctx_id() called while enumerating the threads in start() ++ Start yappi from different thread and we get Internal Error(15) as ++ the current_ctx_id() called while enumerating the threads in start() + and as it does not swap to the enumerated ThreadState* the THreadState_GetDict() + returns wrong object and thus sets an invalid id for the _ctx structure. + @@ -3147,7 +3122,7 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> + # TODO: I put dummy() to fix below, remove the comments after a while. + self.assertTrue( # FIX: I see this fails sometimes? + tsm is not None, -+ 'Could not find "_MainThread". Found: %s' % (', '.join(utils.get_stat_names(tstats)))) ++ f"Could not find \"_MainThread\". Found: {', '.join(utils.get_stat_names(tstats))}") + + def test_ctx_stats(self): + from threading import Thread @@ -3227,7 +3202,7 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> + # TODO: I put dummy() to fix below, remove the comments after a while. + self.assertTrue( # FIX: I see this fails sometimes + tsmain is not None, -+ 'Could not find "_MainThread". Found: %s' % (', '.join(utils.get_stat_names(stats)))) ++ f"Could not find \"_MainThread\". Found: {', '.join(utils.get_stat_names(stats))}") + self.assertTrue(1.0 > tst2.ttot >= 0.5) + self.assertTrue(1.0 > tst1.ttot >= 0.5) + @@ -3284,7 +3259,7 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> + ts = [] + for i in (0.01, 0.05, 0.1): + t = threading.Thread(target=burn_cpu, args=(i, )) -+ t.name = "burn_cpu-%s" % str(i) ++ t.name = f"burn_cpu-{str(i)}" + t.start() + ts.append(t) + for t in ts: @@ -3311,10 +3286,7 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> + def test_producer_consumer_with_queues(self): + # we currently just stress yappi, no functionality test is done here. + yappi.start() -+ if utils.is_py3x(): -+ from queue import Queue -+ else: -+ from Queue import Queue ++ from queue import Queue + from threading import Thread + WORKER_THREAD_COUNT = 50 + WORK_ITEM_COUNT = 2000 @@ -3373,7 +3345,6 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> + fsh = utils.find_stat_by_name(stats, "handler") + self.assertTrue(fsh is not None) + -+ @unittest.skipIf(not sys.version_info >= (3, 2), "requires Python 3.2") + def test_concurrent_futures(self): + yappi.start() + from concurrent.futures import ThreadPoolExecutor @@ -3383,7 +3354,6 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> + time.sleep(1.0) + yappi.stop() + -+ @unittest.skipIf(not sys.version_info >= (3, 2), "requires Python 3.2") + def test_barrier(self): + yappi.start() + b = threading.Barrier(2, timeout=1) @@ -3870,36 +3840,6 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> + # import sys;sys.argv = ['', 'BasicUsage.test_run_as_script'] + # import sys;sys.argv = ['', 'MultithreadedScenarios.test_subsequent_profile'] + unittest.main() ---- a/tests/test_gevent.py -+++ b/tests/test_gevent.py -@@ -4,7 +4,7 @@ import yappi - import gevent - from gevent.event import Event - import threading --from utils import ( -+from .utils import ( - YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io, - burn_io_gevent - ) ---- a/tests/test_hooks.py -+++ b/tests/test_hooks.py -@@ -5,7 +5,7 @@ import unittest - import time - - import yappi --import utils -+import tests.utils as utils - - - def a(): ---- a/tests/test_tags.py -+++ b/tests/test_tags.py -@@ -2,7 +2,7 @@ import unittest - import yappi - import threading - import time --from utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io -+from .utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io - - - class MultiThreadTests(YappiUnitTestCase): +-- +2.34.1 + diff --git a/meta-python/recipes-devtools/python/python3-yappi/0002-Fix-import-of-tests.utils-to-enable-pytest.patch b/meta-python/recipes-devtools/python/python3-yappi/0002-Fix-import-of-tests.utils-to-enable-pytest.patch new file mode 100644 index 0000000000..96dd024125 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-yappi/0002-Fix-import-of-tests.utils-to-enable-pytest.patch @@ -0,0 +1,101 @@ +From 28eac38566327091221aabbc164ea8e433c66e7e Mon Sep 17 00:00:00 2001 +From: Tim Orling <tim.orling@konsulko.com> +Date: Sun, 24 Dec 2023 09:27:50 -0800 +Subject: [PATCH 2/2] Fix import of tests.utils to enable pytest + +Running the test cases with pytest leads to importlib errors +because the "utils" module cannot be found. + +Upstream-Status: Submitted [https://github.com/sumerc/yappi/pull/164] + +Signed-off-by: Tim Orling <tim.orling@konsulko.com> +--- + tests/test_asyncio.py | 2 +- + tests/test_asyncio_context_vars.py | 2 +- + tests/test_functionality.py | 2 +- + tests/test_gevent.py | 2 +- + tests/test_hooks.py | 2 +- + tests/test_tags.py | 2 +- + 6 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/tests/test_asyncio.py b/tests/test_asyncio.py +index 8e9e631..bb36f4a 100644 +--- a/tests/test_asyncio.py ++++ b/tests/test_asyncio.py +@@ -2,7 +2,7 @@ import unittest + import yappi + import asyncio + import threading +-from utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io ++from tests.utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io + + + async def async_sleep(sec): +diff --git a/tests/test_asyncio_context_vars.py b/tests/test_asyncio_context_vars.py +index 5bd750c..9a253c0 100644 +--- a/tests/test_asyncio_context_vars.py ++++ b/tests/test_asyncio_context_vars.py +@@ -5,7 +5,7 @@ import contextvars + import functools + import time + import os +-import utils ++import tests.utils as utils + import yappi + + async_context_id = contextvars.ContextVar('async_context_id') +diff --git a/tests/test_functionality.py b/tests/test_functionality.py +index 38bbe67..8098f17 100644 +--- a/tests/test_functionality.py ++++ b/tests/test_functionality.py +@@ -5,7 +5,7 @@ import threading + import unittest + import yappi + import _yappi +-import utils ++import tests.utils as utils + import multiprocessing + import subprocess + +diff --git a/tests/test_gevent.py b/tests/test_gevent.py +index ed9e6ae..502af5f 100644 +--- a/tests/test_gevent.py ++++ b/tests/test_gevent.py +@@ -2,7 +2,7 @@ import unittest + import _yappi + import yappi + import threading +-from utils import ( ++from tests.utils import ( + YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io, burn_io_gevent + ) + +diff --git a/tests/test_hooks.py b/tests/test_hooks.py +index 297c643..8c387fc 100644 +--- a/tests/test_hooks.py ++++ b/tests/test_hooks.py +@@ -5,7 +5,7 @@ import unittest + import time + + import yappi +-import utils ++import tests.utils as utils + + + def a(): +diff --git a/tests/test_tags.py b/tests/test_tags.py +index b0b531d..b5a4016 100644 +--- a/tests/test_tags.py ++++ b/tests/test_tags.py +@@ -2,7 +2,7 @@ import unittest + import yappi + import threading + import time +-from utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io ++from tests.utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io + + + class MultiThreadTests(YappiUnitTestCase): +-- +2.34.1 + diff --git a/meta-python/recipes-devtools/python/python3-yappi/run-ptest b/meta-python/recipes-devtools/python/python3-yappi/run-ptest index 3385d68939..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-yappi/run-ptest +++ b/meta-python/recipes-devtools/python/python3-yappi/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-yappi_1.3.6.bb b/meta-python/recipes-devtools/python/python3-yappi_1.3.6.bb deleted file mode 100644 index 2f24443194..0000000000 --- a/meta-python/recipes-devtools/python/python3-yappi_1.3.6.bb +++ /dev/null @@ -1,34 +0,0 @@ -SUMMARY = "Yet Another Python Profiler" -HOMEPAGE = "https://github.com/sumerc/yappi" - -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=71c208c9a4fd864385eb69ad4caa3bee" - -SRC_URI[sha256sum] = "0a73c608a2603570a020a32d4369ba744012bc5267f37e5bd8026fb491abba56" - -SRC_URI += " \ - file://run-ptest \ - file://0001-Fix-imports-for-ptests.patch \ -" - -inherit pypi setuptools3 ptest - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-pickle \ - ${PYTHON_PN}-threading \ -" - -RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-gevent \ - ${PYTHON_PN}-multiprocessing \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-profile \ - ${PYTHON_PN}-zopeinterface \ -" - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/tests - cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ - cp -f ${S}/yappi/yappi.py ${D}/${PTEST_PATH}/ -} diff --git a/meta-python/recipes-devtools/python/python3-yappi_1.6.0.bb b/meta-python/recipes-devtools/python/python3-yappi_1.6.0.bb new file mode 100644 index 0000000000..4349cab1e7 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-yappi_1.6.0.bb @@ -0,0 +1,37 @@ +SUMMARY = "Yet Another Python Profiler" +HOMEPAGE = "https://github.com/sumerc/yappi" + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=71c208c9a4fd864385eb69ad4caa3bee" + +SRC_URI[sha256sum] = "a9aaf72009d8c03067294151ee0470ac7a6dfa7b33baab40b198d6c1ef00430a" + +SRC_URI += " \ + file://run-ptest \ + file://0001-test_functionality-convert-line-endings-to-Unix.patch \ + file://0002-Fix-import-of-tests.utils-to-enable-pytest.patch \ +" + +inherit pypi python_setuptools_build_meta ptest + +RDEPENDS:${PN} += "\ + python3-datetime \ + python3-pickle \ + python3-threading \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-gevent \ + python3-multiprocessing \ + python3-pytest \ + python3-profile \ + python3-unittest-automake-output \ + python3-zopeinterface \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests ${D}${PTEST_PATH} + cp -f ${S}/run_tests.py ${D}${PTEST_PATH} +} + diff --git a/meta-python/recipes-devtools/python/python3-yarl/run-ptest b/meta-python/recipes-devtools/python/python3-yarl/run-ptest index 3385d68939..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-yarl/run-ptest +++ b/meta-python/recipes-devtools/python/python3-yarl/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-yarl_1.8.1.bb b/meta-python/recipes-devtools/python/python3-yarl_1.8.1.bb deleted file mode 100644 index 66ee46b446..0000000000 --- a/meta-python/recipes-devtools/python/python3-yarl_1.8.1.bb +++ /dev/null @@ -1,27 +0,0 @@ -SUMMARY = "The module provides handy URL class for url parsing and changing" -HOMEPAGE = "https://github.com/aio-libs/yarl/" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=e581798a7b985311f29fa3e163ea27ae" - -SRC_URI[sha256sum] = "af887845b8c2e060eb5605ff72b6f2dd2aab7a761379373fd89d314f4752abbf" - -SRC_URI += "file://run-ptest" - -PYPI_PACKAGE = "yarl" - -inherit pypi ptest setuptools3 - -RDEPENDS:${PN} = "\ - ${PYTHON_PN}-multidict \ - ${PYTHON_PN}-idna \ - ${PYTHON_PN}-io \ -" - -RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ -" - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/tests - cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ -} diff --git a/meta-python/recipes-devtools/python/python3-yarl_1.9.4.bb b/meta-python/recipes-devtools/python/python3-yarl_1.9.4.bb new file mode 100644 index 0000000000..29897b7f1c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-yarl_1.9.4.bb @@ -0,0 +1,33 @@ +SUMMARY = "The module provides handy URL class for url parsing and changing" +HOMEPAGE = "https://github.com/aio-libs/yarl/" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57" + +SRC_URI[sha256sum] = "566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf" + +SRC_URI += "file://run-ptest" + +PYPI_PACKAGE = "yarl" + +inherit pypi ptest python_setuptools_build_meta + +DEPENDS += " \ + python3-expandvars-native \ + python3-cython-native \ +" + +RDEPENDS:${PN} = "\ + python3-multidict \ + python3-idna \ + python3-io \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} diff --git a/meta-python/recipes-devtools/python/python3-zeroconf_0.132.0.bb b/meta-python/recipes-devtools/python/python3-zeroconf_0.132.0.bb new file mode 100644 index 0000000000..ea8ef1cb92 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-zeroconf_0.132.0.bb @@ -0,0 +1,15 @@ +SUMMARY = "Pure Python Multicast DNS Service Discovery Library (Bonjour/Avahi compatible)" +HOMEPAGE = "https://github.com/jstasiak/python-zeroconf" +LICENSE = "LGPL-2.1-only" +LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=6;endline=6;md5=6517bdc8f2416f27ab725d4702f7aac3" + +SRC_URI[sha256sum] = "e2dddb9b8e6a9de3c43f943d8547300e6bd49b2043fd719ae830cfe0f2908a5c" + +DEPENDS += "python3-cython-native" + +inherit pypi python_poetry_core + +RDEPENDS:${PN} += " \ + python3-ifaddr (>=0.1.7) \ + python3-async-timeout \ +" diff --git a/meta-python/recipes-devtools/python/python3-zeroconf_0.39.0.bb b/meta-python/recipes-devtools/python/python3-zeroconf_0.39.0.bb deleted file mode 100644 index 9b1576372c..0000000000 --- a/meta-python/recipes-devtools/python/python3-zeroconf_0.39.0.bb +++ /dev/null @@ -1,14 +0,0 @@ -SUMMARY = "Pure Python Multicast DNS Service Discovery Library (Bonjour/Avahi compatible)" -HOMEPAGE = "https://github.com/jstasiak/python-zeroconf" -LICENSE = "LGPL-2.1-only" -LIC_FILES_CHKSUM = "file://COPYING;md5=3bb705b228ea4a14ea2728215b780d80" - -SRC_URI[sha256sum] = "7c0d8257b940ee43e637fb560c2f9bd79da0638f37af162eb4f506f7274ef8e4" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-ifaddr \ - ${PYTHON_PN}-asyncio \ - ${PYTHON_PN}-async-timeout \ -" diff --git a/meta-python/recipes-devtools/python/python3-zopeevent_5.0.bb b/meta-python/recipes-devtools/python/python3-zopeevent_5.0.bb new file mode 100644 index 0000000000..4d914c63e9 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-zopeevent_5.0.bb @@ -0,0 +1,10 @@ +DESCRIPTION = "The zope.event package provides a simple event system" + +LICENSE = "ZPL-2.1" +LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=72092419572155ddc2d4fb7631c63dd3" + +SRC_URI[sha256sum] = "bac440d8d9891b4068e2b5a2c5e2c9765a9df762944bda6955f96bb9b91e67cd" + +PYPI_PACKAGE = "zope.event" + +inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-zopeinterface_5.4.0.bb b/meta-python/recipes-devtools/python/python3-zopeinterface_6.3.bb index b048c80e13..21d03f2e7d 100644 --- a/meta-python/recipes-devtools/python/python3-zopeinterface_5.4.0.bb +++ b/meta-python/recipes-devtools/python/python3-zopeinterface_6.3.bb @@ -5,13 +5,13 @@ LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e54fd776274c1b7423 PYPI_PACKAGE = "zope.interface" inherit pypi setuptools3 -SRC_URI[sha256sum] = "5dba5f530fec3f0988d83b78cc591b58c0b6eb8431a85edd1569a0539a8a5a0e" +SRC_URI[sha256sum] = "f83d6b4b22262d9a826c3bd4b2fbfafe1d0000f085ef8e44cd1328eea274ae6a" PACKAGES =. "${PN}-test " RPROVIDES:${PN} += "zope-interfaces" -RDEPENDS:${PN}:class-target += "${PYTHON_PN}-datetime" +RDEPENDS:${PN}:class-target += "python3-datetime" RDEPENDS:${PN}-test += "python3-unittest python3-doctest" FILES:${PN}-dbg += "${PYTHON_SITEPACKAGES_DIR}/*.egg/*/*/.debug" diff --git a/meta-python/recipes-devtools/python/tftpy_0.8.2.bb b/meta-python/recipes-devtools/python/tftpy_0.8.2.bb new file mode 100644 index 0000000000..c1b3234f72 --- /dev/null +++ b/meta-python/recipes-devtools/python/tftpy_0.8.2.bb @@ -0,0 +1,13 @@ +SUMMARY = "Tftpy is a TFTP library for the Python programming language. It includes client and server classes, with sample implementations." +DESCRIPTION = "Tftpy is a TFTP library for the Python programming language. It \ +includes client and server classes, with sample implementations. Hooks are \ +included for easy inclusion in a UI for populating progress indicators. It \ +supports RFCs 1350, 2347, 2348 and the tsize option from RFC 2349." + +HOMEPAGE = "https://github.com/msoulier/tftpy" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=22770e72ae03c61f5bcc4e333b61368d" + +SRC_URI[sha256sum] = "e1d1a680efd88eba176b351175844253067392a9b0f8b81588e3ff2b9e7bbb5b" + +inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python3-attrdict3/python3-attrdict3_2.0.2.bb b/meta-python/recipes-devtools/python3-attrdict3/python3-attrdict3_2.0.2.bb new file mode 100644 index 0000000000..ee099c7ac9 --- /dev/null +++ b/meta-python/recipes-devtools/python3-attrdict3/python3-attrdict3_2.0.2.bb @@ -0,0 +1,14 @@ +SUMMARY = "AttrDict is an MIT-licensed library that provides mapping objects that allow their elements to be accessed both as keys and as attributes" +HOMEPAGE = "https://pypi.org/project/attrdict3/" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=2b37be7e71ebfc92a94bfacf6b20a1cc" + +DEPENDS = "" + +SRC_URI[sha256sum] = "004c171ca1120cc1755701db99d7fa4944afb1e68950434efdaa542513335fe8" + +inherit pypi setuptools3 + +BBCLASSEXTEND = "native" + +RDEPENDS:${PN} += "python3-six" diff --git a/meta-python/recipes-devtools/python3-gspread/python3-gspread_6.1.0.bb b/meta-python/recipes-devtools/python3-gspread/python3-gspread_6.1.0.bb new file mode 100644 index 0000000000..482155856a --- /dev/null +++ b/meta-python/recipes-devtools/python3-gspread/python3-gspread_6.1.0.bb @@ -0,0 +1,14 @@ +SUMMARY = "Google Spreadsheets Python API" +HOMEPAGE = "https://github.com/burnash/gspread" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=9488e21983675fa56dc05af558b83e2f" + +SRC_URI[sha256sum] = "576b72b628b251d2ee41e02b982d3c714d511d2a5aa3a88e587ed9efc4d6e752" + +RDEPENDS:${PN} = " \ + python3-google-auth \ + python3-google-auth-oauthlib \ + python3-strenum \ + " + +inherit pypi python_flit_core diff --git a/meta-python/recipes-devtools/python3-piccata/python3-piccata_2.0.3.bb b/meta-python/recipes-devtools/python3-piccata/python3-piccata_2.0.3.bb new file mode 100644 index 0000000000..fadcc32c24 --- /dev/null +++ b/meta-python/recipes-devtools/python3-piccata/python3-piccata_2.0.3.bb @@ -0,0 +1,13 @@ +SUMMARY = "Python CoAP Toolkit" +HOMEPAGE = "https://github.com/NordicSemiconductor/piccata" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=e664eb75e2791c2e505e6e1c274e6d4f" + +SRCREV = "218d310e3d840715b1c8e67cefd5b6d71a2d7a1a" +SRC_URI = "git://github.com/NordicSemiconductor/piccata.git;protocol=https;branch=master" + +S = "${WORKDIR}/git" + +inherit setuptools3 + +RDEPENDS:${PN} += "python3-core python3-datetime python3-io python3-logging python3-math" diff --git a/meta-python/recipes-devtools/python3-reedsolo/python3-reedsolo_2.0.13.bb b/meta-python/recipes-devtools/python3-reedsolo/python3-reedsolo_2.0.13.bb new file mode 100644 index 0000000000..bb5b973d86 --- /dev/null +++ b/meta-python/recipes-devtools/python3-reedsolo/python3-reedsolo_2.0.13.bb @@ -0,0 +1,10 @@ +SUMMARY = "Pure-Python Reed Solomon encoder/decoder" +HOMEPAGE = "https://github.com/tomerfiliba/reedsolomon" +LICENSE = "MIT-0 | Unlicense" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ffde61aeb8917e70e0257e0a4b6d103c" + +SRC_URI[sha256sum] = "71b4121c6860a55899435c552051a19d5f023c50358be4b1c0fa0c6e2f4ac717" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-core" diff --git a/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/0001-Update-Cython-version-to-fix-NanoSVG-issues-with-Pyt.patch b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/0001-Update-Cython-version-to-fix-NanoSVG-issues-with-Pyt.patch deleted file mode 100644 index 6be56cb908..0000000000 --- a/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/0001-Update-Cython-version-to-fix-NanoSVG-issues-with-Pyt.patch +++ /dev/null @@ -1,861 +0,0 @@ -Upstream-Status: Backport [https://github.com/wxWidgets/Phoenix/commit/b40ab0f8] - -Signed-off-by: Kai Kang <kai.kang@windriver.com> - -From b40ab0f806bdf7aa0c0a51a8c4876ac47754515d Mon Sep 17 00:00:00 2001 -From: Scott Talbert <swt@techie.net> -Date: Thu, 7 Oct 2021 17:53:05 -0400 -Subject: [PATCH] Update Cython version to fix NanoSVG issues with Python 3.10 - ---- - requirements/devel.txt | 2 +- - wx/svg/_nanosvg.c | 554 ++++++++++++++++++++++++++--------------- - 2 files changed, 359 insertions(+), 197 deletions(-) - -diff --git a/requirements/devel.txt b/requirements/devel.txt -index 1d427be0..18164bdc 100644 ---- a/requirements/devel.txt -+++ b/requirements/devel.txt -@@ -9,7 +9,7 @@ wheel - twine - requests - requests[security] --cython==0.29.21 -+cython==0.29.24 - pytest - pytest-xdist - pytest-forked -diff --git a/wx/svg/_nanosvg.c b/wx/svg/_nanosvg.c -index d8f1e158..fd4a5a67 100644 ---- a/wx/svg/_nanosvg.c -+++ b/wx/svg/_nanosvg.c -@@ -1,4 +1,4 @@ --/* Generated by Cython 0.29.21 */ -+/* Generated by Cython 0.29.24 */ - - /* BEGIN: Cython Metadata - { -@@ -33,15 +33,17 @@ - } - END: Cython Metadata */ - -+#ifndef PY_SSIZE_T_CLEAN - #define PY_SSIZE_T_CLEAN -+#endif /* PY_SSIZE_T_CLEAN */ - #include "Python.h" - #ifndef Py_PYTHON_H - #error Python headers needed to compile C extensions, please install development version of Python. - #elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) - #error Cython requires Python 2.6+ or Python 3.3+. - #else --#define CYTHON_ABI "0_29_21" --#define CYTHON_HEX_VERSION 0x001D15F0 -+#define CYTHON_ABI "0_29_24" -+#define CYTHON_HEX_VERSION 0x001D18F0 - #define CYTHON_FUTURE_DIVISION 0 - #include <stddef.h> - #ifndef offsetof -@@ -459,8 +461,12 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { - #endif - #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) - #define CYTHON_PEP393_ENABLED 1 -+ #if defined(PyUnicode_IS_READY) - #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ - 0 : _PyUnicode_Ready((PyObject *)(op))) -+ #else -+ #define __Pyx_PyUnicode_READY(op) (0) -+ #endif - #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) - #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) - #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) -@@ -469,7 +475,11 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { - #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) - #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) - #if defined(PyUnicode_IS_READY) && defined(PyUnicode_GET_SIZE) -+ #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 -+ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) -+ #else - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) -+ #endif - #else - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) - #endif -@@ -1736,33 +1746,38 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); - static void __Pyx_AddTraceback(const char *funcname, int c_line, - int py_line, const char *filename); - -+/* GCCDiagnostics.proto */ -+#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) -+#define __Pyx_HAS_GCC_DIAGNOSTIC -+#endif -+ - /* CIntToPy.proto */ - static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); - -+/* CIntFromPy.proto */ -+static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); -+ - /* CIntToPy.proto */ - static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); - - /* CIntToPy.proto */ - static CYTHON_INLINE PyObject* __Pyx_PyInt_From_char(char value); - -+/* CIntFromPy.proto */ -+static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *); -+ - /* CIntToPy.proto */ - static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_char(unsigned char value); - -+/* CIntFromPy.proto */ -+static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); -+ - /* CIntToPy.proto */ - static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum____pyx_t_2wx_3svg_8_nanosvg_SVGpaintType(enum __pyx_t_2wx_3svg_8_nanosvg_SVGpaintType value); - - /* CIntToPy.proto */ - static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value); - --/* CIntFromPy.proto */ --static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); -- --/* CIntFromPy.proto */ --static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *); -- --/* CIntFromPy.proto */ --static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); -- - /* CIntToPy.proto */ - static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum____pyx_t_2wx_3svg_8_nanosvg_SVGfillRule(enum __pyx_t_2wx_3svg_8_nanosvg_SVGfillRule value); - -@@ -1844,6 +1859,7 @@ typedef struct { - PyObject *gi_qualname; - PyObject *gi_modulename; - PyObject *gi_code; -+ PyObject *gi_frame; - int resume_label; - char is_running; - } __pyx_CoroutineObject; -@@ -14641,11 +14657,9 @@ if (!__Pyx_RefNanny) { - #endif - /*--- Library function declarations ---*/ - /*--- Threads initialization code ---*/ -- #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS -- #ifdef WITH_THREAD /* Python build with threading support? */ -+ #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS - PyEval_InitThreads(); - #endif -- #endif - /*--- Module creation code ---*/ - #if CYTHON_PEP489_MULTI_PHASE_INIT - __pyx_m = __pyx_pyinit_module; -@@ -16766,7 +16780,7 @@ invalid_keyword: - #if CYTHON_COMPILING_IN_CPYTHON - static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { - PyObject *result; -- ternaryfunc call = func->ob_type->tp_call; -+ ternaryfunc call = Py_TYPE(func)->tp_call; - if (unlikely(!call)) - return PyObject_Call(func, arg, kw); - if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) -@@ -17149,7 +17163,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObjec - if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { - return __Pyx_PyObject_CallMethO(func, arg); - #if CYTHON_FAST_PYCCALL -- } else if (PyCFunction_GET_FLAGS(func) & METH_FASTCALL) { -+ } else if (__Pyx_PyFastCFunction_Check(func)) { - return __Pyx_PyCFunction_FastCall(func, &arg, 1); - #endif - } -@@ -18800,7 +18814,8 @@ static PyObject * - __Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, CYTHON_UNUSED PyObject *args) - { - #if PY_MAJOR_VERSION >= 3 -- return PyUnicode_FromString(m->func.m_ml->ml_name); -+ Py_INCREF(m->func_qualname); -+ return m->func_qualname; - #else - return PyString_FromString(m->func.m_ml->ml_name); - #endif -@@ -19443,37 +19458,6 @@ bad: - Py_XDECREF(py_frame); - } - --/* CIntToPy */ --static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { -- const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0; -- const int is_unsigned = neg_one > const_zero; -- if (is_unsigned) { -- if (sizeof(long) < sizeof(long)) { -- return PyInt_FromLong((long) value); -- } else if (sizeof(long) <= sizeof(unsigned long)) { -- return PyLong_FromUnsignedLong((unsigned long) value); --#ifdef HAVE_LONG_LONG -- } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { -- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); --#endif -- } -- } else { -- if (sizeof(long) <= sizeof(long)) { -- return PyInt_FromLong((long) value); --#ifdef HAVE_LONG_LONG -- } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { -- return PyLong_FromLongLong((PY_LONG_LONG) value); --#endif -- } -- } -- { -- int one = 1; int little = (int)*(unsigned char *)&one; -- unsigned char *bytes = (unsigned char *)&value; -- return _PyLong_FromByteArray(bytes, sizeof(long), -- little, !is_unsigned); -- } --} -- - /* CIntFromPyVerify */ - #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ - __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) -@@ -19497,148 +19481,31 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { - } - - /* CIntToPy */ --static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { -- const int neg_one = (int) ((int) 0 - (int) 1), const_zero = (int) 0; -- const int is_unsigned = neg_one > const_zero; -- if (is_unsigned) { -- if (sizeof(int) < sizeof(long)) { -- return PyInt_FromLong((long) value); -- } else if (sizeof(int) <= sizeof(unsigned long)) { -- return PyLong_FromUnsignedLong((unsigned long) value); --#ifdef HAVE_LONG_LONG -- } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { -- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); --#endif -- } -- } else { -- if (sizeof(int) <= sizeof(long)) { -- return PyInt_FromLong((long) value); --#ifdef HAVE_LONG_LONG -- } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { -- return PyLong_FromLongLong((PY_LONG_LONG) value); --#endif -- } -- } -- { -- int one = 1; int little = (int)*(unsigned char *)&one; -- unsigned char *bytes = (unsigned char *)&value; -- return _PyLong_FromByteArray(bytes, sizeof(int), -- little, !is_unsigned); -- } --} -- --/* CIntToPy */ --static CYTHON_INLINE PyObject* __Pyx_PyInt_From_char(char value) { -- const char neg_one = (char) ((char) 0 - (char) 1), const_zero = (char) 0; -- const int is_unsigned = neg_one > const_zero; -- if (is_unsigned) { -- if (sizeof(char) < sizeof(long)) { -- return PyInt_FromLong((long) value); -- } else if (sizeof(char) <= sizeof(unsigned long)) { -- return PyLong_FromUnsignedLong((unsigned long) value); --#ifdef HAVE_LONG_LONG -- } else if (sizeof(char) <= sizeof(unsigned PY_LONG_LONG)) { -- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); --#endif -- } -- } else { -- if (sizeof(char) <= sizeof(long)) { -- return PyInt_FromLong((long) value); --#ifdef HAVE_LONG_LONG -- } else if (sizeof(char) <= sizeof(PY_LONG_LONG)) { -- return PyLong_FromLongLong((PY_LONG_LONG) value); --#endif -- } -- } -- { -- int one = 1; int little = (int)*(unsigned char *)&one; -- unsigned char *bytes = (unsigned char *)&value; -- return _PyLong_FromByteArray(bytes, sizeof(char), -- little, !is_unsigned); -- } --} -- --/* CIntToPy */ --static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_char(unsigned char value) { -- const unsigned char neg_one = (unsigned char) ((unsigned char) 0 - (unsigned char) 1), const_zero = (unsigned char) 0; -- const int is_unsigned = neg_one > const_zero; -- if (is_unsigned) { -- if (sizeof(unsigned char) < sizeof(long)) { -- return PyInt_FromLong((long) value); -- } else if (sizeof(unsigned char) <= sizeof(unsigned long)) { -- return PyLong_FromUnsignedLong((unsigned long) value); --#ifdef HAVE_LONG_LONG -- } else if (sizeof(unsigned char) <= sizeof(unsigned PY_LONG_LONG)) { -- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); --#endif -- } -- } else { -- if (sizeof(unsigned char) <= sizeof(long)) { -- return PyInt_FromLong((long) value); --#ifdef HAVE_LONG_LONG -- } else if (sizeof(unsigned char) <= sizeof(PY_LONG_LONG)) { -- return PyLong_FromLongLong((PY_LONG_LONG) value); --#endif -- } -- } -- { -- int one = 1; int little = (int)*(unsigned char *)&one; -- unsigned char *bytes = (unsigned char *)&value; -- return _PyLong_FromByteArray(bytes, sizeof(unsigned char), -- little, !is_unsigned); -- } --} -- --/* CIntToPy */ --static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum____pyx_t_2wx_3svg_8_nanosvg_SVGpaintType(enum __pyx_t_2wx_3svg_8_nanosvg_SVGpaintType value) { -- const enum __pyx_t_2wx_3svg_8_nanosvg_SVGpaintType neg_one = (enum __pyx_t_2wx_3svg_8_nanosvg_SVGpaintType) ((enum __pyx_t_2wx_3svg_8_nanosvg_SVGpaintType) 0 - (enum __pyx_t_2wx_3svg_8_nanosvg_SVGpaintType) 1), const_zero = (enum __pyx_t_2wx_3svg_8_nanosvg_SVGpaintType) 0; -- const int is_unsigned = neg_one > const_zero; -- if (is_unsigned) { -- if (sizeof(enum __pyx_t_2wx_3svg_8_nanosvg_SVGpaintType) < sizeof(long)) { -- return PyInt_FromLong((long) value); -- } else if (sizeof(enum __pyx_t_2wx_3svg_8_nanosvg_SVGpaintType) <= sizeof(unsigned long)) { -- return PyLong_FromUnsignedLong((unsigned long) value); --#ifdef HAVE_LONG_LONG -- } else if (sizeof(enum __pyx_t_2wx_3svg_8_nanosvg_SVGpaintType) <= sizeof(unsigned PY_LONG_LONG)) { -- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic push -+#pragma GCC diagnostic ignored "-Wconversion" - #endif -- } -- } else { -- if (sizeof(enum __pyx_t_2wx_3svg_8_nanosvg_SVGpaintType) <= sizeof(long)) { -- return PyInt_FromLong((long) value); --#ifdef HAVE_LONG_LONG -- } else if (sizeof(enum __pyx_t_2wx_3svg_8_nanosvg_SVGpaintType) <= sizeof(PY_LONG_LONG)) { -- return PyLong_FromLongLong((PY_LONG_LONG) value); -+ const long neg_one = (long) -1, const_zero = (long) 0; -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic pop - #endif -- } -- } -- { -- int one = 1; int little = (int)*(unsigned char *)&one; -- unsigned char *bytes = (unsigned char *)&value; -- return _PyLong_FromByteArray(bytes, sizeof(enum __pyx_t_2wx_3svg_8_nanosvg_SVGpaintType), -- little, !is_unsigned); -- } --} -- --/* CIntToPy */ --static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value) { -- const unsigned int neg_one = (unsigned int) ((unsigned int) 0 - (unsigned int) 1), const_zero = (unsigned int) 0; - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { -- if (sizeof(unsigned int) < sizeof(long)) { -+ if (sizeof(long) < sizeof(long)) { - return PyInt_FromLong((long) value); -- } else if (sizeof(unsigned int) <= sizeof(unsigned long)) { -+ } else if (sizeof(long) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); - #ifdef HAVE_LONG_LONG -- } else if (sizeof(unsigned int) <= sizeof(unsigned PY_LONG_LONG)) { -+ } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); - #endif - } - } else { -- if (sizeof(unsigned int) <= sizeof(long)) { -+ if (sizeof(long) <= sizeof(long)) { - return PyInt_FromLong((long) value); - #ifdef HAVE_LONG_LONG -- } else if (sizeof(unsigned int) <= sizeof(PY_LONG_LONG)) { -+ } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { - return PyLong_FromLongLong((PY_LONG_LONG) value); - #endif - } -@@ -19646,14 +19513,21 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value) - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; -- return _PyLong_FromByteArray(bytes, sizeof(unsigned int), -+ return _PyLong_FromByteArray(bytes, sizeof(long), - little, !is_unsigned); - } - } - - /* CIntFromPy */ - static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { -- const int neg_one = (int) ((int) 0 - (int) 1), const_zero = (int) 0; -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic push -+#pragma GCC diagnostic ignored "-Wconversion" -+#endif -+ const int neg_one = (int) -1, const_zero = (int) 0; -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic pop -+#endif - const int is_unsigned = neg_one > const_zero; - #if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { -@@ -19840,9 +19714,92 @@ raise_neg_overflow: - return (int) -1; - } - -+/* CIntToPy */ -+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic push -+#pragma GCC diagnostic ignored "-Wconversion" -+#endif -+ const int neg_one = (int) -1, const_zero = (int) 0; -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic pop -+#endif -+ const int is_unsigned = neg_one > const_zero; -+ if (is_unsigned) { -+ if (sizeof(int) < sizeof(long)) { -+ return PyInt_FromLong((long) value); -+ } else if (sizeof(int) <= sizeof(unsigned long)) { -+ return PyLong_FromUnsignedLong((unsigned long) value); -+#ifdef HAVE_LONG_LONG -+ } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { -+ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -+#endif -+ } -+ } else { -+ if (sizeof(int) <= sizeof(long)) { -+ return PyInt_FromLong((long) value); -+#ifdef HAVE_LONG_LONG -+ } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { -+ return PyLong_FromLongLong((PY_LONG_LONG) value); -+#endif -+ } -+ } -+ { -+ int one = 1; int little = (int)*(unsigned char *)&one; -+ unsigned char *bytes = (unsigned char *)&value; -+ return _PyLong_FromByteArray(bytes, sizeof(int), -+ little, !is_unsigned); -+ } -+} -+ -+/* CIntToPy */ -+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_char(char value) { -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic push -+#pragma GCC diagnostic ignored "-Wconversion" -+#endif -+ const char neg_one = (char) -1, const_zero = (char) 0; -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic pop -+#endif -+ const int is_unsigned = neg_one > const_zero; -+ if (is_unsigned) { -+ if (sizeof(char) < sizeof(long)) { -+ return PyInt_FromLong((long) value); -+ } else if (sizeof(char) <= sizeof(unsigned long)) { -+ return PyLong_FromUnsignedLong((unsigned long) value); -+#ifdef HAVE_LONG_LONG -+ } else if (sizeof(char) <= sizeof(unsigned PY_LONG_LONG)) { -+ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -+#endif -+ } -+ } else { -+ if (sizeof(char) <= sizeof(long)) { -+ return PyInt_FromLong((long) value); -+#ifdef HAVE_LONG_LONG -+ } else if (sizeof(char) <= sizeof(PY_LONG_LONG)) { -+ return PyLong_FromLongLong((PY_LONG_LONG) value); -+#endif -+ } -+ } -+ { -+ int one = 1; int little = (int)*(unsigned char *)&one; -+ unsigned char *bytes = (unsigned char *)&value; -+ return _PyLong_FromByteArray(bytes, sizeof(char), -+ little, !is_unsigned); -+ } -+} -+ - /* CIntFromPy */ - static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *x) { -- const char neg_one = (char) ((char) 0 - (char) 1), const_zero = (char) 0; -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic push -+#pragma GCC diagnostic ignored "-Wconversion" -+#endif -+ const char neg_one = (char) -1, const_zero = (char) 0; -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic pop -+#endif - const int is_unsigned = neg_one > const_zero; - #if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { -@@ -20029,9 +19986,54 @@ raise_neg_overflow: - return (char) -1; - } - -+/* CIntToPy */ -+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_char(unsigned char value) { -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic push -+#pragma GCC diagnostic ignored "-Wconversion" -+#endif -+ const unsigned char neg_one = (unsigned char) -1, const_zero = (unsigned char) 0; -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic pop -+#endif -+ const int is_unsigned = neg_one > const_zero; -+ if (is_unsigned) { -+ if (sizeof(unsigned char) < sizeof(long)) { -+ return PyInt_FromLong((long) value); -+ } else if (sizeof(unsigned char) <= sizeof(unsigned long)) { -+ return PyLong_FromUnsignedLong((unsigned long) value); -+#ifdef HAVE_LONG_LONG -+ } else if (sizeof(unsigned char) <= sizeof(unsigned PY_LONG_LONG)) { -+ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -+#endif -+ } -+ } else { -+ if (sizeof(unsigned char) <= sizeof(long)) { -+ return PyInt_FromLong((long) value); -+#ifdef HAVE_LONG_LONG -+ } else if (sizeof(unsigned char) <= sizeof(PY_LONG_LONG)) { -+ return PyLong_FromLongLong((PY_LONG_LONG) value); -+#endif -+ } -+ } -+ { -+ int one = 1; int little = (int)*(unsigned char *)&one; -+ unsigned char *bytes = (unsigned char *)&value; -+ return _PyLong_FromByteArray(bytes, sizeof(unsigned char), -+ little, !is_unsigned); -+ } -+} -+ - /* CIntFromPy */ - static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { -- const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0; -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic push -+#pragma GCC diagnostic ignored "-Wconversion" -+#endif -+ const long neg_one = (long) -1, const_zero = (long) 0; -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic pop -+#endif - const int is_unsigned = neg_one > const_zero; - #if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { -@@ -20218,9 +20220,92 @@ raise_neg_overflow: - return (long) -1; - } - -+/* CIntToPy */ -+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum____pyx_t_2wx_3svg_8_nanosvg_SVGpaintType(enum __pyx_t_2wx_3svg_8_nanosvg_SVGpaintType value) { -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic push -+#pragma GCC diagnostic ignored "-Wconversion" -+#endif -+ const enum __pyx_t_2wx_3svg_8_nanosvg_SVGpaintType neg_one = (enum __pyx_t_2wx_3svg_8_nanosvg_SVGpaintType) -1, const_zero = (enum __pyx_t_2wx_3svg_8_nanosvg_SVGpaintType) 0; -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic pop -+#endif -+ const int is_unsigned = neg_one > const_zero; -+ if (is_unsigned) { -+ if (sizeof(enum __pyx_t_2wx_3svg_8_nanosvg_SVGpaintType) < sizeof(long)) { -+ return PyInt_FromLong((long) value); -+ } else if (sizeof(enum __pyx_t_2wx_3svg_8_nanosvg_SVGpaintType) <= sizeof(unsigned long)) { -+ return PyLong_FromUnsignedLong((unsigned long) value); -+#ifdef HAVE_LONG_LONG -+ } else if (sizeof(enum __pyx_t_2wx_3svg_8_nanosvg_SVGpaintType) <= sizeof(unsigned PY_LONG_LONG)) { -+ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -+#endif -+ } -+ } else { -+ if (sizeof(enum __pyx_t_2wx_3svg_8_nanosvg_SVGpaintType) <= sizeof(long)) { -+ return PyInt_FromLong((long) value); -+#ifdef HAVE_LONG_LONG -+ } else if (sizeof(enum __pyx_t_2wx_3svg_8_nanosvg_SVGpaintType) <= sizeof(PY_LONG_LONG)) { -+ return PyLong_FromLongLong((PY_LONG_LONG) value); -+#endif -+ } -+ } -+ { -+ int one = 1; int little = (int)*(unsigned char *)&one; -+ unsigned char *bytes = (unsigned char *)&value; -+ return _PyLong_FromByteArray(bytes, sizeof(enum __pyx_t_2wx_3svg_8_nanosvg_SVGpaintType), -+ little, !is_unsigned); -+ } -+} -+ -+/* CIntToPy */ -+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value) { -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic push -+#pragma GCC diagnostic ignored "-Wconversion" -+#endif -+ const unsigned int neg_one = (unsigned int) -1, const_zero = (unsigned int) 0; -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic pop -+#endif -+ const int is_unsigned = neg_one > const_zero; -+ if (is_unsigned) { -+ if (sizeof(unsigned int) < sizeof(long)) { -+ return PyInt_FromLong((long) value); -+ } else if (sizeof(unsigned int) <= sizeof(unsigned long)) { -+ return PyLong_FromUnsignedLong((unsigned long) value); -+#ifdef HAVE_LONG_LONG -+ } else if (sizeof(unsigned int) <= sizeof(unsigned PY_LONG_LONG)) { -+ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -+#endif -+ } -+ } else { -+ if (sizeof(unsigned int) <= sizeof(long)) { -+ return PyInt_FromLong((long) value); -+#ifdef HAVE_LONG_LONG -+ } else if (sizeof(unsigned int) <= sizeof(PY_LONG_LONG)) { -+ return PyLong_FromLongLong((PY_LONG_LONG) value); -+#endif -+ } -+ } -+ { -+ int one = 1; int little = (int)*(unsigned char *)&one; -+ unsigned char *bytes = (unsigned char *)&value; -+ return _PyLong_FromByteArray(bytes, sizeof(unsigned int), -+ little, !is_unsigned); -+ } -+} -+ - /* CIntToPy */ - static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum____pyx_t_2wx_3svg_8_nanosvg_SVGfillRule(enum __pyx_t_2wx_3svg_8_nanosvg_SVGfillRule value) { -- const enum __pyx_t_2wx_3svg_8_nanosvg_SVGfillRule neg_one = (enum __pyx_t_2wx_3svg_8_nanosvg_SVGfillRule) ((enum __pyx_t_2wx_3svg_8_nanosvg_SVGfillRule) 0 - (enum __pyx_t_2wx_3svg_8_nanosvg_SVGfillRule) 1), const_zero = (enum __pyx_t_2wx_3svg_8_nanosvg_SVGfillRule) 0; -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic push -+#pragma GCC diagnostic ignored "-Wconversion" -+#endif -+ const enum __pyx_t_2wx_3svg_8_nanosvg_SVGfillRule neg_one = (enum __pyx_t_2wx_3svg_8_nanosvg_SVGfillRule) -1, const_zero = (enum __pyx_t_2wx_3svg_8_nanosvg_SVGfillRule) 0; -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic pop -+#endif - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(enum __pyx_t_2wx_3svg_8_nanosvg_SVGfillRule) < sizeof(long)) { -@@ -20251,7 +20336,14 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum____pyx_t_2wx_3svg_8_nanosvg - - /* CIntToPy */ - static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum____pyx_t_2wx_3svg_8_nanosvg_SVGflags(enum __pyx_t_2wx_3svg_8_nanosvg_SVGflags value) { -- const enum __pyx_t_2wx_3svg_8_nanosvg_SVGflags neg_one = (enum __pyx_t_2wx_3svg_8_nanosvg_SVGflags) ((enum __pyx_t_2wx_3svg_8_nanosvg_SVGflags) 0 - (enum __pyx_t_2wx_3svg_8_nanosvg_SVGflags) 1), const_zero = (enum __pyx_t_2wx_3svg_8_nanosvg_SVGflags) 0; -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic push -+#pragma GCC diagnostic ignored "-Wconversion" -+#endif -+ const enum __pyx_t_2wx_3svg_8_nanosvg_SVGflags neg_one = (enum __pyx_t_2wx_3svg_8_nanosvg_SVGflags) -1, const_zero = (enum __pyx_t_2wx_3svg_8_nanosvg_SVGflags) 0; -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic pop -+#endif - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(enum __pyx_t_2wx_3svg_8_nanosvg_SVGflags) < sizeof(long)) { -@@ -20282,7 +20374,14 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum____pyx_t_2wx_3svg_8_nanosvg - - /* CIntToPy */ - static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum____pyx_t_2wx_3svg_8_nanosvg_SVGlineCap(enum __pyx_t_2wx_3svg_8_nanosvg_SVGlineCap value) { -- const enum __pyx_t_2wx_3svg_8_nanosvg_SVGlineCap neg_one = (enum __pyx_t_2wx_3svg_8_nanosvg_SVGlineCap) ((enum __pyx_t_2wx_3svg_8_nanosvg_SVGlineCap) 0 - (enum __pyx_t_2wx_3svg_8_nanosvg_SVGlineCap) 1), const_zero = (enum __pyx_t_2wx_3svg_8_nanosvg_SVGlineCap) 0; -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic push -+#pragma GCC diagnostic ignored "-Wconversion" -+#endif -+ const enum __pyx_t_2wx_3svg_8_nanosvg_SVGlineCap neg_one = (enum __pyx_t_2wx_3svg_8_nanosvg_SVGlineCap) -1, const_zero = (enum __pyx_t_2wx_3svg_8_nanosvg_SVGlineCap) 0; -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic pop -+#endif - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(enum __pyx_t_2wx_3svg_8_nanosvg_SVGlineCap) < sizeof(long)) { -@@ -20313,7 +20412,14 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum____pyx_t_2wx_3svg_8_nanosvg - - /* CIntToPy */ - static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum____pyx_t_2wx_3svg_8_nanosvg_SVGlineJoin(enum __pyx_t_2wx_3svg_8_nanosvg_SVGlineJoin value) { -- const enum __pyx_t_2wx_3svg_8_nanosvg_SVGlineJoin neg_one = (enum __pyx_t_2wx_3svg_8_nanosvg_SVGlineJoin) ((enum __pyx_t_2wx_3svg_8_nanosvg_SVGlineJoin) 0 - (enum __pyx_t_2wx_3svg_8_nanosvg_SVGlineJoin) 1), const_zero = (enum __pyx_t_2wx_3svg_8_nanosvg_SVGlineJoin) 0; -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic push -+#pragma GCC diagnostic ignored "-Wconversion" -+#endif -+ const enum __pyx_t_2wx_3svg_8_nanosvg_SVGlineJoin neg_one = (enum __pyx_t_2wx_3svg_8_nanosvg_SVGlineJoin) -1, const_zero = (enum __pyx_t_2wx_3svg_8_nanosvg_SVGlineJoin) 0; -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic pop -+#endif - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(enum __pyx_t_2wx_3svg_8_nanosvg_SVGlineJoin) < sizeof(long)) { -@@ -20344,7 +20450,14 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum____pyx_t_2wx_3svg_8_nanosvg - - /* CIntToPy */ - static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum____pyx_t_2wx_3svg_8_nanosvg_SVGspreadType(enum __pyx_t_2wx_3svg_8_nanosvg_SVGspreadType value) { -- const enum __pyx_t_2wx_3svg_8_nanosvg_SVGspreadType neg_one = (enum __pyx_t_2wx_3svg_8_nanosvg_SVGspreadType) ((enum __pyx_t_2wx_3svg_8_nanosvg_SVGspreadType) 0 - (enum __pyx_t_2wx_3svg_8_nanosvg_SVGspreadType) 1), const_zero = (enum __pyx_t_2wx_3svg_8_nanosvg_SVGspreadType) 0; -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic push -+#pragma GCC diagnostic ignored "-Wconversion" -+#endif -+ const enum __pyx_t_2wx_3svg_8_nanosvg_SVGspreadType neg_one = (enum __pyx_t_2wx_3svg_8_nanosvg_SVGspreadType) -1, const_zero = (enum __pyx_t_2wx_3svg_8_nanosvg_SVGspreadType) 0; -+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -+#pragma GCC diagnostic pop -+#endif - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(enum __pyx_t_2wx_3svg_8_nanosvg_SVGspreadType) < sizeof(long)) { -@@ -20907,6 +21020,30 @@ PyObject *__Pyx_Coroutine_MethodReturn(CYTHON_UNUSED PyObject* gen, PyObject *re - } - return retval; - } -+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) -+static CYTHON_INLINE -+PyObject *__Pyx_PyGen_Send(PyGenObject *gen, PyObject *arg) { -+#if PY_VERSION_HEX <= 0x030A00A1 -+ return _PyGen_Send(gen, arg); -+#else -+ PyObject *result; -+ if (PyIter_Send((PyObject*)gen, arg ? arg : Py_None, &result) == PYGEN_RETURN) { -+ if (PyAsyncGen_CheckExact(gen)) { -+ assert(result == Py_None); -+ PyErr_SetNone(PyExc_StopAsyncIteration); -+ } -+ else if (result == Py_None) { -+ PyErr_SetNone(PyExc_StopIteration); -+ } -+ else { -+ _PyGen_SetStopIterationValue(result); -+ } -+ Py_CLEAR(result); -+ } -+ return result; -+#endif -+} -+#endif - static CYTHON_INLINE - PyObject *__Pyx_Coroutine_FinishDelegation(__pyx_CoroutineObject *gen) { - PyObject *ret; -@@ -20943,12 +21080,12 @@ static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value) { - #endif - #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) - if (PyGen_CheckExact(yf)) { -- ret = _PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); -+ ret = __Pyx_PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); - } else - #endif - #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03050000 && defined(PyCoro_CheckExact) && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) - if (PyCoro_CheckExact(yf)) { -- ret = _PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); -+ ret = __Pyx_PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); - } else - #endif - { -@@ -21032,7 +21169,7 @@ static PyObject *__Pyx_Generator_Next(PyObject *self) { - #endif - #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) - if (PyGen_CheckExact(yf)) { -- ret = _PyGen_Send((PyGenObject*)yf, NULL); -+ ret = __Pyx_PyGen_Send((PyGenObject*)yf, NULL); - } else - #endif - #ifdef __Pyx_Coroutine_USED -@@ -21192,6 +21329,7 @@ static int __Pyx_Coroutine_clear(PyObject *self) { - } - #endif - Py_CLEAR(gen->gi_code); -+ Py_CLEAR(gen->gi_frame); - Py_CLEAR(gen->gi_name); - Py_CLEAR(gen->gi_qualname); - Py_CLEAR(gen->gi_modulename); -@@ -21208,7 +21346,7 @@ static void __Pyx_Coroutine_dealloc(PyObject *self) { - if (PyObject_CallFinalizerFromDealloc(self)) - #else - Py_TYPE(gen)->tp_del(self); -- if (self->ob_refcnt > 0) -+ if (Py_REFCNT(self) > 0) - #endif - { - return; -@@ -21235,7 +21373,7 @@ static void __Pyx_Coroutine_del(PyObject *self) { - } - #if !CYTHON_USE_TP_FINALIZE - assert(self->ob_refcnt == 0); -- self->ob_refcnt = 1; -+ __Pyx_SET_REFCNT(self, 1); - #endif - __Pyx_PyThreadState_assign - __Pyx_ErrFetch(&error_type, &error_value, &error_traceback); -@@ -21302,17 +21440,17 @@ static void __Pyx_Coroutine_del(PyObject *self) { - } - __Pyx_ErrRestore(error_type, error_value, error_traceback); - #if !CYTHON_USE_TP_FINALIZE -- assert(self->ob_refcnt > 0); -+ assert(Py_REFCNT(self) > 0); - if (--self->ob_refcnt == 0) { - return; - } - { -- Py_ssize_t refcnt = self->ob_refcnt; -+ Py_ssize_t refcnt = Py_REFCNT(self); - _Py_NewReference(self); -- self->ob_refcnt = refcnt; -+ __Pyx_SET_REFCNT(self, refcnt); - } - #if CYTHON_COMPILING_IN_CPYTHON -- assert(PyType_IS_GC(self->ob_type) && -+ assert(PyType_IS_GC(Py_TYPE(self)) && - _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED); - _Py_DEC_REFTOTAL; - #endif -@@ -21378,6 +21516,27 @@ __Pyx_Coroutine_set_qualname(__pyx_CoroutineObject *self, PyObject *value, CYTHO - Py_XDECREF(tmp); - return 0; - } -+static PyObject * -+__Pyx_Coroutine_get_frame(__pyx_CoroutineObject *self, CYTHON_UNUSED void *context) -+{ -+ PyObject *frame = self->gi_frame; -+ if (!frame) { -+ if (unlikely(!self->gi_code)) { -+ Py_RETURN_NONE; -+ } -+ frame = (PyObject *) PyFrame_New( -+ PyThreadState_Get(), /*PyThreadState *tstate,*/ -+ (PyCodeObject*) self->gi_code, /*PyCodeObject *code,*/ -+ __pyx_d, /*PyObject *globals,*/ -+ 0 /*PyObject *locals*/ -+ ); -+ if (unlikely(!frame)) -+ return NULL; -+ self->gi_frame = frame; -+ } -+ Py_INCREF(frame); -+ return frame; -+} - static __pyx_CoroutineObject *__Pyx__Coroutine_New( - PyTypeObject* type, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure, - PyObject *name, PyObject *qualname, PyObject *module_name) { -@@ -21411,6 +21570,7 @@ static __pyx_CoroutineObject *__Pyx__Coroutine_NewInit( - gen->gi_modulename = module_name; - Py_XINCREF(code); - gen->gi_code = code; -+ gen->gi_frame = NULL; - PyObject_GC_Track(gen); - return gen; - } -@@ -21534,6 +21694,8 @@ static PyGetSetDef __pyx_Generator_getsets[] = { - (char*) PyDoc_STR("name of the generator"), 0}, - {(char *) "__qualname__", (getter)__Pyx_Coroutine_get_qualname, (setter)__Pyx_Coroutine_set_qualname, - (char*) PyDoc_STR("qualified name of the generator"), 0}, -+ {(char *) "gi_frame", (getter)__Pyx_Coroutine_get_frame, NULL, -+ (char*) PyDoc_STR("Frame of the generator"), 0}, - {0, 0, 0, 0, 0} - }; - static PyTypeObject __pyx_GeneratorType_type = { --- -2.33.0 - diff --git a/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/0001-sip-Conditionally-use-GetAssertStackTrace-under-USE_.patch b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/0001-sip-Conditionally-use-GetAssertStackTrace-under-USE_.patch new file mode 100644 index 0000000000..f8a3061ae0 --- /dev/null +++ b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/0001-sip-Conditionally-use-GetAssertStackTrace-under-USE_.patch @@ -0,0 +1,32 @@ +From b9f95c06b2e7a525f4f93d705976882e8dcba6ab Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Tue, 20 Dec 2022 09:46:31 -0800 +Subject: [PATCH] sip: Conditionally use GetAssertStackTrace under + USE_STACKWALKER + +Musl eg. does not implement stack walker ( backtrace ) therefore it gets +disabled for wxwidgets on those systems. This needs to be checked before using +GetAssertStackTrace() + +Upstream-Status: Pending +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + sip/cpp/sip_corewxAppTraits.cpp | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/sip/cpp/sip_corewxAppTraits.cpp b/sip/cpp/sip_corewxAppTraits.cpp +index 9c9f9d5b..1d2d2f90 100644 +--- a/sip/cpp/sip_corewxAppTraits.cpp ++++ b/sip/cpp/sip_corewxAppTraits.cpp +@@ -471,7 +471,11 @@ static PyObject *meth_wxAppTraits_GetAssertStackTrace(PyObject *sipSelf, PyObjec + PyErr_Clear(); + + Py_BEGIN_ALLOW_THREADS ++#if wxUSE_STACKWALKER + sipRes = new ::wxString((sipSelfWasArg ? sipCpp-> ::wxAppTraits::GetAssertStackTrace() : sipCpp->GetAssertStackTrace())); ++#else ++ sipRes = new ::wxString(""); ++#endif + Py_END_ALLOW_THREADS + + if (PyErr_Occurred()) diff --git a/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/not-overwrite-cflags-cxxflags.patch b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/not-overwrite-cflags-cxxflags.patch new file mode 100644 index 0000000000..67f7949b38 --- /dev/null +++ b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/not-overwrite-cflags-cxxflags.patch @@ -0,0 +1,28 @@ +Not overwrite CFLAGS and CXXFLAGS. It also avoid buildpaths qa issue: + + WARNING: python3-wxgtk4-4.2.0-r0 do_package_qa: QA Issue: File + /usr/lib64/python3.11/site-packages/wx/.debug/_xml.cpython-311-aarch64-linux-gnu.so + in package python3-wxgtk4-dbg contains reference to TMPDIR [buildpaths] + +Upstream-Status: Pending [oe specific] + +Signed-off-by: Kai Kang <kai.kang@windriver.com> +--- + wscript | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/wscript b/wscript +index 067b307..50d96d1 100644 +--- a/wscript ++++ b/wscript +@@ -195,8 +195,8 @@ def configure(conf): + cfg.finishSetup(conf.env.wx_config, conf.env.debug, + 'mingw32' if isWindows and not conf.env.use_msvc else None) + +- conf.env.CFLAGS = cfg.cflags[:] +- conf.env.CXXFLAGS = cfg.cxxflags[:] ++ #conf.env.CFLAGS = cfg.cflags[:] ++ #conf.env.CXXFLAGS = cfg.cxxflags[:] + conf.env.CFLAGS_WX = list() + conf.env.CXXFLAGS_WX = list() + conf.env.CFLAGS_WXPY = list() diff --git a/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/sip-fix-override-functions.patch b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/sip-fix-override-functions.patch deleted file mode 100644 index 51b9a462b1..0000000000 --- a/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/sip-fix-override-functions.patch +++ /dev/null @@ -1,35 +0,0 @@ -It fails to compile with errors: - -| ../../../../sip/cpp/sip_gridwxGridEvent.cpp:35:9: error: 'int sipwxGridEvent::GetRow()' - marked 'override', but does not override -| 35 | int GetRow() SIP_OVERRIDE; -| | ^~~~~~ -| ../../../../sip/cpp/sip_gridwxGridEvent.cpp:36:9: error: 'int sipwxGridEvent::GetCol()' - marked 'override', but does not over ride -| 36 | int GetCol() SIP_OVERRIDE; -| | ^~~~~~ - -Make these functions non-override. - -Upstream-Status: Pending - -Signed-off-by: Kai Kang <kai.kang@windriver.com> ---- - sip/cpp/sip_gridwxGridEvent.cpp | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/sip/cpp/sip_gridwxGridEvent.cpp b/sip/cpp/sip_gridwxGridEvent.cpp -index 0830b677..314aec94 100644 ---- a/sip/cpp/sip_gridwxGridEvent.cpp -+++ b/sip/cpp/sip_gridwxGridEvent.cpp -@@ -32,8 +32,8 @@ public: - * this class. - */ - protected: -- int GetRow() SIP_OVERRIDE; -- int GetCol() SIP_OVERRIDE; -+ int GetRow() ; -+ int GetCol() ; - ::wxEvent* Clone() const SIP_OVERRIDE; - ::wxEventCategory GetEventCategory() const SIP_OVERRIDE; - diff --git a/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4_4.1.1.bb b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4_4.2.1.bb index 4d739b86f7..fb011cb71b 100644 --- a/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4_4.1.1.bb +++ b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4_4.2.1.bb @@ -1,19 +1,21 @@ DESCRIPTION = "Python3 interface to the wxWidgets Cross-platform C++ GUI toolkit." HOMEPAGE = "http://www.wxpython.org" -LICENSE = "WXwindows" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=fce1d18e2d633d41786c0a8dfbc80917" +LICENSE = "LGPL-2.0-only & WXwindows" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=bdabf9e11191e2b9d3b6aef5f338ec00" -DEPENDS = "wxwidgets-native wxwidgets" +DEPENDS = "python3-attrdict3-native python3-six-native wxwidgets-native \ + wxwidgets \ + " PYPI_PACKAGE = "wxPython" SRC_URI += "file://add-back-option-build-base.patch \ - file://wxgtk-fixup-build-scripts.patch \ - file://sip-fix-override-functions.patch \ - file://0001-Update-Cython-version-to-fix-NanoSVG-issues-with-Pyt.patch \ - " -SRC_URI[sha256sum] = "00e5e3180ac7f2852f342ad341d57c44e7e4326de0b550b9a5c4a8361b6c3528" + file://wxgtk-fixup-build-scripts.patch \ + file://not-overwrite-cflags-cxxflags.patch \ + file://0001-sip-Conditionally-use-GetAssertStackTrace-under-USE_.patch \ + " +SRC_URI[sha256sum] = "e48de211a6606bf072ec3fa778771d6b746c00b7f4b970eb58728ddf56d13d5c" S = "${WORKDIR}/wxPython-${PV}" @@ -28,6 +30,7 @@ RDEPENDS:${PN} = "\ python3-image \ python3-numpy \ python3-pillow \ + python3-pip \ python3-pprint \ python3-pycairo \ python3-six \ diff --git a/meta-python/recipes-devtools/python3_oauth2client/python3-oauth2client_4.1.3.bb b/meta-python/recipes-devtools/python3_oauth2client/python3-oauth2client_4.1.3.bb new file mode 100644 index 0000000000..d87e289c5f --- /dev/null +++ b/meta-python/recipes-devtools/python3_oauth2client/python3-oauth2client_4.1.3.bb @@ -0,0 +1,19 @@ +DESCRIPTION = "OAuth 2.0 client library" + +HOMEPAGE = "http://github.com/google/oauth2client/" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=038e1390e94fe637991fa5569daa62bc" + +inherit pypi + +SRC_URI[sha256sum] = "d486741e451287f69568a4d26d70d9acd73a2bbfa275746c535b4209891cccc6" + +RDEPENDS:${PN} += " \ + python3-httplib2 \ + python3-pyasn1 \ + python3-pyasn1-modules \ + python3-rsa \ + python3-six \ + " + +inherit setuptools3 diff --git a/meta-python/recipes-extended/python-blivet/python3-blivet/0002-run_program-support-timeout.patch b/meta-python/recipes-extended/python-blivet/python3-blivet/0002-run_program-support-timeout.patch index 5b388599bf..d277e8b0f7 100644 --- a/meta-python/recipes-extended/python-blivet/python3-blivet/0002-run_program-support-timeout.patch +++ b/meta-python/recipes-extended/python-blivet/python3-blivet/0002-run_program-support-timeout.patch @@ -1,4 +1,4 @@ -From 713cf821ebe17f9e1771502a85e0905ea04dafae Mon Sep 17 00:00:00 2001 +From 8a18a6c1dea7cce6669d0eeb4230e85aa88d8e44 Mon Sep 17 00:00:00 2001 From: Hongxu Jia <hongxu.jia@windriver.com> Date: Fri, 23 Nov 2018 17:03:58 +0800 Subject: [PATCH 02/11] run_program support timeout @@ -7,14 +7,14 @@ Upstream-Status: Pending Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> --- - blivet/util.py | 70 ++++++++++++++++++++++++++++++++++------------------------ + blivet/util.py | 70 +++++++++++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 29 deletions(-) diff --git a/blivet/util.py b/blivet/util.py -index 4eac8b9..4f05076 100644 +index f8a8f88..a5da7b6 100644 --- a/blivet/util.py +++ b/blivet/util.py -@@ -158,6 +158,30 @@ class Path(str): +@@ -171,6 +171,30 @@ class Path(str): def __hash__(self): return self._path.__hash__() @@ -45,7 +45,7 @@ index 4eac8b9..4f05076 100644 def _run_program(argv, root='/', stdin=None, env_prune=None, stderr_to_stdout=False, binary_output=False): if env_prune is None: -@@ -180,35 +204,23 @@ def _run_program(argv, root='/', stdin=None, env_prune=None, stderr_to_stdout=Fa +@@ -193,35 +217,23 @@ def _run_program(argv, root='/', stdin=None, env_prune=None, stderr_to_stdout=Fa stderr_dir = subprocess.STDOUT else: stderr_dir = subprocess.PIPE @@ -98,6 +98,3 @@ index 4eac8b9..4f05076 100644 def run_program(*args, **kwargs): --- -2.7.4 - diff --git a/meta-python/recipes-extended/python-blivet/python3-blivet/0003-support-infinit-timeout.patch b/meta-python/recipes-extended/python-blivet/python3-blivet/0003-support-infinit-timeout.patch index 861b2cdd46..8ab65a3e22 100644 --- a/meta-python/recipes-extended/python-blivet/python3-blivet/0003-support-infinit-timeout.patch +++ b/meta-python/recipes-extended/python-blivet/python3-blivet/0003-support-infinit-timeout.patch @@ -1,4 +1,4 @@ -From 5d5436dfa3bdde7b4e87ce5a40cbc724199847d6 Mon Sep 17 00:00:00 2001 +From 112b825541f498762f373cfc9918e444dda74095 Mon Sep 17 00:00:00 2001 From: Hongxu Jia <hongxu.jia@windriver.com> Date: Mon, 8 May 2017 16:18:02 +0800 Subject: [PATCH 03/11] support infinit timeout @@ -11,10 +11,10 @@ Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/blivet/util.py b/blivet/util.py -index 4f05076..7e89949 100644 +index a5da7b6..58117ae 100644 --- a/blivet/util.py +++ b/blivet/util.py -@@ -158,6 +158,7 @@ class Path(str): +@@ -171,6 +171,7 @@ class Path(str): def __hash__(self): return self._path.__hash__() @@ -22,7 +22,7 @@ index 4f05076..7e89949 100644 def timeout_command(argv, timeout, *args, **kwargs): """call shell-command and either return its output or kill it if it doesn't normally exit within timeout seconds and return None""" -@@ -169,7 +170,7 @@ def timeout_command(argv, timeout, *args, **kwargs): +@@ -182,7 +183,7 @@ def timeout_command(argv, timeout, *args, **kwargs): while proc.poll() is None: time.sleep(0.1) now = datetime.datetime.now() @@ -31,7 +31,7 @@ index 4f05076..7e89949 100644 os.kill(proc.pid, signal.SIGKILL) os.waitpid(-1, os.WNOHANG) program_log.debug("%d seconds timeout" % timeout) -@@ -183,7 +184,7 @@ def timeout_command(argv, timeout, *args, **kwargs): +@@ -196,7 +197,7 @@ def timeout_command(argv, timeout, *args, **kwargs): program_log.debug("Return code: %d", proc.returncode) return (proc.returncode, proc.stdout.read()) @@ -40,7 +40,7 @@ index 4f05076..7e89949 100644 if env_prune is None: env_prune = [] -@@ -192,7 +193,10 @@ def _run_program(argv, root='/', stdin=None, env_prune=None, stderr_to_stdout=Fa +@@ -205,7 +206,10 @@ def _run_program(argv, root='/', stdin=None, env_prune=None, stderr_to_stdout=Fa os.chroot(root) with program_log_lock: # pylint: disable=not-context-manager @@ -52,7 +52,7 @@ index 4f05076..7e89949 100644 env = os.environ.copy() env.update({"LC_ALL": "C", -@@ -205,7 +209,7 @@ def _run_program(argv, root='/', stdin=None, env_prune=None, stderr_to_stdout=Fa +@@ -218,7 +222,7 @@ def _run_program(argv, root='/', stdin=None, env_prune=None, stderr_to_stdout=Fa else: stderr_dir = subprocess.PIPE @@ -61,6 +61,3 @@ index 4f05076..7e89949 100644 stdin=stdin, stdout=subprocess.PIPE, stderr=stderr_dir, --- -2.7.4 - diff --git a/meta-python/recipes-extended/python-blivet/python3-blivet/0004-fix-new.roots-object-is-not-iterable.patch b/meta-python/recipes-extended/python-blivet/python3-blivet/0004-fix-new.roots-object-is-not-iterable.patch deleted file mode 100644 index 526a3b1fb2..0000000000 --- a/meta-python/recipes-extended/python-blivet/python3-blivet/0004-fix-new.roots-object-is-not-iterable.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 3bb8d08bdec2f79bb13c0a44b81718d26e5bdabc Mon Sep 17 00:00:00 2001 -From: Hongxu Jia <hongxu.jia@windriver.com> -Date: Mon, 8 May 2017 16:30:20 +0800 -Subject: [PATCH 04/11] fix new.roots object is not iterable - -Upstream-Status: Pending - -Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> ---- - blivet/blivet.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/blivet/blivet.py b/blivet/blivet.py -index ea08837..91c92b2 100644 ---- a/blivet/blivet.py -+++ b/blivet/blivet.py -@@ -1206,7 +1206,7 @@ class Blivet(object): - p = partition.disk.format.parted_disk.getPartitionByPath(partition.path) - partition.parted_partition = p - -- for root in new.roots: -+ for root in new.roots or []: - root.swaps = [new.devicetree.get_device_by_id(d.id, hidden=True) for d in root.swaps] - root.swaps = [s for s in root.swaps if s] - --- -2.7.4 - diff --git a/meta-python/recipes-extended/python-blivet/python3-blivet/0005-fix-incorrect-timeout-while-system-time-changed.patch b/meta-python/recipes-extended/python-blivet/python3-blivet/0005-fix-incorrect-timeout-while-system-time-changed.patch index 9c5d53b430..795e4f1206 100644 --- a/meta-python/recipes-extended/python-blivet/python3-blivet/0005-fix-incorrect-timeout-while-system-time-changed.patch +++ b/meta-python/recipes-extended/python-blivet/python3-blivet/0005-fix-incorrect-timeout-while-system-time-changed.patch @@ -1,4 +1,4 @@ -From f783b9b00da5df176fcd7927b752f574ca6db319 Mon Sep 17 00:00:00 2001 +From c645c83628b2290855cbd225e13c038ab75a7f74 Mon Sep 17 00:00:00 2001 From: Hongxu Jia <hongxu.jia@windriver.com> Date: Fri, 26 Aug 2016 02:02:49 -0400 Subject: [PATCH 05/11] fix incorrect timeout while system time changed @@ -22,10 +22,10 @@ Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/blivet/util.py b/blivet/util.py -index 7e89949..5571e73 100644 +index 58117ae..5bc5804 100644 --- a/blivet/util.py +++ b/blivet/util.py -@@ -163,14 +163,14 @@ def timeout_command(argv, timeout, *args, **kwargs): +@@ -176,14 +176,14 @@ def timeout_command(argv, timeout, *args, **kwargs): """call shell-command and either return its output or kill it if it doesn't normally exit within timeout seconds and return None""" import subprocess, datetime, os, time, signal @@ -43,6 +43,3 @@ index 7e89949..5571e73 100644 os.kill(proc.pid, signal.SIGKILL) os.waitpid(-1, os.WNOHANG) program_log.debug("%d seconds timeout" % timeout) --- -2.7.4 - diff --git a/meta-python/recipes-extended/python-blivet/python3-blivet/0006-tweak-btrfs-packages.patch b/meta-python/recipes-extended/python-blivet/python3-blivet/0006-tweak-btrfs-packages.patch index 2e53a64777..6c53f03db1 100644 --- a/meta-python/recipes-extended/python-blivet/python3-blivet/0006-tweak-btrfs-packages.patch +++ b/meta-python/recipes-extended/python-blivet/python3-blivet/0006-tweak-btrfs-packages.patch @@ -1,7 +1,7 @@ -From 8932ae933f2b6acf5e98c9956beff69ae430eed2 Mon Sep 17 00:00:00 2001 +From b55b1023f8f1ad3121928eb9d0ee9902f5474752 Mon Sep 17 00:00:00 2001 From: Hongxu Jia <hongxu.jia@windriver.com> Date: Mon, 8 May 2017 16:33:15 +0800 -Subject: [PATCH 06/11] tweak btrfs packages +Subject: [PATCH] tweak btrfs packages In oe-cre/yocto, we name btrfs package with btrfs-tools, rather than btrfs-progs. @@ -15,10 +15,10 @@ Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/blivet/devices/btrfs.py b/blivet/devices/btrfs.py -index cada940..7e4d4b8 100644 +index c446e7e..37c183e 100644 --- a/blivet/devices/btrfs.py +++ b/blivet/devices/btrfs.py -@@ -55,7 +55,7 @@ class BTRFSDevice(StorageDevice): +@@ -58,7 +58,7 @@ class BTRFSDevice(StorageDevice): """ Base class for BTRFS volume and sub-volume devices. """ _type = "btrfs" @@ -28,10 +28,10 @@ index cada940..7e4d4b8 100644 def __init__(self, *args, **kwargs): diff --git a/blivet/formats/fs.py b/blivet/formats/fs.py -index 81e367f..55e5d57 100644 +index 1e102b6..f16941e 100644 --- a/blivet/formats/fs.py +++ b/blivet/formats/fs.py -@@ -926,7 +926,7 @@ class BTRFS(FS): +@@ -1050,7 +1050,7 @@ class BTRFS(FS): _formattable = True _linux_native = True _supported = True @@ -40,6 +40,3 @@ index 81e367f..55e5d57 100644 _min_size = Size("256 MiB") _max_size = Size("16 EiB") _mkfs_class = fsmkfs.BTRFSMkfs --- -2.7.4 - diff --git a/meta-python/recipes-extended/python-blivet/python3-blivet/0007-invoking-mount-with-infinite-timeout.patch b/meta-python/recipes-extended/python-blivet/python3-blivet/0007-invoking-mount-with-infinite-timeout.patch index b2606d7699..809f4e1584 100644 --- a/meta-python/recipes-extended/python-blivet/python3-blivet/0007-invoking-mount-with-infinite-timeout.patch +++ b/meta-python/recipes-extended/python-blivet/python3-blivet/0007-invoking-mount-with-infinite-timeout.patch @@ -1,4 +1,4 @@ -From f53481dc4a56b8a996628733553e080bb0aafdd7 Mon Sep 17 00:00:00 2001 +From f159d71d742ace5640c7810bcc27365f8fde95a3 Mon Sep 17 00:00:00 2001 From: Hongxu Jia <hongxu.jia@windriver.com> Date: Fri, 23 Nov 2018 17:07:22 +0800 Subject: [PATCH 07/11] invoking mount with infinite timeout @@ -14,10 +14,10 @@ Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blivet/util.py b/blivet/util.py -index 5571e73..02c8033 100644 +index 5bc5804..9de77e1 100644 --- a/blivet/util.py +++ b/blivet/util.py -@@ -258,7 +258,7 @@ def mount(device, mountpoint, fstype, options=None): +@@ -271,7 +271,7 @@ def mount(device, mountpoint, fstype, options=None): makedirs(mountpoint) argv = ["mount", "-t", fstype, "-o", options, device, mountpoint] @@ -26,6 +26,3 @@ index 5571e73..02c8033 100644 def umount(mountpoint): --- -2.7.4 - diff --git a/meta-python/recipes-extended/python-blivet/python3-blivet/0008-use-oe-variable-to-replace-hardcoded-dir.patch b/meta-python/recipes-extended/python-blivet/python3-blivet/0008-use-oe-variable-to-replace-hardcoded-dir.patch index 1e8bcac47e..d3ab8f8526 100644 --- a/meta-python/recipes-extended/python-blivet/python3-blivet/0008-use-oe-variable-to-replace-hardcoded-dir.patch +++ b/meta-python/recipes-extended/python-blivet/python3-blivet/0008-use-oe-variable-to-replace-hardcoded-dir.patch @@ -1,4 +1,4 @@ -From 12e2579333258d1a690f8718e91b0f217078e886 Mon Sep 17 00:00:00 2001 +From 6a85945c060154581f5a129a6a946258bf9333c4 Mon Sep 17 00:00:00 2001 From: Hongxu Jia <hongxu.jia@windriver.com> Date: Mon, 8 May 2017 03:54:12 -0400 Subject: [PATCH 08/11] use oe variable to replace hardcoded dir @@ -15,10 +15,10 @@ Signed-off-by: Kai Kang <kai.kang@windriver.com> 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/setup.py b/setup.py -index b745a79..b5b4258 100644 +index e6bb3f3..700085b 100644 --- a/setup.py +++ b/setup.py -@@ -61,10 +61,10 @@ class blivet_sdist(sdist): +@@ -73,10 +73,10 @@ class blivet_sdist(sdist): data_files = [ @@ -33,6 +33,3 @@ index b745a79..b5b4258 100644 ] --- -2.7.4 - diff --git a/meta-python/recipes-extended/python-blivet/python3-blivet/0010-invoking-mkfs-with-infinite-timeout.patch b/meta-python/recipes-extended/python-blivet/python3-blivet/0010-invoking-mkfs-with-infinite-timeout.patch index c441acd173..394a818aa2 100644 --- a/meta-python/recipes-extended/python-blivet/python3-blivet/0010-invoking-mkfs-with-infinite-timeout.patch +++ b/meta-python/recipes-extended/python-blivet/python3-blivet/0010-invoking-mkfs-with-infinite-timeout.patch @@ -1,4 +1,4 @@ -From 33844f6773a676bd57240954e402ae9a843663a4 Mon Sep 17 00:00:00 2001 +From abadd821acffd5dbc870f86dad3c3a6bf3f2f74f Mon Sep 17 00:00:00 2001 From: Hongxu Jia <hongxu.jia@windriver.com> Date: Fri, 16 Jun 2017 15:43:00 +0800 Subject: [PATCH 10/11] invoking mkfs with infinite timeout @@ -18,10 +18,10 @@ Signed-off-by: Kai Kang <kai.kang@windriver.com> 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blivet/tasks/fsmkfs.py b/blivet/tasks/fsmkfs.py -index e4a6aaa8..9730f7e5 100644 +index e9daa9e..2174cc3 100644 --- a/blivet/tasks/fsmkfs.py +++ b/blivet/tasks/fsmkfs.py -@@ -203,7 +203,7 @@ class FSMkfs(task.BasicApplication, FSMkfsTask): +@@ -207,7 +207,7 @@ class FSMkfs(task.BasicApplication, FSMkfsTask): options = options or [] cmd = self._mkfs_command(options, label, set_uuid, nodiscard) try: @@ -30,6 +30,3 @@ index e4a6aaa8..9730f7e5 100644 except OSError as e: raise FSError(e) --- -2.7.4 - diff --git a/meta-python/recipes-extended/python-blivet/python3-blivet/0011-invoking-dd-with-infinite-timeout.patch b/meta-python/recipes-extended/python-blivet/python3-blivet/0011-invoking-dd-with-infinite-timeout.patch index 13c2933f0a..ea4cffa9b3 100644 --- a/meta-python/recipes-extended/python-blivet/python3-blivet/0011-invoking-dd-with-infinite-timeout.patch +++ b/meta-python/recipes-extended/python-blivet/python3-blivet/0011-invoking-dd-with-infinite-timeout.patch @@ -1,7 +1,7 @@ -From 21ca2b859a49e96a230d55a7866dfc7ed5d1366c Mon Sep 17 00:00:00 2001 +From 5ee527fab06f9d33b162a6cd0c068d7b3ac2ecb0 Mon Sep 17 00:00:00 2001 From: Hongxu Jia <hongxu.jia@windriver.com> Date: Tue, 6 Mar 2018 17:28:56 +0800 -Subject: [PATCH 11/11] invoking dd with infinite timeout +Subject: [PATCH] invoking dd with infinite timeout This large timeout is needed when running on machines with lots of disks, or with slow disks. @@ -14,10 +14,10 @@ Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blivet/devices/partition.py b/blivet/devices/partition.py -index 623e1c9..141d8ad 100644 +index 2d67be8..a4cf9a0 100644 --- a/blivet/devices/partition.py +++ b/blivet/devices/partition.py -@@ -618,7 +618,7 @@ class PartitionDevice(StorageDevice): +@@ -677,7 +677,7 @@ class PartitionDevice(StorageDevice): cmd = ["dd", "if=/dev/zero", "of=%s" % device, "bs=%d" % bs, "seek=%d" % start, "count=%d" % count] try: @@ -26,6 +26,3 @@ index 623e1c9..141d8ad 100644 except OSError as e: log.error(str(e)) finally: --- -2.7.4 - diff --git a/meta-python/recipes-extended/python-blivet/python3-blivet_3.4.3.bb b/meta-python/recipes-extended/python-blivet/python3-blivet_3.9.2.bb index bd57604f26..f0ce981480 100644 --- a/meta-python/recipes-extended/python-blivet/python3-blivet_3.4.3.bb +++ b/meta-python/recipes-extended/python-blivet/python3-blivet_3.9.2.bb @@ -8,7 +8,6 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263" SRC_URI += "\ file://0002-run_program-support-timeout.patch \ file://0003-support-infinit-timeout.patch \ - file://0004-fix-new.roots-object-is-not-iterable.patch \ file://0005-fix-incorrect-timeout-while-system-time-changed.patch \ file://0006-tweak-btrfs-packages.patch \ file://0007-invoking-mount-with-infinite-timeout.patch \ @@ -17,16 +16,16 @@ SRC_URI += "\ file://0010-invoking-mkfs-with-infinite-timeout.patch \ file://0011-invoking-dd-with-infinite-timeout.patch \ " -SRC_URI[sha256sum] = "1b05b77f3ee35d82c7a577a168c9ba0204d3e9a87eb1975e5f9af47700eeff48" +SRC_URI[sha256sum] = "9d97e37ebba01db28a1e6155cbd71c54fb55e9c2be5921982dc85bed316d8cfe" inherit pypi features_check systemd setuptools3_legacy REQUIRED_DISTRO_FEATURES = "systemd" RDEPENDS:${PN} += "python3-pykickstart python3-pyudev \ - parted python3-pyparted multipath-tools \ - lsof cryptsetup libblockdev \ - libbytesize \ + parted python3-pyparted multipath-tools \ + lsof cryptsetup libblockdev \ + libbytesize \ " FILES:${PN} += " \ diff --git a/meta-python/recipes-extended/python-blivet/python3-blivetgui/0001-Use-setuptools-instead-of-distutils-in-setup.py.patch b/meta-python/recipes-extended/python-blivet/python3-blivetgui/0001-Use-setuptools-instead-of-distutils-in-setup.py.patch deleted file mode 100644 index c88912bfa0..0000000000 --- a/meta-python/recipes-extended/python-blivet/python3-blivetgui/0001-Use-setuptools-instead-of-distutils-in-setup.py.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 54014061be2fed20d6c35aba9719ea70a9fea9ea Mon Sep 17 00:00:00 2001 -From: Vojtech Trefny <vtrefny@redhat.com> -Date: Wed, 1 Sep 2021 08:59:19 +0200 -Subject: [PATCH] Use setuptools instead of distutils in setup.py - -The distutils module is deprecated and will be removed in Python -3.12. - -Upstream-Status: Backport [https://github.com/kraj/blivet-gui/commit/54014061be2fed20d6c35aba9719ea70a9fea9ea] ---- - setup.py | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/setup.py b/setup.py -index aa8ef57..77849a1 100644 ---- a/setup.py -+++ b/setup.py -@@ -1,7 +1,7 @@ - from __future__ import print_function - --from distutils.core import setup --from distutils.command.sdist import sdist -+from setuptools import setup -+from setuptools.command.sdist import sdist - import glob - import sys - --- -2.35.1 - diff --git a/meta-python/recipes-extended/python-blivet/python3-blivetgui/0002-Use-symbolic-list-add-and-edit-icons.patch b/meta-python/recipes-extended/python-blivet/python3-blivetgui/0002-Use-symbolic-list-add-and-edit-icons.patch deleted file mode 100644 index 3a95859ad7..0000000000 --- a/meta-python/recipes-extended/python-blivet/python3-blivetgui/0002-Use-symbolic-list-add-and-edit-icons.patch +++ /dev/null @@ -1,56 +0,0 @@ -Upstream-Status: Backport [https://github.com/storaged-project/blivet-gui/commit/eb8ec968] - -Signed-off-by: Kai Kang <kai.kang@windriver.com> - -From eb8ec968d1ee8b4b710568b1eb8536296f90751e Mon Sep 17 00:00:00 2001 -From: Adam Williamson <awilliam@redhat.com> -Date: Thu, 17 Feb 2022 11:16:22 -0800 -Subject: [PATCH] Use symbolic list-add and edit- icons (Adwaita dropped old - ones) - -adwaita-icon-theme 42 no longer includes the non-symbolic icons -for these names. The choices are to switch to symbolic ones or -carry the non-symbolic ones downstream. - -Signed-off-by: Adam Williamson <awilliam@redhat.com> ---- - blivetgui/list_actions.py | 8 ++++---- - blivetgui/processing_window.py | 6 +++--- - 2 files changed, 7 insertions(+), 7 deletions(-) - -diff --git a/blivetgui/list_actions.py b/blivetgui/list_actions.py -index b7c1f9c..5388feb 100644 ---- a/blivetgui/list_actions.py -+++ b/blivetgui/list_actions.py -@@ -48,10 +48,10 @@ def __init__(self, blivet_gui): - self.blivet_gui = blivet_gui - - icon_theme = Gtk.IconTheme.get_default() # pylint: disable=no-value-for-parameter -- icon_add = Gtk.IconTheme.load_icon(icon_theme, "list-add", 16, 0) -- icon_delete = Gtk.IconTheme.load_icon(icon_theme, "edit-delete", 16, 0) -- icon_edit = Gtk.IconTheme.load_icon(icon_theme, "edit-select-all", 16, 0) -- icon_misc = Gtk.IconTheme.load_icon(icon_theme, "edit-paste", 16, 0) -+ icon_add = Gtk.IconTheme.load_icon(icon_theme, "list-add-symbolic", 16, 0) -+ icon_delete = Gtk.IconTheme.load_icon(icon_theme, "edit-delete-symbolic", 16, 0) -+ icon_edit = Gtk.IconTheme.load_icon(icon_theme, "edit-select-all-symbolic", 16, 0) -+ icon_misc = Gtk.IconTheme.load_icon(icon_theme, "edit-paste-symbolic", 16, 0) - - self.action_icons = {"add": icon_add, "delete": icon_delete, "edit": icon_edit, - "misc": icon_misc} -diff --git a/blivetgui/processing_window.py b/blivetgui/processing_window.py -index c400f90..a020ae8 100644 ---- a/blivetgui/processing_window.py -+++ b/blivetgui/processing_window.py -@@ -93,9 +93,9 @@ def add_action_view(self): - """ - - icon_theme = Gtk.IconTheme.get_default() # pylint: disable=no-value-for-parameter -- icon_add = Gtk.IconTheme.load_icon(icon_theme, "list-add", 16, 0) -- icon_delete = Gtk.IconTheme.load_icon(icon_theme, "edit-delete", 16, 0) -- icon_edit = Gtk.IconTheme.load_icon(icon_theme, "edit-select-all", 16, 0) -+ icon_add = Gtk.IconTheme.load_icon(icon_theme, "list-add-symbolic", 16, 0) -+ icon_delete = Gtk.IconTheme.load_icon(icon_theme, "edit-delete-symbolic", 16, 0) -+ icon_edit = Gtk.IconTheme.load_icon(icon_theme, "edit-select-all-symbolic", 16, 0) - - actions_list = Gtk.ListStore(GdkPixbuf.Pixbuf, str, GdkPixbuf.Pixbuf) - diff --git a/meta-python/recipes-extended/python-blivet/python3-blivetgui_2.3.0.bb b/meta-python/recipes-extended/python-blivet/python3-blivetgui_2.5.0.bb index 29e7a267d2..124f36c6e0 100644 --- a/meta-python/recipes-extended/python-blivet/python3-blivetgui_2.3.0.bb +++ b/meta-python/recipes-extended/python-blivet/python3-blivetgui_2.5.0.bb @@ -5,27 +5,17 @@ SECTION = "devel/python" LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263" -S = "${WORKDIR}/git" -B = "${S}" - -SRCREV = "42512ee48494cee71febf04078d9774f0146a085" -SRC_URI = "git://github.com/storaged-project/blivet-gui.git;branch=master;protocol=https \ - file://0001-Use-setuptools-instead-of-distutils-in-setup.py.patch \ - file://0002-Use-symbolic-list-add-and-edit-icons.patch \ - " +SRC_URI = "git://github.com/storaged-project/blivet-gui.git;branch=main;protocol=https" +SRCREV = "626b44610a30ad26734dd20642538caab5a9178a" -inherit features_check -REQUIRED_DISTRO_FEATURES = "x11 systemd" - -inherit setuptools3_legacy python3native +S = "${WORKDIR}/git" -PIP_INSTALL_PACKAGE = "blivet_gui" +inherit features_check setuptools3 +REQUIRED_DISTRO_FEATURES = "x11 systemd gobject-introspection-data" RDEPENDS:${PN} = "python3-pygobject python3 \ python3-blivet gtk+3 \ python3-pid libreport \ " -FILES:${PN} += " \ - ${datadir}/* \ - " +FILES:${PN} += "${datadir}/*" diff --git a/meta-python/recipes-extended/python-cson/python3-cson/0001-setup.py-Do-not-poke-at-git-describe-to-find-version.patch b/meta-python/recipes-extended/python-cson/python3-cson/0001-setup.py-Do-not-poke-at-git-describe-to-find-version.patch new file mode 100644 index 0000000000..dc3f8657ec --- /dev/null +++ b/meta-python/recipes-extended/python-cson/python3-cson/0001-setup.py-Do-not-poke-at-git-describe-to-find-version.patch @@ -0,0 +1,40 @@ +From 0d0ffab004306b1379f247016200ade381d1d181 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Wed, 8 Feb 2023 23:03:47 -0800 +Subject: [PATCH] setup.py: Do not poke at git describe to find version + +OE uses git snapshot and git describe --tags will emit a string which is +not PEP440 compliant version scheme. setuptools 67+ is strict about it +and fails to build. Therefore inject a static version.py from OE +environment and use that for version number based on PV + +Upstream-Status: Pending +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + setup.py | 10 ++-------- + 1 file changed, 2 insertions(+), 8 deletions(-) + +diff --git a/setup.py b/setup.py +index a77138f..df675cd 100644 +--- a/setup.py ++++ b/setup.py +@@ -28,14 +28,8 @@ def main(): + # Also, when git is not available (PyPi package), use stored version.py. + version_py = os.path.join(os.path.dirname(__file__), 'version.py') + +- try: +- if sys.version_info < (2, 7) or (3,) <= sys.version_info < (3, 2): +- version_git = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE).communicate()[0] +- else: +- version_git = subprocess.check_output(["git", "describe", "--tags"]).rstrip() +- except: +- with open(version_py, 'r') as fh: +- version_git = open(version_py).read().strip().split('=')[-1].replace('"','') ++ with open(version_py, 'r') as fh: ++ version_git = open(version_py).read().strip().split('=')[-1].replace('"','') + + version_msg = "# Do not edit this file, pipeline versioning is governed by git tags" + with open(version_py, 'w') as fh: +-- +2.39.1 + diff --git a/meta-python/recipes-extended/python-cson/python3-cson_git.bb b/meta-python/recipes-extended/python-cson/python3-cson_git.bb index c4fcc61ec0..489733c767 100644 --- a/meta-python/recipes-extended/python-cson/python3-cson_git.bb +++ b/meta-python/recipes-extended/python-cson/python3-cson_git.bb @@ -7,17 +7,20 @@ LICENSE = "MIT" SECTION = "devel/python" LIC_FILES_CHKSUM = "file://LICENSE;md5=7709d2635e63ab96973055a23c2a4cac" -SRCREV = "f3f2898c44bb16b951d3e9f2fbf6d1c4158edda2" -SRC_URI = "git://github.com/gt3389b/python-cson.git;branch=master;protocol=https" +PV = "1.0.9+1.0.10" +SRCREV = "69090778bccc5ed124342ba288597fbb2bfa9f39" +SRC_URI = "git://github.com/gt3389b/python-cson.git;branch=master;protocol=https \ + file://0001-setup.py-Do-not-poke-at-git-describe-to-find-version.patch" S = "${WORKDIR}/git" -RDEPENDS:${PN}:class-native = "" -DEPENDS:append:class-native = " python-native " +RDEPENDS:${PN} = "python3-json" inherit setuptools3 -PIP_INSTALL_PACKAGE = "python_cson" +do_configure:prepend() { + echo "__version__=${PV}" > ${S}/version.py +} BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-extended/python-meh/python3-meh/0001-setup.py-switch-from-distutils-to-setuptools.patch b/meta-python/recipes-extended/python-meh/python3-meh/0001-setup.py-switch-from-distutils-to-setuptools.patch deleted file mode 100644 index 2eb6be5a18..0000000000 --- a/meta-python/recipes-extended/python-meh/python3-meh/0001-setup.py-switch-from-distutils-to-setuptools.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 034ac41561409ffc7836683331b6b94a641436e4 Mon Sep 17 00:00:00 2001 -From: Tim Orling <tim.orling@konsulko.com> -Date: Mon, 28 Feb 2022 09:41:02 -0800 -Subject: [PATCH] setup.py: switch from distutils to setuptools - -In Python 3.10 'distutils' is deprecated with removal slated for Python -3.12. Switch from 'distutils.core' to 'setuptools'. - -This also allows for a 'wheel' binary archive format to be built with -'setup.py bdist_wheel'. - -Upstream-Status: Backport [cf9eafdd165347f86bb4a2534c41fd805db52322] - -Signed-off-by: Tim Orling <tim.orling@konsulko.com> - ---- - setup.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/setup.py b/setup.py -index 9c12180..3ba5195 100644 ---- a/setup.py -+++ b/setup.py -@@ -1,6 +1,6 @@ - #!/usr/bin/python3 - --from distutils.core import setup -+from setuptools import setup - - setup(name='python-meh', version='0.50.1', - description='Python module for handling exceptions', diff --git a/meta-python/recipes-extended/python-meh/python3-meh_0.50.1.bb b/meta-python/recipes-extended/python-meh/python3-meh_0.51.bb index 1d9af438da..e83514af1b 100644 --- a/meta-python/recipes-extended/python-meh/python3-meh_0.50.1.bb +++ b/meta-python/recipes-extended/python-meh/python3-meh_0.51.bb @@ -9,9 +9,8 @@ inherit setuptools3_legacy S = "${WORKDIR}/git" -SRC_URI = "git://github.com/rhinstaller/python-meh.git;protocol=https;branch=rhel9-branch \ - file://0001-setup.py-switch-from-distutils-to-setuptools.patch \ - " -SRCREV = "c321ce22950aff76611a3c6beffa02b5ea3adbed" +SRC_URI = "git://github.com/rhinstaller/python-meh.git;protocol=https;branch=master" + +SRCREV = "eb5d4adc3b838704b6a68f0f77ada2063a11ab1b" FILES:${PN} += "${datadir}/python-meh" diff --git a/meta-python/recipes-extended/python-pyephem/python3-pyephem_4.1.3.bb b/meta-python/recipes-extended/python-pyephem/python3-pyephem_4.1.5.bb index 29697bc251..8c9262afb8 100644 --- a/meta-python/recipes-extended/python-pyephem/python3-pyephem_4.1.3.bb +++ b/meta-python/recipes-extended/python-pyephem/python3-pyephem_4.1.5.bb @@ -4,13 +4,13 @@ HOMEPAGE = "http://rhodesmill.org/pyephem/" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=9c930b395b435b00bb13ec83b0c99f40" -SRC_URI[sha256sum] = "7fa18685981ba528edd504052a9d5212a09aa5bf15c11a734edc6a86e8a8b56a" +SRC_URI[sha256sum] = "0c64a8aa401574c75942045b9af70d1656e14c5366151c0cbb400cbeedc2362a" PYPI_PACKAGE = "ephem" inherit pypi setuptools3 RDEPENDS:${PN} += "\ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-math \ + python3-datetime \ + python3-math \ " diff --git a/meta-python/recipes-extended/python-pykickstart/files/0001-support-authentication-for-kickstart.patch b/meta-python/recipes-extended/python-pykickstart/files/0001-support-authentication-for-kickstart.patch index 5f95d74bf1..309a00122a 100644 --- a/meta-python/recipes-extended/python-pykickstart/files/0001-support-authentication-for-kickstart.patch +++ b/meta-python/recipes-extended/python-pykickstart/files/0001-support-authentication-for-kickstart.patch @@ -9,18 +9,17 @@ we support basic/digest authentication. Add KickstartAuthError to report authentication failure, which the invoker could parse this specific error. -Upstream-Status: inappropriate [oe specific] +Upstream-Status: Inappropriate [oe specific] Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> - --- pykickstart/errors.py | 17 +++++++++++++++++ - pykickstart/load.py | 34 ++++++++++++++++++++++++++++------ + pykickstart/load.py | 32 +++++++++++++++++++++++++++----- pykickstart/parser.py | 4 ++-- - 3 files changed, 47 insertions(+), 8 deletions(-) + 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/pykickstart/errors.py b/pykickstart/errors.py -index 8294f59a..3d20bf82 100644 +index 8294f59..3d20bf8 100644 --- a/pykickstart/errors.py +++ b/pykickstart/errors.py @@ -32,6 +32,9 @@ This module exports several exception classes: @@ -52,16 +51,15 @@ index 8294f59a..3d20bf82 100644 + def __str__(self): + return self.value diff --git a/pykickstart/load.py b/pykickstart/load.py -index 30e2fcfa..b984876d 100644 +index eb76b65..f51cf08 100644 --- a/pykickstart/load.py +++ b/pykickstart/load.py -@@ -18,9 +18,12 @@ +@@ -18,9 +18,11 @@ # with the express permission of Red Hat, Inc. # import requests +from requests.auth import HTTPDigestAuth +from requests.auth import HTTPBasicAuth -+ import shutil -from pykickstart.errors import KickstartError @@ -69,7 +67,7 @@ index 30e2fcfa..b984876d 100644 from pykickstart.i18n import _ from requests.exceptions import SSLError, RequestException -@@ -28,7 +31,7 @@ _is_url = lambda location: '://' in location # RFC 3986 +@@ -28,7 +30,7 @@ is_url = lambda location: '://' in location # RFC 3986 SSL_VERIFY = True @@ -78,21 +76,20 @@ index 30e2fcfa..b984876d 100644 '''Load a destination URL or file into a string. Type of input is inferred automatically. -@@ -39,7 +42,7 @@ def load_to_str(location): +@@ -39,7 +41,7 @@ def load_to_str(location): Raises: KickstartError on error reading''' - if _is_url(location): + if is_url(location): - return _load_url(location) + return _load_url(location, user=user, passwd=passwd) else: return _load_file(location) -@@ -69,11 +72,30 @@ def load_to_file(location, destination): +@@ -69,11 +71,31 @@ def load_to_file(location, destination): _copy_file(location, destination) return destination -def _load_url(location): -- '''Load a location (URL or filename) and return contents as string''' +def _get_auth(location, user=None, passwd=None): + + auth = None @@ -101,7 +98,7 @@ index 30e2fcfa..b984876d 100644 + if user is None or passwd is None: + log.info("Require Authentication") + raise KickstartAuthError("Require Authentication.\nAppend 'ksuser=<username> kspasswd=<password>' to boot command") - ++ + reasons = request.headers.get("WWW-Authenticate", "").split() + if reasons: + auth_type = reasons[0] @@ -113,8 +110,9 @@ index 30e2fcfa..b984876d 100644 + return auth + +def _load_url(location, user=None, passwd=None): -+ '''Load a location (URL or filename) and return contents as string''' + '''Load a location (URL or filename) and return contents as string''' + auth = _get_auth(location, user=user, passwd=passwd) + try: - request = requests.get(location, verify=SSL_VERIFY) + request = requests.get(location, verify=SSL_VERIFY, auth=auth) @@ -122,10 +120,10 @@ index 30e2fcfa..b984876d 100644 raise KickstartError(_('Error securely accessing URL "%s"') % location + ': {e}'.format(e=str(e))) except RequestException as e: diff --git a/pykickstart/parser.py b/pykickstart/parser.py -index b23e54f1..e10f06b5 100644 +index 7edf8aa..46c5299 100644 --- a/pykickstart/parser.py +++ b/pykickstart/parser.py -@@ -796,7 +796,7 @@ class KickstartParser(object): +@@ -790,7 +790,7 @@ class KickstartParser(object): i = PutBackIterator(s.splitlines(True) + [""]) self._stateMachine(i) @@ -134,7 +132,7 @@ index b23e54f1..e10f06b5 100644 """Process a kickstart file, given by the filename f.""" if reset: self._reset() -@@ -817,7 +817,7 @@ class KickstartParser(object): +@@ -811,7 +811,7 @@ class KickstartParser(object): self.currentdir[self._includeDepth] = cd try: @@ -143,3 +141,6 @@ index b23e54f1..e10f06b5 100644 except KickstartError as e: raise KickstartError(_("Unable to open input kickstart file: %s") % str(e), lineno=0) +-- +2.34.1 + diff --git a/meta-python/recipes-extended/python-pykickstart/files/0002-pykickstart-parser.py-add-lock-for-readKickstart-and.patch b/meta-python/recipes-extended/python-pykickstart/files/0002-pykickstart-parser.py-add-lock-for-readKickstart-and.patch index 4a001f3386..f5483db825 100644 --- a/meta-python/recipes-extended/python-pykickstart/files/0002-pykickstart-parser.py-add-lock-for-readKickstart-and.patch +++ b/meta-python/recipes-extended/python-pykickstart/files/0002-pykickstart-parser.py-add-lock-for-readKickstart-and.patch @@ -1,7 +1,7 @@ From 62fdead139edb0f29b2f222efcb8f39be15b057e Mon Sep 17 00:00:00 2001 From: Hongxu Jia <hongxu.jia@windriver.com> Date: Mon, 30 Jul 2018 15:47:13 +0800 -Subject: [PATCH 2/4] pykickstart/parser.py: add lock for readKickstart and +Subject: [PATCH 2/4] pykickstart/parser.py: add lock for readKickstart and support https without certification - Add lock for readKickstart to fix race issue @@ -9,18 +9,21 @@ Subject: [PATCH 2/4] pykickstart/parser.py: add lock for readKickstart and - Support to download kickstart file through https without certification Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> +Signed-off-by: Wang Mingyu <wangmy@fujitsu.com> --- +Upstream-Status: Pending + pykickstart/load.py | 2 +- pykickstart/parser.py | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/pykickstart/load.py b/pykickstart/load.py -index c6f013f..7adb751 100644 +index 8da8051..e856c8d 100644 --- a/pykickstart/load.py +++ b/pykickstart/load.py -@@ -30,7 +30,7 @@ from requests.exceptions import SSLError, RequestException +@@ -32,7 +32,7 @@ log = logging.getLogger("anaconda.main") - _is_url = lambda location: '://' in location # RFC 3986 + is_url = lambda location: '://' in location # RFC 3986 -SSL_VERIFY = True +SSL_VERIFY = False @@ -28,10 +31,10 @@ index c6f013f..7adb751 100644 def load_to_str(location, user=None, passwd=None): '''Load a destination URL or file into a string. diff --git a/pykickstart/parser.py b/pykickstart/parser.py -index e44099b..e68174d 100644 +index b95ba90..a55a9a3 100644 --- a/pykickstart/parser.py +++ b/pykickstart/parser.py -@@ -55,6 +55,20 @@ from pykickstart.i18n import _ +@@ -51,6 +51,20 @@ from pykickstart.i18n import _ STATE_END = "end" STATE_COMMANDS = "commands" @@ -52,7 +55,7 @@ index e44099b..e68174d 100644 def _preprocessStateMachine(lineIter): l = None lineno = 0 -@@ -788,6 +802,10 @@ class KickstartParser(object): +@@ -791,6 +805,10 @@ class KickstartParser(object): self._stateMachine(i) def readKickstart(self, f, reset=True, username=None, password=None): @@ -64,5 +67,5 @@ index e44099b..e68174d 100644 if reset: self._reset() -- -2.7.4 +2.34.1 diff --git a/meta-python/recipes-extended/python-pykickstart/files/0003-comment-out-sections-shutdown-and-environment-in-gen.patch b/meta-python/recipes-extended/python-pykickstart/files/0003-comment-out-sections-shutdown-and-environment-in-gen.patch index 7ab7346860..6242e23b9c 100644 --- a/meta-python/recipes-extended/python-pykickstart/files/0003-comment-out-sections-shutdown-and-environment-in-gen.patch +++ b/meta-python/recipes-extended/python-pykickstart/files/0003-comment-out-sections-shutdown-and-environment-in-gen.patch @@ -6,7 +6,7 @@ Subject: [PATCH 3/4] comment out sections shutdown and environment in Both of them is disabled by default. -Upstream-Status: Inappropriate[oe specific] +Upstream-Status: Inappropriate [oe specific] Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> diff --git a/meta-python/recipes-extended/python-pykickstart/files/0004-load.py-retry-to-invoke-request-with-timeout.patch b/meta-python/recipes-extended/python-pykickstart/files/0004-load.py-retry-to-invoke-request-with-timeout.patch index bf5a197230..abe2c87e00 100644 --- a/meta-python/recipes-extended/python-pykickstart/files/0004-load.py-retry-to-invoke-request-with-timeout.patch +++ b/meta-python/recipes-extended/python-pykickstart/files/0004-load.py-retry-to-invoke-request-with-timeout.patch @@ -8,22 +8,21 @@ network, it failed and wait 300s to break, we should retry to invoke request with timeout explicitly. So if it the network is up, the fetch works. -Upstream-Status: inappropriate [oe specific] +Upstream-Status: Inappropriate [oe specific] Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> - --- pykickstart/load.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/pykickstart/load.py b/pykickstart/load.py -index f75fe5d3..a8f3ed1d 100644 +index 58faba6..e856c8d 100644 --- a/pykickstart/load.py +++ b/pykickstart/load.py -@@ -21,12 +21,16 @@ import requests +@@ -20,12 +20,16 @@ + import requests from requests.auth import HTTPDigestAuth from requests.auth import HTTPBasicAuth - +import time import shutil @@ -34,10 +33,10 @@ index f75fe5d3..a8f3ed1d 100644 +import logging +log = logging.getLogger("anaconda.main") + - _is_url = lambda location: '://' in location # RFC 3986 + is_url = lambda location: '://' in location # RFC 3986 SSL_VERIFY = False -@@ -72,6 +76,29 @@ def load_to_file(location, destination): +@@ -71,6 +75,29 @@ def load_to_file(location, destination): _copy_file(location, destination) return destination @@ -67,7 +66,7 @@ index f75fe5d3..a8f3ed1d 100644 def _get_auth(location, user=None, passwd=None): auth = None -@@ -93,6 +120,10 @@ def _get_auth(location, user=None, passwd=None): +@@ -92,6 +119,10 @@ def _get_auth(location, user=None, passwd=None): def _load_url(location, user=None, passwd=None): '''Load a location (URL or filename) and return contents as string''' @@ -76,5 +75,8 @@ index f75fe5d3..a8f3ed1d 100644 + raise KickstartError(_("Connection %s failed" % location)) + auth = _get_auth(location, user=user, passwd=passwd) + try: - request = requests.get(location, verify=SSL_VERIFY, auth=auth) +-- +2.34.1 + diff --git a/meta-python/recipes-extended/python-pykickstart/python3-pykickstart_3.34.bb b/meta-python/recipes-extended/python-pykickstart/python3-pykickstart_3.48.bb index 6bf9ada581..953068f7c3 100644 --- a/meta-python/recipes-extended/python-pykickstart/python3-pykickstart_3.34.bb +++ b/meta-python/recipes-extended/python-pykickstart/python3-pykickstart_3.48.bb @@ -18,10 +18,8 @@ SRC_URI = "git://github.com/rhinstaller/pykickstart.git;protocol=https;branch=ma file://0003-comment-out-sections-shutdown-and-environment-in-gen.patch \ file://0004-load.py-retry-to-invoke-request-with-timeout.patch \ " -SRCREV = "bfd836cfdd8439d984595aca015811ed5c6be733" +SRCREV = "fa6c80c0e5c6bee29d089899a10d26e6f7f8afd8" UPSTREAM_CHECK_GITTAGREGEX = "r(?P<pver>\d+(\.\d+)+(-\d+)*)" inherit setuptools3 -PIP_INSTALL_PACKAGE = "pykickstart" -PIP_INSTALL_DIST_PATH = "${S}/dist" diff --git a/meta-python/recipes-extended/python-pyparted/python3-pyparted_3.12.0.bb b/meta-python/recipes-extended/python-pyparted/python3-pyparted_3.12.0.bb index 9dd362766d..7a0d3987d2 100644 --- a/meta-python/recipes-extended/python-pyparted/python3-pyparted_3.12.0.bb +++ b/meta-python/recipes-extended/python-pyparted/python3-pyparted_3.12.0.bb @@ -17,7 +17,10 @@ DEPENDS += "parted" RDEPENDS:${PN}:class-target += " \ parted (>= 2.3) \ - python3-stringold python3-codecs python3-math \ + python3-codecs \ + python3-math \ + python3-numbers \ + python3-stringold \ " RDEPENDS:${PN}:class-native = "" diff --git a/meta-python/recipes-extended/python-rich/python3-rich_13.7.0.bb b/meta-python/recipes-extended/python-rich/python3-rich_13.7.0.bb new file mode 100644 index 0000000000..959f0d51aa --- /dev/null +++ b/meta-python/recipes-extended/python-rich/python3-rich_13.7.0.bb @@ -0,0 +1,15 @@ +SUMMARY = "Rich is a Python library for rich text and beautiful formatting in the terminal" +DESCRIPTION = "The Rich API makes it easy to add color and style to terminal output. \ +Rich can also render pretty tables, progress bars, markdown, syntax highlighted source code, \ +tracebacks, and more." +HOMEPAGE="https://github.com/Textualize/rich" +SECTION = "devel/python" +LICENSE = "MIT" + +LIC_FILES_CHKSUM = "file://LICENSE;md5=b5f0b94fbc94f5ad9ae4efcf8a778303" + +SRC_URI[sha256sum] = "5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa" + +inherit pypi python_poetry_core + +RDEPENDS:${PN} = "python3-pygments" diff --git a/meta-python/recipes-extended/python3-portalocker/python3-portalocker/run-ptest b/meta-python/recipes-extended/python3-portalocker/python3-portalocker/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-extended/python3-portalocker/python3-portalocker/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-extended/python3-portalocker/python3-portalocker_2.5.1.bb b/meta-python/recipes-extended/python3-portalocker/python3-portalocker_2.5.1.bb deleted file mode 100644 index 55037d1ebd..0000000000 --- a/meta-python/recipes-extended/python3-portalocker/python3-portalocker_2.5.1.bb +++ /dev/null @@ -1,16 +0,0 @@ -SUMMARY = "Cross-platform locking library" -DESCRIPTION = "Portalocker is a library to provide an easy API to file locking" -LICENSE = "PSF-2.0" - -LIC_FILES_CHKSUM = "file://LICENSE;md5=f9273424c73af966635d66eb53487e14" - -SRC_URI[sha256sum] = "ae8e9cc2660da04bf41fa1a0eef7e300bb5e4a5869adfb1a6d8551632b559b2b" - -inherit pypi setuptools3 - -BBCLASSEXTEND = "native nativesdk" - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-fcntl \ - ${PYTHON_PN}-logging \ -" diff --git a/meta-python/recipes-extended/python3-portalocker/python3-portalocker_2.8.2.bb b/meta-python/recipes-extended/python3-portalocker/python3-portalocker_2.8.2.bb new file mode 100644 index 0000000000..c45a3fcda2 --- /dev/null +++ b/meta-python/recipes-extended/python3-portalocker/python3-portalocker_2.8.2.bb @@ -0,0 +1,36 @@ +SUMMARY = "Cross-platform locking library" +DESCRIPTION = "Portalocker is a library to provide an easy API to file locking" +LICENSE = "BSD-3-Clause" + +LIC_FILES_CHKSUM = "file://LICENSE;md5=152634da660a374ca18c0734ed07c63c" + +SRC_URI[sha256sum] = "2b035aa7828e46c58e9b31390ee1f169b98e1066ab10b9a6a861fe7e25ee4f33" + +DEPENDS += "python3-setuptools-scm-native" + +inherit pypi python_setuptools_build_meta ptest + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-multiprocessing \ + python3-pytest \ + python3-redis \ + python3-unittest-automake-output \ + redis \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/portalocker_tests/* ${D}${PTEST_PATH}/tests/ + rm -rf ${D}${PTEST_PATH}/tests/test_combined.py +} + +RDEPENDS:${PN} += " \ + python3-fcntl \ + python3-logging \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-extended/python3-pydot/python3-pydot_1.4.2.bb b/meta-python/recipes-extended/python3-pydot/python3-pydot_2.0.0.bb index fde1029c74..f0a6abd733 100644 --- a/meta-python/recipes-extended/python3-pydot/python3-pydot_1.4.2.bb +++ b/meta-python/recipes-extended/python3-pydot/python3-pydot_2.0.0.bb @@ -4,7 +4,7 @@ HOMEPAGE = "https://github.com/pydot/pydot" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=3f6fa041dfcc7ff7747cfceaa34a3180" -SRC_URI[sha256sum] = "248081a39bcb56784deb018977e428605c1c758f10897a339fce1dd728ff007d" +SRC_URI[sha256sum] = "60246af215123fa062f21cd791be67dda23a6f280df09f68919e637a1e4f3235" inherit pypi setuptools3 diff --git a/meta-python/recipes-extended/pywbem/python3-pywbem_1.4.1.bb b/meta-python/recipes-extended/pywbem/python3-pywbem_1.7.2.bb index 210d64320e..1fdcc98ca7 100644 --- a/meta-python/recipes-extended/pywbem/python3-pywbem_1.4.1.bb +++ b/meta-python/recipes-extended/pywbem/python3-pywbem_1.7.2.bb @@ -16,36 +16,36 @@ HOMEPAGE = "http://pywbem.github.io" LICENSE = "LGPL-2.1-only" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=fbc093901857fcd118f065f900982c24" -SRC_URI[sha256sum] = "ad8bbbe4ab7e795722c0f27f2656c92fc673a7e06a14cd151a50f0306454d17e" +SRC_URI[sha256sum] = "dc3b785840017f5fcb6381c56682598cebbfc8451851768f85e2318a84e06b68" inherit pypi setuptools3 update-alternatives DEPENDS += " \ - ${PYTHON_PN}-ply-native \ - ${PYTHON_PN}-pyyaml-native \ - ${PYTHON_PN}-six-native \ - ${PYTHON_PN}-wheel-native \ + python3-ply-native \ + python3-pyyaml-native \ + python3-six-native \ + python3-wheel-native \ " -RDEPENDS:${PN}:class-target += "\ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-ply \ - ${PYTHON_PN}-pyyaml \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-stringold \ - ${PYTHON_PN}-threading \ - ${PYTHON_PN}-unixadmin \ - ${PYTHON_PN}-xml \ - ${PYTHON_PN}-nocasedict \ - ${PYTHON_PN}-nocaselist \ - ${PYTHON_PN}-yamlloader \ +RDEPENDS:${PN} += "\ + python3-datetime \ + python3-io \ + python3-logging \ + python3-netclient \ + python3-nocasedict \ + python3-nocaselist \ + python3-ply \ + python3-pyyaml \ + python3-requests \ + python3-six \ + python3-stringold \ + python3-threading \ + python3-unixadmin \ + python3-xml \ + python3-yamlloader \ " ALTERNATIVE:${PN} = "mof_compiler" ALTERNATIVE_TARGET[mof_compiler] = "${bindir}/mof_compiler" ALTERNATIVE_PRIORITY = "60" - -BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-extended/pywbemtools/python3-pywbemtools_1.0.0.bb b/meta-python/recipes-extended/pywbemtools/python3-pywbemtools_1.0.0.bb deleted file mode 100644 index 3a9f0ad6fd..0000000000 --- a/meta-python/recipes-extended/pywbemtools/python3-pywbemtools_1.0.0.bb +++ /dev/null @@ -1,39 +0,0 @@ -SUMMARY = "A set of tools using pywbem" -DESCRIPTION = "A set of tools using pywbem to communicate with WBEM servers" -HOMEPAGE = "https://pywbemtools.readthedocs.io/en/stable/" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=e23fadd6ceef8c618fc1c65191d846fa" - -SRC_URI[sha256sum] = "0af7e067e0c0ba32cc19c2c2dc67875c591b806c4b49480ebe46e37bfb399684" - -inherit pypi setuptools3 - -DEPENDS += " \ - ${PYTHON_PN}-pyyaml-native \ - ${PYTHON_PN}-pywbem-native \ - ${PYTHON_PN}-six-native \ - ${PYTHON_PN}-click-native \ -" - -RDEPENDS:${PN}:class-target += "\ - ${PYTHON_PN}-ply \ - ${PYTHON_PN}-pyyaml \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-pywbem \ - ${PYTHON_PN}-click \ - ${PYTHON_PN}-requests \ - ${PYTHON_PN}-prompt-toolkit \ - ${PYTHON_PN}-mock \ - ${PYTHON_PN}-packaging \ - ${PYTHON_PN}-nocasedict \ - ${PYTHON_PN}-yamlloader \ - ${PYTHON_PN}-click-repl \ - ${PYTHON_PN}-click-spinner \ - ${PYTHON_PN}-asciitree \ - ${PYTHON_PN}-tabulate \ - ${PYTHON_PN}-pydicti \ - ${PYTHON_PN}-nocaselist \ - ${PYTHON_PN}-custom-inherit \ -" - -BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-extended/pywbemtools/python3-pywbemtools_1.3.0.bb b/meta-python/recipes-extended/pywbemtools/python3-pywbemtools_1.3.0.bb new file mode 100644 index 0000000000..127aa8b4a3 --- /dev/null +++ b/meta-python/recipes-extended/pywbemtools/python3-pywbemtools_1.3.0.bb @@ -0,0 +1,32 @@ +SUMMARY = "A set of tools using pywbem" +DESCRIPTION = "A set of tools using pywbem to communicate with WBEM servers" +HOMEPAGE = "https://pywbemtools.readthedocs.io/en/stable/" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=e23fadd6ceef8c618fc1c65191d846fa" + +SRC_URI[sha256sum] = "9d0162b74c0b34d4500c099dddfe518cadc295a1a7bfb0abefa740a134d80fea" + +inherit pypi setuptools3 + +RDEPENDS:${PN}:class-target += "\ + python3-ply \ + python3-pyyaml \ + python3-six \ + python3-pywbem \ + python3-click \ + python3-requests \ + python3-prompt-toolkit \ + python3-mock \ + python3-packaging \ + python3-nocasedict \ + python3-yamlloader \ + python3-click-repl \ + python3-click-spinner \ + python3-asciitree \ + python3-tabulate \ + python3-pydicti \ + python3-nocaselist \ + python3-custom-inherit \ +" + +BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-extended/send2trash/python3-send2trash_1.8.0.bb b/meta-python/recipes-extended/send2trash/python3-send2trash_1.8.0.bb deleted file mode 100644 index 963351a2e2..0000000000 --- a/meta-python/recipes-extended/send2trash/python3-send2trash_1.8.0.bb +++ /dev/null @@ -1,9 +0,0 @@ -SUMMARY = "Send file to trash natively under Mac OS X, Windows and Linux" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=a02659c2d5f4cc626e4dcf6504b865eb" - -inherit pypi setuptools3 - -SRC_URI[sha256sum] = "d2c24762fd3759860a0aff155e45871447ea58d2be6bdd39b5c8f966a0c99c2d" - -PYPI_PACKAGE = "Send2Trash" diff --git a/meta-python/recipes-extended/send2trash/python3-send2trash_1.8.3.bb b/meta-python/recipes-extended/send2trash/python3-send2trash_1.8.3.bb new file mode 100644 index 0000000000..0bbfb9a11f --- /dev/null +++ b/meta-python/recipes-extended/send2trash/python3-send2trash_1.8.3.bb @@ -0,0 +1,14 @@ +SUMMARY = "Send file to trash natively under Mac OS X, Windows and Linux" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=05faa35ba1ca10b723f19d286c9d5237" + +inherit pypi python_setuptools_build_meta + +SRC_URI[sha256sum] = "b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf" + +PYPI_PACKAGE = "Send2Trash" + +RDEPENDS:${PN} += "\ + python3-io \ + python3-datetime \ +" diff --git a/meta-python/recipes-extended/tuna/tuna_0.19.bb b/meta-python/recipes-extended/tuna/tuna_0.19.bb new file mode 100644 index 0000000000..ea0f157921 --- /dev/null +++ b/meta-python/recipes-extended/tuna/tuna_0.19.bb @@ -0,0 +1,24 @@ +SUMMARY = "cui/gui tool for tuning of running processes" +HOMEPAGE = "https://rt.wiki.kernel.org/index.php/Tuna" +LICENSE = "GPL-2.0-only" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" + +SRC_URI = "git://git.kernel.org/pub/scm/utils/tuna/tuna.git;branch=main" + +SRCREV = "b972b8ce386c29bcbcd45029a617db3db9e5b6ca" + +S = "${WORKDIR}/git" + +RDEPENDS:${PN} += " \ + python3-io \ + python3-linux-procfs \ + python3-logging \ + python3-six \ + " + +inherit setuptools3 + +do_install:append() { + install -m 0755 -d ${D}${bindir} + install -m 0755 ${S}/tuna-cmd.py ${D}${bindir}/tuna +} diff --git a/meta-python/recipes-networking/python/python3-ldap_3.4.2.bb b/meta-python/recipes-networking/python/python3-ldap_3.4.4.bb index 44a3d00d8b..6caf5f37ce 100644 --- a/meta-python/recipes-networking/python/python3-ldap_3.4.2.bb +++ b/meta-python/recipes-networking/python/python3-ldap_3.4.4.bb @@ -13,7 +13,7 @@ PYPI_PACKAGE = "python-ldap" inherit pypi setuptools3 -SRC_URI[sha256sum] = "b16470a0983aaf09a00ffb8f40b69a2446f3d0be639a229256bce381fcb268f7" +SRC_URI[sha256sum] = "7edb0accec4e037797705f3a05cbf36a9fde50d08c8f67f2aef99a2628fab828" do_configure:prepend() { sed -i -e 's:^library_dirs =.*::' \ @@ -22,8 +22,9 @@ do_configure:prepend() { } RDEPENDS:${PN} = " \ - ${PYTHON_PN}-pprint \ - ${PYTHON_PN}-threading \ - ${PYTHON_PN}-pyasn1 \ - ${PYTHON_PN}-pyasn1-modules \ + python3-pprint \ + python3-pyasn1 \ + python3-pyasn1-modules \ + python3-threading \ + python3-unittest \ " |