diff options
Diffstat (limited to 'meta-python/recipes-devtools')
976 files changed, 23349 insertions, 6918 deletions
diff --git a/meta-python/recipes-devtools/gyp/gyp_git.bb b/meta-python/recipes-devtools/gyp/gyp_git.bb index d668d1ca10..6ac4228a8b 100644 --- a/meta-python/recipes-devtools/gyp/gyp_git.bb +++ b/meta-python/recipes-devtools/gyp/gyp_git.bb @@ -4,11 +4,12 @@ LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=ab828cb8ce4c62ee82945a11247b6bbd" SECTION = "devel" -SRC_URI = "git://chromium.googlesource.com/external/gyp;protocol=https" -SRCREV = "caa60026e223fc501e8b337fd5086ece4028b1c6" +SRC_URI = "git://chromium.googlesource.com/external/gyp;protocol=https;branch=master \ + " +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 8ce95a5d02..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 798daeb212..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" @@ -12,25 +11,25 @@ inherit pypi setuptools3 PACKAGES =+ "${PN}-tests ${PN}-samples" -FILES_${PN}-samples += " \ +FILES:${PN}-samples += " \ ${PYTHON_SITEPACKAGES_DIR}/rtm/samples \ " -FILES_${PN}-tests += " \ +FILES:${PN}-tests += " \ ${PYTHON_SITEPACKAGES_DIR}/rtm/tests \ " -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-netclient \ +RDEPENDS:${PN} += "\ + python3-json \ + python3-logging \ + python3-netclient \ " -RDEPENDS_${PN}-samples += " \ +RDEPENDS:${PN}-samples += " \ ${PN} \ " -RDEPENDS_${PN}-tests += " \ +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 e4f03b937d..28eb84c563 100644 --- a/meta-python/recipes-devtools/python/python-django-south.inc +++ b/meta-python/recipes-devtools/python/python-django-south.inc @@ -12,6 +12,6 @@ inherit pypi BBCLASSEXTEND = "native nativesdk" -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-django \ +RDEPENDS:${PN} += "\ + python3-django \ " diff --git a/meta-python/recipes-devtools/python/python-django.inc b/meta-python/recipes-devtools/python/python-django.inc index c02b3fa522..d9ab3fd21f 100644 --- a/meta-python/recipes-devtools/python/python-django.inc +++ b/meta-python/recipes-devtools/python/python-django.inc @@ -8,27 +8,26 @@ inherit pypi UPSTREAM_CHECK_REGEX = "(?P<pver>\d+(\.\d+)+)/" -FILES_${PN} += "${datadir}/django" +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 \ +RDEPENDS:${PN} += "\ + 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 0723b97383..24c76ce942 100644 --- a/meta-python/recipes-devtools/python/python-flask-bootstrap.inc +++ b/meta-python/recipes-devtools/python/python-flask-bootstrap.inc @@ -1,5 +1,5 @@ DESCRIPTION = "An extension that includes Bootstrap in your project, without any boilerplate code." -LICENSE = "BSD" +LICENSE = "Apache-2.0 & MIT & BSD-3-Clause" LIC_FILES_CHKSUM = "file://PKG-INFO;md5=a03749709f06118a17349deb5a210619" SRC_URI[md5sum] = "e40d50f5c5b6438c1c6200a6f2871f81" @@ -7,8 +7,8 @@ SRC_URI[sha256sum] = "cb08ed940183f6343a64e465e83b3a3f13c53e1baabb8d72b5da4545ef PYPI_PACKAGE = "Flask-Bootstrap" -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-dominate \ - ${PYTHON_PN}-flask \ - ${PYTHON_PN}-visitor \ +RDEPENDS:${PN} += "\ + 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 f48af8bc9e..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 ff4e70a53c..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 48ff7149c6..8434d2610b 100644 --- a/meta-python/recipes-devtools/python/python-flask-xstatic.inc +++ b/meta-python/recipes-devtools/python/python-flask-xstatic.inc @@ -5,12 +5,12 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=659968f6ebd4b70b6c3190d20b4a924c" SRC_URI[md5sum] = "2f56023e1444c8bd1fec41afe93de743" SRC_URI[sha256sum] = "226ea8e97065a9488b59bfe5c94af4c6e2ea70a25052e301fb231a1381490133" -FILESEXTRAPATHS_prepend := "${THISDIR}/python-flask-xstatic:" +FILESEXTRAPATHS:prepend := "${THISDIR}/python-flask-xstatic:" SRC_URI += "file://remove-pip-requires.patch" PYPI_PACKAGE = "Flask-XStatic" -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-flask \ - ${PYTHON_PN}-xstatic \ +RDEPENDS:${PN} += "\ + 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-gevent/libev-conf.patch b/meta-python/recipes-devtools/python/python-gevent/libev-conf.patch deleted file mode 100644 index 79c1867ba7..0000000000 --- a/meta-python/recipes-devtools/python/python-gevent/libev-conf.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 2294734ef9d5e2efb05820e9759a1635799bdea9 Mon Sep 17 00:00:00 2001 -From: Andrej Rode <andrej.rode@ettus.com> -Date: Mon, 10 Apr 2017 19:25:18 -0700 -Subject: [PATCH] libev: make configure crosscompile compatible - -Signed-off-by: Andrej Rode <andrej.rode@ettus.com> ---- - deps/libev/configure | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/deps/libev/configure b/deps/libev/configure -index 743817e..96c2366 100755 ---- a/deps/libev/configure -+++ b/deps/libev/configure -@@ -2208,7 +2208,7 @@ fi - ac_ext=c - ac_cpp='$CPP $CPPFLAGS' - ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' --ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -+ac_link='$CC -static -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' - ac_compiler_gnu=$ac_cv_c_compiler_gnu - - --- -2.10.2 - 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-m2crypto.inc b/meta-python/recipes-devtools/python/python-m2crypto.inc deleted file mode 100644 index 797a0354bf..0000000000 --- a/meta-python/recipes-devtools/python/python-m2crypto.inc +++ /dev/null @@ -1,63 +0,0 @@ -SUMMARY = "A Python crypto and SSL toolkit" -HOMEPAGE = "https://gitlab.com/m2crypto/m2crypto" - -LICENSE = "MIT" -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://m2crypto-0.26.4-gcc_macros.patch \ - " -SRC_URI[md5sum] = "7fce3cbf85eb84a669682892b935746b" -SRC_URI[sha256sum] = "a1b2751cdadc6afac3df8a5799676b7b7c67a6ad144bb62d38563062e7cd3fc6" - -PYPI_PACKAGE = "M2Crypto" -inherit pypi siteinfo - -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 \ -" - -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}__" -export SWIG_FEATURES - -# Get around a problem with swig, but only if the -# multilib header file exists. -# -do_configure_prepend() { - ${CPP} -dM - < /dev/null | grep -v '__\(STDC\|REGISTER_PREFIX\|GNUC\|STDC_HOSTED\)__' \ - | sed 's/^\(#define \([^ ]*\) .*\)$/#undef \2\n\1/' > ${S}/SWIG/gcc_macros.h - - if [ "${SITEINFO_BITS}" = "64" ];then - bit="64" - else - bit="32" - fi - - if [ -e ${STAGING_INCDIR}/openssl/opensslconf-${bit}.h ] ;then - for i in SWIG/_ec.i SWIG/_evp.i; do - sed -i -e "s/opensslconf.*\./opensslconf-${bit}\./" "${S}/$i" - done - elif [ -e ${STAGING_INCDIR}/openssl/opensslconf-n${bit}.h ] ;then - for i in SWIG/_ec.i SWIG/_evp.i; do - sed -i -e "s/opensslconf.*\./opensslconf-n${bit}\./" "${S}/$i" - done - fi -} - -BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python-m2crypto/m2crypto-0.26.4-gcc_macros.patch b/meta-python/recipes-devtools/python/python-m2crypto/m2crypto-0.26.4-gcc_macros.patch deleted file mode 100644 index 7f6dd29f8a..0000000000 --- a/meta-python/recipes-devtools/python/python-m2crypto/m2crypto-0.26.4-gcc_macros.patch +++ /dev/null @@ -1,35 +0,0 @@ -Imported from Fedora - -Index: M2Crypto-0.30.1/SWIG/_m2crypto.i -=================================================================== ---- M2Crypto-0.30.1.orig/SWIG/_m2crypto.i -+++ M2Crypto-0.30.1/SWIG/_m2crypto.i -@@ -8,6 +8,11 @@ - * - */ - -+%import "gcc_macros.h" -+ -+%ignore WCHAR_MAX; -+%ignore WCHAR_MIN; -+ - %module(threads=1) m2crypto - /* We really don't need threadblock (PyGILState_Ensure() etc.) anywhere. - Disable threadallow as well, only enable it for operations likely to -@@ -15,11 +20,6 @@ - %nothreadblock; - %nothreadallow; - --#if SWIG_VERSION >= 0x030000 --#define __WCHAR_MAX__ __WCHAR_MAX --#define __WCHAR_MIN__ __WCHAR_MIN --#endif -- - %{ - #ifdef _WIN32 - #define _WINSOCKAPI_ -@@ -95,4 +95,3 @@ static PyObject *x509_store_verify_cb_fu - %constant int encrypt = 1; - %constant int decrypt = 0; - #endif -- 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-pyasn1.inc b/meta-python/recipes-devtools/python/python-pyasn1.inc deleted file mode 100644 index d9557646a0..0000000000 --- a/meta-python/recipes-devtools/python/python-pyasn1.inc +++ /dev/null @@ -1,31 +0,0 @@ -SUMMARY = "Python library implementing ASN.1 types." -HOMEPAGE = "http://pyasn1.sourceforge.net/" -LICENSE = "BSD-2-Clause" -LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=a14482d15c2249de3b6f0e8a47e021fd" - -SRC_URI[md5sum] = "dffae4ff9f997a83324b3f33fe62be54" -SRC_URI[sha256sum] = "aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba" - -RDEPENDS_${PN}_class-target += " \ - ${PYTHON_PN}-codecs \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-math \ - ${PYTHON_PN}-shell \ -" - -BBCLASSEXTEND = "native nativesdk" - -inherit 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/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-rfc3986-validator/0001-setup.py-move-pytest-runner-to-test_requirements.patch b/meta-python/recipes-devtools/python/python-rfc3986-validator/0001-setup.py-move-pytest-runner-to-test_requirements.patch deleted file mode 100644 index 8a646874e8..0000000000 --- a/meta-python/recipes-devtools/python/python-rfc3986-validator/0001-setup.py-move-pytest-runner-to-test_requirements.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 3531ff73631a0d59234eb4713e7b3a7f5ea57bbb Mon Sep 17 00:00:00 2001 -From: Nicola Lunghi <nicola.lunghi@jci.com> -Date: Thu, 14 Nov 2019 12:17:51 +0000 -Subject: [PATCH] setup.py: move pytest-runner to test_requirements - -This fixes an issue with yocto build. -pytest-runner is only needed when running tests. - -Upstream-Status: Pending ---- - setup.py | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/setup.py b/setup.py -index 53ebea7..ebb0de2 100644 ---- a/setup.py -+++ b/setup.py -@@ -10,9 +10,9 @@ with open('README.md') as readme_file: - - requirements = [] - --setup_requirements = ['pytest-runner', ] -+setup_requirements = [] - --test_requirements = ['pytest>=3', ] -+test_requirements = ['pytest>=3', 'pytest-runner'] - - setup( - author="Nicolas Aimetti", --- -2.20.1 - 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_0.12.0.bb b/meta-python/recipes-devtools/python/python3-absl_2.1.0.bb index 2ecf10caa1..5bdb83175d 100644 --- a/meta-python/recipes-devtools/python/python3-absl_0.12.0.bb +++ b/meta-python/recipes-devtools/python/python3-absl_2.1.0.bb @@ -4,8 +4,7 @@ SECTION = "devel/python" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57" -SRC_URI[md5sum] = "cfc383e2c647698666a7c5d8ef83a675" -SRC_URI[sha256sum] = "b44f68984a5ceb2607d135a615999b93924c771238a63920d17d3387b0d229d5" +SRC_URI[sha256sum] = "7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff" PYPI_PACKAGE = "absl-py" diff --git a/meta-python/recipes-devtools/python/python3-aenum_3.0.0.bb b/meta-python/recipes-devtools/python/python3-aenum_3.1.15.bb index cb8462d24e..3769be0d5d 100644 --- a/meta-python/recipes-devtools/python/python3-aenum_3.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-aenum_3.1.15.bb @@ -1,10 +1,14 @@ SUMMARY = "Advanced Enumerations library" HOMEPAGE = "https://pypi.org/project/aenum/" -LICENSE = "BSD" +LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://aenum/LICENSE;md5=c6a85477543f8b8591b9c1f82abebbe9" -SRC_URI[sha256sum] = "17cd8cfed1ee4b617198c9fabbabd70ebd8f01e54ac29cd6c3a92df14bd86656" +SRC_URI[sha256sum] = "8cbd76cd18c4f870ff39b24284d3ea028fbe8731a58df3aa581e434c575b9559" inherit pypi setuptools3 +RDEPENDS:${PN} += "\ + python3-pprint \ +" + BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-aiodns_3.2.0.bb b/meta-python/recipes-devtools/python/python3-aiodns_3.2.0.bb new file mode 100644 index 0000000000..bf3f1312d2 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-aiodns_3.2.0.bb @@ -0,0 +1,18 @@ +SUMMARY = "Simple DNS resolver for asyncio" +DESCRIPTION = "aiodns provides a simple way for doing asynchronous DNS resolutions using pycares." +HOMEPAGE = "https://github.com/saghul/aiodns" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=a565d8b5d06b9620968a135a2657b093" + +SRC_URI[sha256sum] = "62869b23409349c21b072883ec8998316b234c9a9e36675756e8e317e8768f72" + +PYPI_PACKAGE = "aiodns" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-asyncio \ + python3-pycares \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-aiofiles_0.6.0.bb b/meta-python/recipes-devtools/python/python3-aiofiles_23.2.1.bb index 89157b504f..73dc17423e 100644 --- a/meta-python/recipes-devtools/python/python3-aiofiles_0.6.0.bb +++ b/meta-python/recipes-devtools/python/python3-aiofiles_23.2.1.bb @@ -4,13 +4,12 @@ HOMEPAGE = "https://github.com/aio-libs/aiohttp" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=d2794c0df5b907fdace235a619d80314" -SRC_URI[md5sum] = "3b7ba03babd3d3a6101524469358843e" -SRC_URI[sha256sum] = "e0281b157d3d5d59d803e3f4557dcc9a3dff28a4dd4829a9ff478adae50ca092" +SRC_URI[sha256sum] = "84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a" PYPI_PACKAGE = "aiofiles" -inherit pypi setuptools3 +inherit pypi python_hatchling -RDEPENDS_${PN} = "\ - ${PYTHON_PN}-asyncio \ +RDEPENDS:${PN} = "\ + 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.4.2.bb b/meta-python/recipes-devtools/python/python3-aiohttp-jinja2_1.6.bb index 05afed8b6e..df4a0adcaf 100644 --- a/meta-python/recipes-devtools/python/python3-aiohttp-jinja2_1.4.2.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] = "9c22a0e48e3b277fc145c67dd8c3b8f609dab36bce9eb337f70dfe716663c9a0" +SRC_URI[sha256sum] = "a3a7ff5264e5bca52e8ae547bbfd0761b72495230d438d05b6c0915be619b0e2" inherit pypi setuptools3 -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-jinja2 \ - ${PYTHON_PN}-aiohttp \ +RDEPENDS:${PN} += " \ + python3-jinja2 \ + python3-aiohttp \ " - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-aiohttp_3.7.4.post0.bb b/meta-python/recipes-devtools/python/python3-aiohttp_3.7.4.post0.bb deleted file mode 100644 index 8bf129d30c..0000000000 --- a/meta-python/recipes-devtools/python/python3-aiohttp_3.7.4.post0.bb +++ /dev/null @@ -1,23 +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=3bf3d48554bdca1ea7fdb48de378c2ca" - -SRC_URI[sha256sum] = "493d3299ebe5f5a7c66b9819eacdcfbbaaf1a8e84911ddffcdc48888497afecf" - -PYPI_PACKAGE = "aiohttp" -inherit setuptools3 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 \ -" 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_2.2.0.bb b/meta-python/recipes-devtools/python/python3-aiohue_2.2.0.bb deleted file mode 100644 index a2a7363f6c..0000000000 --- a/meta-python/recipes-devtools/python/python3-aiohue_2.2.0.bb +++ /dev/null @@ -1,12 +0,0 @@ -DESCRIPTION = "Asynchronous library to control Philips Hue" -HOMEPAGE = "https://pypi.org/project/aiohue/" -SECTION = "devel/python" -LICENSE = "Apache-2.0" -# No license file available but the license is specified in PKG-INFO and setup.py. -LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=7145f7cdd263359b62d342a02f005515" - -SRC_URI[sha256sum] = "35696d04d6eb0328b7031ea3c0a3cfe5d83dfcf62f920522e4767d165c6bc529" - -inherit pypi setuptools3 - -RDEPENDS_${PN} += "${PYTHON_PN}-aiohttp" diff --git a/meta-python/recipes-devtools/python/python3-aiohue_4.7.1.bb b/meta-python/recipes-devtools/python/python3-aiohue_4.7.1.bb new file mode 100644 index 0000000000..438c771dbc --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-aiohue_4.7.1.bb @@ -0,0 +1,16 @@ +DESCRIPTION = "Asynchronous library to control Philips Hue" +HOMEPAGE = "https://pypi.org/project/aiohue/" +SECTION = "devel/python" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=dab31a1d28183826937f4b152143a33f" + +SRC_URI[sha256sum] = "29b5e5ae05938cac195b1969e70bd6ad4e4e2e105d0e565849803d2a99ff47d1" + +inherit pypi python_setuptools_build_meta + +RDEPENDS:${PN} += " \ + 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.3.1.bb b/meta-python/recipes-devtools/python/python3-aiosignal_1.3.1.bb new file mode 100644 index 0000000000..fd4ec767c0 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-aiosignal_1.3.1.bb @@ -0,0 +1,14 @@ +SUMMARY = "A list of registered asynchronous callbacks" +HOMEPAGE = "https://github.com/aio-libs/aiosignal" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=cf056e8e7a0a5477451af18b7b5aa98c" + +SRC_URI[sha256sum] = "54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc" + +inherit pypi setuptools3 + +BBCLASSEXTEND = "native nativesdk" + +RDEPENDS:${PN} = "\ + 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.5.8.bb b/meta-python/recipes-devtools/python/python3-alembic_1.5.8.bb deleted file mode 100644 index fdf0d36b50..0000000000 --- a/meta-python/recipes-devtools/python/python3-alembic_1.5.8.bb +++ /dev/null @@ -1,16 +0,0 @@ -DESCRIPTION = "A database migration tool for SQLAlchemy" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=c4ece55266dcdd02ce165b1ee0e490bb" - -inherit pypi setuptools3 - -SRC_URI[sha256sum] = "e27fd67732c97a1c370c33169ef4578cf96436fa0e7dcfaeeef4a917d0737d56" - -PYPI_PACKAGE = "alembic" - -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-dateutil \ - ${PYTHON_PN}-editor \ - ${PYTHON_PN}-mako \ - ${PYTHON_PN}-sqlalchemy \ -" 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.6.0.bb b/meta-python/recipes-devtools/python/python3-ansi2html_1.6.0.bb deleted file mode 100644 index d31448d6a8..0000000000 --- a/meta-python/recipes-devtools/python/python3-ansi2html_1.6.0.bb +++ /dev/null @@ -1,13 +0,0 @@ -DESCRPTION = "ansi2html - Convert text with ANSI color codes to HTML or to LaTeX" -HOMEPAGE = "https://github.com/ralphbean/ansi2html" -LIC_FILES_CHKSUM = "file://LICENSE;md5=3000208d539ec061b899bce1d9ce9404" -LICENSE = "GPLv3" - -PYPI_PACKAGE = "ansi2html" - -SRC_URI[sha256sum] = "0f124ea7efcf3f24f1f9398e527e688c9ae6eab26b0b84e1299ef7f94d92c596" - -inherit pypi setuptools3 - -DEPENDS += "${PYTHON_PN}-setuptools-scm-native ${PYTHON_PN}-toml-native" -RDEPENDS_${PN} = "${PYTHON_PN}-six" diff --git a/meta-python/recipes-devtools/python/python3-ansi2html_1.9.1.bb b/meta-python/recipes-devtools/python/python3-ansi2html_1.9.1.bb new file mode 100644 index 0000000000..6af8989177 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-ansi2html_1.9.1.bb @@ -0,0 +1,19 @@ +DESCRPTION = "ansi2html - Convert text with ANSI color codes to HTML or to LaTeX" +HOMEPAGE = "https://github.com/ralphbean/ansi2html" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3000208d539ec061b899bce1d9ce9404" +LICENSE = "GPL-3.0-only" + +PYPI_PACKAGE = "ansi2html" + +SRC_URI[sha256sum] = "5c6837a13ecc1903aab7a545353312049dfedfe5105362ad3a8d9d207871ec71" + +inherit pypi python_setuptools_build_meta + +DEPENDS += " \ + python3-setuptools-scm-native \ +" + +RDEPENDS:${PN} = " \ + 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 a9ebebeef9..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 @@ -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() { diff --git a/meta-python/recipes-devtools/python/python3-antlr4-runtime_4.13.1.bb b/meta-python/recipes-devtools/python/python3-antlr4-runtime_4.13.1.bb new file mode 100644 index 0000000000..431d37c7d7 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-antlr4-runtime_4.13.1.bb @@ -0,0 +1,11 @@ +SUMMARY = "ANTLR runtime for Python" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://PKG-INFO;md5=4b18e4a9f93178eaa50a9a37f26da7f7" + +SRC_URI[sha256sum] = "3cd282f5ea7cfb841537fe01f143350fdb1c0b1ce7981443a2fa8513fddb6d1a" + +PYPI_PACKAGE = "antlr4-python3-runtime" + +inherit pypi python_setuptools_build_meta + +BBCLASSEXTEND = "nativesdk native" 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/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-anyjson_0.3.3.bb b/meta-python/recipes-devtools/python/python3-anyjson_0.3.3.bb deleted file mode 100644 index 2176f20aae..0000000000 --- a/meta-python/recipes-devtools/python/python3-anyjson_0.3.3.bb +++ /dev/null @@ -1,27 +0,0 @@ -SUMMARY = "Wraps the best available JSON implementation available in a common interface" -DESCRIPTION = "Anyjson loads whichever is the fastest JSON module installed and \ -provides a uniform API regardless of which JSON implementation is used." -HOMEPAGE = "https://bitbucket.org/runeh/anyjson" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=989aa97e73c912a83a3c873fa11deb08" - -inherit pypi setuptools3 ptest - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-nose \ -" - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/tests - cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ -} - -SRC_URI[md5sum] = "2ea28d6ec311aeeebaf993cb3008b27c" -SRC_URI[sha256sum] = "37812d863c9ad3e35c0734c42e0bf0320ce8c3bed82cd20ad54cb34d158157ba" - -RDEPENDS_${PN} += "${PYTHON_PN}-simplejson" 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 eef5c02735..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 @@ -11,11 +11,14 @@ SRC_URI[sha256sum] = "7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27 inherit pypi setuptools3 ptest -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ +RDEPENDS:${PN}-ptest += " \ + 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-apply-defaults_0.1.4.bb b/meta-python/recipes-devtools/python/python3-apply-defaults_0.1.6.bb index 8d23678a09..6bf61cfcd3 100644 --- a/meta-python/recipes-devtools/python/python3-apply-defaults_0.1.4.bb +++ b/meta-python/recipes-devtools/python/python3-apply-defaults_0.1.6.bb @@ -5,11 +5,10 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=c89120516900f96f4c60d35fdc4c3f15" PYPI_PACKAGE = "apply_defaults" -SRC_URI[md5sum] = "719abb133f4b46283ebd940fcdf30a78" -SRC_URI[sha256sum] = "1ce26326a61d8773d38a9726a345c6525a91a6120d7333af79ad792dacb6246c" +SRC_URI[sha256sum] = "3773de3491b94c0fe44310f1a85888389cdc71e1544b343bce0d2bd6991acea5" inherit pypi setuptools3 -RDEPENDS_${PN} += "python3-core" +RDEPENDS:${PN} += "python3-core" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-argcomplete_1.12.2.bb b/meta-python/recipes-devtools/python/python3-argcomplete_3.2.3.bb index a08f882ab1..8d8c8a4e2e 100644 --- a/meta-python/recipes-devtools/python/python3-argcomplete_1.12.2.bb +++ b/meta-python/recipes-devtools/python/python3-argcomplete_3.2.3.bb @@ -3,14 +3,15 @@ HOMEPAGE = "https://github.com/kislyuk/argcomplete" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=2ee41112a44fe7014dce33e26468ba93" -SRC_URI[sha256sum] = "de0e1282330940d52ea92a80fea2e4b9e0da1932aaa570f84d268939d1897b04" +SRC_URI[sha256sum] = "bf7900329262e481be5a15f56f19736b376df6f82ed27576fa893652c5de6c23" PYPI_PACKAGE = "argcomplete" inherit pypi setuptools3 -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-core \ +RDEPENDS:${PN} += "\ + python3-core \ + python3-io \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-argexec_1.0.3.bb b/meta-python/recipes-devtools/python/python3-argexec_1.0.3.bb index 9f152a1d60..017a7e954b 100644 --- a/meta-python/recipes-devtools/python/python3-argexec_1.0.3.bb +++ b/meta-python/recipes-devtools/python/python3-argexec_1.0.3.bb @@ -8,7 +8,7 @@ SRC_URI[md5sum] = "448635948823309312ea9f70b30b6c2d" SRC_URI[sha256sum] = "61f9ae9322e38ae64996848421afbdb018239a99c4e796fe064f172d6c98c3bf" DEPENDS += "python3-setuptools-scm-native" -RDEPENDS_${PN} += "\ +RDEPENDS:${PN} += "\ python3-dynamic-dispatch \ python3-typeguard \ " 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 6aa7588760..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 = "LGPLv2" -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_1.10.1.bb b/meta-python/recipes-devtools/python/python3-arpeggio_2.0.2.bb index 38e26623f5..3130e2cb96 100644 --- a/meta-python/recipes-devtools/python/python3-arpeggio_1.10.1.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] = "920d12cc762edb2eb56daae64a14c93e43dc181b481c88fc79314c0df6ee639e" +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-asn1crypto_1.4.0.bb b/meta-python/recipes-devtools/python/python3-asn1crypto_1.4.0.bb deleted file mode 100644 index bb1271e330..0000000000 --- a/meta-python/recipes-devtools/python/python3-asn1crypto_1.4.0.bb +++ /dev/null @@ -1,25 +0,0 @@ -DESCRIPTION = "A fast, pure Python library for parsing and serializing ASN.1 structures" -HOMEPAGE = "https://github.com/wbond/asn1crypto" -SECTION = "devel/python" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=7439e38f5e04ff62fae436184786b7ca" - -PYPI_PACKAGE = "asn1crypto" - -SRC_URI[md5sum] = "00bf5b72d37778e62cc73b1d8909ae27" -SRC_URI[sha256sum] = "f4f6e119474e58e04a2b1af817eb585b4fd72bdd89b998624712b5c99be7641c" - -inherit pypi setuptools3 - -RDEPENDS_${PN}_class-target += " \ - ${PYTHON_PN}-codecs \ - ${PYTHON_PN}-crypt \ - ${PYTHON_PN}-ctypes \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-shell \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-aspectlib/run-ptest b/meta-python/recipes-devtools/python/python3-aspectlib/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-aspectlib/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-aspectlib_2.0.0.bb b/meta-python/recipes-devtools/python/python3-aspectlib_2.0.0.bb new file mode 100644 index 0000000000..1341513289 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-aspectlib_2.0.0.bb @@ -0,0 +1,35 @@ +# Copyright (C) 2021 Khem Raj <raj.khem@gmail.com> +# Released under the MIT license (see COPYING.MIT for the terms) + +SUMMARY = "An aspect-oriented programming, monkey-patch and decorators library." +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=80721ace117fd1f814049ecb81c6be76" + +SRC_URI[sha256sum] = "a4b461b9da0b531aebcb93efcde3de808a72c60226dd8d902c467d13faf7ce92" + +inherit ptest pypi setuptools3 + +SRC_URI += "file://run-ptest \ + " + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} + +RDEPENDS:${PN}-ptest += "\ + python3-process-tests \ + python3-pytest \ + python3-tornado \ + python3-unittest-automake-output \ +" + +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 5048e5bec9..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 @@ -4,7 +4,7 @@ SECTION = "devel/python" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=561205fdabc3ec52cae2d30815b8ade7" -SRC_URI = "git://github.com/berkerpeksag/astor.git \ +SRC_URI = "git://github.com/berkerpeksag/astor.git;branch=master;protocol=https \ file://0001-rtrip.py-convert-to-python3.patch \ " SRCREV ?= "c7553c79f9222e20783fe9bd8a553f932e918072" diff --git a/meta-python/recipes-devtools/python/python3-astroid_2.5.3.bb b/meta-python/recipes-devtools/python/python3-astroid_2.5.3.bb deleted file mode 100644 index f1d9c66af7..0000000000 --- a/meta-python/recipes-devtools/python/python3-astroid_2.5.3.bb +++ /dev/null @@ -1,32 +0,0 @@ -SUMMARY = "An abstract syntax tree for Python with inference support." -HOMEPAGE = "https://pypi.python.org/pypi/astroid" -SECTION = "devel/python" -LICENSE = "LGPL-2.1" -LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe" - -SRC_URI[sha256sum] = "ad63b8552c70939568966811a088ef0bc880f99a24a00834abd0e3681b514f91" - -inherit pypi setuptools3 - -DEPENDS += "${PYTHON_PN}-pytest-runner-native" - -PACKAGES =+ "${PN}-tests" - -FILES_${PN}-tests += " \ - ${PYTHON_SITEPACKAGES_DIR}/astroid/test* \ - ${PYTHON_SITEPACKAGES_DIR}/astroid/__pycache__/test* \ -" - -RDEPENDS_${PN}_class-target += "\ - ${PYTHON_PN}-distutils \ - ${PYTHON_PN}-lazy-object-proxy \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-wrapt \ - ${PYTHON_PN}-setuptools \ -" - -RDEPENDS_${PN}-tests_class-target += "\ - ${PYTHON_PN}-unittest \ - ${PYTHON_PN}-xml \ -" diff --git a/meta-python/recipes-devtools/python/python3-astroid_3.1.0.bb b/meta-python/recipes-devtools/python/python3-astroid_3.1.0.bb new file mode 100644 index 0000000000..3c68f1e583 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-astroid_3.1.0.bb @@ -0,0 +1,37 @@ +SUMMARY = "An abstract syntax tree for Python with inference support." +HOMEPAGE = "https://pypi.python.org/pypi/astroid" +SECTION = "devel/python" +LICENSE = "LGPL-2.1-only" +LIC_FILES_CHKSUM = "file://LICENSE;md5=a70cf540abf41acb644ac3b621b2fad1" + +SRC_URI[sha256sum] = "ac248253bfa4bd924a0de213707e7ebeeb3138abeb48d798784ead1e56d419d4" + +inherit pypi python_setuptools_build_meta + +DEPENDS += "\ + python3-pytest-runner-native \ + python3-wheel-native \ +" + +PACKAGES =+ "${PN}-tests" + +FILES:${PN}-tests += " \ + ${PYTHON_SITEPACKAGES_DIR}/astroid/test* \ + ${PYTHON_SITEPACKAGES_DIR}/astroid/__pycache__/test* \ +" + +RDEPENDS:${PN}:class-target += "\ + python3-lazy-object-proxy \ + python3-logging \ + python3-six \ + python3-wrapt \ + python3-setuptools \ + python3-typing-extensions \ +" + +RDEPENDS:${PN}-tests:class-target += "\ + python3-unittest \ + python3-xml \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-asttokens_2.0.4.bb b/meta-python/recipes-devtools/python/python3-asttokens_2.4.1.bb index c2149336fd..dbb2fc0ebe 100644 --- a/meta-python/recipes-devtools/python/python3-asttokens_2.0.4.bb +++ b/meta-python/recipes-devtools/python/python3-asttokens_2.4.1.bb @@ -5,13 +5,14 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=e3fc50a88d0a364313df4b21ef20c29e" PYPI_PACKAGE = "asttokens" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta -SRC_URI[sha256sum] = "a42e57e28f2ac1c85ed9b1f84109401427e5c63c04f61d15b8842b027eec5128" +SRC_URI[sha256sum] = "b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0" -DEPENDS += "\ - python3-setuptools-scm-native \ - python3-wheel-native \ +DEPENDS += "python3-setuptools-scm-native" + +RDEPENDS:${PN} += " \ + python3-six \ " BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-async-timeout_3.0.1.bb b/meta-python/recipes-devtools/python/python3-async-timeout_4.0.3.bb index 22dffe6462..3d35780b65 100644 --- a/meta-python/recipes-devtools/python/python3-async-timeout_3.0.1.bb +++ b/meta-python/recipes-devtools/python/python3-async-timeout_4.0.3.bb @@ -6,14 +6,13 @@ 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=e3fc50a88d0a364313df4b21ef20c29e" +LIC_FILES_CHKSUM = "file://LICENSE;md5=4fa41f15bb5f23b6d3560c5845eb8d57" -SRC_URI[md5sum] = "305c4fa529f2485c403d0dbe14390175" -SRC_URI[sha256sum] = "0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f" +SRC_URI[sha256sum] = "4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f" PYPI_PACKAGE = "async-timeout" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta -RDEPENDS_${PN} = "\ - ${PYTHON_PN}-asyncio \ +RDEPENDS:${PN} = "\ + python3-asyncio \ " diff --git a/meta-python/recipes-devtools/python/python3-asyncinotify_4.0.6.bb b/meta-python/recipes-devtools/python/python3-asyncinotify_4.0.6.bb new file mode 100644 index 0000000000..34f7187d46 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-asyncinotify_4.0.6.bb @@ -0,0 +1,15 @@ +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 = "MPL-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=f75d2927d3c1ed2414ef72048f5ad640" + +SRC_URI[sha256sum] = "c03fdb1a7dbb6bed8ede763e4e0ac224a2a3157bdc51e4ba3832588a3c29904d" + +inherit pypi python_setuptools_build_meta + +RDEPENDS:${PN} += " \ + python3-asyncio \ + python3-core \ + python3-ctypes \ + python3-io \ +" 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 new file mode 100644 index 0000000000..01dfe51543 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-asyncio-glib_0.1.bb @@ -0,0 +1,12 @@ +SUMMARY = "An implementation of the Python 3 asyncio event loop on top of GLib" +LICENSE = "LGPL-2.1-only" +LIC_FILES_CHKSUM = "file://COPYING.LGPL;md5=4fbd65380cdd255951079008b364516c" + +inherit setuptools3 pypi features_check + +REQUIRED_DISTRO_FEATURES = "gobject-introspection-data" + +SRC_URI[md5sum] = "60153055e76ceaacdfbaeafb03d61dd9" +SRC_URI[sha256sum] = "fe3ceb2ba5f541330c07ca1bd7ae792468d625bad1acf5354a3a7a0b9fd87521" + +RDEPENDS:${PN} += "python3-asyncio python3-pygobject" 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 new file mode 100644 index 0000000000..040e70940b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-asyncio-throttle_1.0.2.bb @@ -0,0 +1,11 @@ +DESCRIPTION = "Simple, easy-to-use throttler for asyncio." +HOMEPAGE = "https://github.com/hallazzang/asyncio-throttle" +SECTION = "devel/python" +LICENSE = "MIT" +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-attr_0.3.1.bb b/meta-python/recipes-devtools/python/python3-attr_0.3.1.bb deleted file mode 100644 index 22c5218c70..0000000000 --- a/meta-python/recipes-devtools/python/python3-attr_0.3.1.bb +++ /dev/null @@ -1,9 +0,0 @@ -DESCRIPTION = "Simple decorator to set attributes of target function or class in a DRY way" -HOMEPAGE = "https://github.com/denis-ryzhkov/attr" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://PKG-INFO;md5=59805a0285f4d2b6abdedae73db4f5c1" - -SRC_URI[md5sum] = "68b9a503991241fb2df28488686b0e1e" -SRC_URI[sha256sum] = "9091548058d17f132596e61fa7518e504f76b9a4c61ca7d86e1f96dbf7d4775d" - -inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-attr_0.3.2.bb b/meta-python/recipes-devtools/python/python3-attr_0.3.2.bb new file mode 100644 index 0000000000..0a77009e11 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-attr_0.3.2.bb @@ -0,0 +1,8 @@ +DESCRIPTION = "Simple decorator to set attributes of target function or class in a DRY way" +HOMEPAGE = "https://github.com/denis-ryzhkov/attr" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=02c113fb406eab0537c0cf4334f57c07" + +SRC_URI[sha256sum] = "1ceebca768181cdcce9827611b1d728e592be5d293911539ea3d0b0bfa1146f4" + +inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-autobahn_21.3.1.bb b/meta-python/recipes-devtools/python/python3-autobahn_21.3.1.bb deleted file mode 100644 index daa66ec1ac..0000000000 --- a/meta-python/recipes-devtools/python/python3-autobahn_21.3.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] = "e126c1f583e872fb59e79d36977cfa1f2d0a8a79f90ae31f406faae7664b8e03" - -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 bddc5be69c..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_24.2.0.bb b/meta-python/recipes-devtools/python/python3-awesomeversion_24.2.0.bb new file mode 100644 index 0000000000..8b19605b1e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-awesomeversion_24.2.0.bb @@ -0,0 +1,11 @@ +DESCRIPTION = "One version package to rule them all, One version package to find them, One version package to bring them all, and in the darkness bind them." +HOMEPAGE = "https://pypi.org/project/awesomeversion/" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENCE.md;md5=92622b5a8e216099be741d78328bae5d" + +SRC_URI[sha256sum] = "47a6dcbbe2921b725f75106a66ab30f26f1f33dbc5e07bc8e1e39d8eb921f53c" + +RDEPENDS:${PN} += "python3-profile python3-logging" + +inherit pypi python_poetry_core diff --git a/meta-python/recipes-devtools/python/python3-aws-iot-device-sdk-python/0001-setup.py-Use-setuptools-instead-of-distutils.patch b/meta-python/recipes-devtools/python/python3-aws-iot-device-sdk-python/0001-setup.py-Use-setuptools-instead-of-distutils.patch new file mode 100644 index 0000000000..9bc8b36f36 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-aws-iot-device-sdk-python/0001-setup.py-Use-setuptools-instead-of-distutils.patch @@ -0,0 +1,29 @@ +From 36f8106535150b970c75e8b8456ebc5a7d1dbdb3 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Wed, 2 Mar 2022 11:11:01 -0800 +Subject: [PATCH] setup.py: Use setuptools instead of distutils + +distutils is deprecated and will be gone in 3.12+ + +Upstream-Status: Submitted [https://github.com/aws/aws-iot-device-sdk-python/pull/305] +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 3846bae..d0c2b8d 100644 +--- a/setup.py ++++ b/setup.py +@@ -3,7 +3,7 @@ sys.path.insert(0, 'AWSIoTPythonSDK') + import AWSIoTPythonSDK + currentVersion = AWSIoTPythonSDK.__version__ + +-from distutils.core import setup ++from setuptools import setup + setup( + name = 'AWSIoTPythonSDK', + packages=['AWSIoTPythonSDK', 'AWSIoTPythonSDK.core', +-- +2.35.1 + diff --git a/meta-python/recipes-devtools/python/python3-aws-iot-device-sdk-python_1.4.9.bb b/meta-python/recipes-devtools/python/python3-aws-iot-device-sdk-python_1.5.2.bb index 5408c5aa8d..bdadf7c774 100644 --- a/meta-python/recipes-devtools/python/python3-aws-iot-device-sdk-python_1.4.9.bb +++ b/meta-python/recipes-devtools/python/python3-aws-iot-device-sdk-python_1.5.2.bb @@ -1,19 +1,23 @@ DESCRIPTION = "SDK for connecting to AWS IoT using Python." HOMEPAGE = "https://github.com/aws/aws-iot-device-sdk-python" LICENSE = "Apache-2.0 & (EPL-1.0 | EDL-1.0)" -LICENSE_${PN}-examples = "Apache-2.0" +LICENSE:${PN}-examples = "Apache-2.0" LIC_FILES_CHKSUM = "\ file://LICENSE.txt;md5=9ac49901b833e769c7d6f21e8dbd7b30 \ file://AWSIoTPythonSDK/core/protocol/paho/client.py;endline=14;md5=5a3c8a1a4bb71bd934f450ecff972ad9 \ " +SRCREV = "0ea1a2d013529839fc1e7448d19dadff25d581b4" +SRC_URI = "git://github.com/aws/aws-iot-device-sdk-python;branch=master;protocol=https \ + file://0001-setup.py-Use-setuptools-instead-of-distutils.patch \ + " -SRC_URI[sha256sum] = "84b440c5929f33da1cd204f3ad0ea891e208637dd63de9fb039ed7d49d78c303" +S = "${WORKDIR}/git" -inherit pypi setuptools3 +inherit setuptools3 PYPI_PACKAGE = "AWSIoTPythonSDK" -do_install_append() { +do_install:append() { install -d -m0755 ${D}${datadir}/${BPN}/examples cp --preserve=mode,timestamps -R ${S}/samples/* ${D}${datadir}/${BPN}/examples # this requires the full blown AWS Python SDK @@ -22,19 +26,19 @@ 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 \ +RDEPENDS:${PN} += " \ + python3-crypt \ + python3-datetime \ + python3-io \ + python3-json \ + python3-logging \ + python3-math \ + python3-netclient \ + python3-numbers \ + python3-threading \ " -RDEPENDS_${PN}-examples += "${PN}" +RDEPENDS:${PN}-examples += "${PN}" -FILES_${PN}-examples = "${datadir}/${BPN}/examples" +FILES:${PN}-examples = "${datadir}/${BPN}/examples" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-babel_2.9.0.bb b/meta-python/recipes-devtools/python/python3-babel_2.9.0.bb deleted file mode 100644 index 7248abf33b..0000000000 --- a/meta-python/recipes-devtools/python/python3-babel_2.9.0.bb +++ /dev/null @@ -1,26 +0,0 @@ -DESCRIPTION = "A collection of tools for internationalizing Python applications" -HOMEPAGE = "http://babel.edgewall.org/" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=22a580b27e4ebf9689e466b63aedeb7f" - -SRC_URI[sha256sum] = "da031ab54472314f210b0adcff1588ee5d1d1d0ba4dbd07b94dba82bde791e05" - -PYPI_PACKAGE = "Babel" - -inherit pypi setuptools3 - -CLEANBROKEN = "1" - -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-codecs \ - ${PYTHON_PN}-difflib \ - ${PYTHON_PN}-distutils \ - ${PYTHON_PN}-netserver \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-pickle \ - ${PYTHON_PN}-pytz \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-threading \ -" - -BBCLASSEXTEND = "native nativesdk" 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 56b1485342..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" @@ -9,4 +8,4 @@ PYPI_PACKAGE = "backcall" SRC_URI[md5sum] = "1f4c9a370c78743406296f48e56e8821" SRC_URI[sha256sum] = "5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e" -inherit setuptools3 pypi +inherit pypi python_flit_core 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-backports-functools-lru-cache_1.6.4.bb b/meta-python/recipes-devtools/python/python3-backports-functools-lru-cache_1.6.4.bb deleted file mode 100644 index c90ffa1b47..0000000000 --- a/meta-python/recipes-devtools/python/python3-backports-functools-lru-cache_1.6.4.bb +++ /dev/null @@ -1,31 +0,0 @@ -SUMMARY = "Backport of functools.lru_cache from Python 3.3" -HOMEPAGE = "https://github.com/jaraco/backports.functools_lru_cache" -SECTION = "devel/python" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=7a7126e068206290f3fe9f8d6c713ea6" - -PYPI_PACKAGE = "backports.functools_lru_cache" - -SRC_URI[sha256sum] = "d5ed2169378b67d3c545e5600d363a923b09c456dab1593914935a68ad478271" - -DEPENDS += "${PYTHON_PN}-setuptools-scm-native" - -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/ -} - -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-pickle \ - ${PYTHON_PN}-threading \ - " diff --git a/meta-python/recipes-devtools/python/python3-bandit_1.7.0.bb b/meta-python/recipes-devtools/python/python3-bandit_1.7.0.bb deleted file mode 100644 index 2ef956e07a..0000000000 --- a/meta-python/recipes-devtools/python/python3-bandit_1.7.0.bb +++ /dev/null @@ -1,14 +0,0 @@ -SUMMARY = "Security oriented static analyser for python code." -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=1dece7821bf3fd70fe1309eaa37d52a2" - -SRC_URI[md5sum] = "24965f102dc62129d3fafe4fe596a3b8" -SRC_URI[sha256sum] = "8a4c7415254d75df8ff3c3b15cfe9042ecee628a1e40b44c15a98890fbfc2608" - -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" diff --git a/meta-python/recipes-devtools/python/python3-bandit_1.7.8.bb b/meta-python/recipes-devtools/python/python3-bandit_1.7.8.bb new file mode 100644 index 0000000000..8b0968857f --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-bandit_1.7.8.bb @@ -0,0 +1,19 @@ +SUMMARY = "Security oriented static analyser for python code." +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=34400b68072d710fecd0a2940a0d1658" + +SRC_URI[sha256sum] = "36de50f720856ab24a24dbaa5fee2c66050ed97c1477e0a1159deab1775eab6b" + +DEPENDS = "python3-pbr-native python3-git python3-pbr python3-pyyaml python3-six python3-stevedore" + +inherit setuptools3 pypi + +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-bcrypt/run-ptest b/meta-python/recipes-devtools/python/python3-bcrypt/run-ptest deleted file mode 100644 index b63c4de0d9..0000000000 --- a/meta-python/recipes-devtools/python/python3-bcrypt/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-bcrypt_3.2.0.bb b/meta-python/recipes-devtools/python/python3-bcrypt_3.2.0.bb deleted file mode 100644 index 360f14be1d..0000000000 --- a/meta-python/recipes-devtools/python/python3-bcrypt_3.2.0.bb +++ /dev/null @@ -1,30 +0,0 @@ -DESCRIPTION = "Modern password hashing for your software and your servers." -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=8f7bb094c7232b058c7e9f2e431f389c" - -DEPENDS += "${PYTHON_PN}-cffi-native" - -SRC_URI[md5sum] = "fe31390dab603728f756cd3d6830c80a" -SRC_URI[sha256sum] = "5b93c1726e50a93a033c36e5ca7fdcd29a5c7395af50a6892f5d9e7c6cfbfb29" - -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/ -} - -RDEPENDS_${PN}_class-target += "\ - ${PYTHON_PN}-cffi \ - ${PYTHON_PN}-ctypes \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-six \ -" 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-beautifulsoup4_4.9.3.bb b/meta-python/recipes-devtools/python/python3-beautifulsoup4_4.9.3.bb deleted file mode 100644 index 5e03ad5e9e..0000000000 --- a/meta-python/recipes-devtools/python/python3-beautifulsoup4_4.9.3.bb +++ /dev/null @@ -1,17 +0,0 @@ -SUMMARY = "Screen-scraping library" -HOMEPAGE = " https://www.crummy.com/software/BeautifulSoup/bs4" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://COPYING.txt;md5=f2d38d8a40bf73fd4b3d16ca2e5882d1" - -SRC_URI[md5sum] = "57fd468ae3eb055f6871106e8f7813e2" -SRC_URI[sha256sum] = "84729e322ad1d5b4d25f805bfa05b902dd96450f43842c4e99067d5e1369eb25" - -inherit pypi setuptools3 - -RDEPENDS_${PN} = "\ - ${PYTHON_PN}-html5lib \ - ${PYTHON_PN}-lxml \ - ${PYTHON_PN}-soupsieve \ -" - -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 a28e527315..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 @@ -3,13 +3,16 @@ HOMEPAGE = "https://github.com/behave/behave" LICENSE = "BSD-2-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=d950439e8ea6ed233e4288f5e1a49c06" -SRC_URI[md5sum] = "3f05c859a1c45f5ed33e925817ad887d" -SRC_URI[sha256sum] = "b9662327aa53294c1351b0a9c369093ccec1d21026f050c3bd9b3e5cccf81a86" +PV .= "+git${SRCREV}" +SRCREV = "9520119376046aeff73804b5f1ea05d87a63f370" +SRC_URI += "git://github.com/behave/behave;branch=master;protocol=https" -inherit pypi setuptools3 +S = "${WORKDIR}/git" -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-parse-type \ - ${PYTHON_PN}-setuptools \ - ${PYTHON_PN}-six \ +inherit setuptools3 + +RDEPENDS:${PN} += " \ + 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 ef654e9172..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}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-requests \ +RDEPENDS:${PN} += " \ + python3-requests \ + python3-unittest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-bidict_0.23.0.bb b/meta-python/recipes-devtools/python/python3-bidict_0.23.0.bb new file mode 100644 index 0000000000..5667e4927f --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-bidict_0.23.0.bb @@ -0,0 +1,11 @@ +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=e907308cc9356afa99ac0eec6b20211b" + +SRC_URI[sha256sum] = "3959ca59d4d6997702d642bf1e5fd93cba299863723fc289545198f70c468578" + +inherit pypi python_setuptools_build_meta + +DEPENDS += "python3-setuptools-scm-native" 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_1.9.2.bb b/meta-python/recipes-devtools/python/python3-bitarray_1.9.2.bb deleted file mode 100644 index 0716e8e1d8..0000000000 --- a/meta-python/recipes-devtools/python/python3-bitarray_1.9.2.bb +++ /dev/null @@ -1,10 +0,0 @@ -SUMMARY = "A high-level Python efficient arrays of booleans -- C extension" -HOMEPAGE = "https://github.com/ilanschnell/bitarray" -LICENSE = "PSF" -LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=2ad702cdcd49e8d2ac01d7e7d0810d2d" - -SRC_URI[sha256sum] = "d7a49d21ae04c5af195023b140800186ebf208e3a4fc5b21a1389531cb7a7170" - -inherit setuptools3 pypi - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-bitarray_2.9.2.bb b/meta-python/recipes-devtools/python/python3-bitarray_2.9.2.bb new file mode 100644 index 0000000000..7d7be0b1aa --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-bitarray_2.9.2.bb @@ -0,0 +1,11 @@ +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] = "a8f286a51a32323715d77755ed959f94bef13972e9a2fe71b609e40e6d27957e" + +inherit setuptools3 pypi + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-bitstring_3.1.7.bb b/meta-python/recipes-devtools/python/python3-bitstring_3.1.7.bb deleted file mode 100644 index eae8275d6d..0000000000 --- a/meta-python/recipes-devtools/python/python3-bitstring_3.1.7.bb +++ /dev/null @@ -1,20 +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=d973e8e0c311da41424357236b7b8908" - -SRC_URI[md5sum] = "18661a3e5c47c59bd926dd0fefae0baa" -SRC_URI[sha256sum] = "fdf3eb72b229d2864fb507f8f42b1b2c57af7ce5fec035972f9566de440a864a" - -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.11.1.bb b/meta-python/recipes-devtools/python/python3-bitstruct_8.19.0.bb index 49b31971a6..6401322e2c 100644 --- a/meta-python/recipes-devtools/python/python3-bitstruct_8.11.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] = "4e7b8769c0f09fee403d0a5f637f8b575b191a79a92e140811aa109ce7461f0c" +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.4.bb b/meta-python/recipes-devtools/python/python3-blinker_1.4.bb deleted file mode 100644 index 18544b9007..0000000000 --- a/meta-python/recipes-devtools/python/python3-blinker_1.4.bb +++ /dev/null @@ -1,22 +0,0 @@ -DESCRIPTION = "Fast, simple object-to-object and broadcast signaling." -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://PKG-INFO;md5=946d7e89af6f7733aeaebed5635d2682" - -SRC_URI[md5sum] = "8b3722381f83c2813c52de3016b68d33" -SRC_URI[sha256sum] = "471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6" - -inherit pypi setuptools3 ptest - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-nose \ -" - -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-blinker_1.7.0.bb b/meta-python/recipes-devtools/python/python3-blinker_1.7.0.bb new file mode 100644 index 0000000000..8f2cf4883d --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-blinker_1.7.0.bb @@ -0,0 +1,23 @@ +DESCRIPTION = "Fast, simple object-to-object and broadcast signaling." +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=42cd19c88fc13d1307a4efd64ee90e4e" + +SRC_URI[sha256sum] = "e6820ff6fa4e4d1d8e2747c2283749c3f547e4fee112b98555cdcdae32996182" + +inherit pypi python_setuptools_build_meta ptest + +SRC_URI += "file://run-ptest" + +RDEPENDS:${PN} += "\ + python3-asyncio \ +" + +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-booleanpy_3.8.bb b/meta-python/recipes-devtools/python/python3-booleanpy_3.8.bb deleted file mode 100644 index a1ce7eafc9..0000000000 --- a/meta-python/recipes-devtools/python/python3-booleanpy_3.8.bb +++ /dev/null @@ -1,14 +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=9b58494d4f385978ca5a7ef4f6abca53" - -SRC_URI[md5sum] = "83ccc145ba74a585637124c8bc648333" -SRC_URI[sha256sum] = "cc24e20f985d60cd4a3a5a1c0956dd12611159d32a75081dabd0c9ab981acaa4" - -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.6.bb b/meta-python/recipes-devtools/python/python3-cachecontrol_0.12.6.bb deleted file mode 100644 index 7c45ed3300..0000000000 --- a/meta-python/recipes-devtools/python/python3-cachecontrol_0.12.6.bb +++ /dev/null @@ -1,29 +0,0 @@ -SUMMARY = "httplib2 caching for requests" -HOMEPAGE = "https://pypi.org/project/CacheControl/" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=6dc7e1b428eda03d850209fdbd6c71f1" - -# On PyPi, this is "CacheControl", rather than "cachecontrol", so we need to -# override PYPI_PACKAGE so fetch succeeds. -PYPI_PACKAGE = "CacheControl" - -SRC_URI[md5sum] = "5890b797f9b48b2b4cd1448cca89e396" -SRC_URI[sha256sum] = "be9aa45477a134aee56c8fac518627e1154df063e85f67d4f83ce0ccc23688e8" - -inherit pypi setuptools3 - -RDEPENDS_${PN} += "\ - python3-crypt \ - python3-datetime \ - python3-email \ - python3-lockfile \ - python3-json \ - python3-logging \ - python3-msgpack \ - python3-netclient \ - python3-pickle \ - python3-requests \ - python3-urllib3 \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-cachecontrol_0.14.0.bb b/meta-python/recipes-devtools/python/python3-cachecontrol_0.14.0.bb new file mode 100644 index 0000000000..1e374529cc --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-cachecontrol_0.14.0.bb @@ -0,0 +1,28 @@ +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=e2fd6ddcf506e08972d5ba4b93c0022e" + +SRC_URI[sha256sum] = "7db1195b41c81f8274a7bbd97c956f44e8348265a1bc7641c37dfebc39f0c938" + +inherit pypi python_poetry_core + +UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/CacheControl/" +UPSTREAM_CHECK_REGEX = "/CacheControl/(?P<pver>(\d+[\.\-_]*)+)" + +RDEPENDS:${PN} += "\ + python3-crypt \ + python3-datetime \ + python3-email \ + python3-lockfile \ + python3-json \ + python3-logging \ + python3-msgpack \ + python3-netclient \ + python3-pickle \ + python3-requests \ + python3-urllib3 \ + python3-mmap \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-cached-property_1.5.2.bb b/meta-python/recipes-devtools/python/python3-cached-property_1.5.2.bb new file mode 100644 index 0000000000..059c34a29d --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-cached-property_1.5.2.bb @@ -0,0 +1,12 @@ +SUMMARY = "A decorator for caching properties in classes." +DESCRIPTION = "Makes caching of time or computational expensive properties quick and easy." +HOMEPAGE = "https://pypi.org/project/cached-property/" +SECTION = "devel/python" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=db7ff60c4e14f58534201242803d8abc" + +SRC_URI[sha256sum] = "9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130" + +inherit pypi setuptools3 + +BBCLASSEXTEND = "native" 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_4.2.1.bb b/meta-python/recipes-devtools/python/python3-cachetools_5.3.3.bb index 616e880453..3ef75d4703 100644 --- a/meta-python/recipes-devtools/python/python3-cachetools_4.2.1.bb +++ b/meta-python/recipes-devtools/python/python3-cachetools_5.3.3.bb @@ -6,20 +6,21 @@ Python 3 Standard Library @lru_cache function decorator." SECTION = "devel/python" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=2d1e1bf0ccb26126a230c51f997ce362" +LIC_FILES_CHKSUM = "file://LICENSE;md5=539275e657c6b7af026bb908356f7541" -inherit pypi setuptools3 ptest +inherit pypi python_setuptools_build_meta ptest SRC_URI += " \ file://run-ptest \ " -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-math \ +RDEPENDS:${PN} += " \ + python3-math \ " -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ +RDEPENDS:${PN}-ptest += " \ + 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] = "f469e29e7aa4cff64d8de4aad95ce76de8ea1125a16c68e0d93f65c3c3dc92e9" +SRC_URI[sha256sum] = "ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-can_3.3.3.bb b/meta-python/recipes-devtools/python/python3-can_3.3.3.bb deleted file mode 100644 index 4da2339598..0000000000 --- a/meta-python/recipes-devtools/python/python3-can_3.3.3.bb +++ /dev/null @@ -1,26 +0,0 @@ -SUMMARY = "Controller Area Network (CAN) interface module for Python" -SECTION = "devel/python" -LICENSE = "LGPLv3" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=e6a600fd5e1d9cbde2d983680233ad02" - -SRC_URI[md5sum] = "1310da316799e4b12944a6c1dcb017a9" -SRC_URI[sha256sum] = "ecd69cf6b2f0235345ebe607a15325cf1384c85b24ffbe1d68c3754357f87488" - -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 \ -" - -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_36.2.0.bb b/meta-python/recipes-devtools/python/python3-cantools_36.2.0.bb deleted file mode 100644 index 632175cc43..0000000000 --- a/meta-python/recipes-devtools/python/python3-cantools_36.2.0.bb +++ /dev/null @@ -1,13 +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] = "31bcdd56cbb5e26decab42f0624c8cead9b94991f6ee922512b0acd6ae7d6da2" - -PYPI_PACKAGE = "cantools" - -inherit pypi setuptools3 - -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 a1941bf3cb..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,27 +8,21 @@ LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=2ee41112a44fe7014dce33e26468ba93" SRCNAME = "cassandra-driver" -SRC_URI[sha256sum] = "8ad7d7c090eb1cac6110b3bfc1fd2d334ac62f415aac09350ebb8d241b7aa7ee" - -DISTUTILS_BUILD_ARGS += " \ - --no-libev \ -" -DISTUTILS_INSTALL_ARGS += " \ - --no-libev \ -" +SRC_URI[sha256sum] = "38e9c2a2f2a9664bb03f1f852d5fccaeff2163942b5db35dffcf8bf32a51cfe5" inherit pypi setuptools3 -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-cython \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-misc \ - ${PYTHON_PN}-multiprocessing \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-six \ +RDEPENDS:${PN} += "\ + 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.2.0.bb b/meta-python/recipes-devtools/python/python3-cbor2_5.2.0.bb deleted file mode 100644 index cc067c41a9..0000000000 --- a/meta-python/recipes-devtools/python/python3-cbor2_5.2.0.bb +++ /dev/null @@ -1,30 +0,0 @@ -DESCRIPTION = "An implementation of RFC 7049 - Concise Binary Object Representation (CBOR)." -DEPENDS +="${PYTHON_PN}-setuptools-scm-native" - -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10" - -SRC_URI[sha256sum] = "a33aa2e5534fd74401ac95686886e655e3b2ce6383b3f958199b6e70a87c94bf" -SRC_URI[md5sum] = "0940aa8bfd1a07f06a983bb6dc78f1ca" - -inherit pypi setuptools3 ptest - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-unixadmin \ -" - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/tests - cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ -} - -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-datetime \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-cbor2_5.6.3.bb b/meta-python/recipes-devtools/python/python3-cbor2_5.6.3.bb new file mode 100644 index 0000000000..c9c98b6fb5 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-cbor2_5.6.3.bb @@ -0,0 +1,33 @@ +DESCRIPTION = "An implementation of RFC 7049 - Concise Binary Object Representation (CBOR)." +DEPENDS +="python3-setuptools-scm-native" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10" + +SRC_URI[sha256sum] = "e6f0ae2751c2d333a960e0807c0611494eb1245631a167965acbc100509455d3" + +inherit pypi python_setuptools_build_meta ptest + +DEPENDS += "python3-setuptools-scm-native" + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-hypothesis \ + 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-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 new file mode 100644 index 0000000000..3d9194c219 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-cchardet_2.1.7.bb @@ -0,0 +1,12 @@ +SUMMARY = "Universal character encoding detector" +HOMEPAGE = "https://github.com/PyYoshi/cChardet" +LICENSE = "MPL-1.1" +LIC_FILES_CHKSUM = "file://COPYING;md5=6ecda54f6f525388d71d6b3cd92f7474" + +SRC_URI[sha256sum] = "c428b6336545053c2589f6caf24ea32276c6664cb86db817e03a94c60afa0eaf" + +inherit pypi setuptools3 + +BBCLASSEXTEND = "native nativesdk" + +DEPENDS += "python3-cython-native" diff --git a/meta-python/recipes-devtools/python/python3-cerberus_1.3.3.bb b/meta-python/recipes-devtools/python/python3-cerberus_1.3.5.bb index fa0bbb0aad..eb3453aeef 100644 --- a/meta-python/recipes-devtools/python/python3-cerberus_1.3.3.bb +++ b/meta-python/recipes-devtools/python/python3-cerberus_1.3.5.bb @@ -6,6 +6,6 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=48f8e9432d0dac5e0e7a18211a0bacdb" # 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] = "eec10585c33044fb7c69650bc5b68018dac0443753337e2b07684ee0f3c83329" +SRC_URI[sha256sum] = "81011e10266ef71b6ec6d50e60171258a5b134d69f8fb387d16e4936d0d47642" diff --git a/meta-python/recipes-devtools/python/python3-certifi_2020.12.5.bb b/meta-python/recipes-devtools/python/python3-certifi_2020.12.5.bb deleted file mode 100644 index dd2f6a2f63..0000000000 --- a/meta-python/recipes-devtools/python/python3-certifi_2020.12.5.bb +++ /dev/null @@ -1,14 +0,0 @@ -SUMMARY = "Python package for providing Mozilla's CA Bundle." -DESCRIPTION = "This installable Python package contains a CA Bundle that you can reference in your \ -Python code. This is useful for verifying HTTP requests, for example. This is the same CA Bundle \ -which ships with the Requests codebase, and is derived from Mozilla Firefox's canonical set." -HOMEPAGE = " http://certifi.io/" - -LICENSE = "ISC" -LIC_FILES_CHKSUM = "file://LICENSE;md5=f77f61d14ee6feac4228d3ebd26cc1f1" - -SRC_URI[sha256sum] = "1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c" - -inherit pypi setuptools3 - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-cffi_1.14.5.bb b/meta-python/recipes-devtools/python/python3-cffi_1.14.5.bb deleted file mode 100644 index 16928f0dbc..0000000000 --- a/meta-python/recipes-devtools/python/python3-cffi_1.14.5.bb +++ /dev/null @@ -1,18 +0,0 @@ -SUMMARY = "Foreign Function Interface for Python calling C code" -HOMEPAGE = "http://cffi.readthedocs.org/" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=5677e2fdbf7cdda61d6dd2b57df547bf" -DEPENDS += "libffi ${PYTHON_PN}-pycparser" - -SRC_URI[sha256sum] = "fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c" - -inherit pypi setuptools3 - -RDEPENDS_${PN}_class-target = " \ - ${PYTHON_PN}-ctypes \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-pycparser \ - ${PYTHON_PN}-shell \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-chardet_4.0.0.bb b/meta-python/recipes-devtools/python/python3-chardet_4.0.0.bb deleted file mode 100644 index 4caf33cb25..0000000000 --- a/meta-python/recipes-devtools/python/python3-chardet_4.0.0.bb +++ /dev/null @@ -1,23 +0,0 @@ -SUMMARY = "Universal encoding detector for Python 2 and 3" -LICENSE = "LGPL-2.1" -LIC_FILES_CHKSUM = "file://LICENSE;md5=a6f89e2100d9b6cdffcea4f398e37343" - -SRC_URI[sha256sum] = "0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa" - -# setup.py of chardet needs this. -DEPENDS += "${PYTHON_PN}-pytest-runner-native" - -inherit pypi setuptools3 - -PACKAGES =+ "${PN}-cli" -FILES_${PN}-cli += " \ - ${PYTHON_SITEPACKAGES_DIR}/chardet/cli \ -" - -RDEPENDS_${PN}-cli = "${PN} " - -RDEPENDS_${PN}_class-target += " \ - ${PYTHON_PN}-logging \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-charset-normalizer_3.3.2.bb b/meta-python/recipes-devtools/python/python3-charset-normalizer_3.3.2.bb new file mode 100644 index 0000000000..ca9a88ccfb --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-charset-normalizer_3.3.2.bb @@ -0,0 +1,17 @@ +SUMMARY = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +HOMEPAGE = "https://github.com/ousret/charset_normalizer" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=0974a390827087287db39928f7c524b5" + +SRC_URI[sha256sum] = "f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-core \ + python3-logging \ + python3-codecs \ + python3-json \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-cheetah_3.2.6.post1.bb b/meta-python/recipes-devtools/python/python3-cheetah_3.2.6.post1.bb index 8149d6ccee..448772960b 100644 --- a/meta-python/recipes-devtools/python/python3-cheetah_3.2.6.post1.bb +++ b/meta-python/recipes-devtools/python/python3-cheetah_3.2.6.post1.bb @@ -6,8 +6,8 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=15e13a4ed0e5880e3e55ec88b0921181" PYPI_PACKAGE = "Cheetah3" inherit pypi setuptools3 -RDEPENDS_${PN} = "python3-pickle python3-pprint" -RDEPENDS_${PN}_class-native = "" +RDEPENDS:${PN} = "python3-pickle python3-pprint" +RDEPENDS:${PN}:class-native = "" BBCLASSEXTEND = "native nativesdk" 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.1.6.bb b/meta-python/recipes-devtools/python/python3-click-repl_0.1.6.bb deleted file mode 100644 index fce9f98051..0000000000 --- a/meta-python/recipes-devtools/python/python3-click-repl_0.1.6.bb +++ /dev/null @@ -1,9 +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[md5sum] = "2d5f4d42cbd1da9a50a49dff4d6087ca" -SRC_URI[sha256sum] = "b9f29d52abc4d6059f8e276132a111ab8d94980afe6a5432b9d996544afa95d5" - -inherit pypi setuptools3 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_7.1.2.bb b/meta-python/recipes-devtools/python/python3-click_7.1.2.bb deleted file mode 100644 index 0b513e7cb9..0000000000 --- a/meta-python/recipes-devtools/python/python3-click_7.1.2.bb +++ /dev/null @@ -1,40 +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[md5sum] = "53692f62cb99a1a10c59248f1776d9c0" -SRC_URI[sha256sum] = "d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a" - -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/ -} - -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_1.5.0.bb b/meta-python/recipes-devtools/python/python3-cmd2_1.5.0.bb deleted file mode 100644 index 18c7a66995..0000000000 --- a/meta-python/recipes-devtools/python/python3-cmd2_1.5.0.bb +++ /dev/null @@ -1,19 +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=9791cd24ca7d1807388ccd55cd066def" - -DEPENDS += "${PYTHON_PN}-setuptools-scm-native" - -SRC_URI[sha256sum] = "701a8c9975c4abc45e5d13906ab149f959f812869106347323a3f89ac0e82a62" - -inherit pypi setuptools3 - -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-attrs \ - ${PYTHON_PN}-colorama \ - ${PYTHON_PN}-pyperclip \ - ${PYTHON_PN}-wcwidth \ -" - -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.4.bb b/meta-python/recipes-devtools/python/python3-colorama_0.4.6.bb index 54640de04e..0f364c424d 100644 --- a/meta-python/recipes-devtools/python/python3-colorama_0.4.4.bb +++ b/meta-python/recipes-devtools/python/python3-colorama_0.4.6.bb @@ -3,9 +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[md5sum] = "57b22f2597f63df051b69906fbf310cc" -SRC_URI[sha256sum] = "5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b" +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.bb b/meta-python/recipes-devtools/python/python3-coloredlogs_15.0.1.bb index daeda6b2ee..31f75eef62 100644 --- a/meta-python/recipes-devtools/python/python3-coloredlogs_15.0.bb +++ b/meta-python/recipes-devtools/python/python3-coloredlogs_15.0.1.bb @@ -4,20 +4,16 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=764e737b117a38d773609885e8d04f0b" -SRC_URI[sha256sum] = "5e78691e2673a8e294499e1832bb13efcfb44a86b92e18109fa18951093218ab" +SRC_URI[sha256sum] = "7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0" inherit pypi setuptools3 -do_compile_prepend() { - sed -ie "s/find_pth_directory(),/'',/g" ${S}/setup.py -} - -do_install_append() { +do_install:append() { rm -rf ${D}${datadir} } -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-humanfriendly \ +RDEPENDS:${PN} += "\ + python3-humanfriendly \ " -BBCLASSEXTEND = "native" +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-colorlog_4.8.0.bb b/meta-python/recipes-devtools/python/python3-colorlog_4.8.0.bb deleted file mode 100644 index 6f9b8d47a4..0000000000 --- a/meta-python/recipes-devtools/python/python3-colorlog_4.8.0.bb +++ /dev/null @@ -1,10 +0,0 @@ -DESCRIPTION = "A colored formatter for the python logging module" -HOMEPAGE = "https://github.com/borntyping/python-colorlog" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=85a1d478cd35d62763a1419e948bdde4" - -inherit pypi setuptools3 - -PYPI_PACKAGE = "colorlog" - -SRC_URI[sha256sum] = "59b53160c60902c405cdec28d38356e09d40686659048893e026ecbd589516b1" diff --git a/meta-python/recipes-devtools/python/python3-colorlog_6.8.2.bb b/meta-python/recipes-devtools/python/python3-colorlog_6.8.2.bb new file mode 100644 index 0000000000..c26f4bb70e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-colorlog_6.8.2.bb @@ -0,0 +1,12 @@ +DESCRIPTION = "A colored formatter for the python logging module" +HOMEPAGE = "https://github.com/borntyping/python-colorlog" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=5c3c6ebdec7792ae12df8d1c0a46b26a" + +inherit pypi setuptools3 + +PYPI_PACKAGE = "colorlog" + +SRC_URI[sha256sum] = "3e3e079a41feb5a1b64f978b5ea4f46040a94f11f0e8bbb8261e3dbbeca64d44" + +RDEPENDS:${PN} += "python3-logging" diff --git a/meta-python/recipes-devtools/python/python3-colorzero_2.0.bb b/meta-python/recipes-devtools/python/python3-colorzero_2.0.bb new file mode 100644 index 0000000000..fc1615e670 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-colorzero_2.0.bb @@ -0,0 +1,19 @@ +SUMMARY = "colorzero is a color manipulation library for Python" +DESCRIPTION = "colorzero is a color manipulation library for Python \ +(yes, another one) which aims to be reasonably simple to use and \ +"pythonic" in nature." +HOMEPAGE = " https://github.com/waveform80/colorzero " + +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=ae6c62710c0646f3c60d1ad812ea9bf9" + +RDEPENDS:${PN} += " \ + python3-image \ + python3-numbers \ +" + +SRC_URI[sha256sum] = "e7d5a5c26cd0dc37b164ebefc609f388de24f8593b659191e12d85f8f9d5eb58" + +inherit pypi setuptools3 + +PYPI_PACKAGE = "colorzero" diff --git a/meta-python/recipes-devtools/python/python3-configargparse_1.4.bb b/meta-python/recipes-devtools/python/python3-configargparse_1.7.bb index 393f138740..1c49d891d2 100644 --- a/meta-python/recipes-devtools/python/python3-configargparse_1.4.bb +++ b/meta-python/recipes-devtools/python/python3-configargparse_1.7.bb @@ -3,18 +3,19 @@ HOMEPAGE = "https://github.com/bw2/ConfigArgParse" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=da746463714cc35999ed9a42339f2943" -SRC_URI[sha256sum] = "abef9ff44fb0091f0e3bb2ee7e5b26a02b5b62d45408a5272a9bd461f5b59b4b" +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 \ +RDEPENDS:${PN} += "\ + python3-core \ + python3-shell \ + python3-json \ " BBCLASSEXTEND = "native nativesdk" 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 1b85368105..0000000000 --- a/meta-python/recipes-devtools/python/python3-configobj_5.0.6.bb +++ /dev/null @@ -1,9 +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" - -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-configparser_5.0.2.bb b/meta-python/recipes-devtools/python/python3-configparser_5.0.2.bb deleted file mode 100644 index 87cdd09f72..0000000000 --- a/meta-python/recipes-devtools/python/python3-configparser_5.0.2.bb +++ /dev/null @@ -1,13 +0,0 @@ -SUMMARY = "This module provides the ConfigParser class which implements a basic configuration language which provides a structure similar to what's found in Microsoft Windows INI files." -SECTION = "devel/python" -HOMEPAGE = "https://docs.python.org/3/library/configparser.html" -LICENSE = "MIT" - -LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=10;endline=10;md5=23f9ad5cad3d8cc0336e2a5d8a87e1fa" - -SRC_URI[sha256sum] = "85d5de102cfe6d14a5172676f09d19c465ce63d6019cf0a4ef13385fc535e828" - -DEPENDS += "${PYTHON_PN}-setuptools-scm-native ${PYTHON_PN}-toml-native" -inherit pypi setuptools3 - -BBCLASSEXTEND = "native nativesdk" 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 70e67a1a7e..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,11 +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 - -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 ad24f6de6d..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-contextlib2_0.6.0.post1.bb b/meta-python/recipes-devtools/python/python3-contextlib2_21.6.0.bb index 2eac0ad270..5a54c696f4 100644 --- a/meta-python/recipes-devtools/python/python3-contextlib2_0.6.0.post1.bb +++ b/meta-python/recipes-devtools/python/python3-contextlib2_21.6.0.bb @@ -1,10 +1,10 @@ DESCRIPTION = "Backports and enhancements for the contextlib module" HOMEPAGE = "http://contextlib2.readthedocs.org/" SECTION = "devel/python" -LICENSE = "PSF" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=43d1c7827e8fad6454b553caf0e1d734" +LICENSE = "PSF-2.0 & Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=d2b6be100f1002194122ec9bfee7b8b4" -SRC_URI[sha256sum] = "01f490098c18b19d2bd5bb5dc445b2054d2fa97f09a4280ba2c5f3c394c8162e" +SRC_URI[sha256sum] = "ab1e2bfe1d01d968e1b7e8d9023bc51ef3509bba217bb730cee3827e1ee82869" inherit pypi setuptools3 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_5.5.bb b/meta-python/recipes-devtools/python/python3-coverage_5.5.bb deleted file mode 100644 index c780a63ae9..0000000000 --- a/meta-python/recipes-devtools/python/python3-coverage_5.5.bb +++ /dev/null @@ -1,9 +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] = "ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c" - -inherit pypi setuptools3 - 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/0001-Fix-build-error-as-following.patch b/meta-python/recipes-devtools/python/python3-cppy/0001-Fix-build-error-as-following.patch new file mode 100644 index 0000000000..5a613c827a --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-cppy/0001-Fix-build-error-as-following.patch @@ -0,0 +1,28 @@ +From a6ba15048bbb660abfa094b581862b4936ac4005 Mon Sep 17 00:00:00 2001 +From: Lei Maohui <leimaohui@fujitsu.com> +Date: Mon, 18 Apr 2022 12:19:35 +0900 +Subject: [PATCH] Fix build error as following: + +flit_core.config.ConfigError: description must be specified under [project] or listed as a dynamic field. + +Upstream-Status: Pending +Signed-off-by: Lei Maohui <leimaohui@fujitsu.com> +--- + pyproject.toml | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/pyproject.toml b/pyproject.toml +index 2d2ac74..66fcee0 100644 +--- a/pyproject.toml ++++ b/pyproject.toml +@@ -8,6 +8,7 @@ + + [project] + name = "cppy" ++description = "A small C++ header library" + readme = "README.rst" + requires-python = ">=3.7" + license = {file = "LICENSE"} +-- +2.25.1 + diff --git a/meta-python/recipes-devtools/python/python3-cppy_1.1.0.bb b/meta-python/recipes-devtools/python/python3-cppy_1.1.0.bb deleted file mode 100644 index 79ddbed7c2..0000000000 --- a/meta-python/recipes-devtools/python/python3-cppy_1.1.0.bb +++ /dev/null @@ -1,11 +0,0 @@ -SUMMARY = "C++ headers for C extension development" -HOMEPAGE = "https://cppy.readthedocs.io/en/latest/" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=0bfb3e39b13587f0028f17baf0e42371" - -SRC_URI[md5sum] = "2110891d75aa12551deebba1603428c6" -SRC_URI[sha256sum] = "4eda6f1952054a270f32dc11df7c5e24b259a09fddf7bfaa5f33df9fb4a29642" - -inherit pypi setuptools3 - -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 new file mode 100644 index 0000000000..7817401fa4 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-cppy_1.2.1.bb @@ -0,0 +1,17 @@ +SUMMARY = "C++ headers for C extension development" +HOMEPAGE = "https://cppy.readthedocs.io/en/latest/" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=0bfb3e39b13587f0028f17baf0e42371" + +SRC_URI[sha256sum] = "83b43bf17b1085ac15c5debdb42154f138b928234b21447358981f69d0d6fe1b" + +RDEPENDS:${PN} += "python3-setuptools" + +inherit pypi python_setuptools_build_meta + +SRC_URI += " file://0001-Fix-build-error-as-following.patch \ + " + +DEPENDS += "python3-setuptools-scm-native" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-crc32c_2.3.bb b/meta-python/recipes-devtools/python/python3-crc32c_2.3.bb new file mode 100644 index 0000000000..da756ea074 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-crc32c_2.3.bb @@ -0,0 +1,22 @@ +SUMMARY = "A python package implementing the crc32c algorithmin hardware and software" +HOMEPAGE = "https://github.com/ICRAR/crc32c" + +LICENSE = "BSD-2-Clause & BSD-3-Clause & CRC32C-ADLER & LGPL-2.0-or-later" +LIC_FILES_CHKSUM = " \ + file://LICENSE;md5=4fbd65380cdd255951079008b364516c \ + file://LICENSE.google-crc32c;md5=e9ed01b5e5ac9eae23fc2bb33701220c \ + file://LICENSE.slice-by-8;md5=6b3bc7709d6b2db6646ec2467310ff6b \ + file://crc32c_adler.c;beginline=9;endline=24;md5=9c8bd2afd2d340fd37c038759cd4eff8 \ +" + +SRC_URI[sha256sum] = "17ce6c596ad0d53df52dcd72defb66984aeabd98fbefea7ba848a6b6bdece36a" + +inherit pypi setuptools3 + +do_compile:prepend() { + if ! grep 'platform =' setup.cfg; then + printf "[build_ext]\nplatform = ${TARGET_ARCH}" >> setup.cfg + fi +} + +RDEPENDS:${PN} += "python3-core" diff --git a/meta-python/recipes-devtools/python/python3-crcmod/0001-setup.py-use-setuptools-instead-of-distutils.patch b/meta-python/recipes-devtools/python/python3-crcmod/0001-setup.py-use-setuptools-instead-of-distutils.patch new file mode 100644 index 0000000000..9bcb871135 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-crcmod/0001-setup.py-use-setuptools-instead-of-distutils.patch @@ -0,0 +1,22 @@ +From 3dc1e9584ed2ac81e7526b8dbf76b4a06ea8ac76 Mon Sep 17 00:00:00 2001 +From: Justin Bronder <jsbronder@cold-front.org> +Date: Tue, 1 Mar 2022 10:34:42 -0500 +Subject: [PATCH] setup.py use setuptools instead of distutils + +Upstream-Status: Pending +Signed-off-by: Justin Bronder <jsbronder@cold-front.org> +--- + setup.py | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index e3a524b..2f2bcfc 100644 +--- a/setup.py ++++ b/setup.py +@@ -1,5 +1,4 @@ +-from distutils.core import setup +-from distutils.extension import Extension ++from setuptools import Extension, setup + import sys,os + + if sys.version_info[0] == 2: 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 14a344f76f..11d36b53ec 100644 --- a/meta-python/recipes-devtools/python/python3-crcmod_1.7.bb +++ b/meta-python/recipes-devtools/python/python3-crcmod_1.7.bb @@ -4,11 +4,11 @@ LICENSE = "MIT" SECTION = "devel/python" LIC_FILES_CHKSUM = "file://LICENSE;md5=f9a19291627cad2d1dfbfcf3c9fb85c2" -SRC_URI[md5sum] = "2d5b92117d958dcead94f9e17f54cd32" +SRC_URI += "file://0001-setup.py-use-setuptools-instead-of-distutils.patch" SRC_URI[sha256sum] = "dc7051a0db5f2bd48665a990d3ec1cc305a466a77358ca4492826f41f283601e" 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.0.11.bb b/meta-python/recipes-devtools/python/python3-croniter_1.0.11.bb deleted file mode 100644 index ca9bf71a56..0000000000 --- a/meta-python/recipes-devtools/python/python3-croniter_1.0.11.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] = "cd89bcbed4d79f56bbf2c9415c2bbbfd09fadc8a59dbae3898fbca5bab34103d" - -inherit pypi setuptools3 - -RDEPENDS_${PN} += " python3-dateutil python3-natsort" diff --git a/meta-python/recipes-devtools/python/python3-croniter_2.0.3.bb b/meta-python/recipes-devtools/python/python3-croniter_2.0.3.bb new file mode 100644 index 0000000000..ad80574a95 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-croniter_2.0.3.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] = "28763ad39c404e159140874f08010cfd8a18f4c2a7cea1ce73e9506a4380cfc1" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-dateutil \ + python3-natsort \ + python3-pytz \ +" diff --git a/meta-python/recipes-devtools/python/python3-cryptography-vectors_3.4.6.bb b/meta-python/recipes-devtools/python/python3-cryptography-vectors_3.4.6.bb deleted file mode 100644 index b5f34daefe..0000000000 --- a/meta-python/recipes-devtools/python/python3-cryptography-vectors_3.4.6.bb +++ /dev/null @@ -1,19 +0,0 @@ -SUMMARY = "Test vectors for the cryptography package." -HOMEPAGE = "https://cryptography.io/" -SECTION = "devel/python" -LICENSE = "Apache-2.0 | BSD" -LIC_FILES_CHKSUM = "file://LICENSE;md5=8c3617db4fb6fae01f1d253ab91511e4" - -SRC_URI[sha256sum] = "e5f88a5fb03d60b4f20eed4920638b6a3ed32a363523a77086528d557a2c2da8" - -PYPI_PACKAGE = "cryptography_vectors" - -inherit pypi setuptools3 - -DEPENDS += " \ - ${PYTHON_PN}-cryptography \ -" - -BBCLASSEXTEND = "native nativesdk" - -UPSTREAM_CHECK_REGEX = "" diff --git a/meta-python/recipes-devtools/python/python3-cryptography/h-test.patch b/meta-python/recipes-devtools/python/python3-cryptography/h-test.patch deleted file mode 100644 index 9f07c73803..0000000000 --- a/meta-python/recipes-devtools/python/python3-cryptography/h-test.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- a/tests/hypothesis/__init__.py -+++ b/tests/hypothesis/__init__.py -@@ -3,3 +3,7 @@ - # for complete details. - - from __future__ import absolute_import, division, print_function -+ -+import pytest -+hypothesis = pytest.importorskip("hypothesis") -+ diff --git a/meta-python/recipes-devtools/python/python3-cryptography/run-ptest b/meta-python/recipes-devtools/python/python3-cryptography/run-ptest deleted file mode 100644 index 0ba239c2a4..0000000000 --- a/meta-python/recipes-devtools/python/python3-cryptography/run-ptest +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -py.test diff --git a/meta-python/recipes-devtools/python/python3-cryptography_3.3.1.bb b/meta-python/recipes-devtools/python/python3-cryptography_3.3.1.bb deleted file mode 100644 index 79a7ac1bf9..0000000000 --- a/meta-python/recipes-devtools/python/python3-cryptography_3.3.1.bb +++ /dev/null @@ -1,65 +0,0 @@ -SUMMARY = "Provides cryptographic recipes and primitives to python developers" -HOMEPAGE = "https://cryptography.io/" -SECTION = "devel/python" -LICENSE = "Apache-2.0 | BSD" -LIC_FILES_CHKSUM = "file://LICENSE;md5=bf405a8056a6647e7d077b0e7bc36aba" - -LDSHARED += "-pthread" - -SRC_URI[sha256sum] = "7e177e4bea2de937a584b13645cab32f25e3d96fc0bc4a4cf99c27dc77682be6" - -SRC_URI += " \ - file://run-ptest \ - file://h-test.patch \ -" - -inherit pypi setuptools3 - -DEPENDS += " \ - ${PYTHON_PN}-cffi \ - ${PYTHON_PN}-cffi-native \ - ${PYTHON_PN}-asn1crypto \ - ${PYTHON_PN}-six \ -" - -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-cffi \ - ${PYTHON_PN}-idna \ - ${PYTHON_PN}-asn1crypto \ - ${PYTHON_PN}-setuptools \ - ${PYTHON_PN}-six \ -" - -RDEPENDS_${PN}_class-target += " \ - ${PYTHON_PN}-cffi \ - ${PYTHON_PN}-idna \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-asn1crypto \ - ${PYTHON_PN}-setuptools \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-threading \ -" - -RDEPENDS_${PN}-ptest += " \ - ${PN} \ - ${PYTHON_PN}-cryptography-vectors \ - ${PYTHON_PN}-iso8601 \ - ${PYTHON_PN}-pretend \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-pytz \ -" - -inherit ptest - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/tests - cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ - install -d ${D}${PTEST_PATH}/tests/hazmat - cp -rf ${S}/tests/hazmat/* ${D}${PTEST_PATH}/tests/hazmat/ -} - -FILES_${PN}-dbg += " \ - ${libdir}/${PYTHON_PN}2.7/site-packages/${SRCNAME}/hazmat/bindings/.debug \ -" - -BBCLASSEXTEND = "native nativesdk" 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.6.bb b/meta-python/recipes-devtools/python/python3-cvxopt_1.3.2.bb index 360df6a3ef..d7d4b22fbd 100644 --- a/meta-python/recipes-devtools/python/python3-cvxopt_1.2.6.bb +++ b/meta-python/recipes-devtools/python/python3-cvxopt_1.3.2.bb @@ -1,15 +1,15 @@ SUMMARY = "Convex optimization package" HOMEPAGE = "http://cvxopt.org" -LICENSE = "GPL-3.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=ba1a8a73d8ebea5c47a1173aaf476ddd" +LICENSE = "GPL-3.0-only" +LIC_FILES_CHKSUM = "file://LICENSE;md5=66ec4f8e53d3e733a8c26d5ca3830fba" -SRC_URI = "git://github.com/cvxopt/cvxopt;protocol=https" +SRC_URI = "git://github.com/cvxopt/cvxopt;protocol=https;branch=master" -SRCREV = "60fdb838e0bb2d8f32ba51129552c83b55acd2a7" +SRCREV = "3b718ee560b3b97d6255c55f0ed7f64cb4b72082" S = "${WORKDIR}/git" -RDEPENDS_${PN} += "lapack suitesparse" +RDEPENDS:${PN} += "lapack suitesparse" DEPENDS += "lapack suitesparse" inherit setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-cycler_0.10.0.bb b/meta-python/recipes-devtools/python/python3-cycler_0.12.1.bb index cd21be8ac1..574083b61f 100644 --- a/meta-python/recipes-devtools/python/python3-cycler_0.10.0.bb +++ b/meta-python/recipes-devtools/python/python3-cycler_0.12.1.bb @@ -1,14 +1,13 @@ SUMMARY = "Composable style cycles" HOMEPAGE = "http://github.com/matplotlib/cycler" -LICENSE = "BSD" +LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=7713fe42cd766b15c710e19392bfa811" -SRC_URI[md5sum] = "4cb42917ac5007d1cdff6cccfe2d016b" -SRC_URI[sha256sum] = "cd7b2d1018258d7247a71425e9f26463dfb444d411c39569972f4ce586b0c9d8" +SRC_URI[sha256sum] = "88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta -RDEPENDS_${PN} += "\ +RDEPENDS:${PN} += "\ python3-core \ python3-six \ " diff --git a/meta-python/recipes-devtools/python/python3-cytoolz_0.12.3.bb b/meta-python/recipes-devtools/python/python3-cytoolz_0.12.3.bb new file mode 100644 index 0000000000..f9c9704d7f --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-cytoolz_0.12.3.bb @@ -0,0 +1,13 @@ +SUMMARY = "Cython implementation of the toolz package, which provides high \ +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=d422ebce3e9c6447563bd410e9b22f2e" + +SRC_URI[sha256sum] = "4503dc59f4ced53a54643272c61dc305d1dbbfbd7d6bdf296948de9f34c3a282" + +inherit pypi setuptools3 + +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.0.0.bb b/meta-python/recipes-devtools/python/python3-dateparser_1.2.0.bb index e3691dd83a..a08564b3f5 100644 --- a/meta-python/recipes-devtools/python/python3-dateparser_1.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-dateparser_1.2.0.bb @@ -3,8 +3,7 @@ HOMEPAGE = "https://github.com/scrapinghub/dateparser" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=3d3ed25571191e7aa3f55d0a6efe0051" -SRC_URI[md5sum] = "24a06a429597239004d47e6b93991aaf" -SRC_URI[sha256sum] = "159cc4e01a593706a15cd4e269a0b3345edf3aef8bf9278a57dac8adf5bf1e4a" +SRC_URI[sha256sum] = "7975b43a4222283e0ae15be7b4999d08c9a70e2d378ac87385b1ccf2cffbbb30" PYPI_PACKAGE = "dateparser" @@ -12,10 +11,13 @@ inherit pypi setuptools3 CLEANBROKEN = "1" -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-dateutil \ - ${PYTHON_PN}-tzlocal \ - ${PYTHON_PN}-ruamel-yaml \ +RDEPENDS:${PN} += " \ + 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.1.bb b/meta-python/recipes-devtools/python/python3-dateutil_2.9.0.bb index 5326924e64..1f7a4a03fd 100644 --- a/meta-python/recipes-devtools/python/python3-dateutil_2.8.1.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[md5sum] = "f2a1d4b680b297b367a974664ca3a4f6" -SRC_URI[sha256sum] = "73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c" +SRC_URI[sha256sum] = "78e73e19c63f5b20ffa567001531680d939dc042bf7850431877645523c66709" PYPI_PACKAGE = "python-dateutil" -inherit pypi setuptools3 +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 \ +RDEPENDS:${PN} = "\ + 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.2.bb b/meta-python/recipes-devtools/python/python3-dbus-next_0.2.3.bb index 1970fdec1c..9f6aa7ed7f 100644 --- a/meta-python/recipes-devtools/python/python3-dbus-next_0.2.2.bb +++ b/meta-python/recipes-devtools/python/python3-dbus-next_0.2.3.bb @@ -3,10 +3,15 @@ HOMEPAGE = "https://github.com/acrisci/python-dbus-next" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=94e750c96e56788499b56c81de91431c" -SRC_URI[sha256sum] = "f656a3d3450b670f228248ffb1c3a703a69c4a8cb10cce63b108f17c8bd6c3de" +SRC_URI[sha256sum] = "f4eae26909332ada528c0a3549dda8d4f088f9b365153952a408e28023a626a5" 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/setuptools.patch b/meta-python/recipes-devtools/python/python3-dbussy/setuptools.patch new file mode 100644 index 0000000000..3506f76d02 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-dbussy/setuptools.patch @@ -0,0 +1,56 @@ +Port setup.py to setuptools. + +Upstream-Status: Submitted [https://github.com/ldo/dbussy/pull/53] +Signed-off-by: Ross Burton <ross.burton@arm.com> + +diff --git a/setup.py b/setup.py +index 4b9411e..da7ee7e 100644 +--- a/setup.py ++++ b/setup.py +@@ -8,33 +8,9 @@ + # Written by Lawrence D'Oliveiro <ldo@geek-central.gen.nz>. + #- + +-import sys +-import distutils.core +-from distutils.command.build import \ +- build as std_build ++import setuptools + +-class my_build(std_build) : +- "customization of build to perform additional validation." +- +- def run(self) : +- try : +- exec \ +- ( +- "async def dummy() :\n" +- " pass\n" +- "#end dummy\n" +- ) +- except SyntaxError : +- sys.stderr.write("This module requires Python 3.5 or later.\n") +- sys.exit(-1) +- #end try +- super().run() +- #end run +- +-#end my_build +- +-distutils.core.setup \ +- ( ++setuptools.setup( + name = "DBussy", + version = "1.3", + description = "language bindings for libdbus, for Python 3.5 or later", +@@ -43,9 +19,5 @@ distutils.core.setup \ + author_email = "ldo@geek-central.gen.nz", + url = "https://github.com/ldo/dbussy", + license = "LGPL v2.1+", + py_modules = ["dbussy", "ravel"], +- cmdclass = +- { +- "build" : my_build, +- }, +- ) ++) 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 08f5e940fe..59da4545aa 100644 --- a/meta-python/recipes-devtools/python/python3-dbussy_1.3.bb +++ b/meta-python/recipes-devtools/python/python3-dbussy_1.3.bb @@ -1,17 +1,18 @@ SUMMARY = "language bindings for libdbus, for Python 3.5 or later" HOMEPAGE = "https://github.com/ldo/dbussy" -LICENSE = "LGPLv2.1" +LICENSE = "LGPL-2.1-only" LIC_FILES_CHKSUM = "file://COPYING;md5=a916467b91076e631dd8edb7424769c7" -SRC_URI = "git://github.com/ldo/dbussy.git" +SRC_URI = "git://github.com/ldo/dbussy.git;branch=master;protocol=https \ + file://setuptools.patch" SRCREV = "37ede4242b48def73ada46c2747a4c5cae6abf45" S = "${WORKDIR}/git" -inherit distutils3 +inherit setuptools3 -RDEPENDS_${PN} += "\ +RDEPENDS:${PN} += "\ python3-asyncio \ python3-core \ python3-ctypes \ @@ -19,4 +20,3 @@ RDEPENDS_${PN} += "\ " BBCLASSEXTEND = "native nativesdk" - diff --git a/meta-python/recipes-devtools/python/python3-decorator_5.0.6.bb b/meta-python/recipes-devtools/python/python3-decorator_5.1.1.bb index 9e837b719e..f330376243 100644 --- a/meta-python/recipes-devtools/python/python3-decorator_5.0.6.bb +++ b/meta-python/recipes-devtools/python/python3-decorator_5.1.1.bb @@ -9,10 +9,12 @@ decorator, just because you can." LICENSE = "BSD-2-Clause" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=be2fd2007972bf96c08af3293d728b22" -SRC_URI[sha256sum] = "f2e71efb39412bfd23d878e896a51b07744f2e2250b2e87d158e76828c5ae202" +SRC_URI[sha256sum] = "637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330" inherit pypi setuptools3 -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-stringold \ +RDEPENDS:${PN} += "\ + python3-stringold \ " + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-decouple_3.8.bb b/meta-python/recipes-devtools/python/python3-decouple_3.8.bb new file mode 100644 index 0000000000..20d614a423 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-decouple_3.8.bb @@ -0,0 +1,16 @@ +SUMMARY = "Strict separation of settings from code." +HOMEPAGE = "https://github.com/henriquebastos/python-decouple/" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=a46375b26bb7d7603565d829a2a51782" + +SRC_URI[sha256sum] = "ba6e2657d4f376ecc46f77a3a615e058d93ba5e465c01bbe57289bfb7cce680f" + +PYPI_PACKAGE = "python-decouple" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-shell \ + python3-stringold \ +" 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 f48c429c41..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 @@ -2,9 +2,13 @@ SUMMARY = "XML bomb protection for Python stdlib modules" DESCRIPTION = "Python package with modified subclasses of all stdlib XML \ parsers that prevent any potentially malicious operation." -LICENSE = "PSF" +LICENSE = "PSF-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=056fea6a4b395a24d0d278bf5c80249e" SRC_URI[sha256sum] = "1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69" inherit pypi setuptools3 + +BBCLASSEXTEND = "native" + +RDEPENDS:${PN} += "python3-xml" diff --git a/meta-python/recipes-devtools/python/python3-deprecated_1.2.14.bb b/meta-python/recipes-devtools/python/python3-deprecated_1.2.14.bb new file mode 100644 index 0000000000..49d5f01c8f --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-deprecated_1.2.14.bb @@ -0,0 +1,13 @@ +SUMMARY = "Python @deprecated decorator to deprecate old python classes, functions or methods." +HOMEPAGE = "https://deprecated.readthedocs.io/en/latest/" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=44288e26f4896bdab14072d4fa35ff01" + +PYPI_PACKAGE = "Deprecated" +SRC_URI[sha256sum] = "e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-wrapt \ +" diff --git a/meta-python/recipes-devtools/python/python3-dill_0.3.3.bb b/meta-python/recipes-devtools/python/python3-dill_0.3.3.bb deleted file mode 100644 index bf26ba30b5..0000000000 --- a/meta-python/recipes-devtools/python/python3-dill_0.3.3.bb +++ /dev/null @@ -1,11 +0,0 @@ -SUMMARY = "Serialize all of python" -HOMEPAGE = "https://pypi.org/project/dill/" -LICENSE = "BSD" -LIC_FILES_CHKSUM = "file://LICENSE;md5=90fee9f98d11d59df3f8aa813ff9a3de" - -SRC_URI[md5sum] = "99c878e2e4e924f3234c0efcbcff6abf" -SRC_URI[sha256sum] = "efb7f6cb65dba7087c1e111bb5390291ba3616741f96840bfc75792a1a9b5ded" - -inherit pypi setuptools3 - -PYPI_PACKAGE_EXT = "zip" 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.2.1.bb b/meta-python/recipes-devtools/python/python3-diskcache_5.2.1.bb deleted file mode 100644 index 4a028d7694..0000000000 --- a/meta-python/recipes-devtools/python/python3-diskcache_5.2.1.bb +++ /dev/null @@ -1,13 +0,0 @@ -DESCRIPTION = "Disk Cache -- Disk and file backed persistent cache." -HOMEPAGE = "http://www.grantjenks.com/docs/diskcache/" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=a3e7dd5bc8f0053fee7c5fe9692b932d" - -SRC_URI[sha256sum] = "1805acd5868ac10ad547208951a1190a0ab7bbff4e70f9a07cde4dbdfaa69f64" - -PYPI_PACKAGE = "diskcache" - -inherit pypi setuptools3 - -CLEANBROKEN = "1" - diff --git a/meta-python/recipes-devtools/python/python3-diskcache_5.6.3.bb b/meta-python/recipes-devtools/python/python3-diskcache_5.6.3.bb new file mode 100644 index 0000000000..09b06553df --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-diskcache_5.6.3.bb @@ -0,0 +1,22 @@ +DESCRIPTION = "Disk Cache -- Disk and file backed persistent cache." +HOMEPAGE = "http://www.grantjenks.com/docs/diskcache/" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=c60ef82f0f40155453f6d5f2c94b6e8e" + +SRC_URI[sha256sum] = "2c3a3fa2743d8535d832ec61c2054a1641f41775aa7c556758a109941e33e4fc" + +PYPI_PACKAGE = "diskcache" + +inherit pypi setuptools3 + +RDEPENDS:${PN} = "\ + 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.5.0.bb b/meta-python/recipes-devtools/python/python3-distro_1.9.0.bb index aaaee0deee..08a9526783 100644 --- a/meta-python/recipes-devtools/python/python3-distro_1.5.0.bb +++ b/meta-python/recipes-devtools/python/python3-distro_1.9.0.bb @@ -5,9 +5,15 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=d2794c0df5b907fdace235a619d80314" PYPI_PACKAGE = "distro" -SRC_URI[md5sum] = "0ed68b4064709bdaaf6cce69780ddc51" -SRC_URI[sha256sum] = "0e58756ae38fbd8fc3020d54badb8eae17c5b9dcbed388b17bb55b8a5928df92" +SRC_URI[sha256sum] = "2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta + +RDEPENDS:${PN} = "\ + python3-core \ + python3-json \ + python3-logging \ + python3-shell \ +" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-django_2.2.16.bb b/meta-python/recipes-devtools/python/python3-django_2.2.16.bb deleted file mode 100644 index 0715abbd4c..0000000000 --- a/meta-python/recipes-devtools/python/python3-django_2.2.16.bb +++ /dev/null @@ -1,9 +0,0 @@ -require python-django.inc -inherit setuptools3 - -SRC_URI[md5sum] = "93faf5bbd54a19ea49f4932a813b9758" -SRC_URI[sha256sum] = "62cf45e5ee425c52e411c0742e641a6588b7e8af0d2c274a27940931b2786594" - -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-sqlparse \ -" diff --git a/meta-python/recipes-devtools/python/python3-django_3.2.bb b/meta-python/recipes-devtools/python/python3-django_3.2.bb deleted file mode 100644 index e147e2f9d1..0000000000 --- a/meta-python/recipes-devtools/python/python3-django_3.2.bb +++ /dev/null @@ -1,13 +0,0 @@ -require python-django.inc -inherit setuptools3 - -SRC_URI[sha256sum] = "21f0f9643722675976004eb683c55d33c05486f94506672df3d6a141546f389d" - -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" can be added to local.conf -DEFAULT_PREFERENCE = "-1" diff --git a/meta-python/recipes-devtools/python/python3-django_4.2.11.bb b/meta-python/recipes-devtools/python/python3-django_4.2.11.bb new file mode 100644 index 0000000000..0642b7e7c3 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-django_4.2.11.bb @@ -0,0 +1,14 @@ +require python-django.inc +inherit setuptools3 + +SRC_URI[sha256sum] = "6e6ff3db2d8dd0c986b4eec8554c8e4f919b5c1ff62a5b4390c17aff2ed6e5c4" + +RDEPENDS:${PN} += "\ + 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.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.12.4.bb b/meta-python/recipes-devtools/python/python3-djangorestframework_3.15.1.bb index 417e36721a..9515aa2296 100644 --- a/meta-python/recipes-devtools/python/python3-djangorestframework_3.12.4.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] = "f747949a8ddac876e879190df194b925c177cdeb725a099db1460872f7c0a7f2" +SRC_URI[sha256sum] = "f88fad74183dfc7144b2756d0d2ac716ea5b4c7c9840995ac3bfd8ec034333c1" PYPI_PACKAGE = "djangorestframework" inherit pypi setuptools3 -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-django \ +RDEPENDS:${PN} += "\ + 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.1.0.bb b/meta-python/recipes-devtools/python/python3-dnspython_2.1.0.bb deleted file mode 100644 index 20de09391f..0000000000 --- a/meta-python/recipes-devtools/python/python3-dnspython_2.1.0.bb +++ /dev/null @@ -1,32 +0,0 @@ -DESCRIPTION = "DNS toolkit for Python" -HOMEPAGE = "http://www.dnspython.org/" -LICENSE = "ISC" -LIC_FILES_CHKSUM = "file://LICENSE;md5=5af50906b5929837f667dfe31052bd34" - -SRC_URI[sha256sum] = "e4a87f0b573201a0f3727fa18a516b055fd1107e0e5477cded4a2de497df1dd4" - -PYPI_PACKAGE_EXT = "zip" - -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/ -} - -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-crypt \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-math \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-threading \ -" diff --git a/meta-python/recipes-devtools/python/python3-dnspython_2.6.1.bb b/meta-python/recipes-devtools/python/python3-dnspython_2.6.1.bb new file mode 100644 index 0000000000..13e31afe79 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-dnspython_2.6.1.bb @@ -0,0 +1,36 @@ +DESCRIPTION = "DNS toolkit for Python" +HOMEPAGE = "http://www.dnspython.org/" +LICENSE = "ISC" +LIC_FILES_CHKSUM = "file://LICENSE;md5=5af50906b5929837f667dfe31052bd34" + +SRC_URI[sha256sum] = "e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc" + +inherit pypi python_hatchling 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/ +} + +DEPENDS += "\ + python3-wheel-native \ + python3-setuptools-scm-native \ +" + +RDEPENDS:${PN} += " \ + python3-crypt \ + python3-io \ + python3-math \ + python3-netclient \ + python3-numbers \ + python3-threading \ +" diff --git a/meta-python/recipes-devtools/python/python3-docutils_0.17.bb b/meta-python/recipes-devtools/python/python3-docutils_0.17.bb deleted file mode 100644 index 8605e93b52..0000000000 --- a/meta-python/recipes-devtools/python/python3-docutils_0.17.bb +++ /dev/null @@ -1,9 +0,0 @@ -SUMMARY = "Docutils is a modular system for processing documentation into useful formats" -HOMEPAGE = "https://pypi.org/project/docutils/" -SECTION = "devel/python" -LICENSE = "BSD-2-Clause & GPL-2.0 & Python-2.0" -LIC_FILES_CHKSUM = "file://COPYING.txt;md5=836a1950177996968a49ff477a4a61c4" - -SRC_URI[sha256sum] = "e2ffeea817964356ba4470efba7c2f42b6b0de0b04e66378507e3e2504bbff4c" - -inherit pypi setuptools3 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.6.0.bb b/meta-python/recipes-devtools/python/python3-dominate_2.9.1.bb index b7c738d656..054d5236e5 100644 --- a/meta-python/recipes-devtools/python/python3-dominate_2.6.0.bb +++ b/meta-python/recipes-devtools/python/python3-dominate_2.9.1.bb @@ -1,18 +1,18 @@ SUMMARY = "Dominate is a Python library for creating and manipulating HTML documents using an elegant DOM API." -LICENSE = "LGPLv3" +LICENSE = "LGPL-3.0-only" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=b52f2d57d10c4f7ee67a7eb9615d5d24" -SRC_URI[md5sum] = "9f714324ca99eee98bb3c3cdbe838de6" -SRC_URI[sha256sum] = "76ec2cde23700a6fc4fee098168b9dee43b99c2f1dd0ca6a711f683e8eb7e1e4" +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 \ +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { @@ -20,7 +20,7 @@ do_install_ptest() { cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ } -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-threading \ +RDEPENDS:${PN} += "\ + python3-numbers \ + python3-threading \ " diff --git a/meta-python/recipes-devtools/python/python3-dt-schema_git.bb b/meta-python/recipes-devtools/python/python3-dt-schema_git.bb deleted file mode 100644 index 06a9012ca4..0000000000 --- a/meta-python/recipes-devtools/python/python3-dt-schema_git.bb +++ /dev/null @@ -1,15 +0,0 @@ -SUMMARY = "Tooling for devicetree validation using YAML and jsonschema" -AUTHOR = "Rob Herring" - -LICENSE = "BSD-2-Clause" -LIC_FILES_CHKSUM = "file://setup.py;beginline=2;endline=3;md5=c795d4924c5f739424fa8d9b569c6659" - -inherit setuptools3 - -SRC_URI = "git://github.com/robherring/dt-schema.git" -SRCREV = "5009e47c1c76e48871f5988e08dad61f3c91196b" -PV = "0.1+git${SRCPV}" - -S = "${WORKDIR}/git" - -RDEPENDS_${PN} = "python3-jsonschema python3-ruamel-yaml" 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 0ed5df1b2e..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,13 +5,15 @@ 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} += "\ +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.16.1.bb b/meta-python/recipes-devtools/python/python3-ecdsa_0.16.1.bb deleted file mode 100644 index 819d41e86e..0000000000 --- a/meta-python/recipes-devtools/python/python3-ecdsa_0.16.1.bb +++ /dev/null @@ -1,13 +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] = "cfc046a2ddd425adbd1a78b3c46f0d1325c657811c0f45ecc3a0a6236c1e50ff" - -inherit pypi setuptools3 - -RDEPENDS_${PN} += "python3-six python3-gmpy2 python3-pbr" 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 c7a6cd8f0b..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 @@ -8,3 +8,10 @@ SRC_URI[sha256sum] = "51fda6bcc5ddbbb7063b2af7509e43bd84bfc32a4ff71349ec78477138 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_2.2.1.bb b/meta-python/recipes-devtools/python/python3-elementpath_4.4.0.bb index b0a7339687..e095cb8a32 100644 --- a/meta-python/recipes-devtools/python/python3-elementpath_2.2.1.bb +++ b/meta-python/recipes-devtools/python/python3-elementpath_4.4.0.bb @@ -3,9 +3,17 @@ HOMEPAGE = "https://github.com/sissaschool/elementpath" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=5dbb7fb7d72da3921202dd7b995d3ecf" -SRC_URI[sha256sum] = "c7b996c5624926f329f4379fbcffd5787629e08b2f8d7159d23525e9243ba637" +SRC_URI[sha256sum] = "dfc4b8ca3d87966dcb0df40b5b6d04a98f053683271930fad9e7fa000924dfb2" PYPI_PACKAGE = "elementpath" inherit pypi setuptools3 +RDEPENDS:${PN} += " \ + python3-xml \ + python3-core \ + python3-numbers \ + python3-datetime \ + python3-stringold \ +" + BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-email-validator_2.1.0.bb b/meta-python/recipes-devtools/python/python3-email-validator_2.1.0.bb new file mode 100644 index 0000000000..7daf548cb1 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-email-validator_2.1.0.bb @@ -0,0 +1,12 @@ +SUMMARY = "A robust email address syntax and deliverability validation library." +SECTION = "devel/python" +LICENSE = "CC0-1.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=65d3616852dbf7b1a6d4b53b00626032" + +SRC_URI[sha256sum] = "5f511cca8856bb03251d6292ba59e7f98978aae13fa5823ddd8bf885c56a6260" + +PYPI_PACKAGE = "email_validator" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-dnspython python3-idna" diff --git a/meta-python/recipes-devtools/python/python3-engineio_3.13.0.bb b/meta-python/recipes-devtools/python/python3-engineio_3.13.0.bb deleted file mode 100644 index 51f853390c..0000000000 --- a/meta-python/recipes-devtools/python/python3-engineio_3.13.0.bb +++ /dev/null @@ -1,13 +0,0 @@ -SUMMARY = "Engine.IO server" -HOMEPAGE = "https://github.com/miguelgrinberg/python-engineio/" -SECTION = "devel/python" - -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=42d0a9e728978f0eeb759c3be91536b8" - -inherit pypi setuptools3 - -PYPI_PACKAGE = "python-engineio" - -SRC_URI[md5sum] = "822b5dba0308dde6b8cbfd022daae0e4" -SRC_URI[sha256sum] = "2da5e1e5565e170a17169d1a76eb6a099cc96f0a25a5b1e0f9785f151485daea" diff --git a/meta-python/recipes-devtools/python/python3-engineio_4.9.0.bb b/meta-python/recipes-devtools/python/python3-engineio_4.9.0.bb new file mode 100644 index 0000000000..790d1b44cf --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-engineio_4.9.0.bb @@ -0,0 +1,20 @@ +SUMMARY = "Engine.IO server" +HOMEPAGE = "https://github.com/miguelgrinberg/python-engineio/" +SECTION = "devel/python" + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=42d0a9e728978f0eeb759c3be91536b8" + +inherit pypi python_setuptools_build_meta + +PYPI_PACKAGE = "python-engineio" + +RDEPENDS:${PN} += " \ + python3-netclient \ + python3-json \ + python3-logging \ + python3-compression \ + python3-asyncio \ +" + +SRC_URI[sha256sum] = "e87459c15638e567711fd156e6f9c4a402668871bed79523f0ecfec744729ec7" diff --git a/meta-python/recipes-devtools/python/python3-et-xmlfile_1.0.1.bb b/meta-python/recipes-devtools/python/python3-et-xmlfile_1.0.1.bb deleted file mode 100644 index cfff150cc7..0000000000 --- a/meta-python/recipes-devtools/python/python3-et-xmlfile_1.0.1.bb +++ /dev/null @@ -1,20 +0,0 @@ -SUMMARY = "et_xmlfile is a low memory library for creating large XML files" -DESCRIPTION = "It is based upon the xmlfile module from lxml with the aim of allowing code \ -to be developed that will work with both libraries. It was developed initially for \ -the openpyxl project but is now a standalone module." - -HOMEPAGE = "https://bitbucket.org/openpyxl/et_xmlfile/src/default/" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://PKG-INFO;md5=b3d89cae66f26c3a0799be8a96f3178b" - -SRC_URI[md5sum] = "f47940fd9d556375420b2e276476cfaf" -SRC_URI[sha256sum] = "614d9722d572f6246302c4491846d2c393c199cfa4edc9af593437691683335b" - -RDEPENDS_${PN} += "${PYTHON_PN}-compression ${PYTHON_PN}-io ${PYTHON_PN}-pprint ${PYTHON_PN}-shell" - -inherit setuptools3 -PYPI_PACKAGE ?= "et_xmlfile" -PYPI_SRC_URI ?= "https://files.pythonhosted.org/packages/source/e/et_xmlfile/et_xmlfile-1.0.1.tar.gz" -SECTION = "devel/python" -SRC_URI += "${PYPI_SRC_URI}" -S = "${WORKDIR}/${PYPI_PACKAGE}-${PV}" 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 new file mode 100644 index 0000000000..50ae7fa5e4 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-et-xmlfile_1.1.0.bb @@ -0,0 +1,23 @@ +SUMMARY = "et_xmlfile is a low memory library for creating large XML files" +DESCRIPTION = "It is based upon the xmlfile module from lxml with the aim of allowing code \ +to be developed that will work with both libraries. It was developed initially for \ +the openpyxl project but is now a standalone module." + +HOMEPAGE = "https://foss.heptapod.net/openpyxl/et_xmlfile" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=8227180126797a0148f94f483f3e1489" + +SRC_URI[sha256sum] = "8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c" + +RDEPENDS:${PN} += " \ + python3-compression \ + python3-io \ + python3-pprint \ + python3-shell \ + python3-xml \ +" + +inherit setuptools3 pypi + +PYPI_PACKAGE = "et_xmlfile" diff --git a/meta-python/recipes-devtools/python/python3-eth-abi_5.1.0.bb b/meta-python/recipes-devtools/python/python3-eth-abi_5.1.0.bb new file mode 100644 index 0000000000..e8bfb437fb --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-eth-abi_5.1.0.bb @@ -0,0 +1,18 @@ +SUMMARY = "Python utilities for working with Ethereum ABI definitions, especially encoding and decoding." +HOMEPAGE = "https://github.com/ethereum/eth-abi" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=731f4de9c79bfeba6d8d55f83d0d2423" + +SRC_URI[sha256sum] = "33ddd756206e90f7ddff1330cc8cac4aa411a824fe779314a0a52abea2c8fc14" + +PYPI_PACKAGE = "eth_abi" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-eth-typing \ + python3-eth-utils \ + python3-parsimonious \ + python3-setuptools \ +" diff --git a/meta-python/recipes-devtools/python/python3-eth-account_0.12.1.bb b/meta-python/recipes-devtools/python/python3-eth-account_0.12.1.bb new file mode 100644 index 0000000000..867aaaf025 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-eth-account_0.12.1.bb @@ -0,0 +1,20 @@ +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=16ffc86adf4293d4cfb204e77d62cfe6" + +SRC_URI[sha256sum] = "0374c5886f35780e1f23e50ce6b0482f3387646eceda544e97d69f17f6c216ee" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-bitarray \ + 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.6.0.bb b/meta-python/recipes-devtools/python/python3-eth-hash_0.6.0.bb new file mode 100644 index 0000000000..8464dbe403 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-eth-hash_0.6.0.bb @@ -0,0 +1,14 @@ +SUMMARY = "The Ethereum hashing function, keccak256, sometimes (erroneously) called sha3." +HOMEPAGE = "https://github.com/ethereum/eth-hash" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3d7bdfe69b1ffbde073ca6e96f5c53f7" + +SRC_URI[sha256sum] = "ae72889e60db6acbb3872c288cfa02ed157f4c27630fcd7f9c8442302c31e478" + +inherit pypi setuptools3 + +RDEPENDS:${PN} = "\ + python3-logging \ + python3-pycryptodome \ +" diff --git a/meta-python/recipes-devtools/python/python3-eth-keyfile_0.7.0.bb b/meta-python/recipes-devtools/python/python3-eth-keyfile_0.7.0.bb new file mode 100644 index 0000000000..2afc288bce --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-eth-keyfile_0.7.0.bb @@ -0,0 +1,15 @@ +SUMMARY = "A library for handling the encrypted keyfiles used to store ethereum private keys." +HOMEPAGE = "https://github.com/ethereum/eth-keyfile" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=6749008d847c14b9718949c2e24d5c0a" + +SRC_URI[sha256sum] = "6bdb8110c3a50439deb68a04c93c9d5ddd5402353bfae1bf4cfca1d6dff14fcf" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-eth-keys \ + python3-pycryptodome \ + python3-setuptools \ +" diff --git a/meta-python/recipes-devtools/python/python3-eth-keys_0.5.0.bb b/meta-python/recipes-devtools/python/python3-eth-keys_0.5.0.bb new file mode 100644 index 0000000000..aabfff1b1d --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-eth-keys_0.5.0.bb @@ -0,0 +1,11 @@ +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=6749008d847c14b9718949c2e24d5c0a" + +SRC_URI[sha256sum] = "a0abccb83f3d84322591a2c047a1e3aa52ea86b185fa3e82ce311d120ca2791e" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-eth-utils" diff --git a/meta-python/recipes-devtools/python/python3-eth-rlp_2.1.0.bb b/meta-python/recipes-devtools/python/python3-eth-rlp_2.1.0.bb new file mode 100644 index 0000000000..4bdc0c8873 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-eth-rlp_2.1.0.bb @@ -0,0 +1,16 @@ +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=3d7bdfe69b1ffbde073ca6e96f5c53f7" + +SRC_URI[sha256sum] = "d5b408a8cd20ed496e8e66d0559560d29bc21cee482f893936a1f05d0dddc4a0" + +inherit pypi setuptools3 + +RDEPENDS:${PN} = " \ + python3-eth-utils \ + python3-hexbytes \ + python3-rlp \ + python3-typing-extensions \ +" diff --git a/meta-python/recipes-devtools/python/python3-eth-typing_4.1.0.bb b/meta-python/recipes-devtools/python/python3-eth-typing_4.1.0.bb new file mode 100644 index 0000000000..4491de979c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-eth-typing_4.1.0.bb @@ -0,0 +1,9 @@ +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=3d7bdfe69b1ffbde073ca6e96f5c53f7" + +SRC_URI[sha256sum] = "ed52b0c6b049240fd810bc87c8857c7ea39370f060f70b9ca3876285269f2938" + +inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-eth-utils_3.0.0.bb b/meta-python/recipes-devtools/python/python3-eth-utils_3.0.0.bb new file mode 100644 index 0000000000..faca03865b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-eth-utils_3.0.0.bb @@ -0,0 +1,16 @@ +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=6749008d847c14b9718949c2e24d5c0a" + +SRC_URI[sha256sum] = "8721869568448349bceae63c277b75758d11e0dc190e7ef31e161b89619458f1" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-eth-hash \ + python3-eth-typing \ + python3-setuptools \ + python3-toolz \ +" diff --git a/meta-python/recipes-devtools/python/python3-evdev_1.4.0.bb b/meta-python/recipes-devtools/python/python3-evdev_1.4.0.bb deleted file mode 100644 index e15d83b60e..0000000000 --- a/meta-python/recipes-devtools/python/python3-evdev_1.4.0.bb +++ /dev/null @@ -1,22 +0,0 @@ -SUMMARY = "Python evdev lib" -HOMEPAGE = "https://github.com/gvalkov/python-evdev" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=18debddbb3f52c661a129724a883a8e2" - -SRC_URI[sha256sum] = "8782740eb1a86b187334c07feb5127d3faa0b236e113206dfe3ae8f77fb1aaf1" - -inherit pypi setuptools3 - -do_compile_prepend() { - rm -rf ${S}/evdev/ecodes.c -} - -DISTUTILS_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 \ - " diff --git a/meta-python/recipes-devtools/python/python3-evdev_1.6.1.bb b/meta-python/recipes-devtools/python/python3-evdev_1.6.1.bb new file mode 100644 index 0000000000..be6f9611e7 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-evdev_1.6.1.bb @@ -0,0 +1,22 @@ +SUMMARY = "Python evdev lib" +HOMEPAGE = "https://github.com/gvalkov/python-evdev" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=0ff275b442f45fc06287544cf713016f" + +SRC_URI[sha256sum] = "299db8628cc73b237fc1cc57d3c2948faa0756e2a58b6194b5bf81dc2081f1e3" + +inherit pypi setuptools3 + +do_compile:prepend() { + rm -rf ${S}/evdev/ecodes.c +} + +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} += "\ + python3-ctypes \ + python3-fcntl \ + python3-io \ + python3-shell \ + python3-stringold \ + " diff --git a/meta-python/recipes-devtools/python/python3-eventlet_0.36.1.bb b/meta-python/recipes-devtools/python/python3-eventlet_0.36.1.bb new file mode 100644 index 0000000000..f70099ab94 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-eventlet_0.36.1.bb @@ -0,0 +1,15 @@ +DESCRIPTION = "Highly concurrent networking library" +HOMEPAGE = "http://pypi.python.org/pypi/eventlet" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=56472ad6de4caf50e05332a34b66e778" + +SRC_URI[sha256sum] = "d227fe76a63d9e6a6cef53beb8ad0b2dc40a5e7737c801f4b474cfae1db07bc5" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + 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 new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-execnet/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-execnet_2.1.1.bb b/meta-python/recipes-devtools/python/python3-execnet_2.1.1.bb new file mode 100644 index 0000000000..94c1a228e3 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-execnet_2.1.1.bb @@ -0,0 +1,32 @@ +# Copyright (C) 2021 Khem Raj <raj.khem@gmail.com> +# Released under the MIT license (see COPYING.MIT for the terms) + +SUMMARY = "execnet: rapid multi-Python deployment" +HOMEPAGE = "https://execnet.readthedocs.io/en/latest/" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=772fcdaca14b378878d05c7d857e6c3e" + +DEPENDS += "\ + python3-pip-native \ + python3-hatch-vcs-native \ +" + +SRC_URI += "file://run-ptest \ + " +SRC_URI[sha256sum] = "5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3" + +inherit ptest pypi python_hatchling + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/testing/* ${D}${PTEST_PATH}/tests/ +} + +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" + +BBCLASSEXTEND = "native nativesdk" 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-fann2_1.1.2.bb b/meta-python/recipes-devtools/python/python3-fann2_1.1.2.bb index 3fdc1363c1..2fbc277139 100644 --- a/meta-python/recipes-devtools/python/python3-fann2_1.1.2.bb +++ b/meta-python/recipes-devtools/python/python3-fann2_1.1.2.bb @@ -1,6 +1,6 @@ SUMMARY = "Python bindings for Fast Artificial Neural Networks 2.2.0 (FANN >= 2.2.0)" SECTION = "devel/python" -LICENSE = "LGPLv2" +LICENSE = "LGPL-2.0-only" LIC_FILES_CHKSUM = "file://LICENSE;md5=c73b943dc75f6f65e007c56ac6515c8f" SRC_URI[md5sum] = "0b85b418018746d63ed66b55465697a9" diff --git a/meta-python/recipes-devtools/python/python3-fasteners_0.16.bb b/meta-python/recipes-devtools/python/python3-fasteners_0.19.bb index eed8d2c957..22e58c5668 100644 --- a/meta-python/recipes-devtools/python/python3-fasteners_0.16.bb +++ b/meta-python/recipes-devtools/python/python3-fasteners_0.19.bb @@ -3,6 +3,11 @@ HOMEPAGE = "https://github.com/harlowja/fasteners" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=4476c4be31402271e101d9a4a3430d52" -SRC_URI[sha256sum] = "c995d8c26b017c5d6a6de9ad29a0f9cdd57de61ae1113d28fac26622b06a0933" +SRC_URI[sha256sum] = "b4f37c3ac52d8a445af3a66bce57b33b5e90b97c696b7b984f530cf8f0ded09c" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta + +RDEPENDS:${PN} += "\ + 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 new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-fastjsonschema/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-fastjsonschema_2.18.0.bb b/meta-python/recipes-devtools/python/python3-fastjsonschema_2.18.0.bb new file mode 100644 index 0000000000..b2e969c5c1 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-fastjsonschema_2.18.0.bb @@ -0,0 +1,41 @@ +# Copyright (C) 2021 Khem Raj <raj.khem@gmail.com> +# Released under the MIT license (see COPYING.MIT for the terms) + +SUMMARY = "Fastest Python implementation of JSON schema" +HOMEPAGE = "https://github.com/seznam/python-fastjsonschema" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=18950e8362b69c0c617b42b8bd8e7532" + +SRCREV = "756540088687cda351390f687b92e602feaa7dc6" +PYPI_SRC_URI = "git://github.com/horejsek/python-fastjsonschema;protocol=https;branch=master" + +SRC_URI += "file://run-ptest" + +inherit ptest pypi setuptools3 + +S = "${WORKDIR}/git" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} + +RDEPENDS:${PN}-ptest += "\ + python3-colorama \ + python3-jsonschema \ + python3-pylint \ + python3-pytest \ + python3-pytest-benchmark \ + python3-pytest-cache \ + python3-statistics \ + python3-unittest-automake-output \ +" +RDEPENDS:${PN} += "\ + python3-core \ + python3-urllib3 \ + python3-numbers \ + python3-pickle \ + python3-json \ + " + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-fastnumbers_3.1.0.bb b/meta-python/recipes-devtools/python/python3-fastnumbers_3.1.0.bb deleted file mode 100644 index 5c913ffef8..0000000000 --- a/meta-python/recipes-devtools/python/python3-fastnumbers_3.1.0.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] = "7cc4f96981ccd3cf212b6ea7b84ef621620b62da8b454f420aa2e81c8529e68f" - -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-feedformatter_0.4.bb b/meta-python/recipes-devtools/python/python3-feedformatter_0.4.bb deleted file mode 100644 index 81c5fde132..0000000000 --- a/meta-python/recipes-devtools/python/python3-feedformatter_0.4.bb +++ /dev/null @@ -1,18 +0,0 @@ -DESCRIPTION = "A Python library for generating news feeds in RSS and Atom formats" -HOMEPAGE = "http://code.google.com/p/feedformatter/" -SECTION = "devel/python" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://COPYING;md5=258e3f39e2383fbd011035d04311008d" - -SRC_URI = "git://github.com/marianoguerra/feedformatter.git" -SRCREV = "7391193c83e10420b5a2d8ef846d23fc368c6d85" - -S = "${WORKDIR}/git" - -inherit setuptools3 - -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-xml \ - " diff --git a/meta-python/recipes-devtools/python/python3-fields_5.0.0.bb b/meta-python/recipes-devtools/python/python3-fields_5.0.0.bb new file mode 100644 index 0000000000..c1dfe0a377 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-fields_5.0.0.bb @@ -0,0 +1,15 @@ +# Copyright (C) 2021 Khem Raj <raj.khem@gmail.com> +# Released under the MIT license (see COPYING.MIT for the terms) + +SUMMARY = "Container class boilerplate killer." +HOMEPAGE = "https://github.com/ionelmc/python-fields" +LICENSE = "BSD-2-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=e32c6705498713d9c904a9f565953a2c" + +SRC_URI[sha256sum] = "31d4aa03d8d44e35df13c431de35136997f047a924a597d84f7bc209e1be5727" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-core" + +BBCLASSEXTEND = "native nativesdk" 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 8a01b49b45..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 5d7e9b517e..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 779a2e25e9..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.5.0.bb b/meta-python/recipes-devtools/python/python3-flask-login_0.6.3.bb index d776ce9682..d990d4e80b 100644 --- a/meta-python/recipes-devtools/python/python3-flask-login_0.5.0.bb +++ b/meta-python/recipes-devtools/python/python3-flask-login_0.6.3.bb @@ -6,11 +6,10 @@ HOMEPAGE = " https://github.com/maxcountryman/flask-login" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=8aa87a1cd9fa41d969ad32cfdac2c596" -SRC_URI[md5sum] = "a2d94aa6ae935345ebc68eb3cbb5fccd" -SRC_URI[sha256sum] = "6d33aef15b5bcead780acc339464aae8a6e28f13c90d8b1cf9de8b549d1c0b4b" +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 7a89cac9d2..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_2.7.0.bb b/meta-python/recipes-devtools/python/python3-flask-migrate_2.7.0.bb deleted file mode 100644 index 1bf0dfa800..0000000000 --- a/meta-python/recipes-devtools/python/python3-flask-migrate_2.7.0.bb +++ /dev/null @@ -1,15 +0,0 @@ -DESCRIPTION = "SQLAlchemy database migrations for Flask applications using Alembic" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=3b69377f79f3f48c661701236d5a6a85" - -SRC_URI[sha256sum] = "ae2f05671588762dd83a21d8b18c51fe355e86783e24594995ff8d7380dffe38" - -PYPI_PACKAGE = "Flask-Migrate" - -inherit pypi setuptools3 - -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-flask-sqlalchemy \ - ${PYTHON_PN}-alembic \ - ${PYTHON_PN}-flask \ - " diff --git a/meta-python/recipes-devtools/python/python3-flask-migrate_4.0.7.bb b/meta-python/recipes-devtools/python/python3-flask-migrate_4.0.7.bb new file mode 100644 index 0000000000..bfd854ac05 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-flask-migrate_4.0.7.bb @@ -0,0 +1,15 @@ +DESCRIPTION = "SQLAlchemy database migrations for Flask applications using Alembic" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3b69377f79f3f48c661701236d5a6a85" + +SRC_URI[sha256sum] = "dff7dd25113c210b069af280ea713b883f3840c1e3455274745d7355778c8622" + +PYPI_PACKAGE = "Flask-Migrate" + +inherit pypi python_setuptools_build_meta + +RDEPENDS:${PN} += "\ + 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 77735e3254..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 @@ -9,7 +9,7 @@ PYPI_PACKAGE = "flask-nav" inherit pypi setuptools3 -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-blinker \ - ${PYTHON_PN}-flask \ +RDEPENDS:${PN} += "\ + 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 e3c744d925..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.8.bb b/meta-python/recipes-devtools/python/python3-flask-restful_0.3.10.bb index 3de916afd7..8ea455c633 100644 --- a/meta-python/recipes-devtools/python/python3-flask-restful_0.3.8.bb +++ b/meta-python/recipes-devtools/python/python3-flask-restful_0.3.10.bb @@ -6,11 +6,10 @@ HOMEPAGE = "https://github.com/flask-restful/flask-restful" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=685bb55ed99a366bb431995f5eef2783" -SRC_URI[md5sum] = "e8051ff104ab4b3b867ba18d28953fae" -SRC_URI[sha256sum] = "5ea9a5991abf2cb69b4aac19793faac6c032300505b325687d7c305ffaa76915" +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.0.1.bb b/meta-python/recipes-devtools/python/python3-flask-socketio_5.3.6.bb index 4c5d0a3fbb..6b76e03f8d 100644 --- a/meta-python/recipes-devtools/python/python3-flask-socketio_5.0.1.bb +++ b/meta-python/recipes-devtools/python/python3-flask-socketio_5.3.6.bb @@ -5,13 +5,13 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=38cc21254909604298ce763a6e4440a0" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta PYPI_PACKAGE = "Flask-SocketIO" -SRC_URI[sha256sum] = "5c4319f5214ada20807857dc8fdf3dc7d2afe8d6dd38f5c516c72e2be47d2227" +SRC_URI[sha256sum] = "bb8f9f9123ef47632f5ce57a33514b0c0023ec3696b2384457f0fcaa5b70501c" -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-flask \ - ${PYTHON_PN}-socketio \ +RDEPENDS:${PN} += "\ + 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 3ca0227bd7..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 e8d5b5f2f2..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 @@ -9,6 +9,6 @@ PYPI_PACKAGE = "Flask-Uploads" inherit pypi setuptools3 -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-flask \ +RDEPENDS:${PN} += "\ + 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 a59019af85..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_0.14.3.bb b/meta-python/recipes-devtools/python/python3-flask-wtf_0.14.3.bb deleted file mode 100644 index 213a0b58b0..0000000000 --- a/meta-python/recipes-devtools/python/python3-flask-wtf_0.14.3.bb +++ /dev/null @@ -1,17 +0,0 @@ -DESCRIPTION = "Simple integration of Flask and WTForms." -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=3ca6bb31670492f791e6a9f2fb9f8a80" - -SRC_URI[md5sum] = "1b60b7dd1245b0d0173c21123717af61" -SRC_URI[sha256sum] = "d417e3a0008b5ba583da1763e4db0f55a1269d9dd91dcc3eb3c026d3c5dbd720" - -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_1.1.2.bb b/meta-python/recipes-devtools/python/python3-flask_1.1.2.bb deleted file mode 100644 index 23799617fe..0000000000 --- a/meta-python/recipes-devtools/python/python3-flask_1.1.2.bb +++ /dev/null @@ -1,18 +0,0 @@ -SUMMARY = "A microframework based on Werkzeug, Jinja2 and good intentions" -DESCRIPTION = "\ -Flask is a microframework for Python based on Werkzeug, Jinja 2 and good \ -intentions. And before you ask: It’s BSD licensed!" -HOMEPAGE = "https://github.com/mitsuhiko/flask/" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=ffeffa59c90c9c4a033c7574f8f3fb75" - -SRC_URI[md5sum] = "0da4145d172993cd28a6c619630cc19c" -SRC_URI[sha256sum] = "4efa1ae2d7c9865af48986de8aeb8504bf32c7f3d6fdc9353d34b21f4b127060" - -PYPI_PACKAGE = "Flask" - -inherit pypi setuptools3 - -CLEANBROKEN = "1" - -RDEPENDS_${PN} = "${PYTHON_PN}-werkzeug ${PYTHON_PN}-jinja2 ${PYTHON_PN}-itsdangerous ${PYTHON_PN}-click" diff --git a/meta-python/recipes-devtools/python/python3-flask_3.0.2.bb b/meta-python/recipes-devtools/python/python3-flask_3.0.2.bb new file mode 100644 index 0000000000..300ca99ddc --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-flask_3.0.2.bb @@ -0,0 +1,25 @@ +SUMMARY = "A microframework based on Werkzeug, Jinja2 and good intentions" +DESCRIPTION = "\ +Flask is a microframework for Python based on Werkzeug, Jinja 2 and good \ +intentions. And before you ask: It’s BSD licensed!" +HOMEPAGE = "https://github.com/mitsuhiko/flask/" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=ffeffa59c90c9c4a033c7574f8f3fb75" + +SRC_URI[sha256sum] = "822c03f4b799204250a7ee84b1eddc40665395333973dfb9deebfe425fefcb7d" + +UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/Flask" +UPSTREAM_CHECK_REGEX = "/Flask/(?P<pver>(\d+[\.\-_]*)+)" + +inherit pypi python_setuptools_build_meta + +CLEANBROKEN = "1" + +RDEPENDS:${PN} = " \ + 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.4.1.bb b/meta-python/recipes-devtools/python/python3-frozenlist_1.4.1.bb new file mode 100644 index 0000000000..4288f2922e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-frozenlist_1.4.1.bb @@ -0,0 +1,15 @@ +SUMMARY = "A list-like structure which implements collections.abc.MutableSequence, and which can be made immutable." +HOMEPAGE = "https://github.com/aio-libs/frozenlist" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=cf056e8e7a0a5477451af18b7b5aa98c" + +SRC_URI[sha256sum] = "c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b" + +inherit pypi python_setuptools_build_meta + +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.4.0.bb b/meta-python/recipes-devtools/python/python3-gast_0.5.4.bb index 7ef2eb4681..9c750ea3b0 100644 --- a/meta-python/recipes-devtools/python/python3-gast_0.4.0.bb +++ b/meta-python/recipes-devtools/python/python3-gast_0.5.4.bb @@ -4,8 +4,7 @@ SECTION = "devel/python" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=a3ad9b6802e713fc5e307e1230f1ea90" -SRC_URI[md5sum] = "d1f258eb70bb916f8fe5535351d5ff05" -SRC_URI[sha256sum] = "40feb7b8b8434785585ab224d1568b857edb18297e5a3047f1ba012bc83b42c1" +SRC_URI[sha256sum] = "9c270fe5f4b130969b54174de7db4e764b09b4f7f67ccfc32480e29f78348d97" inherit pypi setuptools3 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..8a61a2de05 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-gcovr_7.2.bb @@ -0,0 +1,16 @@ +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-jinja2 python3-lxml python3-setuptools python3-pygments python3-multiprocessing" + +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_2.5.0.bb deleted file mode 100644 index c3fd37c8b7..0000000000 --- a/meta-python/recipes-devtools/python/python3-geojson_2.5.0.bb +++ /dev/null @@ -1,26 +0,0 @@ -SUMMARY = "Python bindings and utilities for GeoJSON" -HOMEPAGE = "https://pypi.org/project/geojson/" -LICENSE = "BSD" -LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=f48972abe5cddee79e301574742ed745" - -SRC_URI[md5sum] = "14753ed28678828b1de73f68b04e2324" -SRC_URI[sha256sum] = "6e4bb7ace4226a45d9c8c8b1348b3fc43540658359f93c3f7e03efa9f15f658a" - -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/ -} - -RDEPENDS_${PN} += "python3-simplejson python3-math" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-geojson_3.1.0.bb b/meta-python/recipes-devtools/python/python3-geojson_3.1.0.bb new file mode 100644 index 0000000000..742f921e59 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-geojson_3.1.0.bb @@ -0,0 +1,26 @@ +SUMMARY = "Python bindings and utilities for GeoJSON" +HOMEPAGE = "https://pypi.org/project/geojson/" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=f77f2ed49768c8d4c79ba874c0f94d8a" + +SRC_URI[sha256sum] = "58a7fa40727ea058efc28b0e9ff0099eadf6d0965e04690830208d3ef571adac" + +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} += "python3-simplejson python3-math" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-geomet_1.1.0.bb b/meta-python/recipes-devtools/python/python3-geomet_1.1.0.bb new file mode 100644 index 0000000000..ceba10b65b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-geomet_1.1.0.bb @@ -0,0 +1,24 @@ +SUMMARY = "Convert GeoJSON to WKT/WKB (Well-Known Text/Binary), and vice versa." +DESCRIPTION = "Convert GeoJSON to WKT/WKB (Well-Known Text/Binary), and vice versa." +HOMEPAGE = "https://github.com/geomet/geomet" +SECTION = "devel/python" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=d2794c0df5b907fdace235a619d80314" +SRCNAME = "geomet" + +SRC_URI[sha256sum] = "cb52411978ee01ff104ab48f108d7333b14423ae7a15a65fee25b7d29bda2e1b" + +S = "${WORKDIR}/git" +SRC_URI = "git://github.com/geomet/geomet.git;protocol=https;branch=master" +SRCREV = "6ac73c312b52aca328db2e61d90c5e363b62639f" + +inherit setuptools3 + +RDEPENDS:${PN} += "\ + 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.1.2.bb b/meta-python/recipes-devtools/python/python3-gevent_21.1.2.bb deleted file mode 100644 index 5edd96b348..0000000000 --- a/meta-python/recipes-devtools/python/python3-gevent_21.1.2.bb +++ /dev/null @@ -1,33 +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 & BSD" -LIC_FILES_CHKSUM = "file://LICENSE;md5=4de99aac27b470c29c6c309e0c279b65 \ - file://NOTICE;md5=18108df3583462cafd457f024b9b09b5 \ - file://deps/libev/LICENSE;md5=d6ad416afd040c90698edcdf1cbee347 \ - " -DEPENDS += "libevent" -DEPENDS += "${PYTHON_PN}-greenlet" -RDEPENDS_${PN} = "${PYTHON_PN}-greenlet \ - ${PYTHON_PN}-mime \ - ${PYTHON_PN}-pprint \ - " - -FILESEXTRAPATHS_prepend := "${THISDIR}/python-gevent:" - -SRC_URI_append = " \ - file://libev-conf.patch;patch=1;pnum=1 \ -" - -SRC_URI[sha256sum] = "520cc2a029a9eef436e4e56b007af7859315cafa21937d43c1d5269f12f2c981" - -# The python-gevent has no autoreconf ability -# and the logic for detecting a cross compile is flawed -# so always force a cross compile -do_configure_append() { - sed -i -e 's/^cross_compiling=no/cross_compiling=yes/' ${S}/deps/libev/configure - sed -i -e 's/^cross_compiling=no/cross_compiling=yes/' ${S}/deps/c-ares/configure -} - -inherit pypi setuptools3 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.0.8.bb b/meta-python/recipes-devtools/python/python3-gmpy2_2.1.5.bb index c6edcbb320..d9e9bd50e5 100644 --- a/meta-python/recipes-devtools/python/python3-gmpy2_2.0.8.bb +++ b/meta-python/recipes-devtools/python/python3-gmpy2_2.1.5.bb @@ -1,13 +1,15 @@ SUMMARY = "GMP/MPIR, MPFR, and MPC interface to Python 2.6+ and 3.x" SECTION = "devel/python" -LICENSE = "GPL-3.0 | LGPL-3.0+" +LICENSE = "GPL-3.0-only | LGPL-3.0-or-later" LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504 \ file://COPYING.LESSER;md5=e6a600fd5e1d9cbde2d983680233ad02" DEPENDS += "gmp mpfr libmpc" PYPI_PACKAGE = "gmpy2" -PYPI_PACKAGE_EXT = "zip" -SRC_URI[sha256sum] = "dd233e3288b90f21b0bb384bcc7a7e73557bb112ccf0032ad52aa614eb373d3f" +SRC_URI[sha256sum] = "bc297f1fd8c377ae67a4f493fc0f926e5d1b157e5c342e30a4d84dc7b9f95d96" -inherit pypi setuptools3 +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.9.bb b/meta-python/recipes-devtools/python/python3-gmqtt_0.6.14.bb index 73c0ae0acf..5d8a3ba51c 100644 --- a/meta-python/recipes-devtools/python/python3-gmqtt_0.6.9.bb +++ b/meta-python/recipes-devtools/python/python3-gmqtt_0.6.14.bb @@ -3,11 +3,11 @@ HOMEPAGE = "https://github.com/wialon/gmqtt" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=903f1792621a3b35ee546da75d139177" -SRC_URI[sha256sum] = "0e98a964393834e724c93b5dce9524c9f1255c338c0d972188794f54c6559f04" +SRC_URI[sha256sum] = "45b0f7794247455b9163155eeedf41c86e303c72b79056bf65d33038b17443a3" inherit pypi setuptools3 -RDEPENDS_${PN} += "\ +RDEPENDS:${PN} += "\ python3-asyncio \ python3-core \ python3-datetime \ diff --git a/meta-python/recipes-devtools/python/python3-gnupg_0.4.6.bb b/meta-python/recipes-devtools/python/python3-gnupg_0.4.6.bb deleted file mode 100644 index ff0a91c6f6..0000000000 --- a/meta-python/recipes-devtools/python/python3-gnupg_0.4.6.bb +++ /dev/null @@ -1,11 +0,0 @@ -SUMMARY = "A wrapper for the Gnu Privacy Guard (GPG or GnuPG)" -SECTION = "devel/python" -LICENSE = "BSD" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=b0b7ac63b60085b23fa9f7e1951daa1d" - -PYPI_PACKAGE = "python-gnupg" -SRC_URI[sha256sum] = "3aa0884b3bd414652c2385b9df39e7b87272c2eca1b8fcc3089bc9e58652019a" - -inherit pypi setuptools3 - -RDEPENDS_${PN} += "gnupg-gpg" diff --git a/meta-python/recipes-devtools/python/python3-gnupg_0.5.2.bb b/meta-python/recipes-devtools/python/python3-gnupg_0.5.2.bb new file mode 100644 index 0000000000..b69e2c465e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-gnupg_0.5.2.bb @@ -0,0 +1,14 @@ +SUMMARY = "A wrapper for the Gnu Privacy Guard (GPG or GnuPG)" +SECTION = "devel/python" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=5dabe659eadd6d97325b1582e41cfc11" + +PYPI_PACKAGE = "python-gnupg" +SRC_URI[sha256sum] = "01d8013931c9fa3f45824bbea7054c03d6e11f258a72e7e086e168dbcb91854c" + +inherit pypi python_setuptools_build_meta + +RDEPENDS:${PN} += " \ + gnupg-gpg \ + python3-logging \ +" 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-python-client_2.1.0.bb b/meta-python/recipes-devtools/python/python3-google-api-python-client_2.1.0.bb deleted file mode 100644 index 11b94b3fcd..0000000000 --- a/meta-python/recipes-devtools/python/python3-google-api-python-client_2.1.0.bb +++ /dev/null @@ -1,9 +0,0 @@ -SUMMARY = "The Google API Client for Python is a client library for accessing the Plus, \ -Moderator, and many other Google APIs." -HOMEPAGE = "https://github.com/googleapis/google-api-python-client" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=94023d14f6b58272fd885e4e3f2f08b3" - -SRC_URI[sha256sum] = "f9ac377efe69571aea1acc9e15760d4204aca23c4464eb63f963ae4defc95d97" - -inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-google-api-python-client_2.125.0.bb b/meta-python/recipes-devtools/python/python3-google-api-python-client_2.125.0.bb new file mode 100644 index 0000000000..8abe4699e8 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-google-api-python-client_2.125.0.bb @@ -0,0 +1,20 @@ +SUMMARY = "The Google API Client for Python is a client library for accessing the Plus, \ +Moderator, and many other Google APIs." +HOMEPAGE = "https://github.com/googleapis/google-api-python-client" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327" + +SRC_URI[sha256sum] = "51a0385cff65ec135106e8be60ee7112557396dde5f44113ae23912baddda143" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "\ + 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.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.63.0.bb b/meta-python/recipes-devtools/python/python3-googleapis-common-protos_1.63.0.bb new file mode 100644 index 0000000000..aee2337267 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-googleapis-common-protos_1.63.0.bb @@ -0,0 +1,13 @@ +DESCRIPTION = "Common protobufs used in Google APIs" +HOMEPAGE = "https://github.com/googleapis/python-api-common-protos" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10" + +inherit pypi setuptools3 + +SRC_URI[sha256sum] = "17ad01b11d5f1d0171c06d3ba5c04c54474e883b66b949722b4938ee2694ef4e" + +RDEPENDS:${PN} += "\ + 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-gpsd-py3_0.3.0.bb b/meta-python/recipes-devtools/python/python3-gpsd-py3_0.3.0.bb index 35485ba7c4..50c1ebd153 100644 --- a/meta-python/recipes-devtools/python/python3-gpsd-py3_0.3.0.bb +++ b/meta-python/recipes-devtools/python/python3-gpsd-py3_0.3.0.bb @@ -11,6 +11,6 @@ inherit pypi setuptools3 CLEANBROKEN = "1" -RDEPENDS_${PN} += " \ +RDEPENDS:${PN} += " \ python3 \ " diff --git a/meta-python/recipes-devtools/python/python3-graphviz_0.16.bb b/meta-python/recipes-devtools/python/python3-graphviz_0.16.bb deleted file mode 100644 index 1af657098b..0000000000 --- a/meta-python/recipes-devtools/python/python3-graphviz_0.16.bb +++ /dev/null @@ -1,16 +0,0 @@ -DESCRIPTION = "Graphviz protocol implementation" -HOMEPAGE = "https://graphviz.readthedocs.io/en/stable/" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=f7831c564aeff14e68aa4ff7a93dc89f" - -SRC_URI[sha256sum] = "d2d25af1c199cad567ce4806f0449cb74eb30cf451fd7597251e1da099ac6e57" - -inherit pypi setuptools3 - -PYPI_PACKAGE_EXT = "zip" - -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-logging \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-graphviz_0.20.3.bb b/meta-python/recipes-devtools/python/python3-graphviz_0.20.3.bb new file mode 100644 index 0000000000..0fd81b0ee6 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-graphviz_0.20.3.bb @@ -0,0 +1,16 @@ +DESCRIPTION = "Graphviz protocol implementation" +HOMEPAGE = "https://graphviz.readthedocs.io/en/stable/" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=bcdc1cf20245c598f9a563b550605785" + +SRC_URI[sha256sum] = "09d6bc81e6a9fa392e7ba52135a9d49f1ed62526f96499325930e87ca1b5925d" + +inherit pypi setuptools3 + +PYPI_PACKAGE_EXT = "zip" + +RDEPENDS:${PN} += " \ + python3-logging \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-greenlet_1.0.0.bb b/meta-python/recipes-devtools/python/python3-greenlet_3.0.3.bb index 32194dba78..abd6c49caf 100644 --- a/meta-python/recipes-devtools/python/python3-greenlet_1.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-greenlet_3.0.3.bb @@ -1,8 +1,9 @@ SUMMARY = "Python lightweight in-process concurrent programming" -LICENSE = "MIT & PSF" +HOMEPAGE = "https://greenlet.readthedocs.io/en/latest/" +LICENSE = "MIT & PSF-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=e95668d68e4329085c7ab3535e6a7aee \ file://LICENSE.PSF;md5=c106931d9429eda0492617f037b8f69a" -SRC_URI[sha256sum] = "719e169c79255816cdcf6dccd9ed2d089a72a9f6c42273aae12d55e8d35bdcf8" +SRC_URI[sha256sum] = "43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491" -inherit pypi distutils3 setuptools3 +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 9af5a0b4ef..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" +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 aef67b5748..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 @@ -27,32 +27,33 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com> 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py -index a316038..70aa174 100644 +index cc53e79..be3bc78 100644 --- a/setup.py +++ b/setup.py -@@ -76,8 +76,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++11', '-'], +@@ -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++11', '-'], - stdin=PIPE, - stdout=PIPE, - stderr=PIPE) -@@ -87,7 +90,7 @@ def check_linker_need_libatomic(): ++ cpp_test = subprocess.Popen([cxx, cxx_args, '-x', 'c++', '-std=c++14', '-'], + 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++11', '-latomic', '-'], -+ [cxx, cxx_args, '-x', 'c++', '-std=c++11', '-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.30.1 +2.25.1 diff --git a/meta-python/recipes-devtools/python/python3-grpcio-tools_1.37.0.bb b/meta-python/recipes-devtools/python/python3-grpcio-tools_1.62.1.bb index d1b934bd0a..ffa2f843c7 100644 --- a/meta-python/recipes-devtools/python/python3-grpcio-tools_1.37.0.bb +++ b/meta-python/recipes-devtools/python/python3-grpcio-tools_1.62.1.bb @@ -7,16 +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 += "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] = "a4991e5ee8a97ab791296d3bf7e8700b1445635cc1828cc98df945ca1802d7f2" -SRC_URI[sha256sum] = "3ec510c1b6bfc32effc639acf9a055e72dab7a7b6757bf72f2132790d6a7cf1c" - -RDEPENDS_${PN} = "${PYTHON_PN}-grpcio" +RDEPENDS:${PN} = "python3-grpcio" BBCLASSEXTEND = "native nativesdk" - -# Needs abseil-cpp which does not build for ppc64le/musl -COMPATIBLE_HOST_libc-musl_powerpc64le = "null" - 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 373669461b..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 4b8c9d4..271b7b1 100644 ---- a/setup.py -+++ b/setup.py -@@ -172,8 +172,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++11', '-'], -+ 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++11', '-'], - stdin=PIPE, - stdout=PIPE, - stderr=PIPE) -@@ -183,7 +186,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++11', '-latomic', '-'], -+ [cxx, cxx_args, '-x', 'c++', '-std=c++11', '-latomic', '-'], - stdin=PIPE, - stdout=PIPE, - stderr=PIPE) -diff --git a/src/python/grpcio/commands.py b/src/python/grpcio/commands.py -index a8b2ff5..b928201 100644 ---- a/src/python/grpcio/commands.py -+++ b/src/python/grpcio/commands.py -@@ -219,7 +219,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++11', '-'], -+ 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++11', '-'], - stdin=subprocess.PIPE, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) --- -2.30.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 new file mode 100644 index 0000000000..f39a9616d9 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-grpcio/abseil-ppc-fixes.patch @@ -0,0 +1,98 @@ +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) +3) powerpc stacktrace implementation has ppc64 assumptions (fixed) +4) examine_stack.cpp makes glibc assumptions on powerpc (fixed) + +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(-) + +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 + +-#if defined(__powerpc__) || defined(__ppc__) ++#if (defined(__powerpc__) || defined(__ppc__)) && defined(__GLIBC__) + #ifdef __GLIBC__ + #include <sys/platform/ppc.h> + #elif defined(__FreeBSD__) +@@ -58,7 +58,7 @@ double UnscaledCycleClock::Frequency() { + return base_internal::NominalCPUFrequency(); + } + +-#elif defined(__powerpc__) || defined(__ppc__) ++#elif (defined(__powerpc__) || defined(__ppc__)) && defined(__GLIBC__) + + int64_t UnscaledCycleClock::Now() { + #ifdef __GLIBC__ +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_ARM64EC)) + #define ABSL_HAVE_UNSCALED_CYCLECLOCK_IMPLEMENTATION 1 + #else +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> + ++#if defined(__powerpc__) ++#include <asm/ptrace.h> ++#endif ++ + #include "absl/base/attributes.h" + #include "absl/base/internal/raw_logging.h" + #include "absl/base/macros.h" +@@ -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]); +-#elif defined(__powerpc__) ++#elif defined(__powerpc__) && defined(__GLIBC__) + return reinterpret_cast<void*>(context->uc_mcontext.uc_regs->gregs[32]); ++#elif defined(__powerpc__) ++ return reinterpret_cast<void*>(((struct pt_regs *)context->uc_regs)->gregs[32]); + #elif defined(__riscv) + return reinterpret_cast<void*>(context->uc_mcontext.__gregs[REG_PC]); + #elif defined(__s390__) && !defined(__s390x__) +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" +-#elif defined(__ppc__) || defined(__PPC__) ++#elif (defined(__ppc__) || defined(__PPC__)) && defined(__GLIBC__) + #define ABSL_STACKTRACE_INL_HEADER \ + "absl/debugging/internal/stacktrace_powerpc-inl.inc" + #elif defined(__aarch64__) 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 343f25a46e..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) 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/riscv64_support.patch b/meta-python/recipes-devtools/python/python3-grpcio/riscv64_support.patch deleted file mode 100644 index 350c67deaf..0000000000 --- a/meta-python/recipes-devtools/python/python3-grpcio/riscv64_support.patch +++ /dev/null @@ -1,21 +0,0 @@ -Add RISC-V 64bit support - -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 -@@ -108,6 +108,14 @@ extern "C" { - #elif defined(__MIPSEL__) && defined(__LP64__) - #define OPENSSL_64_BIT - #define OPENSSL_MIPS64 -+#elif defined(__riscv) -+# if (__riscv_xlen == 64) -+# define OPENSSL_64_BIT -+# define OPENSSL_RISCV64 -+# elif(__riscv_xlen == 32) -+# define OPENSSL_32_BIT -+# define OPENSSL_RISCV32 -+# endif - #elif defined(__pnacl__) - #define OPENSSL_32_BIT - #define OPENSSL_PNACL diff --git a/meta-python/recipes-devtools/python/python3-grpcio_1.37.0.bb b/meta-python/recipes-devtools/python/python3-grpcio_1.37.0.bb deleted file mode 100644 index 47fb71120d..0000000000 --- a/meta-python/recipes-devtools/python/python3-grpcio_1.37.0.bb +++ /dev/null @@ -1,49 +0,0 @@ -DESCRIPTION = "Google gRPC" -HOMEPAGE = "http://www.grpc.io/" -SECTION = "devel/python" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57" - -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://riscv64_support.patch \ - file://boring_ssl.patch \ - file://mips_bigendian.patch \ - file://0001-absl-always-use-asm-sgidefs.h.patch \ -" -SRC_URI[sha256sum] = "b3ce16aa91569760fdabd77ca901b2288152eb16941d28edd9a3a75a0c4a8a85" - -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_append_toolchain-clang = " -fvisibility=hidden -fno-wrapv -fno-exceptions" -export GRPC_PYTHON_CFLAGS = "${GRPC_CFLAGS}" - -CLEANBROKEN = "1" - -BBCLASSEXTEND = "native nativesdk" - -CCACHE_DISABLE = "1" - -# needs vdso support -COMPATIBLE_HOST_libc-musl_powerpc64le = "null" - diff --git a/meta-python/recipes-devtools/python/python3-grpcio_1.62.1.bb b/meta-python/recipes-devtools/python/python3-grpcio_1.62.1.bb new file mode 100644 index 0000000000..8405ebed02 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-grpcio_1.62.1.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] = "6c455e008fa86d9e9a9d85bb76da4277c0d7d9668a3bfa70dbe86e9f3c759947" + +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 b63c4de0d9..5ca7e26e8a 100644 --- a/meta-python/recipes-devtools/python/python3-gunicorn/run-ptest +++ b/meta-python/recipes-devtools/python/python3-gunicorn/run-ptest @@ -1,3 +1,7 @@ #!/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}}' +# there needs to be something in /etc/resolv.conf for the gunicorn +# ptests to work, so make sure there's at least one nameserver line +echo "nameserver 8.8.8.8" >> /etc/resolv.conf + +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 22fe495f42..0000000000 --- a/meta-python/recipes-devtools/python/python3-gunicorn_20.1.0.bb +++ /dev/null @@ -1,23 +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}-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.12.0.bb b/meta-python/recipes-devtools/python/python3-h11_0.14.0.bb index 4cd0d4de74..2bddefa3f0 100644 --- a/meta-python/recipes-devtools/python/python3-h11_0.12.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] = "47222cb6067e4a307d535814917cd98fd0a57b6788ce715755fa2b6c28b56042" +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.10.0.bb b/meta-python/recipes-devtools/python/python3-h5py_3.10.0.bb new file mode 100644 index 0000000000..8a9158525e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-h5py_3.10.0.bb @@ -0,0 +1,40 @@ +SUMMARY = "Provides both a high- and low-level interface to the HDF5 library from Python." +HOMEPAGE = "https://www.h5py.org/" +SECTION = "devel/python" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=113251d71fb0384712c719b567261c5c" + +SRC_URI[sha256sum] = "d93adc48ceeb33347eb24a634fb787efc7ae4644e6ea4ba733d099605045c049" + +SRC_URI += "file://0001-setup_build.py-avoid-absolute-path.patch \ + file://0001-Fix-Cython-3-compatibility.patch" + +inherit pkgconfig pypi setuptools3 + +BBCLASSEXTEND = "native" + +DEPENDS = "python3-pkgconfig-native \ + python3-cython-native \ + python3-numpy-native \ + python3-six-native \ + hdf5-native \ + python3 \ + 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.14.0" diff --git a/meta-python/recipes-devtools/python/python3-h5py_3.2.1.bb b/meta-python/recipes-devtools/python/python3-h5py_3.2.1.bb deleted file mode 100644 index 5faa0b8080..0000000000 --- a/meta-python/recipes-devtools/python/python3-h5py_3.2.1.bb +++ /dev/null @@ -1,31 +0,0 @@ -SUMMARY = "Provides both a high- and low-level interface to the HDF5 library from Python." -HOMEPAGE = "https://www.h5py.org/" -SECTION = "devel/python" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=113251d71fb0384712c719b567261c5c" - -SRC_URI[sha256sum] = "89474be911bfcdb34cbf0d98b8ec48b578c27a89fdb1ae4ee7513f1ef8d9249e" - -SRC_URI_append = " \ - file://0001-setup_build.py-avoid-absolute-path.patch \ - file://0001-setup.py-Fix-numpy-version.patch \ - " - -inherit pypi setuptools3 - -BBCLASSEXTEND = "native" - -DEPENDS = "python3-pkgconfig-native \ - python3-cython-native \ - python3-numpy-native \ - python3-six-native \ - hdf5-native \ - python3 \ - hdf5 \ - " - -RDEPENDS_${PN} = "python3-numpy \ - python3-six \ - " - -export HDF5_VERSION="1.8.21" diff --git a/meta-python/recipes-devtools/python/python3-haversine_2.3.0.bb b/meta-python/recipes-devtools/python/python3-haversine_2.8.1.bb index 6e02fcf71e..e45ae79860 100644 --- a/meta-python/recipes-devtools/python/python3-haversine_2.3.0.bb +++ b/meta-python/recipes-devtools/python/python3-haversine_2.8.1.bb @@ -2,11 +2,10 @@ SUMMARY = "Calculate the distance between 2 points on Earth" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" -SRC_URI[md5sum] = "ff2d43a74195ec00c42ccd5da2a3f3de" -SRC_URI[sha256sum] = "72c76855ac25e6ad054c7ed380e95c1a96803185f005dd11f40ccaa9620b551f" +SRC_URI[sha256sum] = "ab750caa0c8f2168bd7b00a429757a83a8393be1aa30f91c2becf6b523189e2a" inherit pypi setuptools3 -RDEPENDS_${PN} += "python3-numpy" +RDEPENDS:${PN} += "python3-numpy" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-hexbytes_1.0.0.bb b/meta-python/recipes-devtools/python/python3-hexbytes_1.0.0.bb new file mode 100644 index 0000000000..951998b5a1 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-hexbytes_1.0.0.bb @@ -0,0 +1,9 @@ +SUMMARY = "Python bytes subclass that decodes hex, with a readable console output." +HOMEPAGE = "https://github.com/ethereum/hexbytes" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=16ffc86adf4293d4cfb204e77d62cfe6" + +SRC_URI[sha256sum] = "18e6e3279a13878b93fb85da77822dc506b7048065a588e74141c2468a65ad8c" + +inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-hexdump_3.3.bb b/meta-python/recipes-devtools/python/python3-hexdump_3.3.bb deleted file mode 100644 index 5325048039..0000000000 --- a/meta-python/recipes-devtools/python/python3-hexdump_3.3.bb +++ /dev/null @@ -1,25 +0,0 @@ -SUMMARY = "view/edit your binary with any text editor" - -# The homepage listed on pypi is [1] but the repository has been removed. -# Instead, set the homepage to pypi. -# -# [1] https://bitbucket.org/techtonik/hexdump/ -HOMEPAGE = "https://pypi.org/project/hexdump/" - -LICENSE = "PD" -LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/PD;md5=b3597d12946881e13cb3b548d1173851" - -PYPI_PACKAGE_EXT = "zip" - -inherit pypi distutils3 - -SRC_URI[sha256sum] = "d781a43b0c16ace3f9366aade73e8ad3a7bd5137d58f0b45ab2d3f54876f20db" - -S = "${WORKDIR}" - -BBCLASSEXTEND = "native nativesdk" - -do_install_append() { - rm ${D}${datadir}/data/hexfile.bin - rmdir ${D}${datadir}/data ${D}${datadir} -} 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 ea17190d59..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 @@ -1,7 +1,7 @@ SUMMARY = "Convert HTML to Markdown-formatted text" HOMEPAGE = "https://github.com/Alir3z4/html2text" -LICENSE = "GPL-3.0" +LICENSE = "GPL-3.0-only" LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504" SRC_URI[md5sum] = "c77b580c94d1a9e0145f23cc4472993d" @@ -13,10 +13,13 @@ SRC_URI += " \ file://run-ptest \ " -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ +RDEPENDS:${PN}-ptest += " \ + 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 59f3cc9455..d6272a07c3 100644 --- a/meta-python/recipes-devtools/python/python3-html5lib_1.1.bb +++ b/meta-python/recipes-devtools/python/python3-html5lib_1.1.bb @@ -7,11 +7,11 @@ SRC_URI[sha256sum] = "b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c1 inherit pypi setuptools3 -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-lxml \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-webencodings \ - ${PYTHON_PN}-xml \ +RDEPENDS:${PN} += "\ + 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.19.1.bb b/meta-python/recipes-devtools/python/python3-httplib2_0.22.0.bb index a16f8d9d20..9318ad9182 100644 --- a/meta-python/recipes-devtools/python/python3-httplib2_0.19.1.bb +++ b/meta-python/recipes-devtools/python/python3-httplib2_0.22.0.bb @@ -4,6 +4,12 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=56e5e931172b6164b62dc7c4aba6c8cf" -SRC_URI[sha256sum] = "0b12617eeca7433d4c396a100eaecfa4b08ee99aa881e6df6e257a7aad5d533d" +SRC_URI[sha256sum] = "d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta + +RDEPENDS:${PN} += "\ + 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.3.1.bb b/meta-python/recipes-devtools/python/python3-huey_2.5.0.bb index d8141c8e81..c6e5606090 100644 --- a/meta-python/recipes-devtools/python/python3-huey_2.3.1.bb +++ b/meta-python/recipes-devtools/python/python3-huey_2.5.0.bb @@ -5,7 +5,14 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=5cac039fcc82f01141cc170b48f315d4" PYPI_PACKAGE = "huey" -SRC_URI[sha256sum] = "de9b6d0fd59794378fe05813d302be68038044ef3b68274b84ca8d285e20f803" +SRC_URI[sha256sum] = "2ffb52fb5c46a1b0d53c79d59df3622312b27e2ab68d81a580985a8ea4ca3480" + +RDEPENDS:${PN} += " \ + python3-datetime \ + python3-logging \ + python3-multiprocessing \ + python3-json \ +" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-humanfriendly_10.0.bb b/meta-python/recipes-devtools/python/python3-humanfriendly_10.0.bb new file mode 100644 index 0000000000..b32fe2e1d0 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-humanfriendly_10.0.bb @@ -0,0 +1,24 @@ +DESCRIPTION = "Human friendly output for text interfaces using Python" +HOMEPAGE = "https://humanfriendly.readthedocs.io/" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=5d178009f806c2bdd498a19be0013a7a" + +PYPI_PACKAGE = "humanfriendly" + +SRC_URI[sha256sum] = "6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc" + +inherit pypi setuptools3 + +RDEPENDS:${PN}:class-target += " \ + 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-humanfriendly_9.1.bb b/meta-python/recipes-devtools/python/python3-humanfriendly_9.1.bb deleted file mode 100644 index fb6a7e3b6d..0000000000 --- a/meta-python/recipes-devtools/python/python3-humanfriendly_9.1.bb +++ /dev/null @@ -1,24 +0,0 @@ -DESCRIPTION = "Human friendly output for text interfaces using Python" -HOMEPAGE = "https://humanfriendly.readthedocs.io/" -SECTION = "devel/python" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=764e737b117a38d773609885e8d04f0b" - -PYPI_PACKAGE = "humanfriendly" - -SRC_URI[sha256sum] = "066562956639ab21ff2676d1fda0b5987e985c534fc76700a19bd54bcb81121d" - -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 \ -" - -BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-humanize_3.4.0.bb b/meta-python/recipes-devtools/python/python3-humanize_4.9.0.bb index f9c22e8914..da1eea4cf7 100644 --- a/meta-python/recipes-devtools/python/python3-humanize_3.4.0.bb +++ b/meta-python/recipes-devtools/python/python3-humanize_4.9.0.bb @@ -5,16 +5,18 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENCE;md5=4ecc42519e84f6f3e23529464df7bd1d" -SRC_URI[sha256sum] = "096b9ae6d1d56321d3d81f17117c2068179d7b4f7f73ba4baf302726923b48ec" +SRC_URI[sha256sum] = "582a265c931c683a7e9b8ed9559089dea7edcf6cc95be39a3cbc2c5d5ac2bcfa" -inherit pypi setuptools3 +inherit pypi python_hatchling DEPENDS += "\ - ${PYTHON_PN}-setuptools-scm-native \ + python3-setuptools-scm-native \ + python3-hatch-vcs-native \ " -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-datetime \ +RDEPENDS:${PN} += "\ + 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 5a8791dfbc..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 @@ -5,12 +5,12 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=6dc5b4bd3d02faedf08461621aa2aeca" SRC_URI[sha256sum] = "427af957daa58bc909471c6c40f74c5450fa123dd093fc53efd2e91d2705a56b" -inherit pypi setuptools3 +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 " -FILES_${PN}-test += " \ +FILES:${PN}-test += " \ ${PYTHON_SITEPACKAGES_DIR}/hyperlinkt/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/fix_host_include.patch b/meta-python/recipes-devtools/python/python3-icu/0001-Fix-host-contamination-of-include-files.patch index 1b6e890436..7bb5ee58cc 100644 --- a/meta-python/recipes-devtools/python/python3-icu/fix_host_include.patch +++ b/meta-python/recipes-devtools/python/python3-icu/0001-Fix-host-contamination-of-include-files.patch @@ -1,30 +1,41 @@ -Fixed host contamination of include files +From a82fea9663f0c70cf57cd06650f400e878afc5e4 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Fri, 16 Apr 2021 10:48:36 -0700 +Subject: [PATCH] Fix host contamination of include files python3-icu-2.5-r0 do_package_qa: QA Issue: python3-icu: The compile log indicates that host include and/or library paths were used. Also, don't use icu-config -Upstream-Status: [inappropriate] OE specific +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(-) -Index: PyICU-2.5/setup.py -=================================================================== ---- PyICU-2.5.orig/setup.py -+++ PyICU-2.5/setup.py -@@ -81,7 +81,7 @@ Building PyICU %s for ICU %s (max ICU ma +diff --git a/setup.py b/setup.py +index 176c9ab..0a10268 100644 +--- a/setup.py ++++ b/setup.py +@@ -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 -@@ -274,7 +274,6 @@ setup(name="PyICU", - ext_modules=[Extension('_icu', +@@ -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')], - include_dirs=_includes, extra_compile_args=_cflags, extra_link_args=_lflags, libraries=_libraries)], +-- +2.34.1 + diff --git a/meta-python/recipes-devtools/python/python3-icu_2.12.bb b/meta-python/recipes-devtools/python/python3-icu_2.12.bb new file mode 100644 index 0000000000..6394db4e9e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-icu_2.12.bb @@ -0,0 +1,15 @@ +SUMMARY = "Python extension wrapping the ICU C++ API" +HOMEPAGE = "https://gitlab.pyicu.org/main/pyicu" +BUGTRACKER = "https://gitlab.pyicu.org/main/pyicu/-/issues" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=0724597863f1581ab01429e0423e779f" + +DEPENDS += "icu" + +PYPI_PACKAGE = "PyICU" +SRC_URI[sha256sum] = "bd7ab5efa93ad692e6daa29cd249364e521218329221726a113ca3cb281c8611" + +SRC_URI += "file://0001-Fix-host-contamination-of-include-files.patch" + +inherit pkgconfig pypi python_setuptools_build_meta diff --git a/meta-python/recipes-devtools/python/python3-icu_2.6.bb b/meta-python/recipes-devtools/python/python3-icu_2.6.bb deleted file mode 100644 index 58f5e563bf..0000000000 --- a/meta-python/recipes-devtools/python/python3-icu_2.6.bb +++ /dev/null @@ -1,13 +0,0 @@ -SUMMARY = "Python extension wrapping the ICU C++ API" -SECTION = "devel/python" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=c7c4bfd81a21e3b6368bdcced992bf59" - -DEPENDS += "pkgconfig icu" - -PYPI_PACKAGE = "PyICU" -SRC_URI[sha256sum] = "a9a5bf6833360f8f69e9375b91c1a7dd6e0c9157a42aee5bb7d6891804d96371" - -SRC_URI += "file://fix_host_include.patch" - -inherit pypi setuptools3 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-idna_3.1.bb b/meta-python/recipes-devtools/python/python3-idna_3.1.bb deleted file mode 100644 index fbdbab6dfb..0000000000 --- a/meta-python/recipes-devtools/python/python3-idna_3.1.bb +++ /dev/null @@ -1,19 +0,0 @@ -SUMMARY = "Internationalised Domain Names in Applications" -HOMEPAGE = "https://github.com/kjd/idna" -LICENSE = "BSD-3-Clause & Python-2.0 & Unicode" -LIC_FILES_CHKSUM = "file://LICENSE.md;md5=239668a7c6066d9e0c5382e9c8c6c0e1" - -SRC_URI[sha256sum] = "c5b02147e01ea9920e6b0a3f1f7bb833612d507592c837a6c49552768f4054e1" - -inherit pypi setuptools3 - -# Remove bundled egg-info -do_compile_prepend() { - rm -rf ${S}/idna.egg-info -} - -RDEPENDS_${PN}_class-target = "\ - ${PYTHON_PN}-codecs \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-ifaddr_0.1.7.bb b/meta-python/recipes-devtools/python/python3-ifaddr_0.2.0.bb index 4fff7d1e58..371bbf2ab5 100644 --- a/meta-python/recipes-devtools/python/python3-ifaddr_0.1.7.bb +++ b/meta-python/recipes-devtools/python/python3-ifaddr_0.2.0.bb @@ -5,6 +5,10 @@ LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=8debe8d42320ec0ff24665319b625a5e" -SRC_URI[sha256sum] = "1f9e8a6ca6f16db5a37d3356f07b6e52344f6f9f7e806d618537731669eb1a94" +SRC_URI[sha256sum] = "cc0cbfcaabf765d44595825fb96a99bb12c79716b73b44330ea38ee2b0c4aed4" inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-ctypes \ +" diff --git a/meta-python/recipes-devtools/python/python3-imageio_2.34.0.bb b/meta-python/recipes-devtools/python/python3-imageio_2.34.0.bb new file mode 100644 index 0000000000..e38d694408 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-imageio_2.34.0.bb @@ -0,0 +1,12 @@ +SUMMARY = "Python library that provides an easy interface to read and \ +write a wide range of image data, including animated images, video, \ +volumetric data, and scientific formats." +SECTION = "devel/python" +LICENSE = "BSD-2-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=24cb9a367a9e641b459a01c4d15256ba" + +SRC_URI[sha256sum] = "ae9732e10acf807a22c389aef193f42215718e16bd06eed0c5bb57e1034a4d53" + +inherit pypi setuptools3 + +RDEPENDS:${PN} = "python3-numpy python3-pillow" diff --git a/meta-python/recipes-devtools/python/python3-imageio_2.9.0.bb b/meta-python/recipes-devtools/python/python3-imageio_2.9.0.bb deleted file mode 100644 index fbe5e2c975..0000000000 --- a/meta-python/recipes-devtools/python/python3-imageio_2.9.0.bb +++ /dev/null @@ -1,14 +0,0 @@ -SUMMARY = "Python library that provides an easy interface to read and \ -write a wide range of image data, including animated images, video, \ -volumetric data, and scientific formats." -SECTION = "devel/python" -LICENSE = "BSD-2-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=7b9bbbb543b6af3e6b53f9b7fb68f71d" - - -SRC_URI[md5sum] = "d22757338542e3742a335cea6210e419" -SRC_URI[sha256sum] = "52ddbaeca2dccf53ba2d6dec5676ca7bc3b2403ef8b37f7da78b7654bb3e10f0" - -inherit pypi setuptools3 - -RDEPENDS_${PN} = "python3-numpy python3-pillow" diff --git a/meta-python/recipes-devtools/python/python3-imgtool_2.0.0.bb b/meta-python/recipes-devtools/python/python3-imgtool_2.0.0.bb new file mode 100644 index 0000000000..a25e6a61a8 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-imgtool_2.0.0.bb @@ -0,0 +1,12 @@ +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=0645fb61e2f961a110302fbfdb227446" + +SRC_URI[sha256sum] = "7a541255e69eec1f12aa38dce1f1d4fe20d8212677c68a9b6ec634ca91a06612" + +inherit pypi setuptools3 + +RDEPENDS:${PN} = "python3-cbor2 python3-click python3-cryptography python3-intelhex" + +BBCLASSEXTEND = "native nativesdk" 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 ff8fab31f4..3d93cc05e9 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 -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-twisted \ - ${PYTHON_PN}-click \ +RDEPENDS:${PN} += " \ + python3-twisted \ + 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-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 b5cde669ff..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_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.post1.bb b/meta-python/recipes-devtools/python/python3-intervals_1.10.0.bb index 14bc9ad254..3c5be47806 100644 --- a/meta-python/recipes-devtools/python/python3-intervals_1.10.0.post1.bb +++ b/meta-python/recipes-devtools/python/python3-intervals_1.10.0.bb @@ -2,7 +2,7 @@ DESCRIPTION = "Interval arithmetic for Python" HOMEPAGE = "https://github.com/AlexandreDecan/python-intervals" SECTION = "devel/python" -LICENSE = "LGPLv3" +LICENSE = "LGPL-3.0-only" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=05f1e16a8e59ce3e9a979e881816c2ab" PYPI_PACKAGE := "python-intervals" @@ -13,8 +13,9 @@ SRC_URI += " \ inherit pypi setuptools3 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() { cp -f ${S}/README.md ${D}${PTEST_PATH} } -SRC_URI[sha256sum] = "68a772dc2de6b2b2e83b457329ffa8f9286710994b8070db54348a05762515d2" +SRC_URI[sha256sum] = "0d26746eaed0be78a61dd289bb7a10721b08770bb3e807614835f490d514f2a5" BBCLASSEXTEND = "native" 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 new file mode 100644 index 0000000000..58af7b77ac --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-iperf_0.1.11.bb @@ -0,0 +1,16 @@ +SUMMARY = "Python wrapper around iperf3" +HOMEPAGE = "https://github.com/thiezn/iperf3-python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=f7d0900b3d30647cdda002c9549ca40f" + +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 c141f6865f..36d0b9ae27 100644 --- a/meta-python/recipes-devtools/python/python3-ipy_1.01.bb +++ b/meta-python/recipes-devtools/python/python3-ipy_1.01.bb @@ -12,14 +12,15 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=848d24919845901b4f48bae5f13252e6" SRC_URI[md5sum] = "d6cf83e7f418ebbd23324ba1c658b907" SRC_URI[sha256sum] = "edeca741dea2d54aca568fa23740288c3fe86c0f3ea700344571e9ef14a7cc1a" -inherit pypi setuptools3 ptest +inherit pypi setuptools3_legacy ptest SRC_URI += " \ file://run-ptest \ " -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ +RDEPENDS:${PN}-ptest += " \ + 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 587aea1f05..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" +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_7.22.0.bb b/meta-python/recipes-devtools/python/python3-ipython_7.22.0.bb deleted file mode 100644 index 7bc0d1d00c..0000000000 --- a/meta-python/recipes-devtools/python/python3-ipython_7.22.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" -LIC_FILES_CHKSUM = "file://COPYING.rst;md5=59b20262b8663cdd094005bddf47af5f" - -PYPI_PACKAGE = "ipython" - -SRC_URI[sha256sum] = "9c900332d4c5a6de534b4befeeb7de44ad0cc42e8327fa41b7685abde58cec74" - -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_1.0.1.bb b/meta-python/recipes-devtools/python/python3-iso3166_2.1.1.bb index 36f9c911b8..3aa084d10a 100644 --- a/meta-python/recipes-devtools/python/python3-iso3166_1.0.1.bb +++ b/meta-python/recipes-devtools/python/python3-iso3166_2.1.1.bb @@ -3,17 +3,17 @@ HOMEPAGE = "https://pypi.org/project/iso3166/" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=5e2f4edc7e7408a82e4a1d05f229b695" -SRC_URI[md5sum] = "53c313c7ae8721e40ddd5e7a01bbcb7e" -SRC_URI[sha256sum] = "b1e58dbcf50fbb2c9c418ec7a6057f0cdb30b8f822ac852f72e71ba769dae8c5" +SRC_URI[sha256sum] = "fcd551b8dda66b44e9f9e6d6bbbee3a1145a22447c0a556e5d0fb1ad1e491719" -inherit pypi setuptools3 ptest +inherit pypi python_setuptools_build_meta ptest SRC_URI += " \ file://run-ptest \ " -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { @@ -21,6 +21,6 @@ do_install_ptest() { cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ } -RDEPENDS_${PN} += "python3-numbers" +RDEPENDS:${PN} += "python3-numbers" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-iso8601_0.1.14.bb b/meta-python/recipes-devtools/python/python3-iso8601_0.1.14.bb deleted file mode 100644 index c531fcc6d8..0000000000 --- a/meta-python/recipes-devtools/python/python3-iso8601_0.1.14.bb +++ /dev/null @@ -1,15 +0,0 @@ -SUMMARY = "Simple module to parse ISO 8601 dates" -HOMEPAGE = "http://pyiso8601.readthedocs.org/" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=b05625f2336fa024e8d57e65c6595844" - -SRC_URI[sha256sum] = "8aafd56fa0290496c5edbb13c311f78fa3a241f0853540da09d9363eae3ebd79" - -inherit pypi setuptools3 - -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-numbers \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-isodate_0.6.0.bb b/meta-python/recipes-devtools/python/python3-isodate_0.6.0.bb deleted file mode 100644 index 2aa64d08d4..0000000000 --- a/meta-python/recipes-devtools/python/python3-isodate_0.6.0.bb +++ /dev/null @@ -1,14 +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[md5sum] = "0e1203fce27ce65e2d01c5f21c4d428f" -SRC_URI[sha256sum] = "2e364a3d5759479cdb2d37cce6b9376ea504db2ff90252a2e5b7cc89cc9ff2d8" - -inherit pypi setuptools3 - -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-six \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-isort_5.13.2.bb b/meta-python/recipes-devtools/python/python3-isort_5.13.2.bb new file mode 100644 index 0000000000..60d44181c0 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-isort_5.13.2.bb @@ -0,0 +1,22 @@ +SUMMARY = "A Python utility / library to sort Python imports." +HOMEPAGE = "https://pypi.python.org/pypi/isort" +LICENSE = "MIT" +SECTION = "devel/python" +LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=6;endline=6;md5=8227180126797a0148f94f483f3e1489" + +SRC_URI[sha256sum] = "48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109" + +inherit pypi python_poetry_core + +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-isort_5.8.0.bb b/meta-python/recipes-devtools/python/python3-isort_5.8.0.bb deleted file mode 100644 index 36de825d2a..0000000000 --- a/meta-python/recipes-devtools/python/python3-isort_5.8.0.bb +++ /dev/null @@ -1,16 +0,0 @@ -SUMMARY = "A Python utility / library to sort Python imports." -HOMEPAGE = "https://pypi.python.org/pypi/isort" -LICENSE = "MIT" -SECTION = "devel/python" -LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=6;endline=6;md5=8227180126797a0148f94f483f3e1489" - -SRC_URI[sha256sum] = "0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6" - -inherit pypi setuptools3 - -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-shell \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-itsdangerous_1.1.0.bb b/meta-python/recipes-devtools/python/python3-itsdangerous_1.1.0.bb deleted file mode 100644 index 7f50641c89..0000000000 --- a/meta-python/recipes-devtools/python/python3-itsdangerous_1.1.0.bb +++ /dev/null @@ -1,17 +0,0 @@ -SUMMARY = "Various helpers to pass trusted data to untrusted environments and back." -HOMEPAGE = "http://github.com/mitsuhiko/itsdangerous" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=370799bf709a1e4a6a369fa089ac73a6" - -SRC_URI[md5sum] = "9b7f5afa7f1e3acfb7786eeca3d99307" -SRC_URI[sha256sum] = "321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19" - -inherit pypi setuptools3 - -CLEANBROKEN = "1" - -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-simplejson \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-compression \ -" 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 new file mode 100644 index 0000000000..5af1d594b3 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-itsdangerous_2.1.2.bb @@ -0,0 +1,17 @@ +SUMMARY = "Various helpers to pass trusted data to untrusted environments and back." +HOMEPAGE = "http://github.com/mitsuhiko/itsdangerous" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=4cda9a0ebd516714f360b0e9418cfb37" + +SRC_URI[sha256sum] = "5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a" + +inherit pypi setuptools3 + +CLEANBROKEN = "1" + +RDEPENDS:${PN} += " \ + 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.2.bb b/meta-python/recipes-devtools/python/python3-javaobj-py3_0.4.4.bb index 2f24219812..d71101ee2c 100644 --- a/meta-python/recipes-devtools/python/python3-javaobj-py3_0.4.2.bb +++ b/meta-python/recipes-devtools/python/python3-javaobj-py3_0.4.4.bb @@ -7,8 +7,13 @@ HOMEPAGE = "https://github.com/tcalmant/python-javaobj" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=d273d63619c9aeaf15cdaf76422c4f87" -SRC_URI[sha256sum] = "ed3b1ffcfd39f165729cb53587cca02ab0bfa4c332c837a92d5ffe6aef5c8010" +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_3.6.2.bb b/meta-python/recipes-devtools/python/python3-jdatetime_3.6.2.bb deleted file mode 100644 index 43f6e18493..0000000000 --- a/meta-python/recipes-devtools/python/python3-jdatetime_3.6.2.bb +++ /dev/null @@ -1,18 +0,0 @@ -DESCRIPTION = "Jalali implementation of Python's datetime module" -HOMEPAGE = "https://github.com/slashmili/python-jalali" -LICENSE = "Python-2.0" -LIC_FILES_CHKSUM = "file://PKG-INFO;md5=fc0a323542d2fbe0ad822fa0b1a0a96f" - -SRC_URI[md5sum] = "3c9ee1bc7de48ff4d9c773046b2eb081" -SRC_URI[sha256sum] = "a589e35f0dab89283c1a3de9d70ed6cf657932aaed8e8ce1b0e5801aaab1da67" - -PYPI_PACKAGE = "jdatetime" - -inherit pypi setuptools3 - -CLEANBROKEN = "1" - -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-modules \ -" - diff --git a/meta-python/recipes-devtools/python/python3-jdatetime_5.0.0.bb b/meta-python/recipes-devtools/python/python3-jdatetime_5.0.0.bb new file mode 100644 index 0000000000..f1dd368ea0 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-jdatetime_5.0.0.bb @@ -0,0 +1,17 @@ +DESCRIPTION = "Jalali implementation of Python's datetime module" +HOMEPAGE = "https://github.com/slashmili/python-jalali" +LICENSE = "Python-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=c80be45b33471b4a23cf53d06a8172be" + +SRC_URI[sha256sum] = "2cc603d913c0d8e328928454d3d295261cb037e9950227f67c9629ab4710fdf9" + +PYPI_PACKAGE = "jdatetime" + +inherit pypi setuptools3 + +CLEANBROKEN = "1" + +RDEPENDS:${PN} += " \ + 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 46deeae158..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 @@ -4,7 +4,7 @@ and another function for converting Julian calendar dates to Julian dates are de Two functions for the reverse calculations are also defined." HOMEPAGE = "https://github.com/phn/jdcal" -LICENSE = "BSD" +LICENSE = "BSD-2-Clause" LIC_FILES_CHKSUM = "file://PKG-INFO;md5=bd236e1f590973467a427bb354be0f46" inherit pypi setuptools3 ptest @@ -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 \ +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-jedi_0.18.0.bb b/meta-python/recipes-devtools/python/python3-jedi_0.19.1.bb index 6c857f09ee..56395c3b5d 100644 --- a/meta-python/recipes-devtools/python/python3-jedi_0.18.0.bb +++ b/meta-python/recipes-devtools/python/python3-jedi_0.19.1.bb @@ -1,13 +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] = "92550a404bad8afed881a137ec9a461fed49eca661414be45059329614ed0707" +SRC_URI[sha256sum] = "cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd" -RDEPENDS_${PN} = "${PYTHON_PN}-parso" +RDEPENDS:${PN} = " \ + python3-parso \ + python3-core \ + python3-compression \ + python3-pydoc \ + python3-compile \ + python3-json \ +" inherit setuptools3 pypi diff --git a/meta-python/recipes-devtools/python/python3-jinja2_2.%.bbappend b/meta-python/recipes-devtools/python/python3-jinja2_2.%.bbappend deleted file mode 100644 index 9fe358427a..0000000000 --- a/meta-python/recipes-devtools/python/python3-jinja2_2.%.bbappend +++ /dev/null @@ -1,13 +0,0 @@ -# Main recipe was moved to oe-core, but with ptest disabled -inherit ${@bb.utils.filter('DISTRO_FEATURES', 'ptest', d)} - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/tests - cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ -} - -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-toml \ - ${PYTHON_PN}-unixadmin \ -" diff --git a/meta-python/recipes-devtools/python/python3-jmespath_0.10.0.bb b/meta-python/recipes-devtools/python/python3-jmespath_1.0.1.bb index 46976d19b3..73f5f4d025 100644 --- a/meta-python/recipes-devtools/python/python3-jmespath_0.10.0.bb +++ b/meta-python/recipes-devtools/python/python3-jmespath_1.0.1.bb @@ -4,9 +4,8 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=2683790f5fabb41a3f75b70558799eb4" -SRC_URI[md5sum] = "65bdcb5fa5bcf1cc710ffa508e78e408" -SRC_URI[sha256sum] = "b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9" +SRC_URI[sha256sum] = "90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe" inherit pypi setuptools3 -RDEPENDS_${PN} += "python3-math python3-json python3-numbers" +RDEPENDS:${PN} += "python3-math python3-json python3-numbers" diff --git a/meta-python/recipes-devtools/python/python3-joblib_1.4.0.bb b/meta-python/recipes-devtools/python/python3-joblib_1.4.0.bb new file mode 100644 index 0000000000..868e3f2114 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-joblib_1.4.0.bb @@ -0,0 +1,15 @@ +SUMMARY = "Joblib is a set of tools to provide lightweight pipelining in Python." +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=2e481820abf0a70a18011a30153df066" + +inherit setuptools3 pypi + +SRC_URI[sha256sum] = "1eb0dc091919cd384490de890cb5dfd538410a6d4b3b54eef09fb8c50b409b1c" + +RDEPENDS:${PN} += " \ + python3-asyncio \ + python3-json \ + python3-multiprocessing \ + python3-pprint \ + python3-pydoc \ +" 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_2.2.2.bb b/meta-python/recipes-devtools/python/python3-jsmin_3.0.1.bb index 9b7a824087..c3129e7b53 100644 --- a/meta-python/recipes-devtools/python/python3-jsmin_2.2.2.bb +++ b/meta-python/recipes-devtools/python/python3-jsmin_3.0.1.bb @@ -5,17 +5,17 @@ LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=3a3301ce2ad647e172f4a1016c67324d" inherit setuptools3 pypi ptest -SRC_URI[md5sum] = "00e7a3179a4591aab2ee707b3214e2fd" -SRC_URI[sha256sum] = "b6df99b2cd1c75d9d342e4335b535789b8da9107ec748212706ef7bbe5c2553b" +SRC_URI[sha256sum] = "c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5cc2bfc" BBCLASSEXTEND = "native nativesdk" SRC_URI += " \ + file://7a75d76c2d6bfb917f30ced8f5c0a9a4157f7819.patch \ file://run-ptest \ " -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ +RDEPENDS:${PN}-ptest += " \ + 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 0c86240361..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 54e1b646d5..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 @@ -1,12 +1,16 @@ DESCRIPTION = "A robust and significantly extended implementation of JSONPath for Python" HOMEPAGE = "https://github.com/kennknowles/python-jsonpath-rw" SECTION = "devel/python" -LICENSE = "BSD+" -LIC_FILES_CHKSUM = "file://README.rst;md5=02384665f821c394981e0dd1faec9a7d" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://README.rst;beginline=198;endline=215;md5=2866908485c18dc999b6c8dc608563ec" -SRC_URI[md5sum] = "3a807e05c2c12158fc6bb0a402fd5778" SRC_URI[sha256sum] = "05c471281c45ae113f6103d1268ec7a4831a2e96aa80de45edc89b11fac4fbec" 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-jsonpointer/run-ptest b/meta-python/recipes-devtools/python/python3-jsonpointer/run-ptest deleted file mode 100644 index 51e609f4ba..0000000000 --- a/meta-python/recipes-devtools/python/python3-jsonpointer/run-ptest +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -python3 tests.py diff --git a/meta-python/recipes-devtools/python/python3-jsonpointer_2.1.bb b/meta-python/recipes-devtools/python/python3-jsonpointer_2.1.bb deleted file mode 100644 index a4cc05c947..0000000000 --- a/meta-python/recipes-devtools/python/python3-jsonpointer_2.1.bb +++ /dev/null @@ -1,26 +0,0 @@ -SUMMARY = "Resolve JSON Pointers in Python" -HOMEPAGE = "https://github.com/stefankoegl/python-json-pointer" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=32b15c843b7a329130f4e266a281ebb3" - -inherit pypi ptest setuptools3 - -SRC_URI[sha256sum] = "5a34b698db1eb79ceac454159d3f7c12a451a91f6334a4f638454327b7a89962" - -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-json \ -" - -BBCLASSEXTEND = "native nativesdk" - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ -" - -do_install_ptest() { - cp -f ${S}/tests.py ${D}${PTEST_PATH}/ -} diff --git a/meta-python/recipes-devtools/python/python3-jsonrpcclient_4.0.3.bb b/meta-python/recipes-devtools/python/python3-jsonrpcclient_4.0.3.bb new file mode 100644 index 0000000000..459726199e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-jsonrpcclient_4.0.3.bb @@ -0,0 +1,19 @@ +SUMMARY = "Generate JSON-RPC requests and parse responses in Python" +HOMEPAGE = "https://github.com/explodinglabs/jsonrpcclient" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=10f3d7679914df805c98fb351172e677" + +SRCREV = "e5dd11736925a9a8e463fc9420eab95235f181e3" +SRC_URI = "git://github.com/explodinglabs/jsonrpcclient.git;branch=main;protocol=https" + +inherit python_setuptools_build_meta + +S = "${WORKDIR}/git" + +RDEPENDS:${PN} += "\ + python3-json \ + python3-math \ + python3-netclient \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-jsonrpcserver_4.2.0.bb b/meta-python/recipes-devtools/python/python3-jsonrpcserver_4.2.0.bb deleted file mode 100644 index 53f01f622e..0000000000 --- a/meta-python/recipes-devtools/python/python3-jsonrpcserver_4.2.0.bb +++ /dev/null @@ -1,22 +0,0 @@ -SUMMARY = "Library to process JSON-RPC requests" -HOMEPAGE = "https://github.com/bcb/jsonrpcserver" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=c89120516900f96f4c60d35fdc4c3f15" - -SRC_URI[sha256sum] = "0c9e5b9445621138521e912016ae39b3badadd2607140dcbb0c8062934ab4854" - -inherit pypi setuptools3 - -RDEPENDS_${PN} += "\ - python3-apply-defaults \ - python3-asyncio \ - python3-core \ - python3-json \ - python3-jsonschema \ - python3-logging \ - python3-netclient \ - python3-pkgutil \ -" - -BBCLASSEXTEND = "native nativesdk" - diff --git a/meta-python/recipes-devtools/python/python3-jsonschema_3.2.0.bb b/meta-python/recipes-devtools/python/python3-jsonschema_3.2.0.bb deleted file mode 100644 index 2705dd3bad..0000000000 --- a/meta-python/recipes-devtools/python/python3-jsonschema_3.2.0.bb +++ /dev/null @@ -1,48 +0,0 @@ -SUMMARY = "An implementation of JSON Schema validation for Python" -HOMEPAGE = "https://github.com/Julian/jsonschema" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://COPYING;md5=7a60a81c146ec25599a3e1dabb8610a8 \ - file://json/LICENSE;md5=9d4de43111d33570c8fe49b4cb0e01af" -DEPENDS += "${PYTHON_PN}-vcversioner-native ${PYTHON_PN}-setuptools-scm-native" - -SRC_URI[md5sum] = "f1a0b5011f05a02a8dee1070cd10a26d" -SRC_URI[sha256sum] = "c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a" - -inherit pypi setuptools3 - -PACKAGECONFIG ??= "format" -PACKAGECONFIG[format] = ",,,\ - ${PYTHON_PN}-idna \ - ${PYTHON_PN}-jsonpointer \ - ${PYTHON_PN}-webcolors \ - ${PYTHON_PN}-rfc3987 \ - ${PYTHON_PN}-strict-rfc3339 \ -" -PACKAGECONFIG[nongpl] = ",,,\ - ${PYTHON_PN}-idna \ - ${PYTHON_PN}-jsonpointer \ - ${PYTHON_PN}-webcolors \ - ${PYTHON_PN}-rfc3986-validator \ - ${PYTHON_PN}-rfc3339-validator \ -" - -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-attrs \ - ${PYTHON_PN}-core \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-importlib-metadata \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-pkgutil \ - ${PYTHON_PN}-pprint \ - ${PYTHON_PN}-pyrsistent \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-unittest \ - ${PYTHON_PN}-setuptools-scm \ - ${PYTHON_PN}-zipp \ -" - -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 4293a63c1e..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 @@ -4,16 +4,15 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=366e2fd3c9714f162d3663b6f97cfe41" -SRC_URI = "git://github.com/keras-team/keras-applications.git" +SRC_URI = "git://github.com/keras-team/keras-applications.git;branch=master;protocol=https" SRCREV ?= "3b180cb10eda683dda7913ecee2e6487288d292d" - inherit setuptools3 S = "${WORKDIR}/git" BBCLASSEXTEND = "native" -RDEPENDS_${PN} = "python3-numpy \ +RDEPENDS:${PN} = "python3-numpy \ python3-h5py \ " 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 new file mode 100644 index 0000000000..e38b31d34d --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-kivy/0001-add-support-for-glesv2.patch @@ -0,0 +1,51 @@ +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 +@@ -730,7 +730,18 @@ def determine_gl_flags(): + c_options['use_x11'] = True + c_options['use_egl'] = True + else: +- flags['libraries'] = ['GL'] ++ if cross_sysroot: ++ flags['include_dirs'] = [cross_sysroot + '/usr/include'] ++ flags['library_dirs'] = [cross_sysroot + '/usr/lib'] ++ ++ if c_options['use_opengl_es2']: ++ print("using GLESv2 libraries") ++ flags['libraries'] = ['GLESv2'] ++ else: ++ flags['libraries'] = ['GL'] ++ ++ ++ print("cross_sysroot: " + str(cross_sysroot)) + return flags, base_flags + + +@@ -774,14 +785,13 @@ def determine_sdl2(): + sdl_inc = join(include, 'SDL2') + if isdir(sdl_inc): + sdl2_paths.append(sdl_inc) +- sdl2_paths.extend(['/usr/local/include/SDL2', '/usr/include/SDL2']) + + flags['include_dirs'] = sdl2_paths + flags['extra_link_args'] = [] + flags['extra_compile_args'] = [] + flags['library_dirs'] = ( + sdl2_paths if sdl2_paths else +- ['/usr/local/lib/']) ++ ['']) + + 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.3.0.bb b/meta-python/recipes-devtools/python/python3-kivy_2.3.0.bb new file mode 100644 index 0000000000..991aa0f7d8 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-kivy_2.3.0.bb @@ -0,0 +1,72 @@ +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=6d3bc49400e35d5a2279d14c40dcfb09" + +inherit setuptools3 pkgconfig features_check + +# 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 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" + +PACKAGES += "${PN}-examples" +FILES:${PN}-examples = "/usr/share/kivy-examples" + +USE_WAYLAND = "${@bb.utils.contains('DISTRO_FEATURES', 'wayland', '1', '0', d)}" +export USE_WAYLAND + +# if using Wayland, let's use pure Wayland (and not XWayland) +# so do not build using X11 flag when we detect Wayland +USE_X11 = " \ + ${@bb.utils.contains('DISTRO_FEATURES', 'wayland', '0', \ + bb.utils.contains('DISTRO_FEATURES', 'x11', '1', \ + '0', d), d)}" +export USE_X11 + +# Use OpenGL ES 2.0 library +KIVY_GRAPHICS = "gles" +export KIVY_GRAPHICS + +KIVY_CROSS_SYSROOT="${RECIPE_SYSROOT}" +export KIVY_CROSS_SYSROOT + +REQUIRED_DISTRO_FEATURES += "opengl gobject-introspection-data" + +ANY_OF_DISTRO_FEATURES = "x11 wayland" + +DEPENDS += " \ + gstreamer1.0 \ + gstreamer1.0-python \ + libsdl2 \ + libsdl2-ttf \ + libsdl2-image \ + libsdl2-mixer \ + pango \ + python3 \ + python3-cython-native \ +" + +RDEPENDS:${PN} = " \ + gstreamer1.0 \ + gstreamer1.0-python \ + libsdl2 \ + libsdl2-ttf \ + libsdl2-image \ + libsdl2-mixer \ + pango \ + python3 \ + python3-docutils \ + python3-fcntl \ + python3-image \ + python3-pillow \ + python3-pygments \ +" diff --git a/meta-python/recipes-devtools/python/python3-kiwisolver_1.3.1.bb b/meta-python/recipes-devtools/python/python3-kiwisolver_1.3.1.bb deleted file mode 100644 index be60dc20e5..0000000000 --- a/meta-python/recipes-devtools/python/python3-kiwisolver_1.3.1.bb +++ /dev/null @@ -1,20 +0,0 @@ -SUMMARY = "A fast implementation of the Cassowary constraint solver" -HOMEPAGE = "https://github.com/nucleic/kiwi" -LICENSE = "BSD" -LIC_FILES_CHKSUM = "file://setup.py;endline=7;md5=e54bd74bd9d0a84ae3f8f6d21ada0ab4" - -SRC_URI[md5sum] = "81012578317ddcfa3daed806142f8fed" -SRC_URI[sha256sum] = "950a199911a8d94683a6b10321f9345d5a3a8433ec58b217ace979e18f16e248" - -inherit pypi setuptools3 - -DEPENDS += "\ - python3-cppy-native \ -" - -RDEPENDS_${PN} += "\ - python3-core \ - python3-setuptools \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-kiwisolver_1.4.5.bb b/meta-python/recipes-devtools/python/python3-kiwisolver_1.4.5.bb new file mode 100644 index 0000000000..a1949b1138 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-kiwisolver_1.4.5.bb @@ -0,0 +1,19 @@ +SUMMARY = "A fast implementation of the Cassowary constraint solver" +HOMEPAGE = "https://github.com/nucleic/kiwi" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=f137eeae9cf8004d06830f6ab25b2d52" + +SRC_URI[sha256sum] = "e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec" + +inherit pypi python_setuptools_build_meta + +DEPENDS += "\ + python3-cppy-native \ +" + +RDEPENDS:${PN} += "\ + python3-core \ + python3-setuptools \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-langtable_0.0.54.bb b/meta-python/recipes-devtools/python/python3-langtable_0.0.65.bb index b9b4069fdc..fa9edc67d4 100644 --- a/meta-python/recipes-devtools/python/python3-langtable_0.0.54.bb +++ b/meta-python/recipes-devtools/python/python3-langtable_0.0.65.bb @@ -1,24 +1,23 @@ DESCRIPTION = "langtable is used to guess reasonable defaults for locale,\ keyboard, territory" HOMEPAGE = "https://github.com/mike-fabian/langtable/" -LICENSE = "GPLv3+" +LICENSE = "GPL-3.0-or-later" SECTION = "devel/python" LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504" -SRC_URI[md5sum] = "bf2db4302dbed534ff322612f5f5a16e" -SRC_URI[sha256sum] = "2a6298267586fcade84ce977736fc35102ef95d68975bc90ceaa06117d42d5a6" +SRC_URI[sha256sum] = "791ec5403859704e1dee4d2a056a30ec21d1e7bc040658ce62c40e0427ba4333" inherit pypi setuptools3 python3native DISTUTILS_INSTALL_ARGS += " \ --install-data=${datadir}/langtable" -FILES_${PN} += "${datadir}/*" +FILES:${PN} += "${datadir}/*" -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-doctest \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-xml \ +RDEPENDS:${PN} += " \ + 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.6.0.bb b/meta-python/recipes-devtools/python/python3-lazy-object-proxy_1.6.0.bb deleted file mode 100644 index 700c70e53f..0000000000 --- a/meta-python/recipes-devtools/python/python3-lazy-object-proxy_1.6.0.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" - -SRC_URI[sha256sum] = "489000d368377571c6f982fba6497f2aa13c6d1facc40660963da62f5c379726" - -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_1.2.bb b/meta-python/recipes-devtools/python/python3-license-expression_1.2.bb deleted file mode 100644 index c033bd3527..0000000000 --- a/meta-python/recipes-devtools/python/python3-license-expression_1.2.bb +++ /dev/null @@ -1,29 +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=e23fadd6ceef8c618fc1c65191d846fa" - -SRC_URI[md5sum] = "fd4cb295cc345be1071274cdbd81c969" -SRC_URI[sha256sum] = "7960e1dfdf20d127e75ead931476f2b5c7556df05b117a73880b22ade17d1abc" - -inherit pypi ptest setuptools3 - -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 - cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ -} 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 30b1297e7b..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 fc75e43485..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} += " \ +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/0001-setup.py-use-setuptools-instead-of-distutils.patch b/meta-python/recipes-devtools/python/python3-lrparsing/0001-setup.py-use-setuptools-instead-of-distutils.patch new file mode 100644 index 0000000000..28af8fa4ec --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-lrparsing/0001-setup.py-use-setuptools-instead-of-distutils.patch @@ -0,0 +1,27 @@ +From 04d9a4cea699d64b464daef7760de594b1c7f9bf Mon Sep 17 00:00:00 2001 +From: Justin Bronder <jsbronder@cold-front.org> +Date: Tue, 1 Mar 2022 17:34:34 -0500 +Subject: [PATCH] setup.py: use setuptools instead of distutils + +With python 3.10, distutils is deprecated in favor of setuptools and will +be removed in python 3.12. + +Upstream-Status: Submitted [sent to maintainer at russell-lrparsing@stuart.id.au] +Signed-off-by: Justin Bronder <jsbronder@cold-front.org> +--- + setup.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/setup.py b/setup.py +index 89ea344..2848b4f 100644 +--- a/setup.py ++++ b/setup.py +@@ -3,7 +3,7 @@ + # Copyright (c) 2013,2014,2015,2016,2017,2018,2021 Russell Stuart. + # Licensed under GPLv2, or any later version. + # +-from distutils.core import setup ++from setuptools import setup + import re + + def get_long_description(): diff --git a/meta-python/recipes-devtools/python/python3-lrparsing_1.0.16.bb b/meta-python/recipes-devtools/python/python3-lrparsing_1.0.17.bb index 85a54af30d..8cd60d3a0f 100644 --- a/meta-python/recipes-devtools/python/python3-lrparsing_1.0.16.bb +++ b/meta-python/recipes-devtools/python/python3-lrparsing_1.0.17.bb @@ -1,15 +1,20 @@ SUMMARY = "Python LR parsing library" SECTION = "devel/python" -LICENSE = "AGPL-3.0" +LICENSE = "AGPL-3.0-only" LIC_FILES_CHKSUM = "file://agpl-3.0.txt;md5=73f1eb20517c55bf9493b7dd6e480788" HOMEPAGE = "http://lrparsing.sourceforge.net/" BUGTRACKER = "https://sourceforge.net/p/lrparsing/tickets/" UPSTREAM_CHECK_URI = "https://sourceforge.net/projects/lrparsing/files/" UPSTREAM_CHECK_REGEX = "lrparsing-(?P<pver>\d+(\.\d+)+)" -SRC_URI = "${SOURCEFORGE_MIRROR}/lrparsing/lrparsing-${PV}.tar.gz" -SRC_URI[md5sum] = "34357d69bce87654d792cd8f02d148b2" -SRC_URI[sha256sum] = "b45afda44001dc5ba632934f74c043d40cce653f1a7526cfbcb68f6be055b8d7" +SRC_URI = "${SOURCEFORGE_MIRROR}/lrparsing/lrparsing-${PV}.tar.gz \ + file://0001-setup.py-use-setuptools-instead-of-distutils.patch \ + " +SRC_URI[sha256sum] = "7c060d9f03cf582fdbc0ae0fef0ea2ff6fd56251047ba7e425af97e23f46f582" + +RDEPENDS:${PN} = " \ + python3-crypt \ +" inherit setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-lru-dict_1.3.0.bb b/meta-python/recipes-devtools/python/python3-lru-dict_1.3.0.bb new file mode 100644 index 0000000000..e9535fa6f1 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-lru-dict_1.3.0.bb @@ -0,0 +1,11 @@ +SUMMARY = "A fixed size dict like container which evicts Least Recently Used (LRU) items once size limit is exceeded." +HOMEPAGE = "https://github.com/amitdev/lru-dict" +SECTION = "devel/python" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=9d10a486ee04034fdef5162fd791f153" + +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.3.1.bb deleted file mode 100644 index 47efe8a723..0000000000 --- a/meta-python/recipes-devtools/python/python3-luma-core_2.3.1.bb +++ /dev/null @@ -1,19 +0,0 @@ -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" - -inherit pypi setuptools3 - -SRC_URI[sha256sum] = "f293f5fff8946eea62af3a5d5d7da55c37d2b64aac6c9c90180a385da9f7d003" - -CLEANBROKEN = "1" - -PYPI_PACKAGE = "luma.core" - -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-pillow \ - ${PYTHON_PN}-threading \ - ${PYTHON_PN}-smbus2 \ -" diff --git a/meta-python/recipes-devtools/python/python3-luma-core_2.4.2.bb b/meta-python/recipes-devtools/python/python3-luma-core_2.4.2.bb new file mode 100644 index 0000000000..90967f8e56 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-luma-core_2.4.2.bb @@ -0,0 +1,17 @@ +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=2083293a38df91b8d470d3fe30069262" + +inherit pypi python_setuptools_build_meta + +SRC_URI[sha256sum] = "963c264164d4374f549d57db09599e0ca458cea1bd05e16939897619be4e6dbd" + +PYPI_PACKAGE = "luma.core" + +RDEPENDS:${PN} += " \ + 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 329cdb9e3f..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 \ +RDEPENDS:${PN} += " \ + python3-luma-core \ " diff --git a/meta-python/recipes-devtools/python/python3-lxml_4.6.3.bb b/meta-python/recipes-devtools/python/python3-lxml_4.6.3.bb deleted file mode 100644 index cefe1ba340..0000000000 --- a/meta-python/recipes-devtools/python/python3-lxml_4.6.3.bb +++ /dev/null @@ -1,41 +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 = "http://codespeak.net/lxml" -SECTION = "devel/python" -LICENSE = "BSD & GPLv2 & MIT & PSF" -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] = "39b78571b3b30645ac77b95f7c69d1bffc4cf8c3b157c435a34da72e78c82468" - -inherit 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 new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-lz4/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-lz4_3.1.3.bb b/meta-python/recipes-devtools/python/python3-lz4_3.1.3.bb deleted file mode 100644 index b14484b782..0000000000 --- a/meta-python/recipes-devtools/python/python3-lz4_3.1.3.bb +++ /dev/null @@ -1,15 +0,0 @@ -DESCRIPTION = "python bindings for the lz4 compression library by Yann Collet" - -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=6231efa4dd4811e62407314d90a57573" - -DEPENDS += " \ - ${PYTHON_PN}-setuptools-scm-native \ - ${PYTHON_PN}-pkgconfig-native \ -" - -SRC_URI[sha256sum] = "081ef0a3b5941cb03127f314229a1c78bd70c9c220bb3f4dd80033e707feaa18" - -inherit pypi setuptools3 - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-lz4_4.3.3.bb b/meta-python/recipes-devtools/python/python3-lz4_4.3.3.bb new file mode 100644 index 0000000000..746926da4e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-lz4_4.3.3.bb @@ -0,0 +1,34 @@ +DESCRIPTION = "python bindings for the lz4 compression library by Yann Collet" + +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=6231efa4dd4811e62407314d90a57573" + +DEPENDS += " \ + lz4 \ + python3-setuptools-scm-native \ + python3-pkgconfig-native \ +" + +SRC_URI += "file://run-ptest" + +SRC_URI[sha256sum] = "01fe674ef2889dbb9899d8a67361e0c4a2c833af5aeb37dd505727cf5d2a131e" + +inherit pkgconfig pypi python_setuptools_build_meta ptest + +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}/ + # The stream API is experimental and not enabled yet, so don't ship the test suite + rm -rf ${D}${PTEST_PATH}/tests/stream +} + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-m2crypto/0001-setup.py-address-openssl-3.x-build-issue.patch b/meta-python/recipes-devtools/python/python3-m2crypto/0001-setup.py-address-openssl-3.x-build-issue.patch new file mode 100644 index 0000000000..c67e50803b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-m2crypto/0001-setup.py-address-openssl-3.x-build-issue.patch @@ -0,0 +1,28 @@ +From 0d824e5c2ab13e761ffaeabdccf9513d5b8f280d Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin <alex@linutronix.de> +Date: Fri, 8 Oct 2021 11:18:35 +0200 +Subject: [PATCH] setup.py: address openssl 3.x build issue + +swig throws: +| /home/alex/development/poky/build-metaoe/tmp/work/x86_64-linux/python3-m2crypto-native/0.38.0-r0/recipe-sysroot-native/usr/include/openssl/macros.h:155: Error: CPP #error ""OPENSSL_API_COMPAT expresses an impossible API compatibility level"". Use the -cpperraswarn option to continue swig processing. + +I'm not sure why; upstream should take a look. + +Upstream-Status: Inappropriate [workaround] +Signed-off-by: Alexander Kanavin <alex@linutronix.de> +--- + setup.py | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/setup.py b/setup.py +index 2c65404..74704bc 100644 +--- a/setup.py ++++ b/setup.py +@@ -192,6 +192,7 @@ class _M2CryptoBuildExt(build_ext.build_ext): + + self.swig_opts.append('-includeall') + self.swig_opts.append('-modern') ++ self.swig_opts.append('-cpperraswarn') + self.swig_opts.append('-builtin') + + # These two lines are a workaround for diff --git a/meta-python/recipes-devtools/python/python-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 b339d93f75..0baadfcaa5 100644 --- a/meta-python/recipes-devtools/python/python-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,24 +5,22 @@ 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(-) -Index: M2Crypto-0.30.1/setup.py -=================================================================== ---- M2Crypto-0.30.1.orig/setup.py -+++ M2Crypto-0.30.1/setup.py -@@ -130,6 +130,7 @@ class _M2CryptoBuildExt(build_ext.build_ +--- a/setup.py ++++ b/setup.py +@@ -135,6 +135,7 @@ class _M2CryptoBuildExt(build_ext.build_ self.set_undefined_options('build', ('bundledlls', 'bundledlls')) self.libraries = ['ssl', 'crypto'] + self.openssl = os.environ.get( "STAGING_DIR" ) if sys.platform == 'win32': self.libraries = ['ssleay32', 'libeay32'] - if self.openssl and openssl_version(self.openssl, 0x10100000, True): -@@ -150,8 +151,8 @@ class _M2CryptoBuildExt(build_ext.build_ + if self.openssl and openssl_version(self.openssl, +@@ -159,8 +160,8 @@ class _M2CryptoBuildExt(build_ext.build_ if self.openssl is not None: log.debug('self.openssl = %s', self.openssl) 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 new file mode 100644 index 0000000000..3cd6f7c276 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-m2crypto/avoid-host-contamination.patch @@ -0,0 +1,23 @@ +Filter out '/usr/include' for swig to avoid host contamination issue. + +Upstream-Status: Inappropriate [cross compile specific] + +Signed-off-by: Kai Kang <kai.kang@windriver.com> +--- + setup.py | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/setup.py b/setup.py +index 5a12981..389d49f 100644 +--- a/setup.py ++++ b/setup.py +@@ -153,7 +153,8 @@ class _M2CryptoBuildExt(build_ext.build_ext): + self.swig_opts.append('-py3') + + # swig seems to need the default header file directories +- self.swig_opts.extend(['-I%s' % i for i in _get_additional_includes()]) ++ self.swig_opts.extend(['-I%s' % i for i in _get_additional_includes() ++ if i != '/usr/include']) + + log.debug('self.include_dirs = %s', self.include_dirs) + log.debug('self.library_dirs = %s', self.library_dirs) diff --git a/meta-python/recipes-devtools/python/python-m2crypto/cross-compile-platform.patch b/meta-python/recipes-devtools/python/python3-m2crypto/cross-compile-platform.patch index 4b64f4613c..77ef7e557e 100644 --- a/meta-python/recipes-devtools/python/python-m2crypto/cross-compile-platform.patch +++ b/meta-python/recipes-devtools/python/python3-m2crypto/cross-compile-platform.patch @@ -4,11 +4,9 @@ since it pokes at the system for getting architecture values Upstream-Status: Inappropriate Signed-off-by: Khem Raj <raj.khem@gmail.com> -Index: M2Crypto-0.30.1/setup.py -=================================================================== ---- M2Crypto-0.30.1.orig/setup.py -+++ M2Crypto-0.30.1/setup.py -@@ -160,22 +160,6 @@ class _M2CryptoBuildExt(build_ext.build_ +--- a/setup.py ++++ b/setup.py +@@ -169,24 +169,6 @@ class _M2CryptoBuildExt(build_ext.build_ log.debug('self.include_dirs = %s', self.include_dirs) log.debug('self.library_dirs = %s', self.library_dirs) @@ -27,6 +25,8 @@ Index: M2Crypto-0.30.1/setup.py - self.swig_opts.append('-D%s' % arch) - if mach in ('ppc64le', 'ppc64el'): - self.swig_opts.append('-D_CALL_ELF=2') +- if mach in ('arm64_be'): +- self.swig_opts.append('-D__AARCH64EB__') - self.swig_opts.extend(['-I%s' % i for i in self.include_dirs]) diff --git a/meta-python/recipes-devtools/python/python3-m2crypto_0.30.1.bb b/meta-python/recipes-devtools/python/python3-m2crypto_0.30.1.bb deleted file mode 100644 index 4d63d4bd3a..0000000000 --- a/meta-python/recipes-devtools/python/python3-m2crypto_0.30.1.bb +++ /dev/null @@ -1,2 +0,0 @@ -inherit setuptools3 -require python-m2crypto.inc diff --git a/meta-python/recipes-devtools/python/python3-m2crypto_0.40.1.bb b/meta-python/recipes-devtools/python/python3-m2crypto_0.40.1.bb new file mode 100644 index 0000000000..1d8c22d196 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-m2crypto_0.40.1.bb @@ -0,0 +1,51 @@ +SUMMARY = "A Python crypto and SSL toolkit" +HOMEPAGE = "https://gitlab.com/m2crypto/m2crypto" + +LICENSE = "MIT" +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] = "bbfd113ec55708c05816252a4f09e4237df4f3bbfc8171cbbc33057d257bbb30" + +PYPI_PACKAGE = "M2Crypto" +inherit pypi siteinfo setuptools3 + +DEPENDS += "openssl swig-native" +RDEPENDS:${PN} += "\ + 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 ?= "-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-markdown_3.3.4.bb b/meta-python/recipes-devtools/python/python3-markdown_3.3.4.bb deleted file mode 100644 index b51e8eef17..0000000000 --- a/meta-python/recipes-devtools/python/python3-markdown_3.3.4.bb +++ /dev/null @@ -1,12 +0,0 @@ -SUMMARY = "A Python implementation of John Gruber's Markdown." -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE.md;md5=745aaad0c69c60039e638bff9ffc59ed" - -inherit pypi setuptools3 - -PYPI_PACKAGE = "Markdown" -SRC_URI[sha256sum] = "31b5b491868dcc87d6c24b7e3d19a0d730d59d3e46f4eea6430a321bed387a49" - -BBCLASSEXTEND = "native" - -RDEPENDS_${PN} += "${PYTHON_PN}-logging ${PYTHON_PN}-setuptools" diff --git a/meta-python/recipes-devtools/python/python3-markupsafe_1.%.bbappend b/meta-python/recipes-devtools/python/python3-markupsafe_1.%.bbappend deleted file mode 100644 index abfda60658..0000000000 --- a/meta-python/recipes-devtools/python/python3-markupsafe_1.%.bbappend +++ /dev/null @@ -1,12 +0,0 @@ -# Main recipe was moved to oe-core, but with ptest disabled -inherit ${@bb.utils.filter('DISTRO_FEATURES', 'ptest', d)} - -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ -" - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/tests - cp -f ${S}/tests/* ${D}${PTEST_PATH}/tests/ -} - 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.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.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 new file mode 100644 index 0000000000..aea8f62ea7 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-matplotlib/matplotlib-disable-download.patch @@ -0,0 +1,75 @@ +Disable automatic downloading of components! + +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 +@@ -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 +@@ -66,40 +66,7 @@ def get_from_cache_or_download(url, sha): + BytesIO + The file loaded into memory. + """ +- cache_dir = _get_xdg_cache_dir() +- +- if cache_dir is not None: # Try to read from cache. +- try: +- data = (cache_dir / sha).read_bytes() +- except IOError: +- pass +- else: +- if _get_hash(data) == sha: +- return BytesIO(data) +- +- # jQueryUI's website blocks direct downloads from urllib.request's +- # default User-Agent, but not (for example) wget; so I don't feel too +- # bad passing in an empty User-Agent. +- with urllib.request.urlopen( +- urllib.request.Request(url, headers={"User-Agent": ""}), +- context=_get_ssl_context()) as req: +- data = req.read() +- +- file_sha = _get_hash(data) +- if file_sha != sha: +- raise Exception( +- f"The downloaded file does not match the expected sha. {url} was " +- f"expected to have {sha} but it had {file_sha}") +- +- if cache_dir is not None: # Try to cache the downloaded file. +- try: +- cache_dir.mkdir(parents=True, exist_ok=True) +- with open(cache_dir / sha, "xb") as fout: +- fout.write(data) +- except IOError: +- pass +- +- return BytesIO(data) ++ raise IOError(f"Automatic downloading is disabled.") + + + def get_and_extract_tarball(urls, sha, dirname): diff --git a/meta-python/recipes-devtools/python/python3-matplotlib_3.4.1.bb b/meta-python/recipes-devtools/python/python3-matplotlib_3.4.1.bb deleted file mode 100644 index 21c29aa2ce..0000000000 --- a/meta-python/recipes-devtools/python/python3-matplotlib_3.4.1.bb +++ /dev/null @@ -1,50 +0,0 @@ -SUMMARY = "matplotlib: plotting with Python" -DESCRIPTION = "\ -Matplotlib is a Python 2D plotting library which produces \ -publication-quality figures in a variety of hardcopy formats \ -and interactive environments across platforms." -HOMEPAGE = "https://github.com/matplotlib/matplotlib" -SECTION = "devel/python" -LICENSE = "PSF" -LIC_FILES_CHKSUM = "\ - file://setup.py;beginline=282;endline=282;md5=20e7ab4d2b2b1395a0e4ab800181eb96 \ - file://LICENSE/LICENSE;md5=afec61498aa5f0c45936687da9a53d74 \ -" -DEPENDS = "\ - freetype \ - libpng \ - python3-numpy-native \ - python3-dateutil-native \ - python3-pytz-native \ - python3-certifi-native \ -" - -SRC_URI[sha256sum] = "84d4c4f650f356678a5d658a43ca21a41fca13f9b8b00169c0b76e6a6a948908" - -inherit pypi setuptools3 pkgconfig - -# LTO with clang needs lld -LDFLAGS_append_toolchain-clang = " -fuse-ld=lld" -LDFLAGS_remove_toolchain-clang_mips = "-fuse-ld=lld" - -RDEPENDS_${PN} = "\ - freetype \ - libpng \ - python3-numpy \ - python3-pyparsing \ - python3-cycler \ - python3-dateutil \ - python3-kiwisolver \ - python3-pytz \ -" - -ENABLELTO_toolchain-clang_riscv64 = "echo enable_lto = False >> ${S}/setup.cfg" -ENABLELTO_toolchain-clang_riscv32 = "echo enable_lto = False >> ${S}/setup.cfg" -ENABLELTO_toolchain-clang_mips = "echo enable_lto = False >> ${S}/setup.cfg" -do_compile_prepend() { - echo [libs] > ${S}/setup.cfg - echo system_freetype = true >> ${S}/setup.cfg - ${ENABLELTO} -} - -BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-matplotlib_3.7.2.bb b/meta-python/recipes-devtools/python/python3-matplotlib_3.7.2.bb new file mode 100644 index 0000000000..72c369100a --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-matplotlib_3.7.2.bb @@ -0,0 +1,70 @@ +SUMMARY = "matplotlib: plotting with Python" +DESCRIPTION = "\ +Matplotlib is a Python 2D plotting library which produces \ +publication-quality figures in a variety of hardcopy formats \ +and interactive environments across platforms." +HOMEPAGE = "https://github.com/matplotlib/matplotlib" +SECTION = "devel/python" +LICENSE = "PSF-2.0" +LIC_FILES_CHKSUM = "\ + file://setup.py;beginline=293;endline=293;md5=20e7ab4d2b2b1395a0e4ab800181eb96 \ + file://LICENSE/LICENSE;md5=afec61498aa5f0c45936687da9a53d74 \ +" + +DEPENDS = "\ + freetype \ + libpng \ + python3-numpy-native \ + python3-pip-native \ + python3-dateutil-native \ + python3-pytz-native \ + python3-certifi-native \ + python3-setuptools-scm-native \ + python3-pybind11-native \ +" +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 \ +" + +# 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" +SRC_URI[freetype.sha256sum] = "0a3c7dfbda6da1e8fce29232e8e96d987ababbbf71ebc8c75659e4132c367014" + +# This python module requires a full copy of 'qhull-2020' +SRC_URI += "http://www.qhull.org/download/qhull-2020-src-8.0.2.tgz;name=qhull;subdir=matplotlib-${PV}/build" +SRC_URI[qhull.sha256sum] = "b5c2d7eb833278881b952c8a52d20179eab87766b00b865000469a45c1838b7e" + +# 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 \ + python3-numpy \ + python3-pyparsing \ + python3-cycler \ + python3-dateutil \ + python3-kiwisolver \ + python3-pytz \ + python3-pillow \ + python3-packaging \ +" + +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 + ${ENABLELTO} +} + +BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-mccabe_0.6.1.bb b/meta-python/recipes-devtools/python/python3-mccabe_0.6.1.bb deleted file mode 100644 index b366f04309..0000000000 --- a/meta-python/recipes-devtools/python/python3-mccabe_0.6.1.bb +++ /dev/null @@ -1,17 +0,0 @@ -DESCRIPTION = "McCabe checker, plugin for flake8" -HOMEPAGE = "https://github.com/PyCQA/mccabe" -SECTION = "devel/python" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=a489dc62bacbdad3335c0f160a974f0f" - -SRC_URI[md5sum] = "723df2f7b1737b8887475bac4c763e1e" -SRC_URI[sha256sum] = "dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" - -inherit pypi setuptools3 - -DEPENDS += "${PYTHON_PN}-pytest-runner-native" - -RDEPENDS_${PN} += "${PYTHON_PN}-prettytable \ - ${PYTHON_PN}-cmd2 \ - ${PYTHON_PN}-pyparsing \ - " 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 new file mode 100644 index 0000000000..5304917842 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-mccabe_0.7.0.bb @@ -0,0 +1,13 @@ +DESCRIPTION = "McCabe checker, plugin for flake8" +HOMEPAGE = "https://github.com/PyCQA/mccabe" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=a489dc62bacbdad3335c0f160a974f0f" + +SRC_URI[sha256sum] = "348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325" + +inherit pypi setuptools3 + +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 b34f25b93d..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 080c41e38b..aacc32a6d6 100644 --- a/meta-python/recipes-devtools/python/python3-monotonic_1.6.bb +++ b/meta-python/recipes-devtools/python/python3-monotonic_1.6.bb @@ -6,7 +6,7 @@ LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=d2794c0df5b907fdace235a619d80314" SRCREV = "80681f6604e136e513550342f977edb98f5fc5ad" -SRC_URI = "git://github.com/atdt/monotonic.git" +SRC_URI = "git://github.com/atdt/monotonic.git;branch=master;protocol=https" S = "${WORKDIR}/git" 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 51a7c05847..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 @@ -3,14 +3,17 @@ SUMMARY = "Python library for arbitrary-precision floating-point arithmetic" HOMEPAGE = "https://pypi.org/project/mpmath/" -LICENSE = "BSD" -LIC_FILES_CHKSUM = "file://LICENSE;md5=71970bd3749eebe1bfef9f1efff5b37a" +LICENSE = "BSD-3-Clause" +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.2.bb b/meta-python/recipes-devtools/python/python3-msgpack_1.0.7.bb index 989a7ae3fd..5180301f7b 100644 --- a/meta-python/recipes-devtools/python/python3-msgpack_1.0.2.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] = "fae04496f5bc150eefad4e9571d1a76c55d021325dcd484ce45065ebbdd00984" +SRC_URI[sha256sum] = "572efc93db7a4d27e404501975ca6d2d9775705c2d922390d878fcf768d92c87" -RDEPENDS_${PN}_class-target += "\ - ${PYTHON_PN}-io \ +RDEPENDS:${PN}:class-target += "\ + python3-io \ " BBCLASSEXTEND = "native nativesdk" @@ -17,8 +16,9 @@ SRC_URI += " \ file://run-ptest \ " -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-msk_0.3.16.bb b/meta-python/recipes-devtools/python/python3-msk_0.3.16.bb deleted file mode 100644 index a3206f79bc..0000000000 --- a/meta-python/recipes-devtools/python/python3-msk_0.3.16.bb +++ /dev/null @@ -1,11 +0,0 @@ -SUMMARY = "A tool to help with creating, uploading, and upgrading Mycroft skills on the skills repo." -HOMEPAGE = "https://github.com/MycroftAI/mycroft-skills-kit" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://README.md;md5=2f90e43663eddf1c33087419fbb35e28" - -SRC_URI[md5sum] = "8a4fc92a074544f81f482da2c21ef989" -SRC_URI[sha256sum] = "c6a717fc068f7c69ddc8cb21dbeeda7cfa97a4e9f41690459c9fbec68b16ee87" - -inherit pypi setuptools3 - -RDEPENDS_${PN} += "python3-git" diff --git a/meta-python/recipes-devtools/python/python3-msk_0.4.0.bb b/meta-python/recipes-devtools/python/python3-msk_0.4.0.bb new file mode 100644 index 0000000000..8fa2c62cc4 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-msk_0.4.0.bb @@ -0,0 +1,10 @@ +SUMMARY = "A tool to help with creating, uploading, and upgrading Mycroft skills on the skills repo." +HOMEPAGE = "https://github.com/MycroftAI/mycroft-skills-kit" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://README.md;md5=f518abfcfc3935b1f0ec8f2332cb30d3" + +SRC_URI[sha256sum] = "f698f193112a8628e776e67b89a95c3f78095857c045dd9cde4cf915a5fbdd80" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-git" 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 f5e3f59cd5..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,13 +8,21 @@ 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() { +do_install:append() { # Stop this from being installed rm -rf ${D}/usr/share } 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_5.1.0.bb b/meta-python/recipes-devtools/python/python3-multidict_6.0.5.bb index b960affac4..b12e180d02 100644 --- a/meta-python/recipes-devtools/python/python3-multidict_5.1.0.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=e74c98abe0de8f798ca609137f9cef4a" - -SRC_URI[sha256sum] = "25b4e5f22d3a37ddf3effc0710ba692cfc792c2b9edfb9c05aefe823256e84d5" +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 \ +RDEPENDS:${PN}-ptest += " \ + 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.812.bb b/meta-python/recipes-devtools/python/python3-mypy_0.812.bb deleted file mode 100644 index 8faab60b97..0000000000 --- a/meta-python/recipes-devtools/python/python3-mypy_0.812.bb +++ /dev/null @@ -1,18 +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=6afb7c151c4dedb5c3dc292cc120fadc" - -RDEPENDS_${PN} = " \ - ${PYTHON_PN}-mypy-extensions \ - ${PYTHON_PN}-typed-ast \ - ${PYTHON_PN}-typing-extensions \ -" - -PYPI_PACKAGE = "mypy" - -inherit pypi setuptools3 - -SRC_URI[sha256sum] = "cd07039aa5df222037005b08fbbfd69b3ab0b0bd7a07d7906de75ae52c4e3119" - -BBCLASSEXTEND = "native" 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_7.1.1.bb b/meta-python/recipes-devtools/python/python3-natsort_7.1.1.bb deleted file mode 100644 index 89df3dc381..0000000000 --- a/meta-python/recipes-devtools/python/python3-natsort_7.1.1.bb +++ /dev/null @@ -1,11 +0,0 @@ -SUMMARY = "Simple yet flexible natural sorting in Python." -SECTION = "devel/python" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=6a96e5ad780a0eea866ecccec4463517" - -PYPI_PACKAGE = "natsort" -SRC_URI[sha256sum] = "00c603a42365830c4722a2eb7663a25919551217ec09a243d3399fa8dd4ac403" - -inherit pypi setuptools3 - -RDEPENDS_${PN} = "python3-fastnumbers python3-icu" diff --git a/meta-python/recipes-devtools/python/python3-natsort_8.4.0.bb b/meta-python/recipes-devtools/python/python3-natsort_8.4.0.bb new file mode 100644 index 0000000000..206e322fbd --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-natsort_8.4.0.bb @@ -0,0 +1,11 @@ +SUMMARY = "Simple yet flexible natural sorting in Python." +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=d32431d1b650010945da4e078011c8fa" + +PYPI_PACKAGE = "natsort" +SRC_URI[sha256sum] = "45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581" + +inherit pypi setuptools3 + +RDEPENDS:${PN} = "python3-fastnumbers python3-icu" diff --git a/meta-python/recipes-devtools/python/python3-ndg-httpsclient_0.5.1.bb b/meta-python/recipes-devtools/python/python3-ndg-httpsclient_0.5.1.bb deleted file mode 100644 index 23e1868c22..0000000000 --- a/meta-python/recipes-devtools/python/python3-ndg-httpsclient_0.5.1.bb +++ /dev/null @@ -1,31 +0,0 @@ -DESCRIPTION = "Provides enhanced HTTPS support for httplib and urllib2 using PyOpenSSL" -HOMEPAGE = "https://github.com/cedadev/ndg_httpsclient/" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://MANIFEST.in;md5=ce22c0cd986d2de3f7073cd6b5523ae0" - -SRC_URI[md5sum] = "b0fc8ea38f87d2c1ab1ed79a95c078f9" -SRC_URI[sha256sum] = "d72faed0376ab039736c2ba12e30695e2788c4aa569c9c3e3d72131de2592210" - -inherit pypi setuptools3 update-alternatives - -PYPI_PACKAGE = "ndg_httpsclient" - -DEPENDS += " \ - ${PYTHON_PN}-pyopenssl \ - ${PYTHON_PN}-pyasn1 \ -" - -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-pyopenssl \ - ${PYTHON_PN}-pyasn1 \ -" - -BBCLASSEXTEND = "native nativesdk" - -UPSTREAM_CHECK_REGEX = "" - -ALTERNATIVE_${PN} = "ndg_httpclient" -ALTERNATIVE_LINK_NAME[ndg_httpclient] = "${bindir}/ndg_httpclient" -ALTERNATIVE_PRIORITY = "30" 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 a120b24f16..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.10.9.bb b/meta-python/recipes-devtools/python/python3-netifaces_0.11.0.bb index 7edb7e7fb7..f211c69543 100644 --- a/meta-python/recipes-devtools/python/python3-netifaces_0.10.9.bb +++ b/meta-python/recipes-devtools/python/python3-netifaces_0.11.0.bb @@ -4,7 +4,8 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=a53cbc7cb75660694e138ba973c148df" -SRC_URI[md5sum] = "de92cc322b4f56047c073f802ad77860" -SRC_URI[sha256sum] = "2dee9ffdd16292878336a58d04a20f0ffe95555465fee7c9bd23b3490ef2abf3" - 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.5.1.bb b/meta-python/recipes-devtools/python/python3-networkx_2.5.1.bb deleted file mode 100644 index 0b52cfd7e5..0000000000 --- a/meta-python/recipes-devtools/python/python3-networkx_2.5.1.bb +++ /dev/null @@ -1,12 +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=a24ea029adac8935699bf69b2e38c728" - -SRC_URI[sha256sum] = "109cd585cac41297f71103c3c42ac6ef7379f29788eb54cb751be5a663bb235a" - -inherit pypi setuptools3 - -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-decorator \ - " 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.0.bb b/meta-python/recipes-devtools/python/python3-nmap_1.6.0.bb index e6f093360f..5fe9ab4e39 100644 --- a/meta-python/recipes-devtools/python/python3-nmap_1.5.0.bb +++ b/meta-python/recipes-devtools/python/python3-nmap_1.6.0.bb @@ -4,16 +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[md5sum] = "3a43dd0f56ade8c76c7c6f994604212d" -SRC_URI[sha256sum] = "b52744e0c9944c567733b8deb60d6363e17233ee40466edfb1b09a5780576f9a" +SRC_URI[sha256sum] = "892b5091cde429fabfb8ba63382b2db8fd795193ba147558d0a7d5534c956255" inherit pypi setuptools3 -RDEPENDS_${PN} += "nmap \ - ${PYTHON_PN}-requests \ - ${PYTHON_PN}-simplejson \ +RDEPENDS:${PN} += "nmap \ + python3-requests \ + python3-simplejson \ " diff --git a/meta-python/recipes-devtools/python/python3-nocasedict_1.0.2.bb b/meta-python/recipes-devtools/python/python3-nocasedict_1.0.2.bb deleted file mode 100644 index 952286d37c..0000000000 --- a/meta-python/recipes-devtools/python/python3-nocasedict_1.0.2.bb +++ /dev/null @@ -1,8 +0,0 @@ -SUMMARY = "A case-insensitive ordered dictionary for Python" -HOMEPAGE = "https://github.com/pywbem/nocasedict" -LICENSE = "LGPLv2.1" -LIC_FILES_CHKSUM = "file://LICENSE;md5=a87a7059d580c45495c1218f53e3610d" - -SRC_URI[sha256sum] = "86e2dae49e34de7c31b65b486c8f9aa58b66dc2e8ee9b34c390c6c58885c85a0" - -inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-nocasedict_2.0.1.bb b/meta-python/recipes-devtools/python/python3-nocasedict_2.0.1.bb new file mode 100644 index 0000000000..5a29858177 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-nocasedict_2.0.1.bb @@ -0,0 +1,12 @@ +SUMMARY = "A case-insensitive ordered dictionary for Python" +HOMEPAGE = "https://github.com/pywbem/nocasedict" +LICENSE = "LGPL-2.1-only" +LIC_FILES_CHKSUM = "file://LICENSE;md5=1803fa9c2c3ce8cb06b4861d75310742" + +SRC_URI[sha256sum] = "960cb699f1209da80ac39e3ab50aa7342fe8ca9f70606c23447a510550435e50" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-six \ +" diff --git a/meta-python/recipes-devtools/python/python3-nocaselist_1.0.4.bb b/meta-python/recipes-devtools/python/python3-nocaselist_1.0.4.bb deleted file mode 100644 index 60c79c22a8..0000000000 --- a/meta-python/recipes-devtools/python/python3-nocaselist_1.0.4.bb +++ /dev/null @@ -1,8 +0,0 @@ -SUMMARY = "A case-insensitive list for Python" -HOMEPAGE = "https://nocaselist.readthedocs.io/en/latest/" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=d229da563da18fe5d58cd95a6467d584" - -SRC_URI[sha256sum] = "73a9c0659e7135c66e46a6ab06e2cb637ce9248d73c690ebd31afb72a4e03ac0" - -inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-nocaselist_2.0.0.bb b/meta-python/recipes-devtools/python/python3-nocaselist_2.0.0.bb new file mode 100644 index 0000000000..2ad42247d9 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-nocaselist_2.0.0.bb @@ -0,0 +1,12 @@ +SUMMARY = "A case-insensitive list for Python" +HOMEPAGE = "https://nocaselist.readthedocs.io/en/latest/" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327" + +SRC_URI[sha256sum] = "456aa000c6777c5d21b029c52e532f94328d4fb4f15ad2a4dd3dd62db30b3892" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-six \ +" diff --git a/meta-python/recipes-devtools/python/python3-ntplib_0.3.4.bb b/meta-python/recipes-devtools/python/python3-ntplib_0.3.4.bb deleted file mode 100644 index ae4c10f381..0000000000 --- a/meta-python/recipes-devtools/python/python3-ntplib_0.3.4.bb +++ /dev/null @@ -1,13 +0,0 @@ -DESCRIPTION = "This module offers a simple interface to query NTP servers from Python." -SECTION = "devel/python" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://ntplib.py;beginline=1;endline=23;md5=afa07338a9595257e94c205c3e72224d" - -SRC_URI = "git://github.com/cf-natali/ntplib.git" -SRCREV ?= "aea7925c26152024ca8cf207e77f403f8127727a" - -S = "${WORKDIR}/git" - -inherit setuptools3 python3native - -RDEPENDS_${PN} += "${PYTHON_PN}-datetime ${PYTHON_PN}-io" 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 new file mode 100644 index 0000000000..d0a8d7a823 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-ntplib_0.4.0.bb @@ -0,0 +1,11 @@ +DESCRIPTION = "This module offers a simple interface to query NTP servers from Python." +HOMEPAGE = "https://github.com/cf-natali/ntplib" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=40707636fe237d725e2bd32cd949b7fe" + +SRC_URI[sha256sum] = "899d8fb5f8c2555213aea95efca02934c7343df6ace9d7628a5176b176906267" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-datetime python3-io" diff --git a/meta-python/recipes-devtools/python/python3-oauthlib_3.1.0.bb b/meta-python/recipes-devtools/python/python3-oauthlib_3.1.0.bb deleted file mode 100644 index fe27e8e505..0000000000 --- a/meta-python/recipes-devtools/python/python3-oauthlib_3.1.0.bb +++ /dev/null @@ -1,23 +0,0 @@ -SUMMARY = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" -HOMEPAGE = "https://github.com/idan/oauthlib" - -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=abd2675e944a2011aed7e505290ba482" - -SRC_URI[md5sum] = "43cb2b5bac983712ee55076b61181cc2" -SRC_URI[sha256sum] = "bee41cc35fcca6e988463cacc3bcb8a96224f470ca547e697b604cc697b2f889" - -inherit pypi setuptools3 - -# 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 signedtoken signals rsa" -PACKAGECONFIG[test] = ",,,${PYTHON_PN}-blinker ${PYTHON_PN}-cryptography ${PYTHON_PN}-nose ${PYTHON_PN}-pyjwt" -PACKAGECONFIG[signedtoken] = ",,,${PYTHON_PN}-cryptography ${PYTHON_PN}-pyjwt" -PACKAGECONFIG[signals] = ",,,${PYTHON_PN}-blinker" -PACKAGECONFIG[rsa] = ",,,${PYTHON_PN}-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" diff --git a/meta-python/recipes-devtools/python/python3-oauthlib_3.2.2.bb b/meta-python/recipes-devtools/python/python3-oauthlib_3.2.2.bb new file mode 100644 index 0000000000..833fdbcc58 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-oauthlib_3.2.2.bb @@ -0,0 +1,22 @@ +SUMMARY = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" +HOMEPAGE = "https://github.com/idan/oauthlib" + +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=abd2675e944a2011aed7e505290ba482" + +SRC_URI[sha256sum] = "9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918" + +inherit pypi setuptools3 + +# 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 signedtoken signals rsa" +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} += "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 8f17068a48..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 = "GPLv2" -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.7.bb b/meta-python/recipes-devtools/python/python3-openpyxl_3.1.2.bb index b326321198..4a3254cc53 100644 --- a/meta-python/recipes-devtools/python/python3-openpyxl_3.0.7.bb +++ b/meta-python/recipes-devtools/python/python3-openpyxl_3.1.2.bb @@ -9,6 +9,15 @@ LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=8227180126797a0148 inherit pypi setuptools3 -SRC_URI[sha256sum] = "6456a3b472e1ef0facb1129f3c6ef00713cebf62e736cd7a75bcc3247432f251" +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" +RDEPENDS:${PN} += "\ + 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 f7b9d0907c..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.py +pytest --automake test_ordered_set.py diff --git a/meta-python/recipes-devtools/python/python3-ordered-set_4.0.2.bb b/meta-python/recipes-devtools/python/python3-ordered-set_4.0.2.bb deleted file mode 100644 index 0e678b54d7..0000000000 --- a/meta-python/recipes-devtools/python/python3-ordered-set_4.0.2.bb +++ /dev/null @@ -1,23 +0,0 @@ -SUMMARY = "A MutableSet that remembers its order, so that every entry has an index." -HOMEPAGE = "http://github.com/LuminosoInsight/ordered-set" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://MIT-LICENSE;md5=2b36be0d99854aa2ae292a800a7c1d4e" - -SRC_URI[md5sum] = "5d88f3870c32d4868b28c8fe833f7e74" -SRC_URI[sha256sum] = "ba93b2df055bca202116ec44b9bead3df33ea63a7d5827ff8e16738b97f33a95" - -inherit pypi setuptools3 ptest - -DEPENDS += "python3-pytest-runner-native" - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ -" - -do_install_ptest() { - cp -f ${S}/test.py ${D}${PTEST_PATH}/ -} 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 new file mode 100644 index 0000000000..64637b858d --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-ordered-set_4.1.0.bb @@ -0,0 +1,23 @@ +SUMMARY = "A MutableSet that remembers its order, so that every entry has an index." +HOMEPAGE = "http://github.com/LuminosoInsight/ordered-set" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://MIT-LICENSE;md5=3bf5e1ad64c0d99032c3143361fa234e" + +SRC_URI[sha256sum] = "694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8" + +inherit pypi python_flit_core ptest + +DEPENDS += "python3-pytest-runner-native" + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + cp -f ${S}/test/test_ordered_set.py ${D}${PTEST_PATH}/ +} 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.5.1.bb b/meta-python/recipes-devtools/python/python3-paho-mqtt_1.5.1.bb deleted file mode 100644 index d93bc884ee..0000000000 --- a/meta-python/recipes-devtools/python/python3-paho-mqtt_1.5.1.bb +++ /dev/null @@ -1,24 +0,0 @@ -SUMMARY = "MQTT version 3.1/3.1.1 client library" -LICENSE = "EPL-1.0 | EDL-1.0" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=eb48c6ee2cb9f5b8b9fe75e6f817bdfc \ - file://epl-v10;md5=8d383c379e91d20ba18a52c3e7d3a979 \ - file://edl-v10;md5=c09f121939f063aeb5235972be8c722c \ -" -SRCNAME = "paho-mqtt" - -inherit pypi setuptools3 - -SRC_URI[md5sum] = "32f93c0ed92c7439f7a715ed258fd35d" -SRC_URI[sha256sum] = "9feb068e822be7b3a116324e01fb6028eb1d66412bf98595ae72698965cb1cae" - -DEPENDS += "${PYTHON_PN}-pytest-runner-native" - -RDEPENDS_${PN} = "\ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-math \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-threading \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-paho-mqtt_2.0.0.bb b/meta-python/recipes-devtools/python/python3-paho-mqtt_2.0.0.bb new file mode 100644 index 0000000000..e4cf77a134 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-paho-mqtt_2.0.0.bb @@ -0,0 +1,37 @@ +SUMMARY = "MQTT version 3.1/3.1.1 client library" +LICENSE = "EPL-1.0 | EDL-1.0" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=8e5f264c6988aec56808a3a11e77b913 \ + file://edl-v10;md5=c09f121939f063aeb5235972be8c722c \ +" +SRCNAME = "paho-mqtt" + +inherit pypi python_hatchling python_setuptools_build_meta + +SRC_URI[sha256sum] = "13b205f29251e4f2c66a6c923c31fc4fd780561e03b2d775cff8e4f2915cf947" + +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 + cp --preserve=mode,timestamps -R ${S}/examples/* ${D}${datadir}/${BPN}/examples +} + +PACKAGES =+ "${PN}-examples" + +RDEPENDS:${PN}-examples += "${PN} python3-core" + +FILES:${PN}-examples = "${datadir}/${BPN}/examples" + +RDEPENDS:${PN} = "\ + 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 1930d866ee..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 @@ -7,6 +7,14 @@ SRC_URI[sha256sum] = "c033a073bb818ca336ae1fccba2655bd60dfe77744f85d4517abd3160d inherit pypi setuptools3 -do_install_append() { - rm -rf ${D}/usr/share +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.2.3.bb b/meta-python/recipes-devtools/python/python3-pandas_1.2.3.bb deleted file mode 100644 index 8c36c21bb9..0000000000 --- a/meta-python/recipes-devtools/python/python3-pandas_1.2.3.bb +++ /dev/null @@ -1,24 +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=c2a8f987b2ce77c368c6b3e1b5b10774" - -SRC_URI[sha256sum] = "df6f10b85aef7a5bb25259ad651ad1cc1d6bb09000595cab47e718cbac250b1d" - -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}-pytz \ -" 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 40876d352e..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 @@ -1,6 +1,6 @@ SUMMARY = "Execute commands and copy files over SSH to multiple machines at once." HOMEPAGE = "https://github.com/krig/parallax/" -LICENSE = "BSD" +LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://COPYING;md5=52c67ffa6102f288a0347f8c5802fd18" SRC_URI[md5sum] = "e312397b083426af84db7076dc2a28d7" @@ -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.7.2.bb b/meta-python/recipes-devtools/python/python3-paramiko_2.7.2.bb deleted file mode 100644 index eb7ce62b83..0000000000 --- a/meta-python/recipes-devtools/python/python3-paramiko_2.7.2.bb +++ /dev/null @@ -1,20 +0,0 @@ -DESCRIPTION = "The leading native Python SSHv2 protocol library." -HOMEPAGE = "https://github.com/paramiko/paramiko/" -LICENSE = "LGPL-2.1" -LIC_FILES_CHKSUM = "file://LICENSE;md5=fd0120fc2e9f841c73ac707a30389af5" - -SRC_URI[md5sum] = "44136d79da4cd7619e368018ad022619" -SRC_URI[sha256sum] = "7f36f4ba2c0d81d219f4595e35f70d56cc94f9ac40a6acdf51d6ca210ce65035" - -PYPI_PACKAGE = "paramiko" - -inherit pypi setuptools3 - -CLEANBROKEN = "1" - -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-bcrypt \ - ${PYTHON_PN}-cryptography \ - ${PYTHON_PN}-pynacl \ - ${PYTHON_PN}-unixadmin \ -" diff --git a/meta-python/recipes-devtools/python/python3-paramiko_3.4.0.bb b/meta-python/recipes-devtools/python/python3-paramiko_3.4.0.bb new file mode 100644 index 0000000000..0d32d361cf --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-paramiko_3.4.0.bb @@ -0,0 +1,20 @@ +DESCRIPTION = "The leading native Python SSHv2 protocol library." +HOMEPAGE = "https://github.com/paramiko/paramiko/" +LICENSE = "LGPL-2.1-only" +LIC_FILES_CHKSUM = "file://LICENSE;md5=fd0120fc2e9f841c73ac707a30389af5" + +SRC_URI[sha256sum] = "aac08f26a31dc4dffd92821527d1682d99d52f9ef6851968114a8728f3c274d3" + +PYPI_PACKAGE = "paramiko" + +inherit pypi setuptools3 + +CLEANBROKEN = "1" + +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.6.2.bb index f61c480bdd..a7d8cd86ce 100644 --- a/meta-python/recipes-devtools/python/python3-parse-type_0.5.2.bb +++ b/meta-python/recipes-devtools/python/python3-parse-type_0.6.2.bb @@ -1,22 +1,22 @@ 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" +LIC_FILES_CHKSUM = "file://LICENSE;md5=2e469278ace89c246d52505acc39c3da" -SRC_URI[md5sum] = "b954062f14ab723a91fe1e2be15e859d" -SRC_URI[sha256sum] = "7f690b18d35048c15438d6d0571f9045cffbec5907e0b1ccf006f889e3a38c0b" +SRC_URI[sha256sum] = "79b1f2497060d0928bc46016793f1fca1057c4aacdf15ef876aa48d75a73a355" PYPI_PACKAGE = "parse_type" inherit pypi ptest setuptools3 -RDEPENDS_${PN} += "${PYTHON_PN}-parse ${PYTHON_PN}-six" +RDEPENDS:${PN} += "python3-parse" SRC_URI += " \ file://run-ptest \ " -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { 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 b5e0769544..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.10.0.bb b/meta-python/recipes-devtools/python/python3-parsimonious_0.10.0.bb new file mode 100644 index 0000000000..c2352224ff --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-parsimonious_0.10.0.bb @@ -0,0 +1,11 @@ +SUMMARY = "Parsimonious aims to be the fastest arbitrary-lookahead parser written in pure Python." +HOMEPAGE = "https://github.com/erikrose/parsimonious" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3396ea30f9d21389d7857719816f83b5" + +SRC_URI[sha256sum] = "8281600da180ec8ae35427a4ab4f7b82bfec1e3d1e52f80cb60ea82b9512501c" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-regex" diff --git a/meta-python/recipes-devtools/python/python3-parso_0.8.2.bb b/meta-python/recipes-devtools/python/python3-parso_0.8.4.bb index afcfabb95a..176bf6f277 100644 --- a/meta-python/recipes-devtools/python/python3-parso_0.8.2.bb +++ b/meta-python/recipes-devtools/python/python3-parso_0.8.4.bb @@ -1,11 +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] = "12b83492c6239ce32ff5eed6d3639d6a536170723c6f3f1506869f1ace413398" +SRC_URI[sha256sum] = "eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d" inherit setuptools3 pypi + +RDEPENDS:${PN} = " \ + 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 fd26f3a764..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 @@ -14,8 +14,8 @@ SRC_URI[sha256sum] = "defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c415 inherit pypi setuptools3 -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-crypt \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-netclient \ +RDEPENDS:${PN} += "\ + 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 47508e2223..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}" @@ -18,4 +18,4 @@ PACKAGECONFIG[paste] = ",,,python3-paste" PACKAGECONFIG[docs] = ",,,python3-sphinx python3-pylons-sphinx-themes" DEPENDS= "python3 python3-setuptools-scm-native python3-pytest-runner-native" -RDEPENDS_${PN} += "python3-core python3-misc python3-netclient python3-pkgutil python3-setuptools python3-threading python3-core" +RDEPENDS:${PN} += "python3-core python3-misc python3-netclient python3-pkgutil python3-setuptools python3-threading python3-core" 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-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 e8587c8325..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 9e3cbb43e1..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 99e1f199fa..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 \ +RDEPENDS:${PN} = "\ + 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 7a307a6ddc..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.2.0.bb b/meta-python/recipes-devtools/python/python3-pika_1.2.0.bb deleted file mode 100644 index 9f275b3011..0000000000 --- a/meta-python/recipes-devtools/python/python3-pika_1.2.0.bb +++ /dev/null @@ -1,21 +0,0 @@ -SUMMARY = "Pika is a RabbitMQ (AMQP 0-9-1) client library for Python." -DESCRIPTION = " \ -Pika is a pure-Python implementation of the AMQP 0-9-1 protocol \ -including RabbitMQ’s extensions. \ -" -SECTION = "devel/python" -HOMEPAGE = "https://pika.readthedocs.io" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=278bdfee5b51616941c1f6b2f1cfcb99" - -SRC_URI[sha256sum] = "f023d6ac581086b124190cb3dc81dd581a149d216fa4540ac34f9be1e3970b89" - -inherit pypi setuptools3 - -PYPI_PACKAGE = "pika" - -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-tornado \ - ${PYTHON_PN}-twisted \ -" diff --git a/meta-python/recipes-devtools/python/python3-pika_1.3.2.bb b/meta-python/recipes-devtools/python/python3-pika_1.3.2.bb new file mode 100644 index 0000000000..865accc595 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pika_1.3.2.bb @@ -0,0 +1,26 @@ +SUMMARY = "Pika is a RabbitMQ (AMQP 0-9-1) client library for Python." +DESCRIPTION = " \ +Pika is a pure-Python implementation of the AMQP 0-9-1 protocol \ +including RabbitMQ's extensions. \ +" +SECTION = "devel/python" +HOMEPAGE = "https://pika.readthedocs.io" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=678ec81495ba50edf81e84e4f1aa69f3" + +SRC_URI[sha256sum] = "b2a327ddddf8570b4965b3576ac77091b850262d34ce8c1d8cb4e4146aa4145f" + +inherit pypi python_setuptools_build_meta + +PYPI_PACKAGE = "pika" + +DEPENDS += " \ + python3-setuptools-scm-native \ + python3-toml-native \ +" + +RDEPENDS:${PN} += " \ + 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_8.2.0.bb b/meta-python/recipes-devtools/python/python3-pillow_8.2.0.bb deleted file mode 100644 index 3241230d13..0000000000 --- a/meta-python/recipes-devtools/python/python3-pillow_8.2.0.bb +++ /dev/null @@ -1,37 +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=0337b116233da4616ae9fdb130bf6f1a" - -SRC_URI = "git://github.com/python-pillow/Pillow.git;branch=8.2.x \ - file://0001-support-cross-compiling.patch \ - file://0001-explicitly-set-compile-options.patch \ -" -SRCREV ?= "e0e353c0ef7516979a9aedce3792596649ce4433" - -inherit setuptools3 - -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" diff --git a/meta-python/recipes-devtools/python/python3-pint_0.17.bb b/meta-python/recipes-devtools/python/python3-pint_0.17.bb deleted file mode 100644 index 9a474901e9..0000000000 --- a/meta-python/recipes-devtools/python/python3-pint_0.17.bb +++ /dev/null @@ -1,35 +0,0 @@ -SUMMARY = "Physical quantities module" -DESCRIPTION = "Physical quantities Python module" -HOMEPAGE = "https://github.com/hgrecco/pint" -SECTION = "devel/python" - -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=bccf824202692270a1e0829a62e3f47b" - -PYPI_PACKAGE := "Pint" - -inherit pypi ptest setuptools3 - -SRC_URI[sha256sum] = "f4d0caa713239e6847a7c6eefe2427358566451fe56497d533f21fb590a3f313" - -DEPENDS += "python3-setuptools-scm-native" - -BBCLASSEXTEND = "native nativesdk" - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-setuptools \ - ${PYTHON_PN}-packaging \ -" - -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ -" - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/testsuite - cp -rf ${S}/pint/testsuite/* ${D}${PTEST_PATH}/testsuite/ -} diff --git a/meta-python/recipes-devtools/python/python3-pint_0.23.bb b/meta-python/recipes-devtools/python/python3-pint_0.23.bb new file mode 100644 index 0000000000..370cd7017b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pint_0.23.bb @@ -0,0 +1,41 @@ +SUMMARY = "Physical quantities module" +DESCRIPTION = "Physical quantities Python module" +HOMEPAGE = "https://github.com/hgrecco/pint" +SECTION = "devel/python" + +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=bccf824202692270a1e0829a62e3f47b" + +PYPI_PACKAGE := "Pint" + +inherit ptest python_setuptools_build_meta + +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" + +BBCLASSEXTEND = "native nativesdk" + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN} += " \ + python3-setuptools \ + python3-packaging \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-appdirs \ + python3-flexcache \ + python3-flexparser \ + python3-pytest \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/testsuite + cp -rf ${S}/pint/* ${D}${PTEST_PATH}/ +} diff --git a/meta-python/recipes-devtools/python/python3-pkcs11_0.7.0.bb b/meta-python/recipes-devtools/python/python3-pkcs11_0.7.0.bb new file mode 100644 index 0000000000..816b728dc0 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pkcs11_0.7.0.bb @@ -0,0 +1,25 @@ +SUMMARY = "PKCS#11 (Cryptoki) support for Python" +DESCRIPTION = "A high level, “more Pythonic” interface to the PKCS#11 (Cryptoki) standard to support HSM and Smartcard devices in Python." +HOMEPAGE = "https://pypi.org/project/python-pkcs11/" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://README.rst;beginline=337;endline=358;md5=f68bda54505b4002e6ec86e08125ef79" + +SRC_URI[sha256sum] = "9737e0c24cabb8bc9d48bf8c57c3df2a70f8cdd96b70c50290803286f9e46bf7" + +PYPI_PACKAGE = "python-pkcs11" + +inherit pypi setuptools3 + +BBCLASSEXTEND = "native" + +DEPENDS += " \ + python3-cython-native \ + python3-setuptools-scm-native \ + python3 \ +" + +RDEPENDS:${PN} += " \ + python3-asn1crypto \ + python3-cached-property \ +" diff --git a/meta-python/recipes-devtools/python/python3-pkgconfig_1.5.2.bb b/meta-python/recipes-devtools/python/python3-pkgconfig_1.5.5.bb index 7a98ef2884..9ff4d1318d 100644 --- a/meta-python/recipes-devtools/python/python3-pkgconfig_1.5.2.bb +++ b/meta-python/recipes-devtools/python/python3-pkgconfig_1.5.5.bb @@ -4,13 +4,13 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=faa7f82be8f220bff6156be4790344fc" -SRC_URI[sha256sum] = "38d612488f0633755a2e7a8acab6c01d20d63dbc31af75e2a9ac98a6f638ca94" +SRC_URI[sha256sum] = "deb4163ef11f75b520d822d9505c1f462761b4309b1bb713d08689759ea8b899" -RDEPENDS_${PN} = "pkgconfig \ - ${PYTHON_PN}-shell \ +RDEPENDS:${PN} = "pkgconfig \ + python3-shell \ " -inherit pypi setuptools3 +inherit pypi python_poetry_core BBCLASSEXTEND = "native" 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-ply_3.11.bb b/meta-python/recipes-devtools/python/python3-ply_3.11.bb deleted file mode 100644 index 3aa010fac3..0000000000 --- a/meta-python/recipes-devtools/python/python3-ply_3.11.bb +++ /dev/null @@ -1,18 +0,0 @@ -SUMMARY = "Python Lex and Yacc" -DESCRIPTION = "Python ply: PLY is yet another implementation of lex and yacc for Python" -HOMEPAGE = "https://pypi.python.org/pypi/ply" -SECTION = "devel/python" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://README.md;beginline=5;endline=32;md5=f5ee5c355c0e6719c787a71b8f0fa96c" - -SRC_URI[md5sum] = "6465f602e656455affcd7c5734c638f8" -SRC_URI[sha256sum] = "00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3" - -inherit pypi setuptools3 - -RDEPENDS_${PN}_class-target += "\ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-shell \ -" - -BBCLASSEXTEND = "native" 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 d81ee5445c..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.1.5.bb b/meta-python/recipes-devtools/python/python3-portion_2.4.2.bb index 0fa107c33e..3af94b48f1 100644 --- a/meta-python/recipes-devtools/python/python3-portion_2.1.5.bb +++ b/meta-python/recipes-devtools/python/python3-portion_2.4.2.bb @@ -2,11 +2,15 @@ DESCRIPTION = "Python data structure and operations for intervals" HOMEPAGE = "https://github.com/AlexandreDecan/portion" SECTION = "devel/python" -LICENSE = "LGPLv3" +LICENSE = "LGPL-3.0-only" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=05f1e16a8e59ce3e9a979e881816c2ab" inherit pypi setuptools3 -SRC_URI[sha256sum] = "ed62fd1450336026f55c7d40b92b7159efd81d1420c778dd1b592bb634b14b4c" +SRC_URI[sha256sum] = "5289b40d98959b16b3f6927781678935d3df1b7c14947f5d7778e5e04dd9a065" + +RDEPENDS:${PN} = "\ + python3-sortedcontainers \ +" BBCLASSEXTEND = "native" 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 b87a470b40..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 @@ -4,16 +4,14 @@ process' behaviour. Usage of the function is fairly messy though, due to \ limitations in C and linux. This module provides a nice non-messy python(ic) \ interface." SECTION = "devel/python" -LICENSE = "GPLv3" +LICENSE = "GPL-3.0-only" LIC_FILES_CHKSUM = "file://COPYING;md5=1475481f9ec754d758859bd2c75f6f6f" S = "${WORKDIR}/git" B = "${S}" SRCREV = "5e12e398eb5c4e30d7b29b02458c76d2cc780700" -PV = "1.8.1+git${SRCPV}" - -SRC_URI = "git://github.com/seveas/python-prctl;branch=main\ +SRC_URI = "git://github.com/seveas/python-prctl;protocol=https;branch=main \ file://0001-support-cross-complication.patch \ " inherit setuptools3 python3native 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 6155b79818..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 @@ -12,8 +12,9 @@ SRC_URI += " \ file://run-ptest \ " -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-pretend_1.0.9.bb b/meta-python/recipes-devtools/python/python3-pretend_1.0.9.bb deleted file mode 100644 index 21d14a03b8..0000000000 --- a/meta-python/recipes-devtools/python/python3-pretend_1.0.9.bb +++ /dev/null @@ -1,11 +0,0 @@ -SUMMARY = "A library for stubbing in Python" -HOMEPAGE = "https://github.com/alex/pretend" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=411780c0b7fa756753e94affeee5bc99" - -SRC_URI[md5sum] = "ad53883ede48aeac7ae584f0de0240e8" -SRC_URI[sha256sum] = "c90eb810cde8ebb06dafcb8796f9a95228ce796531bc806e794c2f4649aa1b10" - -inherit pypi setuptools3 - -BBCLASSEXTEND = "native nativesdk" 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_2.1.0.bb b/meta-python/recipes-devtools/python/python3-prettytable_2.1.0.bb deleted file mode 100644 index fe7206255c..0000000000 --- a/meta-python/recipes-devtools/python/python3-prettytable_2.1.0.bb +++ /dev/null @@ -1,39 +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] = "5882ed9092b391bb8f6e91f59bcdbd748924ff556bb7c634089d5519be87baa0" - -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 \ -" - -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ -" - -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_3.0.0.bb b/meta-python/recipes-devtools/python/python3-process-tests_3.0.0.bb new file mode 100644 index 0000000000..a16497b984 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-process-tests_3.0.0.bb @@ -0,0 +1,21 @@ +# Copyright (C) 2021 Khem Raj <raj.khem@gmail.com> +# Released under the MIT license (see COPYING.MIT for the terms) + +SUMMARY = "Tools for testing processes." +HOMEPAGE = "https://github.com/ionelmc/python-process-tests" +LICENSE = "BSD-2-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=aea36d49429f53e06868d87cd9d62349" + +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.5.bb b/meta-python/recipes-devtools/python/python3-progress_1.5.bb deleted file mode 100644 index 1f299dbedc..0000000000 --- a/meta-python/recipes-devtools/python/python3-progress_1.5.bb +++ /dev/null @@ -1,16 +0,0 @@ -SUMMARY = "Easy progress reporting for Python" -HOMEPAGE = "http://github.com/verigak/progress/" -LICENSE = "ISC" -LIC_FILES_CHKSUM = "file://LICENSE;md5=aef5566ac4fede9815eccf124c281317" - -SRC_URI[md5sum] = "408df0e3db0ad4b74f19f6beec814ae4" -SRC_URI[sha256sum] = "69ecedd1d1bbe71bf6313d88d1e6c4d2957b7f1d4f71312c211257f7dae64372" - -inherit pypi setuptools3 - -RDEPENDS_${PN}_class-target += " \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-math \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-progress_1.6.bb b/meta-python/recipes-devtools/python/python3-progress_1.6.bb new file mode 100644 index 0000000000..59d1f90e98 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-progress_1.6.bb @@ -0,0 +1,15 @@ +SUMMARY = "Easy progress reporting for Python" +HOMEPAGE = "http://github.com/verigak/progress/" +LICENSE = "ISC" +LIC_FILES_CHKSUM = "file://LICENSE;md5=00ab78a4113b09aacf63d762a7bb9644" + +SRC_URI[sha256sum] = "c9c86e98b5c03fa1fe11e3b67c1feda4788b8d0fe7336c2ff7d5644ccfba34cd" + +inherit pypi setuptools3 + +RDEPENDS:${PN}:class-target += " \ + python3-datetime \ + python3-math \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.18.bb b/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.43.bb index 3662875839..8b3b709763 100644 --- a/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.18.bb +++ b/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.43.bb @@ -3,21 +3,23 @@ HOMEPAGE = "https://python-prompt-toolkit.readthedocs.io/" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=b2cde7da89f0c1f3e49bf968d00d554f" -SRC_URI[sha256sum] = "e1b4f11b9336a28fa11810bc623c357420f69dfdb6d2dac41ca2c21a55c033bc" +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 \ +RDEPENDS:${PN} += " \ + 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_3.14.0.bb b/meta-python/recipes-devtools/python/python3-protobuf_4.25.3.bb index 3cf850d1f4..8bb8a93f76 100644 --- a/meta-python/recipes-devtools/python/python3-protobuf_3.14.0.bb +++ b/meta-python/recipes-devtools/python/python3-protobuf_4.25.3.bb @@ -3,11 +3,10 @@ HOMEPAGE = "https://developers.google.com/protocol-buffers/" SECTION = "devel/python" LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=19e8f490f9526b1de84f8d949cfcfd4e" +LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=53dbfa56f61b90215a9f8f0d527c043d" inherit pypi setuptools3 - -SRC_URI[sha256sum] = "1d63eb389347293d8915fb47bee0951c7b5dab522a4a60118b9a18f33e21f8ce" +SRC_URI[sha256sum] = "25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c" # http://errors.yoctoproject.org/Errors/Details/184715/ # Can't find required file: ../src/google/protobuf/descriptor.proto @@ -17,15 +16,15 @@ 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 \ +RDEPENDS:${PN} += " \ + 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) @@ -34,6 +33,6 @@ BBCLASSEXTEND = "native nativesdk" DISTUTILS_BUILD_ARGS += "--cpp_implementation" DISTUTILS_INSTALL_ARGS += "--cpp_implementation" -do_compile_prepend_class-native () { +do_compile:prepend:class-native () { export KOKORO_BUILD_NUMBER="1" } diff --git a/meta-python/recipes-devtools/python/python3-psutil_5.8.0.bb b/meta-python/recipes-devtools/python/python3-psutil_5.8.0.bb deleted file mode 100644 index bd43b414d0..0000000000 --- a/meta-python/recipes-devtools/python/python3-psutil_5.8.0.bb +++ /dev/null @@ -1,24 +0,0 @@ -SUMMARY = "A cross-platform process and system utilities module for Python" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=e35fd9f271d19d5f742f20a9d1f8bb8b" - -SRC_URI[sha256sum] = "0c9ccb99ab76025f2f0bbecf341d4656e9c1351db8cc8a03ccd62e318ab4b5c6" - -inherit pypi setuptools3 - -PACKAGES =+ "${PN}-tests" - -FILES_${PN}-tests += " \ - ${PYTHON_SITEPACKAGES_DIR}/psutil/test* \ - ${PYTHON_SITEPACKAGES_DIR}/psutil/__pycache__/test* \ -" - - -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-threading \ - ${PYTHON_PN}-xml \ - ${PYTHON_PN}-netclient \ -" - -BBCLASSEXTEND = "native nativesdk" 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 607c719461..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 @@ -8,17 +8,17 @@ SRCNAME = "ptyprocess" SRC_URI[sha256sum] = "5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220" -inherit pypi setuptools3 +inherit pypi python_flit_core 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 \ +RDEPENDS:${PN} = "\ + python3-core \ + python3-fcntl \ + python3-terminal \ + python3-resource \ " BBCLASSEXTEND = "native nativesdk" @@ -29,11 +29,13 @@ SRC_URI += " \ file://run-ptest \ " -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-fcntl \ - ${PYTHON_PN}-terminal \ - ${PYTHON_PN}-resource \ +RDEPENDS:${PN}-ptest += " \ + 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_21.3.4.bb b/meta-python/recipes-devtools/python/python3-pulsectl_24.4.0.bb index a4455eeb1c..3bc15bb08a 100644 --- a/meta-python/recipes-devtools/python/python3-pulsectl_21.3.4.bb +++ b/meta-python/recipes-devtools/python/python3-pulsectl_24.4.0.bb @@ -3,8 +3,11 @@ HOMEPAGE = "https://github.com/mk-fg/python-pulse-control" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://COPYING;md5=f1d10048469ff90123263eb5e214061d" -SRC_URI[sha256sum] = "faa8b9336237565990298f20870e13dd1678a4586847ca5a7ff2abf10752f356" +SRC_URI[sha256sum] = "697ed50e7d452e78678ae38e2ab935843008bec448955283cd0fb362867e3165" -RDEPENDS_${PN} += "pulseaudio" +RDEPENDS:${PN} += " \ + libpulse \ + python3-ctypes \ +" inherit pypi setuptools3 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 new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-py-cpuinfo/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-py-cpuinfo_9.0.0.bb b/meta-python/recipes-devtools/python/python3-py-cpuinfo_9.0.0.bb new file mode 100644 index 0000000000..857afd1db7 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-py-cpuinfo_9.0.0.bb @@ -0,0 +1,36 @@ +# Copyright (C) 2021 Khem Raj <raj.khem@gmail.com> +# Released under the MIT license (see COPYING.MIT for the terms) + +SUMMARY = "Get CPU info with pure Python 2 & 3" +HOMEPAGE = "https://github.com/workhorsy/py-cpuinfo" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=d2379ecb0d7a8299101b1e4c160cd1f7" + +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/ +} + +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" + +BBCLASSEXTEND = "native nativesdk" 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 31f07a5180..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 @@ -7,8 +7,8 @@ SRC_URI[sha256sum] = "b9bfb8695a1c7e3632e800fb83c943bf67ed45ddd87cd0344851610c69 inherit pypi setuptools3 -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-numbers \ +RDEPENDS:${PN} += " \ + 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.10.0.bb b/meta-python/recipes-devtools/python/python3-pyalsaaudio_0.10.0.bb new file mode 100644 index 0000000000..8b22faad3a --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyalsaaudio_0.10.0.bb @@ -0,0 +1,12 @@ +SUMMARY = "ALSA bindings" +SECTION = "devel/python" +LICENSE = "PSF-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=1a3b161aa0fcec32a0c8907a2219ad9d" + +inherit pypi setuptools3 + +SRC_URI[sha256sum] = "e21175500a2bd310ae3867e7991639defc1e2a5c92cf1b9f7083296b346738ab" + +DEPENDS += "alsa-lib" + +RDEPENDS:${PN} += "libasound" diff --git a/meta-python/recipes-devtools/python/python3-pyalsaaudio_0.9.0.bb b/meta-python/recipes-devtools/python/python3-pyalsaaudio_0.9.0.bb deleted file mode 100644 index 90050fb146..0000000000 --- a/meta-python/recipes-devtools/python/python3-pyalsaaudio_0.9.0.bb +++ /dev/null @@ -1,13 +0,0 @@ -SUMMARY = "ALSA bindings" -SECTION = "devel/python" -LICENSE = "PSF" -LIC_FILES_CHKSUM = "file://LICENSE;md5=1a3b161aa0fcec32a0c8907a2219ad9d" - -inherit pypi setuptools3 - -SRC_URI[md5sum] = "48c40424a79c2568676a41643d93f1f7" -SRC_URI[sha256sum] = "3ca069c736c8ad2a3047b5033468d983a2480f94fad4feb0169c056060e01e69" - -DEPENDS += "alsa-lib" - -RDEPENDS_${PN} += "libasound" 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 dd39e8c405..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" @@ -19,8 +20,9 @@ SRC_URI += " \ file://run-ptest \ " -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-pyasn1/run-ptest b/meta-python/recipes-devtools/python/python3-pyasn1/run-ptest deleted file mode 100644 index b63c4de0d9..0000000000 --- a/meta-python/recipes-devtools/python/python3-pyasn1/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-pyasn1_0.4.8.bb b/meta-python/recipes-devtools/python/python3-pyasn1_0.4.8.bb deleted file mode 100644 index a5e2a71362..0000000000 --- a/meta-python/recipes-devtools/python/python3-pyasn1_0.4.8.bb +++ /dev/null @@ -1,2 +0,0 @@ -inherit pypi setuptools3 -require python-pyasn1.inc diff --git a/meta-python/recipes-devtools/python/python3-pyatspi_2.34.0.bb b/meta-python/recipes-devtools/python/python3-pyatspi_2.46.1.bb index 3bdb86b453..2b6a6c2c0e 100644 --- a/meta-python/recipes-devtools/python/python3-pyatspi_2.34.0.bb +++ b/meta-python/recipes-devtools/python/python3-pyatspi_2.46.1.bb @@ -2,19 +2,23 @@ SUMMARY = "Python bindings for DBus AT-SPI2 accessibility" DESCRIPTION = "AT-SPI2 is a protocol over DBus, toolkit widgets use to provide content to screen readers such as Orca" SECTION = "devel/python" HOMEPAGE = "https://www.freedesktop.org/wiki/Accessibility/AT-SPI2/" -LICENSE = "GPLv2" +LICENSE = "GPL-2.0-only" LIC_FILES_CHKSUM = "file://COPYING;md5=db29218e6ba3794c56df7d4987dc7e4d \ file://COPYING.GPL;md5=751419260aa954499f7abaabaa882bbe" 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=mainline" -SRCREV = "cc99d68db66174f4499b9b325bc788393b972edd" +SRC_URI = "git://github.com/GNOME/pyatspi2.git;protocol=https;branch=master" +SRCREV = "8c69016b38d0e4caaf4c986938ea3410fb7351b6" + S = "${WORKDIR}/git" # Same restriction as gtk+ -inherit features_check +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/*" +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.11.bb deleted file mode 100644 index b2c890659e..0000000000 --- a/meta-python/recipes-devtools/python/python3-pyaudio_0.2.11.bb +++ /dev/null @@ -1,15 +0,0 @@ -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" - -PYPI_PACKAGE = "PyAudio" - -SRC_URI[md5sum] = "7e4c88139284033f67b4336c74eda3b8" -SRC_URI[sha256sum] = "93bfde30e0b64e63a46f2fd77e85c41fd51182a4a3413d9edfaf9ffaa26efb74" - -inherit pypi setuptools3 - -DEPENDS += "portaudio-v19" - -RDEPENDS_${PN} += "portaudio-v19" diff --git a/meta-python/recipes-devtools/python/python3-pyaudio_0.2.14.bb b/meta-python/recipes-devtools/python/python3-pyaudio_0.2.14.bb new file mode 100644 index 0000000000..1599ea8347 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyaudio_0.2.14.bb @@ -0,0 +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://LICENSE.txt;md5=7c3152b432b96d6dc4a1cb35397da9ec" + +PYPI_PACKAGE = "PyAudio" + +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.6.bb b/meta-python/recipes-devtools/python/python3-pybind11-json_0.2.13.bb index c56c70ad37..67bd2a33a7 100644 --- a/meta-python/recipes-devtools/python/python3-pybind11-json_0.2.6.bb +++ b/meta-python/recipes-devtools/python/python3-pybind11-json_0.2.13.bb @@ -2,8 +2,8 @@ SUMMARY = "Using nlohmann::json with pybind11" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=0e25ff0ec476d06d366439e1120cce98" -SRCREV = "d1d00888bc0eb7c50dde6cff1a5eb4586e620b65" -SRC_URI = "git://github.com/pybind/pybind11_json" +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.6.2.bb b/meta-python/recipes-devtools/python/python3-pybind11_2.6.2.bb deleted file mode 100644 index bd16a6d0dc..0000000000 --- a/meta-python/recipes-devtools/python/python3-pybind11_2.6.2.bb +++ /dev/null @@ -1,36 +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 \ - file://0001-Do-not-strip-binaries.patch \ - file://0001-Do-not-check-pointer-size-when-cross-compiling.patch \ -" -SRCREV = "8de7772cc72daca8e947b79b83fea46214931604" - -S = "${WORKDIR}/git" - -BBCLASSEXTEND = "native" - -EXTRA_OECMAKE = "-DPYBIND11_TEST=OFF" - -inherit cmake setuptools3 python3native - -do_configure() { - cmake_do_configure -} - -do_compile() { - distutils3_do_compile - cmake_do_compile -} - -do_install() { - distutils3_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 new file mode 100644 index 0000000000..fea87a2ff0 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pybluez/0001-Use-Py_ssize_t-when-parsing-buffer-length-fix-426-42.patch @@ -0,0 +1,154 @@ +From aa8ee5e5e934908f0357364f6ec90a3ecda62880 Mon Sep 17 00:00:00 2001 +From: Nicolas Schodet <nico@ni.fr.eu.org> +Date: Mon, 3 Jan 2022 02:37:01 +0100 +Subject: [PATCH] Use Py_ssize_t when parsing buffer length, fix #426 (#427) + +From python 3.9 documentation: + +> For all # variants of formats (s#, y#, etc.), the macro +> PY_SSIZE_T_CLEAN must be defined before including Python.h. On Python +> 3.9 and older, the type of the length argument is Py_ssize_t if the +> PY_SSIZE_T_CLEAN macro is defined, or int otherwise. + +From python 3.8 changes: + +> Use of # variants of formats in parsing or building value (e.g. +> PyArg_ParseTuple(), Py_BuildValue(), PyObject_CallFunction(), etc.) +> without PY_SSIZE_T_CLEAN defined raises DeprecationWarning now. It +> will be removed in 3.10 or 4.0. Read Parsing arguments and building +> values for detail. (Contributed by Inada Naoki in bpo-36381.) + +Fixes https://github.com/pybluez/pybluez/issues/426 + +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/bluez/btmodule.c b/bluez/btmodule.c +index 518b723..912a489 100644 +--- a/bluez/btmodule.c ++++ b/bluez/btmodule.c +@@ -16,7 +16,8 @@ Local naming conventions: + - names starting with bt_ are module-level functions + + */ +- ++#define PY_SSIZE_T_CLEAN 1 ++#include "Python.h" + #include "btmodule.h" + #include "structmember.h" + +@@ -732,7 +733,7 @@ sock_setsockopt(PySocketSockObject *s, PyObject *args) + int optname; + int res; + void *buf; +- int buflen; ++ Py_ssize_t buflen; + int flag; + + if (PyArg_ParseTuple(args, "iii:setsockopt", &level, &optname, &flag)) { +@@ -2001,7 +2002,8 @@ static PyObject * + bt_hci_send_cmd(PyObject *self, PyObject *args) + { + PySocketSockObject *socko = NULL; +- int err, plen = 0; ++ int err; ++ Py_ssize_t plen = 0; + uint16_t ogf, ocf; + char *param = NULL; + int dd = 0; +@@ -2036,6 +2038,7 @@ bt_hci_send_req(PyObject *self, PyObject *args, PyObject *kwds) + int err; + int to=0; + char rparam[256]; ++ Py_ssize_t req_clen; + struct hci_request req = { 0 }; + int dd = 0; + +@@ -2043,9 +2046,10 @@ bt_hci_send_req(PyObject *self, PyObject *args, PyObject *kwds) + "timeout", 0 }; + + if( !PyArg_ParseTupleAndKeywords(args, kwds, "OHHii|s#i", keywords, +- &socko, &req.ogf, &req.ocf, &req.event, &req.rlen, +- &req.cparam, &req.clen, &to) ) ++ &socko, &req.ogf, &req.ocf, &req.event, &req.rlen, ++ &req.cparam, &req_clen, &to) ) + return 0; ++ req.clen = req_clen; + + req.rparam = rparam; + dd = socko->sock_fd; +@@ -2274,7 +2278,8 @@ Returns the name of the device, or raises an error on failure"); + static PyObject * bt_hci_filter_ ## name (PyObject *self, PyObject *args )\ + { \ + char *param; \ +- int len, arg; \ ++ Py_ssize_t len; \ ++ int arg; \ + if( !PyArg_ParseTuple(args,"s#i", ¶m, &len, &arg) ) \ + return 0; \ + if( len != sizeof(struct hci_filter) ) { \ +@@ -2303,7 +2308,7 @@ DECL_HCI_FILTER_OP_1(test_opcode, "test opcode!") + static PyObject * bt_hci_filter_ ## name (PyObject *self, PyObject *args )\ + { \ + char *param; \ +- int len; \ ++ Py_ssize_t len; \ + if( !PyArg_ParseTuple(args,"s#", ¶m, &len) ) \ + return 0; \ + if( len != sizeof(struct hci_filter) ) { \ +@@ -2364,7 +2369,7 @@ static PyObject * + bt_ba2str(PyObject *self, PyObject *args) + { + char *data=NULL; +- int len=0; ++ Py_ssize_t len=0; + char ba_str[19] = {0}; + if (!PyArg_ParseTuple(args, "s#", &data, &len)) return 0; + ba2str((bdaddr_t*)data, ba_str); +@@ -2579,7 +2584,7 @@ bt_sdp_advertise_service( PyObject *self, PyObject *args ) + *provider = NULL, + *description = NULL; + PyObject *service_classes, *profiles, *protocols; +- int namelen = 0, provlen = 0, desclen = 0; ++ Py_ssize_t namelen = 0, provlen = 0, desclen = 0; + uuid_t svc_uuid = { 0 }; + int i; + char addrbuf[256] = { 0 }; +diff --git a/msbt/_msbt.c b/msbt/_msbt.c +index b3d27ff..81f5ee9 100644 +--- a/msbt/_msbt.c ++++ b/msbt/_msbt.c +@@ -2,6 +2,8 @@ + #define UNICODE + #endif + ++#define PY_SSIZE_T_CLEAN 1 ++ + #include <winsock2.h> + #include <ws2bth.h> + #include <BluetoothAPIs.h> +@@ -155,7 +157,7 @@ static PyObject * + msbt_bind(PyObject *self, PyObject *args) + { + wchar_t *addrstr = NULL; +- int addrstrlen = -1; ++ Py_ssize_t addrstrlen = -1; + int sockfd = -1; + int port = -1; + char buf[100] = { 0 }; +@@ -765,7 +767,7 @@ msbt_set_service_raw(PyObject *self, PyObject *args) + WSAESETSERVICEOP op; + + char *record = NULL; +- int reclen = -1; ++ Py_ssize_t reclen = -1; + BTH_SET_SERVICE *si = NULL; + int silen = -1; + ULONG sdpVersion = BTH_SDP_VERSION; +-- +2.34.1 + 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 5242059bc6..a38e10eec0 100644 --- a/meta-python/recipes-devtools/python/python3-pybluez_0.23.bb +++ b/meta-python/recipes-devtools/python/python3-pybluez_0.23.bb @@ -4,16 +4,23 @@ SECTION = "devel/python" DEPENDS = "bluez5" -LICENSE = "GPL-2.0" +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 \ + file://py-3.11.patch " SRC_URI[md5sum] = "afbe8429bb82d2c46a3d0f5f4f898f9d" SRC_URI[sha256sum] = "c8f04d2e78951eaa9de486b4d49381704e8943d0a6e6e58f55fcd7b8582e90de" PYPI_PACKAGE = "PyBluez" + inherit pypi setuptools3 -RDEPENDS_${PN} += "\ +do_configure:prepend() { + sed -i -e "/use_2to3=True,/d" ${S}/setup.py +} + +RDEPENDS:${PN} += "\ bluez5 \ - ${PYTHON_PN}-fcntl \ + python3-fcntl \ " diff --git a/meta-python/recipes-devtools/python/python3-pycares_4.4.0.bb b/meta-python/recipes-devtools/python/python3-pycares_4.4.0.bb new file mode 100644 index 0000000000..b6b0de8809 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pycares_4.4.0.bb @@ -0,0 +1,22 @@ +SUMMARY = "Python interface for c-ares" +DESCRIPTION = "\ +pycares is a Python module which provides an interface to c-ares. c-ares is \ +a C library that performs DNS requests and name resolutions asynchronously." +HOMEPAGE = "https://github.com/saghul/pycares" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=b1538fcaea82ebf2313ed648b96c69b1" + +SRC_URI[sha256sum] = "f47579d508f2f56eddd16ce72045782ad3b1b3b678098699e2b6a1b30733e1c2" + +PYPI_PACKAGE = "pycares" + +inherit pypi setuptools3 + +DEPENDS += "python3-cffi-native" + +RDEPENDS:${PN} += " \ + 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_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-pychromecast_9.1.2.bb b/meta-python/recipes-devtools/python/python3-pychromecast_9.1.2.bb deleted file mode 100644 index c392261ade..0000000000 --- a/meta-python/recipes-devtools/python/python3-pychromecast_9.1.2.bb +++ /dev/null @@ -1,10 +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] = "907656cea46d39d0e93ec815979578ef4fb6f655fd8bf4e88e6421fcd7824e85" - -PYPI_PACKAGE = "PyChromecast" - -inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-pycocotools_2.0.7.bb b/meta-python/recipes-devtools/python/python3-pycocotools_2.0.7.bb new file mode 100644 index 0000000000..bebfb128f2 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pycocotools_2.0.7.bb @@ -0,0 +1,11 @@ +SUMMARY = "COCO is a large image dataset designed for object detection, segmentation, \ + person keypoints detection, stuff segmentation, and caption generation." +LICENSE = "BSD-2-Clause" +LIC_FILES_CHKSUM = "file://pycocotools/coco.py;beginline=45;endline=45;md5=12cb539683cf245df8b6ce782d78f647" + +inherit setuptools3 pypi + +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.7.0.bb b/meta-python/recipes-devtools/python/python3-pycodestyle_2.11.1.bb index 611abca6bc..a282afb466 100644 --- a/meta-python/recipes-devtools/python/python3-pycodestyle_2.7.0.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] = "c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef" +SRC_URI[sha256sum] = "41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-pycparser_2.20.bb b/meta-python/recipes-devtools/python/python3-pycparser_2.20.bb deleted file mode 100644 index 2a5f414b2f..0000000000 --- a/meta-python/recipes-devtools/python/python3-pycparser_2.20.bb +++ /dev/null @@ -1,19 +0,0 @@ -SUMMARY = "Parser of the C language, written in pure Python" -HOMEPAGE = "https://github.com/eliben/pycparser" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=86f1cedb4e6410a88ce8e30b91079169" - -SRC_URI[md5sum] = "b8f88de737db8c346ee8d31c07c7a25a" -SRC_URI[sha256sum] = "2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0" - -inherit pypi setuptools3 - -BBCLASSEXTEND = "native nativesdk" - -RDEPENDS_${PN}_class-target += "\ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-ply \ - ${PYTHON_PN}-pprint \ - cpp \ - cpp-symlinks \ - " diff --git a/meta-python/recipes-devtools/python/python3-pycrypto/0001-Replace-time.clock-with-time.process_time.patch b/meta-python/recipes-devtools/python/python3-pycrypto/0001-Replace-time.clock-with-time.process_time.patch deleted file mode 100644 index 282fdd3e2b..0000000000 --- a/meta-python/recipes-devtools/python/python3-pycrypto/0001-Replace-time.clock-with-time.process_time.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 1d90727ff2368012d6e2f91b1a3198f626495b7f Mon Sep 17 00:00:00 2001 -From: Ming Liu <liu.ming50@gmail.com> -Date: Sat, 25 Jan 2020 14:36:16 +0100 -Subject: [PATCH] Replace time.clock() with time.process_time() - -The use of time.clock() is deprecated in python 3.8, change to use -time.process_time(). - -Reference: -https://docs.python.org/3.3/library/time.html#time.clock - -Upstream-Status: Pending - -Signed-off-by: Ming Liu <liu.ming50@gmail.com> ---- - lib/Crypto/Random/_UserFriendlyRNG.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/lib/Crypto/Random/_UserFriendlyRNG.py b/lib/Crypto/Random/_UserFriendlyRNG.py -index 957e006..d2a0259 100644 ---- a/lib/Crypto/Random/_UserFriendlyRNG.py -+++ b/lib/Crypto/Random/_UserFriendlyRNG.py -@@ -74,7 +74,7 @@ class _EntropyCollector(object): - self._time_es.feed(struct.pack("@I", int(2**30 * (t - floor(t))))) - - # Add the fractional part of time.clock() -- t = time.clock() -+ t = time.process_time() - self._clock_es.feed(struct.pack("@I", int(2**30 * (t - floor(t))))) - - --- -2.7.4 - diff --git a/meta-python/recipes-devtools/python/python3-pycrypto/CVE-2013-7459.patch b/meta-python/recipes-devtools/python/python3-pycrypto/CVE-2013-7459.patch deleted file mode 100644 index 9006c5c350..0000000000 --- a/meta-python/recipes-devtools/python/python3-pycrypto/CVE-2013-7459.patch +++ /dev/null @@ -1,98 +0,0 @@ -From 8dbe0dc3eea5c689d4f76b37b93fe216cf1f00d4 Mon Sep 17 00:00:00 2001 -From: Legrandin <helderijs@gmail.com> -Date: Sun, 22 Dec 2013 22:24:46 +0100 -Subject: [PATCH] Throw exception when IV is used with ECB or CTR - -The IV parameter is currently ignored when initializing -a cipher in ECB or CTR mode. - -For CTR mode, it is confusing: it takes some time to see -that a different parameter is needed (the counter). - -For ECB mode, it is outright dangerous. - -This patch forces an exception to be raised. - -Upstream-Status: Backport -[https://github.com/dlitz/pycrypto/commit/8dbe0dc3eea5c689d4f76b37b93fe216cf1f00d4] - -CVE: CVE-2013-7459 - -Signed-off-by: Yi Zhao <yi.zhao@windriver.com> ---- - lib/Crypto/SelfTest/Cipher/common.py | 31 +++++++++++++++++++++++-------- - src/block_template.c | 11 +++++++++++ - 2 files changed, 34 insertions(+), 8 deletions(-) - -diff --git a/lib/Crypto/SelfTest/Cipher/common.py b/lib/Crypto/SelfTest/Cipher/common.py -index 8bebed9..91ec743 100644 ---- a/lib/Crypto/SelfTest/Cipher/common.py -+++ b/lib/Crypto/SelfTest/Cipher/common.py -@@ -239,19 +239,34 @@ class RoundtripTest(unittest.TestCase): - return """%s .decrypt() output of .encrypt() should not be garbled""" % (self.module_name,) - - def runTest(self): -- for mode in (self.module.MODE_ECB, self.module.MODE_CBC, self.module.MODE_CFB, self.module.MODE_OFB, self.module.MODE_OPENPGP): -+ -+ ## ECB mode -+ mode = self.module.MODE_ECB -+ encryption_cipher = self.module.new(a2b_hex(self.key), mode) -+ ciphertext = encryption_cipher.encrypt(self.plaintext) -+ decryption_cipher = self.module.new(a2b_hex(self.key), mode) -+ decrypted_plaintext = decryption_cipher.decrypt(ciphertext) -+ self.assertEqual(self.plaintext, decrypted_plaintext) -+ -+ ## OPENPGP mode -+ mode = self.module.MODE_OPENPGP -+ encryption_cipher = self.module.new(a2b_hex(self.key), mode, self.iv) -+ eiv_ciphertext = encryption_cipher.encrypt(self.plaintext) -+ eiv = eiv_ciphertext[:self.module.block_size+2] -+ ciphertext = eiv_ciphertext[self.module.block_size+2:] -+ decryption_cipher = self.module.new(a2b_hex(self.key), mode, eiv) -+ decrypted_plaintext = decryption_cipher.decrypt(ciphertext) -+ self.assertEqual(self.plaintext, decrypted_plaintext) -+ -+ ## All other non-AEAD modes (but CTR) -+ for mode in (self.module.MODE_CBC, self.module.MODE_CFB, self.module.MODE_OFB): - encryption_cipher = self.module.new(a2b_hex(self.key), mode, self.iv) - ciphertext = encryption_cipher.encrypt(self.plaintext) -- -- if mode != self.module.MODE_OPENPGP: -- decryption_cipher = self.module.new(a2b_hex(self.key), mode, self.iv) -- else: -- eiv = ciphertext[:self.module.block_size+2] -- ciphertext = ciphertext[self.module.block_size+2:] -- decryption_cipher = self.module.new(a2b_hex(self.key), mode, eiv) -+ decryption_cipher = self.module.new(a2b_hex(self.key), mode, self.iv) - decrypted_plaintext = decryption_cipher.decrypt(ciphertext) - self.assertEqual(self.plaintext, decrypted_plaintext) - -+ - class PGPTest(unittest.TestCase): - def __init__(self, module, params): - unittest.TestCase.__init__(self) -diff --git a/src/block_template.c b/src/block_template.c -index c36b316..8746948 100644 ---- a/src/block_template.c -+++ b/src/block_template.c -@@ -170,6 +170,17 @@ ALGnew(PyObject *self, PyObject *args, PyObject *kwdict) - "Key cannot be the null string"); - return NULL; - } -+ if (IVlen != 0 && mode == MODE_ECB) -+ { -+ PyErr_Format(PyExc_ValueError, "ECB mode does not use IV"); -+ return NULL; -+ } -+ if (IVlen != 0 && mode == MODE_CTR) -+ { -+ PyErr_Format(PyExc_ValueError, -+ "CTR mode needs counter parameter, not IV"); -+ return NULL; -+ } - if (IVlen != BLOCK_SIZE && mode != MODE_ECB && mode != MODE_CTR) - { - PyErr_Format(PyExc_ValueError, --- -2.7.4 - diff --git a/meta-python/recipes-devtools/python/python3-pycrypto/cross-compiling.patch b/meta-python/recipes-devtools/python/python3-pycrypto/cross-compiling.patch deleted file mode 100644 index 712f3e8dde..0000000000 --- a/meta-python/recipes-devtools/python/python3-pycrypto/cross-compiling.patch +++ /dev/null @@ -1,23 +0,0 @@ -Index: pycrypto-2.6/setup.py -=================================================================== ---- pycrypto-2.6.orig/setup.py -+++ pycrypto-2.6/setup.py -@@ -271,7 +271,8 @@ class PCTBuildConfigure(Command): - if not os.path.exists("config.status"): - if os.system("chmod 0755 configure") != 0: - raise RuntimeError("chmod error") -- cmd = "sh configure" # we use "sh" here so that it'll work on mingw32 with standard python.org binaries -+ host = os.environ.get("HOST_SYS") -+ cmd = "ac_cv_func_malloc_0_nonnull=yes sh configure --host " + host # we use "sh" here so that it'll work on mingw32 with standard python.org binaries - if self.verbose < 1: - cmd += " -q" - if os.system(cmd) != 0: -@@ -370,7 +371,7 @@ kw = {'name':"pycrypto", - 'ext_modules': plat_ext + [ - # _fastmath (uses GNU mp library) - Extension("Crypto.PublicKey._fastmath", -- include_dirs=['src/','/usr/include/'], -+ include_dirs=['src/'], - libraries=['gmp'], - sources=["src/_fastmath.c"]), - diff --git a/meta-python/recipes-devtools/python/python3-pycrypto_2.6.1.bb b/meta-python/recipes-devtools/python/python3-pycrypto_2.6.1.bb deleted file mode 100644 index 78a1ef2ac0..0000000000 --- a/meta-python/recipes-devtools/python/python3-pycrypto_2.6.1.bb +++ /dev/null @@ -1,29 +0,0 @@ -DESCRIPTION = "Cryptographic modules for Python." -HOMEPAGE = "http://www.pycrypto.org/" -LICENSE = "PSFv2" -LIC_FILES_CHKSUM = "file://COPYRIGHT;md5=35f354d199e8cb7667b059a23578e63d" - -DEPENDS += " gmp" - -export HOST_SYS - -inherit pypi autotools-brokensep distutils3 - -SRC_URI += "file://cross-compiling.patch \ - file://CVE-2013-7459.patch \ - file://0001-Replace-time.clock-with-time.process_time.patch \ - " - -SRC_URI[md5sum] = "55a61a054aa66812daf5161a0d5d7eda" -SRC_URI[sha256sum] = "f2ce1e989b272cfcb677616763e0a2e7ec659effa67a88aa92b3a65528f60a3c" - -do_compile[noexec] = "1" - -# We explicitly call distutils_do_install, since we want it to run, but -# *don't* want the autotools install to run, since this package doesn't -# provide a "make install" target. -do_install() { - distutils3_do_install -} - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pycurl_7.43.0.6.bb b/meta-python/recipes-devtools/python/python3-pycurl_7.45.2.bb index 0437a6cc93..a6863e21ff 100644 --- a/meta-python/recipes-devtools/python/python3-pycurl_7.43.0.6.bb +++ b/meta-python/recipes-devtools/python/python3-pycurl_7.45.2.bb @@ -7,17 +7,15 @@ be used to fetch objects identified by a URL from a Python program \ SECTION = "devel/python" HOMEPAGE = "http://pycurl.io/" -LICENSE = "LGPLv2 | MIT" +LICENSE = "LGPL-2.0-only | MIT" LIC_FILES_CHKSUM = "file://COPYING-LGPL;md5=4fbd65380cdd255951079008b364516c \ - file://COPYING-MIT;md5=60872a112595004233b769b6cbfd65b6 \ + file://COPYING-MIT;md5=be42e1b1e58c8d59c2901fd747bfc55d \ " -SRC_URI[md5sum] = "3e121d895101022c30619e1bbf97eb97" -SRC_URI[sha256sum] = "8301518689daefa53726b59ded6b48f33751c383cf987b0ccfbbc4ed40281325" +SRC_URI[sha256sum] = "5730590be0271364a5bddd9e245c9cc0fb710c4cbacbdd95264a3122d23224ca" + +DEPENDS = "curl" inherit pypi setuptools3 -DEPENDS = "\ - curl \ - ${PYTHON_PN}\ -" +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_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 ae9e42160f..0000000000 --- a/meta-python/recipes-devtools/python/python3-pydbus-manager_git.bb +++ /dev/null @@ -1,13 +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" -SRCREV = "6b576b969cbda50521dca62a7df929167207f9fc" -PV = "git${SRCPV}" - -S = "${WORKDIR}/git" 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 807e7b2de5..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 @@ -1,19 +1,28 @@ DESCRIPTION = "Pythonic DBus library" HOMEPAGE = "https://pypi.python.org/pypi/pydbus/" -LICENSE = "LGPLv2.1" +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.4.bb b/meta-python/recipes-devtools/python/python3-pydicti_1.2.1.bb index 29ad30e0f5..2363c29059 100644 --- a/meta-python/recipes-devtools/python/python3-pydicti_1.1.4.bb +++ b/meta-python/recipes-devtools/python/python3-pydicti_1.2.1.bb @@ -3,7 +3,6 @@ HOMEPAGE = "https://github.com/coldfix/pydicti" LICENSE = "WTFPL" LIC_FILES_CHKSUM = "file://COPYING;md5=389a9e29629d1f05e115f8f05c283df5" -SRC_URI[md5sum] = "c8925e333a78766cb469c1626880bd35" -SRC_URI[sha256sum] = "dcea4d1892fc68ca62aba835b1ed444a1eb48bd0cca0b4599efd45cbb6272b5c" +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 new file mode 100644 index 0000000000..4c279bbcda --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyfanotify/0001-ext-define-FNM_EXTMATCH-if-not-already-defined.patch @@ -0,0 +1,29 @@ +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. + +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 fb33de1..fa01a81 100644 +--- a/src/ext.c ++++ b/src/ext.c +@@ -19,6 +19,9 @@ + #include <sys/vfs.h> + #include <unistd.h> + ++#ifndef FNM_EXTMATCH ++#define FNM_EXTMATCH 0 ++#endif + + #define FUNUSED __attribute__((unused)) + diff --git a/meta-python/recipes-devtools/python/python3-pyfanotify_0.2.2.bb b/meta-python/recipes-devtools/python/python3-pyfanotify_0.2.2.bb new file mode 100644 index 0000000000..292ceab2e3 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyfanotify_0.2.2.bb @@ -0,0 +1,17 @@ +SUMMARY = "Python wrapper for Linux fanotify." +HOMEPAGE = "https://github.com/baskiton/pyfanotify" +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] = "90219aa9f8b78fa732f24aa7b21c7bb6ac97a6eb47f1763c899b8194e23af1df" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-crypt \ + python3-datetime \ + python3-logging \ + python3-multiprocessing \ +" 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 c6e95eb525..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 @@ -3,8 +3,8 @@ LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=84ddcef430b7c44caa22b2ff4b37a3df" PYPI_PACKAGE = "pyFirmata" -RDEPENDS_${PN} = "\ - ${PYTHON_PN}-pyserial \ +RDEPENDS:${PN} = "\ + python3-pyserial \ " SRC_URI[md5sum] = "159673cfb56c72ceafc30fe91eedd847" diff --git a/meta-python/recipes-devtools/python/python3-pyflakes_2.3.1.bb b/meta-python/recipes-devtools/python/python3-pyflakes_2.3.1.bb deleted file mode 100644 index 69680ddcba..0000000000 --- a/meta-python/recipes-devtools/python/python3-pyflakes_2.3.1.bb +++ /dev/null @@ -1,15 +0,0 @@ -SUMMARY = "passive checker of Python programs" -HOMEPAGE = "https://github.com/dreamhost/cliff" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=690c2d09203dc9e07c4083fc45ea981f" - -SRC_URI[sha256sum] = "f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db" - -inherit pypi setuptools3 - -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-prettytable \ - ${PYTHON_PN}-cmd2 \ - ${PYTHON_PN}-pyparsing" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pyflakes_3.2.0.bb b/meta-python/recipes-devtools/python/python3-pyflakes_3.2.0.bb new file mode 100644 index 0000000000..b7ee20ebe4 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyflakes_3.2.0.bb @@ -0,0 +1,10 @@ +SUMMARY = "passive checker of Python programs" +HOMEPAGE = "https://github.com/PyCQA/pyflakes" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=690c2d09203dc9e07c4083fc45ea981f" + +SRC_URI[sha256sum] = "1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f" + +inherit pypi setuptools3 + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pyhamcrest_2.0.2.bb b/meta-python/recipes-devtools/python/python3-pyhamcrest_2.0.2.bb deleted file mode 100644 index 59d9b5e8b3..0000000000 --- a/meta-python/recipes-devtools/python/python3-pyhamcrest_2.0.2.bb +++ /dev/null @@ -1,13 +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" - -PYPI_PACKAGE = "PyHamcrest" - -SRC_URI[md5sum] = "7a086f0b067f8d38958ec32f054559b4" -SRC_URI[sha256sum] = "412e00137858f04bde0729913874a48485665f2d36fe9ee449f26be864af9316" - -inherit pypi setuptools3 - -RDEPENDS_${PN} += "${PYTHON_PN}-six" 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_0.0.11.bb b/meta-python/recipes-devtools/python/python3-pyiface_0.0.11.bb index 3022d08343..b5bd89de76 100644 --- a/meta-python/recipes-devtools/python/python3-pyiface_0.0.11.bb +++ b/meta-python/recipes-devtools/python/python3-pyiface_0.0.11.bb @@ -1,11 +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/" -LICENSE = "GPLv3+" +SECTION = "devel/python" +LICENSE = "GPL-3.0-or-later" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=4fe869ee987a340198fb0d54c55c47f1" -SRC_URI[md5sum] = "b066aa984656742738127c9c75436ab4" +DEPENDS += "python3-setuptools-scm-native" + SRC_URI[sha256sum] = "e231e5735d329c5b2d4fc8854f069fdaa5436d3ef91ed64ee49e41e3f5e8a3f5" inherit pypi setuptools3 + +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 049c3c3cf7..0000000000 --- a/meta-python/recipes-devtools/python/python3-pyinotify_0.9.6.bb +++ /dev/null @@ -1,17 +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}-io \ - ${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 520899b8e6..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.0.1.bb b/meta-python/recipes-devtools/python/python3-pyjwt_2.8.0.bb index ed52da4d4a..92a8f44c6b 100644 --- a/meta-python/recipes-devtools/python/python3-pyjwt_2.0.1.bb +++ b/meta-python/recipes-devtools/python/python3-pyjwt_2.8.0.bb @@ -3,13 +3,16 @@ DESCRIPTION = "A Python implementation of JSON Web Token draft 32.\ Original implementation was written by https://github.com/progrium" HOMEPAGE = "http://github.com/jpadilla/pyjwt" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=68626705a7b513ca8d5f44a3e200ed0c" +LIC_FILES_CHKSUM = "file://LICENSE;md5=e4b56d2c9973d8cf54655555be06e551" -SRC_URI[sha256sum] = "a5c70a06e1f33d81ef25eecd50d50bd30e34de1ca8b2b9fa3fe0daaabcf69bf7" +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 4d4d2b79cf..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 @@ -10,10 +10,11 @@ PYPI_PACKAGE = "pykwalify" inherit setuptools3 pypi -RDEPENDS_${PN} = "\ - ${PYTHON_PN}-docopt \ - ${PYTHON_PN}-dateutil \ - ${PYTHON_PN}-ruamel-yaml \ +RDEPENDS:${PN} = "\ + 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_1.8.3.bb b/meta-python/recipes-devtools/python/python3-pylint_1.8.3.bb deleted file mode 100644 index 7a873a1e12..0000000000 --- a/meta-python/recipes-devtools/python/python3-pylint_1.8.3.bb +++ /dev/null @@ -1,38 +0,0 @@ -SUMMARY="Pylint is a Python source code analyzer" -HOMEPAGE= "http://www.pylint.org/" -LICENSE = "GPLv2" -LIC_FILES_CHKSUM = "file://COPYING;md5=4325afd396febcb659c36b49533135d4" - -SRC_URI[md5sum] = "2eb5f3cb8fe567eaf5420dd415012202" -SRC_URI[sha256sum] = "c77311859e0c2d7932095f30d2b1bfdc4b6fe111f534450ba727a52eae330ef2" - -inherit pypi setuptools3 python3-dir - -DEPENDS += "${PYTHON_PN}-pytest-runner-native" - -do_install_append(){ - rm ${D}${bindir}/pylint - cat >> ${D}${bindir}/pylint <<EOF -#!/usr/bin/env ${PYTHON_PN} -from pylint import run_pylint -run_pylint() -EOF - chmod 755 ${D}${bindir}/pylint - sed -i -e 's:^#!/usr/bin/python:#!/usr/bin/env\ ${PYTHON_PN}:g' ${D}/${PYTHON_SITEPACKAGES_DIR}/pylint/test/data/ascript -} - -PACKAGES =+ "${PN}-tests" -FILES_${PN}-tests+= " \ - ${PYTHON_SITEPACKAGES_DIR}/pylint/test/ \ - ${PYTHON_SITEPACKAGES_DIR}/pylint/testutils.py \ -" - -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.12.0.bb b/meta-python/recipes-devtools/python/python3-pymetno_0.12.0.bb new file mode 100644 index 0000000000..5be6e6319b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pymetno_0.12.0.bb @@ -0,0 +1,16 @@ +SUMMARY = "Python library to talk to the met.no api" +HOMEPAGE = "https://github.com/Danielhiversen/pyMetno" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=5d503272f52c35147ec960cb56a03bf4" + +SRC_URI = "git://github.com/Danielhiversen/pyMetno.git;protocol=https;branch=master" +SRCREV = "50f427aad264a4793abb94a3c8cbf987fadcd4ae" +S = "${WORKDIR}/git" + +inherit setuptools3 + +RDEPENDS:${PN} = "\ + 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.141.1.bb b/meta-python/recipes-devtools/python/python3-pymisp_2.4.141.1.bb deleted file mode 100644 index df6f1c762d..0000000000 --- a/meta-python/recipes-devtools/python/python3-pymisp_2.4.141.1.bb +++ /dev/null @@ -1,22 +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 = "62cd5173f087e88834e88472060181b681b0b4d2" -S = "${WORKDIR}/git" - -inherit setuptools3 - -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-dateutil \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-jsonschema \ - ${PYTHON_PN}-requests \ - ${PYTHON_PN}-six \ -" - -# 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.188.bb b/meta-python/recipes-devtools/python/python3-pymisp_2.4.188.bb new file mode 100644 index 0000000000..59a00be154 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pymisp_2.4.188.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] = "c2313d059a9f4d1221243fcda64fb8ae11603c1745e92d57c4071aad04336696" + +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_3.6.7.bb b/meta-python/recipes-devtools/python/python3-pymodbus_3.6.7.bb new file mode 100644 index 0000000000..323377253e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pymodbus_3.6.7.bb @@ -0,0 +1,31 @@ +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=eba8057aa82c058d2042b4b0a0e9cc63" + +SRC_URI[sha256sum] = "e6cefac57f8d0e887ef49a705743787d8f1f005df94bd148e3da43c2599c77f3" + +inherit pypi python_setuptools_build_meta + +PACKAGECONFIG ??= "" +PACKAGECONFIG[repl] = ",,,python3-aiohttp python3-click python3-prompt-toolkit python3-pygments python3-pyserial-asyncio" +PACKAGECONFIG[asyncio] = ",,,python3-pyserial-asyncio" +PACKAGECONFIG[tornado] = ",,,python3-tornado" +PACKAGECONFIG[twisted] = ",,,python3-twisted-conch" +PACKAGECONFIG[redis] = ",,,python3-redis" +PACKAGECONFIG[sql] = ",,,python3-sqlalchemy" + +RDEPENDS:${PN} += " \ + python3-asyncio \ + python3-core \ + python3-io \ + python3-json \ + python3-logging \ + python3-math \ + python3-netserver \ +" + +RDEPENDS:${PN} += " \ + python3-pyserial \ + python3-six \ +" diff --git a/meta-python/recipes-devtools/python/python3-pymongo_3.11.3.bb b/meta-python/recipes-devtools/python/python3-pymongo_4.6.1.bb index 3549adce7c..260e134cd2 100644 --- a/meta-python/recipes-devtools/python/python3-pymongo_3.11.3.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] = "db5098587f58fbf8582d9bda2462762b367207246d3e19623782fb449c3c5fcc" +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 \ +RDEPENDS:${PN} += " \ + 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 36e2921ae6..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.4.0.bb b/meta-python/recipes-devtools/python/python3-pynacl_1.5.0.bb index 6fd42ebf81..a2f2ab4df4 100644 --- a/meta-python/recipes-devtools/python/python3-pynacl_1.4.0.bb +++ b/meta-python/recipes-devtools/python/python3-pynacl_1.5.0.bb @@ -4,29 +4,35 @@ HOMEPAGE = "https://github.com/pyca/pynacl" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=8cc789b082b3d97e1ccc5261f8594d3f" -SRC_URI[md5sum] = "8c6c57893327a694c72510fb620e4744" -SRC_URI[sha256sum] = "54e9a2c849c742006516ad56a88f5c74bf2ce92c9f67435187c3c5953b346505" +SRC_URI[sha256sum] = "8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba" PYPI_PACKAGE = "PyNaCl" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta DEPENDS += "\ - ${PYTHON_PN}-wheel-native \ - ${PYTHON_PN}-cffi-native \ + python3-cffi-native \ libsodium \ " -RDEPENDS_${PN} = "\ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-cffi \ - libsodium \ -" - -do_compile_prepend() { +do_compile:prepend() { export SODIUM_INSTALL=system } -do_install_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/0001-setup.py-switch-to-setuptools.patch b/meta-python/recipes-devtools/python/python3-pynetlinux/0001-setup.py-switch-to-setuptools.patch new file mode 100644 index 0000000000..35bc4a6bd1 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pynetlinux/0001-setup.py-switch-to-setuptools.patch @@ -0,0 +1,32 @@ +From a36abadfb2d135260bef7703a1d0b56e6aa7eeff Mon Sep 17 00:00:00 2001 +From: Tim Orling <tim.orling@konsulko.com> +Date: Mon, 28 Feb 2022 08:21:33 -0800 +Subject: [PATCH] setup.py: switch to setuptools + +In Python 3.10, 'distutils' has been deprecated and is slated for +removal in Python 3.12. + +Switch from 'distutils.core' to 'setuptools'. This also allows for the +'wheel' binary archive format to be built with 'setup.py bdist_wheel'. + +Upstream-Status: Submitted +[https://github.com/rlisagor/pynetlinux/pull/12] + +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 670e064..45f1053 100755 +--- a/setup.py ++++ b/setup.py +@@ -1,4 +1,4 @@ +-from distutils.core import setup ++from setuptools import setup + + setup( + name = "pynetlinux", +-- +2.30.2 + 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 c80a166177..b1abac17aa 100644 --- a/meta-python/recipes-devtools/python/python3-pynetlinux_1.1.bb +++ b/meta-python/recipes-devtools/python/python3-pynetlinux_1.1.bb @@ -5,7 +5,17 @@ HOMEPAGE = "http://github.com/rlisagor/pynetlinux" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=74e1861736ee959824fe7542323c12e9" -SRC_URI[md5sum] = "3336e5d4a478acca4e35bf3125b4f883" SRC_URI[sha256sum] = "4ad08298c9f5ba15a11cddc639ba8778cabdfc402b51066d9e0a325e5a5b391c" +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-pyopenssl_20.0.1.bb b/meta-python/recipes-devtools/python/python3-pyopenssl_20.0.1.bb deleted file mode 100644 index e121ef8444..0000000000 --- a/meta-python/recipes-devtools/python/python3-pyopenssl_20.0.1.bb +++ /dev/null @@ -1,23 +0,0 @@ -SUMMARY = "Simple Python wrapper around the OpenSSL library" -HOMEPAGE = "https://pyopenssl.org/" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57" - -DEPENDS += "openssl ${PYTHON_PN}-cryptography" - -SRC_URI[sha256sum] = "4c231c759543ba02560fcd2480c48dcec4dae34c9da7d3747c508227e0624b51" - -PYPI_PACKAGE = "pyOpenSSL" -inherit pypi setuptools3 - -PACKAGES =+ "${PN}-tests" -FILES_${PN}-tests = "${libdir}/${PYTHON_DIR}/site-packages/OpenSSL/test" - -RDEPENDS_${PN}_class-target = " \ - ${PYTHON_PN}-cryptography \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-threading \ -" -RDEPENDS_${PN}-tests = "${PN}" - -BBCLASSEXTEND = "native nativesdk" 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 142d075493..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 @@ -1,14 +1,14 @@ DESCRIPTION = "A cross-platform clipboard module for Python. (only handles plain text for now)" HOMEPAGE = "https://github.com/asweigart/pyperclip" -LICENSE = "BSD" +LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=d7dd4b0d1f7153322a546e89b5a0a632" SRC_URI[sha256sum] = "105254a8b04934f0bc84e9c24eb360a591aaf6535c9def5f29d92af107a9bf57" inherit pypi setuptools3 -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-ctypes \ +RDEPENDS:${PN} += " \ + python3-ctypes \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pyperf_2.2.0.bb b/meta-python/recipes-devtools/python/python3-pyperf_2.6.3.bb index 70676b05f3..6b37e1864a 100644 --- a/meta-python/recipes-devtools/python/python3-pyperf_2.2.0.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] = "498bb4d1fe21350c2b7c1aa8bb3eae9c9979358d0b66327954bc66839fcba8b6" +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" +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.6.1.bb b/meta-python/recipes-devtools/python/python3-pyproj_3.6.1.bb new file mode 100644 index 0000000000..a4121c3934 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyproj_3.6.1.bb @@ -0,0 +1,23 @@ +SUMMARY = "Python interface to PROJ (cartographic projections and coordinate transformations library)" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=873757af01d2d221eedb422c4c1dd163" +DEPENDS = "python3-cython proj" +DEPENDS:append:class-target = " python3-cython-native proj-native" + +PYPI_PACKAGE = "pyproj" + +inherit pypi setuptools3 + +SRC_URI[sha256sum] = "44aa7c704c2b7d8fb3d483bbf75af6cb2350d30a63b144279a09b75fead501bf" + +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/use-poetry-core.patch b/meta-python/recipes-devtools/python/python3-pyrad/use-poetry-core.patch new file mode 100644 index 0000000000..43a177da0a --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyrad/use-poetry-core.patch @@ -0,0 +1,26 @@ +Upstream-Status: Backport [https://github.com/pyradius/pyrad/commit/ffe182a44909e8f8278fb3e2ea052ddc097b48b9] +Signed-off-by: Ross Burton <ross.burton@arm.com> + +From a4b70067dd6269e14a2f9530d820390a8a454231 Mon Sep 17 00:00:00 2001 +From: Martin Weinelt <hexa@darmstadt.ccc.de> +Date: Thu, 14 Apr 2022 22:07:37 +0200 +Subject: [PATCH] Use poetry-core for pyproject based builds + +https://github.com/python-poetry/poetry-core#why-is-this-required +--- + pyproject.toml | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/pyproject.toml b/pyproject.toml +index 87b1df3..711c52f 100755 +--- a/pyproject.toml ++++ b/pyproject.toml +@@ -1,6 +1,6 @@ + [build-system] +-requires = ["poetry>=1.0"] +-build-backend = "poetry.masonry.api" ++requires = ["poetry-core>=1.0.0"] ++build-backend = "poetry.core.masonry.api" + + [tool.poetry] + name = "pyrad" 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 86a95a4aa4..801233a026 100644 --- a/meta-python/recipes-devtools/python/python3-pyrad_2.4.bb +++ b/meta-python/recipes-devtools/python/python3-pyrad_2.4.bb @@ -6,4 +6,14 @@ LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e910b35b0ef4e1f665 PYPI_PACKAGE = "pyrad" SRC_URI[sha256sum] = "057de4b7e89d8da57ba782c1bde45c63ebee720ae2c0b0a69beaff15c47e30d9" -inherit pypi setuptools3 +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.17.bb b/meta-python/recipes-devtools/python/python3-pyroute2_0.5.17.bb deleted file mode 100644 index 1d3d5a253a..0000000000 --- a/meta-python/recipes-devtools/python/python3-pyroute2_0.5.17.bb +++ /dev/null @@ -1,36 +0,0 @@ -SUMMARY = "A pure Python netlink and Linux network configuration library" -LICENSE = "GPLv2 & Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE.GPL.v2;md5=b234ee4d69f5fce4486a80fdaf4a4263 \ - file://LICENSE.Apache.v2;md5=34281e312165f843a2b7d1f114fe65ce" - -SRC_URI[sha256sum] = "12d51066ea5628a6fa76fc244f301a8eea5d25d71a9d664016976edfa3889733" - -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-pyrsistent_0.17.3.bb b/meta-python/recipes-devtools/python/python3-pyrsistent_0.17.3.bb deleted file mode 100644 index 72736c8917..0000000000 --- a/meta-python/recipes-devtools/python/python3-pyrsistent_0.17.3.bb +++ /dev/null @@ -1,15 +0,0 @@ -SUMMARY = "Persistent/Immutable/Functional data structures for Python" -HOMEPAGE = "https://github.com/tobgu/pyrsistent" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENCE.mit;md5=ca574f2891cf528b3e7a2ee570337e7c" - -SRC_URI[md5sum] = "cd38658ea772a7f9b12b6f9485a7018b" -SRC_URI[sha256sum] = "2e636185d9eb976a18a8a8e96efce62f2905fea90041958d8cc2a189756ebf3e" - -inherit pypi setuptools3 - -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-numbers \ -" - -BBCLASSEXTEND = "native nativesdk" 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 new file mode 100644 index 0000000000..3f8256b027 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyruvate/0001-check-for-mips-targets-for-stat.st_dev-definitions.patch @@ -0,0 +1,47 @@ +From 56984b19469ff5b69b8b8e180dc75cf825bb1123 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Tue, 25 Jan 2022 22:28:11 -0800 +Subject: [PATCH] check for mips targets for stat.st_dev definitions + +st_dev has wrong type in glibc when using mips/O32 ABI +its type should be dev_t but it is set to unsigned long int +this is specific issue on mips/o32 ABI in glibc for details + +See +https://sourceware.org/bugzilla/show_bug.cgi?id=17786 + +currently the build fails on mips archirecture with type mismatches + + Fixes + error[E0308]: mismatched types +* --> /usr/src/debug/python3-pyruvate/1.1.2-r0/cargo_home/bitbake/libsystemd-0.4.1/src/logging.rs:296:25 + | + 296 | device: stat.st_dev, + | ^^^^^^^^^^^ expected `u64`, found `u32` + +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 +++ + 1 file changed, 3 insertions(+) + +diff --git a/src/logging.rs b/src/logging.rs +index a68c36a..6e374ae 100644 +--- a/src/logging.rs ++++ b/src/logging.rs +@@ -292,7 +292,10 @@ impl JournalStream { + pub fn from_fd<F: AsRawFd>(fd: F) -> std::io::Result<Self> { + nix::sys::stat::fstat(fd.as_raw_fd()) + .map(|stat| JournalStream { ++ #[cfg(not(target_arch = "mips"))] + device: stat.st_dev, ++ #[cfg(target_arch = "mips")] ++ device: stat.st_dev as u64, + inode: stat.st_ino, + }) + .map_err(std::io::Error::from) +-- +2.35.0 + diff --git a/meta-python/recipes-devtools/python/python3-pyruvate/0001-linux.rs-Define-consts-for-rv32-architecture.patch b/meta-python/recipes-devtools/python/python3-pyruvate/0001-linux.rs-Define-consts-for-rv32-architecture.patch new file mode 100644 index 0000000000..a2d4091a95 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyruvate/0001-linux.rs-Define-consts-for-rv32-architecture.patch @@ -0,0 +1,26 @@ +From 3a3bd8475f93d54cb5bb62d239247fef2e03a733 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Sat, 5 Mar 2022 00:37:01 -0800 +Subject: [PATCH] linux.rs: Define consts for rv32 architecture + +Upstream-Status: Submitted [https://github.com/nix-rust/nix/pull/1669] +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + src/sys/ioctl/linux.rs | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/sys/ioctl/linux.rs b/src/sys/ioctl/linux.rs +index 68ebaba..08cd0c3 100644 +--- a/src/sys/ioctl/linux.rs ++++ b/src/sys/ioctl/linux.rs +@@ -34,6 +34,7 @@ mod consts { + target_arch = "s390x", + target_arch = "x86_64", + target_arch = "aarch64", ++ target_arch = "riscv32", + target_arch = "riscv64"))] + mod consts { + #[doc(hidden)] +-- +2.35.1 + 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.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.0.1.bb b/meta-python/recipes-devtools/python/python3-pyscaffold_4.5.bb index b0f8f3e9fb..dda81e2256 100644 --- a/meta-python/recipes-devtools/python/python3-pyscaffold_4.0.1.bb +++ b/meta-python/recipes-devtools/python/python3-pyscaffold_4.5.bb @@ -5,13 +5,18 @@ used to create template Projects." HOMEPAGE = "https://github.com/pyscaffold/pyscaffold" SECTION = "devel/python" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=8227180126797a0148f94f483f3e1489" +LICENSE = "0BSD & MIT" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=14a49c74a1d91829908ac756c07e6b91" +DEPENDS += "python3-setuptools-scm-native" -inherit pypi setuptools3 +SRC_URI[sha256sum] = "d849f9a2e15bdcf165e19f96835f0b17e1a2d59d4c561c445b827a081de6d262" +inherit pypi python_setuptools_build_meta PYPI_PACKAGE = "PyScaffold" -SRC_URI[sha256sum] = "8fd7b2bdbfc7f7758a66d66cbf796af338e40d69fd4f7b4ddb9996c38add1dbe" +RDEPENDS:${PN} += " \ + python3-email \ + python3-compression \ +" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pyserial-asyncio_0.6.bb b/meta-python/recipes-devtools/python/python3-pyserial-asyncio_0.6.bb new file mode 100644 index 0000000000..30ff62a7ed --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyserial-asyncio_0.6.bb @@ -0,0 +1,10 @@ +SUMMARY = "Python Serial Port Extension - Asynchronous I/O support" +HOMEPAGE = "https://github.com/pyserial/pyserial-asyncio" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=9a79418f241689e78034391d51162d24" + +SRC_URI[sha256sum] = "b6032923e05e9d75ec17a5af9a98429c46d2839adfaf80604d52e0faacd7a32f" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-asyncio python3-core python3-pyserial" 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 4be80e28cd..ade137a385 100644 --- a/meta-python/recipes-devtools/python/python3-pyserial_3.5.bb +++ b/meta-python/recipes-devtools/python/python3-pyserial_3.5.bb @@ -6,25 +6,26 @@ SRC_URI[sha256sum] = "3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b49 inherit pypi setuptools3 ptest -do_install_append() { +do_install:append() { rm -f ${D}${bindir}/pyserial-miniterm rm -f ${D}${bindir}/pyserial-ports + rm -rf ${D}${bindir}/__pycache__ rmdir ${D}${bindir} } PACKAGES =+ "${PN}-java ${PN}-osx ${PN}-win32 ${PN}-tools" -FILES_${PN}-java = " \ +FILES:${PN}-java = " \ ${PYTHON_SITEPACKAGES_DIR}/serial/*java* \ ${PYTHON_SITEPACKAGES_DIR}/serial/__pycache__/*java* \ " -FILES_${PN}-osx = " \ +FILES:${PN}-osx = " \ ${PYTHON_SITEPACKAGES_DIR}/serial/tools/*osx* \ ${PYTHON_SITEPACKAGES_DIR}/serial/tools/__pycache__/*osx* \ " -FILES_${PN}-win32 = " \ +FILES:${PN}-win32 = " \ ${PYTHON_SITEPACKAGES_DIR}/serial/*serialcli* \ ${PYTHON_SITEPACKAGES_DIR}/serial/__pycache__/*serialcli* \ ${PYTHON_SITEPACKAGES_DIR}/serial/*win32* \ @@ -35,15 +36,15 @@ FILES_${PN}-win32 = " \ ${PYTHON_SITEPACKAGES_DIR}/serial/tools/__pycache__/*windows* \ " -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 \ +RDEPENDS:${PN} = "\ + python3-fcntl \ + python3-io \ + python3-logging \ + python3-netclient \ + python3-numbers \ + python3-shell \ + python3-stringold \ + python3-threading \ " BBCLASSEXTEND = "native nativesdk" @@ -52,8 +53,9 @@ SRC_URI += " \ file://run-ptest \ " -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-pysocks_1.7.1.bb b/meta-python/recipes-devtools/python/python3-pysocks_1.7.1.bb deleted file mode 100644 index d0db8a0636..0000000000 --- a/meta-python/recipes-devtools/python/python3-pysocks_1.7.1.bb +++ /dev/null @@ -1,20 +0,0 @@ -DESCRIPTION = "A Python SOCKS client module" -HOMEPAGE = "http://python-requests.org" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=1d457bcffb9661b45f799d4efee72f16" - -SRC_URI[md5sum] = "89b1a6865c61bae67a32417517612ee6" -SRC_URI[sha256sum] = "3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0" - -PYPI_PACKAGE = "PySocks" -inherit pypi setuptools3 - -RDEPENDS_${PN}_class-target += "\ - ${PYTHON_PN}-email \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-shell \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pysonos_0.0.42.bb b/meta-python/recipes-devtools/python/python3-pysonos_0.0.54.bb index 25defabc51..6a484b8ae9 100644 --- a/meta-python/recipes-devtools/python/python3-pysonos_0.0.42.bb +++ b/meta-python/recipes-devtools/python/python3-pysonos_0.0.54.bb @@ -4,12 +4,12 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=07b0e2ca9ac77cd65cd4edf2e13367ea" -SRC_URI[sha256sum] = "20b45fa1779a01325e67822d243e1a3f7657d8b515308d84c1eb3c805cc3bdb5" +SRC_URI[sha256sum] = "2a72897cfd342382573632d80d38776884a38c8d02353d9d5da4e9e8e83cb42b" inherit pypi setuptools3 -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-ifaddr \ - ${PYTHON_PN}-requests \ - ${PYTHON_PN}-xmltodict \ +RDEPENDS:${PN} += "\ + python3-ifaddr \ + python3-requests \ + python3-xmltodict \ " diff --git a/meta-python/recipes-devtools/python/python3-pystache_0.5.4.bb b/meta-python/recipes-devtools/python/python3-pystache_0.5.4.bb deleted file mode 100644 index feb4986109..0000000000 --- a/meta-python/recipes-devtools/python/python3-pystache_0.5.4.bb +++ /dev/null @@ -1,15 +0,0 @@ -SUMMARY = "Python implementation of Mustache" -HOMEPAGE = "https://github.com/defunkt/pystache" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=eb4417802c56384aac71b34505528a60" - -SRC_URI[md5sum] = "485885e67a0f6411d5252e69b20a35ca" -SRC_URI[sha256sum] = "f7bbc265fb957b4d6c7c042b336563179444ab313fb93a719759111eabd3b85a" - -inherit pypi setuptools3 - -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-netserver \ -" - -BBCLASSEXTEND = "native nativesdk" 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-pystemd_0.8.0.bb b/meta-python/recipes-devtools/python/python3-pystemd_0.8.0.bb deleted file mode 100644 index 6f302fa52f..0000000000 --- a/meta-python/recipes-devtools/python/python3-pystemd_0.8.0.bb +++ /dev/null @@ -1,14 +0,0 @@ -SUMMARY = "Python bindings for interacting with systemd over DBus" -LICENSE = "LGPLv2.1" -LIC_FILES_CHKSUM = "file://LICENSE;md5=4fbd65380cdd255951079008b364516c" - -SRC_URI[md5sum] = "f993739eca645749f18d4ccfd4a0fbf3" -SRC_URI[sha256sum] = "cac2e42043ab28d43adf33dab493c6a3cf8a99794f824ae8af6d9cd6458b9972" - -DEPENDS = "systemd" -RDEPENDS_${PN} += "python3-xml python3-pprint" -REQUIRED_DISTRO_FEATURES = "systemd" - -inherit pypi setuptools3 features_check - -BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-pytest-asyncio_0.14.0.bb b/meta-python/recipes-devtools/python/python3-pytest-asyncio_0.14.0.bb deleted file mode 100644 index 1e94c25f7e..0000000000 --- a/meta-python/recipes-devtools/python/python3-pytest-asyncio_0.14.0.bb +++ /dev/null @@ -1,15 +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[md5sum] = "b63593bc08f445f6e3f14c34128a68ed" -SRC_URI[sha256sum] = "9882c0c6b24429449f5f969a5158b528f39bde47dc32e85b9f0403965017e700" - -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_4.0.0.bb b/meta-python/recipes-devtools/python/python3-pytest-benchmark_4.0.0.bb new file mode 100644 index 0000000000..98ba6c3822 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pytest-benchmark_4.0.0.bb @@ -0,0 +1,12 @@ +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=c7d2e9d24c2b5bad57ca894da972e22e" + +SRC_URI[sha256sum] = "fb0785b83efe599a6a956361c0691ae1dbb5318018561af10f3e915caa0048d1" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-core python3-py-cpuinfo python3-pytest python3-aspectlib" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pytest-cache_1.0.bb b/meta-python/recipes-devtools/python/python3-pytest-cache_1.0.bb new file mode 100644 index 0000000000..5338ffdd29 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pytest-cache_1.0.bb @@ -0,0 +1,15 @@ +# Copyright (C) 2021 Khem Raj <raj.khem@gmail.com> +# Released under the MIT license (see COPYING.MIT for the terms) + +SUMMARY = "pytest plugin with mechanisms for caching across test runs" +HOMEPAGE = "http://bitbucket.org/hpk42/pytest-cache/" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=a6bb0320b04a0a503f12f69fea479de9" + +SRC_URI[sha256sum] = "be7468edd4d3d83f1e844959fd6e3fd28e77a481440a7118d430130ea31b07a9" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-core python3-execnet python3-pprint python3-py python3-pytest" + +BBCLASSEXTEND = "native nativesdk" 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.6.0.bb b/meta-python/recipes-devtools/python/python3-pytest-forked_1.6.0.bb new file mode 100644 index 0000000000..f573bf0523 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pytest-forked_1.6.0.bb @@ -0,0 +1,17 @@ +SUMMARY = "run tests in isolated forked subprocesses" +HOMEPAGE = "https://github.com/pytest-dev/pytest-forked" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=772fcdaca14b378878d05c7d857e6c3e" + +SRC_URI[sha256sum] = "4dafd46a9a600f65d822b8f605133ecf5b3e1941ebb3588e943b4e3eb71a5a3f" + +inherit pypi python_setuptools_build_meta + +PEP517_BUILD_OPTS = "--skip-dependency-check" + +DEPENDS += "python3-setuptools-scm-native" + +RDEPENDS:${PN} += " \ + python3-py \ + python3-pytest \ +" diff --git a/meta-python/recipes-devtools/python/python3-pytest-helpers-namespace_2021.3.24.bb b/meta-python/recipes-devtools/python/python3-pytest-helpers-namespace_2021.12.29.bb index 9211ac3940..6698b6dde3 100644 --- a/meta-python/recipes-devtools/python/python3-pytest-helpers-namespace_2021.3.24.bb +++ b/meta-python/recipes-devtools/python/python3-pytest-helpers-namespace_2021.12.29.bb @@ -4,15 +4,12 @@ SECTION = "devel/python" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=440a4cdb311cd7ad181efb4cba06d562" -SRC_URI[sha256sum] = "188df5a7c52390fa27d6cd2f18e74d64a2ef0b9fb6e12f15fdf5a95f4813d25f" +SRC_URI[sha256sum] = "792038247e0021beb966a7ea6e3a70ff5fcfba77eb72c6ec8fd6287af871c35b" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta -DEPENDS += "\ - ${PYTHON_PN}-wheel-native \ - ${PYTHON_PN}-pip-native \ -" +DEPENDS += "python3-setuptools-scm-native python3-setuptools-declarative-requirements-native" -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-pytest \ +RDEPENDS:${PN} += " \ + python3-pytest \ " 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 bd543d2f09..0000000000 --- a/meta-python/recipes-devtools/python/python3-pytest-html_3.1.1.bb +++ /dev/null @@ -1,18 +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 setuptools3 - -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-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_1.11.0.bb b/meta-python/recipes-devtools/python/python3-pytest-metadata_2.0.2.bb index a1b62d16e4..163a363f82 100644 --- a/meta-python/recipes-devtools/python/python3-pytest-metadata_1.11.0.bb +++ b/meta-python/recipes-devtools/python/python3-pytest-metadata_2.0.2.bb @@ -1,17 +1,17 @@ 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" -SRC_URI[sha256sum] = "71b506d49d34e539cc3cfdb7ce2c5f072bea5c953320002c95968e0238f8ecf1" +SRC_URI[sha256sum] = "fcd2f416f15be295943527b3c8ba16a44ae5a7141939c90c3dc5ce9d167cf2a5" PYPI_PACKAGE = "pytest-metadata" inherit pypi setuptools3 -RDEPENDS_${PN} = " \ - ${PYTHON_PN}-pytest \ +RDEPENDS:${PN} = " \ + 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-runner_5.3.0.bb b/meta-python/recipes-devtools/python/python3-pytest-runner_5.3.0.bb deleted file mode 100644 index 35f6c6c0a0..0000000000 --- a/meta-python/recipes-devtools/python/python3-pytest-runner_5.3.0.bb +++ /dev/null @@ -1,15 +0,0 @@ -SUMMARY = "Invoke py.test as distutils command with dependency resolution" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=7a7126e068206290f3fe9f8d6c713ea6" - -SRC_URI[sha256sum] = "ca3f58ff4957e8be6c54c55d575b235725cbbcf4dc0d5091c29c6444cfc8a5fe" - -inherit pypi setuptools3 - -DEPENDS += " \ - ${PYTHON_PN}-setuptools-scm-native" - -RDEPENDS_${PN} = "${PYTHON_PN}-py ${PYTHON_PN}-setuptools ${PYTHON_PN}-debugger ${PYTHON_PN}-json \ - ${PYTHON_PN}-io" - -BBCLASSEXTEND = "native nativesdk" 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 7a48fd520f..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 @@ -9,6 +9,6 @@ SRC_URI[sha256sum] = "e7d91813a9aa991db87dacdef8cfd3f1657632d731d56d06238c5ffb63 inherit pypi setuptools3 -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-pytest \ +RDEPENDS:${PN} += " \ + python3-pytest \ " diff --git a/meta-python/recipes-devtools/python/python3-pytest-timeout_1.4.2.bb b/meta-python/recipes-devtools/python/python3-pytest-timeout_2.3.1.bb index 906d67064e..b56c26aada 100644 --- a/meta-python/recipes-devtools/python/python3-pytest-timeout_1.4.2.bb +++ b/meta-python/recipes-devtools/python/python3-pytest-timeout_2.3.1.bb @@ -5,9 +5,8 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=d8048cd156eda3df2e7f111b0ae9ceff" PYPI_PACKAGE = "pytest-timeout" -SRC_URI[md5sum] = "552cc293447b00f7a294ce7a1fb3839f" -SRC_URI[sha256sum] = "20b3113cf6e4e80ce2d403b6fb56e9e1b871b510259206d40ff8d609f48bda76" +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_3.5.0.bb b/meta-python/recipes-devtools/python/python3-pytest-xdist_3.5.0.bb new file mode 100644 index 0000000000..89b5039571 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pytest-xdist_3.5.0.bb @@ -0,0 +1,17 @@ +SUMMARY = "pytest xdist plugin for distributed testing and loop-on-failing modes" +HOMEPAGE = "https://github.com/pytest-dev/pytest-xdist" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=772fcdaca14b378878d05c7d857e6c3e" + +SRC_URI[sha256sum] = "cbb36f3d67e0c478baa57fa4edc8843887e0f6cfc42d677530a36d7472b32d8a" + +inherit pypi python_setuptools_build_meta + +DEPENDS += "python3-setuptools-scm-native" + +# Note that the dependency on pytest-forked is scheduled to be dropped in 3.0 +RDEPENDS:${PN} += " \ + python3-execnet \ + python3-pytest \ + python3-pytest-forked \ +" diff --git a/meta-python/recipes-devtools/python/python3-python-vlc_3.0.12117.bb b/meta-python/recipes-devtools/python/python3-python-vlc_3.0.20123.bb index 5d9dde9d29..960da1437c 100644 --- a/meta-python/recipes-devtools/python/python3-python-vlc_3.0.12117.bb +++ b/meta-python/recipes-devtools/python/python3-python-vlc_3.0.20123.bb @@ -1,8 +1,13 @@ SUMMARY = "This module provides ctypes-based bindings for the native libvlc API of the VLC video player." HOMEPAGE = "wiki.videolan.org/PythonBinding" -LICENSE = "LGPL-2.0" +LICENSE = "LGPL-2.0-only" LIC_FILES_CHKSUM = "file://COPYING;md5=4fbd65380cdd255951079008b364516c" -SRC_URI[sha256sum] = "dd512f8438c1bba032fe9d22a7f8f98423a537992141ce2d1b28e29aff30381d" +SRC_URI[sha256sum] = "244fbb9e392a0326841fca926d6d12a2a36c546982191f493f148fa19e66b1d4" inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-ctypes \ + python3-logging \ +" diff --git a/meta-python/recipes-devtools/python/python3-pythonping_1.0.16.bb b/meta-python/recipes-devtools/python/python3-pythonping_1.1.4.bb index 5affb934ca..62f5c0caad 100644 --- a/meta-python/recipes-devtools/python/python3-pythonping_1.0.16.bb +++ b/meta-python/recipes-devtools/python/python3-pythonping_1.1.4.bb @@ -4,9 +4,8 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://setup.py;beginline=12;endline=12;md5=2d33c00f47720c7e35e1fdb4b9fab027" -SRC_URI[md5sum] = "9b505ad8a5b8a6a8e57ccf75098ea364" -SRC_URI[sha256sum] = "d025c8b25952580dea47bc241421e17a5a97f97f50098e1096dd10d845d0f156" +SRC_URI[sha256sum] = "acef84640fee6f20b725f2a1d2392771f2845554cfabcef30b1fdea5030161af" inherit pypi setuptools3 -RDEPENDS_${PN} += "python3-io" +RDEPENDS:${PN} += "python3-io" 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 1533a895f3..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 @@ -15,13 +15,14 @@ SRC_URI += " \ file://run-ptest \ " -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-stringold \ +RDEPENDS:${PN} += " \ + python3-datetime \ + python3-stringold \ " -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-pytz/run-ptest b/meta-python/recipes-devtools/python/python3-pytz/run-ptest deleted file mode 100644 index b63c4de0d9..0000000000 --- a/meta-python/recipes-devtools/python/python3-pytz/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-pytz_2021.1.bb b/meta-python/recipes-devtools/python/python3-pytz_2021.1.bb deleted file mode 100644 index cc4dfecfa3..0000000000 --- a/meta-python/recipes-devtools/python/python3-pytz_2021.1.bb +++ /dev/null @@ -1,36 +0,0 @@ -SUMMARY = "World timezone definitions, modern and historical" -HOMEPAGE = "http://pythonhosted.org/pytz" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=1a67fc46c1b596cce5d21209bbe75999" - -inherit pypi setuptools3 ptest - -SRC_URI[md5sum] = "8c849bdf95414fe708a84473e42d4406" -SRC_URI[sha256sum] = "83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da" - -RDEPENDS_${PN}_class-target += "\ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-doctest \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-pickle \ - ${PYTHON_PN}-pprint \ - ${PYTHON_PN}-threading \ -" - -BBCLASSEXTEND = "native nativesdk" - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ -" - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/pytz - install -d ${D}${PTEST_PATH}/pytz/tests - cp -rf ${S}/pytz/tests/* ${D}${PTEST_PATH}/pytz/tests/ - cp -f ${S}/README.rst ${D}${PTEST_PATH}/ - -} 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.22.0.bb b/meta-python/recipes-devtools/python/python3-pyudev_0.22.0.bb deleted file mode 100644 index 38c012843f..0000000000 --- a/meta-python/recipes-devtools/python/python3-pyudev_0.22.0.bb +++ /dev/null @@ -1,24 +0,0 @@ -SUMMARY = "A libudev binding" - -LICENSE = "LGPLv2.1+" -LIC_FILES_CHKSUM = "file://COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343" - -SRC_URI[sha256sum] = "69bb1beb7ac52855b6d1b9fe909eefb0017f38d917cba9939602c6880035b276" - -inherit pypi setuptools3 - -do_configure_prepend() { - sed -i "/import pyudev/d" ${S}/setup.py - sed -i "s/str(pyudev.__version__)/'${PV}'/g" ${S}/setup.py -} - -RDEPENDS_${PN} = "\ - ${PYTHON_PN}-ctypes \ - ${PYTHON_PN}-misc \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-threading \ - ${PYTHON_PN}-fcntl \ - libudev \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pyudev_0.24.1.bb b/meta-python/recipes-devtools/python/python3-pyudev_0.24.1.bb new file mode 100644 index 0000000000..ed5175fcf7 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyudev_0.24.1.bb @@ -0,0 +1,22 @@ +SUMMARY = "A libudev binding" + +LICENSE = "LGPL-2.1-or-later" +LIC_FILES_CHKSUM = "file://COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343" + +SRC_URI[sha256sum] = "75e54d37218f5ac45b0da1f0fd9cc5e526a3cac3ef1cfad410cf7ab338b01471" + +inherit pypi setuptools3 + +do_configure:prepend() { + sed -i "/import pyudev/d" ${S}/setup.py + sed -i "s/str(pyudev.__version__)/'${PV}'/g" ${S}/setup.py +} + +RDEPENDS:${PN} = "\ + python3-ctypes \ + python3-misc \ + python3-six \ + python3-threading \ + python3-fcntl \ + libudev \ +" 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.1.1.bb b/meta-python/recipes-devtools/python/python3-pyusb_1.2.1.bb index a8c7031b65..2282e0300b 100644 --- a/meta-python/recipes-devtools/python/python3-pyusb_1.1.1.bb +++ b/meta-python/recipes-devtools/python/python3-pyusb_1.2.1.bb @@ -3,10 +3,16 @@ 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" -SRC_URI[sha256sum] = "7d449ad916ce58aff60b89aae0b65ac130f289c24d6a5b7b317742eccffafc38" +RDEPENDS:${PN} += " \ + python3-logging \ +" + +SRC_URI[sha256sum] = "a4cc7404a203144754164b8b40994e2849fde1cfff06b08492f12fff9d9de7b9" inherit pypi setuptools3 +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-pyyaml_5.4.1.bb b/meta-python/recipes-devtools/python/python3-pyyaml_5.4.1.bb deleted file mode 100644 index c3025fdc66..0000000000 --- a/meta-python/recipes-devtools/python/python3-pyyaml_5.4.1.bb +++ /dev/null @@ -1,18 +0,0 @@ -SUMMARY = "Python support for YAML" -DEPENDS += "libyaml ${PYTHON_PN}-cython-native" - -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=6d8242660a8371add5fe547adf083079" - -PYPI_PACKAGE = "PyYAML" - -inherit pypi setuptools3 - -SRC_URI[sha256sum] = "607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e" - -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-netclient \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python-pyzmq/club-rpath-out.patch b/meta-python/recipes-devtools/python/python3-pyzmq/club-rpath-out.patch index 61aeaca5fa..61aeaca5fa 100644 --- a/meta-python/recipes-devtools/python/python-pyzmq/club-rpath-out.patch +++ b/meta-python/recipes-devtools/python/python3-pyzmq/club-rpath-out.patch diff --git a/meta-python/recipes-devtools/python/python3-pyzmq/run-ptest b/meta-python/recipes-devtools/python/python3-pyzmq/run-ptest new file mode 100644 index 0000000000..beefefa663 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyzmq/run-ptest @@ -0,0 +1,4 @@ +#!/bin/sh + +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_22.0.3.bb b/meta-python/recipes-devtools/python/python3-pyzmq_22.0.3.bb deleted file mode 100644 index dbf8e6446c..0000000000 --- a/meta-python/recipes-devtools/python/python3-pyzmq_22.0.3.bb +++ /dev/null @@ -1,26 +0,0 @@ -SUMMARY = "Pyzmq provides Zero message queue access for the Python language" -HOMEPAGE = "http://zeromq.org/bindings:python" -LICENSE = "BSD & LGPL-3.0" -LIC_FILES_CHKSUM = "file://COPYING.BSD;md5=11c65680f637c3df7f58bbc8d133e96e \ - file://COPYING.LESSER;md5=12c592fa0bcfff3fb0977b066e9cb69e" -DEPENDS = "zeromq" - -FILESEXTRAPATHS_prepend := "${THISDIR}/python-pyzmq:" - -SRC_URI += "file://club-rpath-out.patch" -SRC_URI[sha256sum] = "f7f63ce127980d40f3e6a5fdb87abf17ce1a7c2bd8bf2c7560e1bbce8ab1f92d" - -inherit pypi pkgconfig setuptools3 - -RDEPENDS_${PN} += "${PYTHON_PN}-multiprocessing" - -FILES_${PN}-dbg =+ "${PYTHON_SITEPACKAGES_DIR}/zmq/backend/cython/.debug" - -do_compile_prepend() { - echo [global] > ${S}/setup.cfg - echo zmq_prefix = ${STAGING_DIR_HOST} >> ${S}/setup.cfg - echo have_sys_un_h = True >> ${S}/setup.cfg - echo skip_check_zmq = True >> ${S}/setup.cfg - echo libzmq_extension = False >> ${S}/setup.cfg - echo no_libzmq_extension = True >> ${S}/setup.cfg -} diff --git a/meta-python/recipes-devtools/python/python3-pyzmq_25.1.2.bb b/meta-python/recipes-devtools/python/python3-pyzmq_25.1.2.bb new file mode 100644 index 0000000000..2a6993c141 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyzmq_25.1.2.bb @@ -0,0 +1,58 @@ +SUMMARY = "PyZMQ: Python bindings for ZMQ" +DESCRIPTION = "This package contains Python bindings for ZeroMQ. ZMQ is a lightweight and fast messaging implementation." +HOMEPAGE = "http://zeromq.org/bindings:python" +LICENSE = "BSD-3-Clause & LGPL-3.0-only" +LIC_FILES_CHKSUM = "\ + file://LICENSE.BSD;md5=1787206f198344195a671b60326c59dc \ + file://LICENSE.LESSER;md5=0e99bfbdd8b9d33b0221986fe3be89ed \ +" + +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] = "93f1aa311e8bb912e34f004cf186407a4e90eec4f0ecc0efd26056bf7eda0226" + +inherit pypi pkgconfig python_setuptools_build_meta ptest + +PACKAGES =+ "\ + ${PN}-test \ +" + +FILES:${PN}-test += "\ + ${PYTHON_SITEPACKAGES_DIR}/*/tests \ +" + +RDEPENDS:${PN} += "\ + python3-json \ + python3-multiprocessing \ + python3-tornado \ +" + +RDEPENDS:${PN}-ptest += "\ + ${PN}-test \ + python3-pytest \ + python3-unittest-automake-output \ + python3-unixadmin \ +" + +do_compile:prepend() { + echo [global] > ${S}/setup.cfg + echo zmq_prefix = ${STAGING_DIR_HOST} >> ${S}/setup.cfg + echo have_sys_un_h = True >> ${S}/setup.cfg + echo skip_check_zmq = True >> ${S}/setup.cfg + echo libzmq_extension = False >> ${S}/setup.cfg + 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-qface_2.0.8.bb b/meta-python/recipes-devtools/python/python3-qface_2.0.8.bb new file mode 100644 index 0000000000..8ad61ab12b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-qface_2.0.8.bb @@ -0,0 +1,24 @@ +SUMMARY = "A generator framework based on a common modern IDL" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=eee61e10a40b0e3045ee5965bcd9a8b5" + +SRC_URI[sha256sum] = "eccee7dbc4290c5a4e394df8d527f39148e0de0ff22c6b260f48c48f12b3beb4" + +inherit pypi setuptools3 + +DEPS = "\ + python3-jinja2 \ + python3-click \ + python3-pyyaml \ + python3-pytest \ + python3-six \ + python3-path \ + python3-antlr4-runtime \ + python3-watchdog \ + python3-markupsafe \ + python3-setuptools \ +" +DEPENDS += "${DEPS}" +RDEPENDS:${PN} += "${DEPS}" + +BBCLASSEXTEND = "nativesdk native" diff --git a/meta-python/recipes-devtools/python/python3-qrcode_6.1.bb b/meta-python/recipes-devtools/python/python3-qrcode_7.4.2.bb index df99d403d1..204f4eceec 100644 --- a/meta-python/recipes-devtools/python/python3-qrcode_6.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] = "505253854f607f2abf4d16092c61d4e9d511a3b4392e60bff957a68592b04369" +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_5.0.0.bb b/meta-python/recipes-devtools/python/python3-rdflib_5.0.0.bb deleted file mode 100644 index d037a74bfa..0000000000 --- a/meta-python/recipes-devtools/python/python3-rdflib_5.0.0.bb +++ /dev/null @@ -1,15 +0,0 @@ -SUMMARY = "RDFLib is a pure Python package for working with RDF" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=68c1a3bb687bd63b8e5552f3ea249840" - -SRC_URI[md5sum] = "80d7c6adc2e4040cdd8dade2e0e61403" -SRC_URI[sha256sum] = "78149dd49d385efec3b3adfbd61c87afaf1281c30d3fcaf1b323b34f603fb155" - -inherit pypi setuptools3 - -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-isodate \ - ${PYTHON_PN}-pyparsing \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-redis_3.5.3.bb b/meta-python/recipes-devtools/python/python3-redis_3.5.3.bb deleted file mode 100644 index 1887bf9e80..0000000000 --- a/meta-python/recipes-devtools/python/python3-redis_3.5.3.bb +++ /dev/null @@ -1,15 +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[md5sum] = "7a00d4540374f34e152a33faa1fcee5f" -SRC_URI[sha256sum] = "0e7e0cfca8660dea8b7d5cd8c4f6c5e29e11f31158c0b0ae91a397f00e5a05a2" - -inherit pypi setuptools3 - -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-cryptography \ -" 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_2021.4.4.bb b/meta-python/recipes-devtools/python/python3-regex_2023.12.25.bb index 177b06b97c..d7ac616083 100644 --- a/meta-python/recipes-devtools/python/python3-regex_2021.4.4.bb +++ b/meta-python/recipes-devtools/python/python3-regex_2023.12.25.bb @@ -1,10 +1,14 @@ SUMMARY = "Alternative regular expression module, to replace re." HOMEPAGE = "https://bitbucket.org/mrabarnett/mrab-regex/src" LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=f0a3e4a2554ebb89c046c93d45d8e4bc" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=7b5751ddd6b643203c31ff873051d069" inherit pypi setuptools3 -SRC_URI[sha256sum] = "52ba3d3f9b942c49d7e4bc105bb28551c44065f139a65062ab7912bef10c9afb" +SRC_URI[sha256sum] = "29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5" + +RDEPENDS:${PN} += " \ + python3-stringold \ +" BBCLASSEXTEND = "native nativesdk" 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 88915b8fb4..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 @@ -12,8 +12,9 @@ SRC_URI += " \ file://run-ptest \ " -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { @@ -21,7 +22,7 @@ do_install_ptest() { cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ } -RDEPENDS_${PN} += " \ +RDEPENDS:${PN} += " \ python3-requests \ " diff --git a/meta-python/recipes-devtools/python/python3-requests-ftp_0.3.1.bb b/meta-python/recipes-devtools/python/python3-requests-ftp_0.3.1.bb index 3f99ed6756..6df8e7e0bb 100644 --- a/meta-python/recipes-devtools/python/python3-requests-ftp_0.3.1.bb +++ b/meta-python/recipes-devtools/python/python3-requests-ftp_0.3.1.bb @@ -8,7 +8,7 @@ SRC_URI[sha256sum] = "7504ceb5cba8a5c0135ed738596820a78c5f2be92d79b29f96ba99b183 inherit pypi setuptools3 -RDEPENDS_${PN} += " \ +RDEPENDS:${PN} += " \ python3-requests \ " 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 2372ffa45d..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,12 +3,11 @@ 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 -RDEPENDS_${PN} += " \ +RDEPENDS:${PN} += " \ python3-requests \ " diff --git a/meta-python/recipes-devtools/python/python3-requests-oauthlib_1.3.0.bb b/meta-python/recipes-devtools/python/python3-requests-oauthlib_1.3.0.bb deleted file mode 100644 index fd48cd33a2..0000000000 --- a/meta-python/recipes-devtools/python/python3-requests-oauthlib_1.3.0.bb +++ /dev/null @@ -1,9 +0,0 @@ -LICENSE = "ISC" -LIC_FILES_CHKSUM = "file://LICENSE;md5=22d117a849df10d047ed9b792838e863" - -SRC_URI[md5sum] = "1ebcd55f1b1b9281940b4bc33010e2ba" -SRC_URI[sha256sum] = "b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a" - -inherit pypi setuptools3 - -RDEPENDS_${PN} += "${PYTHON_PN}-requests" 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_0.9.1.bb deleted file mode 100644 index cb1bc607b3..0000000000 --- a/meta-python/recipes-devtools/python/python3-requests-toolbelt_0.9.1.bb +++ /dev/null @@ -1,34 +0,0 @@ -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" - -SRC_URI = "file://run-ptest \ - " - -SRC_URI[md5sum] = "b1509735c4b4cf95df2619facbc3672e" -SRC_URI[sha256sum] = "968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0" - -inherit pypi setuptools3 ptest - -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-requests (>=2.0.1) \ -" - -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-betamax \ - ${PYTHON_PN}-mock \ - ${PYTHON_PN}-multiprocessing \ -" - -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} - # remove test test_multipart_encoder.py as it fails, - # downloaded file is not supported - rm -f ${D}${PTEST_PATH}/tests/test_multipart_encoder.py -} diff --git a/meta-python/recipes-devtools/python/python3-requests-toolbelt_1.0.0.bb b/meta-python/recipes-devtools/python/python3-requests-toolbelt_1.0.0.bb new file mode 100644 index 0000000000..9cbe4927a2 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-requests-toolbelt_1.0.0.bb @@ -0,0 +1,36 @@ +DESCRIPTION = "A utility belt for advanced users of python-requests." +HOMEPAGE = "https://toolbelt.readthedocs.org" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=6f14302a4b4099009ab38b4dde5f1075" + +SRC_URI = "file://run-ptest \ + file://090856f4159c40a2927fb88546419f2e1697ad5f.patch \ + file://720240501dca0b4eacc3295665d7ced8719e11d2.patch \ + " + +SRC_URI[sha256sum] = "7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6" + +inherit pypi setuptools3 ptest + +RDEPENDS:${PN} += " \ + python3-requests (>=2.0.1) \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-betamax \ + python3-mock \ + python3-multiprocessing \ + python3-pytest \ + python3-trustme \ + 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} + # remove test test_multipart_encoder.py as it fails, + # downloaded file is not supported + rm -f ${D}${PTEST_PATH}/tests/test_multipart_encoder.py +} 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 new file mode 100644 index 0000000000..94497b609b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-requests-unixsocket_0.3.0.bb @@ -0,0 +1,14 @@ +SUMMARY = "Use requests to talk HTTP via a UNIX domain socket" +HOMEPAGE = "https://pypi.org/project/requests-unixsocket/" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=d2794c0df5b907fdace235a619d80314" + +SRC_URI[sha256sum] = "28304283ea9357d45fff58ad5b11e47708cfbf5806817aa59b2a363228ee971e" + +PYPI_PACKAGE = "requests-unixsocket" + +inherit pypi +inherit setuptools3 + +DEPENDS += "python3-pbr-native" +RDEPENDS:${PN} = "python3-requests python3-urllib3" diff --git a/meta-python/recipes-devtools/python/python3-requests/setup.py-Support-idna-version-3.1.patch b/meta-python/recipes-devtools/python/python3-requests/setup.py-Support-idna-version-3.1.patch deleted file mode 100644 index 26332249da..0000000000 --- a/meta-python/recipes-devtools/python/python3-requests/setup.py-Support-idna-version-3.1.patch +++ /dev/null @@ -1,40 +0,0 @@ -From fc45beed40a86c8fc38fc430765c1c5d2c9961c2 Mon Sep 17 00:00:00 2001 -From: Fabio Berton <fabio.berton@ossystems.com.br> -Date: Thu, 4 Mar 2021 09:26:48 -0300 -Subject: [PATCH] setup.py: Support idna version 3.1 -Organization: O.S. Systems Software LTDA. - -Change idna required version to use python3-idna recipe that currently -is on version 3.1. - -Without this change python-request doesn't work as the idna version -doesn't match the required versions. When bump python-request recipe, -verify if the upstream project bumped the idna version and drop this -patch. - -As this recipe was tested with python3-idna_3.1 don't allow higher -versions. - -Upstream-Status: Inappropriate [embedded specific] - -Signed-off-by: Fabio Berton <fabio.berton@ossystems.com.br> ---- - setup.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/setup.py b/setup.py -index 7ba4b2a2..9d3b973e 100755 ---- a/setup.py -+++ b/setup.py -@@ -43,7 +43,7 @@ packages = ['requests'] - - requires = [ - 'chardet>=3.0.2,<5', -- 'idna>=2.5,<3', -+ 'idna>=2.5,<3.2', - 'urllib3>=1.21.1,<1.27', - 'certifi>=2017.4.17' - --- -2.30.1 - diff --git a/meta-python/recipes-devtools/python/python3-requests_2.25.1.bb b/meta-python/recipes-devtools/python/python3-requests_2.25.1.bb deleted file mode 100644 index cea8fd5178..0000000000 --- a/meta-python/recipes-devtools/python/python3-requests_2.25.1.bb +++ /dev/null @@ -1,27 +0,0 @@ -DESCRIPTION = "Python HTTP for Humans." -HOMEPAGE = "http://python-requests.org" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=34400b68072d710fecd0a2940a0d1658" - -SRC_URI += "file://setup.py-Support-idna-version-3.1.patch" - -SRC_URI[sha256sum] = "27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804" - -inherit pypi setuptools3 - -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-email \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-ndg-httpsclient \ - ${PYTHON_PN}-netserver \ - ${PYTHON_PN}-pyasn1 \ - ${PYTHON_PN}-pyopenssl \ - ${PYTHON_PN}-pysocks \ - ${PYTHON_PN}-urllib3 \ - ${PYTHON_PN}-chardet \ - ${PYTHON_PN}-idna \ -" - -CVE_PRODUCT = "requests" - -BBCLASSEXTEND = "native nativesdk" 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-rfc3339-validator_0.1.3.bb b/meta-python/recipes-devtools/python/python3-rfc3339-validator_0.1.3.bb deleted file mode 100644 index a07a094479..0000000000 --- a/meta-python/recipes-devtools/python/python3-rfc3339-validator_0.1.3.bb +++ /dev/null @@ -1,20 +0,0 @@ -SUMMARY = "A pure python RFC3339 validator" -HOMEPAGE = "https://github.com/naimetti/rfc3339-validator" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=a21b13b5a996f08f7e0b088aa38ce9c6" - -FILESEXTRAPATHS_prepend := "${THISDIR}/python-rfc3339-validator:" - -SRC_URI[sha256sum] = "7a578aa0740e9ee2b48356fe1f347139190c4c72e27f303b3617054efd15df32" - -PYPI_PACKAGE = "rfc3339_validator" - -inherit pypi setuptools3 - -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-core \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-six \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-rfc3986-validator_0.1.1.bb b/meta-python/recipes-devtools/python/python3-rfc3986-validator_0.1.1.bb deleted file mode 100644 index ed668fba98..0000000000 --- a/meta-python/recipes-devtools/python/python3-rfc3986-validator_0.1.1.bb +++ /dev/null @@ -1,23 +0,0 @@ -SUMMARY = "Pure python rfc3986 validator" -HOMEPAGE = "https://github.com/naimetti/rfc3986-validator" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=a21b13b5a996f08f7e0b088aa38ce9c6" - -FILESEXTRAPATHS_prepend := "${THISDIR}/python-rfc3986-validator:" - -SRC_URI[md5sum] = "47f7657b790aaf6011a1ab3d86c6be95" -SRC_URI[sha256sum] = "3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055" - -PYPI_PACKAGE = "rfc3986_validator" - -inherit pypi setuptools3 - -SRC_URI_append = " \ - file://0001-setup.py-move-pytest-runner-to-test_requirements.patch \ -" - -RDEPENDS_${PN} += "\ - python3-core \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-rfc3987_1.3.8.bb b/meta-python/recipes-devtools/python/python3-rfc3987_1.3.8.bb deleted file mode 100644 index 80e2aa5bc2..0000000000 --- a/meta-python/recipes-devtools/python/python3-rfc3987_1.3.8.bb +++ /dev/null @@ -1,10 +0,0 @@ -SUMMARY = "Parsing and validation of URIs (RFC 3986) and IRIs (RFC 3987)" -LICENSE = "GPLv3+" -LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=9;md5=2b723edf67b2f3088bc5e339b1ceda2d" - -SRC_URI[md5sum] = "b6c4028acdc788a9ba697e1c1d6b896c" -SRC_URI[sha256sum] = "d3c4d257a560d544e9826b38bc81db676890c79ab9d7ac92b39c7a253d5ca733" - -inherit pypi setuptools3 - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-rlp_4.0.0.bb b/meta-python/recipes-devtools/python/python3-rlp_4.0.0.bb new file mode 100644 index 0000000000..7df8ac07c5 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-rlp_4.0.0.bb @@ -0,0 +1,16 @@ +SUMMARY = "A Python implementation of Recursive Length Prefix encoding (RLP)." +HOMEPAGE = "https://github.com/ethereum/pyrlp" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=00854fa80a84236706b11f47f23e61e7" + +SRC_URI[sha256sum] = "61a5541f86e4684ab145cb849a5929d2ced8222930a570b3941cf4af16b72a78" + +inherit pypi setuptools3 + +DEPENDS += "python3-pip-native" + +RDEPENDS:${PN} += " \ + python3-eth-utils \ + python3-typing-extensions \ +" diff --git a/meta-python/recipes-devtools/python/python3-robotframework-seriallibrary/e31d5fdf2ea00ac6349e64580a20816783064dd4.patch b/meta-python/recipes-devtools/python/python3-robotframework-seriallibrary/e31d5fdf2ea00ac6349e64580a20816783064dd4.patch deleted file mode 100644 index 21e97fd93a..0000000000 --- a/meta-python/recipes-devtools/python/python3-robotframework-seriallibrary/e31d5fdf2ea00ac6349e64580a20816783064dd4.patch +++ /dev/null @@ -1,45 +0,0 @@ -From e31d5fdf2ea00ac6349e64580a20816783064dd4 Mon Sep 17 00:00:00 2001 -From: Hideki Takeoka <hideki.takeoka@smartfrog.com> -Date: Sun, 25 Aug 2019 19:25:00 +0200 -Subject: [PATCH] Update setup.py for python3.7+ support - ---- - setup.py | 9 +++++---- - src/SerialLibrary/version.py | 3 +++ - 2 files changed, 8 insertions(+), 4 deletions(-) - -diff --git a/setup.py b/setup.py -index 4c34705..70bb1af 100644 ---- a/setup.py -+++ b/setup.py -@@ -1,6 +1,5 @@ - #!/usr/bin/env python - --from imp import load_source - from os.path import abspath, dirname, join - from sys import platform - -@@ -18,9 +17,11 @@ - - - CURDIR = dirname(abspath(__file__)) --VERSION = load_source( -- 'version', 'version', -- open(join(CURDIR, 'src', 'SerialLibrary', 'version.py'))).VERSION -+ -+with open(join(CURDIR, 'src', 'SerialLibrary', 'version.py')) as f: -+ exec(f.read()) -+ VERSION = get_version() -+ - README = open(join(CURDIR, 'README.rst')).read() - CLASSIFIERS = '\n'.join( - map(' :: '.join, [ -diff --git a/src/SerialLibrary/version.py b/src/SerialLibrary/version.py -index 6ce65c4..19831bc 100644 ---- a/src/SerialLibrary/version.py -+++ b/src/SerialLibrary/version.py -@@ -1 +1,4 @@ - VERSION = (0, 3, 1) -+ -+def get_version(): -+ return VERSION; diff --git a/meta-python/recipes-devtools/python/python3-robotframework-seriallibrary_0.3.1.bb b/meta-python/recipes-devtools/python/python3-robotframework-seriallibrary_0.3.1.bb deleted file mode 100644 index b6de42f7c1..0000000000 --- a/meta-python/recipes-devtools/python/python3-robotframework-seriallibrary_0.3.1.bb +++ /dev/null @@ -1,20 +0,0 @@ -SUMMARY = "Robot Framework test library for serial connection" -HOMEPAGE = "https://github.com/whosaysni/robotframework-seriallibrary" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=7145f7cdd263359b62d342a02f005515" - -SRC_URI[md5sum] = "b7c9565d54c30df7cd3f3c0e29adffa3" -SRC_URI[sha256sum] = "256ad60fc0b7df4be44d82c302f5ed8fad4935cda99e4b45942e3c88179d1e19" - -PYPI_PACKAGE = "robotframework-seriallibrary" - -inherit pypi setuptools3 - -SRC_URI += "file://e31d5fdf2ea00ac6349e64580a20816783064dd4.patch" - -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-pyserial \ - ${PYTHON_PN}-robotframework \ -" - -BBCLASSEXTEND = "native nativesdk" 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 new file mode 100644 index 0000000000..0f34a1366d --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-robotframework-seriallibrary_0.4.3.bb @@ -0,0 +1,15 @@ +SUMMARY = "Robot Framework test library for serial connection" +HOMEPAGE = "https://github.com/whosaysni/robotframework-seriallibrary" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=1af2e051b493d9552af443cf2f99d480" + +SRC_URI[sha256sum] = "f20befe5c1106dd8ddca9f60a2f18bf5ec7d5f06f6f09a03fa66bae54777e6bb" + +PYPI_PACKAGE = "robotframework-seriallibrary" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-pyserial \ + python3-robotframework \ +" diff --git a/meta-python/recipes-devtools/python/python3-robotframework_4.0.1.bb b/meta-python/recipes-devtools/python/python3-robotframework_7.0.bb index 3e5d67e0a4..beb71e6a18 100644 --- a/meta-python/recipes-devtools/python/python3-robotframework_4.0.1.bb +++ b/meta-python/recipes-devtools/python/python3-robotframework_7.0.bb @@ -13,15 +13,18 @@ inherit pypi setuptools3 PYPI_PACKAGE_EXT = "zip" -SRC_URI[sha256sum] = "9fa609ceb78f67b1476edce8a7011b16bf3ab41c0fb8c211de6c99955eaf9fde" +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 \ +RDEPENDS:${PN} += " \ + 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.7.2.bb b/meta-python/recipes-devtools/python/python3-rsa_4.9.bb index dcb42aaa9c..c27cd1d68a 100644 --- a/meta-python/recipes-devtools/python/python3-rsa_4.7.2.bb +++ b/meta-python/recipes-devtools/python/python3-rsa_4.9.bb @@ -1,14 +1,13 @@ SUMMARY = "Pure-Python RSA implementation" SECTION = "devel/python" -AUTHOR = "Sybren A. Stuvel" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=c403f6882d4f97a9cd927df987d55634" -SRC_URI[sha256sum] = "9d689e6ca1b3038bc82bf8d23e944b6b6037bc02301a574935b2dd946e0353b9" +SRC_URI[sha256sum] = "e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21" -inherit pypi setuptools3 update-alternatives +inherit pypi python_poetry_core update-alternatives -ALTERNATIVE_${PN} = "\ +ALTERNATIVE:${PN} = "\ pyrsa-decrypt \ pyrsa-encrypt \ pyrsa-keygen \ @@ -26,15 +25,15 @@ ALTERNATIVE_LINK_NAME[pyrsa-verify] = "${bindir}/pyrsa-verify" 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 \ +RDEPENDS:${PN} += "\ + 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-ruamel-yaml_0.17.4.bb b/meta-python/recipes-devtools/python/python3-ruamel-yaml_0.17.4.bb deleted file mode 100644 index 2543269fc8..0000000000 --- a/meta-python/recipes-devtools/python/python3-ruamel-yaml_0.17.4.bb +++ /dev/null @@ -1,19 +0,0 @@ -SUMMARY = "YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order." -AUTHOR = "Anthon van der Neut" - -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=fa0a51dfb461e2f803969e0f3fa71dfe" - -PYPI_PACKAGE = "ruamel.yaml" - -inherit pypi setuptools3 - -BBCLASSEXTEND = "native nativesdk" - -SRC_URI[sha256sum] = "44bc6b54fddd45e4bc0619059196679f9e8b79c027f4131bb072e6a22f4d5e28" - -do_install_prepend() { - export RUAMEL_NO_PIP_INSTALL_CHECK=1 -} - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-scapy_0.26.bb b/meta-python/recipes-devtools/python/python3-scapy_0.26.bb deleted file mode 100644 index 31c88942d7..0000000000 --- a/meta-python/recipes-devtools/python/python3-scapy_0.26.bb +++ /dev/null @@ -1,13 +0,0 @@ -DESCRIPTION = "Packet crafting/sending/sniffing, PCAP processing tool,\ -based on scapy with python3 compatibility" -SECTION = "devel/python" -HOMEPAGE = "https://github.com/phaethon/scapy" -LICENSE = "GPLv2" -LIC_FILES_CHKSUM = "file://PKG-INFO;md5=a88f5c4e1c935f295ebeaf51fc8644ef" - -inherit pypi setuptools3 - -PYPI_PACKAGE = "scapy-python3" - -SRC_URI[md5sum] = "513469447735a4a416d495f63e28aa4b" -SRC_URI[sha256sum] = "81e4f5522d38c136fd3f1be4e35ffe4fd1f4c2091db3c021d95f8b9d5978b9eb" 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.17.bb b/meta-python/recipes-devtools/python/python3-scrypt_0.8.24.bb index bcd58914a3..94c83e4952 100644 --- a/meta-python/recipes-devtools/python/python3-scrypt_0.8.17.bb +++ b/meta-python/recipes-devtools/python/python3-scrypt_0.8.24.bb @@ -1,11 +1,11 @@ DESCRIPTION = "Bindings for the scrypt key derivation function library" LICENSE = "BSD-2-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=2ddf47d0ff1849bce3257ccbc1fd275c" +LIC_FILES_CHKSUM = "file://LICENSE;md5=05b5ac2824a7ae7489193b0f6a6f2cd1" HOMEPAGE="https://github.com/holgern/py-scrypt" SRC_URI += "file://0001-py-scrypt-remove-the-hard-coded-include-paths.patch" -SRC_URI[sha256sum] = "25b5075f2238be93af1cd574540a5ea01b8547f9b678aa72d22fce22577475ec" +SRC_URI[sha256sum] = "98ffde45e4a95461d73ded54ba7a26857679920d4f8ff320f6f7ade6e29531bd" inherit pypi ptest setuptools3 dos2unix @@ -13,8 +13,13 @@ SRC_URI += " \ file://run-ptest \ " -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" + +RDEPENDS:${PN} += " \ + 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/0001-setup.py-switch-to-setuptools.patch b/meta-python/recipes-devtools/python/python3-sdnotify/0001-setup.py-switch-to-setuptools.patch new file mode 100644 index 0000000000..cf7696aa63 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-sdnotify/0001-setup.py-switch-to-setuptools.patch @@ -0,0 +1,31 @@ +From f662280b26eb1549890e88e8e9085f1937d7962d Mon Sep 17 00:00:00 2001 +From: Tim Orling <tim.orling@konsulko.com> +Date: Mon, 28 Feb 2022 07:54:03 -0800 +Subject: [PATCH] setup.py: switch to setuptools + +In Python 3.10, 'distutils' is deprecated and is slated for removal in +Python 3.12. + +Switch from distutils.core to setuptools. This also allows the 'wheel' +binary archive format to be built with 'setup.py bdist_wheel'. + +Upstream-Status: Submitted [https://github.com/bb4242/sdnotify/pull/7] + +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 433222c..32b5bd6 100644 +--- a/setup.py ++++ b/setup.py +@@ -1,4 +1,4 @@ +-from distutils.core import setup ++from setuptools import setup + + VERSION='0.3.2' + +-- +2.30.2 + 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 221a8c8717..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 @@ -12,7 +12,10 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=cc572ccc4b18a4b7d13be5d01bc8213e" -SRC_URI[md5sum] = "749ddca1c70be1697fecc443fb1fdb16" SRC_URI[sha256sum] = "73977fc746b36cc41184dd43c3fe81323e7b8b06c2bb0826c4f59a20c56bb9f1" +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-semantic-version_2.8.5.bb b/meta-python/recipes-devtools/python/python3-semantic-version_2.8.5.bb deleted file mode 100644 index b8541ff570..0000000000 --- a/meta-python/recipes-devtools/python/python3-semantic-version_2.8.5.bb +++ /dev/null @@ -1,12 +0,0 @@ -SUMMARY = "A library implementing the 'SemVer' scheme." -DESCRIPTION = "Semantic version comparison for Python (see http://semver.org/)" -HOMEPAGE = "https://github.com/rbarrois/python-semanticversion" -LICENSE = "BSD-2-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=4fb31e3c1c7eeb8b5e8c07657cdd54e2" - -SRC_URI[sha256sum] = "d2cb2de0558762934679b9a104e82eca7af448c9f4974d1f3eeccff651df8a54" - -PYPI_PACKAGE = "semantic_version" -inherit pypi setuptools3 - -BBCLASSEXTEND = "native nativesdk" 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 8c7c424c6d..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.0.0.bb b/meta-python/recipes-devtools/python/python3-sentry-sdk_1.0.0.bb deleted file mode 100644 index 22b9f55ddf..0000000000 --- a/meta-python/recipes-devtools/python/python3-sentry-sdk_1.0.0.bb +++ /dev/null @@ -1,12 +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" - -SRC_URI[sha256sum] = "71de00c9711926816f750bc0f57ef2abbcb1bfbdf5378c601df7ec978f44857a" - -PYPI_PACKAGE = "sentry-sdk" - -inherit pypi setuptools3 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-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.30.2.bb b/meta-python/recipes-devtools/python/python3-serpent_1.30.2.bb deleted file mode 100644 index 64edff76ba..0000000000 --- a/meta-python/recipes-devtools/python/python3-serpent_1.30.2.bb +++ /dev/null @@ -1,27 +0,0 @@ -SUMMARY = "Serialization based on ast.literal_eval" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://PKG-INFO;md5=5271c65b7cf83bd28055e592c2d14667" - -SRC_URI[md5sum] = "cbef4f9c88f88c38195d11a0363a095f" -SRC_URI[sha256sum] = "72753820246a7d8486e8b385353e3bbf769abfceec2e850fa527a288b084ff7a" - -inherit pypi ptest setuptools3 - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-pytz \ -" - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/tests - cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ -} - -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-numbers \ -" diff --git a/meta-python/recipes-devtools/python/python3-serpent_1.41.bb b/meta-python/recipes-devtools/python/python3-serpent_1.41.bb new file mode 100644 index 0000000000..941b5ee0f3 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-serpent_1.41.bb @@ -0,0 +1,27 @@ +SUMMARY = "Serialization based on ast.literal_eval" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=d7c28f460fafe7be454fcdcac0b60263" + +SRC_URI[sha256sum] = "0407035fe3c6644387d48cff1467d5aa9feff814d07372b78677ed0ee3ed7095" + +inherit pypi ptest setuptools3 + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-pytz \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} + +RDEPENDS:${PN} += "\ + 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-declarative-requirements_1.3.0.bb b/meta-python/recipes-devtools/python/python3-setuptools-declarative-requirements_1.3.0.bb new file mode 100644 index 0000000000..82bb3415be --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-setuptools-declarative-requirements_1.3.0.bb @@ -0,0 +1,12 @@ +SUMMARY = "File support for setuptools declarative setup.cfg" +HOMEPAGE = "https://pypi.org/project/setuptools-declarative-requirements/" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327" + +SRC_URI[sha256sum] = "57a5b9bb9ad350c278e8aa6be4cdebbcd925b9ba71d6a712a178a618cfb898f7" + +inherit pypi python_setuptools_build_meta + +DEPENDS += "python3-setuptools-scm-native" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-sh_1.14.1.bb b/meta-python/recipes-devtools/python/python3-sh_1.14.1.bb deleted file mode 100644 index 89d5008e98..0000000000 --- a/meta-python/recipes-devtools/python/python3-sh_1.14.1.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[md5sum] = "50fc0a2953930ed8d0f6570835e88abf" -SRC_URI[sha256sum] = "39aa9af22f6558a0c5d132881cf43e34828ca03e4ae11114852ca6a55c7c1d8e" - -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 \ -" 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/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.10.bb b/meta-python/recipes-devtools/python/python3-simpleeval_0.9.13.bb index 1cacf9af2a..af2c4a1e2e 100644 --- a/meta-python/recipes-devtools/python/python3-simpleeval_0.9.10.bb +++ b/meta-python/recipes-devtools/python/python3-simpleeval_0.9.13.bb @@ -3,19 +3,21 @@ HOMEPAGE = "https://pypi.org/project/simpleeval/" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENCE;md5=dc9277482effe59b734b004cbcc1fee7" -SRC_URI[md5sum] = "f175fc12d408487ca26fa3905e0a6691" -SRC_URI[sha256sum] = "692055488c2864637f6c2edb5fa48175978a2a07318009e7cf03c9790ca17bea" +SRC_URI[sha256sum] = "4a30f9cc01825fe4c719c785e3762623e350c4840d5e6855c2a8496baaa65fac" -inherit pypi setuptools3 ptest +inherit pypi python_setuptools_build_meta ptest BBCLASSEXTEND = "native nativesdk" -SRC_URI += " \ - file://run-ptest \ +SRC_URI += "file://run-ptest" + +RDEPENDS:${PN} += " \ + python3-math \ " -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-simplejson_3.17.2.bb b/meta-python/recipes-devtools/python/python3-simplejson_3.19.2.bb index cab0da6a15..cc5b1bc90a 100644 --- a/meta-python/recipes-devtools/python/python3-simplejson_3.17.2.bb +++ b/meta-python/recipes-devtools/python/python3-simplejson_3.19.2.bb @@ -4,20 +4,19 @@ HOMEPAGE = "http://cheeseshop.python.org/pypi/simplejson" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=c6338d7abd321c0b50a2a547e441c52e" -SRC_URI[md5sum] = "27fba3bc75a32318bd3b163b8a31aa7e" -SRC_URI[sha256sum] = "75ecc79f26d99222a084fbdd1ce5aad3ac3a8bd535cd9059528452da38b68841" +SRC_URI[sha256sum] = "9eb442a2442ce417801c912df68e1f6ccfcd41577ae7274953ab3ad24ef7d82c" inherit pypi setuptools3 -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-netserver \ - ${PYTHON_PN}-numbers \ +RDEPENDS:${PN} += "\ + python3-io \ + python3-netserver \ + python3-numbers \ " PACKAGES =+ "${PN}-tests" -RDEPENDS_${PN}-tests = "${PN} ${PYTHON_PN}-unittest" -FILES_${PN}-tests+= " \ +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/0001-setup.py-Use-setuptools-instead-of-distutils.patch b/meta-python/recipes-devtools/python/python3-slip-dbus/0001-setup.py-Use-setuptools-instead-of-distutils.patch new file mode 100644 index 0000000000..1208769b2f --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-slip-dbus/0001-setup.py-Use-setuptools-instead-of-distutils.patch @@ -0,0 +1,38 @@ +From 4309ce76351b1685d08b3ba55d4f62b3e53ef76b Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Tue, 1 Mar 2022 19:06:35 -0800 +Subject: [PATCH] setup.py: Use setuptools instead of distutils + +Upstream-Status: Pending +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + setup.py.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/setup.py.in ++++ b/setup.py.in +@@ -2,20 +2,17 @@ + # -*- coding: utf-8 -*- + + import sys +-from distutils.core import setup ++from setuptools import setup, find_packages + + setup(name="slip", version="@VERSION@", + py_modules=["slip.__init__", "slip.util.__init__", + "slip.util.hookable", "slip.util.files", +- "slip._wrappers.__init__", "slip._wrappers._glib"], +- requires=["selinux"]) +- +-setup(name="slip.dbus", version="@VERSION@", +- py_modules=["slip.dbus.__init__", "slip.dbus.bus", ++ "slip._wrappers.__init__", "slip._wrappers._glib", ++ "slip.dbus.__init__", "slip.dbus.bus", + "slip.dbus.constants", "slip.dbus.introspection", + "slip.dbus.mainloop", "slip.dbus.polkit", "slip.dbus.proxies", + "slip.dbus.service"], +- requires=["dbus", "decorator", "StringIO", "xml.etree.ElementTree"]) ++ requires=["dbus", "decorator", "selinux", "StringIO", "xml.etree.ElementTree"]) + + if sys.version_info.major == 2: + setup(name="slip.gtk", version="@VERSION@", diff --git a/meta-python/recipes-devtools/python/python3-slip-dbus/9b939c0b534c1b7958fa0a3c7aedf30bca910431.patch b/meta-python/recipes-devtools/python/python3-slip-dbus/9b939c0b534c1b7958fa0a3c7aedf30bca910431.patch new file mode 100644 index 0000000000..7080047b79 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-slip-dbus/9b939c0b534c1b7958fa0a3c7aedf30bca910431.patch @@ -0,0 +1,78 @@ +From 9b939c0b534c1b7958fa0a3c7aedf30bca910431 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro@hroncok.cz> +Date: Mon, 7 Jun 2021 23:23:47 +0200 +Subject: [PATCH] Python 3.10+ fix: Use collections.abc.Callable instead of + collections.Callable + +The deprecated aliases to Collections Abstract Base Classes were removed from +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/slip/dbus/polkit.py b/slip/dbus/polkit.py +index 128e8ce..320676d 100644 +--- a/slip/dbus/polkit.py ++++ b/slip/dbus/polkit.py +@@ -26,7 +26,7 @@ + + from __future__ import absolute_import + +-import collections ++import collections.abc + import dbus + from decorator import decorator + from functools import reduce +@@ -103,14 +103,14 @@ class MyProxy(object): + def some_method(self, ...): + ...""" + +- assert(func is None or isinstance(func, collections.Callable)) ++ assert(func is None or isinstance(func, collections.abc.Callable)) + + assert( + authfail_result in (None, AUTHFAIL_DONTCATCH) or + authfail_exception is None) + assert( + authfail_callback is None or +- isinstance(authfail_callback, collections.Callable)) ++ isinstance(authfail_callback, collections.abc.Callable)) + assert( + authfail_exception is None or + issubclass(authfail_exception, Exception)) +diff --git a/slip/util/hookable.py b/slip/util/hookable.py +index 89c7392..0cd9967 100644 +--- a/slip/util/hookable.py ++++ b/slip/util/hookable.py +@@ -23,7 +23,7 @@ + """This module contains variants of certain base types which call registered + hooks on changes.""" + +-import collections ++import collections.abc + from six import with_metaclass + + __all__ = ["Hookable", "HookableSet"] +@@ -67,7 +67,7 @@ class _HookEntry(object): + + def __init__(self, hook, args, kwargs, hookable=None): + +- assert(isinstance(hook, collections.Callable)) ++ assert(isinstance(hook, collections.abc.Callable)) + assert(isinstance(hookable, Hookable)) + + for n, x in enumerate(args): +@@ -174,7 +174,7 @@ def add_hook_hookable(self, hook, *args, **kwargs): + self.__add_hook(hook, self, *args, **kwargs) + + def __add_hook(self, hook, _hookable, *args, **kwargs): +- assert isinstance(hook, collections.Callable) ++ assert isinstance(hook, collections.abc.Callable) + assert isinstance(_hookable, Hookable) + hookentry = _HookEntry(hook, args, kwargs, hookable=_hookable) + self.__hooks__.add(hookentry) 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 23099f32d3..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 @@ -10,22 +10,24 @@ there are no clients anymore on the message bus, as well as convenience \ functions and decorators for integrating a dbus service with PolicyKit." SECTION = "devel/python" -LICENSE = "GPLv2+" +LICENSE = "GPL-2.0-or-later" LIC_FILES_CHKSUM = "file://COPYING;md5=5574c6965ae5f583e55880e397fbb018" SRCNAME = "python-slip" -SRC_URI = "https://github.com/nphilipp/${SRCNAME}/releases/download/${SRCNAME}-${PV}/${SRCNAME}-${PV}.tar.bz2" -S = "${WORKDIR}/${SRCNAME}-${PV}" - -SRC_URI[md5sum] = "28ae5f93853466c44ec96706ba2a1eb4" +SRC_URI = "https://github.com/nphilipp/${SRCNAME}/releases/download/${SRCNAME}-${PV}/${SRCNAME}-${PV}.tar.bz2 \ + file://9b939c0b534c1b7958fa0a3c7aedf30bca910431.patch \ + file://0001-setup.py-Use-setuptools-instead-of-distutils.patch \ + " SRC_URI[sha256sum] = "c726c086f0dd93a0ac7a0176f383a12af91b6657b78a301e3f5b25d9f8d4d10b" -do_compile_prepend() { +S = "${WORKDIR}/${SRCNAME}-${PV}" + +do_compile:prepend() { sed -e 's/@VERSION@/${PV}/g' ${S}/setup.py.in > ${S}/setup.py } -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-six \ +RDEPENDS:${PN} += "\ + 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 diff --git a/meta-python/recipes-devtools/python/python3-smbus/0001-Use-setuptools-as-distutils-is-deprecated.patch b/meta-python/recipes-devtools/python/python3-smbus/0001-Use-setuptools-as-distutils-is-deprecated.patch new file mode 100644 index 0000000000..6aafd6a952 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-smbus/0001-Use-setuptools-as-distutils-is-deprecated.patch @@ -0,0 +1,25 @@ +Upstream-Status: Submitted [https://lore.kernel.org/linux-i2c/20220114134910.3994688-1-ross.burton@arm.com/T/#u] +Signed-off-by: Ross Burton <ross.burton@arm.com> + +From fa522a9a390b1857a58ec1f55da1465c542fd106 Mon Sep 17 00:00:00 2001 +From: Ross Burton <ross.burton@arm.com> +Date: Fri, 14 Jan 2022 13:38:34 +0000 +Subject: [PATCH] Use setuptools as distutils is deprecated + +Signed-off-by: Ross Burton <ross.burton@arm.com> +--- + py-smbus/setup.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/py-smbus/setup.py b/py-smbus/setup.py +index 28a4500..26db33a 100644 +--- a/py-smbus/setup.py ++++ b/py-smbus/setup.py +@@ -1,6 +1,6 @@ + #!/usr/bin/env python + +-from distutils.core import setup, Extension ++from setuptools import setup, Extension + + setup( name="smbus", + version="1.1", diff --git a/meta-python/recipes-devtools/python/python3-smbus2_0.4.1.bb b/meta-python/recipes-devtools/python/python3-smbus2_0.4.3.bb index fe0b8d1eff..b54cdb005f 100644 --- a/meta-python/recipes-devtools/python/python3-smbus2_0.4.1.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] = "6276eb599b76c4e74372f2582d2282f03b4398f0da16bc996608e4f21557ca9b" +SRC_URI[sha256sum] = "36f2288a8e1a363cb7a7b2244ec98d880eb5a728a2494ac9c71e9de7bf6a803a" CLEANBROKEN = "1" PYPI_PACKAGE = "smbus2" -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-ctypes \ - ${PYTHON_PN}-fcntl \ +RDEPENDS:${PN} += "\ + python3-ctypes \ + python3-fcntl \ " diff --git a/meta-python/recipes-devtools/python/python3-smbus_4.2.bb b/meta-python/recipes-devtools/python/python3-smbus_4.2.bb deleted file mode 100644 index 862a547c00..0000000000 --- a/meta-python/recipes-devtools/python/python3-smbus_4.2.bb +++ /dev/null @@ -1,13 +0,0 @@ -SUMMARY = "Set of i2c tools for linux - Python module" -LICENSE = "GPLv2" -LIC_FILES_CHKSUM = "file://smbusmodule.c;beginline=1;endline=18;md5=46e424fb045901ab25e0f92c28c80055" -PR = "r1" - -SRC_URI = "${KERNELORG_MIRROR}/software/utils/i2c-tools/i2c-tools-${PV}.tar.gz " -SRC_URI[md5sum] = "d6861c89521f2a2773e19edadb2befee" -SRC_URI[sha256sum] = "7de18ed890e111fa54ab7ea896804d5faa4d1f0462a258aad9fbb7a8cc6b60cc" - -DEPENDS += "i2c-tools" - -S = "${WORKDIR}/i2c-tools-${PV}/py-smbus" -inherit distutils3 diff --git a/meta-python/recipes-devtools/python/python3-smbus_4.3.bb b/meta-python/recipes-devtools/python/python3-smbus_4.3.bb new file mode 100644 index 0000000000..b305a128a2 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-smbus_4.3.bb @@ -0,0 +1,16 @@ +SUMMARY = "Set of i2c tools for linux - Python module" +LICENSE = "GPL-2.0-only" +LIC_FILES_CHKSUM = "file://py-smbus/smbusmodule.c;beginline=1;endline=18;md5=46e424fb045901ab25e0f92c28c80055" + +SRC_URI = "${KERNELORG_MIRROR}/software/utils/i2c-tools/i2c-tools-${PV}.tar.gz \ + file://0001-Use-setuptools-as-distutils-is-deprecated.patch \ + " +SRC_URI[sha256sum] = "eec464e42301d93586cbeca3845ed61bff40f560670e5b35baec57301d438148" + +DEPENDS += "i2c-tools" + +S = "${WORKDIR}/i2c-tools-${PV}" + +inherit setuptools3 + +SETUPTOOLS_SETUP_PATH = "${S}/py-smbus" 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.1.0.bb b/meta-python/recipes-devtools/python/python3-smpplib_2.1.0.bb deleted file mode 100644 index 15b326bad4..0000000000 --- a/meta-python/recipes-devtools/python/python3-smpplib_2.1.0.bb +++ /dev/null @@ -1,24 +0,0 @@ -SUMMARY = "SMPP library for python" -SECTION = "devel/python" -LICENSE = "GPLv3.0" -LIC_FILES_CHKSUM = "file://README.md;md5=56a03d0ce7e492d4b9487b8aae957efe" - -PYPI_PACKAGE = "smpplib" -SRC_URI[sha256sum] = "df4139a279b35fbb42a58f2a254a9c6daf362b04a7f94e208dc120e0b8a3fd4b" - -inherit pypi setuptools3 ptest - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-unittest \ -" - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/tests - cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ - sed -i 's/mock/unittest.mock/g' ${D}${PTEST_PATH}/tests/* -} diff --git a/meta-python/recipes-devtools/python/python3-smpplib_2.2.3.bb b/meta-python/recipes-devtools/python/python3-smpplib_2.2.3.bb new file mode 100644 index 0000000000..7979f04c5b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-smpplib_2.2.3.bb @@ -0,0 +1,31 @@ +SUMMARY = "SMPP library for python" +SECTION = "devel/python" +LICENSE = "GPL-3.0-only" +LIC_FILES_CHKSUM = "file://README.md;md5=8b4e2ac8cf248f7b991784f88b630852" + +PYPI_PACKAGE = "smpplib" +SRC_URI[sha256sum] = "5215a95b0538d26f189600e0982b31da8281f7453cd6e2862c5b21e3e1002331" + +inherit pypi setuptools3 ptest + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN} += " \ + python3-logging \ + python3-six \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-mock \ + python3-profile \ + python3-pytest \ + python3-unittest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/smpplib/tests/* ${D}${PTEST_PATH}/tests/ +} 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.0.bb b/meta-python/recipes-devtools/python/python3-snappy_0.6.1.bb index 64787feecc..bd0979d0b4 100644 --- a/meta-python/recipes-devtools/python/python3-snappy_0.6.0.bb +++ b/meta-python/recipes-devtools/python/python3-snappy_0.6.1.bb @@ -4,12 +4,10 @@ DEPENDS += "snappy" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=b3090152f53ee19f6a7b64b1a36384fb" -SRC_URI[sha256sum] = "168a98d3f597b633cfeeae7fe1c78a8dfd81f018b866cf7ce9e4c56086af891a" +SRC_URI[sha256sum] = "b6a107ab06206acc5359d4c5632bd9b22d448702a79b3169b0c62e0fb808bb2a" inherit pypi setuptools3 PYPI_PACKAGE = "python-snappy" -RDEPENDS_${PN} += "snappy" - -BBCLASSEXTEND = "native nativesdk" +RDEPENDS:${PN} += "snappy" 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.1.0.bb b/meta-python/recipes-devtools/python/python3-socketio_5.1.0.bb deleted file mode 100644 index 8cf6a96ba1..0000000000 --- a/meta-python/recipes-devtools/python/python3-socketio_5.1.0.bb +++ /dev/null @@ -1,27 +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 setuptools3 - -PYPI_PACKAGE = "python-socketio" - -SRC_URI[sha256sum] = "338cc29abb6f3ca14c88f1f8d05ed27c690df4648f62062b299f92625bbf7093" - -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 \ - " 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-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.2.1.bb b/meta-python/recipes-devtools/python/python3-soupsieve_2.2.1.bb deleted file mode 100644 index 93ef04f145..0000000000 --- a/meta-python/recipes-devtools/python/python3-soupsieve_2.2.1.bb +++ /dev/null @@ -1,25 +0,0 @@ -SUMMARY = "CSS selector library for python-beautifulsoup4" -HOMEPAGE = "https://github.com/facelessuser/soupsieve" - -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE.md;md5=33c3a77def9b3ad83e01c65bdcc1af67" - -SRC_URI[sha256sum] = "052774848f448cf19c7e959adf5566904d525f33a3f8b6ba6f6f8f26ec7de0cc" - -inherit pypi setuptools3 ptest - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-beautifulsoup4 \ -" - -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-soupsieve_2.5.bb b/meta-python/recipes-devtools/python/python3-soupsieve_2.5.bb new file mode 100644 index 0000000000..d26a13dfbd --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-soupsieve_2.5.bb @@ -0,0 +1,26 @@ +SUMMARY = "CSS selector library for python-beautifulsoup4" +HOMEPAGE = "https://github.com/facelessuser/soupsieve" + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE.md;md5=520586fa71ed2cbda50b4a8c89621e09" + +SRC_URI[sha256sum] = "5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690" + +inherit pypi python_hatchling python_setuptools_build_meta ptest + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-beautifulsoup4 \ + 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-speedtest-cli_2.1.3.bb b/meta-python/recipes-devtools/python/python3-speedtest-cli_2.1.3.bb index 2fbbed3262..472113b059 100644 --- a/meta-python/recipes-devtools/python/python3-speedtest-cli_2.1.3.bb +++ b/meta-python/recipes-devtools/python/python3-speedtest-cli_2.1.3.bb @@ -7,4 +7,8 @@ SRC_URI[sha256sum] = "5e2773233cedb5fa3d8120eb7f97bcc4974b5221b254d33ff16e2f1d41 inherit pypi setuptools3 -RDEPENDS_${PN} = "${PYTHON_PN}-misc" +RDEPENDS:${PN} += " \ + python3-misc \ + python3-threading \ + python3-xml \ +" 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.7.bb b/meta-python/recipes-devtools/python/python3-sqlalchemy_1.4.7.bb deleted file mode 100644 index 883b2660b0..0000000000 --- a/meta-python/recipes-devtools/python/python3-sqlalchemy_1.4.7.bb +++ /dev/null @@ -1,19 +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=3359ed561ac16aaa25b6c6eff84df595" - -SRC_URI[sha256sum] = "84115f97d88c8ccf26db81b7997c5f5de9ae360e0785ef859d0987794495f0a9" - -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 \ -" 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.1.bb b/meta-python/recipes-devtools/python/python3-sqlparse_0.4.4.bb index c8a64c1095..c04971ee8f 100644 --- a/meta-python/recipes-devtools/python/python3-sqlparse_0.4.1.bb +++ b/meta-python/recipes-devtools/python/python3-sqlparse_0.4.4.bb @@ -1,24 +1,24 @@ DESCRIPTION = "Non-validating SQL parser module" HOMEPAGE = "http://pypi.python.org/pypi/sqlparse" SECTION = "devel/python" -LICENSE = "BSD" +LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=2b136f573f5386001ea3b7b9016222fc" SRC_URI += "file://0001-sqlparse-change-shebang-to-python3.patch \ file://run-ptest \ " -SRC_URI[md5sum] = "eebbc6b5f1033054873033e54b0c1266" -SRC_URI[sha256sum] = "0f91fd2e829c44362cbcfab3e9ae12e22badaa8a29ad5ff599f9ec109f0454e8" +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 \ +RDEPENDS:${PN}-ptest += " \ + 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_3.3.0.bb b/meta-python/recipes-devtools/python/python3-stevedore_5.1.0.bb index 5103717182..ce71796339 100644 --- a/meta-python/recipes-devtools/python/python3-stevedore_3.3.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] = "3a5bbd0652bf552748871eaa73a4a8dc2899786bc497a2aa1fcb4dcdb0debeee" +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-strict-rfc3339_0.7.bb b/meta-python/recipes-devtools/python/python3-strict-rfc3339_0.7.bb deleted file mode 100644 index 52ae9ebe9a..0000000000 --- a/meta-python/recipes-devtools/python/python3-strict-rfc3339_0.7.bb +++ /dev/null @@ -1,10 +0,0 @@ -SUMMARY = "Strict, simple, lightweight RFC3339 function.s" -LICENSE = "GPLv3" -LIC_FILES_CHKSUM = "file://LICENSE;md5=8f0e2cd40e05189ec81232da84bd6e1a" - -SRC_URI[md5sum] = "4d9b635b4df885bc37bc1189d66c9abc" -SRC_URI[sha256sum] = "5cad17bedfc3af57b399db0fed32771f18fc54bbd917e85546088607ac5e1277" - -inherit pypi setuptools3 - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-supervisor_4.2.1.bb b/meta-python/recipes-devtools/python/python3-supervisor_4.2.5.bb index 0ff4b35d90..06b08e78a3 100644 --- a/meta-python/recipes-devtools/python/python3-supervisor_4.2.1.bb +++ b/meta-python/recipes-devtools/python/python3-supervisor_4.2.5.bb @@ -7,20 +7,24 @@ HOMEPAGE = "https://github.com/Supervisor/supervisor" LICENSE = "BSD-4-Clause" LIC_FILES_CHKSUM = "file://LICENSES.txt;md5=5b4e3a2172bba4c47cded5885e7e507e" -SRC_URI[sha256sum] = "c479c875853e9c013d1fa73e529fd2165ff1ecaecc7e82810ba57e7362ae984d" +SRC_URI[sha256sum] = "34761bae1a23c58192281a5115fb07fbf22c9b0133c08166beffc70fed3ebc12" PYPI_PACKAGE = "supervisor" inherit pypi systemd setuptools3 -RDEPENDS_${PN} = "\ - ${PYTHON_PN}-meld3 \ +RDEPENDS:${PN} = "\ + python3-meld3 \ + python3-io \ + python3-xmlrpc \ + python3-resource \ + python3-setuptools \ " SRC_URI += "file://supervisord.conf \ file://supervisor.service \ " -SYSTEMD_SERVICE_${PN} = "supervisor.service" +SYSTEMD_SERVICE:${PN} = "supervisor.service" -do_install_append() { +do_install:append() { install -d ${D}${sysconfdir}/supervisor install -d ${D}${systemd_system_unitdir} 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/python3-sympy_1.7.1.bb b/meta-python/recipes-devtools/python/python3-sympy_1.7.1.bb deleted file mode 100644 index d4508689f6..0000000000 --- a/meta-python/recipes-devtools/python/python3-sympy_1.7.1.bb +++ /dev/null @@ -1,15 +0,0 @@ -# This recipe is adapted from one in meta-jupyter: -# https://github.com/Xilinx/meta-jupyter/blob/master/recipes-python/python3-sympy_1.1.bb - -SUMMARY = "Computer algebra system (CAS) in Python" -HOMEPAGE = "https://pypi.org/project/sympy/" -LICENSE = "BSD" -LIC_FILES_CHKSUM = "file://LICENSE;md5=ebb06e9df8f57522b72d0edb0fcf83d4" - -SRC_URI[sha256sum] = "a3de9261e97535b83bb8607b0da2c7d03126650fafea2b2789657b229c246b2e" - -inherit pypi setuptools3 - -RDEPENDS_${PN} += "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 6914cf920e..0000000000 --- a/meta-python/recipes-devtools/python/python3-systemd_234.bb +++ /dev/null @@ -1,20 +0,0 @@ -SUMMARY = "Python interface for libsystemd" -HOMEPAGE = "https://github.com/systemd/python-systemd" -LICENSE = "LGPLv2.1+" -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 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" - -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.9.bb b/meta-python/recipes-devtools/python/python3-tabulate_0.8.9.bb deleted file mode 100644 index 19261c3d1d..0000000000 --- a/meta-python/recipes-devtools/python/python3-tabulate_0.8.9.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=fad5a39bdfe452b13775adda41023ba7" - -SRC_URI[sha256sum] = "eb1d13f25760052e8931f2ef80aaf6045a6cceb47514db8beab24cded16f13a7" - -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.3.bb b/meta-python/recipes-devtools/python/python3-term_2.3.bb deleted file mode 100644 index 723f1db512..0000000000 --- a/meta-python/recipes-devtools/python/python3-term_2.3.bb +++ /dev/null @@ -1,11 +0,0 @@ -SUMMARY = "An enhanced version of the tty module" -SECTION = "devel/python" -LICENSE = "Python-2" -LIC_FILES_CHKSUM = "file://LICENSE;md5=d90e2d280a4836c607520383d1639be1" - -SRC_URI[md5sum] = "ab0c1bce381b1109fe4390c56aa06237" -SRC_URI[sha256sum] = "3dcc8c212e04700784e5c1c5b601916ba0549ae6025b35b64fd62144899e7180" - -PYPI_PACKAGE_EXT = "zip" - -inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-term_2.5.bb b/meta-python/recipes-devtools/python/python3-term_2.5.bb new file mode 100644 index 0000000000..7d508ad809 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-term_2.5.bb @@ -0,0 +1,12 @@ +SUMMARY = "An enhanced version of the tty module" +SECTION = "devel/python" +LICENSE = "Python-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=d90e2d280a4836c607520383d1639be1" + +SRC_URI[sha256sum] = "846fda941dbb8a7c9f246e99bf5ee731910fc4a4cc54b7e36457c133c9f6b78b" + +inherit pypi setuptools3 + +RDEPENDS:${PN} = "\ + python3-io \ +" 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 17df7f983d..0000000000 --- a/meta-python/recipes-devtools/python/python3-termcolor_1.1.0.bb +++ /dev/null @@ -1,12 +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[md5sum] = "043e89644f8909d462fbbfa511c768df" -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-test-generator/run-ptest b/meta-python/recipes-devtools/python/python3-test-generator/run-ptest deleted file mode 100644 index 5cec711696..0000000000 --- a/meta-python/recipes-devtools/python/python3-test-generator/run-ptest +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -pytest diff --git a/meta-python/recipes-devtools/python/python3-test-generator_0.1.2.bb b/meta-python/recipes-devtools/python/python3-test-generator_0.1.2.bb deleted file mode 100644 index a83ee5efc2..0000000000 --- a/meta-python/recipes-devtools/python/python3-test-generator_0.1.2.bb +++ /dev/null @@ -1,29 +0,0 @@ -SUMMARY = "Generator is a helper for generating test methods for nose while still using unittest." -DESCRIPTION = "Python package with modified subclasses of all stdlib XML \ -parsers that prevent any potentially malicious operation." - -LICENSE = "ISC" -LIC_FILES_CHKSUM = "file://LICENSE;md5=041a2bff595d40ccb4b36356f89dab00" - -SRC_URI += " \ - file://run-ptest \ -" - -SRC_URI[md5sum] = "6c69e73ba5b4b3ed62f7bcda071c64f1" -SRC_URI[sha256sum] = "ad5925c814bfe79497b43df096e3bb52c166d1577f7aff160137301676232f4a" - -inherit pypi setuptools3 ptest - -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-mock \ -" - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/tests - cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ -} - -DEPENDS += "python3-nose-native" - -RDEPENDS_${PN} += "python3-six" diff --git a/meta-python/recipes-devtools/python/python3-textparser_0.23.0.bb b/meta-python/recipes-devtools/python/python3-textparser_0.24.0.bb index 0c626e7aa2..8db949d0dc 100644 --- a/meta-python/recipes-devtools/python/python3-textparser_0.23.0.bb +++ b/meta-python/recipes-devtools/python/python3-textparser_0.24.0.bb @@ -3,8 +3,7 @@ HOMEPAGE = "https://github.com/eerimoq/textparser" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=fe9942a8bba5458a9dbd11277bc347ad" -SRC_URI[md5sum] = "d5378eac93406156e9029114aaa1b515" -SRC_URI[sha256sum] = "f009d0f6f78aa7c1e648dca4e3961f6d67495f7f520f1a705245ffad33f4b470" +SRC_URI[sha256sum] = "56f708e75aa9d002adb76d823ba6ef166d7ecec1e3e4ca4c1ca103f817568335" PYPI_PACKAGE = "textparser" diff --git a/meta-python/recipes-devtools/python/python3-texttable_1.6.3.bb b/meta-python/recipes-devtools/python/python3-texttable_1.7.0.bb index 03ebd010e0..56448f738e 100644 --- a/meta-python/recipes-devtools/python/python3-texttable_1.6.3.bb +++ b/meta-python/recipes-devtools/python/python3-texttable_1.7.0.bb @@ -5,7 +5,6 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=7a97cdac2d9679ffdcfef3dc036d24f6" inherit pypi setuptools3 -SRC_URI[md5sum] = "68e6b31d36f5c20221da7d5db3eca772" -SRC_URI[sha256sum] = "ce0faf21aa77d806bbff22b107cc22cce68dc9438f97a2df32c93e9afa4ce436" +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.1.bb b/meta-python/recipes-devtools/python/python3-toolz_0.12.1.bb new file mode 100644 index 0000000000..f1763ee518 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-toolz_0.12.1.bb @@ -0,0 +1,14 @@ +SUMMARY = "A set of utility functions for iterators, functions, and dictionaries." +HOMEPAGE = "https://github.com/pytoolz/toolz" +SECTION = "devel/python" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=ca09cab178326d18433aae982d1edf5d" + +SRC_URI[sha256sum] = "ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-json \ + python3-math \ +" diff --git a/meta-python/recipes-devtools/python/python3-tornado_6.1.bb b/meta-python/recipes-devtools/python/python3-tornado_6.4.bb index 89ff715b65..b01c1cec2a 100644 --- a/meta-python/recipes-devtools/python/python3-tornado_6.1.bb +++ b/meta-python/recipes-devtools/python/python3-tornado_6.4.bb @@ -6,23 +6,36 @@ HOMEPAGE = "http://www.tornadoweb.org/en/stable/" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57" -SRC_URI[md5sum] = "f324f5e7607798552359d6ab054c4321" -SRC_URI[sha256sum] = "33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791" +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* \ +FILES:${PN}-test = " \ + ${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.60.0.bb b/meta-python/recipes-devtools/python/python3-tqdm_4.60.0.bb deleted file mode 100644 index e20ba779af..0000000000 --- a/meta-python/recipes-devtools/python/python3-tqdm_4.60.0.bb +++ /dev/null @@ -1,14 +0,0 @@ -SUMMARY = "Fast, Extensible Progress Meter" -HOMEPAGE = "http://tqdm.github.io/" -SECTION = "devel/python" - -LICENSE = "MIT & MPL-2.0" -LIC_FILES_CHKSUM = "file://LICENCE;md5=59e4271a933d33edfe60237db377a14b" - -SRC_URI[sha256sum] = "ebdebdb95e3477ceea267decfc0784859aa3df3e27e22d23b83e9b272bf157ae" - -inherit pypi setuptools3 - -DEPENDS += "${PYTHON_PN}-setuptools-scm-native" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-tqdm_4.66.2.bb b/meta-python/recipes-devtools/python/python3-tqdm_4.66.2.bb new file mode 100644 index 0000000000..77d26f54b2 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-tqdm_4.66.2.bb @@ -0,0 +1,19 @@ +SUMMARY = "Fast, Extensible Progress Meter" +HOMEPAGE = "http://tqdm.github.io/" +SECTION = "devel/python" + +LICENSE = "MIT & MPL-2.0" +LIC_FILES_CHKSUM = "file://LICENCE;md5=42dfa9e8c616dbc295df3f58d756b2a1" + +SRC_URI[sha256sum] = "6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531" + +inherit pypi python_setuptools_build_meta + +DEPENDS += "python3-setuptools-scm-native" + +RDEPENDS:${PN} += " \ + python3-logging \ + python3-numbers \ +" + +BBCLASSEXTEND = "native nativesdk" 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 b0f7548e4c..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 @@ -7,9 +7,9 @@ SRC_URI[sha256sum] = "440b6b49e5e975f9a640a2519abb2feddd96eb2aeb1715f87f947a7a07 inherit pypi setuptools3 -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-trafaret \ - ${PYTHON_PN}-pyyaml \ +RDEPENDS:${PN} += " \ + python3-trafaret \ + python3-pyyaml \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-trafaret_2.1.0.bb b/meta-python/recipes-devtools/python/python3-trafaret_2.1.1.bb index 96602016e0..5b24206a27 100644 --- a/meta-python/recipes-devtools/python/python3-trafaret_2.1.0.bb +++ b/meta-python/recipes-devtools/python/python3-trafaret_2.1.1.bb @@ -3,15 +3,14 @@ SUMMARY = "Ultimate transformation library that supports validation, contexts an LICENSE = "BSD-2-Clause" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=21ecc7aa8f699874e706fc1354903437" -SRC_URI[sha256sum] = "72c342ede27fb34cd219b62855119380ae1c87006b6106be163c01159eb955ff" -SRC_URI[md5sum] = "228675376012fb27dd7f70ab685e7766" +SRC_URI[sha256sum] = "d9d00800318fbd343fdfb3353e947b2ebb5557159c844696c5ac24846f76d41c" inherit pypi setuptools3 -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-urllib3 \ +RDEPENDS:${PN} += " \ + 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.0.5.bb b/meta-python/recipes-devtools/python/python3-traitlets_5.0.5.bb deleted file mode 100644 index 53451cd3ce..0000000000 --- a/meta-python/recipes-devtools/python/python3-traitlets_5.0.5.bb +++ /dev/null @@ -1,17 +0,0 @@ -SUMMARY = "Traitlets Python config system" -HOMEPAGE = "http://ipython.org" -AUTHOR = "IPython Development Team <ipython-dev@scipy.org>" -LICENSE = "BSD" -LIC_FILES_CHKSUM = "file://COPYING.md;md5=eec4de4d599518742e54e75954e33b46" - -PYPI_PACKAGE = "traitlets" - -SRC_URI[md5sum] = "2ffe54aee5d0d87890127dd28ce3f6c4" -SRC_URI[sha256sum] = "178f4ce988f69189f7e523337a3e11d91c786ded9360174a3d9ca83e79bc5396" - -RDEPENDS_${PN} = "\ - ${PYTHON_PN}-ipython-genutils \ - ${PYTHON_PN}-decorator \ -" - -inherit setuptools3 pypi 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-transitions_0.8.8.bb b/meta-python/recipes-devtools/python/python3-transitions_0.8.8.bb deleted file mode 100644 index 2b82df5814..0000000000 --- a/meta-python/recipes-devtools/python/python3-transitions_0.8.8.bb +++ /dev/null @@ -1,9 +0,0 @@ -SUMMARY = "A lightweight, object-oriented Python state machine implementation with many extensions." -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=baac7be1f4c17620df74188e23da6d47" - -inherit pypi setuptools3 - -SRC_URI[sha256sum] = "e7a86b31a161a76133f189b3ae9dad2755a80ea4c1e0eee1805648d021fb677d" - -RDEPENDS_${PN} += "python3-six" diff --git a/meta-python/recipes-devtools/python/python3-transitions_0.9.0.bb b/meta-python/recipes-devtools/python/python3-transitions_0.9.0.bb new file mode 100644 index 0000000000..980351bf14 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-transitions_0.9.0.bb @@ -0,0 +1,9 @@ +SUMMARY = "A lightweight, object-oriented Python state machine implementation with many extensions." +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=de0a0876a688a4483bfafa764773ab39" + +inherit pypi setuptools3 + +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_3.4.1.bb b/meta-python/recipes-devtools/python/python3-twine_5.0.0.bb index 111366dba0..cb45074811 100644 --- a/meta-python/recipes-devtools/python/python3-twine_3.4.1.bb +++ b/meta-python/recipes-devtools/python/python3-twine_5.0.0.bb @@ -3,12 +3,16 @@ HOMEPAGE = "https://twine.readthedocs.io/" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=a3d1106b253a8d50dd82a4202a045b4c" -SRC_URI[sha256sum] = "a56c985264b991dc8a8f4234eb80c5af87fa8080d0c224ad8f2cd05a2c22e83b" +SRC_URI[sha256sum] = "89b0cc7d370a4b66421cc6102f269aa910fe0f1861c124f573cf2ddedbc10cf4" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta DEPENDS += "\ - ${PYTHON_PN}-setuptools-scm-native \ + python3-setuptools-scm-native \ +" + +RDEPENDS:${PN} += " \ + python3-importlib-metadata \ " BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-twisted_21.2.0.bb b/meta-python/recipes-devtools/python/python3-twisted_21.2.0.bb deleted file mode 100644 index e0f1a8ca6e..0000000000 --- a/meta-python/recipes-devtools/python/python3-twisted_21.2.0.bb +++ /dev/null @@ -1,324 +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=e33c411c0b86b1f3ca299091ed51ca31" - -SRC_URI[sha256sum] = "77544a8945cf69b98d2946689bbe0c75de7d145cdf11f391dd487eae8fc95a12" - -PYPI_PACKAGE = "Twisted" - -inherit pypi setuptools3 - -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" -RDEPENDS_${PN}-dbg = "${PN}" - -ALLOW_EMPTY_${PN} = "1" -FILES_${PN} = "" - -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}-dbg += " \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/*/.debug \ -${libdir}/${PYTHON_DIR}/site-packages/twisted/*/*/.debug \ -" - -FILES_${PN}-doc += " \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/python/_pydoctortemplates/ \ -" - -RDEPENDS_${PN}-src = "${PN}" -FILES_${PN}-src = " \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/*.py \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/*/*.py \ - ${libdir}/${PYTHON_DIR}/site-packages/twisted/*/*/*.py \ -" - -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_22.10.0.bb b/meta-python/recipes-devtools/python/python3-twisted_22.10.0.bb new file mode 100644 index 0000000000..20b9ce2541 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-twisted_22.10.0.bb @@ -0,0 +1,201 @@ +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" + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=0f8d67f84b6e178c92d471011b2245fc" + +SRC_URI[sha256sum] = "32acbd40a94f5f46e7b42c109bfae2b302250945561783a8b7a059048f2d4d31" + +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 \ +" + +DEPENDS += " \ + 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-pyhamcrest \ + python3-pyserial \ + python3-typing-extensions \ + python3-unixadmin \ + python3-zopeinterface \ +" +RDEPENDS:${PN}-test = "${PN}" +RDEPENDS:${PN}-conch = "${PN}-core ${PN}-protocols python3-bcrypt python3-cryptography python3-pyasn1 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} = "${PYTHON_SITEPACKAGES_DIR}/${PYPI_PACKAGE}-${PV}.dist-info/*" + +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/gps/ \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/protocols/mice/ \ + ${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*egg-info \ + ${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_3.10.0.bb b/meta-python/recipes-devtools/python/python3-twitter_3.10.0.bb deleted file mode 100644 index 94fd65649c..0000000000 --- a/meta-python/recipes-devtools/python/python3-twitter_3.10.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] = "76e6954b806ca470dda877f57db8792fff06a0beba0ed43efc3805771e39f06a" - -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-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-twofish/0002-setup.py-switch-to-setuptools.patch b/meta-python/recipes-devtools/python/python3-twofish/0002-setup.py-switch-to-setuptools.patch new file mode 100644 index 0000000000..99e5c6c517 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-twofish/0002-setup.py-switch-to-setuptools.patch @@ -0,0 +1,26 @@ +From fe10781bd15ed7a5c384dbf121f78f129995aa8f Mon Sep 17 00:00:00 2001 +From: Tim Orling <tim.orling@konsulko.com> +Date: Sun, 27 Feb 2022 11:02:36 -0800 +Subject: [PATCH] setup.py: switch to setuptools + +Upstream-Status: Submitted +[https://github.com/keybase/python-twofish/pull/9] + +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 fcc9546..bfc3273 100644 +--- a/setup.py ++++ b/setup.py +@@ -8,7 +8,7 @@ Copyright (c) 2013 Keybase + setup.py - build and package info + """ + +-from distutils.core import setup, Extension ++from setuptools import setup, Extension + + twofish_module = Extension('_twofish', + sources=['twofish-0.3/twofish.c', 'twofish.c'], 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 94fb71090e..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 @@ -5,11 +5,15 @@ HOMEPAGE = "http://github.com/keybase/python-twofish" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=33a63abf6d7567b1689d8ce69f00e43b" -SRC_URI += "file://0001-Fix-missing-return-statements-in-module-stubs.patch" +SRC_URI += " \ + file://0001-Fix-missing-return-statements-in-module-stubs.patch \ + file://0002-setup.py-switch-to-setuptools.patch \ +" -SRC_URI[md5sum] = "d7d22f16dc4ffa0e3ae2200654033abe" SRC_URI[sha256sum] = "b09d8bb50d33b23ff34cafb1f9209f858f752935c6a5c901efb92a41acb830fa" inherit pypi setuptools3 BBCLASSEXTEND = "native nativesdk" + +RDEPENDS:${PN} += "python3-ctypes" diff --git a/meta-python/recipes-devtools/python/python3-txaio_21.2.1.bb b/meta-python/recipes-devtools/python/python3-txaio_21.2.1.bb deleted file mode 100644 index 53dcb5cc69..0000000000 --- a/meta-python/recipes-devtools/python/python3-txaio_21.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] = "7d6f89745680233f1c4db9ddb748df5e88d2a7a37962be174c0fd04c8dba1dc8" - -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 cf2c98bba2..d579ca0441 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-six python3-twisted" diff --git a/meta-python/recipes-devtools/python/python3-typed-ast_1.4.3.bb b/meta-python/recipes-devtools/python/python3-typed-ast_1.4.3.bb deleted file mode 100644 index c482251b8f..0000000000 --- a/meta-python/recipes-devtools/python/python3-typed-ast_1.4.3.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] = "fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65" - -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.12.0.bb b/meta-python/recipes-devtools/python/python3-typeguard_4.2.1.bb index 148806e101..e0e84df28a 100644 --- a/meta-python/recipes-devtools/python/python3-typeguard_2.12.0.bb +++ b/meta-python/recipes-devtools/python/python3-typeguard_4.2.1.bb @@ -3,18 +3,27 @@ HOMEPAGE = "https://pypi.org/project/typeguard/" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=f0e423eea5c91e7aa21bdb70184b3e53" -SRC_URI[sha256sum] = "fca77fd4ccba63465b421cdbbab5a1a8e3994e6d6f18b45da2bb475c09f147ef" +SRC_URI[sha256sum] = "c556a1b95948230510070ca53fa0341fb0964611bd05d598d87fb52115d65fee" -inherit pypi setuptools3 ptest +inherit pypi python_setuptools_build_meta ptest SRC_URI += " \ file://run-ptest \ " -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-typing-extensions \ - ${PYTHON_PN}-unixadmin \ +RDEPENDS:${PN} += " \ + python3-core \ + python3-compression \ + python3-unittest \ + python3-typing-extensions \ +" + +RDEPENDS:${PN}-ptest += " \ + 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-typing-extensions_3.7.4.3.bb b/meta-python/recipes-devtools/python/python3-typing-extensions_3.7.4.3.bb deleted file mode 100644 index 8ef15fab79..0000000000 --- a/meta-python/recipes-devtools/python/python3-typing-extensions_3.7.4.3.bb +++ /dev/null @@ -1,13 +0,0 @@ -HOMEPAGE = "https://github.com/python/typing" -LICENSE = "PSF" -LIC_FILES_CHKSUM = "file://LICENSE;md5=64fc2b30b67d0a8423c250e0386ed72f" - -# The name on PyPi is slightly different. -PYPI_PACKAGE = "typing_extensions" - -SRC_URI[md5sum] = "5fcbfcb22e6f8c9bf23fb9f8e020f6ee" -SRC_URI[sha256sum] = "99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c" - -inherit pypi setuptools3 - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-tzlocal_2.1.bb b/meta-python/recipes-devtools/python/python3-tzlocal_2.1.bb deleted file mode 100644 index 56a8fc06f8..0000000000 --- a/meta-python/recipes-devtools/python/python3-tzlocal_2.1.bb +++ /dev/null @@ -1,9 +0,0 @@ -SUMMARY = "Library to return tzinfo with the local timezone information" -HOMEPAGE = "https://pypi.org/project/tzlocal/" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=57e0bd61643d81d05683cdce65b11d10" - -SRC_URI[md5sum] = "c0877603ff9de71cd8ca6ee2b50d2ebd" -SRC_URI[sha256sum] = "643c97c5294aedc737780a49d9df30889321cbe1204eac2c2ec6134035a92e44" - -inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-tzlocal_5.2.bb b/meta-python/recipes-devtools/python/python3-tzlocal_5.2.bb new file mode 100644 index 0000000000..da58964f2c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-tzlocal_5.2.bb @@ -0,0 +1,14 @@ +SUMMARY = "Library to return tzinfo with the local timezone information" +HOMEPAGE = "https://pypi.org/project/tzlocal/" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=57e0bd61643d81d05683cdce65b11d10" + +SRC_URI[sha256sum] = "8d399205578f1a9342816409cc1e46a93ebd5755e39ea2d85334bea911bf0e6e" + +inherit pypi python_setuptools_build_meta + +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.7.1.bb deleted file mode 100644 index c5524d152e..0000000000 --- a/meta-python/recipes-devtools/python/python3-u-msgpack-python_2.7.1.bb +++ /dev/null @@ -1,27 +0,0 @@ -DESCRIPTION = "A portable, lightweight MessagePack serializer and deserializer written in pure Python." - -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=9eb4691bcb66360acee473a8cf75f594" - -SRC_URI[md5sum] = "8691cea6bc7b44bce6e2115260a54323" -SRC_URI[sha256sum] = "b7e7d433cab77171a4c752875d91836f3040306bab5063fb6dbe11f64ea69551" - -inherit pypi setuptools3 ptest - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ -" - -do_install_ptest() { - cp -f ${S}/test_umsgpack.py ${D}${PTEST_PATH}/ -} - -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-datetime \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-u-msgpack-python_2.8.0.bb b/meta-python/recipes-devtools/python/python3-u-msgpack-python_2.8.0.bb new file mode 100644 index 0000000000..6cde243fe8 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-u-msgpack-python_2.8.0.bb @@ -0,0 +1,27 @@ +DESCRIPTION = "A portable, lightweight MessagePack serializer and deserializer written in pure Python." + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=17df11353545c53a2df0ce7655859306" + +SRC_URI[sha256sum] = "b801a83d6ed75e6df41e44518b4f2a9c221dc2da4bcd5380e3a0feda520bc61a" + +inherit pypi setuptools3 ptest + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + cp -f ${S}/test_umsgpack.py ${D}${PTEST_PATH}/ +} + +RDEPENDS:${PN} += " \ + 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-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 new file mode 100644 index 0000000000..8ba8ada556 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-ujson/0001-setup.py-Do-not-strip-debugging-symbols.patch @@ -0,0 +1,37 @@ +From aec3b64b0aaea0178b44ea65a204d76696e6a45e Mon Sep 17 00:00:00 2001 +From: Leon Anavi <leon.anavi@konsulko.com> +Date: Mon, 10 Jan 2022 14:04:28 +0200 +Subject: [PATCH] setup.py: Do not strip debugging symbols + +Do not strip debugging symbols from Linux binaries to avoid +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/setup.py b/setup.py +index b98963b..d42f07a 100644 +--- a/setup.py ++++ b/setup.py +@@ -19,13 +19,7 @@ if not dconv_libs: + dconv_source_files.extend(glob("./deps/double-conversion/double-conversion/*.cc")) + dconv_source_files.append("./lib/dconv_wrapper.cc") + +-if platform.system() == "Linux" and environ.get("UJSON_BUILD_NO_STRIP", "0") not in ( +- "1", +- "True", +-): +- strip_flags = ["-Wl,--strip-all"] +-else: +- strip_flags = [] ++strip_flags = [] + + module1 = Extension( + "ujson", +-- +2.25.1 + diff --git a/meta-python/recipes-devtools/python/python3-ujson/run-ptest b/meta-python/recipes-devtools/python/python3-ujson/run-ptest index 1b3914647c..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/tests.py +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-ujson_4.0.2.bb b/meta-python/recipes-devtools/python/python3-ujson_4.0.2.bb deleted file mode 100644 index d79206fe68..0000000000 --- a/meta-python/recipes-devtools/python/python3-ujson_4.0.2.bb +++ /dev/null @@ -1,31 +0,0 @@ -SUMMARY = "Ultra fast JSON encoder and decoder for Python" -DESCRIPTION = "UltraJSON is an ultra fast JSON encoder and decoder written in pure C with bindings for Python 2.5+ and 3." - -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=10fa10456417c0252bcb8a498e498ffe" - -SRC_URI[sha256sum] = "c615a9e9e378a7383b756b7e7a73c38b22aeb8967a8bfbffd4741f7ffd043c4d" - -inherit pypi ptest setuptools3 - -SRC_URI += " \ - file://run-ptest \ -" - -DEPENDS += "${PYTHON_PN}-setuptools-scm-native" - -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-numbers \ -" - -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytz \ -" - -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-ujson_5.9.0.bb b/meta-python/recipes-devtools/python/python3-ujson_5.9.0.bb new file mode 100644 index 0000000000..b5f6be9f27 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-ujson_5.9.0.bb @@ -0,0 +1,35 @@ +SUMMARY = "Ultra fast JSON encoder and decoder for Python" +DESCRIPTION = "UltraJSON is an ultra fast JSON encoder and decoder written in pure C with bindings for Python 2.5+ and 3." + +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e0039a83d8a99726b5418f0b03302d0a" + +SRC_URI[sha256sum] = "89cc92e73d5501b8a7f48575eeb14ad27156ad092c2e9fc7e3cf949f07e75532" + +inherit pypi ptest setuptools3 + +SRC_URI += " \ + file://run-ptest \ + file://0001-setup.py-Do-not-strip-debugging-symbols.patch \ +" + +DEPENDS += "python3-setuptools-scm-native" + +RDEPENDS:${PN} += "\ + python3-datetime \ + python3-numbers \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-json \ + python3-pytest \ + python3-pytz \ + 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-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.6.0.bb b/meta-python/recipes-devtools/python/python3-unidiff_0.7.5.bb index c8e3d4c077..d77252beac 100644 --- a/meta-python/recipes-devtools/python/python3-unidiff_0.6.0.bb +++ b/meta-python/recipes-devtools/python/python3-unidiff_0.7.5.bb @@ -3,8 +3,7 @@ HOMEPAGE = "http://github.com/matiasb/python-unidiff" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=4c434b08ef42fea235bb019b5e5a97b3" -SRC_URI[md5sum] = "ae9524079753df7b1239f0378ed326b7" -SRC_URI[sha256sum] = "90c5214e9a357ff4b2fee19d91e77706638e3e00592a732d9405ea4e93da981f" +SRC_URI[sha256sum] = "2e5f0162052248946b9f0970a40e9e124236bf86c82b70821143a6fc1dea2574" inherit pypi setuptools3 ptest @@ -12,8 +11,9 @@ SRC_URI += " \ file://run-ptest \ " -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { @@ -21,7 +21,7 @@ do_install_ptest() { cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ } -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-codecs \ - ${PYTHON_PN}-io \ +RDEPENDS:${PN} += " \ + 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_3.0.1.bb b/meta-python/recipes-devtools/python/python3-uritemplate_4.1.1.bb index 2a83219a95..e741b6268d 100644 --- a/meta-python/recipes-devtools/python/python3-uritemplate_3.0.1.bb +++ b/meta-python/recipes-devtools/python/python3-uritemplate_4.1.1.bb @@ -2,12 +2,10 @@ # 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" -SRC_URI[md5sum] = "869fb44fbd56713490db7272eb36c8ae" -SRC_URI[sha256sum] = "5af8ad10cec94f215e3f48112de2022e1d5a37ed427fbd88652fa908f2ab7cae" +SRC_URI[sha256sum] = "4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0" inherit pypi setuptools3 ptest @@ -15,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() { diff --git a/meta-python/recipes-devtools/python/python3-urllib3_1.26.4.bb b/meta-python/recipes-devtools/python/python3-urllib3_1.26.4.bb deleted file mode 100644 index 0a31fb1e2d..0000000000 --- a/meta-python/recipes-devtools/python/python3-urllib3_1.26.4.bb +++ /dev/null @@ -1,22 +0,0 @@ -SUMMARY = "Python HTTP library with thread-safe connection pooling, file post support, sanity friendly, and more" -HOMEPAGE = "https://github.com/shazow/urllib3" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=c2823cb995439c984fd62a973d79815c" - -SRC_URI[sha256sum] = "e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937" - -inherit pypi setuptools3 - -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-certifi \ - ${PYTHON_PN}-cryptography \ - ${PYTHON_PN}-email \ - ${PYTHON_PN}-idna \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-pyopenssl \ - ${PYTHON_PN}-threading \ -" - -CVE_PRODUCT = "urllib3" - -BBCLASSEXTEND = "native nativesdk" 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-vcversioner_2.16.0.0.bb b/meta-python/recipes-devtools/python/python3-vcversioner_2.16.0.0.bb deleted file mode 100644 index 149078c51b..0000000000 --- a/meta-python/recipes-devtools/python/python3-vcversioner_2.16.0.0.bb +++ /dev/null @@ -1,12 +0,0 @@ -SUMMARY = "Python vcversioner, automagically update the project's version" -HOMEPAGE = "https://github.com/habnabit/vcversioner" - -LICENSE = "ISC" -LIC_FILES_CHKSUM = "file://PKG-INFO;md5=827a7a91a8d20d3c666b665cd96db8e3" - -SRC_URI[md5sum] = "aab6ef5e0cf8614a1b1140ed5b7f107d" -SRC_URI[sha256sum] = "dae60c17a479781f44a4010701833f1829140b1eeccd258762a74974aa06e19b" - -inherit pypi setuptools3 - -BBCLASSEXTEND = "native" 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 cf0fa30a32..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 @@ -1,10 +1,12 @@ SUMMARY = "Smart replacement for plain tuple used in __version__" SECTION = "devel/python" HOMEPAGE = "https://launchpad.net/versiontools" -LICENSE = "LGPLv3" +LICENSE = "LGPL-3.0-only" LIC_FILES_CHKSUM = "file://setup.py;beginline=3;endline=20;md5=02193721a38fd8a05a4ddeb7df8e294d" 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.0.0.bb b/meta-python/recipes-devtools/python/python3-waitress_3.0.0.bb index 490dcee6c4..7470fc02a0 100644 --- a/meta-python/recipes-devtools/python/python3-waitress_2.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-waitress_3.0.0.bb @@ -6,6 +6,10 @@ SECTION = "devel/python" LICENSE = "ZPL-2.1" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=78ccb3640dc841e1baecb3e27a6966b2" -SRC_URI[sha256sum] = "69e1f242c7f80273490d3403c3976f3ac3b26e289856936d1f620ed48f321897" +RDEPENDS:${PN} += " \ + python3-logging \ +" -inherit setuptools3 pypi +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.0.2.bb b/meta-python/recipes-devtools/python/python3-watchdog_2.0.2.bb deleted file mode 100644 index c5387dc356..0000000000 --- a/meta-python/recipes-devtools/python/python3-watchdog_2.0.2.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] = "532fedd993e75554671faa36cd04c580ced3fae084254a779afbbd8aaf00566b" - -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_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-webcolors/run-ptest b/meta-python/recipes-devtools/python/python3-webcolors/run-ptest deleted file mode 100644 index 3385d68939..0000000000 --- a/meta-python/recipes-devtools/python/python3-webcolors/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-webcolors_1.11.1.bb b/meta-python/recipes-devtools/python/python3-webcolors_1.11.1.bb deleted file mode 100644 index e567e0ba28..0000000000 --- a/meta-python/recipes-devtools/python/python3-webcolors_1.11.1.bb +++ /dev/null @@ -1,27 +0,0 @@ -SUMMARY = "Simple Python module for working with HTML/CSS color definitions." -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=25b90379a52351261c51272e7923d240" - -SRC_URI[md5sum] = "54d28a7c80b3e4d974ec2fee86768be9" -SRC_URI[sha256sum] = "76f360636957d1c976db7466bc71dcb713bb95ac8911944dffc55c01cb516de6" - -inherit pypi setuptools3 ptest - -RDEPENDS_${PN}_class-target = "\ - ${PYTHON_PN}-stringold \ -" - -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/ -} - -BBCLASSEXTEND = "native nativesdk" 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 aa5b8c782a..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 @@ -1,5 +1,5 @@ SUMMARY = "Character encoding aliases for legacy web content" -LICENSE = "BSD" +LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e910b35b0ef4e1f665b9a75d6afb7709" SRC_URI[md5sum] = "32f6e261d52e57bf7e1c4d41546d15b8" @@ -7,9 +7,9 @@ SRC_URI[sha256sum] = "b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab1674858 inherit pypi setuptools3 -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-codecs \ - ${PYTHON_PN}-json \ +RDEPENDS:${PN} += " \ + python3-codecs \ + python3-json \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-websocket-client_0.58.0.bb b/meta-python/recipes-devtools/python/python3-websocket-client_1.7.0.bb index a5d7d901b1..fc73f1b0a5 100644 --- a/meta-python/recipes-devtools/python/python3-websocket-client_0.58.0.bb +++ b/meta-python/recipes-devtools/python/python3-websocket-client_1.7.0.bb @@ -4,15 +4,14 @@ websocket-client module is WebSocket client for python. \ This provide the low level APIs for WebSocket. All APIs \ are the synchronous functions." HOMEPAGE = "https://github.com/websocket-client/websocket-client" -LICENSE = "LGPLv2.1" -LIC_FILES_CHKSUM = "file://LICENSE;md5=c96ca6c1de8adc025adfada81d06fba5" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=6eae3bb7247ccb2c3a087ea8de759c01" -SRC_URI[sha256sum] = "63509b41d158ae5b7f67eb4ad20fecbb4eee99434e73e140354dc3ff8e09716f" - -PYPI_PACKAGE = "websocket_client" +SRC_URI[sha256sum] = "10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6" inherit pypi setuptools3 -RDEPENDS_${PN} = "\ - ${PYTHON_PN}-six \ +RDEPENDS:${PN} = "\ + python3-six \ + python3-logging \ " diff --git a/meta-python/recipes-devtools/python/python3-websockets_8.1.bb b/meta-python/recipes-devtools/python/python3-websockets_8.1.bb deleted file mode 100644 index b09e978af7..0000000000 --- a/meta-python/recipes-devtools/python/python3-websockets_8.1.bb +++ /dev/null @@ -1,16 +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=ad5c6d36b3d0098b2f33a5ab69a9e750" - -inherit pypi setuptools3 - -SRC_URI[md5sum] = "f12d7f31fe8d0b3e65c12f845bcd0ad8" -SRC_URI[sha256sum] = "5c65d2da8c6bce0fca2528f69f44b2f977e06954c8512a952222cea50dad430f" - -BBCLASSEXTEND = "native nativesdk" - -RDEPENDS_${PN} = "\ - ${PYTHON_PN}-asyncio \ -" diff --git a/meta-python/recipes-devtools/python/python3-werkzeug_1.0.1.bb b/meta-python/recipes-devtools/python/python3-werkzeug_1.0.1.bb deleted file mode 100644 index 8af0fef60c..0000000000 --- a/meta-python/recipes-devtools/python/python3-werkzeug_1.0.1.bb +++ /dev/null @@ -1,39 +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[md5sum] = "5d499cfdd30de5d9c946994783772efd" -SRC_URI[sha256sum] = "6c80b1e5ad3665290ea39320b91e1be1e0d5f60652b964a3070216de83d2e47c" - -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 \ -" 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-wheel_0.36.2.bb b/meta-python/recipes-devtools/python/python3-wheel_0.36.2.bb deleted file mode 100644 index 9d9a441c01..0000000000 --- a/meta-python/recipes-devtools/python/python3-wheel_0.36.2.bb +++ /dev/null @@ -1,12 +0,0 @@ -SUMMARY = "The official binary distribution format for Python " -HOMEPAGE = "https://github.com/pypa/wheel" -SECTION = "devel/python" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=10;endline=10;md5=8227180126797a0148f94f483f3e1489" - -SRC_URI[sha256sum] = "e11eefd162658ea59a60a0f6c7d493a7190ea4b9a85e335b33489d9f17e0245e" - -inherit pypi setuptools3 - -BBCLASSEXTEND = "native" - 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 3ae4f91e38..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" @@ -15,23 +17,24 @@ 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 \ +RDEPENDS:${PN} += " \ + python3-email \ + python3-multiprocessing \ + python3-netclient \ + python3-numbers \ + python3-pickle \ + python3-shell \ + python3-stringold \ " SRC_URI += " \ file://run-ptest \ " -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-fcntl \ +RDEPENDS:${PN}-ptest += " \ + 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 2309bec5e2..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,7 +10,9 @@ 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 -RDEPENDS_${PN} += "python3-twisted python3-click python3-txdbus" +RDEPENDS:${PN} += "python3-twisted python3-click python3-txdbus" 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.12.1.bb b/meta-python/recipes-devtools/python/python3-wrapt_1.12.1.bb deleted file mode 100644 index bb9b95201b..0000000000 --- a/meta-python/recipes-devtools/python/python3-wrapt_1.12.1.bb +++ /dev/null @@ -1,17 +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=fdfc019b57affbe1d7a32e3d34e83db4" - -SRC_URI[md5sum] = "6d56ed0de4336462a73350341462f45e" -SRC_URI[sha256sum] = "b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7" - -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_2.3.3.bb b/meta-python/recipes-devtools/python/python3-wtforms_2.3.3.bb deleted file mode 100644 index a6e7a5b2e7..0000000000 --- a/meta-python/recipes-devtools/python/python3-wtforms_2.3.3.bb +++ /dev/null @@ -1,17 +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[md5sum] = "2b6ea167a71c6becf20f0934417fd06c" -SRC_URI[sha256sum] = "81195de0ac94fbc8368abbaf9197b88c4f3ffd6c2719b5bf5fc9da744f3d829c" - -PYPI_PACKAGE = "WTForms" - -inherit pypi setuptools3 - -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-netserver \ - ${PYTHON_PN}-numbers \ - " 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 8587ea8f33..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 @@ -9,7 +9,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=00ea1e843a43c20d9b63a8112239b0d1" SRC_URI[sha256sum] = "f72f148f54442c6b056bf931dbc34f986fd0c3b0b6b5a58d013c9aef274d0c88" -SRC_URI = "git://github.com/python-excel/xlrd.git \ +SRC_URI = "git://github.com/python-excel/xlrd.git;branch=master;protocol=https \ file://run-ptest \ " SRCREV = "b8d573e11ec149da695d695c81a156232b89a949" @@ -18,10 +18,17 @@ S = "${WORKDIR}/git" inherit ptest setuptools3 -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 \ +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-xlsxwriter_1.3.8.bb b/meta-python/recipes-devtools/python/python3-xlsxwriter_1.3.8.bb deleted file mode 100644 index e89221e5c3..0000000000 --- a/meta-python/recipes-devtools/python/python3-xlsxwriter_1.3.8.bb +++ /dev/null @@ -1,13 +0,0 @@ -SUMMARY = "Python 2 and 3 compatibility library" -HOMEPAGE = "https://xlsxwriter.readthedocs.io" -SECTION = "devel/python" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=4e95e368cd6cb090815046688e92d11e" - -inherit pypi setuptools3 - -PYPI_PACKAGE = "XlsxWriter" - -SRC_URI[sha256sum] = "2b7e22b1268c2ed85d73e5629097c9a63357f2429667ada9863cd05ff8ee33aa" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-xlsxwriter_3.1.9.bb b/meta-python/recipes-devtools/python/python3-xlsxwriter_3.1.9.bb new file mode 100644 index 0000000000..ee7dab35cb --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-xlsxwriter_3.1.9.bb @@ -0,0 +1,21 @@ +SUMMARY = "Python 2 and 3 compatibility library" +HOMEPAGE = "https://xlsxwriter.readthedocs.io" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=12d9fac1f0049be71ab5aa4a78da02b0" + +inherit pypi setuptools3 + +PYPI_PACKAGE = "XlsxWriter" + +RDEPENDS:${PN} += " \ + python3-crypt \ + python3-datetime \ + python3-compression \ + python3-numbers \ + python3-io \ +" + +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 7e7b5235ee..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" -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_1.6.1.bb b/meta-python/recipes-devtools/python/python3-xmlschema_3.0.1.bb index 91697e39a9..97dc683785 100644 --- a/meta-python/recipes-devtools/python/python3-xmlschema_1.6.1.bb +++ b/meta-python/recipes-devtools/python/python3-xmlschema_3.0.1.bb @@ -1,19 +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] = "d02b82bb4fce3af09495b85e6ada5ce0cfdaa865b09b28ecc0f5ab81fad7e328" +SRC_URI[sha256sum] = "bb24a5f4738e49d85d9eb03a2b5af26bbbbfdb055517ad953d98925094b8c026" PYPI_PACKAGE = "xmlschema" inherit pypi setuptools3 DEPENDS += "\ - ${PYTHON_PN}-elementpath-native \ + python3-elementpath-native \ " -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-elementpath \ +RDEPENDS:${PN} += "\ + 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 d078883249..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.6.bb deleted file mode 100644 index 3fdd3e58c0..0000000000 --- a/meta-python/recipes-devtools/python/python3-xmodem_0.4.6.bb +++ /dev/null @@ -1,14 +0,0 @@ -DESCRIPTION = "XMODEM protocol implementation" - -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" - -SRC_URI[sha256sum] = "089737298f5738eabc43f2519efdc80b402693768f16383f7013b9e6f8f279d7" - -inherit pypi setuptools3 - -RDEPENDS_${PN} += " \ - ${PYTHON_PN}-logging \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-xmodem_0.4.7.bb b/meta-python/recipes-devtools/python/python3-xmodem_0.4.7.bb new file mode 100644 index 0000000000..482f0c641b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-xmodem_0.4.7.bb @@ -0,0 +1,19 @@ +DESCRIPTION = "XMODEM protocol implementation" + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" + +SRC_URI[sha256sum] = "2f1068aa8676f0d1d112498b5786c4f8ea4f89d8f25d07d3a0f293cd21db1c35" + +inherit pypi setuptools3 + +do_install:append() { + install -d ${D}${docdir}/${PN} + mv ${D}/usr/doc/* ${D}${docdir}/${PN}/ + rmdir ${D}/usr/doc +} + +RDEPENDS:${PN} += " \ + 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_4.7.0.0.bb deleted file mode 100644 index b45e96d387..0000000000 --- a/meta-python/recipes-devtools/python/python3-xstatic-font-awesome_4.7.0.0.bb +++ /dev/null @@ -1,17 +0,0 @@ -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" -LIC_FILES_CHKSUM = "file://PKG-INFO;md5=313d021898694cd2b0ea6508bdfe51a2" - -PYPI_PACKAGE = "XStatic-Font-Awesome" - -SRC_URI[md5sum] = "141a0e9a7e21e82f922573a00ae0c166" -SRC_URI[sha256sum] = "e01fb480caaa7c7963dcb3328a4700e631bef6070db0e8b685816d220e685f6c" - -DEPENDS += " \ - ${PYTHON_PN}-xstatic \ - ${PYTHON_PN}-pip \ -" - -inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-xstatic-font-awesome_6.2.1.1.bb b/meta-python/recipes-devtools/python/python3-xstatic-font-awesome_6.2.1.1.bb new file mode 100644 index 0000000000..f4a51f318e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-xstatic-font-awesome_6.2.1.1.bb @@ -0,0 +1,16 @@ +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=f1a2fe131dcb2fc6243c26cf05ecdb36" + +PYPI_PACKAGE = "XStatic-Font-Awesome" + +SRC_URI[sha256sum] = "f075871096128638f2e1539020d8227754c3d885dd68e7ee6de9a01235076828" + +DEPENDS += " \ + 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_2.0.0.bb b/meta-python/recipes-devtools/python/python3-xxhash_2.0.0.bb deleted file mode 100644 index c5add103cd..0000000000 --- a/meta-python/recipes-devtools/python/python3-xxhash_2.0.0.bb +++ /dev/null @@ -1,22 +0,0 @@ -SUMMARY = "xxhash is a Python binding for the xxHash library by Yann Collet." -SECTION = "devel/python" -LICENSE = "BSD-2-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=5a8d76283514a1b7e6a414aba38629b5" - -SRC_URI[md5sum] = "010fda0427b621e5fe6930ad42511d88" -SRC_URI[sha256sum] = "58ca818554c1476fa1456f6cd4b87002e2294f09baf0f81e5a2a4968e62c423c" - -SRC_URI += " \ - file://run-ptest \ -" - -inherit pypi setuptools3 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-xxhash_3.4.1.bb b/meta-python/recipes-devtools/python/python3-xxhash_3.4.1.bb new file mode 100644 index 0000000000..be9ce005ea --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-xxhash_3.4.1.bb @@ -0,0 +1,24 @@ +SUMMARY = "xxhash is a Python binding for the xxHash library by Yann Collet." +SECTION = "devel/python" +LICENSE = "BSD-2-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3a9dab7f159514231249aa3e108ab26b" + +DEPENDS += "python3-setuptools-scm-native" + +SRC_URI[sha256sum] = "0379d6cf1ff987cd421609a264ce025e74f346e3e145dd106c0cc2e3ec3f99a9" + +SRC_URI += " \ + file://run-ptest \ +" + +inherit pypi python_setuptools_build_meta 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-yamlloader_1.0.0.bb b/meta-python/recipes-devtools/python/python3-yamlloader_1.3.2.bb index a2483a6f46..93c58c11ca 100644 --- a/meta-python/recipes-devtools/python/python3-yamlloader_1.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-yamlloader_1.3.2.bb @@ -3,10 +3,10 @@ HOMEPAGE = "https://github.com/Phynix/yamlloader" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=6831ef36faa29329bce2420c5356f97e" -SRC_URI[sha256sum] = "e96dc3dc6895d814c330c054c966d993fc81ef1dbf5a30a4bdafeb256359e058" +SRC_URI[sha256sum] = "7dbd98421d8090c521655f1b06ca030067f29df5253a8878126bce3a90f56817" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta -RDEPENDS_${PN}_class-target += "\ - ${PYTHON_PN}-pyyaml \ +RDEPENDS:${PN}:class-target += "\ + python3-pyyaml \ " diff --git a/meta-python/recipes-devtools/python/python3-yappi/0001-test_functionality-convert-line-endings-to-Unix.patch b/meta-python/recipes-devtools/python/python3-yappi/0001-test_functionality-convert-line-endings-to-Unix.patch new file mode 100644 index 0000000000..70d4607c29 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-yappi/0001-test_functionality-convert-line-endings-to-Unix.patch @@ -0,0 +1,3845 @@ +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 + +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_functionality.py | 3822 +++++++++++++++++------------------ + 1 file changed, 1911 insertions(+), 1911 deletions(-) + +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,1911 +1,1911 @@ +-import os
+-import sys
+-import time
+-import threading
+-import unittest
+-import yappi
+-import _yappi
+-import utils
+-import multiprocessing
+-import subprocess
+-
+-_counter = 0
+-
+-
+-class BasicUsage(utils.YappiUnitTestCase):
+-
+- def test_callback_function_int_return_overflow(self):
+- # this test is just here to check if any errors are generated, as the err
+- # is printed in C side, I did not include it here. THere are ways to test
+- # this deterministically, I did not bother
+- import ctypes
+-
+- def _unsigned_overflow_margin():
+- return 2**(ctypes.sizeof(ctypes.c_void_p) * 8) - 1
+-
+- def foo():
+- pass
+-
+- #with utils.captured_output() as (out, err):
+- yappi.set_context_id_callback(_unsigned_overflow_margin)
+- yappi.set_tag_callback(_unsigned_overflow_margin)
+- yappi.start()
+- foo()
+-
+- def test_issue60(self):
+-
+- def foo():
+- buf = bytearray()
+- buf += b't' * 200
+- view = memoryview(buf)[10:]
+- view = view.tobytes()
+- del buf[:10] # this throws exception
+- return view
+-
+- yappi.start(builtins=True)
+- foo()
+- self.assertTrue(
+- len(
+- yappi.get_func_stats(
+- filter_callback=lambda x: yappi.
+- func_matches(x, [memoryview.tobytes])
+- )
+- ) > 0
+- )
+- yappi.stop()
+-
+- def test_issue54(self):
+-
+- def _tag_cbk():
+- global _counter
+- _counter += 1
+- return _counter
+-
+- def a():
+- pass
+-
+- def b():
+- pass
+-
+- yappi.set_tag_callback(_tag_cbk)
+- yappi.start()
+- a()
+- a()
+- a()
+- yappi.stop()
+- stats = yappi.get_func_stats()
+- self.assertEqual(stats.pop().ncall, 3) # aggregated if no tag is given
+- stats = yappi.get_func_stats(tag=1)
+-
+- for i in range(1, 3):
+- stats = yappi.get_func_stats(tag=i)
+- stats = yappi.get_func_stats(
+- tag=i, filter_callback=lambda x: yappi.func_matches(x, [a])
+- )
+-
+- stat = stats.pop()
+- self.assertEqual(stat.ncall, 1)
+-
+- yappi.set_tag_callback(None)
+- yappi.clear_stats()
+- yappi.start()
+- b()
+- b()
+- stats = yappi.get_func_stats()
+- self.assertEqual(len(stats), 1)
+- stat = stats.pop()
+- self.assertEqual(stat.ncall, 2)
+-
+- def test_filter(self):
+-
+- def a():
+- pass
+-
+- def b():
+- a()
+-
+- def c():
+- b()
+-
+- _TCOUNT = 5
+-
+- ts = []
+- yappi.start()
+- for i in range(_TCOUNT):
+- t = threading.Thread(target=c)
+- t.start()
+- ts.append(t)
+-
+- for t in ts:
+- t.join()
+-
+- yappi.stop()
+-
+- ctx_ids = []
+- for tstat in yappi.get_thread_stats():
+- if tstat.name == '_MainThread':
+- main_ctx_id = tstat.id
+- else:
+- ctx_ids.append(tstat.id)
+-
+- fstats = yappi.get_func_stats(filter={"ctx_id": 9})
+- self.assertTrue(fstats.empty())
+- fstats = yappi.get_func_stats(
+- filter={
+- "ctx_id": main_ctx_id,
+- "name": "c"
+- }
+- ) # main thread
+- self.assertTrue(fstats.empty())
+-
+- for i in ctx_ids:
+- fstats = yappi.get_func_stats(
+- filter={
+- "ctx_id": i,
+- "name": "a",
+- "ncall": 1
+- }
+- )
+- self.assertEqual(fstats.pop().ncall, 1)
+- fstats = yappi.get_func_stats(filter={"ctx_id": i, "name": "b"})
+- self.assertEqual(fstats.pop().ncall, 1)
+- fstats = yappi.get_func_stats(filter={"ctx_id": i, "name": "c"})
+- self.assertEqual(fstats.pop().ncall, 1)
+-
+- yappi.clear_stats()
+- yappi.start(builtins=True)
+- time.sleep(0.1)
+- yappi.stop()
+- fstats = yappi.get_func_stats(filter={"module": "time"})
+- self.assertEqual(len(fstats), 1)
+-
+- # invalid filters`
+- self.assertRaises(
+- Exception, yappi.get_func_stats, filter={'tag': "sss"}
+- )
+- self.assertRaises(
+- Exception, yappi.get_func_stats, filter={'ctx_id': "None"}
+- )
+-
+- def test_filter_callback(self):
+-
+- def a():
+- time.sleep(0.1)
+-
+- def b():
+- a()
+-
+- def c():
+- pass
+-
+- def d():
+- pass
+-
+- yappi.set_clock_type("wall")
+- yappi.start(builtins=True)
+- a()
+- b()
+- c()
+- d()
+- stats = yappi.get_func_stats(
+- filter_callback=lambda x: yappi.func_matches(x, [a, b])
+- )
+- #stats.print_all()
+- r1 = '''
+- tests/test_functionality.py:98 a 2 0.000000 0.200350 0.100175
+- tests/test_functionality.py:101 b 1 0.000000 0.120000 0.100197
+- '''
+- self.assert_traces_almost_equal(r1, stats)
+- self.assertEqual(len(stats), 2)
+- stats = yappi.get_func_stats(
+- filter_callback=lambda x: yappi.
+- module_matches(x, [sys.modules[__name__]])
+- )
+- r1 = '''
+- tests/test_functionality.py:98 a 2 0.000000 0.230130 0.115065
+- tests/test_functionality.py:101 b 1 0.000000 0.120000 0.109011
+- tests/test_functionality.py:104 c 1 0.000000 0.000002 0.000002
+- tests/test_functionality.py:107 d 1 0.000000 0.000001 0.000001
+- '''
+- self.assert_traces_almost_equal(r1, stats)
+- self.assertEqual(len(stats), 4)
+-
+- stats = yappi.get_func_stats(
+- filter_callback=lambda x: yappi.func_matches(x, [time.sleep])
+- )
+- self.assertEqual(len(stats), 1)
+- r1 = '''
+- time.sleep 2 0.206804 0.220000 0.103402
+- '''
+- self.assert_traces_almost_equal(r1, stats)
+-
+- def test_print_formatting(self):
+-
+- def a():
+- pass
+-
+- def b():
+- a()
+-
+- func_cols = {
+- 1: ("name", 48),
+- 0: ("ncall", 5),
+- 2: ("tsub", 8),
+- }
+- thread_cols = {
+- 1: ("name", 48),
+- 0: ("ttot", 8),
+- }
+-
+- yappi.start()
+- a()
+- b()
+- yappi.stop()
+- fs = yappi.get_func_stats()
+- cs = fs[1].children
+- ts = yappi.get_thread_stats()
+- #fs.print_all(out=sys.stderr, columns={1:("name", 70), })
+- #cs.print_all(out=sys.stderr, columns=func_cols)
+- #ts.print_all(out=sys.stderr, columns=thread_cols)
+- #cs.print_all(out=sys.stderr, columns={})
+-
+- self.assertRaises(
+- yappi.YappiError, fs.print_all, columns={1: ("namee", 9)}
+- )
+- self.assertRaises(
+- yappi.YappiError, cs.print_all, columns={1: ("dd", 0)}
+- )
+- self.assertRaises(
+- yappi.YappiError, ts.print_all, columns={1: ("tidd", 0)}
+- )
+-
+- def test_get_clock(self):
+- yappi.set_clock_type('cpu')
+- self.assertEqual('cpu', yappi.get_clock_type())
+- clock_info = yappi.get_clock_info()
+- self.assertTrue('api' in clock_info)
+- self.assertTrue('resolution' in clock_info)
+-
+- yappi.set_clock_type('wall')
+- self.assertEqual('wall', yappi.get_clock_type())
+-
+- t0 = yappi.get_clock_time()
+- time.sleep(0.1)
+- duration = yappi.get_clock_time() - t0
+- self.assertTrue(0.05 < duration < 0.3)
+-
+- def test_profile_decorator(self):
+-
+- def aggregate(func, stats):
+- fname = f"tests/{func.__name__}.profile"
+- try:
+- stats.add(fname)
+- except OSError:
+- pass
+- stats.save(fname)
+- raise Exception("messing around")
+-
+- @yappi.profile(return_callback=aggregate)
+- def a(x, y):
+- if x + y == 25:
+- raise Exception("")
+- return x + y
+-
+- def b():
+- pass
+-
+- try:
+- os.remove(
+- "tests/a.profile"
+- ) # remove the one from prev test, if available
+- except:
+- pass
+-
+- # global profile is on to mess things up
+- yappi.start()
+- b()
+-
+- # assert functionality and call function at same time
+- try:
+- self.assertEqual(a(1, 2), 3)
+- except:
+- pass
+- try:
+- self.assertEqual(a(2, 5), 7)
+- except:
+- pass
+- try:
+- a(4, 21)
+- except:
+- pass
+- stats = yappi.get_func_stats().add("tests/a.profile")
+- fsa = utils.find_stat_by_name(stats, 'a')
+- self.assertEqual(fsa.ncall, 3)
+- self.assertEqual(len(stats), 1) # b() should be cleared out.
+-
+- @yappi.profile(return_callback=aggregate)
+- def count_down_rec(n):
+- if n == 0:
+- return
+- count_down_rec(n - 1)
+-
+- try:
+- os.remove(
+- "tests/count_down_rec.profile"
+- ) # remove the one from prev test, if available
+- except:
+- pass
+-
+- try:
+- count_down_rec(4)
+- except:
+- pass
+- try:
+- count_down_rec(3)
+- except:
+- pass
+-
+- stats = yappi.YFuncStats("tests/count_down_rec.profile")
+- fsrec = utils.find_stat_by_name(stats, 'count_down_rec')
+- self.assertEqual(fsrec.ncall, 9)
+- self.assertEqual(fsrec.nactualcall, 2)
+-
+- def test_strip_dirs(self):
+-
+- def a():
+- pass
+-
+- stats = utils.run_and_get_func_stats(a, )
+- stats.strip_dirs()
+- fsa = utils.find_stat_by_name(stats, "a")
+- self.assertEqual(fsa.module, os.path.basename(fsa.module))
+-
+- @unittest.skipIf(os.name == "nt", "do not run on Windows")
+- def test_run_as_script(self):
+- import re
+- p = subprocess.Popen(
+- ['yappi', os.path.join('./tests', 'run_as_script.py')],
+- stdout=subprocess.PIPE
+- )
+- out, err = p.communicate()
+- self.assertEqual(p.returncode, 0)
+- func_stats, thread_stats = re.split(
+- b'name\\s+id\\s+tid\\s+ttot\\s+scnt\\s*\n', out
+- )
+- self.assertTrue(b'FancyThread' in thread_stats)
+-
+- def test_yappi_overhead(self):
+- LOOP_COUNT = 100000
+-
+- def a():
+- pass
+-
+- def b():
+- for i in range(LOOP_COUNT):
+- a()
+-
+- t0 = time.time()
+- yappi.start()
+- b()
+- yappi.stop()
+- time_with_yappi = time.time() - t0
+- t0 = time.time()
+- b()
+- time_without_yappi = time.time() - t0
+- if time_without_yappi == 0:
+- time_without_yappi = 0.000001
+-
+- # in latest v0.82, I calculated this as close to "7.0" in my machine.
+- # however, %83 of this overhead is coming from tickcount(). The other %17
+- # seems to have been evenly distributed to the internal bookkeeping
+- # structures/algorithms which seems acceptable. Note that our test only
+- # tests one function being profiled at-a-time in a short interval.
+- # profiling high number of functions in a small time
+- # is a different beast, (which is pretty unlikely in most applications)
+- # So as a conclusion: I cannot see any optimization window for Yappi that
+- # is worth implementing as we will only optimize %17 of the time.
+- sys.stderr.write("\r\nYappi puts %0.1f times overhead to the profiled application in average.\r\n" % \
+- (time_with_yappi / time_without_yappi))
+-
+- def test_clear_stats_while_running(self):
+-
+- def a():
+- pass
+-
+- yappi.start()
+- a()
+- yappi.clear_stats()
+- a()
+- stats = yappi.get_func_stats()
+- fsa = utils.find_stat_by_name(stats, 'a')
+- self.assertEqual(fsa.ncall, 1)
+-
+- def test_generator(self):
+-
+- def _gen(n):
+- while (n > 0):
+- yield n
+- n -= 1
+-
+- yappi.start()
+- for x in _gen(5):
+- pass
+- self.assertTrue(
+- yappi.convert2pstats(yappi.get_func_stats()) is not None
+- )
+-
+- def test_slice_child_stats_and_strip_dirs(self):
+-
+- def b():
+- for i in range(10000000):
+- pass
+-
+- def a():
+- b()
+-
+- yappi.start(builtins=True)
+- a()
+- stats = yappi.get_func_stats()
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+- self.assertTrue(fsa.children[0:1] is not None)
+- prev_afullname = fsa.full_name
+- prev_bchildfullname = fsa.children[fsb].full_name
+- stats.strip_dirs()
+- self.assertTrue(len(prev_afullname) > len(fsa.full_name))
+- self.assertTrue(
+- len(prev_bchildfullname) > len(fsa.children[fsb].full_name)
+- )
+-
+- def test_children_stat_functions(self):
+- _timings = {"a_1": 5, "b_1": 3, "c_1": 1}
+- _yappi._set_test_timings(_timings)
+-
+- def b():
+- pass
+-
+- def c():
+- pass
+-
+- def a():
+- b()
+- c()
+-
+- yappi.start()
+- a()
+- b() # non-child call
+- c() # non-child call
+- stats = yappi.get_func_stats()
+- fsa = utils.find_stat_by_name(stats, 'a')
+- childs_of_a = fsa.children.get().sort("tavg", "desc")
+- prev_item = None
+- for item in childs_of_a:
+- if prev_item:
+- self.assertTrue(prev_item.tavg > item.tavg)
+- prev_item = item
+- childs_of_a.sort("name", "desc")
+- prev_item = None
+- for item in childs_of_a:
+- if prev_item:
+- self.assertTrue(prev_item.name > item.name)
+- prev_item = item
+- childs_of_a.clear()
+- self.assertTrue(childs_of_a.empty())
+-
+- def test_no_stats_different_clock_type_load(self):
+-
+- def a():
+- pass
+-
+- yappi.start()
+- a()
+- yappi.stop()
+- yappi.get_func_stats().save("tests/ystats1.ys")
+- yappi.clear_stats()
+- yappi.set_clock_type("WALL")
+- yappi.start()
+- yappi.stop()
+- stats = yappi.get_func_stats().add("tests/ystats1.ys")
+- fsa = utils.find_stat_by_name(stats, 'a')
+- self.assertTrue(fsa is not None)
+-
+- def test_subsequent_profile(self):
+- _timings = {"a_1": 1, "b_1": 1}
+- _yappi._set_test_timings(_timings)
+-
+- def a():
+- pass
+-
+- def b():
+- pass
+-
+- yappi.start()
+- a()
+- yappi.stop()
+- yappi.start()
+- b()
+- yappi.stop()
+- stats = yappi.get_func_stats()
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+- self.assertTrue(fsa is not None)
+- self.assertTrue(fsb is not None)
+- self.assertEqual(fsa.ttot, 1)
+- self.assertEqual(fsb.ttot, 1)
+-
+- def test_lambda(self):
+- f = lambda: time.sleep(0.3)
+- yappi.set_clock_type("wall")
+- yappi.start()
+- f()
+- stats = yappi.get_func_stats()
+- fsa = utils.find_stat_by_name(stats, '<lambda>')
+- self.assertTrue(fsa.ttot > 0.1)
+-
+- def test_module_stress(self):
+- self.assertEqual(yappi.is_running(), False)
+-
+- yappi.start()
+- yappi.clear_stats()
+- self.assertRaises(_yappi.error, yappi.set_clock_type, "wall")
+-
+- yappi.stop()
+- yappi.clear_stats()
+- yappi.set_clock_type("cpu")
+- self.assertRaises(yappi.YappiError, yappi.set_clock_type, "dummy")
+- self.assertEqual(yappi.is_running(), False)
+- yappi.clear_stats()
+- yappi.clear_stats()
+-
+- def test_stat_sorting(self):
+- _timings = {"a_1": 13, "b_1": 10, "a_2": 6, "b_2": 1}
+- _yappi._set_test_timings(_timings)
+-
+- self._ncall = 1
+-
+- def a():
+- b()
+-
+- def b():
+- if self._ncall == 2:
+- return
+- self._ncall += 1
+- a()
+-
+- stats = utils.run_and_get_func_stats(a)
+- stats = stats.sort("totaltime", "desc")
+- prev_stat = None
+- for stat in stats:
+- if prev_stat:
+- self.assertTrue(prev_stat.ttot >= stat.ttot)
+- prev_stat = stat
+- stats = stats.sort("totaltime", "asc")
+- prev_stat = None
+- for stat in stats:
+- if prev_stat:
+- self.assertTrue(prev_stat.ttot <= stat.ttot)
+- prev_stat = stat
+- stats = stats.sort("avgtime", "asc")
+- prev_stat = None
+- for stat in stats:
+- if prev_stat:
+- self.assertTrue(prev_stat.tavg <= stat.tavg)
+- prev_stat = stat
+- stats = stats.sort("name", "asc")
+- prev_stat = None
+- for stat in stats:
+- if prev_stat:
+- self.assertTrue(prev_stat.name <= stat.name)
+- prev_stat = stat
+- stats = stats.sort("subtime", "asc")
+- prev_stat = None
+- for stat in stats:
+- if prev_stat:
+- self.assertTrue(prev_stat.tsub <= stat.tsub)
+- prev_stat = stat
+-
+- self.assertRaises(
+- yappi.YappiError, stats.sort, "invalid_func_sorttype_arg"
+- )
+- self.assertRaises(
+- yappi.YappiError, stats.sort, "totaltime",
+- "invalid_func_sortorder_arg"
+- )
+-
+- def test_start_flags(self):
+- self.assertEqual(_yappi._get_start_flags(), None)
+- yappi.start()
+-
+- def a():
+- pass
+-
+- a()
+- self.assertEqual(_yappi._get_start_flags()["profile_builtins"], 0)
+- self.assertEqual(_yappi._get_start_flags()["profile_multicontext"], 1)
+- self.assertEqual(len(yappi.get_thread_stats()), 1)
+-
+- def test_builtin_profiling(self):
+-
+- def a():
+- time.sleep(0.4) # is a builtin function
+-
+- yappi.set_clock_type('wall')
+-
+- yappi.start(builtins=True)
+- a()
+- stats = yappi.get_func_stats()
+- fsa = utils.find_stat_by_name(stats, 'sleep')
+- self.assertTrue(fsa is not None)
+- self.assertTrue(fsa.ttot > 0.3)
+- yappi.stop()
+- yappi.clear_stats()
+-
+- def a():
+- pass
+-
+- yappi.start()
+- t = threading.Thread(target=a)
+- t.start()
+- t.join()
+- stats = yappi.get_func_stats()
+-
+- def test_singlethread_profiling(self):
+- yappi.set_clock_type('wall')
+-
+- def a():
+- time.sleep(0.2)
+-
+- class Worker1(threading.Thread):
+-
+- def a(self):
+- time.sleep(0.3)
+-
+- def run(self):
+- self.a()
+-
+- yappi.start(profile_threads=False)
+-
+- c = Worker1()
+- c.start()
+- c.join()
+- a()
+- stats = yappi.get_func_stats()
+- fsa1 = utils.find_stat_by_name(stats, 'Worker1.a')
+- fsa2 = utils.find_stat_by_name(stats, 'a')
+- self.assertTrue(fsa1 is None)
+- self.assertTrue(fsa2 is not None)
+- self.assertTrue(fsa2.ttot > 0.1)
+-
+- def test_run(self):
+-
+- def profiled():
+- pass
+-
+- yappi.clear_stats()
+- try:
+- with yappi.run():
+- profiled()
+- stats = yappi.get_func_stats()
+- finally:
+- yappi.clear_stats()
+-
+- self.assertIsNotNone(utils.find_stat_by_name(stats, 'profiled'))
+-
+- def test_run_recursive(self):
+-
+- def profiled():
+- pass
+-
+- def not_profiled():
+- pass
+-
+- yappi.clear_stats()
+- try:
+- with yappi.run():
+- with yappi.run():
+- profiled()
+- # Profiling stopped here
+- not_profiled()
+- stats = yappi.get_func_stats()
+- finally:
+- yappi.clear_stats()
+-
+- self.assertIsNotNone(utils.find_stat_by_name(stats, 'profiled'))
+- self.assertIsNone(utils.find_stat_by_name(stats, 'not_profiled'))
+-
+-
+-class StatSaveScenarios(utils.YappiUnitTestCase):
+-
+- def test_pstats_conversion(self):
+-
+- def pstat_id(fs):
+- return (fs.module, fs.lineno, fs.name)
+-
+- def a():
+- d()
+-
+- def b():
+- d()
+-
+- def c():
+- pass
+-
+- def d():
+- pass
+-
+- _timings = {"a_1": 12, "b_1": 7, "c_1": 5, "d_1": 2}
+- _yappi._set_test_timings(_timings)
+- stats = utils.run_and_get_func_stats(a, )
+- stats.strip_dirs()
+- stats.save("tests/a1.pstats", type="pstat")
+- fsa_pid = pstat_id(utils.find_stat_by_name(stats, "a"))
+- fsd_pid = pstat_id(utils.find_stat_by_name(stats, "d"))
+- yappi.clear_stats()
+- _yappi._set_test_timings(_timings)
+- stats = utils.run_and_get_func_stats(a, )
+- stats.strip_dirs()
+- stats.save("tests/a2.pstats", type="pstat")
+- yappi.clear_stats()
+- _yappi._set_test_timings(_timings)
+- stats = utils.run_and_get_func_stats(b, )
+- stats.strip_dirs()
+- stats.save("tests/b1.pstats", type="pstat")
+- fsb_pid = pstat_id(utils.find_stat_by_name(stats, "b"))
+- yappi.clear_stats()
+- _yappi._set_test_timings(_timings)
+- stats = utils.run_and_get_func_stats(c, )
+- stats.strip_dirs()
+- stats.save("tests/c1.pstats", type="pstat")
+- fsc_pid = pstat_id(utils.find_stat_by_name(stats, "c"))
+-
+- # merge saved stats and check pstats values are correct
+- import pstats
+- p = pstats.Stats(
+- 'tests/a1.pstats', 'tests/a2.pstats', 'tests/b1.pstats',
+- 'tests/c1.pstats'
+- )
+- p.strip_dirs()
+- # ct = ttot, tt = tsub
+- (cc, nc, tt, ct, callers) = p.stats[fsa_pid]
+- self.assertEqual(cc, nc, 2)
+- self.assertEqual(tt, 20)
+- self.assertEqual(ct, 24)
+- (cc, nc, tt, ct, callers) = p.stats[fsd_pid]
+- self.assertEqual(cc, nc, 3)
+- self.assertEqual(tt, 6)
+- self.assertEqual(ct, 6)
+- self.assertEqual(len(callers), 2)
+- (cc, nc, tt, ct) = callers[fsa_pid]
+- self.assertEqual(cc, nc, 2)
+- self.assertEqual(tt, 4)
+- self.assertEqual(ct, 4)
+- (cc, nc, tt, ct) = callers[fsb_pid]
+- self.assertEqual(cc, nc, 1)
+- self.assertEqual(tt, 2)
+- self.assertEqual(ct, 2)
+-
+- def test_merge_stats(self):
+- _timings = {
+- "a_1": 15,
+- "b_1": 14,
+- "c_1": 12,
+- "d_1": 10,
+- "e_1": 9,
+- "f_1": 7,
+- "g_1": 6,
+- "h_1": 5,
+- "i_1": 1
+- }
+- _yappi._set_test_timings(_timings)
+-
+- def a():
+- b()
+-
+- def b():
+- c()
+-
+- def c():
+- d()
+-
+- def d():
+- e()
+-
+- def e():
+- f()
+-
+- def f():
+- g()
+-
+- def g():
+- h()
+-
+- def h():
+- i()
+-
+- def i():
+- pass
+-
+- yappi.start()
+- a()
+- a()
+- yappi.stop()
+- stats = yappi.get_func_stats()
+- self.assertRaises(
+- NotImplementedError, stats.save, "", "INVALID_SAVE_TYPE"
+- )
+- stats.save("tests/ystats2.ys")
+- yappi.clear_stats()
+- _yappi._set_test_timings(_timings)
+- yappi.start()
+- a()
+- stats = yappi.get_func_stats().add("tests/ystats2.ys")
+- fsa = utils.find_stat_by_name(stats, "a")
+- fsb = utils.find_stat_by_name(stats, "b")
+- fsc = utils.find_stat_by_name(stats, "c")
+- fsd = utils.find_stat_by_name(stats, "d")
+- fse = utils.find_stat_by_name(stats, "e")
+- fsf = utils.find_stat_by_name(stats, "f")
+- fsg = utils.find_stat_by_name(stats, "g")
+- fsh = utils.find_stat_by_name(stats, "h")
+- fsi = utils.find_stat_by_name(stats, "i")
+- self.assertEqual(fsa.ttot, 45)
+- self.assertEqual(fsa.ncall, 3)
+- self.assertEqual(fsa.nactualcall, 3)
+- self.assertEqual(fsa.tsub, 3)
+- self.assertEqual(fsa.children[fsb].ttot, fsb.ttot)
+- self.assertEqual(fsa.children[fsb].tsub, fsb.tsub)
+- self.assertEqual(fsb.children[fsc].ttot, fsc.ttot)
+- self.assertEqual(fsb.children[fsc].tsub, fsc.tsub)
+- self.assertEqual(fsc.tsub, 6)
+- self.assertEqual(fsc.children[fsd].ttot, fsd.ttot)
+- self.assertEqual(fsc.children[fsd].tsub, fsd.tsub)
+- self.assertEqual(fsd.children[fse].ttot, fse.ttot)
+- self.assertEqual(fsd.children[fse].tsub, fse.tsub)
+- self.assertEqual(fse.children[fsf].ttot, fsf.ttot)
+- self.assertEqual(fse.children[fsf].tsub, fsf.tsub)
+- self.assertEqual(fsf.children[fsg].ttot, fsg.ttot)
+- self.assertEqual(fsf.children[fsg].tsub, fsg.tsub)
+- self.assertEqual(fsg.ttot, 18)
+- self.assertEqual(fsg.tsub, 3)
+- self.assertEqual(fsg.children[fsh].ttot, fsh.ttot)
+- self.assertEqual(fsg.children[fsh].tsub, fsh.tsub)
+- self.assertEqual(fsh.ttot, 15)
+- self.assertEqual(fsh.tsub, 12)
+- self.assertEqual(fsh.tavg, 5)
+- self.assertEqual(fsh.children[fsi].ttot, fsi.ttot)
+- self.assertEqual(fsh.children[fsi].tsub, fsi.tsub)
+- #stats.debug_print()
+-
+- def test_merge_multithreaded_stats(self):
+- import _yappi
+- timings = {"a_1": 2, "b_1": 1}
+- _yappi._set_test_timings(timings)
+-
+- def a():
+- pass
+-
+- def b():
+- pass
+-
+- yappi.start()
+- t = threading.Thread(target=a)
+- t.start()
+- t.join()
+- t = threading.Thread(target=b)
+- t.start()
+- t.join()
+- yappi.get_func_stats().save("tests/ystats1.ys")
+- yappi.clear_stats()
+- _yappi._set_test_timings(timings)
+- self.assertEqual(len(yappi.get_func_stats()), 0)
+- self.assertEqual(len(yappi.get_thread_stats()), 1)
+- t = threading.Thread(target=a)
+- t.start()
+- t.join()
+-
+- self.assertEqual(_yappi._get_start_flags()["profile_builtins"], 0)
+- self.assertEqual(_yappi._get_start_flags()["profile_multicontext"], 1)
+- yappi.get_func_stats().save("tests/ystats2.ys")
+-
+- stats = yappi.YFuncStats([
+- "tests/ystats1.ys",
+- "tests/ystats2.ys",
+- ])
+- fsa = utils.find_stat_by_name(stats, "a")
+- fsb = utils.find_stat_by_name(stats, "b")
+- self.assertEqual(fsa.ncall, 2)
+- self.assertEqual(fsb.ncall, 1)
+- self.assertEqual(fsa.tsub, fsa.ttot, 4)
+- self.assertEqual(fsb.tsub, fsb.ttot, 1)
+-
+- def test_merge_load_different_clock_types(self):
+- yappi.start(builtins=True)
+-
+- def a():
+- b()
+-
+- def b():
+- c()
+-
+- def c():
+- pass
+-
+- t = threading.Thread(target=a)
+- t.start()
+- t.join()
+- yappi.get_func_stats().sort("name", "asc").save("tests/ystats1.ys")
+- yappi.stop()
+- yappi.clear_stats()
+- yappi.start(builtins=False)
+- t = threading.Thread(target=a)
+- t.start()
+- t.join()
+- yappi.get_func_stats().save("tests/ystats2.ys")
+- yappi.stop()
+- self.assertRaises(_yappi.error, yappi.set_clock_type, "wall")
+- yappi.clear_stats()
+- yappi.set_clock_type("wall")
+- yappi.start()
+- t = threading.Thread(target=a)
+- t.start()
+- t.join()
+- yappi.get_func_stats().save("tests/ystats3.ys")
+- self.assertRaises(
+- yappi.YappiError,
+- yappi.YFuncStats().add("tests/ystats1.ys").add, "tests/ystats3.ys"
+- )
+- stats = yappi.YFuncStats(["tests/ystats1.ys",
+- "tests/ystats2.ys"]).sort("name")
+- fsa = utils.find_stat_by_name(stats, "a")
+- fsb = utils.find_stat_by_name(stats, "b")
+- fsc = utils.find_stat_by_name(stats, "c")
+- self.assertEqual(fsa.ncall, 2)
+- self.assertEqual(fsa.ncall, fsb.ncall, fsc.ncall)
+-
+- def test_merge_aabab_aabbc(self):
+- _timings = {
+- "a_1": 15,
+- "a_2": 14,
+- "b_1": 12,
+- "a_3": 10,
+- "b_2": 9,
+- "c_1": 4
+- }
+- _yappi._set_test_timings(_timings)
+-
+- def a():
+- if self._ncall == 1:
+- self._ncall += 1
+- a()
+- elif self._ncall == 5:
+- self._ncall += 1
+- a()
+- else:
+- b()
+-
+- def b():
+- if self._ncall == 2:
+- self._ncall += 1
+- a()
+- elif self._ncall == 6:
+- self._ncall += 1
+- b()
+- elif self._ncall == 7:
+- c()
+- else:
+- return
+-
+- def c():
+- pass
+-
+- self._ncall = 1
+- stats = utils.run_and_get_func_stats(a, )
+- stats.save("tests/ystats1.ys")
+- yappi.clear_stats()
+- _yappi._set_test_timings(_timings)
+- #stats.print_all()
+-
+- self._ncall = 5
+- stats = utils.run_and_get_func_stats(a, )
+- stats.save("tests/ystats2.ys")
+-
+- #stats.print_all()
+-
+- def a(): # same name but another function(code object)
+- pass
+-
+- yappi.start()
+- a()
+- stats = yappi.get_func_stats().add(
+- ["tests/ystats1.ys", "tests/ystats2.ys"]
+- )
+- #stats.print_all()
+- self.assertEqual(len(stats), 4)
+-
+- fsa = None
+- for stat in stats:
+- if stat.name == "a" and stat.ttot == 45:
+- fsa = stat
+- break
+- self.assertTrue(fsa is not None)
+-
+- self.assertEqual(fsa.ncall, 7)
+- self.assertEqual(fsa.nactualcall, 3)
+- self.assertEqual(fsa.ttot, 45)
+- self.assertEqual(fsa.tsub, 10)
+- fsb = utils.find_stat_by_name(stats, "b")
+- fsc = utils.find_stat_by_name(stats, "c")
+- self.assertEqual(fsb.ncall, 6)
+- self.assertEqual(fsb.nactualcall, 3)
+- self.assertEqual(fsb.ttot, 36)
+- self.assertEqual(fsb.tsub, 27)
+- self.assertEqual(fsb.tavg, 6)
+- self.assertEqual(fsc.ttot, 8)
+- self.assertEqual(fsc.tsub, 8)
+- self.assertEqual(fsc.tavg, 4)
+- self.assertEqual(fsc.nactualcall, fsc.ncall, 2)
+-
+-
+-class MultithreadedScenarios(utils.YappiUnitTestCase):
+-
+- 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()
+- 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.
+-
+- When this issue happens multiple Threads have same tid as the internal ts_ptr
+- will be same for different contexts. So, let's see if that happens
+- '''
+-
+- def foo():
+- time.sleep(0.2)
+-
+- def bar():
+- time.sleep(0.1)
+-
+- def thread_func():
+- yappi.set_clock_type("wall")
+- yappi.start()
+-
+- bar()
+-
+- t = threading.Thread(target=thread_func)
+- t.start()
+- t.join()
+-
+- foo()
+-
+- yappi.stop()
+-
+- thread_ids = set()
+- for tstat in yappi.get_thread_stats():
+- self.assertTrue(tstat.tid not in thread_ids)
+- thread_ids.add(tstat.tid)
+-
+- def test_subsequent_profile(self):
+- WORKER_COUNT = 5
+-
+- def a():
+- pass
+-
+- def b():
+- pass
+-
+- def c():
+- pass
+-
+- _timings = {
+- "a_1": 3,
+- "b_1": 2,
+- "c_1": 1,
+- }
+-
+- yappi.start()
+-
+- def g():
+- pass
+-
+- g()
+- yappi.stop()
+- yappi.clear_stats()
+- _yappi._set_test_timings(_timings)
+- yappi.start()
+-
+- _dummy = []
+- for i in range(WORKER_COUNT):
+- t = threading.Thread(target=a)
+- t.start()
+- t.join()
+- for i in range(WORKER_COUNT):
+- t = threading.Thread(target=b)
+- t.start()
+- _dummy.append(t)
+- t.join()
+- for i in range(WORKER_COUNT):
+- t = threading.Thread(target=a)
+- t.start()
+- t.join()
+- for i in range(WORKER_COUNT):
+- t = threading.Thread(target=c)
+- t.start()
+- t.join()
+- yappi.stop()
+- yappi.start()
+-
+- def f():
+- pass
+-
+- f()
+- stats = yappi.get_func_stats()
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+- fsc = utils.find_stat_by_name(stats, 'c')
+- self.assertEqual(fsa.ncall, 10)
+- self.assertEqual(fsb.ncall, 5)
+- self.assertEqual(fsc.ncall, 5)
+- self.assertEqual(fsa.ttot, fsa.tsub, 30)
+- self.assertEqual(fsb.ttot, fsb.tsub, 10)
+- self.assertEqual(fsc.ttot, fsc.tsub, 5)
+-
+- # MACOSx optimizes by only creating one worker thread
+- self.assertTrue(len(yappi.get_thread_stats()) >= 2)
+-
+- def test_basic(self):
+- yappi.set_clock_type('wall')
+-
+- def dummy():
+- pass
+-
+- def a():
+- time.sleep(0.2)
+-
+- class Worker1(threading.Thread):
+-
+- def a(self):
+- time.sleep(0.3)
+-
+- def run(self):
+- self.a()
+-
+- yappi.start(builtins=False, profile_threads=True)
+-
+- c = Worker1()
+- c.start()
+- c.join()
+- a()
+- stats = yappi.get_func_stats()
+- fsa1 = utils.find_stat_by_name(stats, 'Worker1.a')
+- fsa2 = utils.find_stat_by_name(stats, 'a')
+- self.assertTrue(fsa1 is not None)
+- self.assertTrue(fsa2 is not None)
+- self.assertTrue(fsa1.ttot > 0.2)
+- self.assertTrue(fsa2.ttot > 0.1)
+- tstats = yappi.get_thread_stats()
+- self.assertEqual(len(tstats), 2)
+- tsa = utils.find_stat_by_name(tstats, 'Worker1')
+- tsm = utils.find_stat_by_name(tstats, '_MainThread')
+- dummy() # call dummy to force ctx name to be retrieved again.
+- self.assertTrue(tsa is not None)
+- # 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,
+- f"Could not find \"_MainThread\". Found: {', '.join(utils.get_stat_names(tstats))}")
+-
+- def test_ctx_stats(self):
+- from threading import Thread
+- DUMMY_WORKER_COUNT = 5
+- yappi.start()
+-
+- class DummyThread(Thread):
+- pass
+-
+- def dummy():
+- pass
+-
+- def dummy_worker():
+- pass
+-
+- for i in range(DUMMY_WORKER_COUNT):
+- t = DummyThread(target=dummy_worker)
+- t.start()
+- t.join()
+- yappi.stop()
+- stats = yappi.get_thread_stats()
+- tsa = utils.find_stat_by_name(stats, "DummyThread")
+- self.assertTrue(tsa is not None)
+- yappi.clear_stats()
+- time.sleep(1.0)
+- _timings = {
+- "a_1": 6,
+- "b_1": 5,
+- "c_1": 3,
+- "d_1": 1,
+- "a_2": 4,
+- "b_2": 3,
+- "c_2": 2,
+- "d_2": 1
+- }
+- _yappi._set_test_timings(_timings)
+-
+- class Thread1(Thread):
+- pass
+-
+- class Thread2(Thread):
+- pass
+-
+- def a():
+- b()
+-
+- def b():
+- c()
+-
+- def c():
+- d()
+-
+- def d():
+- time.sleep(0.6)
+-
+- yappi.set_clock_type("wall")
+- yappi.start()
+- t1 = Thread1(target=a)
+- t1.start()
+- t2 = Thread2(target=a)
+- t2.start()
+- t1.join()
+- t2.join()
+- stats = yappi.get_thread_stats()
+-
+- # the fist clear_stats clears the context table?
+- tsa = utils.find_stat_by_name(stats, "DummyThread")
+- self.assertTrue(tsa is None)
+-
+- tst1 = utils.find_stat_by_name(stats, "Thread1")
+- tst2 = utils.find_stat_by_name(stats, "Thread2")
+- tsmain = utils.find_stat_by_name(stats, "_MainThread")
+- dummy() # call dummy to force ctx name to be retrieved again.
+- self.assertTrue(len(stats) == 3)
+- self.assertTrue(tst1 is not None)
+- self.assertTrue(tst2 is not None)
+- # 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,
+- 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)
+-
+- # test sorting of the ctx stats
+- stats = stats.sort("totaltime", "desc")
+- prev_stat = None
+- for stat in stats:
+- if prev_stat:
+- self.assertTrue(prev_stat.ttot >= stat.ttot)
+- prev_stat = stat
+- stats = stats.sort("totaltime", "asc")
+- prev_stat = None
+- for stat in stats:
+- if prev_stat:
+- self.assertTrue(prev_stat.ttot <= stat.ttot)
+- prev_stat = stat
+- stats = stats.sort("schedcount", "desc")
+- prev_stat = None
+- for stat in stats:
+- if prev_stat:
+- self.assertTrue(prev_stat.sched_count >= stat.sched_count)
+- prev_stat = stat
+- stats = stats.sort("name", "desc")
+- prev_stat = None
+- for stat in stats:
+- if prev_stat:
+- self.assertTrue(prev_stat.name.lower() >= stat.name.lower())
+- prev_stat = stat
+- self.assertRaises(
+- yappi.YappiError, stats.sort, "invalid_thread_sorttype_arg"
+- )
+- self.assertRaises(
+- yappi.YappiError, stats.sort, "invalid_thread_sortorder_arg"
+- )
+-
+- def test_ctx_stats_cpu(self):
+-
+- def get_thread_name():
+- try:
+- return threading.current_thread().name
+- except AttributeError:
+- return "Anonymous"
+-
+- def burn_cpu(sec):
+- t0 = yappi.get_clock_time()
+- elapsed = 0
+- while (elapsed < sec):
+- for _ in range(1000):
+- pass
+- elapsed = yappi.get_clock_time() - t0
+-
+- def test():
+-
+- ts = []
+- for i in (0.01, 0.05, 0.1):
+- t = threading.Thread(target=burn_cpu, args=(i, ))
+- t.name = f"burn_cpu-{str(i)}"
+- t.start()
+- ts.append(t)
+- for t in ts:
+- t.join()
+-
+- yappi.set_clock_type("cpu")
+- yappi.set_context_name_callback(get_thread_name)
+-
+- yappi.start()
+-
+- test()
+-
+- yappi.stop()
+-
+- tstats = yappi.get_thread_stats()
+- r1 = '''
+- burn_cpu-0.1 3 123145356058624 0.100105 8
+- burn_cpu-0.05 2 123145361313792 0.050149 8
+- burn_cpu-0.01 1 123145356058624 0.010127 2
+- MainThread 0 4321620864 0.001632 6
+- '''
+- self.assert_ctx_stats_almost_equal(r1, tstats)
+-
+- def test_producer_consumer_with_queues(self):
+- # we currently just stress yappi, no functionality test is done here.
+- yappi.start()
+- from queue import Queue
+- from threading import Thread
+- WORKER_THREAD_COUNT = 50
+- WORK_ITEM_COUNT = 2000
+-
+- def worker():
+- while True:
+- item = q.get()
+- # do the work with item
+- q.task_done()
+-
+- q = Queue()
+- for i in range(WORKER_THREAD_COUNT):
+- t = Thread(target=worker)
+- t.daemon = True
+- t.start()
+-
+- for item in range(WORK_ITEM_COUNT):
+- q.put(item)
+- q.join() # block until all tasks are done
+- #yappi.get_func_stats().sort("callcount").print_all()
+- yappi.stop()
+-
+- def test_temporary_lock_waiting(self):
+- yappi.start()
+- _lock = threading.Lock()
+-
+- def worker():
+- _lock.acquire()
+- try:
+- time.sleep(1.0)
+- finally:
+- _lock.release()
+-
+- t1 = threading.Thread(target=worker)
+- t2 = threading.Thread(target=worker)
+- t1.start()
+- t2.start()
+- t1.join()
+- t2.join()
+- #yappi.get_func_stats().sort("callcount").print_all()
+- yappi.stop()
+-
+- @unittest.skipIf(os.name != "posix", "requires Posix compliant OS")
+- def test_signals_with_blocking_calls(self):
+- import signal, os, time
+-
+- # just to verify if signal is handled correctly and stats/yappi are not corrupted.
+- def handler(signum, frame):
+- raise Exception("Signal handler executed!")
+-
+- yappi.start()
+- signal.signal(signal.SIGALRM, handler)
+- signal.alarm(1)
+- self.assertRaises(Exception, time.sleep, 2)
+- stats = yappi.get_func_stats()
+- fsh = utils.find_stat_by_name(stats, "handler")
+- self.assertTrue(fsh is not None)
+-
+- def test_concurrent_futures(self):
+- yappi.start()
+- from concurrent.futures import ThreadPoolExecutor
+- with ThreadPoolExecutor(max_workers=5) as executor:
+- f = executor.submit(pow, 5, 2)
+- self.assertEqual(f.result(), 25)
+- time.sleep(1.0)
+- yappi.stop()
+-
+- def test_barrier(self):
+- yappi.start()
+- b = threading.Barrier(2, timeout=1)
+-
+- def worker():
+- try:
+- b.wait()
+- except threading.BrokenBarrierError:
+- pass
+- except Exception:
+- raise Exception("BrokenBarrierError not raised")
+-
+- t1 = threading.Thread(target=worker)
+- t1.start()
+- #b.wait()
+- t1.join()
+- yappi.stop()
+-
+-
+-class NonRecursiveFunctions(utils.YappiUnitTestCase):
+-
+- def test_abcd(self):
+- _timings = {"a_1": 6, "b_1": 5, "c_1": 3, "d_1": 1}
+- _yappi._set_test_timings(_timings)
+-
+- def a():
+- b()
+-
+- def b():
+- c()
+-
+- def c():
+- d()
+-
+- def d():
+- pass
+-
+- stats = utils.run_and_get_func_stats(a)
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+- fsc = utils.find_stat_by_name(stats, 'c')
+- fsd = utils.find_stat_by_name(stats, 'd')
+- cfsab = fsa.children[fsb]
+- cfsbc = fsb.children[fsc]
+- cfscd = fsc.children[fsd]
+-
+- self.assertEqual(fsa.ttot, 6)
+- self.assertEqual(fsa.tsub, 1)
+- self.assertEqual(fsb.ttot, 5)
+- self.assertEqual(fsb.tsub, 2)
+- self.assertEqual(fsc.ttot, 3)
+- self.assertEqual(fsc.tsub, 2)
+- self.assertEqual(fsd.ttot, 1)
+- self.assertEqual(fsd.tsub, 1)
+- self.assertEqual(cfsab.ttot, 5)
+- self.assertEqual(cfsab.tsub, 2)
+- self.assertEqual(cfsbc.ttot, 3)
+- self.assertEqual(cfsbc.tsub, 2)
+- self.assertEqual(cfscd.ttot, 1)
+- self.assertEqual(cfscd.tsub, 1)
+-
+- def test_stop_in_middle(self):
+- _timings = {"a_1": 6, "b_1": 4}
+- _yappi._set_test_timings(_timings)
+-
+- def a():
+- b()
+- yappi.stop()
+-
+- def b():
+- time.sleep(0.2)
+-
+- yappi.start()
+- a()
+- stats = yappi.get_func_stats()
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+-
+- self.assertEqual(fsa.ncall, 1)
+- self.assertEqual(fsa.nactualcall, 0)
+- self.assertEqual(fsa.ttot, 0) # no call_leave called
+- self.assertEqual(fsa.tsub, 0) # no call_leave called
+- self.assertEqual(fsb.ttot, 4)
+-
+-
+-class RecursiveFunctions(utils.YappiUnitTestCase):
+-
+- def test_fibonacci(self):
+-
+- def fib(n):
+- if n > 1:
+- return fib(n - 1) + fib(n - 2)
+- else:
+- return n
+-
+- stats = utils.run_and_get_func_stats(fib, 22)
+- fs = utils.find_stat_by_name(stats, 'fib')
+- self.assertEqual(fs.ncall, 57313)
+- self.assertEqual(fs.ttot, fs.tsub)
+-
+- def test_abcadc(self):
+- _timings = {
+- "a_1": 20,
+- "b_1": 19,
+- "c_1": 17,
+- "a_2": 13,
+- "d_1": 12,
+- "c_2": 10,
+- "a_3": 5
+- }
+- _yappi._set_test_timings(_timings)
+-
+- def a(n):
+- if n == 3:
+- return
+- if n == 1 + 1:
+- d(n)
+- else:
+- b(n)
+-
+- def b(n):
+- c(n)
+-
+- def c(n):
+- a(n + 1)
+-
+- def d(n):
+- c(n)
+-
+- stats = utils.run_and_get_func_stats(a, 1)
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+- fsc = utils.find_stat_by_name(stats, 'c')
+- fsd = utils.find_stat_by_name(stats, 'd')
+- self.assertEqual(fsa.ncall, 3)
+- self.assertEqual(fsa.nactualcall, 1)
+- self.assertEqual(fsa.ttot, 20)
+- self.assertEqual(fsa.tsub, 7)
+- self.assertEqual(fsb.ttot, 19)
+- self.assertEqual(fsb.tsub, 2)
+- self.assertEqual(fsc.ttot, 17)
+- self.assertEqual(fsc.tsub, 9)
+- self.assertEqual(fsd.ttot, 12)
+- self.assertEqual(fsd.tsub, 2)
+- cfsca = fsc.children[fsa]
+- self.assertEqual(cfsca.nactualcall, 0)
+- self.assertEqual(cfsca.ncall, 2)
+- self.assertEqual(cfsca.ttot, 13)
+- self.assertEqual(cfsca.tsub, 6)
+-
+- def test_aaaa(self):
+- _timings = {"d_1": 9, "d_2": 7, "d_3": 3, "d_4": 2}
+- _yappi._set_test_timings(_timings)
+-
+- def d(n):
+- if n == 3:
+- return
+- d(n + 1)
+-
+- stats = utils.run_and_get_func_stats(d, 0)
+- fsd = utils.find_stat_by_name(stats, 'd')
+- self.assertEqual(fsd.ncall, 4)
+- self.assertEqual(fsd.nactualcall, 1)
+- self.assertEqual(fsd.ttot, 9)
+- self.assertEqual(fsd.tsub, 9)
+- cfsdd = fsd.children[fsd]
+- self.assertEqual(cfsdd.ttot, 7)
+- self.assertEqual(cfsdd.tsub, 7)
+- self.assertEqual(cfsdd.ncall, 3)
+- self.assertEqual(cfsdd.nactualcall, 0)
+-
+- def test_abcabc(self):
+- _timings = {
+- "a_1": 20,
+- "b_1": 19,
+- "c_1": 17,
+- "a_2": 13,
+- "b_2": 11,
+- "c_2": 9,
+- "a_3": 6
+- }
+- _yappi._set_test_timings(_timings)
+-
+- def a(n):
+- if n == 3:
+- return
+- else:
+- b(n)
+-
+- def b(n):
+- c(n)
+-
+- def c(n):
+- a(n + 1)
+-
+- stats = utils.run_and_get_func_stats(a, 1)
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+- fsc = utils.find_stat_by_name(stats, 'c')
+- self.assertEqual(fsa.ncall, 3)
+- self.assertEqual(fsa.nactualcall, 1)
+- self.assertEqual(fsa.ttot, 20)
+- self.assertEqual(fsa.tsub, 9)
+- self.assertEqual(fsb.ttot, 19)
+- self.assertEqual(fsb.tsub, 4)
+- self.assertEqual(fsc.ttot, 17)
+- self.assertEqual(fsc.tsub, 7)
+- cfsab = fsa.children[fsb]
+- cfsbc = fsb.children[fsc]
+- cfsca = fsc.children[fsa]
+- self.assertEqual(cfsab.ttot, 19)
+- self.assertEqual(cfsab.tsub, 4)
+- self.assertEqual(cfsbc.ttot, 17)
+- self.assertEqual(cfsbc.tsub, 7)
+- self.assertEqual(cfsca.ttot, 13)
+- self.assertEqual(cfsca.tsub, 8)
+-
+- def test_abcbca(self):
+- _timings = {"a_1": 10, "b_1": 9, "c_1": 7, "b_2": 4, "c_2": 2, "a_2": 1}
+- _yappi._set_test_timings(_timings)
+- self._ncall = 1
+-
+- def a():
+- if self._ncall == 1:
+- b()
+- else:
+- return
+-
+- def b():
+- c()
+-
+- def c():
+- if self._ncall == 1:
+- self._ncall += 1
+- b()
+- else:
+- a()
+-
+- stats = utils.run_and_get_func_stats(a)
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+- fsc = utils.find_stat_by_name(stats, 'c')
+- cfsab = fsa.children[fsb]
+- cfsbc = fsb.children[fsc]
+- cfsca = fsc.children[fsa]
+- self.assertEqual(fsa.ttot, 10)
+- self.assertEqual(fsa.tsub, 2)
+- self.assertEqual(fsb.ttot, 9)
+- self.assertEqual(fsb.tsub, 4)
+- self.assertEqual(fsc.ttot, 7)
+- self.assertEqual(fsc.tsub, 4)
+- self.assertEqual(cfsab.ttot, 9)
+- self.assertEqual(cfsab.tsub, 2)
+- self.assertEqual(cfsbc.ttot, 7)
+- self.assertEqual(cfsbc.tsub, 4)
+- self.assertEqual(cfsca.ttot, 1)
+- self.assertEqual(cfsca.tsub, 1)
+- self.assertEqual(cfsca.ncall, 1)
+- self.assertEqual(cfsca.nactualcall, 0)
+-
+- def test_aabccb(self):
+- _timings = {
+- "a_1": 13,
+- "a_2": 11,
+- "b_1": 9,
+- "c_1": 5,
+- "c_2": 3,
+- "b_2": 1
+- }
+- _yappi._set_test_timings(_timings)
+- self._ncall = 1
+-
+- def a():
+- if self._ncall == 1:
+- self._ncall += 1
+- a()
+- else:
+- b()
+-
+- def b():
+- if self._ncall == 3:
+- return
+- else:
+- c()
+-
+- def c():
+- if self._ncall == 2:
+- self._ncall += 1
+- c()
+- else:
+- b()
+-
+- stats = utils.run_and_get_func_stats(a)
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+- fsc = utils.find_stat_by_name(stats, 'c')
+- cfsaa = fsa.children[fsa.index]
+- cfsab = fsa.children[fsb]
+- cfsbc = fsb.children[fsc.full_name]
+- cfscc = fsc.children[fsc]
+- cfscb = fsc.children[fsb]
+- self.assertEqual(fsb.ttot, 9)
+- self.assertEqual(fsb.tsub, 5)
+- self.assertEqual(cfsbc.ttot, 5)
+- self.assertEqual(cfsbc.tsub, 2)
+- self.assertEqual(fsa.ttot, 13)
+- self.assertEqual(fsa.tsub, 4)
+- self.assertEqual(cfsab.ttot, 9)
+- self.assertEqual(cfsab.tsub, 4)
+- self.assertEqual(cfsaa.ttot, 11)
+- self.assertEqual(cfsaa.tsub, 2)
+- self.assertEqual(fsc.ttot, 5)
+- self.assertEqual(fsc.tsub, 4)
+-
+- def test_abaa(self):
+- _timings = {"a_1": 13, "b_1": 10, "a_2": 9, "a_3": 5}
+- _yappi._set_test_timings(_timings)
+-
+- self._ncall = 1
+-
+- def a():
+- if self._ncall == 1:
+- b()
+- elif self._ncall == 2:
+- self._ncall += 1
+- a()
+- else:
+- return
+-
+- def b():
+- self._ncall += 1
+- a()
+-
+- stats = utils.run_and_get_func_stats(a)
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+- cfsaa = fsa.children[fsa]
+- cfsba = fsb.children[fsa]
+- self.assertEqual(fsb.ttot, 10)
+- self.assertEqual(fsb.tsub, 1)
+- self.assertEqual(fsa.ttot, 13)
+- self.assertEqual(fsa.tsub, 12)
+- self.assertEqual(cfsaa.ttot, 5)
+- self.assertEqual(cfsaa.tsub, 5)
+- self.assertEqual(cfsba.ttot, 9)
+- self.assertEqual(cfsba.tsub, 4)
+-
+- def test_aabb(self):
+- _timings = {"a_1": 13, "a_2": 10, "b_1": 9, "b_2": 5}
+- _yappi._set_test_timings(_timings)
+-
+- self._ncall = 1
+-
+- def a():
+- if self._ncall == 1:
+- self._ncall += 1
+- a()
+- elif self._ncall == 2:
+- b()
+- else:
+- return
+-
+- def b():
+- if self._ncall == 2:
+- self._ncall += 1
+- b()
+- else:
+- return
+-
+- stats = utils.run_and_get_func_stats(a)
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+- cfsaa = fsa.children[fsa]
+- cfsab = fsa.children[fsb]
+- cfsbb = fsb.children[fsb]
+- self.assertEqual(fsa.ttot, 13)
+- self.assertEqual(fsa.tsub, 4)
+- self.assertEqual(fsb.ttot, 9)
+- self.assertEqual(fsb.tsub, 9)
+- self.assertEqual(cfsaa.ttot, 10)
+- self.assertEqual(cfsaa.tsub, 1)
+- self.assertEqual(cfsab.ttot, 9)
+- self.assertEqual(cfsab.tsub, 4)
+- self.assertEqual(cfsbb.ttot, 5)
+- self.assertEqual(cfsbb.tsub, 5)
+-
+- def test_abbb(self):
+- _timings = {"a_1": 13, "b_1": 10, "b_2": 6, "b_3": 1}
+- _yappi._set_test_timings(_timings)
+-
+- self._ncall = 1
+-
+- def a():
+- if self._ncall == 1:
+- b()
+-
+- def b():
+- if self._ncall == 3:
+- return
+- self._ncall += 1
+- b()
+-
+- stats = utils.run_and_get_func_stats(a)
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+- cfsab = fsa.children[fsb]
+- cfsbb = fsb.children[fsb]
+- self.assertEqual(fsa.ttot, 13)
+- self.assertEqual(fsa.tsub, 3)
+- self.assertEqual(fsb.ttot, 10)
+- self.assertEqual(fsb.tsub, 10)
+- self.assertEqual(fsb.ncall, 3)
+- self.assertEqual(fsb.nactualcall, 1)
+- self.assertEqual(cfsab.ttot, 10)
+- self.assertEqual(cfsab.tsub, 4)
+- self.assertEqual(cfsbb.ttot, 6)
+- self.assertEqual(cfsbb.tsub, 6)
+- self.assertEqual(cfsbb.nactualcall, 0)
+- self.assertEqual(cfsbb.ncall, 2)
+-
+- def test_aaab(self):
+- _timings = {"a_1": 13, "a_2": 10, "a_3": 6, "b_1": 1}
+- _yappi._set_test_timings(_timings)
+-
+- self._ncall = 1
+-
+- def a():
+- if self._ncall == 3:
+- b()
+- return
+- self._ncall += 1
+- a()
+-
+- def b():
+- return
+-
+- stats = utils.run_and_get_func_stats(a)
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+- cfsaa = fsa.children[fsa]
+- cfsab = fsa.children[fsb]
+- self.assertEqual(fsa.ttot, 13)
+- self.assertEqual(fsa.tsub, 12)
+- self.assertEqual(fsb.ttot, 1)
+- self.assertEqual(fsb.tsub, 1)
+- self.assertEqual(cfsaa.ttot, 10)
+- self.assertEqual(cfsaa.tsub, 9)
+- self.assertEqual(cfsab.ttot, 1)
+- self.assertEqual(cfsab.tsub, 1)
+-
+- def test_abab(self):
+- _timings = {"a_1": 13, "b_1": 10, "a_2": 6, "b_2": 1}
+- _yappi._set_test_timings(_timings)
+-
+- self._ncall = 1
+-
+- def a():
+- b()
+-
+- def b():
+- if self._ncall == 2:
+- return
+- self._ncall += 1
+- a()
+-
+- stats = utils.run_and_get_func_stats(a)
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+- cfsab = fsa.children[fsb]
+- cfsba = fsb.children[fsa]
+- self.assertEqual(fsa.ttot, 13)
+- self.assertEqual(fsa.tsub, 8)
+- self.assertEqual(fsb.ttot, 10)
+- self.assertEqual(fsb.tsub, 5)
+- self.assertEqual(cfsab.ttot, 10)
+- self.assertEqual(cfsab.tsub, 5)
+- self.assertEqual(cfsab.ncall, 2)
+- self.assertEqual(cfsab.nactualcall, 1)
+- self.assertEqual(cfsba.ttot, 6)
+- self.assertEqual(cfsba.tsub, 5)
+-
+-
+-if __name__ == '__main__':
+- # import sys;sys.argv = ['', 'BasicUsage.test_run_as_script']
+- # import sys;sys.argv = ['', 'MultithreadedScenarios.test_subsequent_profile']
+- unittest.main()
++import os ++import sys ++import time ++import threading ++import unittest ++import yappi ++import _yappi ++import utils ++import multiprocessing ++import subprocess ++ ++_counter = 0 ++ ++ ++class BasicUsage(utils.YappiUnitTestCase): ++ ++ def test_callback_function_int_return_overflow(self): ++ # this test is just here to check if any errors are generated, as the err ++ # is printed in C side, I did not include it here. THere are ways to test ++ # this deterministically, I did not bother ++ import ctypes ++ ++ def _unsigned_overflow_margin(): ++ return 2**(ctypes.sizeof(ctypes.c_void_p) * 8) - 1 ++ ++ def foo(): ++ pass ++ ++ #with utils.captured_output() as (out, err): ++ yappi.set_context_id_callback(_unsigned_overflow_margin) ++ yappi.set_tag_callback(_unsigned_overflow_margin) ++ yappi.start() ++ foo() ++ ++ def test_issue60(self): ++ ++ def foo(): ++ buf = bytearray() ++ buf += b't' * 200 ++ view = memoryview(buf)[10:] ++ view = view.tobytes() ++ del buf[:10] # this throws exception ++ return view ++ ++ yappi.start(builtins=True) ++ foo() ++ self.assertTrue( ++ len( ++ yappi.get_func_stats( ++ filter_callback=lambda x: yappi. ++ func_matches(x, [memoryview.tobytes]) ++ ) ++ ) > 0 ++ ) ++ yappi.stop() ++ ++ def test_issue54(self): ++ ++ def _tag_cbk(): ++ global _counter ++ _counter += 1 ++ return _counter ++ ++ def a(): ++ pass ++ ++ def b(): ++ pass ++ ++ yappi.set_tag_callback(_tag_cbk) ++ yappi.start() ++ a() ++ a() ++ a() ++ yappi.stop() ++ stats = yappi.get_func_stats() ++ self.assertEqual(stats.pop().ncall, 3) # aggregated if no tag is given ++ stats = yappi.get_func_stats(tag=1) ++ ++ for i in range(1, 3): ++ stats = yappi.get_func_stats(tag=i) ++ stats = yappi.get_func_stats( ++ tag=i, filter_callback=lambda x: yappi.func_matches(x, [a]) ++ ) ++ ++ stat = stats.pop() ++ self.assertEqual(stat.ncall, 1) ++ ++ yappi.set_tag_callback(None) ++ yappi.clear_stats() ++ yappi.start() ++ b() ++ b() ++ stats = yappi.get_func_stats() ++ self.assertEqual(len(stats), 1) ++ stat = stats.pop() ++ self.assertEqual(stat.ncall, 2) ++ ++ def test_filter(self): ++ ++ def a(): ++ pass ++ ++ def b(): ++ a() ++ ++ def c(): ++ b() ++ ++ _TCOUNT = 5 ++ ++ ts = [] ++ yappi.start() ++ for i in range(_TCOUNT): ++ t = threading.Thread(target=c) ++ t.start() ++ ts.append(t) ++ ++ for t in ts: ++ t.join() ++ ++ yappi.stop() ++ ++ ctx_ids = [] ++ for tstat in yappi.get_thread_stats(): ++ if tstat.name == '_MainThread': ++ main_ctx_id = tstat.id ++ else: ++ ctx_ids.append(tstat.id) ++ ++ fstats = yappi.get_func_stats(filter={"ctx_id": 9}) ++ self.assertTrue(fstats.empty()) ++ fstats = yappi.get_func_stats( ++ filter={ ++ "ctx_id": main_ctx_id, ++ "name": "c" ++ } ++ ) # main thread ++ self.assertTrue(fstats.empty()) ++ ++ for i in ctx_ids: ++ fstats = yappi.get_func_stats( ++ filter={ ++ "ctx_id": i, ++ "name": "a", ++ "ncall": 1 ++ } ++ ) ++ self.assertEqual(fstats.pop().ncall, 1) ++ fstats = yappi.get_func_stats(filter={"ctx_id": i, "name": "b"}) ++ self.assertEqual(fstats.pop().ncall, 1) ++ fstats = yappi.get_func_stats(filter={"ctx_id": i, "name": "c"}) ++ self.assertEqual(fstats.pop().ncall, 1) ++ ++ yappi.clear_stats() ++ yappi.start(builtins=True) ++ time.sleep(0.1) ++ yappi.stop() ++ fstats = yappi.get_func_stats(filter={"module": "time"}) ++ self.assertEqual(len(fstats), 1) ++ ++ # invalid filters` ++ self.assertRaises( ++ Exception, yappi.get_func_stats, filter={'tag': "sss"} ++ ) ++ self.assertRaises( ++ Exception, yappi.get_func_stats, filter={'ctx_id': "None"} ++ ) ++ ++ def test_filter_callback(self): ++ ++ def a(): ++ time.sleep(0.1) ++ ++ def b(): ++ a() ++ ++ def c(): ++ pass ++ ++ def d(): ++ pass ++ ++ yappi.set_clock_type("wall") ++ yappi.start(builtins=True) ++ a() ++ b() ++ c() ++ d() ++ stats = yappi.get_func_stats( ++ filter_callback=lambda x: yappi.func_matches(x, [a, b]) ++ ) ++ #stats.print_all() ++ r1 = ''' ++ tests/test_functionality.py:98 a 2 0.000000 0.200350 0.100175 ++ tests/test_functionality.py:101 b 1 0.000000 0.120000 0.100197 ++ ''' ++ self.assert_traces_almost_equal(r1, stats) ++ self.assertEqual(len(stats), 2) ++ stats = yappi.get_func_stats( ++ filter_callback=lambda x: yappi. ++ module_matches(x, [sys.modules[__name__]]) ++ ) ++ r1 = ''' ++ tests/test_functionality.py:98 a 2 0.000000 0.230130 0.115065 ++ tests/test_functionality.py:101 b 1 0.000000 0.120000 0.109011 ++ tests/test_functionality.py:104 c 1 0.000000 0.000002 0.000002 ++ tests/test_functionality.py:107 d 1 0.000000 0.000001 0.000001 ++ ''' ++ self.assert_traces_almost_equal(r1, stats) ++ self.assertEqual(len(stats), 4) ++ ++ stats = yappi.get_func_stats( ++ filter_callback=lambda x: yappi.func_matches(x, [time.sleep]) ++ ) ++ self.assertEqual(len(stats), 1) ++ r1 = ''' ++ time.sleep 2 0.206804 0.220000 0.103402 ++ ''' ++ self.assert_traces_almost_equal(r1, stats) ++ ++ def test_print_formatting(self): ++ ++ def a(): ++ pass ++ ++ def b(): ++ a() ++ ++ func_cols = { ++ 1: ("name", 48), ++ 0: ("ncall", 5), ++ 2: ("tsub", 8), ++ } ++ thread_cols = { ++ 1: ("name", 48), ++ 0: ("ttot", 8), ++ } ++ ++ yappi.start() ++ a() ++ b() ++ yappi.stop() ++ fs = yappi.get_func_stats() ++ cs = fs[1].children ++ ts = yappi.get_thread_stats() ++ #fs.print_all(out=sys.stderr, columns={1:("name", 70), }) ++ #cs.print_all(out=sys.stderr, columns=func_cols) ++ #ts.print_all(out=sys.stderr, columns=thread_cols) ++ #cs.print_all(out=sys.stderr, columns={}) ++ ++ self.assertRaises( ++ yappi.YappiError, fs.print_all, columns={1: ("namee", 9)} ++ ) ++ self.assertRaises( ++ yappi.YappiError, cs.print_all, columns={1: ("dd", 0)} ++ ) ++ self.assertRaises( ++ yappi.YappiError, ts.print_all, columns={1: ("tidd", 0)} ++ ) ++ ++ def test_get_clock(self): ++ yappi.set_clock_type('cpu') ++ self.assertEqual('cpu', yappi.get_clock_type()) ++ clock_info = yappi.get_clock_info() ++ self.assertTrue('api' in clock_info) ++ self.assertTrue('resolution' in clock_info) ++ ++ yappi.set_clock_type('wall') ++ self.assertEqual('wall', yappi.get_clock_type()) ++ ++ t0 = yappi.get_clock_time() ++ time.sleep(0.1) ++ duration = yappi.get_clock_time() - t0 ++ self.assertTrue(0.05 < duration < 0.3) ++ ++ def test_profile_decorator(self): ++ ++ def aggregate(func, stats): ++ fname = f"tests/{func.__name__}.profile" ++ try: ++ stats.add(fname) ++ except OSError: ++ pass ++ stats.save(fname) ++ raise Exception("messing around") ++ ++ @yappi.profile(return_callback=aggregate) ++ def a(x, y): ++ if x + y == 25: ++ raise Exception("") ++ return x + y ++ ++ def b(): ++ pass ++ ++ try: ++ os.remove( ++ "tests/a.profile" ++ ) # remove the one from prev test, if available ++ except: ++ pass ++ ++ # global profile is on to mess things up ++ yappi.start() ++ b() ++ ++ # assert functionality and call function at same time ++ try: ++ self.assertEqual(a(1, 2), 3) ++ except: ++ pass ++ try: ++ self.assertEqual(a(2, 5), 7) ++ except: ++ pass ++ try: ++ a(4, 21) ++ except: ++ pass ++ stats = yappi.get_func_stats().add("tests/a.profile") ++ fsa = utils.find_stat_by_name(stats, 'a') ++ self.assertEqual(fsa.ncall, 3) ++ self.assertEqual(len(stats), 1) # b() should be cleared out. ++ ++ @yappi.profile(return_callback=aggregate) ++ def count_down_rec(n): ++ if n == 0: ++ return ++ count_down_rec(n - 1) ++ ++ try: ++ os.remove( ++ "tests/count_down_rec.profile" ++ ) # remove the one from prev test, if available ++ except: ++ pass ++ ++ try: ++ count_down_rec(4) ++ except: ++ pass ++ try: ++ count_down_rec(3) ++ except: ++ pass ++ ++ stats = yappi.YFuncStats("tests/count_down_rec.profile") ++ fsrec = utils.find_stat_by_name(stats, 'count_down_rec') ++ self.assertEqual(fsrec.ncall, 9) ++ self.assertEqual(fsrec.nactualcall, 2) ++ ++ def test_strip_dirs(self): ++ ++ def a(): ++ pass ++ ++ stats = utils.run_and_get_func_stats(a, ) ++ stats.strip_dirs() ++ fsa = utils.find_stat_by_name(stats, "a") ++ self.assertEqual(fsa.module, os.path.basename(fsa.module)) ++ ++ @unittest.skipIf(os.name == "nt", "do not run on Windows") ++ def test_run_as_script(self): ++ import re ++ p = subprocess.Popen( ++ ['yappi', os.path.join('./tests', 'run_as_script.py')], ++ stdout=subprocess.PIPE ++ ) ++ out, err = p.communicate() ++ self.assertEqual(p.returncode, 0) ++ func_stats, thread_stats = re.split( ++ b'name\\s+id\\s+tid\\s+ttot\\s+scnt\\s*\n', out ++ ) ++ self.assertTrue(b'FancyThread' in thread_stats) ++ ++ def test_yappi_overhead(self): ++ LOOP_COUNT = 100000 ++ ++ def a(): ++ pass ++ ++ def b(): ++ for i in range(LOOP_COUNT): ++ a() ++ ++ t0 = time.time() ++ yappi.start() ++ b() ++ yappi.stop() ++ time_with_yappi = time.time() - t0 ++ t0 = time.time() ++ b() ++ time_without_yappi = time.time() - t0 ++ if time_without_yappi == 0: ++ time_without_yappi = 0.000001 ++ ++ # in latest v0.82, I calculated this as close to "7.0" in my machine. ++ # however, %83 of this overhead is coming from tickcount(). The other %17 ++ # seems to have been evenly distributed to the internal bookkeeping ++ # structures/algorithms which seems acceptable. Note that our test only ++ # tests one function being profiled at-a-time in a short interval. ++ # profiling high number of functions in a small time ++ # is a different beast, (which is pretty unlikely in most applications) ++ # So as a conclusion: I cannot see any optimization window for Yappi that ++ # is worth implementing as we will only optimize %17 of the time. ++ sys.stderr.write("\r\nYappi puts %0.1f times overhead to the profiled application in average.\r\n" % \ ++ (time_with_yappi / time_without_yappi)) ++ ++ def test_clear_stats_while_running(self): ++ ++ def a(): ++ pass ++ ++ yappi.start() ++ a() ++ yappi.clear_stats() ++ a() ++ stats = yappi.get_func_stats() ++ fsa = utils.find_stat_by_name(stats, 'a') ++ self.assertEqual(fsa.ncall, 1) ++ ++ def test_generator(self): ++ ++ def _gen(n): ++ while (n > 0): ++ yield n ++ n -= 1 ++ ++ yappi.start() ++ for x in _gen(5): ++ pass ++ self.assertTrue( ++ yappi.convert2pstats(yappi.get_func_stats()) is not None ++ ) ++ ++ def test_slice_child_stats_and_strip_dirs(self): ++ ++ def b(): ++ for i in range(10000000): ++ pass ++ ++ def a(): ++ b() ++ ++ yappi.start(builtins=True) ++ a() ++ stats = yappi.get_func_stats() ++ fsa = utils.find_stat_by_name(stats, 'a') ++ fsb = utils.find_stat_by_name(stats, 'b') ++ self.assertTrue(fsa.children[0:1] is not None) ++ prev_afullname = fsa.full_name ++ prev_bchildfullname = fsa.children[fsb].full_name ++ stats.strip_dirs() ++ self.assertTrue(len(prev_afullname) > len(fsa.full_name)) ++ self.assertTrue( ++ len(prev_bchildfullname) > len(fsa.children[fsb].full_name) ++ ) ++ ++ def test_children_stat_functions(self): ++ _timings = {"a_1": 5, "b_1": 3, "c_1": 1} ++ _yappi._set_test_timings(_timings) ++ ++ def b(): ++ pass ++ ++ def c(): ++ pass ++ ++ def a(): ++ b() ++ c() ++ ++ yappi.start() ++ a() ++ b() # non-child call ++ c() # non-child call ++ stats = yappi.get_func_stats() ++ fsa = utils.find_stat_by_name(stats, 'a') ++ childs_of_a = fsa.children.get().sort("tavg", "desc") ++ prev_item = None ++ for item in childs_of_a: ++ if prev_item: ++ self.assertTrue(prev_item.tavg > item.tavg) ++ prev_item = item ++ childs_of_a.sort("name", "desc") ++ prev_item = None ++ for item in childs_of_a: ++ if prev_item: ++ self.assertTrue(prev_item.name > item.name) ++ prev_item = item ++ childs_of_a.clear() ++ self.assertTrue(childs_of_a.empty()) ++ ++ def test_no_stats_different_clock_type_load(self): ++ ++ def a(): ++ pass ++ ++ yappi.start() ++ a() ++ yappi.stop() ++ yappi.get_func_stats().save("tests/ystats1.ys") ++ yappi.clear_stats() ++ yappi.set_clock_type("WALL") ++ yappi.start() ++ yappi.stop() ++ stats = yappi.get_func_stats().add("tests/ystats1.ys") ++ fsa = utils.find_stat_by_name(stats, 'a') ++ self.assertTrue(fsa is not None) ++ ++ def test_subsequent_profile(self): ++ _timings = {"a_1": 1, "b_1": 1} ++ _yappi._set_test_timings(_timings) ++ ++ def a(): ++ pass ++ ++ def b(): ++ pass ++ ++ yappi.start() ++ a() ++ yappi.stop() ++ yappi.start() ++ b() ++ yappi.stop() ++ stats = yappi.get_func_stats() ++ fsa = utils.find_stat_by_name(stats, 'a') ++ fsb = utils.find_stat_by_name(stats, 'b') ++ self.assertTrue(fsa is not None) ++ self.assertTrue(fsb is not None) ++ self.assertEqual(fsa.ttot, 1) ++ self.assertEqual(fsb.ttot, 1) ++ ++ def test_lambda(self): ++ f = lambda: time.sleep(0.3) ++ yappi.set_clock_type("wall") ++ yappi.start() ++ f() ++ stats = yappi.get_func_stats() ++ fsa = utils.find_stat_by_name(stats, '<lambda>') ++ self.assertTrue(fsa.ttot > 0.1) ++ ++ def test_module_stress(self): ++ self.assertEqual(yappi.is_running(), False) ++ ++ yappi.start() ++ yappi.clear_stats() ++ self.assertRaises(_yappi.error, yappi.set_clock_type, "wall") ++ ++ yappi.stop() ++ yappi.clear_stats() ++ yappi.set_clock_type("cpu") ++ self.assertRaises(yappi.YappiError, yappi.set_clock_type, "dummy") ++ self.assertEqual(yappi.is_running(), False) ++ yappi.clear_stats() ++ yappi.clear_stats() ++ ++ def test_stat_sorting(self): ++ _timings = {"a_1": 13, "b_1": 10, "a_2": 6, "b_2": 1} ++ _yappi._set_test_timings(_timings) ++ ++ self._ncall = 1 ++ ++ def a(): ++ b() ++ ++ def b(): ++ if self._ncall == 2: ++ return ++ self._ncall += 1 ++ a() ++ ++ stats = utils.run_and_get_func_stats(a) ++ stats = stats.sort("totaltime", "desc") ++ prev_stat = None ++ for stat in stats: ++ if prev_stat: ++ self.assertTrue(prev_stat.ttot >= stat.ttot) ++ prev_stat = stat ++ stats = stats.sort("totaltime", "asc") ++ prev_stat = None ++ for stat in stats: ++ if prev_stat: ++ self.assertTrue(prev_stat.ttot <= stat.ttot) ++ prev_stat = stat ++ stats = stats.sort("avgtime", "asc") ++ prev_stat = None ++ for stat in stats: ++ if prev_stat: ++ self.assertTrue(prev_stat.tavg <= stat.tavg) ++ prev_stat = stat ++ stats = stats.sort("name", "asc") ++ prev_stat = None ++ for stat in stats: ++ if prev_stat: ++ self.assertTrue(prev_stat.name <= stat.name) ++ prev_stat = stat ++ stats = stats.sort("subtime", "asc") ++ prev_stat = None ++ for stat in stats: ++ if prev_stat: ++ self.assertTrue(prev_stat.tsub <= stat.tsub) ++ prev_stat = stat ++ ++ self.assertRaises( ++ yappi.YappiError, stats.sort, "invalid_func_sorttype_arg" ++ ) ++ self.assertRaises( ++ yappi.YappiError, stats.sort, "totaltime", ++ "invalid_func_sortorder_arg" ++ ) ++ ++ def test_start_flags(self): ++ self.assertEqual(_yappi._get_start_flags(), None) ++ yappi.start() ++ ++ def a(): ++ pass ++ ++ a() ++ self.assertEqual(_yappi._get_start_flags()["profile_builtins"], 0) ++ self.assertEqual(_yappi._get_start_flags()["profile_multicontext"], 1) ++ self.assertEqual(len(yappi.get_thread_stats()), 1) ++ ++ def test_builtin_profiling(self): ++ ++ def a(): ++ time.sleep(0.4) # is a builtin function ++ ++ yappi.set_clock_type('wall') ++ ++ yappi.start(builtins=True) ++ a() ++ stats = yappi.get_func_stats() ++ fsa = utils.find_stat_by_name(stats, 'sleep') ++ self.assertTrue(fsa is not None) ++ self.assertTrue(fsa.ttot > 0.3) ++ yappi.stop() ++ yappi.clear_stats() ++ ++ def a(): ++ pass ++ ++ yappi.start() ++ t = threading.Thread(target=a) ++ t.start() ++ t.join() ++ stats = yappi.get_func_stats() ++ ++ def test_singlethread_profiling(self): ++ yappi.set_clock_type('wall') ++ ++ def a(): ++ time.sleep(0.2) ++ ++ class Worker1(threading.Thread): ++ ++ def a(self): ++ time.sleep(0.3) ++ ++ def run(self): ++ self.a() ++ ++ yappi.start(profile_threads=False) ++ ++ c = Worker1() ++ c.start() ++ c.join() ++ a() ++ stats = yappi.get_func_stats() ++ fsa1 = utils.find_stat_by_name(stats, 'Worker1.a') ++ fsa2 = utils.find_stat_by_name(stats, 'a') ++ self.assertTrue(fsa1 is None) ++ self.assertTrue(fsa2 is not None) ++ self.assertTrue(fsa2.ttot > 0.1) ++ ++ def test_run(self): ++ ++ def profiled(): ++ pass ++ ++ yappi.clear_stats() ++ try: ++ with yappi.run(): ++ profiled() ++ stats = yappi.get_func_stats() ++ finally: ++ yappi.clear_stats() ++ ++ self.assertIsNotNone(utils.find_stat_by_name(stats, 'profiled')) ++ ++ def test_run_recursive(self): ++ ++ def profiled(): ++ pass ++ ++ def not_profiled(): ++ pass ++ ++ yappi.clear_stats() ++ try: ++ with yappi.run(): ++ with yappi.run(): ++ profiled() ++ # Profiling stopped here ++ not_profiled() ++ stats = yappi.get_func_stats() ++ finally: ++ yappi.clear_stats() ++ ++ self.assertIsNotNone(utils.find_stat_by_name(stats, 'profiled')) ++ self.assertIsNone(utils.find_stat_by_name(stats, 'not_profiled')) ++ ++ ++class StatSaveScenarios(utils.YappiUnitTestCase): ++ ++ def test_pstats_conversion(self): ++ ++ def pstat_id(fs): ++ return (fs.module, fs.lineno, fs.name) ++ ++ def a(): ++ d() ++ ++ def b(): ++ d() ++ ++ def c(): ++ pass ++ ++ def d(): ++ pass ++ ++ _timings = {"a_1": 12, "b_1": 7, "c_1": 5, "d_1": 2} ++ _yappi._set_test_timings(_timings) ++ stats = utils.run_and_get_func_stats(a, ) ++ stats.strip_dirs() ++ stats.save("tests/a1.pstats", type="pstat") ++ fsa_pid = pstat_id(utils.find_stat_by_name(stats, "a")) ++ fsd_pid = pstat_id(utils.find_stat_by_name(stats, "d")) ++ yappi.clear_stats() ++ _yappi._set_test_timings(_timings) ++ stats = utils.run_and_get_func_stats(a, ) ++ stats.strip_dirs() ++ stats.save("tests/a2.pstats", type="pstat") ++ yappi.clear_stats() ++ _yappi._set_test_timings(_timings) ++ stats = utils.run_and_get_func_stats(b, ) ++ stats.strip_dirs() ++ stats.save("tests/b1.pstats", type="pstat") ++ fsb_pid = pstat_id(utils.find_stat_by_name(stats, "b")) ++ yappi.clear_stats() ++ _yappi._set_test_timings(_timings) ++ stats = utils.run_and_get_func_stats(c, ) ++ stats.strip_dirs() ++ stats.save("tests/c1.pstats", type="pstat") ++ fsc_pid = pstat_id(utils.find_stat_by_name(stats, "c")) ++ ++ # merge saved stats and check pstats values are correct ++ import pstats ++ p = pstats.Stats( ++ 'tests/a1.pstats', 'tests/a2.pstats', 'tests/b1.pstats', ++ 'tests/c1.pstats' ++ ) ++ p.strip_dirs() ++ # ct = ttot, tt = tsub ++ (cc, nc, tt, ct, callers) = p.stats[fsa_pid] ++ self.assertEqual(cc, nc, 2) ++ self.assertEqual(tt, 20) ++ self.assertEqual(ct, 24) ++ (cc, nc, tt, ct, callers) = p.stats[fsd_pid] ++ self.assertEqual(cc, nc, 3) ++ self.assertEqual(tt, 6) ++ self.assertEqual(ct, 6) ++ self.assertEqual(len(callers), 2) ++ (cc, nc, tt, ct) = callers[fsa_pid] ++ self.assertEqual(cc, nc, 2) ++ self.assertEqual(tt, 4) ++ self.assertEqual(ct, 4) ++ (cc, nc, tt, ct) = callers[fsb_pid] ++ self.assertEqual(cc, nc, 1) ++ self.assertEqual(tt, 2) ++ self.assertEqual(ct, 2) ++ ++ def test_merge_stats(self): ++ _timings = { ++ "a_1": 15, ++ "b_1": 14, ++ "c_1": 12, ++ "d_1": 10, ++ "e_1": 9, ++ "f_1": 7, ++ "g_1": 6, ++ "h_1": 5, ++ "i_1": 1 ++ } ++ _yappi._set_test_timings(_timings) ++ ++ def a(): ++ b() ++ ++ def b(): ++ c() ++ ++ def c(): ++ d() ++ ++ def d(): ++ e() ++ ++ def e(): ++ f() ++ ++ def f(): ++ g() ++ ++ def g(): ++ h() ++ ++ def h(): ++ i() ++ ++ def i(): ++ pass ++ ++ yappi.start() ++ a() ++ a() ++ yappi.stop() ++ stats = yappi.get_func_stats() ++ self.assertRaises( ++ NotImplementedError, stats.save, "", "INVALID_SAVE_TYPE" ++ ) ++ stats.save("tests/ystats2.ys") ++ yappi.clear_stats() ++ _yappi._set_test_timings(_timings) ++ yappi.start() ++ a() ++ stats = yappi.get_func_stats().add("tests/ystats2.ys") ++ fsa = utils.find_stat_by_name(stats, "a") ++ fsb = utils.find_stat_by_name(stats, "b") ++ fsc = utils.find_stat_by_name(stats, "c") ++ fsd = utils.find_stat_by_name(stats, "d") ++ fse = utils.find_stat_by_name(stats, "e") ++ fsf = utils.find_stat_by_name(stats, "f") ++ fsg = utils.find_stat_by_name(stats, "g") ++ fsh = utils.find_stat_by_name(stats, "h") ++ fsi = utils.find_stat_by_name(stats, "i") ++ self.assertEqual(fsa.ttot, 45) ++ self.assertEqual(fsa.ncall, 3) ++ self.assertEqual(fsa.nactualcall, 3) ++ self.assertEqual(fsa.tsub, 3) ++ self.assertEqual(fsa.children[fsb].ttot, fsb.ttot) ++ self.assertEqual(fsa.children[fsb].tsub, fsb.tsub) ++ self.assertEqual(fsb.children[fsc].ttot, fsc.ttot) ++ self.assertEqual(fsb.children[fsc].tsub, fsc.tsub) ++ self.assertEqual(fsc.tsub, 6) ++ self.assertEqual(fsc.children[fsd].ttot, fsd.ttot) ++ self.assertEqual(fsc.children[fsd].tsub, fsd.tsub) ++ self.assertEqual(fsd.children[fse].ttot, fse.ttot) ++ self.assertEqual(fsd.children[fse].tsub, fse.tsub) ++ self.assertEqual(fse.children[fsf].ttot, fsf.ttot) ++ self.assertEqual(fse.children[fsf].tsub, fsf.tsub) ++ self.assertEqual(fsf.children[fsg].ttot, fsg.ttot) ++ self.assertEqual(fsf.children[fsg].tsub, fsg.tsub) ++ self.assertEqual(fsg.ttot, 18) ++ self.assertEqual(fsg.tsub, 3) ++ self.assertEqual(fsg.children[fsh].ttot, fsh.ttot) ++ self.assertEqual(fsg.children[fsh].tsub, fsh.tsub) ++ self.assertEqual(fsh.ttot, 15) ++ self.assertEqual(fsh.tsub, 12) ++ self.assertEqual(fsh.tavg, 5) ++ self.assertEqual(fsh.children[fsi].ttot, fsi.ttot) ++ self.assertEqual(fsh.children[fsi].tsub, fsi.tsub) ++ #stats.debug_print() ++ ++ def test_merge_multithreaded_stats(self): ++ import _yappi ++ timings = {"a_1": 2, "b_1": 1} ++ _yappi._set_test_timings(timings) ++ ++ def a(): ++ pass ++ ++ def b(): ++ pass ++ ++ yappi.start() ++ t = threading.Thread(target=a) ++ t.start() ++ t.join() ++ t = threading.Thread(target=b) ++ t.start() ++ t.join() ++ yappi.get_func_stats().save("tests/ystats1.ys") ++ yappi.clear_stats() ++ _yappi._set_test_timings(timings) ++ self.assertEqual(len(yappi.get_func_stats()), 0) ++ self.assertEqual(len(yappi.get_thread_stats()), 1) ++ t = threading.Thread(target=a) ++ t.start() ++ t.join() ++ ++ self.assertEqual(_yappi._get_start_flags()["profile_builtins"], 0) ++ self.assertEqual(_yappi._get_start_flags()["profile_multicontext"], 1) ++ yappi.get_func_stats().save("tests/ystats2.ys") ++ ++ stats = yappi.YFuncStats([ ++ "tests/ystats1.ys", ++ "tests/ystats2.ys", ++ ]) ++ fsa = utils.find_stat_by_name(stats, "a") ++ fsb = utils.find_stat_by_name(stats, "b") ++ self.assertEqual(fsa.ncall, 2) ++ self.assertEqual(fsb.ncall, 1) ++ self.assertEqual(fsa.tsub, fsa.ttot, 4) ++ self.assertEqual(fsb.tsub, fsb.ttot, 1) ++ ++ def test_merge_load_different_clock_types(self): ++ yappi.start(builtins=True) ++ ++ def a(): ++ b() ++ ++ def b(): ++ c() ++ ++ def c(): ++ pass ++ ++ t = threading.Thread(target=a) ++ t.start() ++ t.join() ++ yappi.get_func_stats().sort("name", "asc").save("tests/ystats1.ys") ++ yappi.stop() ++ yappi.clear_stats() ++ yappi.start(builtins=False) ++ t = threading.Thread(target=a) ++ t.start() ++ t.join() ++ yappi.get_func_stats().save("tests/ystats2.ys") ++ yappi.stop() ++ self.assertRaises(_yappi.error, yappi.set_clock_type, "wall") ++ yappi.clear_stats() ++ yappi.set_clock_type("wall") ++ yappi.start() ++ t = threading.Thread(target=a) ++ t.start() ++ t.join() ++ yappi.get_func_stats().save("tests/ystats3.ys") ++ self.assertRaises( ++ yappi.YappiError, ++ yappi.YFuncStats().add("tests/ystats1.ys").add, "tests/ystats3.ys" ++ ) ++ stats = yappi.YFuncStats(["tests/ystats1.ys", ++ "tests/ystats2.ys"]).sort("name") ++ fsa = utils.find_stat_by_name(stats, "a") ++ fsb = utils.find_stat_by_name(stats, "b") ++ fsc = utils.find_stat_by_name(stats, "c") ++ self.assertEqual(fsa.ncall, 2) ++ self.assertEqual(fsa.ncall, fsb.ncall, fsc.ncall) ++ ++ def test_merge_aabab_aabbc(self): ++ _timings = { ++ "a_1": 15, ++ "a_2": 14, ++ "b_1": 12, ++ "a_3": 10, ++ "b_2": 9, ++ "c_1": 4 ++ } ++ _yappi._set_test_timings(_timings) ++ ++ def a(): ++ if self._ncall == 1: ++ self._ncall += 1 ++ a() ++ elif self._ncall == 5: ++ self._ncall += 1 ++ a() ++ else: ++ b() ++ ++ def b(): ++ if self._ncall == 2: ++ self._ncall += 1 ++ a() ++ elif self._ncall == 6: ++ self._ncall += 1 ++ b() ++ elif self._ncall == 7: ++ c() ++ else: ++ return ++ ++ def c(): ++ pass ++ ++ self._ncall = 1 ++ stats = utils.run_and_get_func_stats(a, ) ++ stats.save("tests/ystats1.ys") ++ yappi.clear_stats() ++ _yappi._set_test_timings(_timings) ++ #stats.print_all() ++ ++ self._ncall = 5 ++ stats = utils.run_and_get_func_stats(a, ) ++ stats.save("tests/ystats2.ys") ++ ++ #stats.print_all() ++ ++ def a(): # same name but another function(code object) ++ pass ++ ++ yappi.start() ++ a() ++ stats = yappi.get_func_stats().add( ++ ["tests/ystats1.ys", "tests/ystats2.ys"] ++ ) ++ #stats.print_all() ++ self.assertEqual(len(stats), 4) ++ ++ fsa = None ++ for stat in stats: ++ if stat.name == "a" and stat.ttot == 45: ++ fsa = stat ++ break ++ self.assertTrue(fsa is not None) ++ ++ self.assertEqual(fsa.ncall, 7) ++ self.assertEqual(fsa.nactualcall, 3) ++ self.assertEqual(fsa.ttot, 45) ++ self.assertEqual(fsa.tsub, 10) ++ fsb = utils.find_stat_by_name(stats, "b") ++ fsc = utils.find_stat_by_name(stats, "c") ++ self.assertEqual(fsb.ncall, 6) ++ self.assertEqual(fsb.nactualcall, 3) ++ self.assertEqual(fsb.ttot, 36) ++ self.assertEqual(fsb.tsub, 27) ++ self.assertEqual(fsb.tavg, 6) ++ self.assertEqual(fsc.ttot, 8) ++ self.assertEqual(fsc.tsub, 8) ++ self.assertEqual(fsc.tavg, 4) ++ self.assertEqual(fsc.nactualcall, fsc.ncall, 2) ++ ++ ++class MultithreadedScenarios(utils.YappiUnitTestCase): ++ ++ 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() ++ 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. ++ ++ When this issue happens multiple Threads have same tid as the internal ts_ptr ++ will be same for different contexts. So, let's see if that happens ++ ''' ++ ++ def foo(): ++ time.sleep(0.2) ++ ++ def bar(): ++ time.sleep(0.1) ++ ++ def thread_func(): ++ yappi.set_clock_type("wall") ++ yappi.start() ++ ++ bar() ++ ++ t = threading.Thread(target=thread_func) ++ t.start() ++ t.join() ++ ++ foo() ++ ++ yappi.stop() ++ ++ thread_ids = set() ++ for tstat in yappi.get_thread_stats(): ++ self.assertTrue(tstat.tid not in thread_ids) ++ thread_ids.add(tstat.tid) ++ ++ def test_subsequent_profile(self): ++ WORKER_COUNT = 5 ++ ++ def a(): ++ pass ++ ++ def b(): ++ pass ++ ++ def c(): ++ pass ++ ++ _timings = { ++ "a_1": 3, ++ "b_1": 2, ++ "c_1": 1, ++ } ++ ++ yappi.start() ++ ++ def g(): ++ pass ++ ++ g() ++ yappi.stop() ++ yappi.clear_stats() ++ _yappi._set_test_timings(_timings) ++ yappi.start() ++ ++ _dummy = [] ++ for i in range(WORKER_COUNT): ++ t = threading.Thread(target=a) ++ t.start() ++ t.join() ++ for i in range(WORKER_COUNT): ++ t = threading.Thread(target=b) ++ t.start() ++ _dummy.append(t) ++ t.join() ++ for i in range(WORKER_COUNT): ++ t = threading.Thread(target=a) ++ t.start() ++ t.join() ++ for i in range(WORKER_COUNT): ++ t = threading.Thread(target=c) ++ t.start() ++ t.join() ++ yappi.stop() ++ yappi.start() ++ ++ def f(): ++ pass ++ ++ f() ++ stats = yappi.get_func_stats() ++ fsa = utils.find_stat_by_name(stats, 'a') ++ fsb = utils.find_stat_by_name(stats, 'b') ++ fsc = utils.find_stat_by_name(stats, 'c') ++ self.assertEqual(fsa.ncall, 10) ++ self.assertEqual(fsb.ncall, 5) ++ self.assertEqual(fsc.ncall, 5) ++ self.assertEqual(fsa.ttot, fsa.tsub, 30) ++ self.assertEqual(fsb.ttot, fsb.tsub, 10) ++ self.assertEqual(fsc.ttot, fsc.tsub, 5) ++ ++ # MACOSx optimizes by only creating one worker thread ++ self.assertTrue(len(yappi.get_thread_stats()) >= 2) ++ ++ def test_basic(self): ++ yappi.set_clock_type('wall') ++ ++ def dummy(): ++ pass ++ ++ def a(): ++ time.sleep(0.2) ++ ++ class Worker1(threading.Thread): ++ ++ def a(self): ++ time.sleep(0.3) ++ ++ def run(self): ++ self.a() ++ ++ yappi.start(builtins=False, profile_threads=True) ++ ++ c = Worker1() ++ c.start() ++ c.join() ++ a() ++ stats = yappi.get_func_stats() ++ fsa1 = utils.find_stat_by_name(stats, 'Worker1.a') ++ fsa2 = utils.find_stat_by_name(stats, 'a') ++ self.assertTrue(fsa1 is not None) ++ self.assertTrue(fsa2 is not None) ++ self.assertTrue(fsa1.ttot > 0.2) ++ self.assertTrue(fsa2.ttot > 0.1) ++ tstats = yappi.get_thread_stats() ++ self.assertEqual(len(tstats), 2) ++ tsa = utils.find_stat_by_name(tstats, 'Worker1') ++ tsm = utils.find_stat_by_name(tstats, '_MainThread') ++ dummy() # call dummy to force ctx name to be retrieved again. ++ self.assertTrue(tsa is not None) ++ # 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, ++ f"Could not find \"_MainThread\". Found: {', '.join(utils.get_stat_names(tstats))}") ++ ++ def test_ctx_stats(self): ++ from threading import Thread ++ DUMMY_WORKER_COUNT = 5 ++ yappi.start() ++ ++ class DummyThread(Thread): ++ pass ++ ++ def dummy(): ++ pass ++ ++ def dummy_worker(): ++ pass ++ ++ for i in range(DUMMY_WORKER_COUNT): ++ t = DummyThread(target=dummy_worker) ++ t.start() ++ t.join() ++ yappi.stop() ++ stats = yappi.get_thread_stats() ++ tsa = utils.find_stat_by_name(stats, "DummyThread") ++ self.assertTrue(tsa is not None) ++ yappi.clear_stats() ++ time.sleep(1.0) ++ _timings = { ++ "a_1": 6, ++ "b_1": 5, ++ "c_1": 3, ++ "d_1": 1, ++ "a_2": 4, ++ "b_2": 3, ++ "c_2": 2, ++ "d_2": 1 ++ } ++ _yappi._set_test_timings(_timings) ++ ++ class Thread1(Thread): ++ pass ++ ++ class Thread2(Thread): ++ pass ++ ++ def a(): ++ b() ++ ++ def b(): ++ c() ++ ++ def c(): ++ d() ++ ++ def d(): ++ time.sleep(0.6) ++ ++ yappi.set_clock_type("wall") ++ yappi.start() ++ t1 = Thread1(target=a) ++ t1.start() ++ t2 = Thread2(target=a) ++ t2.start() ++ t1.join() ++ t2.join() ++ stats = yappi.get_thread_stats() ++ ++ # the fist clear_stats clears the context table? ++ tsa = utils.find_stat_by_name(stats, "DummyThread") ++ self.assertTrue(tsa is None) ++ ++ tst1 = utils.find_stat_by_name(stats, "Thread1") ++ tst2 = utils.find_stat_by_name(stats, "Thread2") ++ tsmain = utils.find_stat_by_name(stats, "_MainThread") ++ dummy() # call dummy to force ctx name to be retrieved again. ++ self.assertTrue(len(stats) == 3) ++ self.assertTrue(tst1 is not None) ++ self.assertTrue(tst2 is not None) ++ # 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, ++ 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) ++ ++ # test sorting of the ctx stats ++ stats = stats.sort("totaltime", "desc") ++ prev_stat = None ++ for stat in stats: ++ if prev_stat: ++ self.assertTrue(prev_stat.ttot >= stat.ttot) ++ prev_stat = stat ++ stats = stats.sort("totaltime", "asc") ++ prev_stat = None ++ for stat in stats: ++ if prev_stat: ++ self.assertTrue(prev_stat.ttot <= stat.ttot) ++ prev_stat = stat ++ stats = stats.sort("schedcount", "desc") ++ prev_stat = None ++ for stat in stats: ++ if prev_stat: ++ self.assertTrue(prev_stat.sched_count >= stat.sched_count) ++ prev_stat = stat ++ stats = stats.sort("name", "desc") ++ prev_stat = None ++ for stat in stats: ++ if prev_stat: ++ self.assertTrue(prev_stat.name.lower() >= stat.name.lower()) ++ prev_stat = stat ++ self.assertRaises( ++ yappi.YappiError, stats.sort, "invalid_thread_sorttype_arg" ++ ) ++ self.assertRaises( ++ yappi.YappiError, stats.sort, "invalid_thread_sortorder_arg" ++ ) ++ ++ def test_ctx_stats_cpu(self): ++ ++ def get_thread_name(): ++ try: ++ return threading.current_thread().name ++ except AttributeError: ++ return "Anonymous" ++ ++ def burn_cpu(sec): ++ t0 = yappi.get_clock_time() ++ elapsed = 0 ++ while (elapsed < sec): ++ for _ in range(1000): ++ pass ++ elapsed = yappi.get_clock_time() - t0 ++ ++ def test(): ++ ++ ts = [] ++ for i in (0.01, 0.05, 0.1): ++ t = threading.Thread(target=burn_cpu, args=(i, )) ++ t.name = f"burn_cpu-{str(i)}" ++ t.start() ++ ts.append(t) ++ for t in ts: ++ t.join() ++ ++ yappi.set_clock_type("cpu") ++ yappi.set_context_name_callback(get_thread_name) ++ ++ yappi.start() ++ ++ test() ++ ++ yappi.stop() ++ ++ tstats = yappi.get_thread_stats() ++ r1 = ''' ++ burn_cpu-0.1 3 123145356058624 0.100105 8 ++ burn_cpu-0.05 2 123145361313792 0.050149 8 ++ burn_cpu-0.01 1 123145356058624 0.010127 2 ++ MainThread 0 4321620864 0.001632 6 ++ ''' ++ self.assert_ctx_stats_almost_equal(r1, tstats) ++ ++ def test_producer_consumer_with_queues(self): ++ # we currently just stress yappi, no functionality test is done here. ++ yappi.start() ++ from queue import Queue ++ from threading import Thread ++ WORKER_THREAD_COUNT = 50 ++ WORK_ITEM_COUNT = 2000 ++ ++ def worker(): ++ while True: ++ item = q.get() ++ # do the work with item ++ q.task_done() ++ ++ q = Queue() ++ for i in range(WORKER_THREAD_COUNT): ++ t = Thread(target=worker) ++ t.daemon = True ++ t.start() ++ ++ for item in range(WORK_ITEM_COUNT): ++ q.put(item) ++ q.join() # block until all tasks are done ++ #yappi.get_func_stats().sort("callcount").print_all() ++ yappi.stop() ++ ++ def test_temporary_lock_waiting(self): ++ yappi.start() ++ _lock = threading.Lock() ++ ++ def worker(): ++ _lock.acquire() ++ try: ++ time.sleep(1.0) ++ finally: ++ _lock.release() ++ ++ t1 = threading.Thread(target=worker) ++ t2 = threading.Thread(target=worker) ++ t1.start() ++ t2.start() ++ t1.join() ++ t2.join() ++ #yappi.get_func_stats().sort("callcount").print_all() ++ yappi.stop() ++ ++ @unittest.skipIf(os.name != "posix", "requires Posix compliant OS") ++ def test_signals_with_blocking_calls(self): ++ import signal, os, time ++ ++ # just to verify if signal is handled correctly and stats/yappi are not corrupted. ++ def handler(signum, frame): ++ raise Exception("Signal handler executed!") ++ ++ yappi.start() ++ signal.signal(signal.SIGALRM, handler) ++ signal.alarm(1) ++ self.assertRaises(Exception, time.sleep, 2) ++ stats = yappi.get_func_stats() ++ fsh = utils.find_stat_by_name(stats, "handler") ++ self.assertTrue(fsh is not None) ++ ++ def test_concurrent_futures(self): ++ yappi.start() ++ from concurrent.futures import ThreadPoolExecutor ++ with ThreadPoolExecutor(max_workers=5) as executor: ++ f = executor.submit(pow, 5, 2) ++ self.assertEqual(f.result(), 25) ++ time.sleep(1.0) ++ yappi.stop() ++ ++ def test_barrier(self): ++ yappi.start() ++ b = threading.Barrier(2, timeout=1) ++ ++ def worker(): ++ try: ++ b.wait() ++ except threading.BrokenBarrierError: ++ pass ++ except Exception: ++ raise Exception("BrokenBarrierError not raised") ++ ++ t1 = threading.Thread(target=worker) ++ t1.start() ++ #b.wait() ++ t1.join() ++ yappi.stop() ++ ++ ++class NonRecursiveFunctions(utils.YappiUnitTestCase): ++ ++ def test_abcd(self): ++ _timings = {"a_1": 6, "b_1": 5, "c_1": 3, "d_1": 1} ++ _yappi._set_test_timings(_timings) ++ ++ def a(): ++ b() ++ ++ def b(): ++ c() ++ ++ def c(): ++ d() ++ ++ def d(): ++ pass ++ ++ stats = utils.run_and_get_func_stats(a) ++ fsa = utils.find_stat_by_name(stats, 'a') ++ fsb = utils.find_stat_by_name(stats, 'b') ++ fsc = utils.find_stat_by_name(stats, 'c') ++ fsd = utils.find_stat_by_name(stats, 'd') ++ cfsab = fsa.children[fsb] ++ cfsbc = fsb.children[fsc] ++ cfscd = fsc.children[fsd] ++ ++ self.assertEqual(fsa.ttot, 6) ++ self.assertEqual(fsa.tsub, 1) ++ self.assertEqual(fsb.ttot, 5) ++ self.assertEqual(fsb.tsub, 2) ++ self.assertEqual(fsc.ttot, 3) ++ self.assertEqual(fsc.tsub, 2) ++ self.assertEqual(fsd.ttot, 1) ++ self.assertEqual(fsd.tsub, 1) ++ self.assertEqual(cfsab.ttot, 5) ++ self.assertEqual(cfsab.tsub, 2) ++ self.assertEqual(cfsbc.ttot, 3) ++ self.assertEqual(cfsbc.tsub, 2) ++ self.assertEqual(cfscd.ttot, 1) ++ self.assertEqual(cfscd.tsub, 1) ++ ++ def test_stop_in_middle(self): ++ _timings = {"a_1": 6, "b_1": 4} ++ _yappi._set_test_timings(_timings) ++ ++ def a(): ++ b() ++ yappi.stop() ++ ++ def b(): ++ time.sleep(0.2) ++ ++ yappi.start() ++ a() ++ stats = yappi.get_func_stats() ++ fsa = utils.find_stat_by_name(stats, 'a') ++ fsb = utils.find_stat_by_name(stats, 'b') ++ ++ self.assertEqual(fsa.ncall, 1) ++ self.assertEqual(fsa.nactualcall, 0) ++ self.assertEqual(fsa.ttot, 0) # no call_leave called ++ self.assertEqual(fsa.tsub, 0) # no call_leave called ++ self.assertEqual(fsb.ttot, 4) ++ ++ ++class RecursiveFunctions(utils.YappiUnitTestCase): ++ ++ def test_fibonacci(self): ++ ++ def fib(n): ++ if n > 1: ++ return fib(n - 1) + fib(n - 2) ++ else: ++ return n ++ ++ stats = utils.run_and_get_func_stats(fib, 22) ++ fs = utils.find_stat_by_name(stats, 'fib') ++ self.assertEqual(fs.ncall, 57313) ++ self.assertEqual(fs.ttot, fs.tsub) ++ ++ def test_abcadc(self): ++ _timings = { ++ "a_1": 20, ++ "b_1": 19, ++ "c_1": 17, ++ "a_2": 13, ++ "d_1": 12, ++ "c_2": 10, ++ "a_3": 5 ++ } ++ _yappi._set_test_timings(_timings) ++ ++ def a(n): ++ if n == 3: ++ return ++ if n == 1 + 1: ++ d(n) ++ else: ++ b(n) ++ ++ def b(n): ++ c(n) ++ ++ def c(n): ++ a(n + 1) ++ ++ def d(n): ++ c(n) ++ ++ stats = utils.run_and_get_func_stats(a, 1) ++ fsa = utils.find_stat_by_name(stats, 'a') ++ fsb = utils.find_stat_by_name(stats, 'b') ++ fsc = utils.find_stat_by_name(stats, 'c') ++ fsd = utils.find_stat_by_name(stats, 'd') ++ self.assertEqual(fsa.ncall, 3) ++ self.assertEqual(fsa.nactualcall, 1) ++ self.assertEqual(fsa.ttot, 20) ++ self.assertEqual(fsa.tsub, 7) ++ self.assertEqual(fsb.ttot, 19) ++ self.assertEqual(fsb.tsub, 2) ++ self.assertEqual(fsc.ttot, 17) ++ self.assertEqual(fsc.tsub, 9) ++ self.assertEqual(fsd.ttot, 12) ++ self.assertEqual(fsd.tsub, 2) ++ cfsca = fsc.children[fsa] ++ self.assertEqual(cfsca.nactualcall, 0) ++ self.assertEqual(cfsca.ncall, 2) ++ self.assertEqual(cfsca.ttot, 13) ++ self.assertEqual(cfsca.tsub, 6) ++ ++ def test_aaaa(self): ++ _timings = {"d_1": 9, "d_2": 7, "d_3": 3, "d_4": 2} ++ _yappi._set_test_timings(_timings) ++ ++ def d(n): ++ if n == 3: ++ return ++ d(n + 1) ++ ++ stats = utils.run_and_get_func_stats(d, 0) ++ fsd = utils.find_stat_by_name(stats, 'd') ++ self.assertEqual(fsd.ncall, 4) ++ self.assertEqual(fsd.nactualcall, 1) ++ self.assertEqual(fsd.ttot, 9) ++ self.assertEqual(fsd.tsub, 9) ++ cfsdd = fsd.children[fsd] ++ self.assertEqual(cfsdd.ttot, 7) ++ self.assertEqual(cfsdd.tsub, 7) ++ self.assertEqual(cfsdd.ncall, 3) ++ self.assertEqual(cfsdd.nactualcall, 0) ++ ++ def test_abcabc(self): ++ _timings = { ++ "a_1": 20, ++ "b_1": 19, ++ "c_1": 17, ++ "a_2": 13, ++ "b_2": 11, ++ "c_2": 9, ++ "a_3": 6 ++ } ++ _yappi._set_test_timings(_timings) ++ ++ def a(n): ++ if n == 3: ++ return ++ else: ++ b(n) ++ ++ def b(n): ++ c(n) ++ ++ def c(n): ++ a(n + 1) ++ ++ stats = utils.run_and_get_func_stats(a, 1) ++ fsa = utils.find_stat_by_name(stats, 'a') ++ fsb = utils.find_stat_by_name(stats, 'b') ++ fsc = utils.find_stat_by_name(stats, 'c') ++ self.assertEqual(fsa.ncall, 3) ++ self.assertEqual(fsa.nactualcall, 1) ++ self.assertEqual(fsa.ttot, 20) ++ self.assertEqual(fsa.tsub, 9) ++ self.assertEqual(fsb.ttot, 19) ++ self.assertEqual(fsb.tsub, 4) ++ self.assertEqual(fsc.ttot, 17) ++ self.assertEqual(fsc.tsub, 7) ++ cfsab = fsa.children[fsb] ++ cfsbc = fsb.children[fsc] ++ cfsca = fsc.children[fsa] ++ self.assertEqual(cfsab.ttot, 19) ++ self.assertEqual(cfsab.tsub, 4) ++ self.assertEqual(cfsbc.ttot, 17) ++ self.assertEqual(cfsbc.tsub, 7) ++ self.assertEqual(cfsca.ttot, 13) ++ self.assertEqual(cfsca.tsub, 8) ++ ++ def test_abcbca(self): ++ _timings = {"a_1": 10, "b_1": 9, "c_1": 7, "b_2": 4, "c_2": 2, "a_2": 1} ++ _yappi._set_test_timings(_timings) ++ self._ncall = 1 ++ ++ def a(): ++ if self._ncall == 1: ++ b() ++ else: ++ return ++ ++ def b(): ++ c() ++ ++ def c(): ++ if self._ncall == 1: ++ self._ncall += 1 ++ b() ++ else: ++ a() ++ ++ stats = utils.run_and_get_func_stats(a) ++ fsa = utils.find_stat_by_name(stats, 'a') ++ fsb = utils.find_stat_by_name(stats, 'b') ++ fsc = utils.find_stat_by_name(stats, 'c') ++ cfsab = fsa.children[fsb] ++ cfsbc = fsb.children[fsc] ++ cfsca = fsc.children[fsa] ++ self.assertEqual(fsa.ttot, 10) ++ self.assertEqual(fsa.tsub, 2) ++ self.assertEqual(fsb.ttot, 9) ++ self.assertEqual(fsb.tsub, 4) ++ self.assertEqual(fsc.ttot, 7) ++ self.assertEqual(fsc.tsub, 4) ++ self.assertEqual(cfsab.ttot, 9) ++ self.assertEqual(cfsab.tsub, 2) ++ self.assertEqual(cfsbc.ttot, 7) ++ self.assertEqual(cfsbc.tsub, 4) ++ self.assertEqual(cfsca.ttot, 1) ++ self.assertEqual(cfsca.tsub, 1) ++ self.assertEqual(cfsca.ncall, 1) ++ self.assertEqual(cfsca.nactualcall, 0) ++ ++ def test_aabccb(self): ++ _timings = { ++ "a_1": 13, ++ "a_2": 11, ++ "b_1": 9, ++ "c_1": 5, ++ "c_2": 3, ++ "b_2": 1 ++ } ++ _yappi._set_test_timings(_timings) ++ self._ncall = 1 ++ ++ def a(): ++ if self._ncall == 1: ++ self._ncall += 1 ++ a() ++ else: ++ b() ++ ++ def b(): ++ if self._ncall == 3: ++ return ++ else: ++ c() ++ ++ def c(): ++ if self._ncall == 2: ++ self._ncall += 1 ++ c() ++ else: ++ b() ++ ++ stats = utils.run_and_get_func_stats(a) ++ fsa = utils.find_stat_by_name(stats, 'a') ++ fsb = utils.find_stat_by_name(stats, 'b') ++ fsc = utils.find_stat_by_name(stats, 'c') ++ cfsaa = fsa.children[fsa.index] ++ cfsab = fsa.children[fsb] ++ cfsbc = fsb.children[fsc.full_name] ++ cfscc = fsc.children[fsc] ++ cfscb = fsc.children[fsb] ++ self.assertEqual(fsb.ttot, 9) ++ self.assertEqual(fsb.tsub, 5) ++ self.assertEqual(cfsbc.ttot, 5) ++ self.assertEqual(cfsbc.tsub, 2) ++ self.assertEqual(fsa.ttot, 13) ++ self.assertEqual(fsa.tsub, 4) ++ self.assertEqual(cfsab.ttot, 9) ++ self.assertEqual(cfsab.tsub, 4) ++ self.assertEqual(cfsaa.ttot, 11) ++ self.assertEqual(cfsaa.tsub, 2) ++ self.assertEqual(fsc.ttot, 5) ++ self.assertEqual(fsc.tsub, 4) ++ ++ def test_abaa(self): ++ _timings = {"a_1": 13, "b_1": 10, "a_2": 9, "a_3": 5} ++ _yappi._set_test_timings(_timings) ++ ++ self._ncall = 1 ++ ++ def a(): ++ if self._ncall == 1: ++ b() ++ elif self._ncall == 2: ++ self._ncall += 1 ++ a() ++ else: ++ return ++ ++ def b(): ++ self._ncall += 1 ++ a() ++ ++ stats = utils.run_and_get_func_stats(a) ++ fsa = utils.find_stat_by_name(stats, 'a') ++ fsb = utils.find_stat_by_name(stats, 'b') ++ cfsaa = fsa.children[fsa] ++ cfsba = fsb.children[fsa] ++ self.assertEqual(fsb.ttot, 10) ++ self.assertEqual(fsb.tsub, 1) ++ self.assertEqual(fsa.ttot, 13) ++ self.assertEqual(fsa.tsub, 12) ++ self.assertEqual(cfsaa.ttot, 5) ++ self.assertEqual(cfsaa.tsub, 5) ++ self.assertEqual(cfsba.ttot, 9) ++ self.assertEqual(cfsba.tsub, 4) ++ ++ def test_aabb(self): ++ _timings = {"a_1": 13, "a_2": 10, "b_1": 9, "b_2": 5} ++ _yappi._set_test_timings(_timings) ++ ++ self._ncall = 1 ++ ++ def a(): ++ if self._ncall == 1: ++ self._ncall += 1 ++ a() ++ elif self._ncall == 2: ++ b() ++ else: ++ return ++ ++ def b(): ++ if self._ncall == 2: ++ self._ncall += 1 ++ b() ++ else: ++ return ++ ++ stats = utils.run_and_get_func_stats(a) ++ fsa = utils.find_stat_by_name(stats, 'a') ++ fsb = utils.find_stat_by_name(stats, 'b') ++ cfsaa = fsa.children[fsa] ++ cfsab = fsa.children[fsb] ++ cfsbb = fsb.children[fsb] ++ self.assertEqual(fsa.ttot, 13) ++ self.assertEqual(fsa.tsub, 4) ++ self.assertEqual(fsb.ttot, 9) ++ self.assertEqual(fsb.tsub, 9) ++ self.assertEqual(cfsaa.ttot, 10) ++ self.assertEqual(cfsaa.tsub, 1) ++ self.assertEqual(cfsab.ttot, 9) ++ self.assertEqual(cfsab.tsub, 4) ++ self.assertEqual(cfsbb.ttot, 5) ++ self.assertEqual(cfsbb.tsub, 5) ++ ++ def test_abbb(self): ++ _timings = {"a_1": 13, "b_1": 10, "b_2": 6, "b_3": 1} ++ _yappi._set_test_timings(_timings) ++ ++ self._ncall = 1 ++ ++ def a(): ++ if self._ncall == 1: ++ b() ++ ++ def b(): ++ if self._ncall == 3: ++ return ++ self._ncall += 1 ++ b() ++ ++ stats = utils.run_and_get_func_stats(a) ++ fsa = utils.find_stat_by_name(stats, 'a') ++ fsb = utils.find_stat_by_name(stats, 'b') ++ cfsab = fsa.children[fsb] ++ cfsbb = fsb.children[fsb] ++ self.assertEqual(fsa.ttot, 13) ++ self.assertEqual(fsa.tsub, 3) ++ self.assertEqual(fsb.ttot, 10) ++ self.assertEqual(fsb.tsub, 10) ++ self.assertEqual(fsb.ncall, 3) ++ self.assertEqual(fsb.nactualcall, 1) ++ self.assertEqual(cfsab.ttot, 10) ++ self.assertEqual(cfsab.tsub, 4) ++ self.assertEqual(cfsbb.ttot, 6) ++ self.assertEqual(cfsbb.tsub, 6) ++ self.assertEqual(cfsbb.nactualcall, 0) ++ self.assertEqual(cfsbb.ncall, 2) ++ ++ def test_aaab(self): ++ _timings = {"a_1": 13, "a_2": 10, "a_3": 6, "b_1": 1} ++ _yappi._set_test_timings(_timings) ++ ++ self._ncall = 1 ++ ++ def a(): ++ if self._ncall == 3: ++ b() ++ return ++ self._ncall += 1 ++ a() ++ ++ def b(): ++ return ++ ++ stats = utils.run_and_get_func_stats(a) ++ fsa = utils.find_stat_by_name(stats, 'a') ++ fsb = utils.find_stat_by_name(stats, 'b') ++ cfsaa = fsa.children[fsa] ++ cfsab = fsa.children[fsb] ++ self.assertEqual(fsa.ttot, 13) ++ self.assertEqual(fsa.tsub, 12) ++ self.assertEqual(fsb.ttot, 1) ++ self.assertEqual(fsb.tsub, 1) ++ self.assertEqual(cfsaa.ttot, 10) ++ self.assertEqual(cfsaa.tsub, 9) ++ self.assertEqual(cfsab.ttot, 1) ++ self.assertEqual(cfsab.tsub, 1) ++ ++ def test_abab(self): ++ _timings = {"a_1": 13, "b_1": 10, "a_2": 6, "b_2": 1} ++ _yappi._set_test_timings(_timings) ++ ++ self._ncall = 1 ++ ++ def a(): ++ b() ++ ++ def b(): ++ if self._ncall == 2: ++ return ++ self._ncall += 1 ++ a() ++ ++ stats = utils.run_and_get_func_stats(a) ++ fsa = utils.find_stat_by_name(stats, 'a') ++ fsb = utils.find_stat_by_name(stats, 'b') ++ cfsab = fsa.children[fsb] ++ cfsba = fsb.children[fsa] ++ self.assertEqual(fsa.ttot, 13) ++ self.assertEqual(fsa.tsub, 8) ++ self.assertEqual(fsb.ttot, 10) ++ self.assertEqual(fsb.tsub, 5) ++ self.assertEqual(cfsab.ttot, 10) ++ self.assertEqual(cfsab.tsub, 5) ++ self.assertEqual(cfsab.ncall, 2) ++ self.assertEqual(cfsab.nactualcall, 1) ++ self.assertEqual(cfsba.ttot, 6) ++ self.assertEqual(cfsba.tsub, 5) ++ ++ ++if __name__ == '__main__': ++ # import sys;sys.argv = ['', 'BasicUsage.test_run_as_script'] ++ # import sys;sys.argv = ['', 'MultithreadedScenarios.test_subsequent_profile'] ++ unittest.main() +-- +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.2.bb b/meta-python/recipes-devtools/python/python3-yappi_1.3.2.bb deleted file mode 100644 index 7c3f0fd4be..0000000000 --- a/meta-python/recipes-devtools/python/python3-yappi_1.3.2.bb +++ /dev/null @@ -1,31 +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] = "a51d3e6e5563cc74b5bb82ed6e7bd44a9c1a7eae3d97e4d52e9465edb3a8da8d" - -SRC_URI += " \ - file://run-ptest \ -" - -inherit pypi setuptools3 ptest - -RDEPENDS_${PN} += "\ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-pickle \ - ${PYTHON_PN}-threading \ -" - -RDEPENDS_${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-multiprocessing \ - ${PYTHON_PN}-profile \ -" - -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.6.3.bb b/meta-python/recipes-devtools/python/python3-yarl_1.6.3.bb deleted file mode 100644 index 01682a46d4..0000000000 --- a/meta-python/recipes-devtools/python/python3-yarl_1.6.3.bb +++ /dev/null @@ -1,28 +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=b334fc90d45983db318f54fd5bf6c90b" - -SRC_URI[sha256sum] = "8a9066529240171b68893d60dca86a763eae2139dd42f42106b03cf4b426bf10" - -SRC_URI += " \ - file://run-ptest \ -" - -PYPI_PACKAGE = "yarl" - -inherit pypi ptest setuptools3 - -RDEPENDS_${PN} = "\ - ${PYTHON_PN}-multidict \ - ${PYTHON_PN}-idna \ -" - -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-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.3.0.bb b/meta-python/recipes-devtools/python/python3-zopeinterface_5.3.0.bb deleted file mode 100644 index 5da5a88b97..0000000000 --- a/meta-python/recipes-devtools/python/python3-zopeinterface_5.3.0.bb +++ /dev/null @@ -1,23 +0,0 @@ -SUMMARY = "Interface definitions for Zope products" -LICENSE = "ZPL-2.1" -LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e54fd776274c1b7423ec128974bd9d46" - -PYPI_PACKAGE = "zope.interface" - -inherit pypi setuptools3 -SRC_URI[sha256sum] = "b18a855f8504743e0a2d8b75d008c7720d44e4c76687e13f959e35d9a13eb397" - -PACKAGES =. "${PN}-test " - -RPROVIDES_${PN} += "zope-interfaces" - -RDEPENDS_${PN}_class-target += "${PYTHON_PN}-datetime" -RDEPENDS_${PN}-test += "python3-unittest python3-doctest" - -FILES_${PN}-dbg += "${PYTHON_SITEPACKAGES_DIR}/*.egg/*/*/.debug" -FILES_${PN}-dev += "${PYTHON_SITEPACKAGES_DIR}/zope/interface/*.c" -FILES_${PN}-doc += "${PYTHON_SITEPACKAGES_DIR}/zope/interface/*.txt" -FILES_${PN}-test += " \ - ${PYTHON_SITEPACKAGES_DIR}/zope/interface/tests \ - ${PYTHON_SITEPACKAGES_DIR}/zope/interface/common/tests \ -" diff --git a/meta-python/recipes-devtools/python/python3-zopeinterface_6.3.bb b/meta-python/recipes-devtools/python/python3-zopeinterface_6.3.bb new file mode 100644 index 0000000000..21d03f2e7d --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-zopeinterface_6.3.bb @@ -0,0 +1,23 @@ +SUMMARY = "Interface definitions for Zope products" +LICENSE = "ZPL-2.1" +LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e54fd776274c1b7423ec128974bd9d46" + +PYPI_PACKAGE = "zope.interface" + +inherit pypi setuptools3 +SRC_URI[sha256sum] = "f83d6b4b22262d9a826c3bd4b2fbfafe1d0000f085ef8e44cd1328eea274ae6a" + +PACKAGES =. "${PN}-test " + +RPROVIDES:${PN} += "zope-interfaces" + +RDEPENDS:${PN}:class-target += "python3-datetime" +RDEPENDS:${PN}-test += "python3-unittest python3-doctest" + +FILES:${PN}-dbg += "${PYTHON_SITEPACKAGES_DIR}/*.egg/*/*/.debug" +FILES:${PN}-dev += "${PYTHON_SITEPACKAGES_DIR}/zope/interface/*.c" +FILES:${PN}-doc += "${PYTHON_SITEPACKAGES_DIR}/zope/interface/*.txt" +FILES:${PN}-test += " \ + ${PYTHON_SITEPACKAGES_DIR}/zope/interface/tests \ + ${PYTHON_SITEPACKAGES_DIR}/zope/interface/common/tests \ +" 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-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/add-back-option-build-base.patch b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/add-back-option-build-base.patch new file mode 100644 index 0000000000..a46f3f870a --- /dev/null +++ b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/add-back-option-build-base.patch @@ -0,0 +1,22 @@ +Add back default user options for cross build. + +Upstream-Status: Pending [oe specific] + +Signed-off-by: Kai Kang <kai.kang@windriver.com> +--- + setup.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/setup.py b/setup.py +index a215da7..dccfeb3 100644 +--- a/setup.py ++++ b/setup.py +@@ -105,7 +105,7 @@ class wx_build(orig_build): + Delegate to build.py for doing the actual build, (including wxWidgets) + instead of letting distutils do it all. + """ +- user_options = [ ++ user_options = orig_build.user_options + [ + ('skip-build', None, 'skip building the C/C++ code (assumes it has already been done)'), + ] + boolean_options = ['skip-build'] 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/wxgtk-fixup-build-scripts.patch b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/wxgtk-fixup-build-scripts.patch new file mode 100644 index 0000000000..0d65ebb598 --- /dev/null +++ b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/wxgtk-fixup-build-scripts.patch @@ -0,0 +1,53 @@ +Fix issues in build scripts: + +* remove hardcode lib path from buildtools/config.py which is not suitable for + cross build +* only build target 'build_py' in setup.py +* do not override self.install_lib with self.install_platlib which causes + package issue when multilib is enabled. + +Upstream-Status: Pending [cross build specific] + +Signed-off-by: Kai Kang <kai.kang@windriver.com> +--- + buildtools/config.py | 4 ++-- + setup.py | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/buildtools/config.py b/buildtools/config.py +index c837e5d..d426005 100644 +--- a/buildtools/config.py ++++ b/buildtools/config.py +@@ -312,8 +312,8 @@ class Configuration(object): + # wx-config doesn't output that for some reason. For now, just + # add it unconditionally but we should really check if the lib is + # really found there or wx-config should be fixed. +- if self.WXPORT != 'msw': +- self.libdirs.append("/usr/X11R6/lib") ++ #if self.WXPORT != 'msw': ++ # self.libdirs.append("/usr/X11R6/lib") + + # Move the various -I, -D, etc. flags we got from the config scripts + # into the distutils lists. +diff --git a/setup.py b/setup.py +index 64bec4b..fb29253 100644 +--- a/setup.py ++++ b/setup.py +@@ -130,7 +130,7 @@ class wx_build(orig_build): + 'message and the wxWidgets and Phoenix build steps in the future.\n') + + # Use the same Python that is running this script. +- cmd = ['"{}"'.format(sys.executable), '-u', 'build.py', 'build'] ++ cmd = ['"{}"'.format(sys.executable), '-u', 'build.py', 'build_py'] + cmd = ' '.join(cmd) + runcmd(cmd) + +@@ -233,7 +233,7 @@ if haveWheel: + class wx_install(orig_install): + def finalize_options(self): + orig_install.finalize_options(self) +- self.install_lib = self.install_platlib ++ #self.install_lib = self.install_platlib + + def run(self): + self.run_command("build") diff --git a/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4_4.2.1.bb b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4_4.2.1.bb new file mode 100644 index 0000000000..fb011cb71b --- /dev/null +++ b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4_4.2.1.bb @@ -0,0 +1,38 @@ +DESCRIPTION = "Python3 interface to the wxWidgets Cross-platform C++ GUI toolkit." +HOMEPAGE = "http://www.wxpython.org" + +LICENSE = "LGPL-2.0-only & WXwindows" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=bdabf9e11191e2b9d3b6aef5f338ec00" + +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://not-overwrite-cflags-cxxflags.patch \ + file://0001-sip-Conditionally-use-GetAssertStackTrace-under-USE_.patch \ + " +SRC_URI[sha256sum] = "e48de211a6606bf072ec3fa778771d6b746c00b7f4b970eb58728ddf56d13d5c" + +S = "${WORKDIR}/wxPython-${PV}" + +inherit pypi setuptools3 pkgconfig features_check + +REQUIRED_DISTRO_FEATURES = "x11" + +export WX_CONFIG = "'${RECIPE_SYSROOT_NATIVE}${bindir}/wx-config --prefix=${STAGING_EXECPREFIXDIR} --baselib=${baselib}'" + +RDEPENDS:${PN} = "\ + python3-difflib \ + python3-image \ + python3-numpy \ + python3-pillow \ + python3-pip \ + python3-pprint \ + python3-pycairo \ + python3-six \ + python3-xml \ +" 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 |