diff options
Diffstat (limited to 'meta-python/recipes-devtools')
962 files changed, 18516 insertions, 10817 deletions
diff --git a/meta-python/recipes-devtools/gyp/gyp/0001-Fix-for-Python-3.10-compatibility.patch b/meta-python/recipes-devtools/gyp/gyp/0001-Fix-for-Python-3.10-compatibility.patch deleted file mode 100644 index 2b88023fe8..0000000000 --- a/meta-python/recipes-devtools/gyp/gyp/0001-Fix-for-Python-3.10-compatibility.patch +++ /dev/null @@ -1,25 +0,0 @@ -From bfe579283e5fcab60172818bfe4e6e1d40c2bed0 Mon Sep 17 00:00:00 2001 -From: Kurt Kiefer <kurt.kiefer@arthrex.com> -Date: Mon, 18 Oct 2021 11:21:14 -0700 -Subject: [PATCH] Fix for Python 3.10 compatibility - -The collections.abc module replaces collections for Python 3.10 - -Signed-off-by: Kurt Kiefer <kurt.kiefer@arthrex.com> ---- - pylib/gyp/common.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/pylib/gyp/common.py b/pylib/gyp/common.py -index b268d229..4f9cb0ec 100644 ---- a/pylib/gyp/common.py -+++ b/pylib/gyp/common.py -@@ -494,7 +494,7 @@ def uniquer(seq, idfun=None): - - - # Based on http://code.activestate.com/recipes/576694/. --class OrderedSet(collections.MutableSet): -+class OrderedSet(collections.abc.MutableSet): - def __init__(self, iterable=None): - self.end = end = [] - end += [None, end, end] # sentinel node for doubly linked list diff --git a/meta-python/recipes-devtools/gyp/gyp_git.bb b/meta-python/recipes-devtools/gyp/gyp_git.bb index 38906de759..6ac4228a8b 100644 --- a/meta-python/recipes-devtools/gyp/gyp_git.bb +++ b/meta-python/recipes-devtools/gyp/gyp_git.bb @@ -5,12 +5,11 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=ab828cb8ce4c62ee82945a11247b6bbd" SECTION = "devel" SRC_URI = "git://chromium.googlesource.com/external/gyp;protocol=https;branch=master \ - file://0001-Fix-for-Python-3.10-compatibility.patch \ " -SRCREV = "caa60026e223fc501e8b337fd5086ece4028b1c6" +SRCREV = "a03d7413becefc8d55c8aa3df58b55b9bd0e9052" S = "${WORKDIR}/git" -PV = "0.1+git${SRCPV}" +PV = "0.1+git" inherit setuptools3 diff --git a/meta-python/recipes-devtools/python-jsonref/files/migrate-to-pdm-backend.patch b/meta-python/recipes-devtools/python-jsonref/files/migrate-to-pdm-backend.patch new file mode 100644 index 0000000000..709a38c4aa --- /dev/null +++ b/meta-python/recipes-devtools/python-jsonref/files/migrate-to-pdm-backend.patch @@ -0,0 +1,28 @@ +From 1b594cf12e5a69aa25f49f532c1201a6b39e280d Mon Sep 17 00:00:00 2001 +From: Leon Anavi <leon.anavi@konsulko.com> +Date: Tue, 7 Nov 2023 10:43:32 +0000 +Subject: [PATCH] Migrate to pdm-backend + +Signed-off-by: Leon Anavi <leon.anavi@konsulko.com> +Upstream-Status: Pending +--- + pyproject.toml | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/pyproject.toml b/pyproject.toml +index f549376..c608213 100644 +--- a/pyproject.toml ++++ b/pyproject.toml +@@ -36,7 +36,5 @@ includes = [ + profile = "black" + + [build-system] +-requires = [ +- "pdm-pep517>=1.0.0", +-] +-build-backend = "pdm.pep517.api" ++requires = ["pdm-backend"] ++build-backend = "pdm.backend" +-- +2.39.2 + diff --git a/meta-python/recipes-devtools/python-jsonref/python3-jsonref_0.2.bb b/meta-python/recipes-devtools/python-jsonref/python3-jsonref_0.2.bb deleted file mode 100644 index 45deb09c72..0000000000 --- a/meta-python/recipes-devtools/python-jsonref/python3-jsonref_0.2.bb +++ /dev/null @@ -1,11 +0,0 @@ -SUMMARY = "jsonref is a library for automatic dereferencing of JSON Reference objects for Python" -HOMEPAGE = "https://github.com/gazpachoking/jsonref" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=a34264f25338d41744dca1abfe4eb18f" - -SRC_URI[md5sum] = "42b518b9ccd6852d1d709749bc96cb70" -SRC_URI[sha256sum] = "f3c45b121cf6257eafabdc3a8008763aed1cd7da06dbabc59a9e4d2a5e4e6697" - -inherit pypi setuptools3 - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python-jsonref/python3-jsonref_1.1.0.bb b/meta-python/recipes-devtools/python-jsonref/python3-jsonref_1.1.0.bb new file mode 100644 index 0000000000..4272fc4f24 --- /dev/null +++ b/meta-python/recipes-devtools/python-jsonref/python3-jsonref_1.1.0.bb @@ -0,0 +1,23 @@ +SUMMARY = "jsonref is a library for automatic dereferencing of JSON Reference objects for Python" +HOMEPAGE = "https://github.com/gazpachoking/jsonref" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=4ac1cccee5d43e11fc4eddcf445be64a" + +SRC_URI[sha256sum] = "32fe8e1d85af0fdefbebce950af85590b22b60f9e95443176adbde4e1ecea552" + +SRC_URI += "file://migrate-to-pdm-backend.patch" + +inherit pypi python_setuptools_build_meta + +BBCLASSEXTEND = "native nativesdk" + +DEPENDS += " \ + python3-pdm-native \ + python3-pdm-backend-native \ +" + +RDEPENDS:${PN} += " \ + python3-core \ + python3-json \ + python3-netclient \ +" diff --git a/meta-python/recipes-devtools/python/files/0001-versioneer.py-do-not-use-SafeConfigParser.patch b/meta-python/recipes-devtools/python/files/0001-versioneer.py-do-not-use-SafeConfigParser.patch new file mode 100644 index 0000000000..34caaca982 --- /dev/null +++ b/meta-python/recipes-devtools/python/files/0001-versioneer.py-do-not-use-SafeConfigParser.patch @@ -0,0 +1,29 @@ +From 0920bd21ceab75bc4b655c571a37835526dd2468 Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin <alex@linutronix.de> +Date: Wed, 27 Dec 2023 15:12:19 +0100 +Subject: [PATCH] versioneer.py: do not use SafeConfigParser + +This has been deprecated for a long time, and finally removed in python 3.12 + +Upstream-Status: Submitted [https://github.com/rsokl/custom_inherit/pull/49] +Signed-off-by: Alexander Kanavin <alex@linutronix.de> +--- + versioneer.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/versioneer.py b/versioneer.py +index 64fea1c..3aa5da3 100644 +--- a/versioneer.py ++++ b/versioneer.py +@@ -339,9 +339,9 @@ def get_config_from_root(root): + # configparser.NoOptionError (if it lacks "VCS="). See the docstring at + # the top of versioneer.py for instructions on writing your setup.cfg . + setup_cfg = os.path.join(root, "setup.cfg") +- parser = configparser.SafeConfigParser() ++ parser = configparser.ConfigParser() + with open(setup_cfg, "r") as f: +- parser.readfp(f) ++ parser.read_file(f) + VCS = parser.get("versioneer", "VCS") # mandatory + + def get(parser, name): diff --git a/meta-python/recipes-devtools/python/pamela_1.0.0.bb b/meta-python/recipes-devtools/python/pamela_1.0.0.bb deleted file mode 100644 index 369ed78ca7..0000000000 --- a/meta-python/recipes-devtools/python/pamela_1.0.0.bb +++ /dev/null @@ -1,15 +0,0 @@ -DESCRIPTION = "Pamela: yet another Python wrapper for PAM" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://PKG-INFO;md5=3f9b78307cdde4e6a4976bfd82a0e7f3" - -SRC_URI[md5sum] = "5fc14f5275383ed8bdd509007af0323d" -SRC_URI[sha256sum] = "65c9389bef7d1bb0b168813b6be21964df32016923aac7515bdf05366acbab6c" - -PYPI_PACKAGE = "pamela" - -inherit pypi setuptools3 - -RDEPENDS:${PN} = "libpam" - -inherit features_check -REQUIRED_DISTRO_FEATURES = "pam" diff --git a/meta-python/recipes-devtools/python/pamela_1.2.0.bb b/meta-python/recipes-devtools/python/pamela_1.2.0.bb new file mode 100644 index 0000000000..ff87e187ca --- /dev/null +++ b/meta-python/recipes-devtools/python/pamela_1.2.0.bb @@ -0,0 +1,14 @@ +DESCRIPTION = "Pamela: yet another Python wrapper for PAM" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://PKG-INFO;md5=b5fa9af58a8076d81145be56b6801a2b" + +SRC_URI[sha256sum] = "0ea6e2a99dded8c7783a4a06f2d31f5bdcad894d79101e8f09322e387a34aacf" + +PYPI_PACKAGE = "pamela" + +inherit pypi setuptools3 + +RDEPENDS:${PN} = "libpam" + +inherit features_check +REQUIRED_DISTRO_FEATURES = "pam" diff --git a/meta-python/recipes-devtools/python/pyrtm_0.4.2.bb b/meta-python/recipes-devtools/python/pyrtm_0.4.2.bb index 71e932bb0c..ed4e588509 100644 --- a/meta-python/recipes-devtools/python/pyrtm_0.4.2.bb +++ b/meta-python/recipes-devtools/python/pyrtm_0.4.2.bb @@ -1,5 +1,4 @@ SUMMARY = "Python interface for Remember The Milk API" -AUTHOR = "Sridhar Ratnakumar / srid" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=a53cbc7cb75660694e138ba973c148df" @@ -21,9 +20,9 @@ FILES:${PN}-tests += " \ " RDEPENDS:${PN} += "\ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-netclient \ + python3-json \ + python3-logging \ + python3-netclient \ " RDEPENDS:${PN}-samples += " \ @@ -32,5 +31,5 @@ RDEPENDS:${PN}-samples += " \ RDEPENDS:${PN}-tests += " \ ${PN} \ - ${PYTHON_PN}-unittest \ + python3-unittest \ " diff --git a/meta-python/recipes-devtools/python/python-daemon/0001-Workaround-for-issue-2-1.patch b/meta-python/recipes-devtools/python/python-daemon/0001-Workaround-for-issue-2-1.patch deleted file mode 100644 index dbb8407186..0000000000 --- a/meta-python/recipes-devtools/python/python-daemon/0001-Workaround-for-issue-2-1.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 0981eee9f0198c2045dc0eaa78a005d06fc7bfe4 Mon Sep 17 00:00:00 2001 -From: Carlos Eduardo Moreira dos Santos <cems@cemshost.com.br> -Date: Tue, 28 Mar 2017 18:23:44 -0300 -Subject: [PATCH] Workaround for issue 2 [1] - -[1] https://pagure.io/python-daemon/issue/2 ---- - version.py | 7 ++++--- - 1 file changed, 4 insertions(+), 3 deletions(-) - -diff --git a/version.py b/version.py -index d58422a377ee..293e2d64c2b7 100644 ---- a/version.py -+++ b/version.py -@@ -648,9 +648,10 @@ class ChangelogAwareDistribution(distutils.dist.Distribution, object): - - @lru_cache(maxsize=128) - def get_version_info(self): -- changelog_path = get_changelog_path(self) -- version_info = generate_version_info_from_changelog(changelog_path) -- return version_info -+ return { -+ 'version': '2.1.2', -+ 'maintainer': 'Ben Finney' -+ } - - def get_version(self): - version_info = self.get_version_info() --- -2.7.4 - diff --git a/meta-python/recipes-devtools/python/python-django-south.inc b/meta-python/recipes-devtools/python/python-django-south.inc index 4a376391aa..28eb84c563 100644 --- a/meta-python/recipes-devtools/python/python-django-south.inc +++ b/meta-python/recipes-devtools/python/python-django-south.inc @@ -13,5 +13,5 @@ inherit pypi BBCLASSEXTEND = "native nativesdk" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-django \ + python3-django \ " diff --git a/meta-python/recipes-devtools/python/python-django.inc b/meta-python/recipes-devtools/python/python-django.inc index e030ff4087..d9ab3fd21f 100644 --- a/meta-python/recipes-devtools/python/python-django.inc +++ b/meta-python/recipes-devtools/python/python-django.inc @@ -13,22 +13,21 @@ FILES:${PN} += "${datadir}/django" BBCLASSEXTEND = "native nativesdk" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-ctypes \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-email \ - ${PYTHON_PN}-html \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-multiprocessing \ - ${PYTHON_PN}-netserver \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-pkgutil \ - ${PYTHON_PN}-pytz \ - ${PYTHON_PN}-threading \ - ${PYTHON_PN}-unixadmin \ - ${PYTHON_PN}-xml \ - ${PYTHON_PN}-distutils \ + python3-compression \ + python3-ctypes \ + python3-datetime \ + python3-email \ + python3-html \ + python3-json \ + python3-logging \ + python3-multiprocessing \ + python3-netserver \ + python3-numbers \ + python3-pkgutil \ + python3-pytz \ + python3-threading \ + python3-unixadmin \ + python3-xml \ " CVE_PRODUCT = "django" diff --git a/meta-python/recipes-devtools/python/python-flask-bootstrap.inc b/meta-python/recipes-devtools/python/python-flask-bootstrap.inc index 1a729c975b..24c76ce942 100644 --- a/meta-python/recipes-devtools/python/python-flask-bootstrap.inc +++ b/meta-python/recipes-devtools/python/python-flask-bootstrap.inc @@ -8,7 +8,7 @@ SRC_URI[sha256sum] = "cb08ed940183f6343a64e465e83b3a3f13c53e1baabb8d72b5da4545ef PYPI_PACKAGE = "Flask-Bootstrap" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-dominate \ - ${PYTHON_PN}-flask \ - ${PYTHON_PN}-visitor \ + python3-dominate \ + python3-flask \ + python3-visitor \ " diff --git a/meta-python/recipes-devtools/python/python-flask-script.inc b/meta-python/recipes-devtools/python/python-flask-script.inc deleted file mode 100644 index 3a7adb32ca..0000000000 --- a/meta-python/recipes-devtools/python/python-flask-script.inc +++ /dev/null @@ -1,12 +0,0 @@ -DESCRIPTION = "Scripting support for flask" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=e686048adb69341fc8a08caeda528b41" - -SRC_URI[md5sum] = "3fbd91fe13cebedfb2431331f6eabb68" -SRC_URI[sha256sum] = "6425963d91054cfcc185807141c7314a9c5ad46325911bd24dcb489bd0161c65" - -PYPI_PACKAGE = "Flask-Script" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-flask \ - " diff --git a/meta-python/recipes-devtools/python/python-flask-sijax.inc b/meta-python/recipes-devtools/python/python-flask-sijax.inc index 4264f8f6d5..239c843fce 100644 --- a/meta-python/recipes-devtools/python/python-flask-sijax.inc +++ b/meta-python/recipes-devtools/python/python-flask-sijax.inc @@ -5,4 +5,8 @@ LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=266adc7b911b7c84b837bf77196e1ba6" PYPI_PACKAGE = "Flask-Sijax" -RDEPENDS:${PN} = "${PYTHON_PN}-sijax"
\ No newline at end of file +RDEPENDS:${PN} += " \ + python3-flask \ + python3-sijax \ + python3-werkzeug \ +" diff --git a/meta-python/recipes-devtools/python/python-flask-xstatic.inc b/meta-python/recipes-devtools/python/python-flask-xstatic.inc index 5f4e0858f8..8434d2610b 100644 --- a/meta-python/recipes-devtools/python/python-flask-xstatic.inc +++ b/meta-python/recipes-devtools/python/python-flask-xstatic.inc @@ -11,6 +11,6 @@ SRC_URI += "file://remove-pip-requires.patch" PYPI_PACKAGE = "Flask-XStatic" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-flask \ - ${PYTHON_PN}-xstatic \ + python3-flask \ + python3-xstatic \ " diff --git a/meta-python/recipes-devtools/python/python-flask-xstatic/remove-pip-requires.patch b/meta-python/recipes-devtools/python/python-flask-xstatic/remove-pip-requires.patch index a2d620ad06..ba06d670e3 100644 --- a/meta-python/recipes-devtools/python/python-flask-xstatic/remove-pip-requires.patch +++ b/meta-python/recipes-devtools/python/python-flask-xstatic/remove-pip-requires.patch @@ -1,3 +1,5 @@ +Upstream-Status: Pending + --- Flask-XStatic-0.0.1/setup.py.orig 2015-01-30 08:01:56.000000000 -0800 +++ Flask-XStatic-0.0.1/setup.py 2017-04-17 21:40:32.570181626 -0700 @@ -1,4 +1,3 @@ diff --git a/meta-python/recipes-devtools/python/python-idna-ssl.inc b/meta-python/recipes-devtools/python/python-idna-ssl.inc deleted file mode 100644 index e74bbd7c65..0000000000 --- a/meta-python/recipes-devtools/python/python-idna-ssl.inc +++ /dev/null @@ -1,10 +0,0 @@ -SUMMARY = "Patch ssl.match_hostname for Unicode(idna) domains support" -HOMEPAGE = "https://github.com/aio-libs/idna-ssl" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=a61b9c5aec8796b64a6bf15d42605073" - -SRC_URI[md5sum] = "dd44ec53bac36e68446766fd8d3835bd" -SRC_URI[sha256sum] = "a933e3bb13da54383f9e8f35dc4f9cb9eb9b3b78c6b36f311254d6d0d92c6c7c" - -PYPI_PACKAGE = "idna-ssl" -inherit pypi diff --git a/meta-python/recipes-devtools/python/python-imaging/0001-python-imaging-setup.py-force-paths-for-zlib-freetyp.patch b/meta-python/recipes-devtools/python/python-imaging/0001-python-imaging-setup.py-force-paths-for-zlib-freetyp.patch deleted file mode 100644 index 2575306bec..0000000000 --- a/meta-python/recipes-devtools/python/python-imaging/0001-python-imaging-setup.py-force-paths-for-zlib-freetyp.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 07d4f095a9e22ae676a8d68073101131e65012dc Mon Sep 17 00:00:00 2001 -From: Koen Kooi <koen@dominion.thruhere.net> -Date: Tue, 15 Nov 2011 13:16:54 +0100 -Subject: [PATCH] python imaging setup.py: force paths for zlib, freetype and jpeg and don't add host paths - -Signed-off-by: Koen Kooi <koen@dominion.thruhere.net> - -Upstream-Status: Inappropriate [embedded specific] ---- - setup.py | 14 +++----------- - 1 files changed, 3 insertions(+), 11 deletions(-) - -diff --git a/setup.py b/setup.py -index 5d4d53a..b1a22ec 100644 ---- a/setup.py -+++ b/setup.py -@@ -34,10 +34,10 @@ def libinclude(root): - # TIFF_ROOT = libinclude("/opt/tiff") - - TCL_ROOT = None --JPEG_ROOT = None --ZLIB_ROOT = None -+JPEG_ROOT = os.environ['STAGING_LIBDIR'] -+ZLIB_ROOT = os.environ['STAGING_LIBDIR'] - TIFF_ROOT = None --FREETYPE_ROOT = None -+FREETYPE_ROOT = os.environ['STAGING_LIBDIR'], os.environ['STAGING_INCDIR'] - LCMS_ROOT = None - - # FIXME: add mechanism to explicitly *disable* the use of a library -@@ -147,7 +147,6 @@ class pil_build_ext(build_ext): - add_directory(library_dirs, "/opt/local/lib") - add_directory(include_dirs, "/opt/local/include") - -- add_directory(library_dirs, "/usr/local/lib") - # FIXME: check /opt/stuff directories here? - - prefix = sysconfig.get_config_var("prefix") -@@ -207,13 +206,6 @@ class pil_build_ext(build_ext): - if os.path.isfile(os.path.join(tcl_dir, "tk.h")): - add_directory(include_dirs, tcl_dir) - -- # standard locations -- add_directory(library_dirs, "/usr/local/lib") -- add_directory(include_dirs, "/usr/local/include") -- -- add_directory(library_dirs, "/usr/lib") -- add_directory(include_dirs, "/usr/include") -- - # - # insert new dirs *before* default libs, to avoid conflicts - # between Python PYD stub libs and real libraries --- -1.7.2.5 - diff --git a/meta-python/recipes-devtools/python/python-imaging/allow.to.disable.some.features.patch b/meta-python/recipes-devtools/python/python-imaging/allow.to.disable.some.features.patch deleted file mode 100644 index 4960ed4661..0000000000 --- a/meta-python/recipes-devtools/python/python-imaging/allow.to.disable.some.features.patch +++ /dev/null @@ -1,65 +0,0 @@ -At least lcms wasn't deterministicly detected from sysroot. - -This will allow to export LCMS_ENABLED=False when lcms isn't in PACKAGECONFIG. - -Upstream-Status: Inappropriate [configuration] - -Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com> - -diff -uNr Imaging-1.1.7.orig/setup.py Imaging-1.1.7/setup.py ---- Imaging-1.1.7.orig/setup.py 2013-07-22 10:17:02.081457075 +0200 -+++ Imaging-1.1.7/setup.py 2013-07-22 13:10:09.029707492 +0200 -@@ -39,6 +39,12 @@ - TIFF_ROOT = None - FREETYPE_ROOT = os.environ['STAGING_LIBDIR'], os.environ['STAGING_INCDIR'] - LCMS_ROOT = None -+TCL_ENABLED = os.getenv('TCL_ENABLED', "True") -+JPEG_ENABLED = os.getenv('JPEG_ENABLED', "True") -+ZLIB_ENABLED = os.getenv('ZLIB_ENABLED', "True") -+TIFF_ENABLED = os.getenv('TIFF_ENABLED', "True") -+FREETYPE_ENABLED = os.getenv('FREETYPE_ENABLED', "True") -+LCMS_ENABLED = os.getenv('LCMS_ENABLED', "True") - - # FIXME: add mechanism to explicitly *disable* the use of a library - -@@ -220,22 +226,22 @@ - zlib = jpeg = tiff = freetype = tcl = tk = lcms = None - feature = feature() - -- if find_include_file(self, "zlib.h"): -+ if ZLIB_ENABLED == 'True' and find_include_file(self, "zlib.h"): - if find_library_file(self, "z"): - feature.zlib = "z" - elif sys.platform == "win32" and find_library_file(self, "zlib"): - feature.zlib = "zlib" # alternative name - -- if find_include_file(self, "jpeglib.h"): -+ if JPEG_ENABLED == 'True' and find_include_file(self, "jpeglib.h"): - if find_library_file(self, "jpeg"): - feature.jpeg = "jpeg" - elif sys.platform == "win32" and find_library_file(self, "libjpeg"): - feature.jpeg = "libjpeg" # alternative name - -- if find_library_file(self, "tiff"): -+ if TIFF_ENABLED == 'True' and find_library_file(self, "tiff"): - feature.tiff = "tiff" - -- if find_library_file(self, "freetype"): -+ if FREETYPE_ENABLED == 'True' and find_library_file(self, "freetype"): - # look for freetype2 include files - freetype_version = 0 - for dir in self.compiler.include_dirs: -@@ -256,11 +262,11 @@ - if dir: - add_directory(self.compiler.include_dirs, dir, 0) - -- if find_include_file(self, "lcms.h"): -+ if LCMS_ENABLED == 'True' and find_include_file(self, "lcms.h"): - if find_library_file(self, "lcms"): - feature.lcms = "lcms" - -- if _tkinter and find_include_file(self, "tk.h"): -+ if TCL_ENABLED == 'True' and _tkinter and find_include_file(self, "tk.h"): - # the library names may vary somewhat (e.g. tcl84 or tcl8.4) - version = TCL_VERSION[0] + TCL_VERSION[2] - if find_library_file(self, "tcl" + version): diff --git a/meta-python/recipes-devtools/python/python-imaging/fix-freetype-includes.patch b/meta-python/recipes-devtools/python/python-imaging/fix-freetype-includes.patch deleted file mode 100644 index 9ecc63a0d6..0000000000 --- a/meta-python/recipes-devtools/python/python-imaging/fix-freetype-includes.patch +++ /dev/null @@ -1,30 +0,0 @@ -Upstream-Status: Backport -Signed-off-by: Ross Burton <ross.burton@intel.com> - -From c6040f618d8f2706a7b46d1cdf37d1a587f9701f Mon Sep 17 00:00:00 2001 -From: Andrew Stromnov <stromnov@gmail.com> -Date: Thu, 28 Nov 2013 16:58:43 +0400 -Subject: [PATCH] fix compiling with FreeType 2.5.1 - ---- - _imagingft.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/_imagingft.c b/_imagingft.c -index 47d50bd..f19555b 100644 ---- a/_imagingft.c -+++ b/_imagingft.c -@@ -59,7 +59,11 @@ struct { - const char* message; - } ft_errors[] = - -+#if defined(USE_FREETYPE_2_1) -+#include FT_ERRORS_H -+#else - #include <freetype/fterrors.h> -+#endif - - /* -------------------------------------------------------------------- */ - /* font objects */ --- -1.8.5.1 diff --git a/meta-python/recipes-devtools/python/python-imaging/python-imaging-CVE-2016-2533.patch b/meta-python/recipes-devtools/python/python-imaging/python-imaging-CVE-2016-2533.patch deleted file mode 100644 index b01136f9ac..0000000000 --- a/meta-python/recipes-devtools/python/python-imaging/python-imaging-CVE-2016-2533.patch +++ /dev/null @@ -1,38 +0,0 @@ -python-imaging: CVE-2016-2533 - -the patch comes from: -https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-2533 -https://github.com/python-pillow/Pillow/commit/ae453aa18b66af54e7ff716f4ccb33adca60afd4#diff-8ff6909c159597e22288ad818938fd6b - -PCD decoder overruns the shuffle buffer, Fixes #568 - -Signed-off-by: Li Wang <li.wang@windriver.com> ---- - libImaging/PcdDecode.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/libImaging/PcdDecode.c b/libImaging/PcdDecode.c -index b6898e3..c02d005 100644 ---- a/libImaging/PcdDecode.c -+++ b/libImaging/PcdDecode.c -@@ -47,7 +47,7 @@ ImagingPcdDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) - out[0] = ptr[x]; - out[1] = ptr[(x+4*state->xsize)/2]; - out[2] = ptr[(x+5*state->xsize)/2]; -- out += 4; -+ out += 3; - } - - state->shuffle((UINT8*) im->image[state->y], -@@ -62,7 +62,7 @@ ImagingPcdDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) - out[0] = ptr[x+state->xsize]; - out[1] = ptr[(x+4*state->xsize)/2]; - out[2] = ptr[(x+5*state->xsize)/2]; -- out += 4; -+ out += 3; - } - - state->shuffle((UINT8*) im->image[state->y], --- -1.7.9.5 - diff --git a/meta-python/recipes-devtools/python/python-imaging/remove-host-libdir.patch b/meta-python/recipes-devtools/python/python-imaging/remove-host-libdir.patch deleted file mode 100644 index 028a51ad59..0000000000 --- a/meta-python/recipes-devtools/python/python-imaging/remove-host-libdir.patch +++ /dev/null @@ -1,25 +0,0 @@ -Avoid getting host sysroot paths in the library paths to fix issue like: - -| /home/andrei/work/yocto/build-rpi-master/tmp/sysroots/x86_64-linux/usr/lib/libz.so: file not recognized: File format not recognized - -Upstream-Status: Inappropriate [configuration] - -Signed-off-by: Andrei Gherzan <andrei@gherzan.ro> - - -Index: Imaging-1.1.7/setup.py -=================================================================== ---- Imaging-1.1.7.orig/setup.py -+++ Imaging-1.1.7/setup.py -@@ -155,11 +155,6 @@ class pil_build_ext(build_ext): - - # FIXME: check /opt/stuff directories here? - -- prefix = sysconfig.get_config_var("prefix") -- if prefix: -- add_directory(library_dirs, os.path.join(prefix, "lib")) -- add_directory(include_dirs, os.path.join(prefix, "include")) -- - # - # locate tkinter libraries - diff --git a/meta-python/recipes-devtools/python/python-libusb1_3.1.0.bb b/meta-python/recipes-devtools/python/python-libusb1_3.1.0.bb new file mode 100644 index 0000000000..3d7765607c --- /dev/null +++ b/meta-python/recipes-devtools/python/python-libusb1_3.1.0.bb @@ -0,0 +1,17 @@ +SUMMARY = "Pure-python wrapper for libusb-1.0" +HOMEPAGE = "http://github.com/vpelletier/python-libusb1" +LICENSE = "GPL-2.0-only & LGPL-2.1-only" +LIC_FILES_CHKSUM = " \ + file://COPYING;md5=751419260aa954499f7abaabaa882bbe \ + file://COPYING.LESSER;md5=4fbd65380cdd255951079008b364516c \ +" + +SRC_URI = "https://github.com/vpelletier/${BPN}/releases/download/${PV}/libusb1-${PV}.tar.gz" +SRC_URI[md5sum] = "7b4f094786d1dfc8d011c7649d8ccb97" +SRC_URI[sha256sum] = "4ee9b0a55f8bd0b3ea7017ae919a6c1f439af742c4a4b04543c5fd7af89b828c" + +S = "${WORKDIR}/libusb1-${PV}" + +RDEPENDS:${PN} = "libusb1" + +inherit setuptools3 diff --git a/meta-python/recipes-devtools/python/python-mccabe/0001-python-mccabe-remove-unnecessary-setup_requires-pyte.patch b/meta-python/recipes-devtools/python/python-mccabe/0001-python-mccabe-remove-unnecessary-setup_requires-pyte.patch deleted file mode 100644 index 941bed3d73..0000000000 --- a/meta-python/recipes-devtools/python/python-mccabe/0001-python-mccabe-remove-unnecessary-setup_requires-pyte.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 3484bdfa7adbaebcf8bb8e7d4820f64b12717932 Mon Sep 17 00:00:00 2001 -From: Mingli Yu <mingli.yu@windriver.com> -Date: Fri, 29 Jul 2016 15:37:18 +0800 -Subject: [PATCH] python-mccabe: remove unnecessary setup_requires - pytest-runner - -* Remove setup_requires pytest-runner as the - setup_requires pytest-runner actually is not - used for pytest which only in do_compile phase - via setup.py build - -Upstream-Status: Pending - -Signed-off-by: Mingli Yu <mingli.yu@windriver.com> ---- - setup.py | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/setup.py b/setup.py -index e59903d..bf2aaba 100644 ---- a/setup.py -+++ b/setup.py -@@ -33,7 +33,6 @@ setup( - license='Expat license', - py_modules=['mccabe'], - zip_safe=False, -- setup_requires=['pytest-runner'], - tests_require=['pytest'], - entry_points={ - 'flake8.extension': [ --- -2.8.1 - diff --git a/meta-python/recipes-devtools/python/python-numeric/0001-it-tries-to-define-this-function-differently-than-it.patch b/meta-python/recipes-devtools/python/python-numeric/0001-it-tries-to-define-this-function-differently-than-it.patch deleted file mode 100644 index 81ed744cbd..0000000000 --- a/meta-python/recipes-devtools/python/python-numeric/0001-it-tries-to-define-this-function-differently-than-it.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 322e781c67d7a78fc2cfc3d377f50b825fc64abb Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Fri, 2 Jun 2017 20:21:01 -0700 -Subject: [PATCH] it tries to define this function differently than it is - defined in sys/time.h. - -Use the definition from system - -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- - Packages/RNG/Src/ranf.c | 3 --- - 1 file changed, 3 deletions(-) - -diff --git a/Packages/RNG/Src/ranf.c b/Packages/RNG/Src/ranf.c -index 5ca7dc5..e669fa8 100644 ---- a/Packages/RNG/Src/ranf.c -+++ b/Packages/RNG/Src/ranf.c -@@ -149,9 +149,6 @@ void Mixranf(int *s,u32 s48[2]) - #else - struct timeval tv; - struct timezone tz; --#if !defined(__sgi) -- int gettimeofday(struct timeval *, struct timezone *); --#endif - - (void)gettimeofday(&tv,&tz); - s48[0] = (u32)tv.tv_sec; --- -2.13.0 - diff --git a/meta-python/recipes-devtools/python/python-pyasn1.inc b/meta-python/recipes-devtools/python/python-pyasn1.inc deleted file mode 100644 index 6cbed0fcd5..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 new file mode 100644 index 0000000000..8a646874e8 --- /dev/null +++ b/meta-python/recipes-devtools/python/python-rfc3986-validator/0001-setup.py-move-pytest-runner-to-test_requirements.patch @@ -0,0 +1,32 @@ +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.7.bb b/meta-python/recipes-devtools/python/python3-a2wsgi_1.10.7.bb new file mode 100644 index 0000000000..e65519ec31 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-a2wsgi_1.10.7.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] = "ce462ff7e1daac0bc57183c6f800f09a71c2a7a98ddd5cdeca149e3eabf3338e" + +DEPENDS += " \ + python3-pdm-native \ + python3-pdm-backend-native \ +" + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-httpx \ + python3-pytest \ + python3-pytest-asyncio \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} + +RDEPENDS:${PN} += " \ + python3-asyncio \ +" diff --git a/meta-python/recipes-devtools/python/python3-absl_1.0.0.bb b/meta-python/recipes-devtools/python/python3-absl_2.1.0.bb index 736e6a9444..5bdb83175d 100644 --- a/meta-python/recipes-devtools/python/python3-absl_1.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-absl_2.1.0.bb @@ -4,7 +4,7 @@ SECTION = "devel/python" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57" -SRC_URI[sha256sum] = "ac511215c01ee9ae47b19716599e8ccfa746f2e18de72bdf641b79b22afa27ea" +SRC_URI[sha256sum] = "7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff" PYPI_PACKAGE = "absl-py" diff --git a/meta-python/recipes-devtools/python/python3-aenum_3.1.5.bb b/meta-python/recipes-devtools/python/python3-aenum_3.1.15.bb index 4da70b86d5..3769be0d5d 100644 --- a/meta-python/recipes-devtools/python/python3-aenum_3.1.5.bb +++ b/meta-python/recipes-devtools/python/python3-aenum_3.1.15.bb @@ -3,12 +3,12 @@ HOMEPAGE = "https://pypi.org/project/aenum/" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://aenum/LICENSE;md5=c6a85477543f8b8591b9c1f82abebbe9" -SRC_URI[sha256sum] = "2ebad8590b6a0183c0d9893523b458edce987ae4533339c5ac185cfac32daf1a" +SRC_URI[sha256sum] = "8cbd76cd18c4f870ff39b24284d3ea028fbe8731a58df3aa581e434c575b9559" inherit pypi setuptools3 RDEPENDS:${PN} += "\ - ${PYTHON_PN}-pprint \ + python3-pprint \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-aiodns_3.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.8.0.bb b/meta-python/recipes-devtools/python/python3-aiofiles_24.1.0.bb index f7a75ec1ef..1e9ebdf97d 100644 --- a/meta-python/recipes-devtools/python/python3-aiofiles_0.8.0.bb +++ b/meta-python/recipes-devtools/python/python3-aiofiles_24.1.0.bb @@ -4,12 +4,12 @@ HOMEPAGE = "https://github.com/aio-libs/aiohttp" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=d2794c0df5b907fdace235a619d80314" -SRC_URI[sha256sum] = "8334f23235248a3b2e83b2c3a78a22674f39969b96397126cc93664d9a901e59" +SRC_URI[sha256sum] = "22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c" PYPI_PACKAGE = "aiofiles" -inherit pypi setuptools3 +inherit pypi python_hatchling RDEPENDS:${PN} = "\ - ${PYTHON_PN}-asyncio \ + python3-asyncio \ " diff --git a/meta-python/recipes-devtools/python/python3-aiohappyeyeballs_2.4.0.bb b/meta-python/recipes-devtools/python/python3-aiohappyeyeballs_2.4.0.bb new file mode 100644 index 0000000000..940492283b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-aiohappyeyeballs_2.4.0.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] = "55a1714f084e63d49639800f95716da97a1f173d46a16dfcfda0016abb93b6b2" + +inherit pypi python_poetry_core + +BBCLASSEXTEND = "native nativesdk" + diff --git a/meta-python/recipes-devtools/python/python3-aiohttp-jinja2_1.5.bb b/meta-python/recipes-devtools/python/python3-aiohttp-jinja2_1.6.bb index c86ec092a6..df4a0adcaf 100644 --- a/meta-python/recipes-devtools/python/python3-aiohttp-jinja2_1.5.bb +++ b/meta-python/recipes-devtools/python/python3-aiohttp-jinja2_1.6.bb @@ -3,13 +3,11 @@ SUMMARY = "jinja2 template renderer for aiohttp.web (http server for asyncio)" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=29dca541e03964615590ca7b50392d97" -SRC_URI[sha256sum] = "7c3ba5eac060b691f4e50534af2d79fca2a75712ebd2b25e6fcb1295859f910b" +SRC_URI[sha256sum] = "a3a7ff5264e5bca52e8ae547bbfd0761b72495230d438d05b6c0915be619b0e2" inherit pypi setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-jinja2 \ - ${PYTHON_PN}-aiohttp \ + python3-jinja2 \ + python3-aiohttp \ " - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-aiohttp_3.10.5.bb b/meta-python/recipes-devtools/python/python3-aiohttp_3.10.5.bb new file mode 100644 index 0000000000..f167b9d6ed --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-aiohttp_3.10.5.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] = "f071854b47d39591ce9a17981c46790acb30518e2f83dfca8db2dfa091178691" + +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-aiohttp_3.8.1.bb b/meta-python/recipes-devtools/python/python3-aiohttp_3.8.1.bb deleted file mode 100644 index 1d8434e3ca..0000000000 --- a/meta-python/recipes-devtools/python/python3-aiohttp_3.8.1.bb +++ /dev/null @@ -1,26 +0,0 @@ -SUMMARY = "Async http client/server framework" -DESCRIPTION = "Asynchronous HTTP client/server framework for asyncio and Python" -HOMEPAGE = "https://github.com/aio-libs/aiohttp" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=8074d6c6e217873b2a018a4522243ea3" - -SRC_URI[sha256sum] = "fc5471e1a54de15ef71c1bc6ebe80d4dc681ea600e68bfd1cbce40427f0b7578" - -PYPI_PACKAGE = "aiohttp" -inherit 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 \ - ${PYTHON_PN}-cchardet \ - ${PYTHON_PN}-charset-normalizer \ - ${PYTHON_PN}-aiosignal \ -" diff --git a/meta-python/recipes-devtools/python/python3-aiohue_3.0.1.bb b/meta-python/recipes-devtools/python/python3-aiohue_3.0.1.bb deleted file mode 100644 index 757ab96c33..0000000000 --- a/meta-python/recipes-devtools/python/python3-aiohue_3.0.1.bb +++ /dev/null @@ -1,11 +0,0 @@ -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] = "f4933b8583d093da4c2772c40c59d262892539c7053996cea5b964a2cceaa386" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += "${PYTHON_PN}-aiohttp" diff --git a/meta-python/recipes-devtools/python/python3-aiohue_4.7.3.bb b/meta-python/recipes-devtools/python/python3-aiohue_4.7.3.bb new file mode 100644 index 0000000000..bc4e4016f6 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-aiohue_4.7.3.bb @@ -0,0 +1,15 @@ +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] = "9a50dfed1174dfc901ebbd29f1d0da5ce02c9704282ece004de40fce20774783" + +inherit pypi python_setuptools_build_meta + +RDEPENDS:${PN} += "\ + python3-aiohttp \ + python3-asyncio-throttle \ + 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/0001-use-poetry-core-for-pyproject-base-build.patch b/meta-python/recipes-devtools/python/python3-aioserial/0001-use-poetry-core-for-pyproject-base-build.patch new file mode 100644 index 0000000000..139bdb4f52 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-aioserial/0001-use-poetry-core-for-pyproject-base-build.patch @@ -0,0 +1,29 @@ +From 5798a250b465572d84a024389b173dc996690b03 Mon Sep 17 00:00:00 2001 +From: alperak <alperyasinak1@gmail.com> +Date: Thu, 8 Aug 2024 12:56:31 +0300 +Subject: [PATCH] Use poetry-core for pyproject base build + +https://github.com/python-poetry/poetry-core#why-is-this-required + +Upstream-Status: Pending + +Signed-off-by: alperak <alperyasinak1@gmail.com> +--- + pyproject.toml | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/pyproject.toml b/pyproject.toml +index 6243bff..06bc409 100644 +--- a/pyproject.toml ++++ b/pyproject.toml +@@ -15,5 +15,5 @@ python = "^3.6" + pyserial = "*" + + [build-system] +-requires = ["poetry>=0.12"] +-build-backend = "poetry.masonry.api" ++requires = ["poetry-core>=0.12"] ++build-backend = "poetry.core.masonry.api" +-- +2.25.1 + 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..5acbcbf974 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-aioserial_1.3.1.bb @@ -0,0 +1,16 @@ +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" + +SRC_URI += "file://0001-use-poetry-core-for-pyproject-base-build.patch" +SRC_URI[sha256sum] = "702bf03b0eb84b8ef2d8dac5cb925e1e685dce98f77b125569bc6fd2b3b58228" + +inherit pypi python_poetry_core + +RDEPENDS:${PN} += " \ + python3-asyncio \ + python3-pyserial \ +" diff --git a/meta-python/recipes-devtools/python/python3-aiosignal_1.2.0.bb b/meta-python/recipes-devtools/python/python3-aiosignal_1.3.1.bb index efd94f7934..029f13cd44 100644 --- a/meta-python/recipes-devtools/python/python3-aiosignal_1.2.0.bb +++ b/meta-python/recipes-devtools/python/python3-aiosignal_1.3.1.bb @@ -3,12 +3,12 @@ HOMEPAGE = "https://github.com/aio-libs/aiosignal" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=cf056e8e7a0a5477451af18b7b5aa98c" -SRC_URI[sha256sum] = "78ed67db6c7b7ced4f98e495e572106d5c432a93e1ddd1bf475e1dc05f5b7df2" +SRC_URI[sha256sum] = "54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta BBCLASSEXTEND = "native nativesdk" RDEPENDS:${PN} = "\ - ${PYTHON_PN}-frozenlist \ + python3-frozenlist \ " diff --git a/meta-python/recipes-devtools/python/python3-alembic_1.13.2.bb b/meta-python/recipes-devtools/python/python3-alembic_1.13.2.bb new file mode 100644 index 0000000000..6f8fb8c334 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-alembic_1.13.2.bb @@ -0,0 +1,19 @@ +DESCRIPTION = "A database migration tool for SQLAlchemy" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=00f8f5c8aab58c3e1cd61525a6675174" + +inherit pypi setuptools3 + +SRC_URI[sha256sum] = "1ff0ae32975f4fd96028c39ed9bb3c867fe3af956bd7bb37343b54c9fe7445ef" + +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.7.5.bb b/meta-python/recipes-devtools/python/python3-alembic_1.7.5.bb deleted file mode 100644 index 131d5d43a0..0000000000 --- a/meta-python/recipes-devtools/python/python3-alembic_1.7.5.bb +++ /dev/null @@ -1,19 +0,0 @@ -DESCRIPTION = "A database migration tool for SQLAlchemy" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=c4ece55266dcdd02ce165b1ee0e490bb" - -inherit pypi setuptools3 - -SRC_URI[sha256sum] = "7c328694a2e68f03ee971e63c3bd885846470373a5b532cf2c9f1601c413b153" - -PYPI_PACKAGE = "alembic" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-dateutil \ - ${PYTHON_PN}-editor \ - ${PYTHON_PN}-mako \ - ${PYTHON_PN}-sqlalchemy \ - ${PYTHON_PN}-misc \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-aniso8601_9.0.1.bb b/meta-python/recipes-devtools/python/python3-aniso8601_9.0.1.bb new file mode 100644 index 0000000000..3d99e48c26 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-aniso8601_9.0.1.bb @@ -0,0 +1,8 @@ +DESCRIPTION = "A library for parsing ISO 8601 strings." + +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=6d91d56f51a54389d95526eefe039b1c" + +SRC_URI[sha256sum] = "72e3117667eedf66951bb2d93f4296a56b94b078a8a95905a052611fb3f1b973" + +inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-annotated-types_0.7.0.bb b/meta-python/recipes-devtools/python/python3-annotated-types_0.7.0.bb new file mode 100644 index 0000000000..53552d0b7b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-annotated-types_0.7.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] = "aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89" + +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 0b6ba9ff75..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.2.bb b/meta-python/recipes-devtools/python/python3-ansi2html_1.9.2.bb new file mode 100644 index 0000000000..d817d8ee5d --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-ansi2html_1.9.2.bb @@ -0,0 +1,19 @@ +DESCRPTION = "ansi2html - Convert text with ANSI color codes to HTML or to LaTeX" +HOMEPAGE = "https://github.com/pycontribs/ansi2html" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3000208d539ec061b899bce1d9ce9404" +LICENSE = "LGPL-3.0-or-later" + +PYPI_PACKAGE = "ansi2html" + +SRC_URI[sha256sum] = "3453bf87535d37b827b05245faaa756dbab4ec3d69925e352b6319c3c955c0a5" + +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 0e32443992..b63cc32a23 100644 --- a/meta-python/recipes-devtools/python/python3-ansicolors_1.1.8.bb +++ b/meta-python/recipes-devtools/python/python3-ansicolors_1.1.8.bb @@ -14,7 +14,8 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-antlr4-runtime_4.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.4.0.bb b/meta-python/recipes-devtools/python/python3-anyio_4.4.0.bb new file mode 100644 index 0000000000..28c76cbf5c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-anyio_4.4.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] = "5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94" + +DEPENDS += " \ + python3-setuptools-scm-native \ +" + +# Don't provide "trio" PACKAGECONFIG as nothing provides "python3-trio" currently. +# If somebody needs this please feel free to add python3-trio and enable the +# packageconfig below: +#PACKAGECONFIG ??= "" +#PACKAGECONFIG[trio] = ",,,python3-trio" + +RDEPENDS:${PN} += "\ + python3-idna \ + python3-sniffio \ + python3-core \ + python3-numbers \ + python3-io \ + python3-asyncio \ +" diff --git a/meta-python/recipes-devtools/python/python3-anyjson/0001-setup.py-Do-not-use-2to3.patch b/meta-python/recipes-devtools/python/python3-anyjson/0001-setup.py-Do-not-use-2to3.patch deleted file mode 100644 index 2b9e6e52e8..0000000000 --- a/meta-python/recipes-devtools/python/python3-anyjson/0001-setup.py-Do-not-use-2to3.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 4fb61d7c621599b0db9c2c45f4243f07936c5953 Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Wed, 13 Oct 2021 08:20:00 -0700 -Subject: [PATCH] setup.py: Do not use 2to3 - -This helps compiling with setuptools 0.58+ -and it seems to compile fine with python3 - -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- - setup.py | 2 -- - 1 file changed, 2 deletions(-) - -diff --git a/setup.py b/setup.py -index 9fe4902..f2098e1 100644 ---- a/setup.py -+++ b/setup.py -@@ -2,8 +2,6 @@ import os - import sys - - extra = {} --if sys.version_info >= (3, 0): -- extra.update(use_2to3=True) - - try: - from setuptools import setup, find_packages --- -2.33.0 - diff --git a/meta-python/recipes-devtools/python/python3-anyjson/run-ptest b/meta-python/recipes-devtools/python/python3-anyjson/run-ptest deleted file mode 100644 index b63c4de0d9..0000000000 --- a/meta-python/recipes-devtools/python/python3-anyjson/run-ptest +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' diff --git a/meta-python/recipes-devtools/python/python3-anyjson_0.3.3.bb b/meta-python/recipes-devtools/python/python3-anyjson_0.3.3.bb deleted file mode 100644 index 2b8abb8b80..0000000000 --- a/meta-python/recipes-devtools/python/python3-anyjson_0.3.3.bb +++ /dev/null @@ -1,28 +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://0001-setup.py-Do-not-use-2to3.patch \ - 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.6.1.bb b/meta-python/recipes-devtools/python/python3-apispec_6.6.1.bb new file mode 100644 index 0000000000..90d7ee271c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-apispec_6.6.1.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=a75956865b40c80a37c1e864716592b4" + +inherit pypi python_setuptools_build_meta + +SRC_URI[sha256sum] = "f5caa47cee75fe03b9c50b5594048b4c052eeca2c212e0dac12dbb6175d9a659" + +RDEPENDS:${PN} += "python3-packaging" diff --git a/meta-python/recipes-devtools/python/python3-appdirs/run-ptest b/meta-python/recipes-devtools/python/python3-appdirs/run-ptest index 5287f3e035..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-appdirs/run-ptest +++ b/meta-python/recipes-devtools/python/python3-appdirs/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest | sed -e 's/\[100%\]//g' | sed -e 's/\.\.F/: FAIL/g' | sed -e 's/\.\.\./: PASS/g' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-appdirs_1.4.4.bb b/meta-python/recipes-devtools/python/python3-appdirs_1.4.4.bb index 977999bfe5..ad07b3b082 100644 --- a/meta-python/recipes-devtools/python/python3-appdirs_1.4.4.bb +++ b/meta-python/recipes-devtools/python/python3-appdirs_1.4.4.bb @@ -12,10 +12,13 @@ SRC_URI[sha256sum] = "7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27 inherit pypi setuptools3 ptest RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { install -d ${D}${PTEST_PATH}/test cp -rf ${S}/test/* ${D}${PTEST_PATH}/test/ } + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-argcomplete_1.12.3.bb b/meta-python/recipes-devtools/python/python3-argcomplete_3.5.0.bb index aff0c97ec9..a5cf6298a4 100644 --- a/meta-python/recipes-devtools/python/python3-argcomplete_1.12.3.bb +++ b/meta-python/recipes-devtools/python/python3-argcomplete_3.5.0.bb @@ -3,15 +3,19 @@ HOMEPAGE = "https://github.com/kislyuk/argcomplete" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=2ee41112a44fe7014dce33e26468ba93" -SRC_URI[sha256sum] = "2c7dbffd8c045ea534921e63b0be6fe65e88599990d8dc408ac8c542b72a5445" +SRC_URI[sha256sum] = "4349400469dccfb7950bb60334a680c58d88699bff6159df61251878dc6bf74b" PYPI_PACKAGE = "argcomplete" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta + +DEPENDS += " \ + python3-setuptools-scm-native \ +" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-core \ - ${PYTHON_PN}-io \ + python3-core \ + python3-io \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-argh_0.26.2.bb b/meta-python/recipes-devtools/python/python3-argh_0.26.2.bb deleted file mode 100644 index d07ccbbf90..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.3.bb b/meta-python/recipes-devtools/python/python3-argh_0.31.3.bb new file mode 100644 index 0000000000..82b45d5aaa --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-argh_0.31.3.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] = "f30023d8be14ca5ee6b1b3eeab829151d7bbda464ae07dc4dd5347919c5892f9" + +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.2.bb b/meta-python/recipes-devtools/python/python3-arpeggio_2.0.2.bb index 468e6d5fde..3130e2cb96 100644 --- a/meta-python/recipes-devtools/python/python3-arpeggio_1.10.2.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] = "bfe349f252f82f82d84cb886f1d5081d1a31451e6045275e9f90b65d0daa06f1" +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 c052cb8c82..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/0001-Remove-tornado-6-test-constraint.-Ref-15.patch b/meta-python/recipes-devtools/python/python3-aspectlib/0001-Remove-tornado-6-test-constraint.-Ref-15.patch deleted file mode 100644 index 174f088e9e..0000000000 --- a/meta-python/recipes-devtools/python/python3-aspectlib/0001-Remove-tornado-6-test-constraint.-Ref-15.patch +++ /dev/null @@ -1,45 +0,0 @@ -From d3ae6ac951cc5bbce29b9c987741e0a557c9b777 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ionel=20Cristian=20M=C4=83rie=C8=99?= <contact@ionelmc.ro> -Date: Sun, 2 May 2021 09:50:43 +0300 -Subject: [PATCH] Remove tornado<6 test constraint. Ref #15. - -Upstream-Status: Backport [https://github.com/ionelmc/python-aspectlib/commit/7dccb198dfb426f529b81a28a755f3c02f8b50cb] -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- - tests/test_integrations_py3.py | 5 ++++- - tox.ini | 3 ++- - 2 files changed, 6 insertions(+), 2 deletions(-) - -diff --git a/tests/test_integrations_py3.py b/tests/test_integrations_py3.py -index e025eac..596589d 100644 ---- a/tests/test_integrations_py3.py -+++ b/tests/test_integrations_py3.py -@@ -36,7 +36,10 @@ def test_decorate_tornado_coroutine(): - @gen.coroutine - @debug.log(print_to=buf, module=False, stacktrace=2, result_repr=repr) - def coro(): -- yield gen.Task(loop.add_timeout, timedelta(microseconds=10)) -+ if hasattr(gen, 'Task'): -+ yield gen.Task(loop.add_timeout, timedelta(microseconds=10)) -+ else: -+ yield gen.sleep(0.01) - return "result" - - loop = ioloop.IOLoop.current() -diff --git a/tox.ini b/tox.ini -index 8c607de..08c31b3 100644 ---- a/tox.ini -+++ b/tox.ini -@@ -55,7 +55,8 @@ deps = - pytest-clarity - pytest-cov - pytest-travis-fold -- tornado<6.0 -+ six -+ tornado - commands = - {posargs:pytest --cov --cov-report=term-missing -vv --ignore=src} - --- -2.32.0 - diff --git a/meta-python/recipes-devtools/python/python3-aspectlib/run-ptest b/meta-python/recipes-devtools/python/python3-aspectlib/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-aspectlib/run-ptest +++ b/meta-python/recipes-devtools/python/python3-aspectlib/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-aspectlib_1.5.2.bb b/meta-python/recipes-devtools/python/python3-aspectlib_1.5.2.bb deleted file mode 100644 index 0cbeca21c7..0000000000 --- a/meta-python/recipes-devtools/python/python3-aspectlib_1.5.2.bb +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright (C) 2021 Khem Raj <raj.khem@gmail.com> -# Released under the MIT license (see COPYING.MIT for the terms) - -SUMMARY = "``aspectlib`` is an aspect-oriented programming, monkey-patch and decorators library. It is useful when changing" -HOMEPAGE = "https://github.com/ionelmc/python-aspectlib" -LICENSE = "BSD-2-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=d58b3f20fd10347a9458b8a03793b62e" - -SRC_URI[sha256sum] = "d275ec82c4c2712e564bb760e4accff8f061f648e38774feabeb8b241cf3a4aa" - -inherit ptest pypi setuptools3 - -SRC_URI += "file://run-ptest \ - file://0001-Remove-tornado-6-test-constraint.-Ref-15.patch \ - " - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/tests - cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ -} - -RDEPENDS:${PN}-ptest += "\ - python3-tornado \ - python3-process-tests \ -" - -RDEPENDS:${PN} += "python3-core python3-fields" - -BBCLASSEXTEND = "native nativesdk" 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-astroid_2.8.5.bb b/meta-python/recipes-devtools/python/python3-astroid_3.3.2.bb index f8f050cabc..e5f05bd0e9 100644 --- a/meta-python/recipes-devtools/python/python3-astroid_2.8.5.bb +++ b/meta-python/recipes-devtools/python/python3-astroid_3.3.2.bb @@ -1,14 +1,17 @@ SUMMARY = "An abstract syntax tree for Python with inference support." HOMEPAGE = "https://pypi.python.org/pypi/astroid" SECTION = "devel/python" -LICENSE = "LGPL-2.1" +LICENSE = "LGPL-2.1-only" LIC_FILES_CHKSUM = "file://LICENSE;md5=a70cf540abf41acb644ac3b621b2fad1" -SRC_URI[sha256sum] = "11f7356737b624c42e21e71fe85eea6875cb94c03c82ac76bd535a0ff10b0f25" +SRC_URI[sha256sum] = "99e9b5b602cbb005434084309213d6af32bf7a9b743c836749168b8e2b330cbd" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta -DEPENDS += "${PYTHON_PN}-pytest-runner-native" +DEPENDS += "\ + python3-pytest-runner-native \ + python3-wheel-native \ +" PACKAGES =+ "${PN}-tests" @@ -18,15 +21,17 @@ FILES:${PN}-tests += " \ " RDEPENDS:${PN}:class-target += "\ - ${PYTHON_PN}-distutils \ - ${PYTHON_PN}-lazy-object-proxy \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-wrapt \ - ${PYTHON_PN}-setuptools \ + python3-lazy-object-proxy \ + python3-logging \ + python3-six \ + python3-wrapt \ + python3-setuptools \ + python3-typing-extensions \ " RDEPENDS:${PN}-tests:class-target += "\ - ${PYTHON_PN}-unittest \ - ${PYTHON_PN}-xml \ + python3-unittest \ + python3-xml \ " + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-asttokens_2.0.5.bb b/meta-python/recipes-devtools/python/python3-asttokens_2.4.1.bb index 429a56bae6..dbb2fc0ebe 100644 --- a/meta-python/recipes-devtools/python/python3-asttokens_2.0.5.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] = "9a54c114f02c7a9480d56550932546a3f1fe71d8a02f1bc7ccd0ee3ee35cf4d5" +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_4.0.0.bb b/meta-python/recipes-devtools/python/python3-async-timeout_4.0.3.bb index ca61490fac..3d35780b65 100644 --- a/meta-python/recipes-devtools/python/python3-async-timeout_4.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-async-timeout_4.0.3.bb @@ -8,11 +8,11 @@ HOMEPAGE = "https://github.com/aio-libs/async-timeout" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=4fa41f15bb5f23b6d3560c5845eb8d57" -SRC_URI[sha256sum] = "7d87a4e8adba8ededb52e579ce6bc8276985888913620c935094c2276fd83382" +SRC_URI[sha256sum] = "4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f" PYPI_PACKAGE = "async-timeout" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta RDEPENDS:${PN} = "\ - ${PYTHON_PN}-asyncio \ + python3-asyncio \ " diff --git a/meta-python/recipes-devtools/python/python3-asyncinotify_4.0.9.bb b/meta-python/recipes-devtools/python/python3-asyncinotify_4.0.9.bb new file mode 100644 index 0000000000..0946dd2a33 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-asyncinotify_4.0.9.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] = "d0fc2c9af487b6ac2a3bd7db7b5139de54afcc3660720f80d7324b122a27c1c7" + +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 index 6f67d28651..01dfe51543 100644 --- a/meta-python/recipes-devtools/python/python3-asyncio-glib_0.1.bb +++ b/meta-python/recipes-devtools/python/python3-asyncio-glib_0.1.bb @@ -1,9 +1,10 @@ SUMMARY = "An implementation of the Python 3 asyncio event loop on top of GLib" -AUTHOR = "James Henstridge" -LICENSE = "LGPL-2.1" +LICENSE = "LGPL-2.1-only" LIC_FILES_CHKSUM = "file://COPYING.LGPL;md5=4fbd65380cdd255951079008b364516c" -inherit setuptools3 pypi +inherit setuptools3 pypi features_check + +REQUIRED_DISTRO_FEATURES = "gobject-introspection-data" SRC_URI[md5sum] = "60153055e76ceaacdfbaeafb03d61dd9" SRC_URI[sha256sum] = "fe3ceb2ba5f541330c07ca1bd7ae792468d625bad1acf5354a3a7a0b9fd87521" diff --git a/meta-python/recipes-devtools/python/python3-asyncio-throttle_1.0.2.bb b/meta-python/recipes-devtools/python/python3-asyncio-throttle_1.0.2.bb 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.11.1.bb b/meta-python/recipes-devtools/python/python3-autobahn_21.11.1.bb deleted file mode 100644 index 857862d31b..0000000000 --- a/meta-python/recipes-devtools/python/python3-autobahn_21.11.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] = "bd6f46315419ca0a5be4109f737410208ad5f19718f67ca6a4a674cc66ca9b18" - -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_24.4.2.bb b/meta-python/recipes-devtools/python/python3-autobahn_24.4.2.bb new file mode 100644 index 0000000000..d785a76cc7 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-autobahn_24.4.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=588502cb4ffc65da2b26780d6baa5a40" + +SRC_URI[sha256sum] = "a2d71ef1b0cf780b6d11f8b205fd2c7749765e65795f2ea7d823796642ee92c9" + +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.3.1.bb b/meta-python/recipes-devtools/python/python3-autoflake_2.3.1.bb new file mode 100644 index 0000000000..0a44d751fb --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-autoflake_2.3.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] = "c98b75dc5b0a86459c4f01a1d32ac7eb4338ec4317a4469515ff1e687ecd909e" + +inherit pypi python_hatchling + +RDEPENDS:${PN} += "python3-pyflakes" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-automat/0001-setup.py-remove-the-dependency-on-m2r.patch b/meta-python/recipes-devtools/python/python3-automat/0001-setup.py-remove-the-dependency-on-m2r.patch deleted file mode 100644 index b83b7f3808..0000000000 --- a/meta-python/recipes-devtools/python/python3-automat/0001-setup.py-remove-the-dependency-on-m2r.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 4fb6bbfbc53428fe5d38ec3e04bb4fd187b2fd45 Mon Sep 17 00:00:00 2001 -From: Derek Straka <derek@asterius.io> -Date: Fri, 22 Dec 2017 09:07:00 -0500 -Subject: [PATCH] setup.py: remove the dependency on m2r - -The dependency on m2r is removed here as it only provides the -long_description value that is optional. This item is just the -text that would be present on PyPi, so it doesn't provide much -value in this case - -Upstream-Status: Inappropriate (OE specific) - -Signed-off-by: Derek Straka <derek@asterius.io> -Signed-off-by: Leon Anavi <leon.anavi@konsulko.com> ---- - setup.py | 10 ---------- - 1 file changed, 10 deletions(-) - -diff --git a/setup.py b/setup.py -index 3fb7fdb..245d69a 100644 ---- a/setup.py -+++ b/setup.py -@@ -4,14 +4,6 @@ Setup file for automat - - from setuptools import setup, find_packages - --try: -- from m2r import parse_from_file -- long_description = parse_from_file('README.md') --except(IOError, ImportError): -- print("\n\n!!! m2r not found, long_description is bad, don't upload this to PyPI !!!\n\n") -- import io -- long_description = io.open('README.md', encoding="utf-8").read() -- - setup( - name='Automat', - use_scm_version=True, -@@ -19,12 +11,10 @@ setup( - description=""" - Self-service finite-state machines for the programmer on the go. - """.strip(), -- long_description=long_description, - packages=find_packages(exclude=[]), - package_dir={'automat': 'automat'}, - setup_requires=[ - 'setuptools-scm', -- 'm2r', - ], - install_requires=[ - "attrs>=19.2.0", --- -2.17.1 - diff --git a/meta-python/recipes-devtools/python/python3-automat_20.2.0.bb b/meta-python/recipes-devtools/python/python3-automat_20.2.0.bb deleted file mode 100644 index dbba97e76d..0000000000 --- a/meta-python/recipes-devtools/python/python3-automat_20.2.0.bb +++ /dev/null @@ -1,21 +0,0 @@ -DESCRIPTION = "Self-service finite-state machines for the programmer on the go" -HOMEPAGE = "https://github.com/glyph/Automat" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=4ad213bcca81688e94593e5f60c87477" - -SRC_URI[md5sum] = "d6cef9886b037b8857bfbc686f3ae30a" -SRC_URI[sha256sum] = "7979803c74610e11ef0c0d68a2942b152df52da55336e0c9d58daf1831cbdf33" - -DEPENDS += "${PYTHON_PN}-setuptools-scm-native" - -SRC_URI:append = " \ - file://0001-setup.py-remove-the-dependency-on-m2r.patch \ -" - -PYPI_PACKAGE = "Automat" -inherit pypi setuptools3 - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-attrs \ - ${PYTHON_PN}-six \ -" diff --git a/meta-python/recipes-devtools/python/python3-automat_24.8.1.bb b/meta-python/recipes-devtools/python/python3-automat_24.8.1.bb new file mode 100644 index 0000000000..e2a31bea1e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-automat_24.8.1.bb @@ -0,0 +1,11 @@ +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] = "b34227cf63f6325b8ad2399ede780675083e439b20c323d376373d8ee6306d88" + +DEPENDS += "python3-setuptools-scm-native" + +inherit pypi python_setuptools_build_meta + diff --git a/meta-python/recipes-devtools/python/python3-awesomeversion_24.6.0.bb b/meta-python/recipes-devtools/python/python3-awesomeversion_24.6.0.bb new file mode 100644 index 0000000000..8bb5ddd54e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-awesomeversion_24.6.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] = "aee7ccbaed6f8d84e0f0364080c7734a0166d77ea6ccfcc4900b38917f1efc71" + +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 27f37fec4c..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 @@ -6,10 +6,14 @@ 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" @@ -23,15 +27,15 @@ do_install:append() { PACKAGES =+ "${PN}-examples" RDEPENDS:${PN} += " \ - ${PYTHON_PN}-crypt \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-math \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-threading \ + python3-crypt \ + python3-datetime \ + python3-io \ + python3-json \ + python3-logging \ + python3-math \ + python3-netclient \ + python3-numbers \ + python3-threading \ " RDEPENDS:${PN}-examples += "${PN}" diff --git a/meta-python/recipes-devtools/python/python3-babel_2.9.1.bb b/meta-python/recipes-devtools/python/python3-babel_2.9.1.bb deleted file mode 100644 index 11c8d60105..0000000000 --- a/meta-python/recipes-devtools/python/python3-babel_2.9.1.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=05fb707293a85504aa67afc8ea34d747" - -SRC_URI[sha256sum] = "bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0" - -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 392c044bfc..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.1.bb b/meta-python/recipes-devtools/python/python3-bandit_1.7.1.bb deleted file mode 100644 index ad6df1be44..0000000000 --- a/meta-python/recipes-devtools/python/python3-bandit_1.7.1.bb +++ /dev/null @@ -1,13 +0,0 @@ -SUMMARY = "Security oriented static analyser for python code." -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=1dece7821bf3fd70fe1309eaa37d52a2" - -SRC_URI[sha256sum] = "a81b00b5436e6880fa8ad6799bc830e02032047713cbb143a12939ac67eb756c" - -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.9.bb b/meta-python/recipes-devtools/python/python3-bandit_1.7.9.bb new file mode 100644 index 0000000000..730bf116ae --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-bandit_1.7.9.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] = "7c395a436743018f7be0a4cbb0a4ea9b902b6d87264ddecf8cfdc73b4f78ff61" + +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 a6d5007069..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.10.0.bb b/meta-python/recipes-devtools/python/python3-beautifulsoup4_4.10.0.bb deleted file mode 100644 index ba89e9db33..0000000000 --- a/meta-python/recipes-devtools/python/python3-beautifulsoup4_4.10.0.bb +++ /dev/null @@ -1,18 +0,0 @@ -SUMMARY = "Screen-scraping library" -HOMEPAGE = " https://www.crummy.com/software/BeautifulSoup/bs4" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://COPYING.txt;md5=f2d38d8a40bf73fd4b3d16ca2e5882d1" - -SRC_URI[sha256sum] = "c23ad23c521d818955a4151a67d81580319d4bf548d3d49f4223ae041ff98891" - -inherit pypi setuptools3 - -RDEPENDS:${PN} = "\ - ${PYTHON_PN}-html5lib \ - ${PYTHON_PN}-lxml \ - ${PYTHON_PN}-soupsieve \ - ${PYTHON_PN}-html \ - ${PYTHON_PN}-logging \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-beautifulsoup4_4.12.3.bb b/meta-python/recipes-devtools/python/python3-beautifulsoup4_4.12.3.bb new file mode 100644 index 0000000000..14dedba922 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-beautifulsoup4_4.12.3.bb @@ -0,0 +1,18 @@ +SUMMARY = "Screen-scraping library" +HOMEPAGE = " https://www.crummy.com/software/BeautifulSoup/bs4" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=96e0034f7c9443910c486773aa1ed9ac" + +SRC_URI[sha256sum] = "74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051" + +inherit pypi python_hatchling + +RDEPENDS:${PN} = "\ + python3-html5lib \ + python3-lxml \ + python3-soupsieve \ + python3-html \ + python3-logging \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-behave_1.2.6.bb b/meta-python/recipes-devtools/python/python3-behave_1.2.6.bb index 1dcc7d218e..da4f3047f9 100644 --- a/meta-python/recipes-devtools/python/python3-behave_1.2.6.bb +++ b/meta-python/recipes-devtools/python/python3-behave_1.2.6.bb @@ -12,7 +12,7 @@ S = "${WORKDIR}/git" inherit setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-parse-type \ - ${PYTHON_PN}-setuptools \ - ${PYTHON_PN}-six \ + python3-parse-type \ + python3-setuptools \ + python3-six \ " diff --git a/meta-python/recipes-devtools/python/python3-betamax/0001-Drop-ptests-fixtures-and-recorde_modes.patch b/meta-python/recipes-devtools/python/python3-betamax/0001-Drop-ptests-fixtures-and-recorde_modes.patch new file mode 100644 index 0000000000..52745a9373 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-betamax/0001-Drop-ptests-fixtures-and-recorde_modes.patch @@ -0,0 +1,343 @@ +From e5aa66b1af2d49f159c4daefc598f96744ee988d Mon Sep 17 00:00:00 2001 +From: Zhixiong Chi <zhixiong.chi@windriver.com> +Date: Thu, 29 Feb 2024 12:31:58 -0800 +Subject: [PATCH] [PATCH] Drop ptests fixtures and recorde_modes + +The usage of fixture in test_fixtures has been deprecated. +See https://docs.pytest.org/en/stable/explanation/fixtures.html and +https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly +for more information about fixtures. +Meanwhile the test_record_modes relies on httpbin.org which has been sold and +re-sold several times, and it adds X-Amzn-Trace-Id header that can possibly +diff for each request. +It leads to ptest failure, so drop it now until we find the solution. + +Upstream-Status: Inappropriate [OE-Specific] + +Signed-off-by: Zhixiong Chi <zhixiong.chi@windriver.com> +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + tests/integration/test_fixtures.py | 60 ----------- + tests/integration/test_record_modes.py | 141 ------------------------- + tests/unit/test_fixtures.py | 94 ----------------- + 3 files changed, 295 deletions(-) + delete mode 100644 tests/integration/test_fixtures.py + delete mode 100644 tests/integration/test_record_modes.py + delete mode 100644 tests/unit/test_fixtures.py + +diff --git a/tests/integration/test_fixtures.py b/tests/integration/test_fixtures.py +deleted file mode 100644 +index fc3d1e7..0000000 +--- a/tests/integration/test_fixtures.py ++++ /dev/null +@@ -1,60 +0,0 @@ +-import os.path +- +-import pytest +- +- +-@pytest.mark.usefixtures('betamax_session') +-class TestPyTestFixtures: +- @pytest.fixture(autouse=True) +- def setup(self, request): +- """After test hook to assert everything.""" +- def finalizer(): +- test_dir = os.path.abspath('.') +- cassette_name = ('tests.integration.test_fixtures.' # Module name +- 'TestPyTestFixtures.' # Class name +- 'test_pytest_fixture' # Test function name +- '.json') +- file_name = os.path.join(test_dir, 'tests', 'cassettes', +- cassette_name) +- assert os.path.exists(file_name) is True +- +- request.addfinalizer(finalizer) +- +- def test_pytest_fixture(self, betamax_session): +- """Exercise the fixture itself.""" +- resp = betamax_session.get('https://httpbin.org/get') +- assert resp.ok +- +- +-@pytest.mark.usefixtures('betamax_parametrized_session') +-class TestPyTestParametrizedFixtures: +- @pytest.fixture(autouse=True) +- def setup(self, request): +- """After test hook to assert everything.""" +- def finalizer(): +- test_dir = os.path.abspath('.') +- cassette_name = ('tests.integration.test_fixtures.' # Module name +- 'TestPyTestParametrizedFixtures.' # Class name +- 'test_pytest_fixture' # Test function name +- '[https---httpbin.org-get]' # Parameter +- '.json') +- file_name = os.path.join(test_dir, 'tests', 'cassettes', +- cassette_name) +- assert os.path.exists(file_name) is True +- +- request.addfinalizer(finalizer) +- +- @pytest.mark.parametrize('url', ('https://httpbin.org/get',)) +- def test_pytest_fixture(self, betamax_parametrized_session, url): +- """Exercise the fixture itself.""" +- resp = betamax_parametrized_session.get(url) +- assert resp.ok +- +- +-@pytest.mark.parametrize('problematic_arg', [r'aaa\bbb', 'ccc:ddd', 'eee*fff']) +-def test_pytest_parametrize_with_filesystem_problematic_chars( +- betamax_parametrized_session, problematic_arg): +- """ +- Exercice parametrized args containing characters which might cause +- problems when getting translated into file names. """ +- assert True +diff --git a/tests/integration/test_record_modes.py b/tests/integration/test_record_modes.py +deleted file mode 100644 +index 988b851..0000000 +--- a/tests/integration/test_record_modes.py ++++ /dev/null +@@ -1,141 +0,0 @@ +-import re +- +-from betamax import Betamax, BetamaxError +- +-from tests.integration.helper import IntegrationHelper +- +- +-class TestRecordOnce(IntegrationHelper): +- def test_records_new_interaction(self): +- s = self.session +- with Betamax(s).use_cassette('test_record_once') as betamax: +- self.cassette_path = betamax.current_cassette.cassette_path +- assert betamax.current_cassette.is_empty() is True +- r = s.get('http://httpbin.org/get') +- assert r.status_code == 200 +- assert betamax.current_cassette.is_empty() is True +- assert betamax.current_cassette.interactions != [] +- +- def test_replays_response_from_cassette(self): +- s = self.session +- with Betamax(s).use_cassette('test_replays_response') as betamax: +- self.cassette_path = betamax.current_cassette.cassette_path +- assert betamax.current_cassette.is_empty() is True +- r0 = s.get('http://httpbin.org/get') +- assert r0.status_code == 200 +- assert betamax.current_cassette.interactions != [] +- assert len(betamax.current_cassette.interactions) == 1 +- r1 = s.get('http://httpbin.org/get') +- assert len(betamax.current_cassette.interactions) == 2 +- assert r1.status_code == 200 +- r0_headers = r0.headers.copy() +- r0_headers.pop('Date') +- r0_headers.pop('Age', None) +- r0_headers.pop('X-Processed-Time', None) +- r1_headers = r1.headers.copy() +- r1_headers.pop('Date') +- r1_headers.pop('Age', None) +- r1_headers.pop('X-Processed-Time', None) +- # NOTE(sigmavirus24): This fails if the second request is +- # technically a second later. Ignoring the Date headers allows +- # this test to succeed. +- # NOTE(hroncok): httpbin.org added X-Processed-Time header that +- # can possibly differ (and often does) +- r0_content = r0.content.decode(encoding='utf-8', errors='strict') +- r1_content = r1.content.decode(encoding='utf-8', errors='strict') +- r0_content = re.sub('"X-Amzn-Trace-Id": "[^"]+"', '"X-Amzn-Trace-Id": ""', r0_content) +- r1_content = re.sub('"X-Amzn-Trace-Id": "[^"]+"', '"X-Amzn-Trace-Id": ""', r1_content) +- # NOTE(jhatler): httpbin.org added "X-Amzn-Trace-Id" to their +- # response, which is a unique ID that will differ between requests. +- # We remove it from the response body before comparing. +- assert r0_headers == r1_headers +- assert r0_content == r1_content +- +- +-class TestRecordNone(IntegrationHelper): +- def test_raises_exception_when_no_interactions_present(self): +- s = self.session +- with Betamax(s) as betamax: +- betamax.use_cassette('test', record='none') +- self.cassette_created = False +- assert betamax.current_cassette is not None +- self.assertRaises(BetamaxError, s.get, 'http://httpbin.org/get') +- +- def test_record_none_does_not_create_cassettes(self): +- s = self.session +- with Betamax(s) as betamax: +- self.assertRaises(ValueError, betamax.use_cassette, +- 'test_record_none', record='none') +- self.cassette_created = False +- +- +-class TestRecordNewEpisodes(IntegrationHelper): +- def setUp(self): +- super(TestRecordNewEpisodes, self).setUp() +- with Betamax(self.session).use_cassette('test_record_new'): +- self.session.get('http://httpbin.org/get') +- self.session.get('http://httpbin.org/redirect/2') +- +- def test_records_new_events_with_existing_cassette(self): +- s = self.session +- opts = {'record': 'new_episodes'} +- with Betamax(s).use_cassette('test_record_new', **opts) as betamax: +- cassette = betamax.current_cassette +- self.cassette_path = cassette.cassette_path +- assert cassette.interactions != [] +- assert len(cassette.interactions) == 4 +- assert cassette.is_empty() is False +- s.get('https://httpbin.org/get') +- assert len(cassette.interactions) == 5 +- +- with Betamax(s).use_cassette('test_record_new') as betamax: +- cassette = betamax.current_cassette +- assert len(cassette.interactions) == 5 +- r = s.get('https://httpbin.org/get') +- assert r.status_code == 200 +- +- +-class TestRecordNewEpisodesCreatesCassettes(IntegrationHelper): +- def test_creates_new_cassettes(self): +- recorder = Betamax(self.session) +- opts = {'record': 'new_episodes'} +- cassette_name = 'test_record_new_makes_new_cassettes' +- with recorder.use_cassette(cassette_name, **opts) as betamax: +- self.cassette_path = betamax.current_cassette.cassette_path +- self.session.get('https://httpbin.org/get') +- +- +-class TestRecordAll(IntegrationHelper): +- def setUp(self): +- super(TestRecordAll, self).setUp() +- with Betamax(self.session).use_cassette('test_record_all'): +- self.session.get('http://httpbin.org/get') +- self.session.get('http://httpbin.org/redirect/2') +- self.session.get('http://httpbin.org/get') +- +- def test_records_new_interactions(self): +- s = self.session +- opts = {'record': 'all'} +- with Betamax(s).use_cassette('test_record_all', **opts) as betamax: +- cassette = betamax.current_cassette +- self.cassette_path = cassette.cassette_path +- assert cassette.interactions != [] +- assert len(cassette.interactions) == 5 +- assert cassette.is_empty() is False +- s.post('http://httpbin.org/post', data={'foo': 'bar'}) +- assert len(cassette.interactions) == 6 +- +- with Betamax(s).use_cassette('test_record_all') as betamax: +- assert len(betamax.current_cassette.interactions) == 6 +- +- def test_replaces_old_interactions(self): +- s = self.session +- opts = {'record': 'all'} +- with Betamax(s).use_cassette('test_record_all', **opts) as betamax: +- cassette = betamax.current_cassette +- self.cassette_path = cassette.cassette_path +- assert cassette.interactions != [] +- assert len(cassette.interactions) == 5 +- assert cassette.is_empty() is False +- s.get('http://httpbin.org/get') +- assert len(cassette.interactions) == 5 +diff --git a/tests/unit/test_fixtures.py b/tests/unit/test_fixtures.py +deleted file mode 100644 +index 41f33eb..0000000 +--- a/tests/unit/test_fixtures.py ++++ /dev/null +@@ -1,94 +0,0 @@ +-try: +- import unittest.mock as mock +-except ImportError: +- import mock +- +-import pytest +-import unittest +- +-import requests +- +-import betamax +-from betamax.fixtures import pytest as pytest_fixture +-from betamax.fixtures import unittest as unittest_fixture +- +- +-class TestPyTestFixture(unittest.TestCase): +- def setUp(self): +- self.mocked_betamax = mock.MagicMock() +- self.patched_betamax = mock.patch.object( +- betamax.recorder, 'Betamax', return_value=self.mocked_betamax) +- self.patched_betamax.start() +- +- def tearDown(self): +- self.patched_betamax.stop() +- +- def test_adds_stop_as_a_finalizer(self): +- # Mock a pytest request object +- request = mock.MagicMock() +- request.cls = request.module = None +- request.node.name = request.function.__name__ = 'test' +- +- pytest_fixture._betamax_recorder(request) +- assert request.addfinalizer.called is True +- request.addfinalizer.assert_called_once_with(self.mocked_betamax.stop) +- +- def test_auto_starts_the_recorder(self): +- # Mock a pytest request object +- request = mock.MagicMock() +- request.cls = request.module = None +- request.node.name = request.function.__name__ = 'test' +- +- pytest_fixture._betamax_recorder(request) +- self.mocked_betamax.start.assert_called_once_with() +- +- +-class FakeBetamaxTestCase(unittest_fixture.BetamaxTestCase): +- def test_fake(self): +- pass +- +- +-class TestUnittestFixture(unittest.TestCase): +- def setUp(self): +- self.mocked_betamax = mock.MagicMock() +- self.patched_betamax = mock.patch.object( +- betamax.recorder, 'Betamax', return_value=self.mocked_betamax) +- self.betamax = self.patched_betamax.start() +- self.fixture = FakeBetamaxTestCase(methodName='test_fake') +- +- def tearDown(self): +- self.patched_betamax.stop() +- +- def test_setUp(self): +- self.fixture.setUp() +- +- self.mocked_betamax.use_cassette.assert_called_once_with( +- 'FakeBetamaxTestCase.test_fake' +- ) +- self.mocked_betamax.start.assert_called_once_with() +- +- def test_setUp_rejects_arbitrary_session_classes(self): +- self.fixture.SESSION_CLASS = object +- +- with pytest.raises(AssertionError): +- self.fixture.setUp() +- +- def test_setUp_accepts_session_subclasses(self): +- class TestSession(requests.Session): +- pass +- +- self.fixture.SESSION_CLASS = TestSession +- +- self.fixture.setUp() +- +- assert self.betamax.called is True +- call_kwargs = self.betamax.call_args[-1] +- assert isinstance(call_kwargs['session'], TestSession) +- +- def test_tearDown_calls_stop(self): +- recorder = mock.Mock() +- self.fixture.recorder = recorder +- +- self.fixture.tearDown() +- +- recorder.stop.assert_called_once_with() +-- +2.44.0 + diff --git a/meta-python/recipes-devtools/python/python3-betamax/run-ptest b/meta-python/recipes-devtools/python/python3-betamax/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-betamax/run-ptest +++ b/meta-python/recipes-devtools/python/python3-betamax/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-betamax_0.8.1.bb b/meta-python/recipes-devtools/python/python3-betamax_0.9.0.bb index 2caeb5afa2..a0454686ee 100644 --- a/meta-python/recipes-devtools/python/python3-betamax_0.8.1.bb +++ b/meta-python/recipes-devtools/python/python3-betamax_0.9.0.bb @@ -5,16 +5,20 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=61c15f0c146c5fb1a8ce8ba2f310d73c" SRC_URI += " \ file://run-ptest \ + file://0001-Drop-ptests-fixtures-and-recorde_modes.patch \ " - -SRC_URI[md5sum] = "b8182d43a200fc126a3bf7555626f964" -SRC_URI[sha256sum] = "5bf004ceffccae881213fb722f34517166b84a34919b92ffc14d1dbd050b71c2" +SRC_URI[sha256sum] = "82316e1679bc6879e3c83318d016b54b7c9225ff08c4462de4813e22038d5f94" inherit pypi setuptools3 ptest +RDEPENDS:${PN} += " \ + python3-requests \ + python3-unittest \ +" + RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-requests \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-bidict_0.21.4.bb b/meta-python/recipes-devtools/python/python3-bidict_0.23.1.bb index 266dc606a2..cd9e365ff7 100644 --- a/meta-python/recipes-devtools/python/python3-bidict_0.21.4.bb +++ b/meta-python/recipes-devtools/python/python3-bidict_0.23.1.bb @@ -2,10 +2,10 @@ 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=9741c346eef56131163e13b9db1241b3" +LIC_FILES_CHKSUM = "file://LICENSE;md5=e907308cc9356afa99ac0eec6b20211b" -SRC_URI[sha256sum] = "42c84ffbe6f8de898af6073b4be9ea7ccedcd78d3474aa844c54e49d5a079f6f" +SRC_URI[sha256sum] = "03069d763bc387bbd20e7d49914e75fc4132a41937fa3405417e1a5a2d006d71" -inherit pypi setuptools3 +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_2.3.4.bb b/meta-python/recipes-devtools/python/python3-bitarray_2.3.4.bb deleted file mode 100644 index 5a674f0097..0000000000 --- a/meta-python/recipes-devtools/python/python3-bitarray_2.3.4.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] = "f19c62425576d3d1821ed711b94d1a4e5ede8f05ca121e99b6d978ed49c7a765" - -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.9.bb b/meta-python/recipes-devtools/python/python3-bitstring_3.1.9.bb deleted file mode 100644 index 94dbae2afc..0000000000 --- a/meta-python/recipes-devtools/python/python3-bitstring_3.1.9.bb +++ /dev/null @@ -1,19 +0,0 @@ -SUMMARY = "Simple construction, analysis and modification of binary data." -HOMEPAGE = "https://github.com/scott-griffiths/bitstring" -AUTHOR = "Scott Griffiths <dr.scottgriffiths@gmail.com>" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=f7f2fd3f1cd52b5ccd39d76fb3568d3f" - -SRC_URI[sha256sum] = "a5848a3f63111785224dca8bb4c0a75b62ecdef56a042c8d6be74b16f7e860e7" - -PYPI_PACKAGE = "bitstring" - -inherit pypi setuptools3 - -RDEPENDS:${PN} = "\ - ${PYTHON_PN}-core \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-mmap \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-bitstring_4.2.3.bb b/meta-python/recipes-devtools/python/python3-bitstring_4.2.3.bb new file mode 100644 index 0000000000..4d86ce7df8 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-bitstring_4.2.3.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] = "e0c447af3fda0d114f77b88c2d199f02f97ee7e957e6d719f40f41cf15fbb897" + +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.12.1.bb b/meta-python/recipes-devtools/python/python3-bitstruct_8.19.0.bb index f53f84f83e..bdf77c7d01 100644 --- a/meta-python/recipes-devtools/python/python3-bitstruct_8.12.1.bb +++ b/meta-python/recipes-devtools/python/python3-bitstruct_8.19.0.bb @@ -3,11 +3,9 @@ HOMEPAGE = "https://github.com/eerimoq/bitstruct" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=d9aa4ec07de78abae21c490c9ffe61bd" -SRC_URI[sha256sum] = "45b2b932ce6681f5c6ce8cba39abdd423b579b0568c76fa48b1e09c88368ede7" +SRC_URI[sha256sum] = "d75ba9dded85c17e885a209a00eb8e248ee40762149f2f2a79360ca857467dac" -PYPI_PACKAGE = "bitstruct" - -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta CLEANBROKEN = "1" 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.22.2.bb b/meta-python/recipes-devtools/python/python3-bleak_0.22.2.bb new file mode 100644 index 0000000000..bb1d7c2b13 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-bleak_0.22.2.bb @@ -0,0 +1,32 @@ +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 = "c746071a3fcc3b5e69db6d6b23445ec3505d7730" +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.8) \ + 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 397fdcfb05..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..542c8640d7 --- /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 python_setuptools_build_meta + +RDEPENDS:${PN} += " \ + python3-cffi \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-cachecontrol_0.12.9.bb b/meta-python/recipes-devtools/python/python3-cachecontrol_0.14.0.bb index 2b2b72d555..1e374529cc 100644 --- a/meta-python/recipes-devtools/python/python3-cachecontrol_0.12.9.bb +++ b/meta-python/recipes-devtools/python/python3-cachecontrol_0.14.0.bb @@ -1,15 +1,14 @@ SUMMARY = "httplib2 caching for requests" HOMEPAGE = "https://pypi.org/project/CacheControl/" LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=12;endline=12;md5=62d6ee40749ec0b76d8a1200a1562369" +LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=12;endline=12;md5=e2fd6ddcf506e08972d5ba4b93c0022e" -# On PyPi, this is "CacheControl", rather than "cachecontrol", so we need to -# override PYPI_PACKAGE so fetch succeeds. -PYPI_PACKAGE = "CacheControl" +SRC_URI[sha256sum] = "7db1195b41c81f8274a7bbd97c956f44e8348265a1bc7641c37dfebc39f0c938" -SRC_URI[sha256sum] = "b5d0c98f7ee9f02e2d5a85af98b9a76c0a2c73c972c142291f823a0ed2eb7a78" +inherit pypi python_poetry_core -inherit pypi setuptools3 +UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/CacheControl/" +UPSTREAM_CHECK_REGEX = "/CacheControl/(?P<pver>(\d+[\.\-_]*)+)" RDEPENDS:${PN} += "\ python3-crypt \ diff --git a/meta-python/recipes-devtools/python/python3-cachetools/run-ptest b/meta-python/recipes-devtools/python/python3-cachetools/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-cachetools/run-ptest +++ b/meta-python/recipes-devtools/python/python3-cachetools/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-cachetools_4.2.4.bb b/meta-python/recipes-devtools/python/python3-cachetools_5.5.0.bb index 1040dc7e5a..00e208f9cf 100644 --- a/meta-python/recipes-devtools/python/python3-cachetools_4.2.4.bb +++ b/meta-python/recipes-devtools/python/python3-cachetools_5.5.0.bb @@ -6,20 +6,21 @@ Python 3 Standard Library @lru_cache function decorator." SECTION = "devel/python" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=439a07e400525964c3c82684146e46eb" +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 \ + python3-math \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { @@ -27,6 +28,6 @@ do_install_ptest() { cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ } -SRC_URI[sha256sum] = "89ea6f1b638d5a73a4f9226be57ac5e4f399d22770b92355f92dcb0f7f001693" +SRC_URI[sha256sum] = "2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-can_3.3.4.bb b/meta-python/recipes-devtools/python/python3-can_3.3.4.bb deleted file mode 100644 index 760b5dde9c..0000000000 --- a/meta-python/recipes-devtools/python/python3-can_3.3.4.bb +++ /dev/null @@ -1,27 +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] = "305075968c56bd85130b19d86e9e505d" -SRC_URI[sha256sum] = "2d3c223b7adc4dd46ce258d4a33b7e0dbb6c339e002faa40ee4a69d5fdce9449" - -PYPI_PACKAGE="python-can" - -inherit pypi setuptools3 - -RDEPENDS:${PN}:class-target += "\ - ${PYTHON_PN}-aenum \ - ${PYTHON_PN}-ctypes \ - ${PYTHON_PN}-codecs \ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-fcntl \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-misc \ - ${PYTHON_PN}-netserver \ - ${PYTHON_PN}-sqlite3 \ - ${PYTHON_PN}-wrapt \ - ${PYTHON_PN}-pkg-resources \ -" - -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..b0d87f4e37 --- /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 python_setuptools_build_meta + +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.5.0.bb b/meta-python/recipes-devtools/python/python3-cantools_36.5.0.bb deleted file mode 100644 index 6fbad3fdf4..0000000000 --- a/meta-python/recipes-devtools/python/python3-cantools_36.5.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] = "651b6ea67999c1106a582fd54c92b5b27a1a5f2896e0058beeb96a4f318cb33f" - -PYPI_PACKAGE = "cantools" - -inherit pypi setuptools3 - -CLEANBROKEN = "1" - diff --git a/meta-python/recipes-devtools/python/python3-cantools_39.4.5.bb b/meta-python/recipes-devtools/python/python3-cantools_39.4.5.bb new file mode 100644 index 0000000000..f4f16c1550 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-cantools_39.4.5.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] = "594f2ae80deadb8c6b08e8e1322d42e258f40d42c80d6886d84e0143f90b5a23" + +PYPI_PACKAGE = "cantools" + +inherit pypi python_poetry_core + +DEPENDS += "python3-setuptools-scm-native" + +RDEPENDS:${PN} += "\ + python3-can \ + python3-bitstruct \ + python3-core \ + python3-textparser \ + python3-typing-extensions \ + python3-diskcache \ + python3-asyncio \ +" + +CLEANBROKEN = "1" diff --git a/meta-python/recipes-devtools/python/python3-cassandra-driver_3.25.0.bb b/meta-python/recipes-devtools/python/python3-cassandra-driver_3.29.1.bb index cf27f7f476..3003e84acf 100644 --- a/meta-python/recipes-devtools/python/python3-cassandra-driver_3.25.0.bb +++ b/meta-python/recipes-devtools/python/python3-cassandra-driver_3.29.1.bb @@ -8,21 +8,21 @@ LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=2ee41112a44fe7014dce33e26468ba93" SRCNAME = "cassandra-driver" -SRC_URI[sha256sum] = "8ad7d7c090eb1cac6110b3bfc1fd2d334ac62f415aac09350ebb8d241b7aa7ee" +SRC_URI[sha256sum] = "38e9c2a2f2a9664bb03f1f852d5fccaeff2163942b5db35dffcf8bf32a51cfe5" inherit pypi setuptools3 RDEPENDS:${PN} += "\ - ${PYTHON_PN}-cython \ - ${PYTHON_PN}-geomet \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-misc \ - ${PYTHON_PN}-multiprocessing \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-six \ + python3-cython \ + python3-geomet \ + python3-json \ + python3-misc \ + python3-multiprocessing \ + python3-numbers \ + python3-six \ libevent \ " DEPENDS += "\ - ${PYTHON_PN}-cython \ + python3-cython \ " diff --git a/meta-python/recipes-devtools/python/python3-casttube_0.2.1.bb b/meta-python/recipes-devtools/python/python3-casttube_0.2.1.bb new file mode 100644 index 0000000000..af3daf016e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-casttube_0.2.1.bb @@ -0,0 +1,16 @@ +SUMMARY = "YouTube Chromecast API" +HOMEPAGE = "https://github.com/ur1katz/casttube" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=d3aafde5479a4102b867156e2527a34e" + +SRC_URI[sha256sum] = "54d2af8c7949aa9c5db87fb11ef0a478a5d3e7ac6d2d2ac8dd1711e3a516fc82" + +inherit pypi setuptools3 + +FILES:${PN} += "\ + /usr/LICENSE \ +" + +RDEPENDS:${PN} = "\ + python3-requests \ +" diff --git a/meta-python/recipes-devtools/python/python3-cbor2/run-ptest b/meta-python/recipes-devtools/python/python3-cbor2/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-cbor2/run-ptest +++ b/meta-python/recipes-devtools/python/python3-cbor2/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-cbor2_5.4.2.bb b/meta-python/recipes-devtools/python/python3-cbor2_5.4.2.bb deleted file mode 100644 index d3f6cd8c16..0000000000 --- a/meta-python/recipes-devtools/python/python3-cbor2_5.4.2.bb +++ /dev/null @@ -1,29 +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] = "e283e70b55a049ff364cc5e648fde587e4d9b0e87e4b2664c69e639135e6b3b8" - -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.4.bb b/meta-python/recipes-devtools/python/python3-cbor2_5.6.4.bb new file mode 100644 index 0000000000..37c3ab6478 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-cbor2_5.6.4.bb @@ -0,0 +1,28 @@ +DESCRIPTION = "An implementation of RFC 7049 - Concise Binary Object Representation (CBOR)." +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=a79e64179819c7ce293372c059f1dbd8" +DEPENDS += "python3-setuptools-scm-native" + +SRC_URI[sha256sum] = "1c533c50dde86bef1c6950602054a0ffa3c376e8b0e20c7b8f5b108793f6983e" +SRC_URI += " \ + file://run-ptest \ +" + +inherit pypi python_setuptools_build_meta ptest + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} + +RDEPENDS:${PN}-ptest += " \ + python3-hypothesis \ + python3-pytest \ + python3-unittest-automake-output \ + python3-unixadmin \ +" +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 index 8fa9797768..3d9194c219 100644 --- a/meta-python/recipes-devtools/python/python3-cchardet_2.1.7.bb +++ b/meta-python/recipes-devtools/python/python3-cchardet_2.1.7.bb @@ -1,6 +1,6 @@ SUMMARY = "Universal character encoding detector" HOMEPAGE = "https://github.com/PyYoshi/cChardet" -LICENSE = "MPLv1.1" +LICENSE = "MPL-1.1" LIC_FILES_CHKSUM = "file://COPYING;md5=6ecda54f6f525388d71d6b3cd92f7474" SRC_URI[sha256sum] = "c428b6336545053c2589f6caf24ea32276c6664cb86db817e03a94c60afa0eaf" @@ -8,3 +8,5 @@ SRC_URI[sha256sum] = "c428b6336545053c2589f6caf24ea32276c6664cb86db817e03a94c60a inherit pypi setuptools3 BBCLASSEXTEND = "native nativesdk" + +DEPENDS += "python3-cython-native" diff --git a/meta-python/recipes-devtools/python/python3-cerberus_1.3.4.bb b/meta-python/recipes-devtools/python/python3-cerberus_1.3.5.bb index f9f8853495..eb3453aeef 100644 --- a/meta-python/recipes-devtools/python/python3-cerberus_1.3.4.bb +++ b/meta-python/recipes-devtools/python/python3-cerberus_1.3.5.bb @@ -4,10 +4,8 @@ SECTION = "devel/python" LICENSE = "ISC" LIC_FILES_CHKSUM = "file://LICENSE;md5=48f8e9432d0dac5e0e7a18211a0bacdb" -RDEPENDS:${PN} += "python3-setuptools" - # The PyPI package uses a capital letter so we have to specify this explicitly PYPI_PACKAGE = "Cerberus" -inherit pypi setuptools3 +inherit pypi python_poetry_core -SRC_URI[sha256sum] = "d1b21b3954b2498d9a79edf16b3170a3ac1021df88d197dc2ce5928ba519237c" +SRC_URI[sha256sum] = "81011e10266ef71b6ec6d50e60171258a5b134d69f8fb387d16e4936d0d47642" diff --git a/meta-python/recipes-devtools/python/python3-certifi_2021.10.8.bb b/meta-python/recipes-devtools/python/python3-certifi_2021.10.8.bb deleted file mode 100644 index 4c376da897..0000000000 --- a/meta-python/recipes-devtools/python/python3-certifi_2021.10.8.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=67da0714c3f9471067b729eca6c9fbe8" - -SRC_URI[sha256sum] = "78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872" - -inherit pypi setuptools3 - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-cffi_1.15.0.bb b/meta-python/recipes-devtools/python/python3-cffi_1.15.0.bb deleted file mode 100644 index c36f23b3dd..0000000000 --- a/meta-python/recipes-devtools/python/python3-cffi_1.15.0.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] = "920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954" - -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 8b3c8bbaaf..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_2.0.7.bb b/meta-python/recipes-devtools/python/python3-charset-normalizer_3.3.2.bb index 7db1063981..ca9a88ccfb 100644 --- a/meta-python/recipes-devtools/python/python3-charset-normalizer_2.0.7.bb +++ b/meta-python/recipes-devtools/python/python3-charset-normalizer_3.3.2.bb @@ -3,6 +3,15 @@ HOMEPAGE = "https://github.com/ousret/charset_normalizer" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=0974a390827087287db39928f7c524b5" -SRC_URI[sha256sum] = "e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0" +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-classes_0.4.1.bb b/meta-python/recipes-devtools/python/python3-classes_0.4.1.bb new file mode 100644 index 0000000000..8daf82481f --- /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 python_poetry_core + +RDEPENDS:${PN} += "python3-typing-extensions" diff --git a/meta-python/recipes-devtools/python/python3-click-repl_0.2.0.bb b/meta-python/recipes-devtools/python/python3-click-repl_0.2.0.bb deleted file mode 100644 index cf5ba988b4..0000000000 --- a/meta-python/recipes-devtools/python/python3-click-repl_0.2.0.bb +++ /dev/null @@ -1,10 +0,0 @@ -SUMMARY = "REPL plugin for Click" -HOMEPAGE = "https://github.com/untitaker/click-repl" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=fee2943fdd4d8afbac9ccc1c8ac137d5" - -SRC_URI[sha256sum] = "cd12f68d745bf6151210790540b4cb064c7b13e571bc64b6957d98d120dacfd8" - -inherit pypi setuptools3 - -RDEPENDS:${PN} = "${PYTHON_PN}-click" diff --git a/meta-python/recipes-devtools/python/python3-click-repl_0.3.0.bb b/meta-python/recipes-devtools/python/python3-click-repl_0.3.0.bb new file mode 100644 index 0000000000..46cf1b3784 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-click-repl_0.3.0.bb @@ -0,0 +1,13 @@ +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 python_setuptools_build_meta + +RDEPENDS:${PN} += " \ + python3-click \ + python3-prompt-toolkit \ + " diff --git a/meta-python/recipes-devtools/python/python3-click-spinner/0001-Update-Versioneer-to-0.22.patch b/meta-python/recipes-devtools/python/python3-click-spinner/0001-Update-Versioneer-to-0.22.patch new file mode 100644 index 0000000000..4edb5da9ef --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-click-spinner/0001-Update-Versioneer-to-0.22.patch @@ -0,0 +1,2489 @@ +From 739f9da6bf0d2d9f0de624aee2ec71c65f62c275 Mon Sep 17 00:00:00 2001 +From: Hugo van Kemenade <hugovk@users.noreply.github.com> +Date: Tue, 10 May 2022 18:17:50 +0300 +Subject: [PATCH] Update Versioneer to 0.22 + +Upstream-Status: Backport [https://github.com/click-contrib/click-spinner/commit/5622ab0a0b4296dc8f10863f268ed98dccf4b642] + +Signed-off-by: Ny Antra Ranaivoarison <nyantra.ranaivoarison@smile.fr> +--- + click_spinner/__init__.py | 5 +- + click_spinner/_version.py | 665 +++++++++++++++++++++- + versioneer.py | 1128 ++++++++++++++++++++++++------------- + 3 files changed, 1400 insertions(+), 398 deletions(-) + +diff --git a/click_spinner/__init__.py b/click_spinner/__init__.py +index aeec089..8e9f4f9 100644 +--- a/click_spinner/__init__.py ++++ b/click_spinner/__init__.py +@@ -77,6 +77,5 @@ def spinner(beep=False, disable=False, force=False, stream=sys.stdout): + return Spinner(beep, disable, force, stream) + + +-from ._version import get_versions +-__version__ = get_versions()['version'] +-del get_versions ++from . import _version ++__version__ = _version.get_versions()['version'] +diff --git a/click_spinner/_version.py b/click_spinner/_version.py +index 5ae340e..d44565d 100644 +--- a/click_spinner/_version.py ++++ b/click_spinner/_version.py +@@ -1,21 +1,658 @@ + +-# This file was generated by 'versioneer.py' (0.16) from +-# revision-control system data, or from the parent directory name of an +-# unpacked source archive. Distribution tarballs contain a pre-generated copy +-# of this file. ++# This file helps to compute a version number in source trees obtained from ++# git-archive tarball (such as those provided by githubs download-from-tag ++# feature). Distribution tarballs (built by setup.py sdist) and build ++# directories (produced by setup.py build) will contain a much shorter file ++# that just contains the computed version number. + +-import json ++# This file is released into the public domain. Generated by ++# versioneer-0.22 (https://github.com/python-versioneer/python-versioneer) ++ ++"""Git implementation of _version.py.""" ++ ++import errno ++import os ++import re ++import subprocess + import sys ++from typing import Callable, Dict ++import functools ++ ++ ++def get_keywords(): ++ """Get the keywords needed to look up the version information.""" ++ # these strings will be replaced by git during git-archive. ++ # setup.py/versioneer.py will grep for the variable names, so they must ++ # each be defined on a line of their own. _version.py will just call ++ # get_keywords(). ++ git_refnames = "$Format:%d$" ++ git_full = "$Format:%H$" ++ git_date = "$Format:%ci$" ++ keywords = {"refnames": git_refnames, "full": git_full, "date": git_date} ++ return keywords ++ ++ ++class VersioneerConfig: ++ """Container for Versioneer configuration parameters.""" ++ ++ ++def get_config(): ++ """Create, populate and return the VersioneerConfig() object.""" ++ # these strings are filled in when 'setup.py versioneer' creates ++ # _version.py ++ cfg = VersioneerConfig() ++ cfg.VCS = "git" ++ cfg.style = "pep440" ++ cfg.tag_prefix = "v" ++ cfg.parentdir_prefix = "click-spinner-" ++ cfg.versionfile_source = "click_spinner/_version.py" ++ cfg.verbose = False ++ return cfg ++ ++ ++class NotThisMethod(Exception): ++ """Exception raised if a method is not valid for the current scenario.""" ++ ++ ++LONG_VERSION_PY: Dict[str, str] = {} ++HANDLERS: Dict[str, Dict[str, Callable]] = {} ++ ++ ++def register_vcs_handler(vcs, method): # decorator ++ """Create decorator to mark a method as the handler of a VCS.""" ++ def decorate(f): ++ """Store f in HANDLERS[vcs][method].""" ++ if vcs not in HANDLERS: ++ HANDLERS[vcs] = {} ++ HANDLERS[vcs][method] = f ++ return f ++ return decorate ++ ++ ++def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, ++ env=None): ++ """Call the given command(s).""" ++ assert isinstance(commands, list) ++ process = None ++ ++ popen_kwargs = {} ++ if sys.platform == "win32": ++ # This hides the console window if pythonw.exe is used ++ startupinfo = subprocess.STARTUPINFO() ++ startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW ++ popen_kwargs["startupinfo"] = startupinfo ++ ++ for command in commands: ++ try: ++ dispcmd = str([command] + args) ++ # remember shell=False, so use git.cmd on windows, not just git ++ process = subprocess.Popen([command] + args, cwd=cwd, env=env, ++ stdout=subprocess.PIPE, ++ stderr=(subprocess.PIPE if hide_stderr ++ else None), **popen_kwargs) ++ break ++ except OSError: ++ e = sys.exc_info()[1] ++ if e.errno == errno.ENOENT: ++ continue ++ if verbose: ++ print("unable to run %s" % dispcmd) ++ print(e) ++ return None, None ++ else: ++ if verbose: ++ print("unable to find command, tried %s" % (commands,)) ++ return None, None ++ stdout = process.communicate()[0].strip().decode() ++ if process.returncode != 0: ++ if verbose: ++ print("unable to run %s (error)" % dispcmd) ++ print("stdout was %s" % stdout) ++ return None, process.returncode ++ return stdout, process.returncode ++ ++ ++def versions_from_parentdir(parentdir_prefix, root, verbose): ++ """Try to determine the version from the parent directory name. ++ ++ Source tarballs conventionally unpack into a directory that includes both ++ the project name and a version string. We will also support searching up ++ two directory levels for an appropriately named parent directory ++ """ ++ rootdirs = [] ++ ++ for _ in range(3): ++ dirname = os.path.basename(root) ++ if dirname.startswith(parentdir_prefix): ++ return {"version": dirname[len(parentdir_prefix):], ++ "full-revisionid": None, ++ "dirty": False, "error": None, "date": None} ++ rootdirs.append(root) ++ root = os.path.dirname(root) # up a level ++ ++ if verbose: ++ print("Tried directories %s but none started with prefix %s" % ++ (str(rootdirs), parentdir_prefix)) ++ raise NotThisMethod("rootdir doesn't start with parentdir_prefix") ++ ++ ++@register_vcs_handler("git", "get_keywords") ++def git_get_keywords(versionfile_abs): ++ """Extract version information from the given file.""" ++ # the code embedded in _version.py can just fetch the value of these ++ # keywords. When used from setup.py, we don't want to import _version.py, ++ # so we do it with a regexp instead. This function is not used from ++ # _version.py. ++ keywords = {} ++ try: ++ with open(versionfile_abs, "r") as fobj: ++ for line in fobj: ++ if line.strip().startswith("git_refnames ="): ++ mo = re.search(r'=\s*"(.*)"', line) ++ if mo: ++ keywords["refnames"] = mo.group(1) ++ if line.strip().startswith("git_full ="): ++ mo = re.search(r'=\s*"(.*)"', line) ++ if mo: ++ keywords["full"] = mo.group(1) ++ if line.strip().startswith("git_date ="): ++ mo = re.search(r'=\s*"(.*)"', line) ++ if mo: ++ keywords["date"] = mo.group(1) ++ except OSError: ++ pass ++ return keywords ++ ++ ++@register_vcs_handler("git", "keywords") ++def git_versions_from_keywords(keywords, tag_prefix, verbose): ++ """Get version information from git keywords.""" ++ if "refnames" not in keywords: ++ raise NotThisMethod("Short version file found") ++ date = keywords.get("date") ++ if date is not None: ++ # Use only the last line. Previous lines may contain GPG signature ++ # information. ++ date = date.splitlines()[-1] ++ ++ # git-2.2.0 added "%cI", which expands to an ISO-8601 -compliant ++ # datestamp. However we prefer "%ci" (which expands to an "ISO-8601 ++ # -like" string, which we must then edit to make compliant), because ++ # it's been around since git-1.5.3, and it's too difficult to ++ # discover which version we're using, or to work around using an ++ # older one. ++ date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) ++ refnames = keywords["refnames"].strip() ++ if refnames.startswith("$Format"): ++ if verbose: ++ print("keywords are unexpanded, not using") ++ raise NotThisMethod("unexpanded keywords, not a git-archive tarball") ++ refs = {r.strip() for r in refnames.strip("()").split(",")} ++ # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of ++ # just "foo-1.0". If we see a "tag: " prefix, prefer those. ++ TAG = "tag: " ++ tags = {r[len(TAG):] for r in refs if r.startswith(TAG)} ++ if not tags: ++ # Either we're using git < 1.8.3, or there really are no tags. We use ++ # a heuristic: assume all version tags have a digit. The old git %d ++ # expansion behaves like git log --decorate=short and strips out the ++ # refs/heads/ and refs/tags/ prefixes that would let us distinguish ++ # between branches and tags. By ignoring refnames without digits, we ++ # filter out many common branch names like "release" and ++ # "stabilization", as well as "HEAD" and "master". ++ tags = {r for r in refs if re.search(r'\d', r)} ++ if verbose: ++ print("discarding '%s', no digits" % ",".join(refs - tags)) ++ if verbose: ++ print("likely tags: %s" % ",".join(sorted(tags))) ++ for ref in sorted(tags): ++ # sorting will prefer e.g. "2.0" over "2.0rc1" ++ if ref.startswith(tag_prefix): ++ r = ref[len(tag_prefix):] ++ # Filter out refs that exactly match prefix or that don't start ++ # with a number once the prefix is stripped (mostly a concern ++ # when prefix is '') ++ if not re.match(r'\d', r): ++ continue ++ if verbose: ++ print("picking %s" % r) ++ return {"version": r, ++ "full-revisionid": keywords["full"].strip(), ++ "dirty": False, "error": None, ++ "date": date} ++ # no suitable tags, so version is "0+unknown", but full hex is still there ++ if verbose: ++ print("no suitable tags, using unknown + full revision id") ++ return {"version": "0+unknown", ++ "full-revisionid": keywords["full"].strip(), ++ "dirty": False, "error": "no suitable tags", "date": None} ++ ++ ++@register_vcs_handler("git", "pieces_from_vcs") ++def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command): ++ """Get version from 'git describe' in the root of the source tree. ++ ++ This only gets called if the git-archive 'subst' keywords were *not* ++ expanded, and _version.py hasn't already been rewritten with a short ++ version string, meaning we're inside a checked out source tree. ++ """ ++ GITS = ["git"] ++ if sys.platform == "win32": ++ GITS = ["git.cmd", "git.exe"] ++ ++ # GIT_DIR can interfere with correct operation of Versioneer. ++ # It may be intended to be passed to the Versioneer-versioned project, ++ # but that should not change where we get our version from. ++ env = os.environ.copy() ++ env.pop("GIT_DIR", None) ++ runner = functools.partial(runner, env=env) ++ ++ _, rc = runner(GITS, ["rev-parse", "--git-dir"], cwd=root, ++ hide_stderr=True) ++ if rc != 0: ++ if verbose: ++ print("Directory %s not under git control" % root) ++ raise NotThisMethod("'git rev-parse --git-dir' returned error") ++ ++ MATCH_ARGS = ["--match", "%s*" % tag_prefix] if tag_prefix else [] ++ ++ # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] ++ # if there isn't one, this yields HEX[-dirty] (no NUM) ++ describe_out, rc = runner(GITS, ["describe", "--tags", "--dirty", ++ "--always", "--long", *MATCH_ARGS], ++ cwd=root) ++ # --long was added in git-1.5.5 ++ if describe_out is None: ++ raise NotThisMethod("'git describe' failed") ++ describe_out = describe_out.strip() ++ full_out, rc = runner(GITS, ["rev-parse", "HEAD"], cwd=root) ++ if full_out is None: ++ raise NotThisMethod("'git rev-parse' failed") ++ full_out = full_out.strip() ++ ++ pieces = {} ++ pieces["long"] = full_out ++ pieces["short"] = full_out[:7] # maybe improved later ++ pieces["error"] = None ++ ++ branch_name, rc = runner(GITS, ["rev-parse", "--abbrev-ref", "HEAD"], ++ cwd=root) ++ # --abbrev-ref was added in git-1.6.3 ++ if rc != 0 or branch_name is None: ++ raise NotThisMethod("'git rev-parse --abbrev-ref' returned error") ++ branch_name = branch_name.strip() ++ ++ if branch_name == "HEAD": ++ # If we aren't exactly on a branch, pick a branch which represents ++ # the current commit. If all else fails, we are on a branchless ++ # commit. ++ branches, rc = runner(GITS, ["branch", "--contains"], cwd=root) ++ # --contains was added in git-1.5.4 ++ if rc != 0 or branches is None: ++ raise NotThisMethod("'git branch --contains' returned error") ++ branches = branches.split("\n") ++ ++ # Remove the first line if we're running detached ++ if "(" in branches[0]: ++ branches.pop(0) ++ ++ # Strip off the leading "* " from the list of branches. ++ branches = [branch[2:] for branch in branches] ++ if "master" in branches: ++ branch_name = "master" ++ elif not branches: ++ branch_name = None ++ else: ++ # Pick the first branch that is returned. Good or bad. ++ branch_name = branches[0] ++ ++ pieces["branch"] = branch_name ++ ++ # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] ++ # TAG might have hyphens. ++ git_describe = describe_out ++ ++ # look for -dirty suffix ++ dirty = git_describe.endswith("-dirty") ++ pieces["dirty"] = dirty ++ if dirty: ++ git_describe = git_describe[:git_describe.rindex("-dirty")] ++ ++ # now we have TAG-NUM-gHEX or HEX ++ ++ if "-" in git_describe: ++ # TAG-NUM-gHEX ++ mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe) ++ if not mo: ++ # unparsable. Maybe git-describe is misbehaving? ++ pieces["error"] = ("unable to parse git-describe output: '%s'" ++ % describe_out) ++ return pieces ++ ++ # tag ++ full_tag = mo.group(1) ++ if not full_tag.startswith(tag_prefix): ++ if verbose: ++ fmt = "tag '%s' doesn't start with prefix '%s'" ++ print(fmt % (full_tag, tag_prefix)) ++ pieces["error"] = ("tag '%s' doesn't start with prefix '%s'" ++ % (full_tag, tag_prefix)) ++ return pieces ++ pieces["closest-tag"] = full_tag[len(tag_prefix):] ++ ++ # distance: number of commits since tag ++ pieces["distance"] = int(mo.group(2)) ++ ++ # commit: short hex revision ID ++ pieces["short"] = mo.group(3) ++ ++ else: ++ # HEX: no tags ++ pieces["closest-tag"] = None ++ count_out, rc = runner(GITS, ["rev-list", "HEAD", "--count"], cwd=root) ++ pieces["distance"] = int(count_out) # total number of commits + +-version_json = ''' +-{ +- "dirty": false, +- "error": null, +- "full-revisionid": "7cadb31e3e257c64a47a67255547f0a746e1a465", +- "version": "0.1.10" +-} +-''' # END VERSION_JSON ++ # commit date: see ISO-8601 comment in git_versions_from_keywords() ++ date = runner(GITS, ["show", "-s", "--format=%ci", "HEAD"], cwd=root)[0].strip() ++ # Use only the last line. Previous lines may contain GPG signature ++ # information. ++ date = date.splitlines()[-1] ++ pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) ++ ++ return pieces ++ ++ ++def plus_or_dot(pieces): ++ """Return a + if we don't already have one, else return a .""" ++ if "+" in pieces.get("closest-tag", ""): ++ return "." ++ return "+" ++ ++ ++def render_pep440(pieces): ++ """Build up version string, with post-release "local version identifier". ++ ++ Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you ++ get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty ++ ++ Exceptions: ++ 1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty] ++ """ ++ if pieces["closest-tag"]: ++ rendered = pieces["closest-tag"] ++ if pieces["distance"] or pieces["dirty"]: ++ rendered += plus_or_dot(pieces) ++ rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ else: ++ # exception #1 ++ rendered = "0+untagged.%d.g%s" % (pieces["distance"], ++ pieces["short"]) ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ return rendered ++ ++ ++def render_pep440_branch(pieces): ++ """TAG[[.dev0]+DISTANCE.gHEX[.dirty]] . ++ ++ The ".dev0" means not master branch. Note that .dev0 sorts backwards ++ (a feature branch will appear "older" than the master branch). ++ ++ Exceptions: ++ 1: no tags. 0[.dev0]+untagged.DISTANCE.gHEX[.dirty] ++ """ ++ if pieces["closest-tag"]: ++ rendered = pieces["closest-tag"] ++ if pieces["distance"] or pieces["dirty"]: ++ if pieces["branch"] != "master": ++ rendered += ".dev0" ++ rendered += plus_or_dot(pieces) ++ rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ else: ++ # exception #1 ++ rendered = "0" ++ if pieces["branch"] != "master": ++ rendered += ".dev0" ++ rendered += "+untagged.%d.g%s" % (pieces["distance"], ++ pieces["short"]) ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ return rendered ++ ++ ++def pep440_split_post(ver): ++ """Split pep440 version string at the post-release segment. ++ ++ Returns the release segments before the post-release and the ++ post-release version number (or -1 if no post-release segment is present). ++ """ ++ vc = str.split(ver, ".post") ++ return vc[0], int(vc[1] or 0) if len(vc) == 2 else None ++ ++ ++def render_pep440_pre(pieces): ++ """TAG[.postN.devDISTANCE] -- No -dirty. ++ ++ Exceptions: ++ 1: no tags. 0.post0.devDISTANCE ++ """ ++ if pieces["closest-tag"]: ++ if pieces["distance"]: ++ # update the post release segment ++ tag_version, post_version = pep440_split_post(pieces["closest-tag"]) ++ rendered = tag_version ++ if post_version is not None: ++ rendered += ".post%d.dev%d" % (post_version+1, pieces["distance"]) ++ else: ++ rendered += ".post0.dev%d" % (pieces["distance"]) ++ else: ++ # no commits, use the tag as the version ++ rendered = pieces["closest-tag"] ++ else: ++ # exception #1 ++ rendered = "0.post0.dev%d" % pieces["distance"] ++ return rendered ++ ++ ++def render_pep440_post(pieces): ++ """TAG[.postDISTANCE[.dev0]+gHEX] . ++ ++ The ".dev0" means dirty. Note that .dev0 sorts backwards ++ (a dirty tree will appear "older" than the corresponding clean one), ++ but you shouldn't be releasing software with -dirty anyways. ++ ++ Exceptions: ++ 1: no tags. 0.postDISTANCE[.dev0] ++ """ ++ if pieces["closest-tag"]: ++ rendered = pieces["closest-tag"] ++ if pieces["distance"] or pieces["dirty"]: ++ rendered += ".post%d" % pieces["distance"] ++ if pieces["dirty"]: ++ rendered += ".dev0" ++ rendered += plus_or_dot(pieces) ++ rendered += "g%s" % pieces["short"] ++ else: ++ # exception #1 ++ rendered = "0.post%d" % pieces["distance"] ++ if pieces["dirty"]: ++ rendered += ".dev0" ++ rendered += "+g%s" % pieces["short"] ++ return rendered ++ ++ ++def render_pep440_post_branch(pieces): ++ """TAG[.postDISTANCE[.dev0]+gHEX[.dirty]] . ++ ++ The ".dev0" means not master branch. ++ ++ Exceptions: ++ 1: no tags. 0.postDISTANCE[.dev0]+gHEX[.dirty] ++ """ ++ if pieces["closest-tag"]: ++ rendered = pieces["closest-tag"] ++ if pieces["distance"] or pieces["dirty"]: ++ rendered += ".post%d" % pieces["distance"] ++ if pieces["branch"] != "master": ++ rendered += ".dev0" ++ rendered += plus_or_dot(pieces) ++ rendered += "g%s" % pieces["short"] ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ else: ++ # exception #1 ++ rendered = "0.post%d" % pieces["distance"] ++ if pieces["branch"] != "master": ++ rendered += ".dev0" ++ rendered += "+g%s" % pieces["short"] ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ return rendered ++ ++ ++def render_pep440_old(pieces): ++ """TAG[.postDISTANCE[.dev0]] . ++ ++ The ".dev0" means dirty. ++ ++ Exceptions: ++ 1: no tags. 0.postDISTANCE[.dev0] ++ """ ++ if pieces["closest-tag"]: ++ rendered = pieces["closest-tag"] ++ if pieces["distance"] or pieces["dirty"]: ++ rendered += ".post%d" % pieces["distance"] ++ if pieces["dirty"]: ++ rendered += ".dev0" ++ else: ++ # exception #1 ++ rendered = "0.post%d" % pieces["distance"] ++ if pieces["dirty"]: ++ rendered += ".dev0" ++ return rendered ++ ++ ++def render_git_describe(pieces): ++ """TAG[-DISTANCE-gHEX][-dirty]. ++ ++ Like 'git describe --tags --dirty --always'. ++ ++ Exceptions: ++ 1: no tags. HEX[-dirty] (note: no 'g' prefix) ++ """ ++ if pieces["closest-tag"]: ++ rendered = pieces["closest-tag"] ++ if pieces["distance"]: ++ rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) ++ else: ++ # exception #1 ++ rendered = pieces["short"] ++ if pieces["dirty"]: ++ rendered += "-dirty" ++ return rendered ++ ++ ++def render_git_describe_long(pieces): ++ """TAG-DISTANCE-gHEX[-dirty]. ++ ++ Like 'git describe --tags --dirty --always -long'. ++ The distance/hash is unconditional. ++ ++ Exceptions: ++ 1: no tags. HEX[-dirty] (note: no 'g' prefix) ++ """ ++ if pieces["closest-tag"]: ++ rendered = pieces["closest-tag"] ++ rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) ++ else: ++ # exception #1 ++ rendered = pieces["short"] ++ if pieces["dirty"]: ++ rendered += "-dirty" ++ return rendered ++ ++ ++def render(pieces, style): ++ """Render the given version pieces into the requested style.""" ++ if pieces["error"]: ++ return {"version": "unknown", ++ "full-revisionid": pieces.get("long"), ++ "dirty": None, ++ "error": pieces["error"], ++ "date": None} ++ ++ if not style or style == "default": ++ style = "pep440" # the default ++ ++ if style == "pep440": ++ rendered = render_pep440(pieces) ++ elif style == "pep440-branch": ++ rendered = render_pep440_branch(pieces) ++ elif style == "pep440-pre": ++ rendered = render_pep440_pre(pieces) ++ elif style == "pep440-post": ++ rendered = render_pep440_post(pieces) ++ elif style == "pep440-post-branch": ++ rendered = render_pep440_post_branch(pieces) ++ elif style == "pep440-old": ++ rendered = render_pep440_old(pieces) ++ elif style == "git-describe": ++ rendered = render_git_describe(pieces) ++ elif style == "git-describe-long": ++ rendered = render_git_describe_long(pieces) ++ else: ++ raise ValueError("unknown style '%s'" % style) ++ ++ return {"version": rendered, "full-revisionid": pieces["long"], ++ "dirty": pieces["dirty"], "error": None, ++ "date": pieces.get("date")} + + + def get_versions(): +- return json.loads(version_json) ++ """Get version information or return default if unable to do so.""" ++ # I am in _version.py, which lives at ROOT/VERSIONFILE_SOURCE. If we have ++ # __file__, we can work backwards from there to the root. Some ++ # py2exe/bbfreeze/non-CPython implementations don't do __file__, in which ++ # case we can only use expanded keywords. ++ ++ cfg = get_config() ++ verbose = cfg.verbose ++ ++ try: ++ return git_versions_from_keywords(get_keywords(), cfg.tag_prefix, ++ verbose) ++ except NotThisMethod: ++ pass ++ ++ try: ++ root = os.path.realpath(__file__) ++ # versionfile_source is the relative path from the top of the source ++ # tree (where the .git directory might live) to this file. Invert ++ # this to find the root from __file__. ++ for _ in cfg.versionfile_source.split('/'): ++ root = os.path.dirname(root) ++ except NameError: ++ return {"version": "0+unknown", "full-revisionid": None, ++ "dirty": None, ++ "error": "unable to find root of source tree", ++ "date": None} ++ ++ try: ++ pieces = git_pieces_from_vcs(cfg.tag_prefix, root, verbose) ++ return render(pieces, cfg.style) ++ except NotThisMethod: ++ pass ++ ++ try: ++ if cfg.parentdir_prefix: ++ return versions_from_parentdir(cfg.parentdir_prefix, root, verbose) ++ except NotThisMethod: ++ pass ++ ++ return {"version": "0+unknown", "full-revisionid": None, ++ "dirty": None, ++ "error": "unable to compute version", "date": None} +diff --git a/versioneer.py b/versioneer.py +index 7ed2a21..a142bf5 100644 +--- a/versioneer.py ++++ b/versioneer.py +@@ -1,5 +1,5 @@ + +-# Version: 0.16 ++# Version: 0.22 + + """The Versioneer - like a rocketeer, but for versions. + +@@ -7,18 +7,14 @@ The Versioneer + ============== + + * like a rocketeer, but for versions! +-* https://github.com/warner/python-versioneer ++* https://github.com/python-versioneer/python-versioneer + * Brian Warner + * License: Public Domain +-* Compatible With: python2.6, 2.7, 3.3, 3.4, 3.5, and pypy +-* [![Latest Version] +-(https://pypip.in/version/versioneer/badge.svg?style=flat) +-](https://pypi.python.org/pypi/versioneer/) +-* [![Build Status] +-(https://travis-ci.org/warner/python-versioneer.png?branch=master) +-](https://travis-ci.org/warner/python-versioneer) +- +-This is a tool for managing a recorded version number in distutils-based ++* Compatible with: Python 3.6, 3.7, 3.8, 3.9, 3.10 and pypy3 ++* [![Latest Version][pypi-image]][pypi-url] ++* [![Build Status][travis-image]][travis-url] ++ ++This is a tool for managing a recorded version number in distutils/setuptools-based + python projects. The goal is to remove the tedious and error-prone "update + the embedded version string" step from your release process. Making a new + release should be as easy as recording a new tag in your version-control +@@ -27,9 +23,10 @@ system, and maybe making new tarballs. + + ## Quick Install + +-* `pip install versioneer` to somewhere to your $PATH +-* add a `[versioneer]` section to your setup.cfg (see below) ++* `pip install versioneer` to somewhere in your $PATH ++* add a `[versioneer]` section to your setup.cfg (see [Install](INSTALL.md)) + * run `versioneer install` in your source tree, commit the results ++* Verify version information with `python setup.py version` + + ## Version Identifiers + +@@ -61,7 +58,7 @@ version 1.3). Many VCS systems can report a description that captures this, + for example `git describe --tags --dirty --always` reports things like + "0.7-1-g574ab98-dirty" to indicate that the checkout is one revision past the + 0.7 tag, has a unique revision id of "574ab98", and is "dirty" (it has +-uncommitted changes. ++uncommitted changes). + + The version identifier is used for multiple purposes: + +@@ -88,127 +85,7 @@ the generated version data. + + ## Installation + +-First, decide on values for the following configuration variables: +- +-* `VCS`: the version control system you use. Currently accepts "git". +- +-* `style`: the style of version string to be produced. See "Styles" below for +- details. Defaults to "pep440", which looks like +- `TAG[+DISTANCE.gSHORTHASH[.dirty]]`. +- +-* `versionfile_source`: +- +- A project-relative pathname into which the generated version strings should +- be written. This is usually a `_version.py` next to your project's main +- `__init__.py` file, so it can be imported at runtime. If your project uses +- `src/myproject/__init__.py`, this should be `src/myproject/_version.py`. +- This file should be checked in to your VCS as usual: the copy created below +- by `setup.py setup_versioneer` will include code that parses expanded VCS +- keywords in generated tarballs. The 'build' and 'sdist' commands will +- replace it with a copy that has just the calculated version string. +- +- This must be set even if your project does not have any modules (and will +- therefore never import `_version.py`), since "setup.py sdist" -based trees +- still need somewhere to record the pre-calculated version strings. Anywhere +- in the source tree should do. If there is a `__init__.py` next to your +- `_version.py`, the `setup.py setup_versioneer` command (described below) +- will append some `__version__`-setting assignments, if they aren't already +- present. +- +-* `versionfile_build`: +- +- Like `versionfile_source`, but relative to the build directory instead of +- the source directory. These will differ when your setup.py uses +- 'package_dir='. If you have `package_dir={'myproject': 'src/myproject'}`, +- then you will probably have `versionfile_build='myproject/_version.py'` and +- `versionfile_source='src/myproject/_version.py'`. +- +- If this is set to None, then `setup.py build` will not attempt to rewrite +- any `_version.py` in the built tree. If your project does not have any +- libraries (e.g. if it only builds a script), then you should use +- `versionfile_build = None`. To actually use the computed version string, +- your `setup.py` will need to override `distutils.command.build_scripts` +- with a subclass that explicitly inserts a copy of +- `versioneer.get_version()` into your script file. See +- `test/demoapp-script-only/setup.py` for an example. +- +-* `tag_prefix`: +- +- a string, like 'PROJECTNAME-', which appears at the start of all VCS tags. +- If your tags look like 'myproject-1.2.0', then you should use +- tag_prefix='myproject-'. If you use unprefixed tags like '1.2.0', this +- should be an empty string, using either `tag_prefix=` or `tag_prefix=''`. +- +-* `parentdir_prefix`: +- +- a optional string, frequently the same as tag_prefix, which appears at the +- start of all unpacked tarball filenames. If your tarball unpacks into +- 'myproject-1.2.0', this should be 'myproject-'. To disable this feature, +- just omit the field from your `setup.cfg`. +- +-This tool provides one script, named `versioneer`. That script has one mode, +-"install", which writes a copy of `versioneer.py` into the current directory +-and runs `versioneer.py setup` to finish the installation. +- +-To versioneer-enable your project: +- +-* 1: Modify your `setup.cfg`, adding a section named `[versioneer]` and +- populating it with the configuration values you decided earlier (note that +- the option names are not case-sensitive): +- +- ```` +- [versioneer] +- VCS = git +- style = pep440 +- versionfile_source = src/myproject/_version.py +- versionfile_build = myproject/_version.py +- tag_prefix = +- parentdir_prefix = myproject- +- ```` +- +-* 2: Run `versioneer install`. This will do the following: +- +- * copy `versioneer.py` into the top of your source tree +- * create `_version.py` in the right place (`versionfile_source`) +- * modify your `__init__.py` (if one exists next to `_version.py`) to define +- `__version__` (by calling a function from `_version.py`) +- * modify your `MANIFEST.in` to include both `versioneer.py` and the +- generated `_version.py` in sdist tarballs +- +- `versioneer install` will complain about any problems it finds with your +- `setup.py` or `setup.cfg`. Run it multiple times until you have fixed all +- the problems. +- +-* 3: add a `import versioneer` to your setup.py, and add the following +- arguments to the setup() call: +- +- version=versioneer.get_version(), +- cmdclass=versioneer.get_cmdclass(), +- +-* 4: commit these changes to your VCS. To make sure you won't forget, +- `versioneer install` will mark everything it touched for addition using +- `git add`. Don't forget to add `setup.py` and `setup.cfg` too. +- +-## Post-Installation Usage +- +-Once established, all uses of your tree from a VCS checkout should get the +-current version string. All generated tarballs should include an embedded +-version string (so users who unpack them will not need a VCS tool installed). +- +-If you distribute your project through PyPI, then the release process should +-boil down to two steps: +- +-* 1: git tag 1.0 +-* 2: python setup.py register sdist upload +- +-If you distribute it through github (i.e. users use github to generate +-tarballs with `git archive`), the process is: +- +-* 1: git tag 1.0 +-* 2: git push; git push --tags +- +-Versioneer will report "0+untagged.NUMCOMMITS.gHASH" until your tree has at +-least one tag in its history. ++See [INSTALL.md](./INSTALL.md) for detailed installation instructions. + + ## Version-String Flavors + +@@ -229,6 +106,10 @@ information: + * `['full-revisionid']`: detailed revision identifier. For Git, this is the + full SHA1 commit id, e.g. "1076c978a8d3cfc70f408fe5974aa6c092c949ac". + ++* `['date']`: Date and time of the latest `HEAD` commit. For Git, it is the ++ commit date in ISO 8601 format. This will be None if the date is not ++ available. ++ + * `['dirty']`: a boolean, True if the tree has uncommitted changes. Note that + this is only accurate if run in a VCS checkout, otherwise it is likely to + be False or None +@@ -267,8 +148,8 @@ that this commit is two revisions ("+2") beyond the "0.11" tag. For released + software (exactly equal to a known tag), the identifier will only contain the + stripped tag, e.g. "0.11". + +-Other styles are available. See details.md in the Versioneer source tree for +-descriptions. ++Other styles are available. See [details.md](details.md) in the Versioneer ++source tree for descriptions. + + ## Debugging + +@@ -278,51 +159,83 @@ version`, which will run the version-lookup code in a verbose mode, and will + display the full contents of `get_versions()` (including the `error` string, + which may help identify what went wrong). + +-## Updating Versioneer ++## Known Limitations + +-To upgrade your project to a new release of Versioneer, do the following: ++Some situations are known to cause problems for Versioneer. This details the ++most significant ones. More can be found on Github ++[issues page](https://github.com/python-versioneer/python-versioneer/issues). + +-* install the new Versioneer (`pip install -U versioneer` or equivalent) +-* edit `setup.cfg`, if necessary, to include any new configuration settings +- indicated by the release notes +-* re-run `versioneer install` in your source tree, to replace +- `SRC/_version.py` +-* commit any changed files ++### Subprojects ++ ++Versioneer has limited support for source trees in which `setup.py` is not in ++the root directory (e.g. `setup.py` and `.git/` are *not* siblings). The are ++two common reasons why `setup.py` might not be in the root: ++ ++* Source trees which contain multiple subprojects, such as ++ [Buildbot](https://github.com/buildbot/buildbot), which contains both ++ "master" and "slave" subprojects, each with their own `setup.py`, ++ `setup.cfg`, and `tox.ini`. Projects like these produce multiple PyPI ++ distributions (and upload multiple independently-installable tarballs). ++* Source trees whose main purpose is to contain a C library, but which also ++ provide bindings to Python (and perhaps other languages) in subdirectories. ++ ++Versioneer will look for `.git` in parent directories, and most operations ++should get the right version string. However `pip` and `setuptools` have bugs ++and implementation details which frequently cause `pip install .` from a ++subproject directory to fail to find a correct version string (so it usually ++defaults to `0+unknown`). + +-### Upgrading to 0.16 ++`pip install --editable .` should work correctly. `setup.py install` might ++work too. + +-Nothing special. ++Pip-8.1.1 is known to have this problem, but hopefully it will get fixed in ++some later version. + +-### Upgrading to 0.15 ++[Bug #38](https://github.com/python-versioneer/python-versioneer/issues/38) is tracking ++this issue. The discussion in ++[PR #61](https://github.com/python-versioneer/python-versioneer/pull/61) describes the ++issue from the Versioneer side in more detail. ++[pip PR#3176](https://github.com/pypa/pip/pull/3176) and ++[pip PR#3615](https://github.com/pypa/pip/pull/3615) contain work to improve ++pip to let Versioneer work correctly. + +-Starting with this version, Versioneer is configured with a `[versioneer]` +-section in your `setup.cfg` file. Earlier versions required the `setup.py` to +-set attributes on the `versioneer` module immediately after import. The new +-version will refuse to run (raising an exception during import) until you +-have provided the necessary `setup.cfg` section. ++Versioneer-0.16 and earlier only looked for a `.git` directory next to the ++`setup.cfg`, so subprojects were completely unsupported with those releases. + +-In addition, the Versioneer package provides an executable named +-`versioneer`, and the installation process is driven by running `versioneer +-install`. In 0.14 and earlier, the executable was named +-`versioneer-installer` and was run without an argument. ++### Editable installs with setuptools <= 18.5 + +-### Upgrading to 0.14 ++`setup.py develop` and `pip install --editable .` allow you to install a ++project into a virtualenv once, then continue editing the source code (and ++test) without re-installing after every change. + +-0.14 changes the format of the version string. 0.13 and earlier used +-hyphen-separated strings like "0.11-2-g1076c97-dirty". 0.14 and beyond use a +-plus-separated "local version" section strings, with dot-separated +-components, like "0.11+2.g1076c97". PEP440-strict tools did not like the old +-format, but should be ok with the new one. ++"Entry-point scripts" (`setup(entry_points={"console_scripts": ..})`) are a ++convenient way to specify executable scripts that should be installed along ++with the python package. + +-### Upgrading from 0.11 to 0.12 ++These both work as expected when using modern setuptools. When using ++setuptools-18.5 or earlier, however, certain operations will cause ++`pkg_resources.DistributionNotFound` errors when running the entrypoint ++script, which must be resolved by re-installing the package. This happens ++when the install happens with one version, then the egg_info data is ++regenerated while a different version is checked out. Many setup.py commands ++cause egg_info to be rebuilt (including `sdist`, `wheel`, and installing into ++a different virtualenv), so this can be surprising. + +-Nothing special. ++[Bug #83](https://github.com/python-versioneer/python-versioneer/issues/83) describes ++this one, but upgrading to a newer version of setuptools should probably ++resolve it. + +-### Upgrading from 0.10 to 0.11 + +-You must add a `versioneer.VCS = "git"` to your `setup.py` before re-running +-`setup.py setup_versioneer`. This will enable the use of additional +-version-control systems (SVN, etc) in the future. ++## Updating Versioneer ++ ++To upgrade your project to a new release of Versioneer, do the following: ++ ++* install the new Versioneer (`pip install -U versioneer` or equivalent) ++* edit `setup.cfg`, if necessary, to include any new configuration settings ++ indicated by the release notes. See [UPGRADING](./UPGRADING.md) for details. ++* re-run `versioneer install` in your source tree, to replace ++ `SRC/_version.py` ++* commit any changed files + + ## Future Directions + +@@ -337,6 +250,14 @@ installation by editing setup.py . Alternatively, it might go the other + direction and include code from all supported VCS systems, reducing the + number of intermediate scripts. + ++## Similar projects ++ ++* [setuptools_scm](https://github.com/pypa/setuptools_scm/) - a non-vendored build-time ++ dependency ++* [minver](https://github.com/jbweston/miniver) - a lightweight reimplementation of ++ versioneer ++* [versioningit](https://github.com/jwodder/versioningit) - a PEP 518-based setuptools ++ plugin + + ## License + +@@ -346,19 +267,28 @@ Specifically, both are released under the Creative Commons "Public Domain + Dedication" license (CC0-1.0), as described in + https://creativecommons.org/publicdomain/zero/1.0/ . + ++[pypi-image]: https://img.shields.io/pypi/v/versioneer.svg ++[pypi-url]: https://pypi.python.org/pypi/versioneer/ ++[travis-image]: ++https://img.shields.io/travis/com/python-versioneer/python-versioneer.svg ++[travis-url]: https://travis-ci.com/github/python-versioneer/python-versioneer ++ + """ ++# pylint:disable=invalid-name,import-outside-toplevel,missing-function-docstring ++# pylint:disable=missing-class-docstring,too-many-branches,too-many-statements ++# pylint:disable=raise-missing-from,too-many-lines,too-many-locals,import-error ++# pylint:disable=too-few-public-methods,redefined-outer-name,consider-using-with ++# pylint:disable=attribute-defined-outside-init,too-many-arguments + +-from __future__ import print_function +-try: +- import configparser +-except ImportError: +- import ConfigParser as configparser ++import configparser + import errno + import json + import os + import re + import subprocess + import sys ++from typing import Callable, Dict ++import functools + + + class VersioneerConfig: +@@ -393,10 +323,12 @@ def get_root(): + # module-import table will cache the first one. So we can't use + # os.path.dirname(__file__), as that will find whichever + # versioneer.py was first imported, even in later projects. +- me = os.path.realpath(os.path.abspath(__file__)) +- if os.path.splitext(me)[0] != os.path.splitext(versioneer_py)[0]: ++ my_path = os.path.realpath(os.path.abspath(__file__)) ++ me_dir = os.path.normcase(os.path.splitext(my_path)[0]) ++ vsr_dir = os.path.normcase(os.path.splitext(versioneer_py)[0]) ++ if me_dir != vsr_dir: + print("Warning: build in %s is using versioneer.py from %s" +- % (os.path.dirname(me), versioneer_py)) ++ % (os.path.dirname(my_path), versioneer_py)) + except NameError: + pass + return root +@@ -404,85 +336,94 @@ def get_root(): + + def get_config_from_root(root): + """Read the project setup.cfg file to determine Versioneer config.""" +- # This might raise EnvironmentError (if setup.cfg is missing), or ++ # This might raise OSError (if setup.cfg is missing), or + # configparser.NoSectionError (if it lacks a [versioneer] section), or + # configparser.NoOptionError (if it lacks "VCS="). See the docstring at + # the top of versioneer.py for instructions on writing your setup.cfg . + setup_cfg = os.path.join(root, "setup.cfg") +- parser = configparser.SafeConfigParser() +- with open(setup_cfg, "r") as f: +- parser.readfp(f) ++ parser = configparser.ConfigParser() ++ with open(setup_cfg, "r") as cfg_file: ++ parser.read_file(cfg_file) + VCS = parser.get("versioneer", "VCS") # mandatory + +- def get(parser, name): +- if parser.has_option("versioneer", name): +- return parser.get("versioneer", name) +- return None ++ # Dict-like interface for non-mandatory entries ++ section = parser["versioneer"] ++ + cfg = VersioneerConfig() + cfg.VCS = VCS +- cfg.style = get(parser, "style") or "" +- cfg.versionfile_source = get(parser, "versionfile_source") +- cfg.versionfile_build = get(parser, "versionfile_build") +- cfg.tag_prefix = get(parser, "tag_prefix") ++ cfg.style = section.get("style", "") ++ cfg.versionfile_source = section.get("versionfile_source") ++ cfg.versionfile_build = section.get("versionfile_build") ++ cfg.tag_prefix = section.get("tag_prefix") + if cfg.tag_prefix in ("''", '""'): + cfg.tag_prefix = "" +- cfg.parentdir_prefix = get(parser, "parentdir_prefix") +- cfg.verbose = get(parser, "verbose") ++ cfg.parentdir_prefix = section.get("parentdir_prefix") ++ cfg.verbose = section.get("verbose") + return cfg + + + class NotThisMethod(Exception): + """Exception raised if a method is not valid for the current scenario.""" + ++ + # these dictionaries contain VCS-specific tools +-LONG_VERSION_PY = {} +-HANDLERS = {} ++LONG_VERSION_PY: Dict[str, str] = {} ++HANDLERS: Dict[str, Dict[str, Callable]] = {} + + + def register_vcs_handler(vcs, method): # decorator +- """Decorator to mark a method as the handler for a particular VCS.""" ++ """Create decorator to mark a method as the handler of a VCS.""" + def decorate(f): + """Store f in HANDLERS[vcs][method].""" +- if vcs not in HANDLERS: +- HANDLERS[vcs] = {} +- HANDLERS[vcs][method] = f ++ HANDLERS.setdefault(vcs, {})[method] = f + return f + return decorate + + +-def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False): ++def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, ++ env=None): + """Call the given command(s).""" + assert isinstance(commands, list) +- p = None +- for c in commands: ++ process = None ++ ++ popen_kwargs = {} ++ if sys.platform == "win32": ++ # This hides the console window if pythonw.exe is used ++ startupinfo = subprocess.STARTUPINFO() ++ startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW ++ popen_kwargs["startupinfo"] = startupinfo ++ ++ for command in commands: + try: +- dispcmd = str([c] + args) ++ dispcmd = str([command] + args) + # remember shell=False, so use git.cmd on windows, not just git +- p = subprocess.Popen([c] + args, cwd=cwd, stdout=subprocess.PIPE, +- stderr=(subprocess.PIPE if hide_stderr +- else None)) ++ process = subprocess.Popen([command] + args, cwd=cwd, env=env, ++ stdout=subprocess.PIPE, ++ stderr=(subprocess.PIPE if hide_stderr ++ else None), **popen_kwargs) + break +- except EnvironmentError: ++ except OSError: + e = sys.exc_info()[1] + if e.errno == errno.ENOENT: + continue + if verbose: + print("unable to run %s" % dispcmd) + print(e) +- return None ++ return None, None + else: + if verbose: + print("unable to find command, tried %s" % (commands,)) +- return None +- stdout = p.communicate()[0].strip() +- if sys.version_info[0] >= 3: +- stdout = stdout.decode() +- if p.returncode != 0: ++ return None, None ++ stdout = process.communicate()[0].strip().decode() ++ if process.returncode != 0: + if verbose: + print("unable to run %s (error)" % dispcmd) +- return None +- return stdout +-LONG_VERSION_PY['git'] = ''' ++ print("stdout was %s" % stdout) ++ return None, process.returncode ++ return stdout, process.returncode ++ ++ ++LONG_VERSION_PY['git'] = r''' + # This file helps to compute a version number in source trees obtained from + # git-archive tarball (such as those provided by githubs download-from-tag + # feature). Distribution tarballs (built by setup.py sdist) and build +@@ -490,7 +431,7 @@ LONG_VERSION_PY['git'] = ''' + # that just contains the computed version number. + + # This file is released into the public domain. Generated by +-# versioneer-0.16 (https://github.com/warner/python-versioneer) ++# versioneer-0.22 (https://github.com/python-versioneer/python-versioneer) + + """Git implementation of _version.py.""" + +@@ -499,6 +440,8 @@ import os + import re + import subprocess + import sys ++from typing import Callable, Dict ++import functools + + + def get_keywords(): +@@ -509,7 +452,8 @@ def get_keywords(): + # get_keywords(). + git_refnames = "%(DOLLAR)sFormat:%%d%(DOLLAR)s" + git_full = "%(DOLLAR)sFormat:%%H%(DOLLAR)s" +- keywords = {"refnames": git_refnames, "full": git_full} ++ git_date = "%(DOLLAR)sFormat:%%ci%(DOLLAR)s" ++ keywords = {"refnames": git_refnames, "full": git_full, "date": git_date} + return keywords + + +@@ -535,12 +479,12 @@ class NotThisMethod(Exception): + """Exception raised if a method is not valid for the current scenario.""" + + +-LONG_VERSION_PY = {} +-HANDLERS = {} ++LONG_VERSION_PY: Dict[str, str] = {} ++HANDLERS: Dict[str, Dict[str, Callable]] = {} + + + def register_vcs_handler(vcs, method): # decorator +- """Decorator to mark a method as the handler for a particular VCS.""" ++ """Create decorator to mark a method as the handler of a VCS.""" + def decorate(f): + """Store f in HANDLERS[vcs][method].""" + if vcs not in HANDLERS: +@@ -550,55 +494,71 @@ def register_vcs_handler(vcs, method): # decorator + return decorate + + +-def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False): ++def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, ++ env=None): + """Call the given command(s).""" + assert isinstance(commands, list) +- p = None +- for c in commands: ++ process = None ++ ++ popen_kwargs = {} ++ if sys.platform == "win32": ++ # This hides the console window if pythonw.exe is used ++ startupinfo = subprocess.STARTUPINFO() ++ startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW ++ popen_kwargs["startupinfo"] = startupinfo ++ ++ for command in commands: + try: +- dispcmd = str([c] + args) ++ dispcmd = str([command] + args) + # remember shell=False, so use git.cmd on windows, not just git +- p = subprocess.Popen([c] + args, cwd=cwd, stdout=subprocess.PIPE, +- stderr=(subprocess.PIPE if hide_stderr +- else None)) ++ process = subprocess.Popen([command] + args, cwd=cwd, env=env, ++ stdout=subprocess.PIPE, ++ stderr=(subprocess.PIPE if hide_stderr ++ else None), **popen_kwargs) + break +- except EnvironmentError: ++ except OSError: + e = sys.exc_info()[1] + if e.errno == errno.ENOENT: + continue + if verbose: + print("unable to run %%s" %% dispcmd) + print(e) +- return None ++ return None, None + else: + if verbose: + print("unable to find command, tried %%s" %% (commands,)) +- return None +- stdout = p.communicate()[0].strip() +- if sys.version_info[0] >= 3: +- stdout = stdout.decode() +- if p.returncode != 0: ++ return None, None ++ stdout = process.communicate()[0].strip().decode() ++ if process.returncode != 0: + if verbose: + print("unable to run %%s (error)" %% dispcmd) +- return None +- return stdout ++ print("stdout was %%s" %% stdout) ++ return None, process.returncode ++ return stdout, process.returncode + + + def versions_from_parentdir(parentdir_prefix, root, verbose): + """Try to determine the version from the parent directory name. + +- Source tarballs conventionally unpack into a directory that includes +- both the project name and a version string. ++ Source tarballs conventionally unpack into a directory that includes both ++ the project name and a version string. We will also support searching up ++ two directory levels for an appropriately named parent directory + """ +- dirname = os.path.basename(root) +- if not dirname.startswith(parentdir_prefix): +- if verbose: +- print("guessing rootdir is '%%s', but '%%s' doesn't start with " +- "prefix '%%s'" %% (root, dirname, parentdir_prefix)) +- raise NotThisMethod("rootdir doesn't start with parentdir_prefix") +- return {"version": dirname[len(parentdir_prefix):], +- "full-revisionid": None, +- "dirty": False, "error": None} ++ rootdirs = [] ++ ++ for _ in range(3): ++ dirname = os.path.basename(root) ++ if dirname.startswith(parentdir_prefix): ++ return {"version": dirname[len(parentdir_prefix):], ++ "full-revisionid": None, ++ "dirty": False, "error": None, "date": None} ++ rootdirs.append(root) ++ root = os.path.dirname(root) # up a level ++ ++ if verbose: ++ print("Tried directories %%s but none started with prefix %%s" %% ++ (str(rootdirs), parentdir_prefix)) ++ raise NotThisMethod("rootdir doesn't start with parentdir_prefix") + + + @register_vcs_handler("git", "get_keywords") +@@ -610,18 +570,21 @@ def git_get_keywords(versionfile_abs): + # _version.py. + keywords = {} + try: +- f = open(versionfile_abs, "r") +- for line in f.readlines(): +- if line.strip().startswith("git_refnames ="): +- mo = re.search(r'=\s*"(.*)"', line) +- if mo: +- keywords["refnames"] = mo.group(1) +- if line.strip().startswith("git_full ="): +- mo = re.search(r'=\s*"(.*)"', line) +- if mo: +- keywords["full"] = mo.group(1) +- f.close() +- except EnvironmentError: ++ with open(versionfile_abs, "r") as fobj: ++ for line in fobj: ++ if line.strip().startswith("git_refnames ="): ++ mo = re.search(r'=\s*"(.*)"', line) ++ if mo: ++ keywords["refnames"] = mo.group(1) ++ if line.strip().startswith("git_full ="): ++ mo = re.search(r'=\s*"(.*)"', line) ++ if mo: ++ keywords["full"] = mo.group(1) ++ if line.strip().startswith("git_date ="): ++ mo = re.search(r'=\s*"(.*)"', line) ++ if mo: ++ keywords["date"] = mo.group(1) ++ except OSError: + pass + return keywords + +@@ -629,18 +592,31 @@ def git_get_keywords(versionfile_abs): + @register_vcs_handler("git", "keywords") + def git_versions_from_keywords(keywords, tag_prefix, verbose): + """Get version information from git keywords.""" +- if not keywords: +- raise NotThisMethod("no keywords at all, weird") ++ if "refnames" not in keywords: ++ raise NotThisMethod("Short version file found") ++ date = keywords.get("date") ++ if date is not None: ++ # Use only the last line. Previous lines may contain GPG signature ++ # information. ++ date = date.splitlines()[-1] ++ ++ # git-2.2.0 added "%%cI", which expands to an ISO-8601 -compliant ++ # datestamp. However we prefer "%%ci" (which expands to an "ISO-8601 ++ # -like" string, which we must then edit to make compliant), because ++ # it's been around since git-1.5.3, and it's too difficult to ++ # discover which version we're using, or to work around using an ++ # older one. ++ date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) + refnames = keywords["refnames"].strip() + if refnames.startswith("$Format"): + if verbose: + print("keywords are unexpanded, not using") + raise NotThisMethod("unexpanded keywords, not a git-archive tarball") +- refs = set([r.strip() for r in refnames.strip("()").split(",")]) ++ refs = {r.strip() for r in refnames.strip("()").split(",")} + # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of + # just "foo-1.0". If we see a "tag: " prefix, prefer those. + TAG = "tag: " +- tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)]) ++ tags = {r[len(TAG):] for r in refs if r.startswith(TAG)} + if not tags: + # Either we're using git < 1.8.3, or there really are no tags. We use + # a heuristic: assume all version tags have a digit. The old git %%d +@@ -649,56 +625,72 @@ def git_versions_from_keywords(keywords, tag_prefix, verbose): + # between branches and tags. By ignoring refnames without digits, we + # filter out many common branch names like "release" and + # "stabilization", as well as "HEAD" and "master". +- tags = set([r for r in refs if re.search(r'\d', r)]) ++ tags = {r for r in refs if re.search(r'\d', r)} + if verbose: +- print("discarding '%%s', no digits" %% ",".join(refs-tags)) ++ print("discarding '%%s', no digits" %% ",".join(refs - tags)) + if verbose: + print("likely tags: %%s" %% ",".join(sorted(tags))) + for ref in sorted(tags): + # sorting will prefer e.g. "2.0" over "2.0rc1" + if ref.startswith(tag_prefix): + r = ref[len(tag_prefix):] ++ # Filter out refs that exactly match prefix or that don't start ++ # with a number once the prefix is stripped (mostly a concern ++ # when prefix is '') ++ if not re.match(r'\d', r): ++ continue + if verbose: + print("picking %%s" %% r) + return {"version": r, + "full-revisionid": keywords["full"].strip(), +- "dirty": False, "error": None +- } ++ "dirty": False, "error": None, ++ "date": date} + # no suitable tags, so version is "0+unknown", but full hex is still there + if verbose: + print("no suitable tags, using unknown + full revision id") + return {"version": "0+unknown", + "full-revisionid": keywords["full"].strip(), +- "dirty": False, "error": "no suitable tags"} ++ "dirty": False, "error": "no suitable tags", "date": None} + + + @register_vcs_handler("git", "pieces_from_vcs") +-def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): ++def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command): + """Get version from 'git describe' in the root of the source tree. + + This only gets called if the git-archive 'subst' keywords were *not* + expanded, and _version.py hasn't already been rewritten with a short + version string, meaning we're inside a checked out source tree. + """ +- if not os.path.exists(os.path.join(root, ".git")): +- if verbose: +- print("no .git in %%s" %% root) +- raise NotThisMethod("no .git directory") +- + GITS = ["git"] + if sys.platform == "win32": + GITS = ["git.cmd", "git.exe"] ++ ++ # GIT_DIR can interfere with correct operation of Versioneer. ++ # It may be intended to be passed to the Versioneer-versioned project, ++ # but that should not change where we get our version from. ++ env = os.environ.copy() ++ env.pop("GIT_DIR", None) ++ runner = functools.partial(runner, env=env) ++ ++ _, rc = runner(GITS, ["rev-parse", "--git-dir"], cwd=root, ++ hide_stderr=True) ++ if rc != 0: ++ if verbose: ++ print("Directory %%s not under git control" %% root) ++ raise NotThisMethod("'git rev-parse --git-dir' returned error") ++ ++ MATCH_ARGS = ["--match", "%%s*" %% tag_prefix] if tag_prefix else [] ++ + # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] + # if there isn't one, this yields HEX[-dirty] (no NUM) +- describe_out = run_command(GITS, ["describe", "--tags", "--dirty", +- "--always", "--long", +- "--match", "%%s*" %% tag_prefix], +- cwd=root) ++ describe_out, rc = runner(GITS, ["describe", "--tags", "--dirty", ++ "--always", "--long", *MATCH_ARGS], ++ cwd=root) + # --long was added in git-1.5.5 + if describe_out is None: + raise NotThisMethod("'git describe' failed") + describe_out = describe_out.strip() +- full_out = run_command(GITS, ["rev-parse", "HEAD"], cwd=root) ++ full_out, rc = runner(GITS, ["rev-parse", "HEAD"], cwd=root) + if full_out is None: + raise NotThisMethod("'git rev-parse' failed") + full_out = full_out.strip() +@@ -708,6 +700,39 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): + pieces["short"] = full_out[:7] # maybe improved later + pieces["error"] = None + ++ branch_name, rc = runner(GITS, ["rev-parse", "--abbrev-ref", "HEAD"], ++ cwd=root) ++ # --abbrev-ref was added in git-1.6.3 ++ if rc != 0 or branch_name is None: ++ raise NotThisMethod("'git rev-parse --abbrev-ref' returned error") ++ branch_name = branch_name.strip() ++ ++ if branch_name == "HEAD": ++ # If we aren't exactly on a branch, pick a branch which represents ++ # the current commit. If all else fails, we are on a branchless ++ # commit. ++ branches, rc = runner(GITS, ["branch", "--contains"], cwd=root) ++ # --contains was added in git-1.5.4 ++ if rc != 0 or branches is None: ++ raise NotThisMethod("'git branch --contains' returned error") ++ branches = branches.split("\n") ++ ++ # Remove the first line if we're running detached ++ if "(" in branches[0]: ++ branches.pop(0) ++ ++ # Strip off the leading "* " from the list of branches. ++ branches = [branch[2:] for branch in branches] ++ if "master" in branches: ++ branch_name = "master" ++ elif not branches: ++ branch_name = None ++ else: ++ # Pick the first branch that is returned. Good or bad. ++ branch_name = branches[0] ++ ++ pieces["branch"] = branch_name ++ + # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] + # TAG might have hyphens. + git_describe = describe_out +@@ -724,7 +749,7 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): + # TAG-NUM-gHEX + mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe) + if not mo: +- # unparseable. Maybe git-describe is misbehaving? ++ # unparsable. Maybe git-describe is misbehaving? + pieces["error"] = ("unable to parse git-describe output: '%%s'" + %% describe_out) + return pieces +@@ -749,10 +774,16 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): + else: + # HEX: no tags + pieces["closest-tag"] = None +- count_out = run_command(GITS, ["rev-list", "HEAD", "--count"], +- cwd=root) ++ count_out, rc = runner(GITS, ["rev-list", "HEAD", "--count"], cwd=root) + pieces["distance"] = int(count_out) # total number of commits + ++ # commit date: see ISO-8601 comment in git_versions_from_keywords() ++ date = runner(GITS, ["show", "-s", "--format=%%ci", "HEAD"], cwd=root)[0].strip() ++ # Use only the last line. Previous lines may contain GPG signature ++ # information. ++ date = date.splitlines()[-1] ++ pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) ++ + return pieces + + +@@ -788,19 +819,67 @@ def render_pep440(pieces): + return rendered + + +-def render_pep440_pre(pieces): +- """TAG[.post.devDISTANCE] -- No -dirty. ++def render_pep440_branch(pieces): ++ """TAG[[.dev0]+DISTANCE.gHEX[.dirty]] . ++ ++ The ".dev0" means not master branch. Note that .dev0 sorts backwards ++ (a feature branch will appear "older" than the master branch). + + Exceptions: +- 1: no tags. 0.post.devDISTANCE ++ 1: no tags. 0[.dev0]+untagged.DISTANCE.gHEX[.dirty] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] ++ if pieces["distance"] or pieces["dirty"]: ++ if pieces["branch"] != "master": ++ rendered += ".dev0" ++ rendered += plus_or_dot(pieces) ++ rendered += "%%d.g%%s" %% (pieces["distance"], pieces["short"]) ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ else: ++ # exception #1 ++ rendered = "0" ++ if pieces["branch"] != "master": ++ rendered += ".dev0" ++ rendered += "+untagged.%%d.g%%s" %% (pieces["distance"], ++ pieces["short"]) ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ return rendered ++ ++ ++def pep440_split_post(ver): ++ """Split pep440 version string at the post-release segment. ++ ++ Returns the release segments before the post-release and the ++ post-release version number (or -1 if no post-release segment is present). ++ """ ++ vc = str.split(ver, ".post") ++ return vc[0], int(vc[1] or 0) if len(vc) == 2 else None ++ ++ ++def render_pep440_pre(pieces): ++ """TAG[.postN.devDISTANCE] -- No -dirty. ++ ++ Exceptions: ++ 1: no tags. 0.post0.devDISTANCE ++ """ ++ if pieces["closest-tag"]: + if pieces["distance"]: +- rendered += ".post.dev%%d" %% pieces["distance"] ++ # update the post release segment ++ tag_version, post_version = pep440_split_post(pieces["closest-tag"]) ++ rendered = tag_version ++ if post_version is not None: ++ rendered += ".post%%d.dev%%d" %% (post_version+1, pieces["distance"]) ++ else: ++ rendered += ".post0.dev%%d" %% (pieces["distance"]) ++ else: ++ # no commits, use the tag as the version ++ rendered = pieces["closest-tag"] + else: + # exception #1 +- rendered = "0.post.dev%%d" %% pieces["distance"] ++ rendered = "0.post0.dev%%d" %% pieces["distance"] + return rendered + + +@@ -831,12 +910,41 @@ def render_pep440_post(pieces): + return rendered + + ++def render_pep440_post_branch(pieces): ++ """TAG[.postDISTANCE[.dev0]+gHEX[.dirty]] . ++ ++ The ".dev0" means not master branch. ++ ++ Exceptions: ++ 1: no tags. 0.postDISTANCE[.dev0]+gHEX[.dirty] ++ """ ++ if pieces["closest-tag"]: ++ rendered = pieces["closest-tag"] ++ if pieces["distance"] or pieces["dirty"]: ++ rendered += ".post%%d" %% pieces["distance"] ++ if pieces["branch"] != "master": ++ rendered += ".dev0" ++ rendered += plus_or_dot(pieces) ++ rendered += "g%%s" %% pieces["short"] ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ else: ++ # exception #1 ++ rendered = "0.post%%d" %% pieces["distance"] ++ if pieces["branch"] != "master": ++ rendered += ".dev0" ++ rendered += "+g%%s" %% pieces["short"] ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ return rendered ++ ++ + def render_pep440_old(pieces): + """TAG[.postDISTANCE[.dev0]] . + + The ".dev0" means dirty. + +- Eexceptions: ++ Exceptions: + 1: no tags. 0.postDISTANCE[.dev0] + """ + if pieces["closest-tag"]: +@@ -899,17 +1007,22 @@ def render(pieces, style): + return {"version": "unknown", + "full-revisionid": pieces.get("long"), + "dirty": None, +- "error": pieces["error"]} ++ "error": pieces["error"], ++ "date": None} + + if not style or style == "default": + style = "pep440" # the default + + if style == "pep440": + rendered = render_pep440(pieces) ++ elif style == "pep440-branch": ++ rendered = render_pep440_branch(pieces) + elif style == "pep440-pre": + rendered = render_pep440_pre(pieces) + elif style == "pep440-post": + rendered = render_pep440_post(pieces) ++ elif style == "pep440-post-branch": ++ rendered = render_pep440_post_branch(pieces) + elif style == "pep440-old": + rendered = render_pep440_old(pieces) + elif style == "git-describe": +@@ -920,7 +1033,8 @@ def render(pieces, style): + raise ValueError("unknown style '%%s'" %% style) + + return {"version": rendered, "full-revisionid": pieces["long"], +- "dirty": pieces["dirty"], "error": None} ++ "dirty": pieces["dirty"], "error": None, ++ "date": pieces.get("date")} + + + def get_versions(): +@@ -944,12 +1058,13 @@ def get_versions(): + # versionfile_source is the relative path from the top of the source + # tree (where the .git directory might live) to this file. Invert + # this to find the root from __file__. +- for i in cfg.versionfile_source.split('/'): ++ for _ in cfg.versionfile_source.split('/'): + root = os.path.dirname(root) + except NameError: + return {"version": "0+unknown", "full-revisionid": None, + "dirty": None, +- "error": "unable to find root of source tree"} ++ "error": "unable to find root of source tree", ++ "date": None} + + try: + pieces = git_pieces_from_vcs(cfg.tag_prefix, root, verbose) +@@ -965,7 +1080,7 @@ def get_versions(): + + return {"version": "0+unknown", "full-revisionid": None, + "dirty": None, +- "error": "unable to compute version"} ++ "error": "unable to compute version", "date": None} + ''' + + +@@ -978,18 +1093,21 @@ def git_get_keywords(versionfile_abs): + # _version.py. + keywords = {} + try: +- f = open(versionfile_abs, "r") +- for line in f.readlines(): +- if line.strip().startswith("git_refnames ="): +- mo = re.search(r'=\s*"(.*)"', line) +- if mo: +- keywords["refnames"] = mo.group(1) +- if line.strip().startswith("git_full ="): +- mo = re.search(r'=\s*"(.*)"', line) +- if mo: +- keywords["full"] = mo.group(1) +- f.close() +- except EnvironmentError: ++ with open(versionfile_abs, "r") as fobj: ++ for line in fobj: ++ if line.strip().startswith("git_refnames ="): ++ mo = re.search(r'=\s*"(.*)"', line) ++ if mo: ++ keywords["refnames"] = mo.group(1) ++ if line.strip().startswith("git_full ="): ++ mo = re.search(r'=\s*"(.*)"', line) ++ if mo: ++ keywords["full"] = mo.group(1) ++ if line.strip().startswith("git_date ="): ++ mo = re.search(r'=\s*"(.*)"', line) ++ if mo: ++ keywords["date"] = mo.group(1) ++ except OSError: + pass + return keywords + +@@ -997,18 +1115,31 @@ def git_get_keywords(versionfile_abs): + @register_vcs_handler("git", "keywords") + def git_versions_from_keywords(keywords, tag_prefix, verbose): + """Get version information from git keywords.""" +- if not keywords: +- raise NotThisMethod("no keywords at all, weird") ++ if "refnames" not in keywords: ++ raise NotThisMethod("Short version file found") ++ date = keywords.get("date") ++ if date is not None: ++ # Use only the last line. Previous lines may contain GPG signature ++ # information. ++ date = date.splitlines()[-1] ++ ++ # git-2.2.0 added "%cI", which expands to an ISO-8601 -compliant ++ # datestamp. However we prefer "%ci" (which expands to an "ISO-8601 ++ # -like" string, which we must then edit to make compliant), because ++ # it's been around since git-1.5.3, and it's too difficult to ++ # discover which version we're using, or to work around using an ++ # older one. ++ date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) + refnames = keywords["refnames"].strip() + if refnames.startswith("$Format"): + if verbose: + print("keywords are unexpanded, not using") + raise NotThisMethod("unexpanded keywords, not a git-archive tarball") +- refs = set([r.strip() for r in refnames.strip("()").split(",")]) ++ refs = {r.strip() for r in refnames.strip("()").split(",")} + # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of + # just "foo-1.0". If we see a "tag: " prefix, prefer those. + TAG = "tag: " +- tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)]) ++ tags = {r[len(TAG):] for r in refs if r.startswith(TAG)} + if not tags: + # Either we're using git < 1.8.3, or there really are no tags. We use + # a heuristic: assume all version tags have a digit. The old git %d +@@ -1017,56 +1148,72 @@ def git_versions_from_keywords(keywords, tag_prefix, verbose): + # between branches and tags. By ignoring refnames without digits, we + # filter out many common branch names like "release" and + # "stabilization", as well as "HEAD" and "master". +- tags = set([r for r in refs if re.search(r'\d', r)]) ++ tags = {r for r in refs if re.search(r'\d', r)} + if verbose: +- print("discarding '%s', no digits" % ",".join(refs-tags)) ++ print("discarding '%s', no digits" % ",".join(refs - tags)) + if verbose: + print("likely tags: %s" % ",".join(sorted(tags))) + for ref in sorted(tags): + # sorting will prefer e.g. "2.0" over "2.0rc1" + if ref.startswith(tag_prefix): + r = ref[len(tag_prefix):] ++ # Filter out refs that exactly match prefix or that don't start ++ # with a number once the prefix is stripped (mostly a concern ++ # when prefix is '') ++ if not re.match(r'\d', r): ++ continue + if verbose: + print("picking %s" % r) + return {"version": r, + "full-revisionid": keywords["full"].strip(), +- "dirty": False, "error": None +- } ++ "dirty": False, "error": None, ++ "date": date} + # no suitable tags, so version is "0+unknown", but full hex is still there + if verbose: + print("no suitable tags, using unknown + full revision id") + return {"version": "0+unknown", + "full-revisionid": keywords["full"].strip(), +- "dirty": False, "error": "no suitable tags"} ++ "dirty": False, "error": "no suitable tags", "date": None} + + + @register_vcs_handler("git", "pieces_from_vcs") +-def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): ++def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command): + """Get version from 'git describe' in the root of the source tree. + + This only gets called if the git-archive 'subst' keywords were *not* + expanded, and _version.py hasn't already been rewritten with a short + version string, meaning we're inside a checked out source tree. + """ +- if not os.path.exists(os.path.join(root, ".git")): +- if verbose: +- print("no .git in %s" % root) +- raise NotThisMethod("no .git directory") +- + GITS = ["git"] + if sys.platform == "win32": + GITS = ["git.cmd", "git.exe"] ++ ++ # GIT_DIR can interfere with correct operation of Versioneer. ++ # It may be intended to be passed to the Versioneer-versioned project, ++ # but that should not change where we get our version from. ++ env = os.environ.copy() ++ env.pop("GIT_DIR", None) ++ runner = functools.partial(runner, env=env) ++ ++ _, rc = runner(GITS, ["rev-parse", "--git-dir"], cwd=root, ++ hide_stderr=True) ++ if rc != 0: ++ if verbose: ++ print("Directory %s not under git control" % root) ++ raise NotThisMethod("'git rev-parse --git-dir' returned error") ++ ++ MATCH_ARGS = ["--match", "%s*" % tag_prefix] if tag_prefix else [] ++ + # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] + # if there isn't one, this yields HEX[-dirty] (no NUM) +- describe_out = run_command(GITS, ["describe", "--tags", "--dirty", +- "--always", "--long", +- "--match", "%s*" % tag_prefix], +- cwd=root) ++ describe_out, rc = runner(GITS, ["describe", "--tags", "--dirty", ++ "--always", "--long", *MATCH_ARGS], ++ cwd=root) + # --long was added in git-1.5.5 + if describe_out is None: + raise NotThisMethod("'git describe' failed") + describe_out = describe_out.strip() +- full_out = run_command(GITS, ["rev-parse", "HEAD"], cwd=root) ++ full_out, rc = runner(GITS, ["rev-parse", "HEAD"], cwd=root) + if full_out is None: + raise NotThisMethod("'git rev-parse' failed") + full_out = full_out.strip() +@@ -1076,6 +1223,39 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): + pieces["short"] = full_out[:7] # maybe improved later + pieces["error"] = None + ++ branch_name, rc = runner(GITS, ["rev-parse", "--abbrev-ref", "HEAD"], ++ cwd=root) ++ # --abbrev-ref was added in git-1.6.3 ++ if rc != 0 or branch_name is None: ++ raise NotThisMethod("'git rev-parse --abbrev-ref' returned error") ++ branch_name = branch_name.strip() ++ ++ if branch_name == "HEAD": ++ # If we aren't exactly on a branch, pick a branch which represents ++ # the current commit. If all else fails, we are on a branchless ++ # commit. ++ branches, rc = runner(GITS, ["branch", "--contains"], cwd=root) ++ # --contains was added in git-1.5.4 ++ if rc != 0 or branches is None: ++ raise NotThisMethod("'git branch --contains' returned error") ++ branches = branches.split("\n") ++ ++ # Remove the first line if we're running detached ++ if "(" in branches[0]: ++ branches.pop(0) ++ ++ # Strip off the leading "* " from the list of branches. ++ branches = [branch[2:] for branch in branches] ++ if "master" in branches: ++ branch_name = "master" ++ elif not branches: ++ branch_name = None ++ else: ++ # Pick the first branch that is returned. Good or bad. ++ branch_name = branches[0] ++ ++ pieces["branch"] = branch_name ++ + # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] + # TAG might have hyphens. + git_describe = describe_out +@@ -1092,7 +1272,7 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): + # TAG-NUM-gHEX + mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe) + if not mo: +- # unparseable. Maybe git-describe is misbehaving? ++ # unparsable. Maybe git-describe is misbehaving? + pieces["error"] = ("unable to parse git-describe output: '%s'" + % describe_out) + return pieces +@@ -1117,10 +1297,16 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): + else: + # HEX: no tags + pieces["closest-tag"] = None +- count_out = run_command(GITS, ["rev-list", "HEAD", "--count"], +- cwd=root) ++ count_out, rc = runner(GITS, ["rev-list", "HEAD", "--count"], cwd=root) + pieces["distance"] = int(count_out) # total number of commits + ++ # commit date: see ISO-8601 comment in git_versions_from_keywords() ++ date = runner(GITS, ["show", "-s", "--format=%ci", "HEAD"], cwd=root)[0].strip() ++ # Use only the last line. Previous lines may contain GPG signature ++ # information. ++ date = date.splitlines()[-1] ++ pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) ++ + return pieces + + +@@ -1128,7 +1314,7 @@ def do_vcs_install(manifest_in, versionfile_source, ipy): + """Git-specific installation logic for Versioneer. + + For Git, this means creating/changing .gitattributes to mark _version.py +- for export-time keyword substitution. ++ for export-subst keyword substitution. + """ + GITS = ["git"] + if sys.platform == "win32": +@@ -1137,27 +1323,26 @@ def do_vcs_install(manifest_in, versionfile_source, ipy): + if ipy: + files.append(ipy) + try: +- me = __file__ +- if me.endswith(".pyc") or me.endswith(".pyo"): +- me = os.path.splitext(me)[0] + ".py" +- versioneer_file = os.path.relpath(me) ++ my_path = __file__ ++ if my_path.endswith(".pyc") or my_path.endswith(".pyo"): ++ my_path = os.path.splitext(my_path)[0] + ".py" ++ versioneer_file = os.path.relpath(my_path) + except NameError: + versioneer_file = "versioneer.py" + files.append(versioneer_file) + present = False + try: +- f = open(".gitattributes", "r") +- for line in f.readlines(): +- if line.strip().startswith(versionfile_source): +- if "export-subst" in line.strip().split()[1:]: +- present = True +- f.close() +- except EnvironmentError: ++ with open(".gitattributes", "r") as fobj: ++ for line in fobj: ++ if line.strip().startswith(versionfile_source): ++ if "export-subst" in line.strip().split()[1:]: ++ present = True ++ break ++ except OSError: + pass + if not present: +- f = open(".gitattributes", "a+") +- f.write("%s export-subst\n" % versionfile_source) +- f.close() ++ with open(".gitattributes", "a+") as fobj: ++ fobj.write(f"{versionfile_source} export-subst\n") + files.append(".gitattributes") + run_command(GITS, ["add", "--"] + files) + +@@ -1165,27 +1350,34 @@ def do_vcs_install(manifest_in, versionfile_source, ipy): + def versions_from_parentdir(parentdir_prefix, root, verbose): + """Try to determine the version from the parent directory name. + +- Source tarballs conventionally unpack into a directory that includes +- both the project name and a version string. ++ Source tarballs conventionally unpack into a directory that includes both ++ the project name and a version string. We will also support searching up ++ two directory levels for an appropriately named parent directory + """ +- dirname = os.path.basename(root) +- if not dirname.startswith(parentdir_prefix): +- if verbose: +- print("guessing rootdir is '%s', but '%s' doesn't start with " +- "prefix '%s'" % (root, dirname, parentdir_prefix)) +- raise NotThisMethod("rootdir doesn't start with parentdir_prefix") +- return {"version": dirname[len(parentdir_prefix):], +- "full-revisionid": None, +- "dirty": False, "error": None} ++ rootdirs = [] ++ ++ for _ in range(3): ++ dirname = os.path.basename(root) ++ if dirname.startswith(parentdir_prefix): ++ return {"version": dirname[len(parentdir_prefix):], ++ "full-revisionid": None, ++ "dirty": False, "error": None, "date": None} ++ rootdirs.append(root) ++ root = os.path.dirname(root) # up a level ++ ++ if verbose: ++ print("Tried directories %s but none started with prefix %s" % ++ (str(rootdirs), parentdir_prefix)) ++ raise NotThisMethod("rootdir doesn't start with parentdir_prefix") ++ + + SHORT_VERSION_PY = """ +-# This file was generated by 'versioneer.py' (0.16) from ++# This file was generated by 'versioneer.py' (0.22) from + # revision-control system data, or from the parent directory name of an + # unpacked source archive. Distribution tarballs contain a pre-generated copy + # of this file. + + import json +-import sys + + version_json = ''' + %s +@@ -1202,10 +1394,13 @@ def versions_from_file(filename): + try: + with open(filename) as f: + contents = f.read() +- except EnvironmentError: ++ except OSError: + raise NotThisMethod("unable to read _version.py") + mo = re.search(r"version_json = '''\n(.*)''' # END VERSION_JSON", + contents, re.M | re.S) ++ if not mo: ++ mo = re.search(r"version_json = '''\r\n(.*)''' # END VERSION_JSON", ++ contents, re.M | re.S) + if not mo: + raise NotThisMethod("no version_json in _version.py") + return json.loads(mo.group(1)) +@@ -1254,19 +1449,67 @@ def render_pep440(pieces): + return rendered + + +-def render_pep440_pre(pieces): +- """TAG[.post.devDISTANCE] -- No -dirty. ++def render_pep440_branch(pieces): ++ """TAG[[.dev0]+DISTANCE.gHEX[.dirty]] . ++ ++ The ".dev0" means not master branch. Note that .dev0 sorts backwards ++ (a feature branch will appear "older" than the master branch). + + Exceptions: +- 1: no tags. 0.post.devDISTANCE ++ 1: no tags. 0[.dev0]+untagged.DISTANCE.gHEX[.dirty] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] ++ if pieces["distance"] or pieces["dirty"]: ++ if pieces["branch"] != "master": ++ rendered += ".dev0" ++ rendered += plus_or_dot(pieces) ++ rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ else: ++ # exception #1 ++ rendered = "0" ++ if pieces["branch"] != "master": ++ rendered += ".dev0" ++ rendered += "+untagged.%d.g%s" % (pieces["distance"], ++ pieces["short"]) ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ return rendered ++ ++ ++def pep440_split_post(ver): ++ """Split pep440 version string at the post-release segment. ++ ++ Returns the release segments before the post-release and the ++ post-release version number (or -1 if no post-release segment is present). ++ """ ++ vc = str.split(ver, ".post") ++ return vc[0], int(vc[1] or 0) if len(vc) == 2 else None ++ ++ ++def render_pep440_pre(pieces): ++ """TAG[.postN.devDISTANCE] -- No -dirty. ++ ++ Exceptions: ++ 1: no tags. 0.post0.devDISTANCE ++ """ ++ if pieces["closest-tag"]: + if pieces["distance"]: +- rendered += ".post.dev%d" % pieces["distance"] ++ # update the post release segment ++ tag_version, post_version = pep440_split_post(pieces["closest-tag"]) ++ rendered = tag_version ++ if post_version is not None: ++ rendered += ".post%d.dev%d" % (post_version+1, pieces["distance"]) ++ else: ++ rendered += ".post0.dev%d" % (pieces["distance"]) ++ else: ++ # no commits, use the tag as the version ++ rendered = pieces["closest-tag"] + else: + # exception #1 +- rendered = "0.post.dev%d" % pieces["distance"] ++ rendered = "0.post0.dev%d" % pieces["distance"] + return rendered + + +@@ -1297,12 +1540,41 @@ def render_pep440_post(pieces): + return rendered + + ++def render_pep440_post_branch(pieces): ++ """TAG[.postDISTANCE[.dev0]+gHEX[.dirty]] . ++ ++ The ".dev0" means not master branch. ++ ++ Exceptions: ++ 1: no tags. 0.postDISTANCE[.dev0]+gHEX[.dirty] ++ """ ++ if pieces["closest-tag"]: ++ rendered = pieces["closest-tag"] ++ if pieces["distance"] or pieces["dirty"]: ++ rendered += ".post%d" % pieces["distance"] ++ if pieces["branch"] != "master": ++ rendered += ".dev0" ++ rendered += plus_or_dot(pieces) ++ rendered += "g%s" % pieces["short"] ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ else: ++ # exception #1 ++ rendered = "0.post%d" % pieces["distance"] ++ if pieces["branch"] != "master": ++ rendered += ".dev0" ++ rendered += "+g%s" % pieces["short"] ++ if pieces["dirty"]: ++ rendered += ".dirty" ++ return rendered ++ ++ + def render_pep440_old(pieces): + """TAG[.postDISTANCE[.dev0]] . + + The ".dev0" means dirty. + +- Eexceptions: ++ Exceptions: + 1: no tags. 0.postDISTANCE[.dev0] + """ + if pieces["closest-tag"]: +@@ -1365,17 +1637,22 @@ def render(pieces, style): + return {"version": "unknown", + "full-revisionid": pieces.get("long"), + "dirty": None, +- "error": pieces["error"]} ++ "error": pieces["error"], ++ "date": None} + + if not style or style == "default": + style = "pep440" # the default + + if style == "pep440": + rendered = render_pep440(pieces) ++ elif style == "pep440-branch": ++ rendered = render_pep440_branch(pieces) + elif style == "pep440-pre": + rendered = render_pep440_pre(pieces) + elif style == "pep440-post": + rendered = render_pep440_post(pieces) ++ elif style == "pep440-post-branch": ++ rendered = render_pep440_post_branch(pieces) + elif style == "pep440-old": + rendered = render_pep440_old(pieces) + elif style == "git-describe": +@@ -1386,7 +1663,8 @@ def render(pieces, style): + raise ValueError("unknown style '%s'" % style) + + return {"version": rendered, "full-revisionid": pieces["long"], +- "dirty": pieces["dirty"], "error": None} ++ "dirty": pieces["dirty"], "error": None, ++ "date": pieces.get("date")} + + + class VersioneerBadRootError(Exception): +@@ -1465,7 +1743,8 @@ def get_versions(verbose=False): + print("unable to compute version") + + return {"version": "0+unknown", "full-revisionid": None, +- "dirty": None, "error": "unable to compute version"} ++ "dirty": None, "error": "unable to compute version", ++ "date": None} + + + def get_version(): +@@ -1473,8 +1752,12 @@ def get_version(): + return get_versions()["version"] + + +-def get_cmdclass(): +- """Get the custom setuptools/distutils subclasses used by Versioneer.""" ++def get_cmdclass(cmdclass=None): ++ """Get the custom setuptools/distutils subclasses used by Versioneer. ++ ++ If the package uses a different cmdclass (e.g. one from numpy), it ++ should be provide as an argument. ++ """ + if "versioneer" in sys.modules: + del sys.modules["versioneer"] + # this fixes the "python setup.py develop" case (also 'install' and +@@ -1488,12 +1771,15 @@ def get_cmdclass(): + # parent is protected against the child's "import versioneer". By + # removing ourselves from sys.modules here, before the child build + # happens, we protect the child from the parent's versioneer too. +- # Also see https://github.com/warner/python-versioneer/issues/52 ++ # Also see https://github.com/python-versioneer/python-versioneer/issues/52 + +- cmds = {} ++ cmds = {} if cmdclass is None else cmdclass.copy() + + # we add "version" to both distutils and setuptools +- from distutils.core import Command ++ try: ++ from setuptools import Command ++ except ImportError: ++ from distutils.core import Command + + class cmd_version(Command): + description = "report generated version string" +@@ -1511,6 +1797,7 @@ def get_cmdclass(): + print("Version: %s" % vers["version"]) + print(" full-revisionid: %s" % vers.get("full-revisionid")) + print(" dirty: %s" % vers.get("dirty")) ++ print(" date: %s" % vers.get("date")) + if vers["error"]: + print(" error: %s" % vers["error"]) + cmds["version"] = cmd_version +@@ -1524,9 +1811,16 @@ def get_cmdclass(): + # setuptools/bdist_egg -> distutils/install_lib -> build_py + # setuptools/install -> bdist_egg ->.. + # setuptools/develop -> ? ++ # pip install: ++ # copies source tree to a tempdir before running egg_info/etc ++ # if .git isn't copied too, 'git describe' will fail ++ # then does setup.py bdist_wheel, or sometimes setup.py install ++ # setup.py egg_info -> ? + + # we override different "build_py" commands for both environments +- if "setuptools" in sys.modules: ++ if 'build_py' in cmds: ++ _build_py = cmds['build_py'] ++ elif "setuptools" in sys.modules: + from setuptools.command.build_py import build_py as _build_py + else: + from distutils.command.build_py import build_py as _build_py +@@ -1546,8 +1840,41 @@ def get_cmdclass(): + write_to_version_file(target_versionfile, versions) + cmds["build_py"] = cmd_build_py + ++ if 'build_ext' in cmds: ++ _build_ext = cmds['build_ext'] ++ elif "setuptools" in sys.modules: ++ from setuptools.command.build_ext import build_ext as _build_ext ++ else: ++ from distutils.command.build_ext import build_ext as _build_ext ++ ++ class cmd_build_ext(_build_ext): ++ def run(self): ++ root = get_root() ++ cfg = get_config_from_root(root) ++ versions = get_versions() ++ _build_ext.run(self) ++ if self.inplace: ++ # build_ext --inplace will only build extensions in ++ # build/lib<..> dir with no _version.py to write to. ++ # As in place builds will already have a _version.py ++ # in the module dir, we do not need to write one. ++ return ++ # now locate _version.py in the new build/ directory and replace ++ # it with an updated value ++ target_versionfile = os.path.join(self.build_lib, ++ cfg.versionfile_build) ++ print("UPDATING %s" % target_versionfile) ++ write_to_version_file(target_versionfile, versions) ++ cmds["build_ext"] = cmd_build_ext ++ + if "cx_Freeze" in sys.modules: # cx_freeze enabled? + from cx_Freeze.dist import build_exe as _build_exe ++ # nczeczulin reports that py2exe won't like the pep440-style string ++ # as FILEVERSION, but it can be used for PRODUCTVERSION, e.g. ++ # setup(console=[{ ++ # "version": versioneer.get_version().split("+", 1)[0], # FILEVERSION ++ # "product_version": versioneer.get_version(), ++ # ... + + class cmd_build_exe(_build_exe): + def run(self): +@@ -1572,8 +1899,35 @@ def get_cmdclass(): + cmds["build_exe"] = cmd_build_exe + del cmds["build_py"] + ++ if 'py2exe' in sys.modules: # py2exe enabled? ++ from py2exe.distutils_buildexe import py2exe as _py2exe ++ ++ class cmd_py2exe(_py2exe): ++ def run(self): ++ root = get_root() ++ cfg = get_config_from_root(root) ++ versions = get_versions() ++ target_versionfile = cfg.versionfile_source ++ print("UPDATING %s" % target_versionfile) ++ write_to_version_file(target_versionfile, versions) ++ ++ _py2exe.run(self) ++ os.unlink(target_versionfile) ++ with open(cfg.versionfile_source, "w") as f: ++ LONG = LONG_VERSION_PY[cfg.VCS] ++ f.write(LONG % ++ {"DOLLAR": "$", ++ "STYLE": cfg.style, ++ "TAG_PREFIX": cfg.tag_prefix, ++ "PARENTDIR_PREFIX": cfg.parentdir_prefix, ++ "VERSIONFILE_SOURCE": cfg.versionfile_source, ++ }) ++ cmds["py2exe"] = cmd_py2exe ++ + # we override different "sdist" commands for both environments +- if "setuptools" in sys.modules: ++ if 'sdist' in cmds: ++ _sdist = cmds['sdist'] ++ elif "setuptools" in sys.modules: + from setuptools.command.sdist import sdist as _sdist + else: + from distutils.command.sdist import sdist as _sdist +@@ -1640,21 +1994,26 @@ SAMPLE_CONFIG = """ + + """ + +-INIT_PY_SNIPPET = """ ++OLD_SNIPPET = """ + from ._version import get_versions + __version__ = get_versions()['version'] + del get_versions + """ + ++INIT_PY_SNIPPET = """ ++from . import {0} ++__version__ = {0}.get_versions()['version'] ++""" ++ + + def do_setup(): +- """Main VCS-independent setup function for installing Versioneer.""" ++ """Do main VCS-independent setup function for installing Versioneer.""" + root = get_root() + try: + cfg = get_config_from_root(root) +- except (EnvironmentError, configparser.NoSectionError, ++ except (OSError, configparser.NoSectionError, + configparser.NoOptionError) as e: +- if isinstance(e, (EnvironmentError, configparser.NoSectionError)): ++ if isinstance(e, (OSError, configparser.NoSectionError)): + print("Adding sample versioneer config to setup.cfg", + file=sys.stderr) + with open(os.path.join(root, "setup.cfg"), "a") as f: +@@ -1678,12 +2037,18 @@ def do_setup(): + try: + with open(ipy, "r") as f: + old = f.read() +- except EnvironmentError: ++ except OSError: + old = "" +- if INIT_PY_SNIPPET not in old: ++ module = os.path.splitext(os.path.basename(cfg.versionfile_source))[0] ++ snippet = INIT_PY_SNIPPET.format(module) ++ if OLD_SNIPPET in old: ++ print(" replacing boilerplate in %s" % ipy) ++ with open(ipy, "w") as f: ++ f.write(old.replace(OLD_SNIPPET, snippet)) ++ elif snippet not in old: + print(" appending to %s" % ipy) + with open(ipy, "a") as f: +- f.write(INIT_PY_SNIPPET) ++ f.write(snippet) + else: + print(" %s unmodified" % ipy) + else: +@@ -1702,7 +2067,7 @@ def do_setup(): + if line.startswith("include "): + for include in line.split()[1:]: + simple_includes.add(include) +- except EnvironmentError: ++ except OSError: + pass + # That doesn't cover everything MANIFEST.in can do + # (http://docs.python.org/2/distutils/sourcedist.html#commands), so +@@ -1723,7 +2088,7 @@ def do_setup(): + print(" versionfile_source already in MANIFEST.in") + + # Make VCS-specific changes. For git, this means creating/changing +- # .gitattributes to mark _version.py for export-time keyword ++ # .gitattributes to mark _version.py for export-subst keyword + # substitution. + do_vcs_install(manifest_in, cfg.versionfile_source, ipy) + return 0 +@@ -1765,6 +2130,7 @@ def scan_setup_py(): + errors += 1 + return errors + ++ + if __name__ == "__main__": + cmd = sys.argv[1] + if cmd == "setup": diff --git a/meta-python/recipes-devtools/python/python3-click-spinner_0.1.10.bb b/meta-python/recipes-devtools/python/python3-click-spinner_0.1.10.bb index 418f8a32a7..b3e1328c75 100644 --- a/meta-python/recipes-devtools/python/python3-click-spinner_0.1.10.bb +++ b/meta-python/recipes-devtools/python/python3-click-spinner_0.1.10.bb @@ -3,7 +3,10 @@ HOMEPAGE = "https://github.com/click-contrib/click-spinner" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=8227180126797a0148f94f483f3e1489" +SRC_URI += "file://0001-Update-Versioneer-to-0.22.patch" SRC_URI[md5sum] = "ab68ed404401421819c81cc6c0677a87" SRC_URI[sha256sum] = "87eacf9d7298973a25d7615ef57d4782aebf913a532bba4b28a37e366e975daf" inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-json" diff --git a/meta-python/recipes-devtools/python/python3-click/run-ptest b/meta-python/recipes-devtools/python/python3-click/run-ptest deleted file mode 100644 index b63c4de0d9..0000000000 --- a/meta-python/recipes-devtools/python/python3-click/run-ptest +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' diff --git a/meta-python/recipes-devtools/python/python3-click_8.0.3.bb b/meta-python/recipes-devtools/python/python3-click_8.0.3.bb deleted file mode 100644 index c31d065673..0000000000 --- a/meta-python/recipes-devtools/python/python3-click_8.0.3.bb +++ /dev/null @@ -1,41 +0,0 @@ -SUMMARY = "A simple wrapper around optparse for powerful command line utilities." -DESCRIPTION = "\ -Click is a Python package for creating beautiful command line interfaces \ -in a composable way with as little code as necessary. It's the "Command \ -Line Interface Creation Kit". It's highly configurable but comes with \ -sensible defaults out of the box." -HOMEPAGE = "http://click.pocoo.org/" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=1fa98232fd645608937a0fdc82e999b8" - -SRC_URI[sha256sum] = "410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b" - -inherit pypi setuptools3 ptest - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-terminal \ - ${PYTHON_PN}-unixadmin \ -" - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/tests - cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ - cp -rf ${S}/setup.cfg ${D}${PTEST_PATH}/ - cp -rf ${S}/docs ${D}${PTEST_PATH}/ -} - -UPSTREAM_CHECK_REGEX = "click/(?P<pver>\d+(\.\d+)+)/" - -CLEANBROKEN = "1" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-threading \ - " - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-cloudpickle_3.0.0.bb b/meta-python/recipes-devtools/python/python3-cloudpickle_3.0.0.bb new file mode 100644 index 0000000000..fce5a5b408 --- /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://${UNPACKDIR}/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..a6c3e139b8 --- /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 ${UNPACKDIR}/CMakeLists.txt ${S}/ +} + +do_install:append () { + rm -rf ${D}${bindir} +} + +RDEPENDS:${PN} = " \ + cmake \ + python3-scikit-build \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-cmd2_2.3.3.bb b/meta-python/recipes-devtools/python/python3-cmd2_2.3.3.bb deleted file mode 100644 index d8a4fb5f23..0000000000 --- a/meta-python/recipes-devtools/python/python3-cmd2_2.3.3.bb +++ /dev/null @@ -1,23 +0,0 @@ -SUMMARY = "Extra features for standard library's cmd module" -HOMEPAGE = "https://github.com/python-cmd2/cmd2" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=4c527bcb481233ebcb803de975f42701" - -DEPENDS += "${PYTHON_PN}-setuptools-scm-native" - -SRC_URI[sha256sum] = "750d7eb04d55c3bc2a413e191bc177856f388102de47d11f2210a35266543640" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-attrs \ - ${PYTHON_PN}-colorama \ - ${PYTHON_PN}-pyperclip \ - ${PYTHON_PN}-wcwidth \ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-pydoc \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-numbers \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-cmd2_2.4.3.bb b/meta-python/recipes-devtools/python/python3-cmd2_2.4.3.bb new file mode 100644 index 0000000000..3d37e8b3c7 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-cmd2_2.4.3.bb @@ -0,0 +1,23 @@ +SUMMARY = "Extra features for standard library's cmd module" +HOMEPAGE = "https://github.com/python-cmd2/cmd2" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=fad7740aa21780c8b9a214f5b320b4ad" + +DEPENDS += "python3-setuptools-scm-native" + +SRC_URI[sha256sum] = "71873c11f72bd19e2b1db578214716f0d4f7c8fa250093c601265a9a717dee52" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "\ + python3-attrs \ + python3-colorama \ + python3-pyperclip \ + python3-wcwidth \ + python3-compression \ + python3-pydoc \ + python3-json \ + python3-numbers \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-colorama_0.4.4.bb b/meta-python/recipes-devtools/python/python3-colorama_0.4.6.bb index 54640de04e..3871244031 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 @@ -1,11 +1,14 @@ SUMMARY = "Cross-platform colored terminal text." HOMEPAGE = "https://github.com/tartley/colorama" -LICENSE = "BSD-2-Clause" +LICENSE = "BSD-3-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.1.bb b/meta-python/recipes-devtools/python/python3-coloredlogs_15.0.1.bb index 9eafbaa3c6..31f75eef62 100644 --- a/meta-python/recipes-devtools/python/python3-coloredlogs_15.0.1.bb +++ b/meta-python/recipes-devtools/python/python3-coloredlogs_15.0.1.bb @@ -8,16 +8,12 @@ SRC_URI[sha256sum] = "7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5 inherit pypi setuptools3 -do_compile:prepend() { - sed -ie "s/find_pth_directory(),/'',/g" ${S}/setup.py -} - do_install:append() { rm -rf ${D}${datadir} } RDEPENDS:${PN} += "\ - ${PYTHON_PN}-humanfriendly \ + python3-humanfriendly \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-colorlog_6.6.0.bb b/meta-python/recipes-devtools/python/python3-colorlog_6.8.2.bb index 2f8a0e5ca8..df5fdedfc8 100644 --- a/meta-python/recipes-devtools/python/python3-colorlog_6.6.0.bb +++ b/meta-python/recipes-devtools/python/python3-colorlog_6.8.2.bb @@ -7,4 +7,8 @@ inherit pypi setuptools3 PYPI_PACKAGE = "colorlog" -SRC_URI[sha256sum] = "344f73204009e4c83c5b6beb00b3c45dc70fcdae3c80db919e0a4171d006fde8" +SRC_URI[sha256sum] = "3e3e079a41feb5a1b64f978b5ea4f46040a94f11f0e8bbb8261e3dbbeca64d44" + +RDEPENDS:${PN} += "python3-logging" + +BBCLASSEXTEND += "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-colorzero_2.0.bb b/meta-python/recipes-devtools/python/python3-colorzero_2.0.bb 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.5.3.bb b/meta-python/recipes-devtools/python/python3-configargparse_1.7.bb index 7d21375548..1c49d891d2 100644 --- a/meta-python/recipes-devtools/python/python3-configargparse_1.5.3.bb +++ b/meta-python/recipes-devtools/python/python3-configargparse_1.7.bb @@ -3,19 +3,19 @@ HOMEPAGE = "https://github.com/bw2/ConfigArgParse" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=da746463714cc35999ed9a42339f2943" -SRC_URI[sha256sum] = "1b0b3cbf664ab59dada57123c81eff3d9737e0d11d8cf79e3d6eb10823f1739f" +SRC_URI[sha256sum] = "e7067471884de5478c58a511e529f0f9bd1c66bfef1dea90935438d6c23306d1" PYPI_PACKAGE = "ConfigArgParse" inherit pypi setuptools3 PACKAGECONFIG ?= "yaml" -PACKAGECONFIG[yaml] = ",,,${PYTHON_PN}-pyyaml" +PACKAGECONFIG[yaml] = ",,,python3-pyyaml" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-core \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-json \ + python3-core \ + python3-shell \ + python3-json \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-configobj_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..96e579c78d --- /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 python_setuptools_build_meta + +RDEPENDS:${PN} += " \ + python3-pprint \ + python3-six \ +" diff --git a/meta-python/recipes-devtools/python/python3-configparser_5.2.0.bb b/meta-python/recipes-devtools/python/python3-configparser_5.2.0.bb deleted file mode 100644 index e629331330..0000000000 --- a/meta-python/recipes-devtools/python/python3-configparser_5.2.0.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] = "1b35798fdf1713f1c3139016cfcbc461f09edbf099d1fb658d4b7479fcaa3daa" - -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 359c9d002c..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 7f9b0326fa..0000000000 --- a/meta-python/recipes-devtools/python/python3-constantly_15.1.0.bb +++ /dev/null @@ -1,11 +0,0 @@ -DESCRIPTION = "Symbolic constants in Python" -HOMEPAGE = "https://github.com/twisted/constantly" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=e393e4ddd223e3a74982efa784f89fd7" - -SRC_URI[md5sum] = "f0762f083d83039758e53f8cf0086eef" -SRC_URI[sha256sum] = "586372eb92059873e29eba4f9dec8381541b4d3834660707faf8ba59146dfc35" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += "${PYTHON_PN}-json" diff --git a/meta-python/recipes-devtools/python/python3-constantly_23.10.4.bb b/meta-python/recipes-devtools/python/python3-constantly_23.10.4.bb new file mode 100644 index 0000000000..2df501aaa6 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-constantly_23.10.4.bb @@ -0,0 +1,12 @@ +DESCRIPTION = "Symbolic constants in Python" +HOMEPAGE = "https://github.com/twisted/constantly" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=e393e4ddd223e3a74982efa784f89fd7" + +SRC_URI[sha256sum] = "aa92b70a33e2ac0bb33cd745eb61776594dc48764b06c35e0efd050b7f1c7cbd" + +inherit pypi python_poetry_core + +DEPENDS += "python3-versioneer-native" + +RDEPENDS:${PN} += "python3-json" diff --git a/meta-python/recipes-devtools/python/python3-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_6.1.2.bb b/meta-python/recipes-devtools/python/python3-coverage_6.1.2.bb deleted file mode 100644 index c456800c53..0000000000 --- a/meta-python/recipes-devtools/python/python3-coverage_6.1.2.bb +++ /dev/null @@ -1,12 +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] = "d9a635114b88c0ab462e0355472d00a180a5fbfd8511e7f18e4ac32652e7d972" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-sqlite3 \ -" diff --git a/meta-python/recipes-devtools/python/python3-coverage_7.6.1.bb b/meta-python/recipes-devtools/python/python3-coverage_7.6.1.bb new file mode 100644 index 0000000000..7749158f5b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-coverage_7.6.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] = "953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d" + +inherit pypi python_setuptools_build_meta + +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..125a7ad877 --- /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.1-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 df8f0d83d8..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.15.bb b/meta-python/recipes-devtools/python/python3-croniter_1.0.15.bb deleted file mode 100644 index e4058caab9..0000000000 --- a/meta-python/recipes-devtools/python/python3-croniter_1.0.15.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] = "a70dfc9d52de9fc1a886128b9148c89dd9e76b67d55f46516ca94d2d73d58219" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += " python3-dateutil python3-natsort" diff --git a/meta-python/recipes-devtools/python/python3-croniter_3.0.3.bb b/meta-python/recipes-devtools/python/python3-croniter_3.0.3.bb new file mode 100644 index 0000000000..b0cda74f48 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-croniter_3.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] = "34117ec1741f10a7bd0ec3ad7d8f0eb8fa457a2feb9be32e6a2250e158957668" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-dateutil \ + python3-natsort \ + python3-pytz \ +" diff --git a/meta-python/recipes-devtools/python/python3-cryptography-vectors_35.0.0.bb b/meta-python/recipes-devtools/python/python3-cryptography-vectors_35.0.0.bb deleted file mode 100644 index c0ab9c85c1..0000000000 --- a/meta-python/recipes-devtools/python/python3-cryptography-vectors_35.0.0.bb +++ /dev/null @@ -1,21 +0,0 @@ -SUMMARY = "Test vectors for the cryptography package." -HOMEPAGE = "https://cryptography.io/" -SECTION = "devel/python" -LICENSE = "Apache-2.0 | BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=8c3617db4fb6fae01f1d253ab91511e4 \ - file://LICENSE.APACHE;md5=4e168cce331e5c827d4c2b68a6200e1b \ - file://LICENSE.BSD;md5=5ae30ba4123bc4f2fa49aa0b0dce887b" - -SRC_URI[sha256sum] = "978ad96822c0e007a0a3d8187eb0eafbd9eb1d67b50cfac70277175e74957bfc" - -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/openssl3.patch b/meta-python/recipes-devtools/python/python3-cryptography/openssl3.patch deleted file mode 100644 index 25baa42cc9..0000000000 --- a/meta-python/recipes-devtools/python/python3-cryptography/openssl3.patch +++ /dev/null @@ -1,62 +0,0 @@ -Encourage our old python3-cryptography to at least start to work with OpenSSL 3. - -- Backport one patch to err.py to remove a symbol which has been removed in - OpenSSL 3, and isn't used in python3-cryptography. - (50ec692749b7e2e62685b443f5e629627b03987e) - -- Backport the detection of OpenSSL 3 and don't link to FIPS_mode/FIPS_mode_set - (parts of f08a7de651f9e6475c8c0a67d2a61ed8b669ddf6) - -This is *not* a complete backport of the 3.0 support, but is enough that packages -such as imgtool can import python3-cryptography and operate until the upgrade is -ready. - -Upstream-Status: Inappropriate -Signed-off-by: Ross Burton <ross.burton@arm.com> - -diff --git a/src/_cffi_src/openssl/cryptography.py b/src/_cffi_src/openssl/cryptography.py -index f24bee5a..920a86de 100644 ---- a/src/_cffi_src/openssl/cryptography.py -+++ b/src/_cffi_src/openssl/cryptography.py -@@ -35,6 +35,8 @@ INCLUDES = """ - - #define CRYPTOGRAPHY_OPENSSL_110F_OR_GREATER \ - (OPENSSL_VERSION_NUMBER >= 0x1010006f && !CRYPTOGRAPHY_IS_LIBRESSL) -+#define CRYPTOGRAPHY_OPENSSL_300_OR_GREATER \ -+ (OPENSSL_VERSION_NUMBER >= 0x30000000 && !CRYPTOGRAPHY_IS_LIBRESSL) - - #define CRYPTOGRAPHY_OPENSSL_LESS_THAN_110J \ - (OPENSSL_VERSION_NUMBER < 0x101000af || CRYPTOGRAPHY_IS_LIBRESSL) -@@ -54,6 +56,7 @@ INCLUDES = """ - - TYPES = """ - static const int CRYPTOGRAPHY_OPENSSL_110F_OR_GREATER; -+static const int CRYPTOGRAPHY_OPENSSL_300_OR_GREATER; - - static const int CRYPTOGRAPHY_OPENSSL_LESS_THAN_111; - static const int CRYPTOGRAPHY_OPENSSL_LESS_THAN_111B; -diff --git a/src/_cffi_src/openssl/err.py b/src/_cffi_src/openssl/err.py -index 0dd74146..42bab4d9 100644 ---- a/src/_cffi_src/openssl/err.py -+++ b/src/_cffi_src/openssl/err.py -@@ -40,7 +40,6 @@ void ERR_clear_error(void); - void ERR_put_error(int, int, int, const char *, int); - - int ERR_GET_LIB(unsigned long); --int ERR_GET_FUNC(unsigned long); - int ERR_GET_REASON(unsigned long); - - """ -diff --git a/src/_cffi_src/openssl/fips.py b/src/_cffi_src/openssl/fips.py -index c92bca49..38bfa231 100644 ---- a/src/_cffi_src/openssl/fips.py -+++ b/src/_cffi_src/openssl/fips.py -@@ -18,7 +18,7 @@ int FIPS_mode(void); - """ - - CUSTOMIZATIONS = """ --#if CRYPTOGRAPHY_IS_LIBRESSL -+#if CRYPTOGRAPHY_IS_LIBRESSL || CRYPTOGRAPHY_OPENSSL_300_OR_GREATER - static const long Cryptography_HAS_FIPS = 0; - int (*FIPS_mode_set)(int) = NULL; - int (*FIPS_mode)(void) = NULL; 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.2.bb b/meta-python/recipes-devtools/python/python3-cryptography_3.3.2.bb deleted file mode 100644 index a4c3344278..0000000000 --- a/meta-python/recipes-devtools/python/python3-cryptography_3.3.2.bb +++ /dev/null @@ -1,68 +0,0 @@ -SUMMARY = "Provides cryptographic recipes and primitives to python developers" -HOMEPAGE = "https://cryptography.io/" -SECTION = "devel/python" -LICENSE = "Apache-2.0 | BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=bf405a8056a6647e7d077b0e7bc36aba \ - file://LICENSE.APACHE;md5=4e168cce331e5c827d4c2b68a6200e1b \ - file://LICENSE.BSD;md5=5ae30ba4123bc4f2fa49aa0b0dce887b" - -LDSHARED += "-pthread" - -SRC_URI[sha256sum] = "5a60d3780149e13b7a6ff7ad6526b38846354d11a15e21068e57073e29e19bed" - -SRC_URI += " \ - file://run-ptest \ - file://h-test.patch \ - file://openssl3.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.7.bb b/meta-python/recipes-devtools/python/python3-cvxopt_1.3.2.bb index 1bcf18ab6f..d7d4b22fbd 100644 --- a/meta-python/recipes-devtools/python/python3-cvxopt_1.2.7.bb +++ b/meta-python/recipes-devtools/python/python3-cvxopt_1.3.2.bb @@ -1,11 +1,11 @@ SUMMARY = "Convex optimization package" HOMEPAGE = "http://cvxopt.org" -LICENSE = "GPL-3.0" -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;branch=master" -SRCREV = "d5a21cf1da62e4269176384b1ff62edac5579f94" +SRCREV = "3b718ee560b3b97d6255c55f0ed7f64cb4b72082" S = "${WORKDIR}/git" diff --git a/meta-python/recipes-devtools/python/python3-cycler_0.11.0.bb b/meta-python/recipes-devtools/python/python3-cycler_0.12.1.bb index 59492e8bfa..574083b61f 100644 --- a/meta-python/recipes-devtools/python/python3-cycler_0.11.0.bb +++ b/meta-python/recipes-devtools/python/python3-cycler_0.12.1.bb @@ -3,9 +3,9 @@ HOMEPAGE = "http://github.com/matplotlib/cycler" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=7713fe42cd766b15c710e19392bfa811" -SRC_URI[sha256sum] = "9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f" +SRC_URI[sha256sum] = "88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta RDEPENDS:${PN} += "\ python3-core \ diff --git a/meta-python/recipes-devtools/python/python3-cytoolz_0.12.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/0001-Use-version-from-packaging-module-instead-of-setupto.patch b/meta-python/recipes-devtools/python/python3-daemon/0001-Use-version-from-packaging-module-instead-of-setupto.patch new file mode 100644 index 0000000000..316f7d9618 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-daemon/0001-Use-version-from-packaging-module-instead-of-setupto.patch @@ -0,0 +1,44 @@ +From b7418ab4a3232431373bf0680c6b74fef06910de Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Sat, 10 Aug 2024 22:44:08 -0700 +Subject: [PATCH] Use version from packaging module instead of setuptools extern + +Fixes build problems when using PEP-575 build backend + + +Drop the patch on upgrading to >= 3.0.2 + +Upstream-Status: Backport [https://pagure.io/fork/khemraj/python-daemon/c/3bbc46967d35cd7e05677018bdc9d552efaeea3e?branch=main] + +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + test_version.py | 2 +- + version.py | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/test_version.py b/test_version.py +index c43cd36..d0a124d 100644 +--- a/test_version.py ++++ b/test_version.py +@@ -23,7 +23,7 @@ import docutils.writers + import setuptools + import setuptools.command + import setuptools.dist +-from setuptools.extern.packaging.version import InvalidVersion ++from packaging.version import InvalidVersion + import testscenarios + import testtools + +diff --git a/version.py b/version.py +index 20d3ef3..fbdc462 100644 +--- a/version.py ++++ b/version.py +@@ -36,7 +36,7 @@ import setuptools.command.build + import setuptools.command.build_py + import setuptools.command.egg_info + import setuptools.dist +-import setuptools.extern.packaging.version ++import packaging.version + + + def ensure_class_bases_begin_with(namespace, class_name, base_class): 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..cb85262b41 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-daemon_3.0.1.bb @@ -0,0 +1,19 @@ +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 python_setuptools_build_meta + +SRC_URI += "file://0001-Use-version-from-packaging-module-instead-of-setupto.patch" +SRC_URI[sha256sum] = "6c57452372f7eaff40934a1c03ad1826bf5e793558e87fef49131e6464b4dae5" + +PYPI_PACKAGE = "python-daemon" diff --git a/meta-python/recipes-devtools/python/python3-dasbus/run-ptest b/meta-python/recipes-devtools/python/python3-dasbus/run-ptest new file mode 100755 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-dasbus/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-dasbus_1.7.bb b/meta-python/recipes-devtools/python/python3-dasbus_1.7.bb new file mode 100644 index 0000000000..d1d294a284 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-dasbus_1.7.bb @@ -0,0 +1,32 @@ +SUMMARY = "Dasbus is a DBus library written in Python 3, based on GLib and inspired by pydbus." +HOMEPAGE = "https://dasbus.readthedocs.io" +SECTION = "devel" +LICENSE = "LGPL-2.1-or-later" +LIC_FILES_CHKSUM = "file://LICENSE;md5=1803fa9c2c3ce8cb06b4861d75310742" + +SRC_URI = "git://github.com/dasbus-project/dasbus.git;protocol=https;branch=master \ + file://run-ptest \ +" +SRCREV = "413cf9a0b7c231468f1d28d9a29dd8dd8bda15c5" + +S = "${WORKDIR}/git" + +inherit setuptools3 ptest + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ + + # Remove the problematic cases + # https://github.com/dasbus-project/dasbus/issues/128 + rm -rf ${D}${PTEST_PATH}/tests/lib_dbus.py + rm -rf ${D}${PTEST_PATH}/tests/test_dbus.py + rm -rf ${D}${PTEST_PATH}/tests/test_unix.py +} + +RDEPENDS:${PN} = "python3-pygobject" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" diff --git a/meta-python/recipes-devtools/python/python3-dateparser_1.1.0.bb b/meta-python/recipes-devtools/python/python3-dateparser_1.2.0.bb index 5b661a0863..a08564b3f5 100644 --- a/meta-python/recipes-devtools/python/python3-dateparser_1.1.0.bb +++ b/meta-python/recipes-devtools/python/python3-dateparser_1.2.0.bb @@ -3,7 +3,7 @@ HOMEPAGE = "https://github.com/scrapinghub/dateparser" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=3d3ed25571191e7aa3f55d0a6efe0051" -SRC_URI[sha256sum] = "faa2b97f51f3b5ff1ba2f17be90de2b733fb6191f89b4058787473e8202f3044" +SRC_URI[sha256sum] = "7975b43a4222283e0ae15be7b4999d08c9a70e2d378ac87385b1ccf2cffbbb30" PYPI_PACKAGE = "dateparser" @@ -12,9 +12,12 @@ inherit pypi setuptools3 CLEANBROKEN = "1" RDEPENDS:${PN} += " \ - ${PYTHON_PN}-dateutil \ - ${PYTHON_PN}-tzlocal \ - ${PYTHON_PN}-ruamel-yaml \ + python3-dateutil \ + python3-logging \ + python3-pytz \ + python3-regex \ + python3-ruamel-yaml \ + python3-tzlocal \ " -# Ommitted ${PYTHON_PN}-convertdate, ${PYTHON_PN}-jdatetime ${PYTHON_PN}-umalqurra +# Ommitted python3-convertdate, python3-jdatetime python3-umalqurra diff --git a/meta-python/recipes-devtools/python/python3-dateutil_2.8.2.bb b/meta-python/recipes-devtools/python/python3-dateutil_2.9.0.bb index cd0bdf6671..1f7a4a03fd 100644 --- a/meta-python/recipes-devtools/python/python3-dateutil_2.8.2.bb +++ b/meta-python/recipes-devtools/python/python3-dateutil_2.9.0.bb @@ -4,21 +4,21 @@ HOMEPAGE = "https://dateutil.readthedocs.org" LICENSE = "BSD-3-Clause & Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=e3155c7bdc71f66e02678411d2abf996" -SRC_URI[sha256sum] = "0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86" +SRC_URI[sha256sum] = "78e73e19c63f5b20ffa567001531680d939dc042bf7850431877645523c66709" PYPI_PACKAGE = "python-dateutil" -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 \ + python3-datetime \ + python3-numbers \ + python3-six \ + python3-stringold \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-dbus-fast_2.24.2.bb b/meta-python/recipes-devtools/python/python3-dbus-fast_2.24.2.bb new file mode 100644 index 0000000000..ccac699247 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-dbus-fast_2.24.2.bb @@ -0,0 +1,21 @@ +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] = "20c517dc70dbc940b8bf2e0f079abf3dfe821fdda3013641a17e3d8f18e131ae" + +PYPI_PACKAGE = "dbus_fast" + +inherit pypi python_poetry_core + +DEPENDS += " \ + python3-setuptools-native \ + python3-wheel-native \ + python3-cython-native \ + " + +RDEPENDS:${PN} += " \ + python3-core (>=3.7) \ + python3-async-timeout \ +" diff --git a/meta-python/recipes-devtools/python/python3-dbus-next_0.2.3.bb b/meta-python/recipes-devtools/python/python3-dbus-next_0.2.3.bb index 3ee11b9d55..9f6aa7ed7f 100644 --- a/meta-python/recipes-devtools/python/python3-dbus-next_0.2.3.bb +++ b/meta-python/recipes-devtools/python/python3-dbus-next_0.2.3.bb @@ -10,3 +10,8 @@ PYPI_PACKAGE = "dbus_next" inherit pypi setuptools3 BBCLASSEXTEND = "native nativesdk" + +RDEPENDS:${PN} += " \ + python3-asyncio \ + python3-xml \ +" diff --git a/meta-python/recipes-devtools/python/python3-dbussy/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 061893df3e..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,15 +1,16 @@ 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;branch=master;protocol=https" +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} += "\ python3-asyncio \ @@ -19,4 +20,3 @@ RDEPENDS:${PN} += "\ " BBCLASSEXTEND = "native nativesdk" - diff --git a/meta-python/recipes-devtools/python/python3-decorator_5.1.0.bb b/meta-python/recipes-devtools/python/python3-decorator_5.1.1.bb index 2e44c3d801..f330376243 100644 --- a/meta-python/recipes-devtools/python/python3-decorator_5.1.0.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] = "e59913af105b9860aa2c8d3272d9de5a56a4e608db9a2f167a8480b323d529a7" +SRC_URI[sha256sum] = "637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330" inherit pypi setuptools3 RDEPENDS:${PN} += "\ - ${PYTHON_PN}-stringold \ + 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 e5790f478c..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,7 +2,7 @@ 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" @@ -10,3 +10,5 @@ SRC_URI[sha256sum] = "1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51 inherit pypi setuptools3 BBCLASSEXTEND = "native" + +RDEPENDS:${PN} += "python3-xml" diff --git a/meta-python/recipes-devtools/python/python3-deprecated_1.2.13.bb b/meta-python/recipes-devtools/python/python3-deprecated_1.2.14.bb index 6ea47f4292..49d5f01c8f 100644 --- a/meta-python/recipes-devtools/python/python3-deprecated_1.2.13.bb +++ b/meta-python/recipes-devtools/python/python3-deprecated_1.2.14.bb @@ -4,10 +4,10 @@ LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=44288e26f4896bdab14072d4fa35ff01" PYPI_PACKAGE = "Deprecated" -SRC_URI[sha256sum] = "43ac5335da90c31c24ba028af536a91d41d53f9e6901ddb021bcc572ce44e38d" +SRC_URI[sha256sum] = "e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3" inherit pypi setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-wrapt \ + python3-wrapt \ " diff --git a/meta-python/recipes-devtools/python/python3-dill_0.3.4.bb b/meta-python/recipes-devtools/python/python3-dill_0.3.4.bb deleted file mode 100644 index ff0104cc8a..0000000000 --- a/meta-python/recipes-devtools/python/python3-dill_0.3.4.bb +++ /dev/null @@ -1,14 +0,0 @@ -SUMMARY = "Serialize all of python" -HOMEPAGE = "https://pypi.org/project/dill/" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=41adceb584fdde8323ddf9ad23c07fe5" - -SRC_URI[sha256sum] = "9f9734205146b2b353ab3fec9af0070237b6ddae78452af83d2fca84d739e675" - -inherit pypi setuptools3 - -PYPI_PACKAGE_EXT = "zip" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-multiprocessing \ -" 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..3481ec06bd --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-dill_0.3.8.bb @@ -0,0 +1,17 @@ +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 python_setuptools_build_meta + +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.8.0.bb b/meta-python/recipes-devtools/python/python3-dirty-equals_0.8.0.bb new file mode 100644 index 0000000000..584d787a7b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-dirty-equals_0.8.0.bb @@ -0,0 +1,26 @@ +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] = "798db3b9481b9a5024c0e520946507676ed2f0c65317d3e95bdce1a01657cf60" + +S = "${WORKDIR}/dirty_equals-${PV}" + +inherit pypi python_hatchling + +PYPI_PACKAGE = "dirty_equals" + +RDEPENDS:${PN} += " \ + python3-pytz \ + python3-core \ + python3-json \ + python3-netclient \ +" 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.6.0.bb b/meta-python/recipes-devtools/python/python3-distro_1.9.0.bb index 8aa2255670..08a9526783 100644 --- a/meta-python/recipes-devtools/python/python3-distro_1.6.0.bb +++ b/meta-python/recipes-devtools/python/python3-distro_1.9.0.bb @@ -5,8 +5,15 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=d2794c0df5b907fdace235a619d80314" PYPI_PACKAGE = "distro" -SRC_URI[sha256sum] = "83f5e5a09f9c5f68f60173de572930effbcc0287bb84fdc4426cb4168c088424" +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.24.bb b/meta-python/recipes-devtools/python/python3-django_2.2.24.bb deleted file mode 100644 index 982362bdd1..0000000000 --- a/meta-python/recipes-devtools/python/python3-django_2.2.24.bb +++ /dev/null @@ -1,13 +0,0 @@ -require python-django.inc - -# Pin to 2.2.x LTS releases ONLY for this recipe -UPSTREAM_CHECK_REGEX = "/${PYPI_PACKAGE}/(?P<pver>(2\.2\.\d*)+)/" - -inherit setuptools3 - -SRC_URI[md5sum] = "ebf3bbb7716a7b11029e860475b9a122" -SRC_URI[sha256sum] = "3339ff0e03dee13045aef6ae7b523edff75b6d726adf7a7a48f53d5a501f7db7" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-sqlparse \ -" diff --git a/meta-python/recipes-devtools/python/python3-django_3.2.5.bb b/meta-python/recipes-devtools/python/python3-django_3.2.5.bb deleted file mode 100644 index c10212c4cd..0000000000 --- a/meta-python/recipes-devtools/python/python3-django_3.2.5.bb +++ /dev/null @@ -1,13 +0,0 @@ -require python-django.inc -inherit setuptools3 - -SRC_URI[sha256sum] = "3da05fea54fdec2315b54a563d5b59f3b4e2b1e69c3a5841dda35019c01855cd" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-sqlparse \ -" - -# Set DEFAULT_PREFERENCE so that the LTS version of django is built by -# default. To build the 3.x branch, -# PREFERRED_VERSION_python3-django = "3.2.2" can be added to local.conf -DEFAULT_PREFERENCE = "-1" diff --git a/meta-python/recipes-devtools/python/python3-django_4.2.16.bb b/meta-python/recipes-devtools/python/python3-django_4.2.16.bb new file mode 100644 index 0000000000..9254e8b009 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-django_4.2.16.bb @@ -0,0 +1,14 @@ +require python-django.inc +inherit setuptools3 + +SRC_URI[sha256sum] = "6f1616c2786c408ce86ab7e10f792b8f15742f7b7b7460243929cb371e7f1dad" + +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.16" can be added to local.conf +DEFAULT_PREFERENCE = "-1" diff --git a/meta-python/recipes-devtools/python/python3-django_5.0.9.bb b/meta-python/recipes-devtools/python/python3-django_5.0.9.bb new file mode 100644 index 0000000000..b3fb301ede --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-django_5.0.9.bb @@ -0,0 +1,9 @@ +require python-django.inc +inherit python_setuptools_build_meta + +SRC_URI[sha256sum] = "6333870d342329b60174da3a60dbd302e533f3b0bb0971516750e974a99b5a39" + +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.2.bb index b05a8d817a..047aba137b 100644 --- a/meta-python/recipes-devtools/python/python3-djangorestframework_3.12.4.bb +++ b/meta-python/recipes-devtools/python/python3-djangorestframework_3.15.2.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] = "36fe88cd2d6c6bec23dca9804bab2ba5517a8bb9d8f47ebc68981b56840107ad" PYPI_PACKAGE = "djangorestframework" inherit pypi setuptools3 RDEPENDS:${PN} += "\ - ${PYTHON_PN}-django \ + python3-django \ " diff --git a/meta-python/recipes-devtools/python/python3-dnspython/run-ptest b/meta-python/recipes-devtools/python/python3-dnspython/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-dnspython/run-ptest +++ b/meta-python/recipes-devtools/python/python3-dnspython/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-dnspython_2.1.0.bb b/meta-python/recipes-devtools/python/python3-dnspython_2.1.0.bb deleted file mode 100644 index 5466b40614..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-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 40bc1868f4..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 \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { @@ -21,6 +21,6 @@ do_install_ptest() { } RDEPENDS:${PN} += "\ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-threading \ + python3-numbers \ + python3-threading \ " diff --git a/meta-python/recipes-devtools/python/python3-dt-schema_git.bb b/meta-python/recipes-devtools/python/python3-dt-schema_git.bb deleted file mode 100644 index 305cfa6b0f..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;branch=master;protocol=https" -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 9e4a13cff4..eeb013d4fe 100644 --- a/meta-python/recipes-devtools/python/python3-dynamic-dispatch_1.0.3.bb +++ b/meta-python/recipes-devtools/python/python3-dynamic-dispatch_1.0.3.bb @@ -5,11 +5,13 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=ea70b07c354e36056bd35e17c9c3face" inherit pypi setuptools3 -SRC_URI[md5sum] = "6bd3cc24427de753eed0656e89d5302c" SRC_URI[sha256sum] = "fbc676aaedc8ec542056c21e5e206b8b62b8d11c3f3c5cfb32b273936da89604" PYPI_PACKAGE = "dynamic_dispatch" +UPSTREAM_CHECK_URI = "https://pypi.org/project/dynamic-dispatch/" +UPSTREAM_CHECK_REGEX = "/dynamic-dispatch/(?P<pver>(\d+[\.\-_]*)+)" + DEPENDS += "python3-setuptools-scm-native" RDEPENDS:${PN} += "\ python3-typeguard \ diff --git a/meta-python/recipes-devtools/python/python3-ecdsa/run-ptest b/meta-python/recipes-devtools/python/python3-ecdsa/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-ecdsa/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-ecdsa_0.17.0.bb b/meta-python/recipes-devtools/python/python3-ecdsa_0.17.0.bb deleted file mode 100644 index 177019ccc2..0000000000 --- a/meta-python/recipes-devtools/python/python3-ecdsa_0.17.0.bb +++ /dev/null @@ -1,15 +0,0 @@ -SUMMARY = "ECDSA cryptographic signature library (pure python)" -SECTION = "devel/python" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=66ffc5e30f76cbb5358fe54b645e5a1d" - -DEPENDS += "python3-pip python3-pbr" - -PYPI_PACKAGE = "ecdsa" -SRC_URI[sha256sum] = "b9f500bb439e4153d0330610f5d26baaf18d17b8ced1bc54410d189385ea68aa" - -inherit pypi setuptools3 python3native - -RDEPENDS:${PN} += "python3-six python3-gmpy2 python3-pbr" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-ecdsa_0.19.0.bb b/meta-python/recipes-devtools/python/python3-ecdsa_0.19.0.bb new file mode 100644 index 0000000000..8e967f9259 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-ecdsa_0.19.0.bb @@ -0,0 +1,36 @@ +SUMMARY = "ECDSA cryptographic signature library (pure python)" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=66ffc5e30f76cbb5358fe54b645e5a1d" + +PYPI_PACKAGE = "ecdsa" +SRC_URI[sha256sum] = "60eaad1199659900dd0af521ed462b793bbdf867432b3948e87416ae4caf6bf8" + +inherit pypi setuptools3 python3native ptest + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-hypothesis \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/src/ecdsa/* ${D}${PTEST_PATH}/tests/ +} + +RDEPENDS:${PN} += " \ + python3-gmpy2 \ + python3-json \ + python3-six \ +" + +do_install:append() { + rm ${D}${PYTHON_SITEPACKAGES_DIR}/ecdsa/test_*.py +} + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-editor_1.0.4.bb b/meta-python/recipes-devtools/python/python3-editor_1.0.4.bb index dffc36169e..335461c435 100644 --- a/meta-python/recipes-devtools/python/python3-editor_1.0.4.bb +++ b/meta-python/recipes-devtools/python/python3-editor_1.0.4.bb @@ -10,3 +10,8 @@ PYPI_PACKAGE = "python-editor" inherit pypi setuptools3 BBCLASSEXTEND = "native nativesdk" + +RDEPENDS:${PN} += " \ + python3-io \ + python3-setuptools \ +" diff --git a/meta-python/recipes-devtools/python/python3-elementpath_2.4.0.bb b/meta-python/recipes-devtools/python/python3-elementpath_4.5.0.bb index ed55077e3f..937d968607 100644 --- a/meta-python/recipes-devtools/python/python3-elementpath_2.4.0.bb +++ b/meta-python/recipes-devtools/python/python3-elementpath_4.5.0.bb @@ -3,13 +3,17 @@ HOMEPAGE = "https://github.com/sissaschool/elementpath" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=5dbb7fb7d72da3921202dd7b995d3ecf" -SRC_URI[sha256sum] = "5b6801b3be94d48d213beb7b8ebad96addb35c95fc6a9c062c80e033b4a32fe8" +SRC_URI[sha256sum] = "affdc8de95af1a4c10d1d2ed79c6fa56b59c26c7fce64b73497569e9dea46998" PYPI_PACKAGE = "elementpath" inherit pypi setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-xml \ + python3-xml \ + python3-core \ + python3-numbers \ + python3-datetime \ + python3-stringold \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-email-validator_1.1.3.bb b/meta-python/recipes-devtools/python/python3-email-validator_1.1.3.bb deleted file mode 100644 index b81e39a151..0000000000 --- a/meta-python/recipes-devtools/python/python3-email-validator_1.1.3.bb +++ /dev/null @@ -1,13 +0,0 @@ -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[md5sum] = "25582cf3d415c7fdd44b980a095e0d53" -SRC_URI[sha256sum] = "aa237a65f6f4da067119b7df3f13e89c25c051327b2b5b66dc075f33d62480d7" - -PYPI_PACKAGE = "email_validator" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += "python3-dnspython python3-idna" diff --git a/meta-python/recipes-devtools/python/python3-email-validator_2.2.0.bb b/meta-python/recipes-devtools/python/python3-email-validator_2.2.0.bb new file mode 100644 index 0000000000..c17cce7237 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-email-validator_2.2.0.bb @@ -0,0 +1,12 @@ +SUMMARY = "A robust email address syntax and deliverability validation library." +SECTION = "devel/python" +LICENSE = "Unlicense" +LIC_FILES_CHKSUM = "file://LICENSE;md5=2890aee62bd2a4c3197e2059016a397e" + +SRC_URI[sha256sum] = "cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7" + +PYPI_PACKAGE = "email_validator" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-dnspython python3-idna" diff --git a/meta-python/recipes-devtools/python/python3-engineio_4.3.0.bb b/meta-python/recipes-devtools/python/python3-engineio_4.9.0.bb index 95edb860ac..790d1b44cf 100644 --- a/meta-python/recipes-devtools/python/python3-engineio_4.3.0.bb +++ b/meta-python/recipes-devtools/python/python3-engineio_4.9.0.bb @@ -5,7 +5,7 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=42d0a9e728978f0eeb759c3be91536b8" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta PYPI_PACKAGE = "python-engineio" @@ -17,4 +17,4 @@ RDEPENDS:${PN} += " \ python3-asyncio \ " -SRC_URI[sha256sum] = "fed35eeacfa21f53f1fc05ef0cadd65a50780364da3a2be7650eb92f928fdb11" +SRC_URI[sha256sum] = "e87459c15638e567711fd156e6f9c4a402668871bed79523f0ecfec744729ec7" diff --git a/meta-python/recipes-devtools/python/python3-et-xmlfile_1.1.0.bb b/meta-python/recipes-devtools/python/python3-et-xmlfile_1.1.0.bb index 7c66342ec4..50ae7fa5e4 100644 --- a/meta-python/recipes-devtools/python/python3-et-xmlfile_1.1.0.bb +++ b/meta-python/recipes-devtools/python/python3-et-xmlfile_1.1.0.bb @@ -10,7 +10,13 @@ LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=8227180126797a0148 SRC_URI[sha256sum] = "8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c" -RDEPENDS:${PN} += "${PYTHON_PN}-compression ${PYTHON_PN}-io ${PYTHON_PN}-pprint ${PYTHON_PN}-shell" +RDEPENDS:${PN} += " \ + python3-compression \ + python3-io \ + python3-pprint \ + python3-shell \ + python3-xml \ +" inherit setuptools3 pypi diff --git a/meta-python/recipes-devtools/python/python3-eth-abi_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.7.0.bb b/meta-python/recipes-devtools/python/python3-eth-hash_0.7.0.bb new file mode 100644 index 0000000000..0f548cf86f --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-eth-hash_0.7.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] = "bacdc705bfd85dadd055ecd35fd1b4f846b671add101427e089a4ca2e8db310a" + +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_5.0.0.bb b/meta-python/recipes-devtools/python/python3-eth-utils_5.0.0.bb new file mode 100644 index 0000000000..f0a5e24413 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-eth-utils_5.0.0.bb @@ -0,0 +1,18 @@ +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] = "a5eb9555f43f4579eb83cb84f9dda9f3d6663bbd4a5a6b693f8d35045f305a1f" + +PYPI_PACKAGE = "eth_utils" + +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 97a8aedd79..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.7.1.bb b/meta-python/recipes-devtools/python/python3-evdev_1.7.1.bb new file mode 100644 index 0000000000..f098ce4ab3 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-evdev_1.7.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] = "0c72c370bda29d857e188d931019c32651a9c1ea977c08c8d939b1ced1637fde" + +inherit pypi python_setuptools_build_meta + +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.33.0.bb b/meta-python/recipes-devtools/python/python3-eventlet_0.37.0.bb index 6a4449cf55..84de0d8e44 100644 --- a/meta-python/recipes-devtools/python/python3-eventlet_0.33.0.bb +++ b/meta-python/recipes-devtools/python/python3-eventlet_0.37.0.bb @@ -4,13 +4,14 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=56472ad6de4caf50e05332a34b66e778" -SRC_URI[sha256sum] = "80144f489c1bb273a51b6f96ff9785a382d2866b9bab1f5bd748385019f4141f" +SRC_URI[sha256sum] = "fa49bf5a549cdbaa06919679979ea022ac8f8f3cf0499f26849a1cd8e64c30b1" -inherit pypi setuptools3 +inherit pypi python_hatchling + +DEPENDS += "python3-hatch-vcs-native" RDEPENDS:${PN} += " \ - ${PYTHON_PN}-dnspython \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-distutils \ - ${PYTHON_PN}-greenlet \ + python3-dnspython \ + python3-six \ + python3-greenlet \ " diff --git a/meta-python/recipes-devtools/python/python3-execnet/run-ptest b/meta-python/recipes-devtools/python/python3-execnet/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-execnet/run-ptest +++ b/meta-python/recipes-devtools/python/python3-execnet/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-execnet_1.9.0.bb b/meta-python/recipes-devtools/python/python3-execnet_2.1.1.bb index 73bdd7007b..94c1a228e3 100644 --- a/meta-python/recipes-devtools/python/python3-execnet_1.9.0.bb +++ b/meta-python/recipes-devtools/python/python3-execnet_2.1.1.bb @@ -6,13 +6,16 @@ HOMEPAGE = "https://execnet.readthedocs.io/en/latest/" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=772fcdaca14b378878d05c7d857e6c3e" -DEPENDS += "python3-pip-native" +DEPENDS += "\ + python3-pip-native \ + python3-hatch-vcs-native \ +" SRC_URI += "file://run-ptest \ " -SRC_URI[sha256sum] = "8f694f3ba9cc92cab508b152dcfe322153975c29bda272e2fd7f3f00f36e47c5" +SRC_URI[sha256sum] = "5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3" -inherit ptest pypi setuptools3 +inherit ptest pypi python_hatchling do_install_ptest() { install -d ${D}${PTEST_PATH}/tests @@ -21,6 +24,7 @@ do_install_ptest() { RDEPENDS:${PN}-ptest += "\ python3-pytest \ + python3-unittest-automake-output \ " RDEPENDS:${PN} += "python3-core python3-crypt python3-ctypes python3-fcntl python3-io python3-shell python3-threading" diff --git a/meta-python/recipes-devtools/python/python3-executing_2.1.0.bb b/meta-python/recipes-devtools/python/python3-executing_2.1.0.bb new file mode 100644 index 0000000000..4df84e638a --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-executing_2.1.0.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] = "8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab" 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..2099d791dd 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.1-only" LIC_FILES_CHKSUM = "file://LICENSE;md5=c73b943dc75f6f65e007c56ac6515c8f" SRC_URI[md5sum] = "0b85b418018746d63ed66b55465697a9" diff --git a/meta-python/recipes-devtools/python/python3-fasteners_0.16.3.bb b/meta-python/recipes-devtools/python/python3-fasteners_0.19.bb index 26549c151f..22e58c5668 100644 --- a/meta-python/recipes-devtools/python/python3-fasteners_0.16.3.bb +++ b/meta-python/recipes-devtools/python/python3-fasteners_0.19.bb @@ -3,11 +3,11 @@ HOMEPAGE = "https://github.com/harlowja/fasteners" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=4476c4be31402271e101d9a4a3430d52" -SRC_URI[sha256sum] = "b1ab4e5adfbc28681ce44b3024421c4f567e705cc3963c732bf1cba3348307de" +SRC_URI[sha256sum] = "b4f37c3ac52d8a445af3a66bce57b33b5e90b97c696b7b984f530cf8f0ded09c" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta RDEPENDS:${PN} += "\ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-fcntl \ + python3-logging \ + python3-fcntl \ " diff --git a/meta-python/recipes-devtools/python/python3-fastjsonschema/run-ptest b/meta-python/recipes-devtools/python/python3-fastjsonschema/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-fastjsonschema/run-ptest +++ b/meta-python/recipes-devtools/python/python3-fastjsonschema/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-fastjsonschema_2.15.1.bb b/meta-python/recipes-devtools/python/python3-fastjsonschema_2.20.0.bb index a8bc0c10d4..4dd9444a9a 100644 --- a/meta-python/recipes-devtools/python/python3-fastjsonschema_2.15.1.bb +++ b/meta-python/recipes-devtools/python/python3-fastjsonschema_2.20.0.bb @@ -6,33 +6,35 @@ HOMEPAGE = "https://github.com/seznam/python-fastjsonschema" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=18950e8362b69c0c617b42b8bd8e7532" -SRCREV = "1e214911fe83dbaeea3d50dfb3a539118de8a442" -PYPI_SRC_URI = "git://github.com/horejsek/python-fastjsonschema;protocol=https;branch=master" +SRC_URI[sha256sum] = "3d48fc5300ee96f5d116f10fe6f28d938e6008f59a6a025c2649475b87f76a23" 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/ } +# python3-misc for timeit.py RDEPENDS:${PN}-ptest += "\ python3-colorama \ python3-jsonschema \ + python3-misc \ 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.2.1.bb b/meta-python/recipes-devtools/python/python3-fastnumbers_3.2.1.bb deleted file mode 100644 index 0db33052ff..0000000000 --- a/meta-python/recipes-devtools/python/python3-fastnumbers_3.2.1.bb +++ /dev/null @@ -1,10 +0,0 @@ -SUMMARY = "Super-fast and clean conversions to numbers." -SECTION = "devel/python" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=6a96e5ad780a0eea866ecccec4463517" - -PYPI_PACKAGE = "fastnumbers" - -SRC_URI[sha256sum] = "44f92b42e7e9f2ed77ba5cb7d664f05c17e43d4586718ed6cd3b3fffa0e67f33" - -inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-fastnumbers_5.1.0.bb b/meta-python/recipes-devtools/python/python3-fastnumbers_5.1.0.bb new file mode 100644 index 0000000000..01aa8b3b44 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-fastnumbers_5.1.0.bb @@ -0,0 +1,10 @@ +SUMMARY = "Super-fast and clean conversions to numbers." +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=d32431d1b650010945da4e078011c8fa" + +PYPI_PACKAGE = "fastnumbers" + +SRC_URI[sha256sum] = "e092d33f8b95c3171a2fb34e579efe0c54b0290dd7f96ffaa2762437601d90a7" + +inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-feedformatter_0.4.bb b/meta-python/recipes-devtools/python/python3-feedformatter_0.4.bb deleted file mode 100644 index 6932b3b549..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;branch=master;protocol=https" -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-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..0491d02b1d --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-file-magic_0.4.1.bb @@ -0,0 +1,19 @@ +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" + +inherit pypi python_setuptools_build_meta + +RDEPENDS:${PN} += " \ + file \ + python3-core \ + python3-ctypes \ + python3-threading \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-filelock_3.16.1.bb b/meta-python/recipes-devtools/python/python3-filelock_3.16.1.bb new file mode 100644 index 0000000000..abafa1245b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-filelock_3.16.1.bb @@ -0,0 +1,22 @@ +# 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] = "c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435" + +BBCLASSEXTEND = "native nativesdk" +inherit pypi python_hatchling + +DEPENDS += "\ + python3-hatch-vcs-native \ +" + +RDEPENDS:${PN} += " \ + python3-core \ + python3-logging \ + python3-asyncio \ +" diff --git a/meta-python/recipes-devtools/python/python3-flask-babel_2.0.0.bb b/meta-python/recipes-devtools/python/python3-flask-babel_2.0.0.bb deleted file mode 100644 index 657c190ec5..0000000000 --- a/meta-python/recipes-devtools/python/python3-flask-babel_2.0.0.bb +++ /dev/null @@ -1,16 +0,0 @@ -DESCRIPTION = "i18n and l10n support for Flask based on babel and pytz" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=51917f3e8e858f5ae295a7d0e2eb3cc9" - -SRC_URI[md5sum] = "50d5e92d96ef58787bf85b5a1b0a5567" -SRC_URI[sha256sum] = "f9faf45cdb2e1a32ea2ec14403587d4295108f35017a7821a2b1acb8cfd9257d" - -PYPI_PACKAGE = "Flask-Babel" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-speaklater \ - ${PYTHON_PN}-babel \ - ${PYTHON_PN}-flask \ - " diff --git a/meta-python/recipes-devtools/python/python3-flask-babel_4.0.0.bb b/meta-python/recipes-devtools/python/python3-flask-babel_4.0.0.bb new file mode 100644 index 0000000000..b445ec0e1c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-flask-babel_4.0.0.bb @@ -0,0 +1,15 @@ +DESCRIPTION = "i18n and l10n support for Flask based on babel and pytz" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=51917f3e8e858f5ae295a7d0e2eb3cc9" + +SRC_URI[sha256sum] = "dbeab4027a3f4a87678a11686496e98e1492eb793cbdd77ab50f4e9a2602a593" + +PYPI_PACKAGE = "flask_babel" + +inherit pypi python_poetry_core + +RDEPENDS:${PN} += "\ + python3-speaklater \ + python3-babel \ + python3-flask \ + " diff --git a/meta-python/recipes-devtools/python/python3-flask-cors/CVE-2024-6221.patch b/meta-python/recipes-devtools/python/python3-flask-cors/CVE-2024-6221.patch new file mode 100644 index 0000000000..9049b2ffe6 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-flask-cors/CVE-2024-6221.patch @@ -0,0 +1,110 @@ +From 7ae310c56ac30e0b94fb42129aa377bf633256ec Mon Sep 17 00:00:00 2001 +From: Adriano Sela Aviles <adriano.selaviles@gmail.com> +Date: Fri, 30 Aug 2024 12:14:31 -0400 +Subject: [PATCH] Backwards Compatible Fix for CVE-2024-6221 (#363) + +CVE: CVE-2024-6221 + +Upstream-Status: Backport [https://github.com/corydolphin/flask-cors/commit/7ae310c56ac30e0b94fb42129aa377bf633256ec] + +Signed-off-by: Soumya Sambu <soumya.sambu@windriver.com> +--- + docs/configuration.rst | 14 ++++++++++++++ + flask_cors/core.py | 8 +++++--- + flask_cors/extension.py | 16 ++++++++++++++++ + 3 files changed, 35 insertions(+), 3 deletions(-) + +diff --git a/docs/configuration.rst b/docs/configuration.rst +index 91282d3..c750cf4 100644 +--- a/docs/configuration.rst ++++ b/docs/configuration.rst +@@ -23,6 +23,19 @@ CORS_ALLOW_HEADERS (:py:class:`~typing.List` or :py:class:`str`) + Headers to accept from the client. + Headers in the :http:header:`Access-Control-Request-Headers` request header (usually part of the preflight OPTIONS request) matching headers in this list will be included in the :http:header:`Access-Control-Allow-Headers` response header. + ++CORS_ALLOW_PRIVATE_NETWORK (:py:class:`bool`) ++ If True, the response header :http:header:`Access-Control-Allow-Private-Network` ++ will be set with the value 'true' whenever the request header ++ :http:header:`Access-Control-Request-Private-Network` has a value 'true'. ++ ++ If False, the reponse header :http:header:`Access-Control-Allow-Private-Network` ++ will be set with the value 'false' whenever the request header ++ :http:header:`Access-Control-Request-Private-Network` has a value of 'true'. ++ ++ If the request header :http:header:`Access-Control-Request-Private-Network` is ++ not present or has a value other than 'true', the response header ++ :http:header:`Access-Control-Allow-Private-Network` will not be set. ++ + CORS_ALWAYS_SEND (:py:class:`bool`) + Usually, if a request doesn't include an :http:header:`Origin` header, the client did not request CORS. + This means we can ignore this request. +@@ -83,6 +96,7 @@ Default values + ~~~~~~~~~~~~~~ + + * CORS_ALLOW_HEADERS: "*" ++* CORS_ALLOW_PRIVATE_NETWORK: True + * CORS_ALWAYS_SEND: True + * CORS_AUTOMATIC_OPTIONS: True + * CORS_EXPOSE_HEADERS: None +diff --git a/flask_cors/core.py b/flask_cors/core.py +index 5358036..bd011f4 100644 +--- a/flask_cors/core.py ++++ b/flask_cors/core.py +@@ -36,7 +36,7 @@ CONFIG_OPTIONS = ['CORS_ORIGINS', 'CORS_METHODS', 'CORS_ALLOW_HEADERS', + 'CORS_MAX_AGE', 'CORS_SEND_WILDCARD', + 'CORS_AUTOMATIC_OPTIONS', 'CORS_VARY_HEADER', + 'CORS_RESOURCES', 'CORS_INTERCEPT_EXCEPTIONS', +- 'CORS_ALWAYS_SEND'] ++ 'CORS_ALWAYS_SEND', 'CORS_ALLOW_PRIVATE_NETWORK'] + # Attribute added to request object by decorator to indicate that CORS + # was evaluated, in case the decorator and extension are both applied + # to a view. +@@ -56,7 +56,8 @@ DEFAULT_OPTIONS = dict(origins='*', + vary_header=True, + resources=r'/*', + intercept_exceptions=True, +- always_send=True) ++ always_send=True, ++ allow_private_network=True) + + + def parse_resources(resources): +@@ -186,7 +187,8 @@ def get_cors_headers(options, request_headers, request_method): + + if ACL_REQUEST_HEADER_PRIVATE_NETWORK in request_headers \ + and request_headers.get(ACL_REQUEST_HEADER_PRIVATE_NETWORK) == 'true': +- headers[ACL_RESPONSE_PRIVATE_NETWORK] = 'true' ++ allow_private_network = 'true' if options.get('allow_private_network') else 'false' ++ headers[ACL_RESPONSE_PRIVATE_NETWORK] = allow_private_network + + # This is a preflight request + # http://www.w3.org/TR/cors/#resource-preflight-requests +diff --git a/flask_cors/extension.py b/flask_cors/extension.py +index c00cbff..694953f 100644 +--- a/flask_cors/extension.py ++++ b/flask_cors/extension.py +@@ -136,6 +136,22 @@ class CORS(object): + + Default : True + :type vary_header: bool ++ ++ :param allow_private_network: ++ If True, the response header `Access-Control-Allow-Private-Network` ++ will be set with the value 'true' whenever the request header ++ `Access-Control-Request-Private-Network` has a value 'true'. ++ ++ If False, the reponse header `Access-Control-Allow-Private-Network` ++ will be set with the value 'false' whenever the request header ++ `Access-Control-Request-Private-Network` has a value of 'true'. ++ ++ If the request header `Access-Control-Request-Private-Network` is ++ not present or has a value other than 'true', the response header ++ `Access-Control-Allow-Private-Network` will not be set. ++ ++ Default : True ++ :type allow_private_network: bool + """ + + def __init__(self, app=None, **kwargs): +-- +2.40.0 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..77b51c5515 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-flask-cors_4.0.0.bb @@ -0,0 +1,20 @@ +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 += " \ + file://CVE-2024-6221.patch \ +" + +SRC_URI[sha256sum] = "f268522fcb2f73e2ecdde1ef45e2fd5c71cc48fe03cffb4b441c6d1b40684eb0" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-flask" diff --git a/meta-python/recipes-devtools/python/python3-flask-httpauth_4.8.0.bb b/meta-python/recipes-devtools/python/python3-flask-httpauth_4.8.0.bb new file mode 100644 index 0000000000..51b907e6db --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-flask-httpauth_4.8.0.bb @@ -0,0 +1,14 @@ +SUMMARY = "Simple extension that provides Basic and Digest HTTP authentication for Flask routes." +HOMEPAGE = "https://github.com/miguelgrinberg/flask-httpauth" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3b69377f79f3f48c661701236d5a6a85" + +inherit pypi python_setuptools_build_meta + +PYPI_PACKAGE = "Flask-HTTPAuth" + +SRC_URI[sha256sum] = "66568a05bc73942c65f1e2201ae746295816dc009edd84b482c44c758d75097a" + +RDEPENDS:${PN} += "\ + python3-flask \ + " diff --git a/meta-python/recipes-devtools/python/python3-flask-jsonpify_1.5.0.bb b/meta-python/recipes-devtools/python/python3-flask-jsonpify_1.5.0.bb index 68eb2cefe7..76c6fb7731 100644 --- a/meta-python/recipes-devtools/python/python3-flask-jsonpify_1.5.0.bb +++ b/meta-python/recipes-devtools/python/python3-flask-jsonpify_1.5.0.bb @@ -11,4 +11,4 @@ SRC_URI[sha256sum] = "8ac4c732aa5b11d9f6c2de58065d3b669f139518ca8f529bce943817e2 inherit pypi setuptools3 -RDEPENDS:${PN} += "${PYTHON_PN}-flask" +RDEPENDS:${PN} += "python3-flask" diff --git a/meta-python/recipes-devtools/python/python3-flask-jwt-extended_4.6.0.bb b/meta-python/recipes-devtools/python/python3-flask-jwt-extended_4.6.0.bb new file mode 100644 index 0000000000..cc07c92f47 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-flask-jwt-extended_4.6.0.bb @@ -0,0 +1,16 @@ +SUMMARY = "Extended JWT integration with Flask" +HOMEPAGE = "https://github.com/vimalloc/flask-jwt-extended" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=9166295d7c482b9440bbb2b5c0fa43ac" + +inherit pypi setuptools3 + +PYPI_PACKAGE = "Flask-JWT-Extended" + +SRC_URI[sha256sum] = "9215d05a9413d3855764bcd67035e75819d23af2fafb6b55197eb5a3313fdfb2" + +RDEPENDS:${PN} += "\ + python3-werkzeug \ + python3-flask \ + python3-pyjwt \ + " diff --git a/meta-python/recipes-devtools/python/python3-flask-jwt_0.3.2.bb b/meta-python/recipes-devtools/python/python3-flask-jwt_0.3.2.bb index f2eb34d0f7..35bcbc00ae 100644 --- a/meta-python/recipes-devtools/python/python3-flask-jwt_0.3.2.bb +++ b/meta-python/recipes-devtools/python/python3-flask-jwt_0.3.2.bb @@ -11,4 +11,4 @@ SRC_URI[sha256sum] = "49c0672fbde0f1cd3374bd834918d28956e3c521c7e00089cdc5380d32 inherit pypi setuptools3 -RDEPENDS:${PN} += "${PYTHON_PN}-pyjwt ${PYTHON_PN}-flask" +RDEPENDS:${PN} += "python3-pyjwt python3-flask" diff --git a/meta-python/recipes-devtools/python/python3-flask-login_0.5.0.bb b/meta-python/recipes-devtools/python/python3-flask-login_0.6.3.bb index b03929104d..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 e568f7fac2..1aca3a1619 100644 --- a/meta-python/recipes-devtools/python/python3-flask-mail_0.9.1.bb +++ b/meta-python/recipes-devtools/python/python3-flask-mail_0.9.1.bb @@ -11,4 +11,7 @@ PYPI_PACKAGE = "Flask-Mail" inherit pypi setuptools3 -RDEPENDS:${PN} = "${PYTHON_PN}-flask" +RDEPENDS:${PN} = " \ + python3-blinker \ + python3-flask \ +" diff --git a/meta-python/recipes-devtools/python/python3-flask-marshmallow_1.2.1.bb b/meta-python/recipes-devtools/python/python3-flask-marshmallow_1.2.1.bb new file mode 100644 index 0000000000..8408ebd7b0 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-flask-marshmallow_1.2.1.bb @@ -0,0 +1,15 @@ +SUMMARY = "Flask + marshmallow for beautiful APIs" +HOMEPAGE = "https://github.com/marshmallow-code/flask-marshmallow" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=27586b20700d7544c06933afe56f7df4" + +inherit pypi python_setuptools_build_meta + +PYPI_PACKAGE = "flask_marshmallow" + +SRC_URI[sha256sum] = "00ee96399ed664963afff3b5d6ee518640b0f91dbc2aace2b5abcf32f40ef23a" + +RDEPENDS:${PN} += "\ + python3-flask \ + python3-marshmallow \ + " diff --git a/meta-python/recipes-devtools/python/python3-flask-migrate_3.1.0.bb b/meta-python/recipes-devtools/python/python3-flask-migrate_4.0.7.bb index 7a7c3fa3f3..bfd854ac05 100644 --- a/meta-python/recipes-devtools/python/python3-flask-migrate_3.1.0.bb +++ b/meta-python/recipes-devtools/python/python3-flask-migrate_4.0.7.bb @@ -2,14 +2,14 @@ DESCRIPTION = "SQLAlchemy database migrations for Flask applications using Alemb LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=3b69377f79f3f48c661701236d5a6a85" -SRC_URI[sha256sum] = "57d6060839e3a7f150eaab6fe4e726d9e3e7cffe2150fb223d73f92421c6d1d9" +SRC_URI[sha256sum] = "dff7dd25113c210b069af280ea713b883f3840c1e3455274745d7355778c8622" PYPI_PACKAGE = "Flask-Migrate" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta RDEPENDS:${PN} += "\ - ${PYTHON_PN}-flask-sqlalchemy \ - ${PYTHON_PN}-alembic \ - ${PYTHON_PN}-flask \ + python3-flask-sqlalchemy \ + python3-alembic \ + python3-flask \ " diff --git a/meta-python/recipes-devtools/python/python3-flask-nav_0.6.bb b/meta-python/recipes-devtools/python/python3-flask-nav_0.6.bb index d7edba25c1..3855909fbc 100644 --- a/meta-python/recipes-devtools/python/python3-flask-nav_0.6.bb +++ b/meta-python/recipes-devtools/python/python3-flask-nav_0.6.bb @@ -10,6 +10,6 @@ PYPI_PACKAGE = "flask-nav" inherit pypi setuptools3 RDEPENDS:${PN} += "\ - ${PYTHON_PN}-blinker \ - ${PYTHON_PN}-flask \ + python3-blinker \ + python3-flask \ " diff --git a/meta-python/recipes-devtools/python/python3-flask-pymongo_2.3.0.bb b/meta-python/recipes-devtools/python/python3-flask-pymongo_2.3.0.bb index a995a2ea39..1cd4a4b699 100644 --- a/meta-python/recipes-devtools/python/python3-flask-pymongo_2.3.0.bb +++ b/meta-python/recipes-devtools/python/python3-flask-pymongo_2.3.0.bb @@ -12,6 +12,6 @@ PYPI_PACKAGE = "Flask-PyMongo" inherit pypi setuptools3 -DEPENDS = "${PYTHON_PN}-vcversioner ${PYTHON_PN}-vcversioner-native" +DEPENDS = "python3-vcversioner python3-vcversioner-native" -RDEPENDS:${PN} = "${PYTHON_PN}-pymongo ${PYTHON_PN}-flask" +RDEPENDS:${PN} = "python3-pymongo python3-flask" diff --git a/meta-python/recipes-devtools/python/python3-flask-restful_0.3.9.bb b/meta-python/recipes-devtools/python/python3-flask-restful_0.3.10.bb index 294e3b0928..8ea455c633 100644 --- a/meta-python/recipes-devtools/python/python3-flask-restful_0.3.9.bb +++ b/meta-python/recipes-devtools/python/python3-flask-restful_0.3.10.bb @@ -6,10 +6,10 @@ HOMEPAGE = "https://github.com/flask-restful/flask-restful" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=685bb55ed99a366bb431995f5eef2783" -SRC_URI[sha256sum] = "ccec650b835d48192138c85329ae03735e6ced58e9b2d9c2146d6c84c06fa53e" +SRC_URI[sha256sum] = "fe4af2ef0027df8f9b4f797aba20c5566801b6ade995ac63b588abf1a59cec37" inherit pypi setuptools3 PYPI_PACKAGE = "Flask-RESTful" -RDEPENDS:${PN} = "${PYTHON_PN}-flask" +RDEPENDS:${PN} = "python3-flask" diff --git a/meta-python/recipes-devtools/python/python3-flask-restx_1.3.0.bb b/meta-python/recipes-devtools/python/python3-flask-restx_1.3.0.bb new file mode 100644 index 0000000000..9c2a1e9a8b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-flask-restx_1.3.0.bb @@ -0,0 +1,13 @@ +DESCRIPTION = "Fully featured framework for fast, easy and documented API development with Flask" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=c96dd911c6d9e32868b6bc667a38a3e2" + +SRC_URI[sha256sum] = "4f3d3fa7b6191fcc715b18c201a12cd875176f92ba4acc61626ccfd571ee1728" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-aniso8601 \ + python3-jsonschema \ + python3-pytz \ +" diff --git a/meta-python/recipes-devtools/python/python3-flask-script_2.0.6.bb b/meta-python/recipes-devtools/python/python3-flask-script_2.0.6.bb deleted file mode 100644 index 9f885191be..0000000000 --- a/meta-python/recipes-devtools/python/python3-flask-script_2.0.6.bb +++ /dev/null @@ -1,2 +0,0 @@ -inherit pypi setuptools3 -require python-flask-script.inc diff --git a/meta-python/recipes-devtools/python/python3-flask-socketio_5.1.1.bb b/meta-python/recipes-devtools/python/python3-flask-socketio_5.3.6.bb index 3d7a1cb6a8..6b76e03f8d 100644 --- a/meta-python/recipes-devtools/python/python3-flask-socketio_5.1.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] = "1efdaacc7a26e94f2b197a80079b1058f6aa644a6094c0a322349e2b9c41f6b1" +SRC_URI[sha256sum] = "bb8f9f9123ef47632f5ce57a33514b0c0023ec3696b2384457f0fcaa5b70501c" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-flask \ - ${PYTHON_PN}-socketio \ + python3-flask \ + python3-socketio \ " diff --git a/meta-python/recipes-devtools/python/python3-flask-sqlalchemy_2.5.1.bb b/meta-python/recipes-devtools/python/python3-flask-sqlalchemy_2.5.1.bb deleted file mode 100644 index 3aa6303da7..0000000000 --- a/meta-python/recipes-devtools/python/python3-flask-sqlalchemy_2.5.1.bb +++ /dev/null @@ -1,11 +0,0 @@ -DESCRIPTION = "Adds SQLAlchemy support to your Flask application." -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=ffeffa59c90c9c4a033c7574f8f3fb75" - -SRC_URI[sha256sum] = "2bda44b43e7cacb15d4e05ff3cc1f8bc97936cc464623424102bfc2c35e95912" - -PYPI_PACKAGE = "Flask-SQLAlchemy" - -inherit pypi setuptools3 - -RDEPENDS:${PN} = "${PYTHON_PN}-sqlalchemy ${PYTHON_PN}-flask" diff --git a/meta-python/recipes-devtools/python/python3-flask-sqlalchemy_3.1.1.bb b/meta-python/recipes-devtools/python/python3-flask-sqlalchemy_3.1.1.bb new file mode 100644 index 0000000000..f5fe1cc446 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-flask-sqlalchemy_3.1.1.bb @@ -0,0 +1,13 @@ +DESCRIPTION = "Adds SQLAlchemy support to your Flask application." +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=ffeffa59c90c9c4a033c7574f8f3fb75" + +SRC_URI[sha256sum] = "e4b68bb881802dda1a7d878b2fc84c06d1ee57fb40b874d3dc97dabfa36b8312" + +PYPI_PACKAGE = "flask_sqlalchemy" +UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/Flask-SQLAlchemy" +UPSTREAM_CHECK_REGEX = "/Flask-SQLAlchemy/(?P<pver>(\d+[\.\-_]*)+)" + +inherit pypi python_setuptools_build_meta + +RDEPENDS:${PN} = "python3-sqlalchemy python3-flask" diff --git a/meta-python/recipes-devtools/python/python3-flask-uploads_0.2.1.bb b/meta-python/recipes-devtools/python/python3-flask-uploads_0.2.1.bb index 388e257a8b..9ac321dec7 100644 --- a/meta-python/recipes-devtools/python/python3-flask-uploads_0.2.1.bb +++ b/meta-python/recipes-devtools/python/python3-flask-uploads_0.2.1.bb @@ -10,5 +10,5 @@ PYPI_PACKAGE = "Flask-Uploads" inherit pypi setuptools3 RDEPENDS:${PN} += "\ - ${PYTHON_PN}-flask \ + python3-flask \ " diff --git a/meta-python/recipes-devtools/python/python3-flask-user_0.6.19.bb b/meta-python/recipes-devtools/python/python3-flask-user_0.6.19.bb index fbacf2e996..ac449361a4 100644 --- a/meta-python/recipes-devtools/python/python3-flask-user_0.6.19.bb +++ b/meta-python/recipes-devtools/python/python3-flask-user_0.6.19.bb @@ -13,7 +13,12 @@ PYPI_PACKAGE = "Flask-User" inherit pypi setuptools3 -RDEPENDS:${PN} = "${PYTHON_PN}-flask \ - ${PYTHON_PN}-flask-login \ - ${PYTHON_PN}-flask-mail \ - ${PYTHON_PN}-babel" +RDEPENDS:${PN} = " \ + python3-babel \ + python3-blinker \ + python3-flask \ + python3-flask-login \ + python3-flask-mail \ + python3-flask-wtf \ + python3-passlib \ +" diff --git a/meta-python/recipes-devtools/python/python3-flask-wtf_0.15.1.bb b/meta-python/recipes-devtools/python/python3-flask-wtf_0.15.1.bb deleted file mode 100644 index aebc1344f8..0000000000 --- a/meta-python/recipes-devtools/python/python3-flask-wtf_0.15.1.bb +++ /dev/null @@ -1,16 +0,0 @@ -DESCRIPTION = "Simple integration of Flask and WTForms." -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=3ca6bb31670492f791e6a9f2fb9f8a80" - -SRC_URI[sha256sum] = "ff177185f891302dc253437fe63081e7a46a4e99aca61dfe086fb23e54fff2dc" - -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/run-ptest b/meta-python/recipes-devtools/python/python3-flask/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-flask/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-flask_2.0.2.bb b/meta-python/recipes-devtools/python/python3-flask_2.0.2.bb deleted file mode 100644 index e3f1df3562..0000000000 --- a/meta-python/recipes-devtools/python/python3-flask_2.0.2.bb +++ /dev/null @@ -1,23 +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[sha256sum] = "7b2fb8e934ddd50731893bdcdb00fc8c0315916f9fcd50d22c7cc1a95ab634e2" - -PYPI_PACKAGE = "Flask" - -inherit pypi setuptools3 - -CLEANBROKEN = "1" - -RDEPENDS:${PN} = " \ - ${PYTHON_PN}-werkzeug \ - ${PYTHON_PN}-jinja2 \ - ${PYTHON_PN}-itsdangerous \ - ${PYTHON_PN}-click \ - ${PYTHON_PN}-profile \ -" diff --git a/meta-python/recipes-devtools/python/python3-flask_3.0.3.bb b/meta-python/recipes-devtools/python/python3-flask_3.0.3.bb new file mode 100644 index 0000000000..de755dc294 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-flask_3.0.3.bb @@ -0,0 +1,38 @@ +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.txt;md5=ffeffa59c90c9c4a033c7574f8f3fb75" + +SRC_URI[sha256sum] = "ceb27b0af3823ea2737928a4d99d125a06175b8512c445cbd9a9ce200ef76842" + +SRC_URI += " \ + file://run-ptest \ +" + +UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/Flask" +UPSTREAM_CHECK_REGEX = "/Flask/(?P<pver>(\d+[\.\-_]*)+)" + +inherit pypi python_setuptools_build_meta ptest + +CLEANBROKEN = "1" + +RDEPENDS:${PN} = " \ + python3-blinker \ + python3-click \ + python3-itsdangerous \ + python3-jinja2 \ + python3-profile \ + python3-werkzeug \ +" + +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-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.1.bb b/meta-python/recipes-devtools/python/python3-flexparser_0.3.1.bb new file mode 100644 index 0000000000..7867dc5015 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-flexparser_0.3.1.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] = "36f795d82e50f5c9ae2fde1c33f21f88922fdd67b7629550a3cc4d0b40a66856" + +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.5.1.bb b/meta-python/recipes-devtools/python/python3-freezegun_1.5.1.bb new file mode 100644 index 0000000000..8b5750df43 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-freezegun_1.5.1.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] = "b29dedfcda6d5e8e083ce71b2b542753ad48cfec44037b3fc79702e2980a89e9" + +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.2.0.bb b/meta-python/recipes-devtools/python/python3-frozenlist_1.4.1.bb index e8359418b0..4288f2922e 100644 --- a/meta-python/recipes-devtools/python/python3-frozenlist_1.2.0.bb +++ b/meta-python/recipes-devtools/python/python3-frozenlist_1.4.1.bb @@ -3,9 +3,13 @@ HOMEPAGE = "https://github.com/aio-libs/frozenlist" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=cf056e8e7a0a5477451af18b7b5aa98c" -SRC_URI[sha256sum] = "68201be60ac56aff972dc18085800b6ee07973c49103a8aba669dee3d71079de" +SRC_URI[sha256sum] = "c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta -BBCLASSEXTEND = "native nativesdk" +DEPENDS += " \ + python3-expandvars-native \ + python3-cython-native \ +" +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-fsspec_2024.9.0.bb b/meta-python/recipes-devtools/python/python3-fsspec_2024.9.0.bb new file mode 100644 index 0000000000..49ca4b3e93 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-fsspec_2024.9.0.bb @@ -0,0 +1,22 @@ +SUMMARY = "A specification that python filesystems should adhere to." +HOMEPAGE = "https://github.com/fsspec/filesystem_spec" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=b38a11bf4dcdfc66307f8515ce1fbaa6" + +DEPENDS = "python3-hatch-vcs-native python3-hatchling-native" +SRC_URI[sha256sum] = "4b0afb90c2f21832df142f292649035d80b421f60a9e1c027802e5a0da2b04e8" + +inherit pypi python_hatchling ptest + +PYPI_PACKAGE = "fsspec" + +RDEPENDS:${PN}-ptest += "\ + python3-pytest \ + python3-pytest-mock \ + python3-pytest-asyncio \ + python3-pytest-cov \ + python3-pytest-benchmark \ + python3-aiohttp \ + python3-numpy \ + python3-requests \ +" diff --git a/meta-python/recipes-devtools/python/python3-future_0.18.2.bb b/meta-python/recipes-devtools/python/python3-future_1.0.0.bb index 90d1661d40..eb66a7d33c 100644 --- a/meta-python/recipes-devtools/python/python3-future_0.18.2.bb +++ b/meta-python/recipes-devtools/python/python3-future_1.0.0.bb @@ -1,10 +1,9 @@ DESCRIPTION = "Clean single-source support for Python 3 and 2" HOMEPAGE = "https://python-future.org" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=a253924061f8ecc41ad7a2ba1560e8e7" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=ce268d4c2f911490f47ac5473a24bb89" -SRC_URI[md5sum] = "e4579c836b9c025872efe230f6270349" -SRC_URI[sha256sum] = "b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d" +SRC_URI[sha256sum] = "bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05" PYPI_PACKAGE_HASH = "99abde815842bc6e97d5a7806ad51236630da14ca2f3b1fce94c0bb94d3d" diff --git a/meta-python/recipes-devtools/python/python3-gast_0.5.3.bb b/meta-python/recipes-devtools/python/python3-gast_0.6.0.bb index 7fd49456d2..af46c3feb7 100644 --- a/meta-python/recipes-devtools/python/python3-gast_0.5.3.bb +++ b/meta-python/recipes-devtools/python/python3-gast_0.6.0.bb @@ -4,7 +4,7 @@ SECTION = "devel/python" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=a3ad9b6802e713fc5e307e1230f1ea90" -SRC_URI[sha256sum] = "cfbea25820e653af9c7d1807f659ce0a0a9c64f2439421a7bba4f0983f532dea" +SRC_URI[sha256sum] = "88fc5300d32c7ac6ca7b515310862f71e6fdf2c029bbec7c66c0f5dd47b6b1fb" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-gcovr_5.0.bb b/meta-python/recipes-devtools/python/python3-gcovr_5.0.bb deleted file mode 100644 index 330831a0b3..0000000000 --- a/meta-python/recipes-devtools/python/python3-gcovr_5.0.bb +++ /dev/null @@ -1,16 +0,0 @@ -DESCRIPTION = "generate GCC code coverage reports" -HOMEPAGE = "https://gcovr.com" -SECTION = "devel/python" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=08208c66520e8d69d5367483186d94ed" - -SRC_URI = "git://github.com/gcovr/gcovr.git;branch=master;protocol=https" -SRCREV = "2b50284e8a6792b4ddcba14e2050c5c05f15deb6" - -S = "${WORKDIR}/git" - -inherit setuptools3 - -RDEPENDS:${PN} += "${PYTHON_PN}-jinja2 ${PYTHON_PN}-lxml ${PYTHON_PN}-setuptools ${PYTHON_PN}-pygments" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-gcovr_7.2.bb b/meta-python/recipes-devtools/python/python3-gcovr_7.2.bb new file mode 100644 index 0000000000..517124742a --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-gcovr_7.2.bb @@ -0,0 +1,23 @@ +DESCRIPTION = "generate GCC code coverage reports" +HOMEPAGE = "https://gcovr.com" +SECTION = "devel/python" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=c5a58ca91c1758a53f896ba89d8aaac2" + +SRC_URI = "git://github.com/gcovr/gcovr.git;branch=main;protocol=https" +SRCREV = "c4b74b0859611283be646d590c7915e787911b6f" + +S = "${WORKDIR}/git" + +inherit setuptools3 + +RDEPENDS:${PN} += " \ + python3-colorlog \ + python3-jinja2 \ + python3-lxml \ + python3-multiprocessing \ + python3-pygments \ + python3-setuptools \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-geojson/run-ptest b/meta-python/recipes-devtools/python/python3-geojson/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-geojson/run-ptest +++ b/meta-python/recipes-devtools/python/python3-geojson/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-geojson_2.5.0.bb b/meta-python/recipes-devtools/python/python3-geojson_3.1.0.bb index 40cf8bda76..742f921e59 100644 --- a/meta-python/recipes-devtools/python/python3-geojson_2.5.0.bb +++ b/meta-python/recipes-devtools/python/python3-geojson_3.1.0.bb @@ -1,10 +1,9 @@ SUMMARY = "Python bindings and utilities for GeoJSON" HOMEPAGE = "https://pypi.org/project/geojson/" LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=f48972abe5cddee79e301574742ed745" +LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=f77f2ed49768c8d4c79ba874c0f94d8a" -SRC_URI[md5sum] = "14753ed28678828b1de73f68b04e2324" -SRC_URI[sha256sum] = "6e4bb7ace4226a45d9c8c8b1348b3fc43540658359f93c3f7e03efa9f15f658a" +SRC_URI[sha256sum] = "58a7fa40727ea058efc28b0e9ff0099eadf6d0965e04690830208d3ef571adac" inherit pypi setuptools3 ptest @@ -13,7 +12,8 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-geomet_0.3.0.bb b/meta-python/recipes-devtools/python/python3-geomet_0.3.0.bb deleted file mode 100644 index 4337d8558e..0000000000 --- a/meta-python/recipes-devtools/python/python3-geomet_0.3.0.bb +++ /dev/null @@ -1,25 +0,0 @@ -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=release-${PV} \ - " -SRCREV = "73ec5ec96cca32f2e2461d3964fc3d4ab80248f9" - -inherit setuptools3 - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-click \ - ${PYTHON_PN}-core \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-six \ -" 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..7339484379 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-geomet_1.1.0.bb @@ -0,0 +1,20 @@ +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] = "51e92231a0ef6aaa63ac20c443377ba78a303fd2ecd179dc3567de79f3c11605" + +inherit pypi python_setuptools_build_meta + +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/not-final.patch b/meta-python/recipes-devtools/python/python3-gevent/not-final.patch new file mode 100644 index 0000000000..444a195da4 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-gevent/not-final.patch @@ -0,0 +1,16 @@ +gevent fails to build with Cython 3.0.10. As per +https://github.com/gevent/gevent/issues/2031, removing the +cython.final decorator works around this. + +Upstream-Status: Pending +Signed-off-by: Ross Burton <ross.burton@arm.com> + +--- a/src/gevent/_gevent_cqueue.pxd ++++ b/src/gevent/_gevent_cqueue.pxd +@@ -75,7 +75,6 @@ cdef class ItemWaiter(Waiter): + cdef readonly Queue queue + + +-@cython.final + cdef class UnboundQueue(Queue): + pass diff --git a/meta-python/recipes-devtools/python/python3-gevent_21.8.0.bb b/meta-python/recipes-devtools/python/python3-gevent_21.8.0.bb deleted file mode 100644 index 7bdf126dea..0000000000 --- a/meta-python/recipes-devtools/python/python3-gevent_21.8.0.bb +++ /dev/null @@ -1,24 +0,0 @@ -SUMMARY = "A coroutine-based Python networking library" -DESCRIPTION = "gevent is a coroutine-based Python networking library that uses greenlet to provide \ -a high-level synchronous API on top of the libevent event loop." -HOMEPAGE = "http://www.gevent.org" -LICENSE = "MIT & Python-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=4de99aac27b470c29c6c309e0c279b65" -DEPENDS += "${PYTHON_PN}-greenlet libev c-ares" - -RDEPENDS:${PN} = "${PYTHON_PN}-greenlet \ - ${PYTHON_PN}-mime \ - ${PYTHON_PN}-pprint \ - " - -SRC_URI[sha256sum] = "43e93e1a4738c922a2416baf33f0afb0a20b22d3dba886720bc037cd02a98575" - -inherit pypi setuptools3 - -# Don't embed libraries, link to the system instead -export GEVENTSETUP_EMBED = "0" - -# Delete the embedded copies of libraries so we can't accidentally link to them -do_configure:append() { - rm -rf ${S}/deps -} diff --git a/meta-python/recipes-devtools/python/python3-gevent_24.2.1.bb b/meta-python/recipes-devtools/python/python3-gevent_24.2.1.bb new file mode 100644 index 0000000000..e44972178e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-gevent_24.2.1.bb @@ -0,0 +1,43 @@ +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-native python3-greenlet libev libuv python3-cython-native python3-cffi-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 \ + file://not-final.patch" + +SRC_URI[sha256sum] = "432fc76f680acf7cf188c2ee0f5d3ab73b63c1f03114c7cd8a34cebbe5aa2056" + +inherit pypi python_setuptools_build_meta + +# 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 +} + +# http://errors.yoctoproject.org/Errors/Details/766918/ +# src/gevent/queue.c:11894:83: error: passing argument 1 of '__pyx_vtabptr_6gevent_14_gevent_cqueue_UnboundQueue->__pyx_base.put' from incompatible pointer type [-Wincompatible-pointer-types] +# src/gevent/queue.c:11894:114: error: passing argument 4 of '__pyx_vtabptr_6gevent_14_gevent_cqueue_UnboundQueue->__pyx_base.put' from incompatible pointer type [-Wincompatible-pointer-types] +CFLAGS += "-Wno-error=incompatible-pointer-types" diff --git a/meta-python/recipes-devtools/python/python3-git-pw_2.6.0.bb b/meta-python/recipes-devtools/python/python3-git-pw_2.6.0.bb new file mode 100644 index 0000000000..c0b6a60814 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-git-pw_2.6.0.bb @@ -0,0 +1,20 @@ +SUMMARY = "A tool for integrating Git with Patchwork" +HOMEPAGE = "https://github.com/getpatchwork/git-pw" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=26e1a171d943c64f00c51f90c256b9d4" + +SRC_URI[sha256sum] = "e118e31bbe259ed9ae540d627cc563a6ece553d02aed11b1a92bbac408a0da0e" + +inherit pypi python_setuptools_build_meta + +DEPENDS += " \ + python3-pbr-native \ +" + +RDEPENDS:${PN} += " \ + python3-arrow \ + python3-click \ + python3-pyyaml \ + python3-requests \ + python3-tabulate \ +" diff --git a/meta-python/recipes-devtools/python/python3-gmpy2/0001-src-fix-python-3.12-builds.patch b/meta-python/recipes-devtools/python/python3-gmpy2/0001-src-fix-python-3.12-builds.patch new file mode 100644 index 0000000000..1171322e26 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-gmpy2/0001-src-fix-python-3.12-builds.patch @@ -0,0 +1,263 @@ +From 43f132103cedfd92b85173bcdacfbabd5916d9fc Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin <alex@linutronix.de> +Date: Wed, 27 Dec 2023 14:52:16 +0100 +Subject: [PATCH] src: fix python 3.12 builds + +This is a backport for 3.1.x versions provided separately in https://github.com/aleaxit/gmpy/issues/446 + +Upstream-Status: Inappropriate [can be dropped when 2.2.x is released] + +Signed-off-by: Alexander Kanavin <alex@linutronix.de> +--- + src/gmpy2_convert.h | 21 +++++++ + src/gmpy2_convert_gmp.c | 129 +++++++++++++------------------------- + src/gmpy2_convert_utils.c | 2 +- + 3 files changed, 65 insertions(+), 87 deletions(-) + +diff --git a/src/gmpy2_convert.h b/src/gmpy2_convert.h +index f887d47..3e8cb2b 100644 +--- a/src/gmpy2_convert.h ++++ b/src/gmpy2_convert.h +@@ -142,6 +142,27 @@ extern "C" { + #define IS_TYPE_COMPLEX_ONLY(x) ((x > OBJ_TYPE_REAL) && \ + (x < OBJ_TYPE_COMPLEX)) + ++/* Compatibility macros (to work with PyLongObject internals). ++ */ ++ ++#if PY_VERSION_HEX >= 0x030C0000 ++# define TAG_FROM_SIGN_AND_SIZE(is_neg, size) ((is_neg?2:(size==0)) | (((size_t)size) << 3)) ++# define _PyLong_SetSignAndDigitCount(obj, is_neg, size) (obj->long_value.lv_tag = TAG_FROM_SIGN_AND_SIZE(is_neg, size)) ++#elif PY_VERSION_HEX >= 0x030900A4 ++# define _PyLong_SetSignAndDigitCount(obj, is_neg, size) (Py_SET_SIZE(obj, (is_neg?-1:1)*size)) ++#else ++# define _PyLong_SetSignAndDigitCount(obj, is_neg, size) (Py_SIZE(obj) = (is_neg?-1:1)*size) ++#endif ++ ++#if PY_VERSION_HEX >= 0x030C0000 ++# define GET_OB_DIGIT(obj) obj->long_value.ob_digit ++# define _PyLong_IsNegative(obj) ((obj->long_value.lv_tag & 3) == 2) ++# define _PyLong_DigitCount(obj) (obj->long_value.lv_tag >> 3) ++#else ++# define GET_OB_DIGIT(obj) obj->ob_digit ++# define _PyLong_IsNegative(obj) (Py_SIZE(obj) < 0) ++# define _PyLong_DigitCount(obj) (_PyLong_IsNegative(obj)? -Py_SIZE(obj):Py_SIZE(obj)) ++#endif + + /* Since the macros are used in gmpy2's codebase, these functions are skipped + * until they are needed for the C API in the future. +diff --git a/src/gmpy2_convert_gmp.c b/src/gmpy2_convert_gmp.c +index cf0891e..8b8df81 100644 +--- a/src/gmpy2_convert_gmp.c ++++ b/src/gmpy2_convert_gmp.c +@@ -59,33 +59,24 @@ GMPy_MPZ_From_PyIntOrLong(PyObject *obj, CTXT_Object *context) + } + #endif + +- switch (Py_SIZE(templong)) { +- case -1: +- mpz_set_si(result->z, -(sdigit)templong->ob_digit[0]); ++ len = _PyLong_DigitCount(templong); ++ negative = _PyLong_IsNegative(templong); ++ ++ switch (len) { ++ case 1: ++ mpz_set_si(result->z, (sdigit)GET_OB_DIGIT(templong)[0]); + break; + case 0: + mpz_set_si(result->z, 0); + break; +- case 1: +- mpz_set_si(result->z, templong->ob_digit[0]); +- break; + default: +- mpz_set_si(result->z, 0); +- +- if (Py_SIZE(templong) < 0) { +- len = - Py_SIZE(templong); +- negative = 1; +- } else { +- len = Py_SIZE(templong); +- negative = 0; +- } +- +- mpz_import(result->z, len, -1, sizeof(templong->ob_digit[0]), 0, +- sizeof(templong->ob_digit[0])*8 - PyLong_SHIFT, templong->ob_digit); ++ mpz_import(result->z, len, -1, sizeof(GET_OB_DIGIT(templong)[0]), 0, ++ sizeof(GET_OB_DIGIT(templong)[0])*8 - PyLong_SHIFT, ++ GET_OB_DIGIT(templong)); ++ } + +- if (negative) { +- mpz_neg(result->z, result->z); +- } ++ if (negative) { ++ mpz_neg(result->z, result->z); + } + return result; + } +@@ -105,33 +96,24 @@ mpz_set_PyIntOrLong(mpz_t z, PyObject *obj) + } + #endif + +- switch (Py_SIZE(templong)) { +- case -1: +- mpz_set_si(z, -(sdigit)templong->ob_digit[0]); ++ len = _PyLong_DigitCount(templong); ++ negative = _PyLong_IsNegative(templong); ++ ++ switch (len) { ++ case 1: ++ mpz_set_si(z, (sdigit)GET_OB_DIGIT(templong)[0]); + break; + case 0: + mpz_set_si(z, 0); + break; +- case 1: +- mpz_set_si(z, templong->ob_digit[0]); +- break; + default: +- mpz_set_si(z, 0); +- +- if (Py_SIZE(templong) < 0) { +- len = - Py_SIZE(templong); +- negative = 1; +- } else { +- len = Py_SIZE(templong); +- negative = 0; +- } +- +- mpz_import(z, len, -1, sizeof(templong->ob_digit[0]), 0, +- sizeof(templong->ob_digit[0])*8 - PyLong_SHIFT, templong->ob_digit); ++ mpz_import(z, len, -1, sizeof(GET_OB_DIGIT(templong)[0]), 0, ++ sizeof(GET_OB_DIGIT(templong)[0])*8 - PyLong_SHIFT, ++ GET_OB_DIGIT(templong)); ++ } + +- if (negative) { +- mpz_neg(z, z); +- } ++ if (negative) { ++ mpz_neg(z, z); + } + return; + } +@@ -186,12 +168,7 @@ GMPy_PyLong_From_MPZ(MPZ_Object *obj, CTXT_Object *context) + + /* Assume gmp uses limbs as least as large as the builtin longs do */ + +- if (mpz_sgn(obj->z) < 0) { +- negative = 1; +- } else { +- negative = 0; +- } +- ++ negative = mpz_sgn(obj->z) < 0; + size = (mpz_sizeinbase(obj->z, 2) + PyLong_SHIFT - 1) / PyLong_SHIFT; + + if (!(result = _PyLong_New(size))) { +@@ -200,31 +177,20 @@ GMPy_PyLong_From_MPZ(MPZ_Object *obj, CTXT_Object *context) + /* LCOV_EXCL_STOP */ + } + +- mpz_export(result->ob_digit, &count, -1, sizeof(result->ob_digit[0]), 0, +- sizeof(result->ob_digit[0])*8 - PyLong_SHIFT, obj->z); ++ mpz_export(GET_OB_DIGIT(result), &count, -1, sizeof(GET_OB_DIGIT(result)[0]), 0, ++ sizeof(GET_OB_DIGIT(result)[0])*8 - PyLong_SHIFT, obj->z); + + if (count == 0) { +- result->ob_digit[0] = 0; ++ GET_OB_DIGIT(result)[0] = 0; + } + + /* long_normalize() is file-static so we must reimplement it */ + /* longobjp = long_normalize(longobjp); */ +- while ((size>0) && (result->ob_digit[size-1] == 0)) { ++ while ((size>0) && (GET_OB_DIGIT(result)[size-1] == 0)) { + size--; + } +-#if PY_VERSION_HEX >= 0x030900A4 +- Py_SET_SIZE(result, size); +-#else +- Py_SIZE(result) = size; +-#endif + +- if (negative) { +-#if PY_VERSION_HEX >= 0x030900A4 +- Py_SET_SIZE(result, - Py_SIZE(result)); +-#else +- Py_SIZE(result) = - Py_SIZE(result); +-#endif +- } ++ _PyLong_SetSignAndDigitCount(result, negative, size); + return (PyObject*)result; + } + +@@ -476,33 +442,24 @@ GMPy_XMPZ_From_PyIntOrLong(PyObject *obj, CTXT_Object *context) + } + #endif + +- switch (Py_SIZE(templong)) { +- case -1: +- mpz_set_si(result->z, -(sdigit)templong->ob_digit[0]); ++ len = _PyLong_DigitCount(templong); ++ negative = _PyLong_IsNegative(templong); ++ ++ switch (len) { ++ case 1: ++ mpz_set_si(result->z, (sdigit)GET_OB_DIGIT(templong)[0]); + break; + case 0: + mpz_set_si(result->z, 0); + break; +- case 1: +- mpz_set_si(result->z, templong->ob_digit[0]); +- break; + default: +- mpz_set_si(result->z, 0); +- +- if (Py_SIZE(templong) < 0) { +- len = - Py_SIZE(templong); +- negative = 1; +- } else { +- len = Py_SIZE(templong); +- negative = 0; +- } +- +- mpz_import(result->z, len, -1, sizeof(templong->ob_digit[0]), 0, +- sizeof(templong->ob_digit[0])*8 - PyLong_SHIFT, templong->ob_digit); ++ mpz_import(result->z, len, -1, sizeof(GET_OB_DIGIT(templong)[0]), 0, ++ sizeof(GET_OB_DIGIT(templong)[0])*8 - PyLong_SHIFT, ++ GET_OB_DIGIT(templong)); ++ } + +- if (negative) { +- mpz_neg(result->z, result->z); +- } ++ if (negative) { ++ mpz_neg(result->z, result->z); + } + return result; + } +@@ -639,7 +596,7 @@ GMPy_MPQ_From_PyStr(PyObject *s, int base, CTXT_Object *context) + } + + cp = PyBytes_AsString(ascii_str); +- ++ + { + char *whereslash = strchr((char*)cp, '/'); + char *wheredot = strchr((char*)cp, '.'); +diff --git a/src/gmpy2_convert_utils.c b/src/gmpy2_convert_utils.c +index d676eaf..8908d17 100644 +--- a/src/gmpy2_convert_utils.c ++++ b/src/gmpy2_convert_utils.c +@@ -123,7 +123,7 @@ static unsigned long + GMPy_Integer_AsUnsignedLongWithType_v2(PyObject *x, int xtype) + { + if IS_TYPE_PyInteger(xtype) { +- if (Py_SIZE(x) < 0) { ++ if (_PyLong_IsNegative(((PyLongObject*)x))) { + VALUE_ERROR("n must be > 0"); + return (unsigned long)-1; + } diff --git a/meta-python/recipes-devtools/python/python3-gmpy2_2.1.0rc1.bb b/meta-python/recipes-devtools/python/python3-gmpy2_2.1.5.bb index d3150d665d..d9e9bd50e5 100644 --- a/meta-python/recipes-devtools/python/python3-gmpy2_2.1.0rc1.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" -SRC_URI[sha256sum] = "86cb6d8e5837560c32c706d48d6ed25676be6b3c79e6aa5d245965b9e99231b9" +SRC_URI[sha256sum] = "bc297f1fd8c377ae67a4f493fc0f926e5d1b157e5c342e30a4d84dc7b9f95d96" inherit pypi setuptools3 python3native +SRC_URI += "file://0001-src-fix-python-3.12-builds.patch" + BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-gmqtt_0.6.11.bb b/meta-python/recipes-devtools/python/python3-gmqtt_0.6.16.bb index 0e6670b906..20cdee80ff 100644 --- a/meta-python/recipes-devtools/python/python3-gmqtt_0.6.11.bb +++ b/meta-python/recipes-devtools/python/python3-gmqtt_0.6.16.bb @@ -3,7 +3,7 @@ HOMEPAGE = "https://github.com/wialon/gmqtt" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=903f1792621a3b35ee546da75d139177" -SRC_URI[sha256sum] = "0be6d57841538abc3ae0a41131c6d53314e0705b74876a6f94bc903df1209fb6" +SRC_URI[sha256sum] = "ddd1fdc1c6ae604e74377cf70e99f067e579c03c1c71a6acd494e199e93b7fa4" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-gnupg_0.4.7.bb b/meta-python/recipes-devtools/python/python3-gnupg_0.4.7.bb deleted file mode 100644 index 83ee57926e..0000000000 --- a/meta-python/recipes-devtools/python/python3-gnupg_0.4.7.bb +++ /dev/null @@ -1,14 +0,0 @@ -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=b0b7ac63b60085b23fa9f7e1951daa1d" - -PYPI_PACKAGE = "python-gnupg" -SRC_URI[sha256sum] = "2061f56b1942c29b92727bf9aecbd3cea3893acc9cccbdc7eb4604285efe4ac7" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += " \ - gnupg-gpg \ - python3-logging \ -" 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.19.1.bb b/meta-python/recipes-devtools/python/python3-google-api-core_2.19.1.bb new file mode 100644 index 0000000000..f21b41aab7 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-google-api-core_2.19.1.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] = "f4695f1e3650b316a795108a76a1c416e6afb036199d1c1f1f110916df479ffd" + +RDEPENDS:${PN} += "\ + python3-asyncio \ + python3-datetime \ + python3-logging \ + python3-math \ +" + +RDEPENDS:${PN} += "\ + python3-googleapis-common-protos \ + python3-google-auth \ + python3-grpcio \ + python3-protobuf \ + python3-pytz \ + python3-requests \ + python3-six \ +" diff --git a/meta-python/recipes-devtools/python/python3-google-api-core_2.2.0.bb b/meta-python/recipes-devtools/python/python3-google-api-core_2.2.0.bb deleted file mode 100644 index d6293613b7..0000000000 --- a/meta-python/recipes-devtools/python/python3-google-api-core_2.2.0.bb +++ /dev/null @@ -1,26 +0,0 @@ -DESCRIPTION = "Google API client core library" -HOMEPAGE = "https://github.com/googleapis/python-api-core" -AUTHOR = "Google LLC" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57" - -inherit pypi setuptools3 - -SRC_URI[sha256sum] = "dca67b5e369a5127ec00c8ea02de48517e39c1aad882e2e6d85da8050520cab6" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-asyncio \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-math \ -" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-googleapis-common-protos \ - ${PYTHON_PN}-google-auth \ - ${PYTHON_PN}-grpcio \ - ${PYTHON_PN}-protobuf \ - ${PYTHON_PN}-pytz \ - ${PYTHON_PN}-requests \ - ${PYTHON_PN}-six \ -" diff --git a/meta-python/recipes-devtools/python/python3-google-api-python-client_2.30.0.bb b/meta-python/recipes-devtools/python/python3-google-api-python-client_2.135.0.bb index e1f7040e4f..2b48456031 100644 --- a/meta-python/recipes-devtools/python/python3-google-api-python-client_2.30.0.bb +++ b/meta-python/recipes-devtools/python/python3-google-api-python-client_2.135.0.bb @@ -4,17 +4,17 @@ HOMEPAGE = "https://github.com/googleapis/google-api-python-client" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327" -SRC_URI[sha256sum] = "d46418a296f8ee309b2044791aeffae512cb1a9d9bfb3def2bfb37058f01c645" +SRC_URI[sha256sum] = "b552a28123ed95493035698db80e8ed78c9106a8b422e63a175150b9b55b704e" inherit pypi setuptools3 RDEPENDS:${PN} += "\ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-core \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-httplib2 \ - ${PYTHON_PN}-uritemplate \ - ${PYTHON_PN}-google-api-core \ + python3-logging \ + python3-six \ + python3-json \ + python3-core \ + python3-netclient \ + python3-httplib2 \ + python3-uritemplate \ + python3-google-api-core \ " diff --git a/meta-python/recipes-devtools/python/python3-google-auth-oauthlib/run-ptest b/meta-python/recipes-devtools/python/python3-google-auth-oauthlib/run-ptest new file mode 100644 index 0000000000..f1c8729f0e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-google-auth-oauthlib/run-ptest @@ -0,0 +1,4 @@ +#!/bin/sh + +pytest --automake + diff --git a/meta-python/recipes-devtools/python/python3-google-auth-oauthlib_1.2.0.bb b/meta-python/recipes-devtools/python/python3-google-auth-oauthlib_1.2.0.bb new file mode 100644 index 0000000000..70e843a094 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-google-auth-oauthlib_1.2.0.bb @@ -0,0 +1,31 @@ +SUMMARY = "Google Authentication Library" +DESCRIPTION = "This library provides oauthlib integration with google-auth" +HOMEPAGE = "https://github.com/googleapis/google-auth-library-python-oauthlib" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57" + +SRC_URI[sha256sum] = "292d2d3783349f2b0734a0a0207b1e1e322ac193c2c09d8f7c613fb7cc501ea8" + +inherit pypi setuptools3 ptest + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-click \ + python3-mock \ + python3-pytest \ + python3-unittest-automake-output \ + python3-unixadmin \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} + +RDEPENDS:${PN} += " \ + python3-google-auth \ + python3-requests-oauthlib \ +" diff --git a/meta-python/recipes-devtools/python/python3-google-auth/run-ptest b/meta-python/recipes-devtools/python/python3-google-auth/run-ptest new file mode 100644 index 0000000000..f1c8729f0e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-google-auth/run-ptest @@ -0,0 +1,4 @@ +#!/bin/sh + +pytest --automake + diff --git a/meta-python/recipes-devtools/python/python3-google-auth_2.3.0.bb b/meta-python/recipes-devtools/python/python3-google-auth_2.3.0.bb deleted file mode 100644 index 9d192c15ee..0000000000 --- a/meta-python/recipes-devtools/python/python3-google-auth_2.3.0.bb +++ /dev/null @@ -1,27 +0,0 @@ -DESCRIPTION = "Google Authentication Library" -HOMEPAGE = "https://github.com/googleapis/google-auth-library-python" -AUTHOR = "Google Cloud Platform" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327" - -inherit pypi setuptools3 - -SRC_URI[sha256sum] = "2800f6dfad29c6ced5faf9ca0c38ea8ba1ebe2559b10c029bd021e3de3301627" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-asyncio \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-numbers \ -" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-aiohttp \ - ${PYTHON_PN}-cachetools \ - ${PYTHON_PN}-pyasn1-modules \ - ${PYTHON_PN}-rsa \ - ${PYTHON_PN}-six \ -" diff --git a/meta-python/recipes-devtools/python/python3-google-auth_2.30.0.bb b/meta-python/recipes-devtools/python/python3-google-auth_2.30.0.bb new file mode 100644 index 0000000000..c51be16505 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-google-auth_2.30.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] = "ab630a1320f6720909ad76a7dbdb6841cdf5c66b328d690027e4867bdfb16688" + +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.53.0.bb b/meta-python/recipes-devtools/python/python3-googleapis-common-protos_1.53.0.bb deleted file mode 100644 index 58d35f3d8d..0000000000 --- a/meta-python/recipes-devtools/python/python3-googleapis-common-protos_1.53.0.bb +++ /dev/null @@ -1,14 +0,0 @@ -DESCRIPTION = "Common protobufs used in Google APIs" -HOMEPAGE = "https://github.com/googleapis/python-api-common-protos" -AUTHOR = "Google LLC" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10" - -inherit pypi setuptools3 - -SRC_URI[sha256sum] = "a88ee8903aa0a81f6c3cec2d5cf62d3c8aa67c06439b0496b49048fb1854ebf4" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-grpcio \ - ${PYTHON_PN}-protobuf \ -" diff --git a/meta-python/recipes-devtools/python/python3-googleapis-common-protos_1.63.2.bb b/meta-python/recipes-devtools/python/python3-googleapis-common-protos_1.63.2.bb new file mode 100644 index 0000000000..5539d19f68 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-googleapis-common-protos_1.63.2.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://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57" + +inherit pypi setuptools3 + +SRC_URI[sha256sum] = "27c5abdffc4911f28101e635de1533fb4cfd2c37fbaa9174587c799fac90aa87" + +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.2.1.bb b/meta-python/recipes-devtools/python/python3-gpiod_2.2.1.bb new file mode 100644 index 0000000000..8e1cbf849b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-gpiod_2.2.1.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] = "802dad3a89016339a231c462c6da2d56c820f5fb11519728ff86cdff0a16da96" + +inherit setuptools3-base python_pep517 ptest pypi + +DEPENDS += " \ + libgpiod \ + python3-setuptools-native \ +" +RDEPENDS:${PN} += " \ + libgpiod (>= 2.1) \ + python3-datetime \ + python3-profile \ +" +RDEPENDS:${PN}-ptest += " \ + libgpiod-ptest \ + python3-setuptools \ +" +RRECOMMENDS:${PN}-ptest += "kernel-module-configfs" + +export LINK_SYSTEM_LIBGPIOD = "1" + +do_compile_ptest() { + setup_target_config + nativepython3 build_tests.py +} + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/gpiod-test/gpiosim + install -d ${D}${PTEST_PATH}/gpiod-test/procname + install -m 0644 ${S}/tests/*.py ${D}${PTEST_PATH}/gpiod-test/ + install -m 0644 ${B}/tests/gpiosim/_ext* ${D}${PTEST_PATH}/gpiod-test/gpiosim + install -m 0644 ${S}/tests/gpiosim/*.py ${D}${PTEST_PATH}/gpiod-test/gpiosim + install -m 0644 ${B}/tests/procname/_ext* ${D}${PTEST_PATH}/gpiod-test/procname + install -m 0644 ${S}/tests/procname/*.py ${D}${PTEST_PATH}/gpiod-test/procname +} + +INSANE_SKIP:${PN}-ptest += "buildpaths" diff --git a/meta-python/recipes-devtools/python/python3-graphviz_0.18.bb b/meta-python/recipes-devtools/python/python3-graphviz_0.20.3.bb index 200292d667..0fd81b0ee6 100644 --- a/meta-python/recipes-devtools/python/python3-graphviz_0.18.bb +++ b/meta-python/recipes-devtools/python/python3-graphviz_0.20.3.bb @@ -1,16 +1,16 @@ DESCRIPTION = "Graphviz protocol implementation" HOMEPAGE = "https://graphviz.readthedocs.io/en/stable/" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=87cd8818b7e63c6a9c580034e80d7521" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=bcdc1cf20245c598f9a563b550605785" -SRC_URI[sha256sum] = "0f04e5f939d3a839b524283d590e941892c56e75e60e0f5238c431264f490022" +SRC_URI[sha256sum] = "09d6bc81e6a9fa392e7ba52135a9d49f1ed62526f96499325930e87ca1b5925d" inherit pypi setuptools3 PYPI_PACKAGE_EXT = "zip" RDEPENDS:${PN} += " \ - ${PYTHON_PN}-logging \ + python3-logging \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-greenlet_1.1.2.bb b/meta-python/recipes-devtools/python/python3-greenlet_3.1.0.bb index 07c1436bfa..11e8a76c8d 100644 --- a/meta-python/recipes-devtools/python/python3-greenlet_1.1.2.bb +++ b/meta-python/recipes-devtools/python/python3-greenlet_3.1.0.bb @@ -1,9 +1,11 @@ SUMMARY = "Python lightweight in-process concurrent programming" HOMEPAGE = "https://greenlet.readthedocs.io/en/latest/" -LICENSE = "MIT & PSF" +LICENSE = "MIT & PSF-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=e95668d68e4329085c7ab3535e6a7aee \ file://LICENSE.PSF;md5=c106931d9429eda0492617f037b8f69a" -SRC_URI[sha256sum] = "e30f5ea4ae2346e62cedde8794a56858a67b878dd79f7df76a0767e356b1744a" +SRC_URI[sha256sum] = "b395121e9bbe8d02a750886f108d540abe66075e61e22f7353d9acb0b81be0f0" -inherit pypi distutils3 setuptools3 +inherit pypi python_setuptools_build_meta + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-greenstalk_2.0.0.bb b/meta-python/recipes-devtools/python/python3-greenstalk_2.0.2.bb index 841b84ddf6..33eb62d5d9 100644 --- a/meta-python/recipes-devtools/python/python3-greenstalk_2.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-greenstalk_2.0.2.bb @@ -3,9 +3,8 @@ HOMEPAGE = "https://github.com/mayhewj/greenstalk" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=8f98432ba1fce3933c556430fd47298f" -SRC_URI[sha256sum] = "0020970abdb6f400586938573cbbec80410e83805d61e46cf76ea3ed71129257" +SRC_URI[sha256sum] = "3ebde5fc9ecf986f96f6779fd6d15a53f33d432c52a2e28012e100a99ee154a4" RDEPENDS:${PN} += "python3-io python3-core" -inherit pypi -inherit setuptools3 +inherit pypi python_setuptools_build_meta diff --git a/meta-python/recipes-devtools/python/python3-grpcio-channelz_1.62.2.bb b/meta-python/recipes-devtools/python/python3-grpcio-channelz_1.62.2.bb new file mode 100644 index 0000000000..ed5ede4252 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-grpcio-channelz_1.62.2.bb @@ -0,0 +1,16 @@ +DESCRIPTION = "Google gRPC channelz" +HOMEPAGE = "http://www.grpc.io/" +SECTION = "devel/python" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=7145f7cdd263359b62d342a02f005515" + +inherit pypi setuptools3 + +DEPENDS += "python3-grpcio" + +SRC_URI[sha256sum] = "6e4ac2c43d76b245c5f66d98f523db08786b186128a655ee6f20a30a7e68e4f9" + +RDEPENDS:${PN} = "python3-grpcio" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-grpcio-reflection_1.62.2.bb b/meta-python/recipes-devtools/python/python3-grpcio-reflection_1.62.2.bb new file mode 100644 index 0000000000..478c5b33ec --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-grpcio-reflection_1.62.2.bb @@ -0,0 +1,16 @@ +DESCRIPTION = "Google gRPC reflection" +HOMEPAGE = "http://www.grpc.io/" +SECTION = "devel/python" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=7145f7cdd263359b62d342a02f005515" + +inherit pypi setuptools3 + +DEPENDS += "python3-grpcio" + +SRC_URI[sha256sum] = "2dd44806d68d0006636529bda573012b19a42281478c2d051cdaaebb91e2516c" + +RDEPENDS:${PN} = "python3-grpcio" + +BBCLASSEXTEND = "native nativesdk" 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.41.1.bb b/meta-python/recipes-devtools/python/python3-grpcio-tools_1.62.2.bb index fdc4ad9cc2..e05b8734d6 100644 --- a/meta-python/recipes-devtools/python/python3-grpcio-tools_1.41.1.bb +++ b/meta-python/recipes-devtools/python/python3-grpcio-tools_1.62.2.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] = "5fd5e1582b678e6b941ee5f5809340be5e0724691df5299aae8226640f94e18f" -SRC_URI[sha256sum] = "f16e4c63996ca8fe0af1eb9c4a07e5207874c4a69f890ccb824cd858521d981f" - -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-PR-1644-unscaledcycleclock-remove-RISC-V-support.patch b/meta-python/recipes-devtools/python/python3-grpcio/0001-PR-1644-unscaledcycleclock-remove-RISC-V-support.patch new file mode 100644 index 0000000000..82f15f88cd --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-grpcio/0001-PR-1644-unscaledcycleclock-remove-RISC-V-support.patch @@ -0,0 +1,82 @@ +From 7335a36d0b5c1c597566f9aa3f458a5b6817c3b4 Mon Sep 17 00:00:00 2001 +From: aurel32 <aurelien@aurel32.net> +Date: Fri, 22 Mar 2024 14:21:13 -0700 +Subject: [PATCH] PR #1644: unscaledcycleclock: remove RISC-V support + +Imported from GitHub PR https://github.com/abseil/abseil-cpp/pull/1644 + +Starting with Linux 6.6 [1], RDCYCLE is a privileged instruction on RISC-V and can't be used directly from userland. There is a sysctl option to change that as a transition period, but it will eventually disappear. + +The RDTIME instruction is another less accurate alternative, however its frequency varies from board to board, and there is currently now way to get its frequency from userland [2]. + +Therefore this patch just removes the code for unscaledcycleclock on RISC-V. Without processor specific implementation, abseil relies on std::chrono::steady_clock::now().time_since_epoch() which is basically a wrapper around clock_gettime (CLOCK_MONOTONIC), which in turns use __vdso_clock_gettime(). On RISC-V this VDSO is just a wrapper around RDTIME correctly scaled to use nanoseconds units. + +This fixes the testsuite on riscv64, tested on a VisionFive 2 board. + +[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=cc4c07c89aada16229084eeb93895c95b7eabaa3 +[2] https://github.com/abseil/abseil-cpp/pull/1631 +Merge 43356a2548cfde76e164d446cb69004b488c6a71 into 76f8011beabdaee872b5fde7546e02407b220cb1 + +Merging this change closes #1644 + +COPYBARA_INTEGRATE_REVIEW=https://github.com/abseil/abseil-cpp/pull/1644 from aurel32:rv64-no-unscaledcycleclock 43356a2548cfde76e164d446cb69004b488c6a71 +PiperOrigin-RevId: 618286262 +Change-Id: Ie4120a727e7d0bb185df6e06ea145c780ebe6652 + +Upstream-Status: Backport [https://github.com/abseil/abseil-cpp/commit/7335a36d] +[Adapted to apply on top of meta-oe's patch stack] +Signed-off-by: Scott Murray <scott.murray@konsulko.com> +--- + .../absl/base/internal/unscaledcycleclock.cc | 12 ------------ + .../absl/base/internal/unscaledcycleclock_config.h | 5 ++--- + 2 files changed, 2 insertions(+), 15 deletions(-) + +diff --git a/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc b/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +index f11fecb..103b4f6 100644 +--- a/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc ++++ b/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +@@ -121,18 +121,6 @@ double UnscaledCycleClock::Frequency() { + return aarch64_timer_frequency; + } + +-#elif defined(__riscv) +- +-int64_t UnscaledCycleClock::Now() { +- int64_t virtual_timer_value; +- asm volatile("rdcycle %0" : "=r"(virtual_timer_value)); +- return virtual_timer_value; +-} +- +-double UnscaledCycleClock::Frequency() { +- return base_internal::NominalCPUFrequency(); +-} +- + #elif defined(_M_IX86) || defined(_M_X64) + + #pragma intrinsic(__rdtsc) +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 5e232c1..83552fc 100644 +--- a/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h ++++ b/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h +@@ -22,7 +22,6 @@ + // The following platforms have an implementation of a hardware counter. + #if defined(__i386__) || defined(__x86_64__) || defined(__aarch64__) || \ + ((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 +@@ -54,8 +53,8 @@ + #if ABSL_USE_UNSCALED_CYCLECLOCK + // This macro can be used to test if UnscaledCycleClock::Frequency() + // is NominalCPUFrequency() on a particular platform. +-#if (defined(__i386__) || defined(__x86_64__) || defined(__riscv) || \ +- defined(_M_IX86) || defined(_M_X64)) ++#if (defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || \ ++ defined(_M_X64)) + #define ABSL_INTERNAL_UNSCALED_CYCLECLOCK_FREQUENCY_IS_CPU_FREQUENCY + #endif + #endif +-- +2.44.0 + 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-crypto-use-_Generic-only-if-defined-__cplusplus.patch b/meta-python/recipes-devtools/python/python3-grpcio/0001-crypto-use-_Generic-only-if-defined-__cplusplus.patch new file mode 100644 index 0000000000..d830d92284 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-grpcio/0001-crypto-use-_Generic-only-if-defined-__cplusplus.patch @@ -0,0 +1,74 @@ +From 3359a87a71307336100b84e66b69bad385cd3cfc Mon Sep 17 00:00:00 2001 +From: Martin Jansa <martin.jansa@gmail.com> +Date: Mon, 6 May 2024 01:36:39 +0200 +Subject: [PATCH] crypto: use _Generic only if !defined(__cplusplus) + +* fixes build with gcc-14 which has __builtin_addc and __builtin_subc + with gcc-13 it was already using the #else branch because of missing builtins + +* fixes + https://github.com/grpc/grpc/issues/35945 + +* _Generic was introduced in boringssl with: + https://boringssl.googlesource.com/boringssl/+/70ca6bc24be103dabd68e448cd3af29b929b771d%5E%21/#F4 + +* but e.g. third_party/boringssl-with-bazel/src/ssl/d1_both.cc includes + this internal.h and from the .cc extension gcc will process it as C++ + where _Generic isn't available, causing: + +In file included from third_party/boringssl-with-bazel/src/ssl/d1_both.cc:125: +third_party/boringssl-with-bazel/src/ssl/../crypto/internal.h: In function 'uint32_t CRYPTO_addc_u32(uint32_t, uint32_t, uint32_t, uint32_t*)': +third_party/boringssl-with-bazel/src/ssl/../crypto/internal.h:1159:7: error: expected primary-expression before 'unsigned' + 1159 | unsigned: __builtin_addc, \ + | ^~~~~~~~ +third_party/boringssl-with-bazel/src/ssl/../crypto/internal.h:1166:10: note: in expansion of macro 'CRYPTO_GENERIC_ADDC' + 1166 | return CRYPTO_GENERIC_ADDC(x, y, carry, out_carry); + | ^~~~~~~~~~~~~~~~~~~ +third_party/boringssl-with-bazel/src/ssl/../crypto/internal.h:1160:7: error: expected primary-expression before 'unsigned' + 1160 | unsigned long: __builtin_addcl, \ + | ^~~~~~~~ +third_party/boringssl-with-bazel/src/ssl/../crypto/internal.h:1166:10: note: in expansion of macro 'CRYPTO_GENERIC_ADDC' + 1166 | return CRYPTO_GENERIC_ADDC(x, y, carry, out_carry); + | ^~~~~~~~~~~~~~~~~~~ +third_party/boringssl-with-bazel/src/ssl/../crypto/internal.h:1161:7: error: expected primary-expression before 'unsigned' + 1161 | unsigned long long: __builtin_addcll))((x), (y), (carry), (out_carry)) + | ^~~~~~~~ +third_party/boringssl-with-bazel/src/ssl/../crypto/internal.h:1166:10: note: in expansion of macro 'CRYPTO_GENERIC_ADDC' + 1166 | return CRYPTO_GENERIC_ADDC(x, y, carry, out_carry); + | ^~~~~~~~~~~~~~~~~~~ +third_party/boringssl-with-bazel/src/ssl/../crypto/internal.h:1158:4: error: '_Generic' was not declared in this scope + 1158 | (_Generic((x), \ + | ^~~~~~~~ +third_party/boringssl-with-bazel/src/ssl/../crypto/internal.h:1166:10: note: in expansion of macro 'CRYPTO_GENERIC_ADDC' + 1166 | return CRYPTO_GENERIC_ADDC(x, y, carry, out_carry); + | ^~~~~~~~~~~~~~~~~~~ + +Signed-off-by: Martin Jansa <martin.jansa@gmail.com> +--- +Upstream-Status: Submitted [https://boringssl-review.googlesource.com/c/boringssl/+/68227 crypto: use _Generic only if !defined(__cplusplus)] + + crypto/internal.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/crypto/internal.h b/crypto/internal.h +index a77102d76..30d6826dd 100644 +--- a/crypto/internal.h ++++ b/crypto/internal.h +@@ -1176,7 +1176,7 @@ static inline uint64_t CRYPTO_rotr_u64(uint64_t value, int shift) { + + // CRYPTO_addc_* returns |x + y + carry|, and sets |*out_carry| to the carry + // bit. |carry| must be zero or one. +-#if OPENSSL_HAS_BUILTIN(__builtin_addc) ++#if OPENSSL_HAS_BUILTIN(__builtin_addc) && !defined(__cplusplus) + + #define CRYPTO_GENERIC_ADDC(x, y, carry, out_carry) \ + (_Generic((x), \ +@@ -1228,7 +1228,7 @@ static inline uint64_t CRYPTO_addc_u64(uint64_t x, uint64_t y, uint64_t carry, + + // CRYPTO_subc_* returns |x - y - borrow|, and sets |*out_borrow| to the borrow + // bit. |borrow| must be zero or one. +-#if OPENSSL_HAS_BUILTIN(__builtin_subc) ++#if OPENSSL_HAS_BUILTIN(__builtin_subc) && !defined(__cplusplus) + + #define CRYPTO_GENERIC_SUBC(x, y, borrow, out_borrow) \ + (_Generic((x), \ 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-target.h-define-proper-macro-for-ppc-ppc64.patch b/meta-python/recipes-devtools/python/python3-grpcio/0001-target.h-define-proper-macro-for-ppc-ppc64.patch new file mode 100644 index 0000000000..0b512b1d00 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-grpcio/0001-target.h-define-proper-macro-for-ppc-ppc64.patch @@ -0,0 +1,37 @@ +From b3bca013007a4a66703573d243e433f22e1e6684 Mon Sep 17 00:00:00 2001 +From: Changqing Li <changqing.li@windriver.com> +Date: Wed, 15 May 2024 16:55:09 +0800 +Subject: [PATCH] target.h: define proper macro for ppc/ppc64 + +Fix error: +third_party/boringssl-with-bazel/src/include/openssl/target.h:74:2: error: #error "Unknown target CPU" +third_party/boringssl-with-bazel/src/include/openssl/bn.h:172:2: error: #error "Must define either OPENSSL_32_BIT or OPENSSL_64_BIT" +third_party/boringssl-with-bazel/src/include/openssl/bn.h:230:44: error: 'BN_ULONG' has not been declared + +BN_ULONG will be defined after set proper OPENSSL_32_BIT or OPENSSL_64_BIT + +Upstream-Status: Pending + +Signed-off-by: Changqing Li <changqing.li@windriver.com> +--- + third_party/boringssl-with-bazel/src/include/openssl/target.h | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/third_party/boringssl-with-bazel/src/include/openssl/target.h b/third_party/boringssl-with-bazel/src/include/openssl/target.h +index 29b1dc6..d779813 100644 +--- a/third_party/boringssl-with-bazel/src/include/openssl/target.h ++++ b/third_party/boringssl-with-bazel/src/include/openssl/target.h +@@ -54,6 +54,10 @@ + #define OPENSSL_32_BIT + #elif defined(__myriad2__) + #define OPENSSL_32_BIT ++#elif defined(__PPC64__) ++#define OPENSSL_64_BIT ++#elif defined(__PPC__) ++#define OPENSSL_32_BIT + #else + // The list above enumerates the platforms that BoringSSL supports. For these + // platforms we keep a reasonable bar of not breaking them: automated test +-- +2.25.1 + diff --git a/meta-python/recipes-devtools/python/python3-grpcio/0001-zlib-Include-unistd.h-for-open-close-C-APIs.patch b/meta-python/recipes-devtools/python/python3-grpcio/0001-zlib-Include-unistd.h-for-open-close-C-APIs.patch new file mode 100644 index 0000000000..34ef7874e8 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-grpcio/0001-zlib-Include-unistd.h-for-open-close-C-APIs.patch @@ -0,0 +1,24 @@ +From 671618df3e48619f0c7a5a3acd8982374a5e43db Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Sun, 12 Feb 2023 21:25:04 -0800 +Subject: [PATCH] zlib: Include unistd.h for open/close C APIs + +Upstream-Status: Pending + +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + third_party/zlib/gzguts.h | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/third_party/zlib/gzguts.h b/third_party/zlib/gzguts.h +index f937504..341a68d 100644 +--- a/third_party/zlib/gzguts.h ++++ b/third_party/zlib/gzguts.h +@@ -18,6 +18,7 @@ + #endif + + #include <stdio.h> ++#include <unistd.h> + #include "zlib.h" + #ifdef STDC + # include <string.h> diff --git a/meta-python/recipes-devtools/python/python3-grpcio/abseil-ppc-fixes.patch b/meta-python/recipes-devtools/python/python3-grpcio/abseil-ppc-fixes.patch 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 775afa415c..0000000000 --- a/meta-python/recipes-devtools/python/python3-grpcio/mips_bigendian.patch +++ /dev/null @@ -1,15 +0,0 @@ ---- a/third_party/boringssl-with-bazel/src/include/openssl/base.h -+++ b/third_party/boringssl-with-bazel/src/include/openssl/base.h -@@ -102,10 +102,10 @@ extern "C" { - #elif (defined(__PPC__) || defined(__powerpc__)) - #define OPENSSL_32_BIT - #define OPENSSL_PPC --#elif defined(__MIPSEL__) && !defined(__LP64__) -+#elif defined(__mips__) && !defined(__LP64__) - #define OPENSSL_32_BIT - #define OPENSSL_MIPS --#elif defined(__MIPSEL__) && defined(__LP64__) -+#elif defined(__mips__) && defined(__LP64__) - #define OPENSSL_64_BIT - #define OPENSSL_MIPS64 - #elif defined(__riscv) && __SIZEOF_POINTER__ == 8 diff --git a/meta-python/recipes-devtools/python/python3-grpcio/ppc-boringssl-support.patch b/meta-python/recipes-devtools/python/python3-grpcio/ppc-boringssl-support.patch deleted file mode 100644 index 5c9be443d8..0000000000 --- a/meta-python/recipes-devtools/python/python3-grpcio/ppc-boringssl-support.patch +++ /dev/null @@ -1,17 +0,0 @@ -Let boringSSL compile on ppc32 bit - -Upstream-Status: Pending -Signed-off-by: Khem Raj <raj.khem@gmail.com> - ---- a/third_party/boringssl-with-bazel/src/include/openssl/base.h -+++ b/third_party/boringssl-with-bazel/src/include/openssl/base.h -@@ -99,6 +99,9 @@ extern "C" { - #elif (defined(__PPC64__) || defined(__powerpc64__)) && defined(_LITTLE_ENDIAN) - #define OPENSSL_64_BIT - #define OPENSSL_PPC64LE -+#elif (defined(__PPC__) || defined(__powerpc__)) -+#define OPENSSL_32_BIT -+#define OPENSSL_PPC - #elif defined(__MIPSEL__) && !defined(__LP64__) - #define OPENSSL_32_BIT - #define OPENSSL_MIPS diff --git a/meta-python/recipes-devtools/python/python3-grpcio_1.41.1.bb b/meta-python/recipes-devtools/python/python3-grpcio_1.41.1.bb deleted file mode 100644 index a882f6e031..0000000000 --- a/meta-python/recipes-devtools/python/python3-grpcio_1.41.1.bb +++ /dev/null @@ -1,48 +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://boring_ssl.patch \ - file://mips_bigendian.patch \ - file://0001-absl-always-use-asm-sgidefs.h.patch \ -" -SRC_URI[sha256sum] = "9b751271b029432a526a4970dc9b70d93eb6f0963b6a841b574f780b72651969" - -RDEPENDS:${PN} = "${PYTHON_PN}-protobuf \ - ${PYTHON_PN}-setuptools \ - ${PYTHON_PN}-six \ -" - -inherit setuptools3 -inherit pypi - -export GRPC_PYTHON_DISABLE_LIBC_COMPATIBILITY = "1" - -BORING_SSL_PLATFORM:arm = "linux-arm" -BORING_SSL_PLATFORM:x86-64 = "linux-x86_64" -BORING_SSL_PLATFORM ?= "unsupported" -export GRPC_BORING_SSL_PLATFORM = "${BORING_SSL_PLATFORM}" - -BORING_SSL:x86-64 = "1" -BORING_SSL:arm = "1" -BORING_SSL ?= "0" -export GRPC_BUILD_WITH_BORING_SSL_ASM = "${BORING_SSL}" - -GRPC_CFLAGS ?= "" -GRPC_CFLAGS:append:toolchain-clang = " -fvisibility=hidden -fno-wrapv -fno-exceptions" -export GRPC_PYTHON_CFLAGS = "${GRPC_CFLAGS}" - -CLEANBROKEN = "1" - -BBCLASSEXTEND = "native nativesdk" - -CCACHE_DISABLE = "1" - -# needs vdso support -COMPATIBLE_HOST:libc-musl:powerpc64le = "null" diff --git a/meta-python/recipes-devtools/python/python3-grpcio_1.66.1.bb b/meta-python/recipes-devtools/python/python3-grpcio_1.66.1.bb new file mode 100644 index 0000000000..fb91f345b0 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-grpcio_1.66.1.bb @@ -0,0 +1,48 @@ +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 \ + file://0001-crypto-use-_Generic-only-if-defined-__cplusplus.patch;patchdir=third_party/boringssl-with-bazel/src/ \ + file://0001-target.h-define-proper-macro-for-ppc-ppc64.patch \ + file://0001-PR-1644-unscaledcycleclock-remove-RISC-V-support.patch \ + " +SRC_URI[sha256sum] = "35334f9c9745add3e357e3372756fd32d925bd52c41da97f4dfdafbde0bf0ee2" + +RDEPENDS:${PN} = "python3-protobuf" + +inherit setuptools3 +inherit pypi + +CFLAGS:append:libc-musl = " -D_LARGEFILE64_SOURCE" + +export GRPC_PYTHON_DISABLE_LIBC_COMPATIBILITY = "1" + +BORING_SSL_PLATFORM:arm = "linux-arm" +BORING_SSL_PLATFORM:x86-64 = "linux-x86_64" +BORING_SSL_PLATFORM:aarch64 = "linux-aarch64" +BORING_SSL_PLATFORM ?= "unsupported" +export GRPC_BORING_SSL_PLATFORM = "${BORING_SSL_PLATFORM}" +export GRPC_BUILD_OVERRIDE_BORING_SSL_ASM_PLATFORM = "${BORING_SSL_PLATFORM}" + +BORING_SSL:arm = "1" +BORING_SSL:x86-64 = "1" +BORING_SSL:aarch64 = "1" +BORING_SSL ?= "0" +export GRPC_BUILD_WITH_BORING_SSL_ASM = "${BORING_SSL}" + +GRPC_CFLAGS ?= "" +GRPC_CFLAGS:append:toolchain-clang = " -fvisibility=hidden -fno-wrapv -fno-exceptions" +export GRPC_PYTHON_CFLAGS = "${GRPC_CFLAGS}" + +CLEANBROKEN = "1" + +BBCLASSEXTEND = "native nativesdk" + +CCACHE_DISABLE = "1" diff --git a/meta-python/recipes-devtools/python/python3-gunicorn/run-ptest b/meta-python/recipes-devtools/python/python3-gunicorn/run-ptest index 98d73fa037..5ca7e26e8a 100644 --- a/meta-python/recipes-devtools/python/python3-gunicorn/run-ptest +++ b/meta-python/recipes-devtools/python/python3-gunicorn/run-ptest @@ -4,4 +4,4 @@ # ptests to work, so make sure there's at least one nameserver line echo "nameserver 8.8.8.8" >> /etc/resolv.conf -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-gunicorn_20.1.0.bb b/meta-python/recipes-devtools/python/python3-gunicorn_20.1.0.bb deleted file mode 100644 index f381b9df2b..0000000000 --- a/meta-python/recipes-devtools/python/python3-gunicorn_20.1.0.bb +++ /dev/null @@ -1,25 +0,0 @@ -SUMMARY = "WSGI HTTP Server for UNIX" - -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=f75f3fb94cdeab1d607e2adaa6077752" - -SRC_URI[sha256sum] = "e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8" - -inherit pypi setuptools3 ptest - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-eventlet \ - ${PYTHON_PN}-gevent \ - ${PYTHON_PN}-pytest \ -" - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/tests - cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ -} - -RDEPENDS:${PN} += "${PYTHON_PN}-setuptools ${PYTHON_PN}-fcntl" diff --git a/meta-python/recipes-devtools/python/python3-gunicorn_23.0.0.bb b/meta-python/recipes-devtools/python/python3-gunicorn_23.0.0.bb new file mode 100644 index 0000000000..8d825c8651 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-gunicorn_23.0.0.bb @@ -0,0 +1,26 @@ +SUMMARY = "WSGI HTTP Server for UNIX" + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=5b70a8b30792a916f50dc96123e61ddf" + +SRC_URI[sha256sum] = "f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec" + +inherit pypi python_setuptools_build_meta 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-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.5.0.bb b/meta-python/recipes-devtools/python/python3-h5py_3.11.0.bb index aad2f91777..1cf5f5638e 100644 --- a/meta-python/recipes-devtools/python/python3-h5py_3.5.0.bb +++ b/meta-python/recipes-devtools/python/python3-h5py_3.11.0.bb @@ -4,12 +4,9 @@ SECTION = "devel/python" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=113251d71fb0384712c719b567261c5c" -SRC_URI[sha256sum] = "77c7be4001ac7d3ed80477de5b6942501d782de1bbe4886597bdfec2a7ab821f" +SRC_URI[sha256sum] = "7b7e8f78072a2edec87c9836f25f34203fd492a4475709a18b417a33cfb21fa9" -SRC_URI:append = " \ - file://0001-setup_build.py-avoid-absolute-path.patch \ - file://0001-setup.py-Fix-numpy-version.patch \ - " +SRC_URI += "file://0001-setup_build.py-avoid-absolute-path.patch" inherit pkgconfig pypi setuptools3 @@ -24,9 +21,19 @@ DEPENDS = "python3-pkgconfig-native \ hdf5 \ " +PACKAGESPLITFUNCS =+ "fix_cythonized_sources" + +fix_cythonized_sources() { + for f in `grep -l -r -e '\/* Generated by Cython.*/$' ${PKGD}${TARGET_DBGSRC_DIR}`; do + if [ -e $f ]; then + sed -i -e 's#${RECIPE_SYSROOT_NATIVE}##g' $f + fi + done +} + RDEPENDS:${PN} = "python3-numpy \ python3-six \ python3-json \ " -export HDF5_VERSION="1.8.21" +export HDF5_VERSION="1.14.0" diff --git a/meta-python/recipes-devtools/python/python3-hatch-requirements-txt_0.4.1.bb b/meta-python/recipes-devtools/python/python3-hatch-requirements-txt_0.4.1.bb new file mode 100644 index 0000000000..8b3218790e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-hatch-requirements-txt_0.4.1.bb @@ -0,0 +1,12 @@ +SUMMARY = "Hatchling plugin to read project dependencies from requirements.txt" +HOMEPAGE = "https://github.com/repo-helper/hatch-requirements-txt" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=58206c261591d2c13b00ab61cec32abe" + +SRC_URI[sha256sum] = "2c686e5758fd05bb55fa7d0c198fdd481f8d3aaa3c693260f5c0d74ce3547d20" + +PYPI_PACKAGE = "hatch_requirements_txt" + +inherit pypi python_hatchling + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-haversine_2.5.1.bb b/meta-python/recipes-devtools/python/python3-haversine_2.5.1.bb deleted file mode 100644 index 1ed67d3260..0000000000 --- a/meta-python/recipes-devtools/python/python3-haversine_2.5.1.bb +++ /dev/null @@ -1,11 +0,0 @@ -SUMMARY = "Calculate the distance between 2 points on Earth" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" - -SRC_URI[sha256sum] = "357e41dfddc4a0f2b1c941d92a590cac840f7ce4b3da14b45b68d968b3ad7cc7" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += "python3-numpy" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-haversine_2.8.1.bb b/meta-python/recipes-devtools/python/python3-haversine_2.8.1.bb new file mode 100644 index 0000000000..5fd5ddd71c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-haversine_2.8.1.bb @@ -0,0 +1,11 @@ +SUMMARY = "Calculate the distance between 2 points on Earth" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=20a52d2c688975e989fcbee3e6c8d1a1" + +SRC_URI[sha256sum] = "ab750caa0c8f2168bd7b00a429757a83a8393be1aa30f91c2becf6b523189e2a" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-numpy" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-hexbytes_1.2.1.bb b/meta-python/recipes-devtools/python/python3-hexbytes_1.2.1.bb new file mode 100644 index 0000000000..c8e34fc401 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-hexbytes_1.2.1.bb @@ -0,0 +1,15 @@ +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] = "515f00dddf31053db4d0d7636dd16061c1d896c3109b8e751005db4ca46bcca7" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-core \ + python3-email \ + python3-compression \ +" 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 64aa6b34b2..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_2024.2.26.bb index c5ef2ccd3a..4a7ce1e5bc 100644 --- a/meta-python/recipes-devtools/python/python3-html2text_2020.1.16.bb +++ b/meta-python/recipes-devtools/python/python3-html2text_2024.2.26.bb @@ -1,11 +1,10 @@ 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" -SRC_URI[sha256sum] = "e296318e16b059ddb97f7a8a1d6a5c1d7af4544049a01e261731d2d5cc277bbb" +SRC_URI[sha256sum] = "05f8e367d15aaabc96415376776cdd11afd5127a77fce6e36afc60c563ca2c32" inherit pypi setuptools3 ptest @@ -14,9 +13,12 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " +RDEPENDS:${PN} += "python3-cgitb" + do_install_ptest() { install -d ${D}${PTEST_PATH}/test cp -rf ${S}/test/* ${D}${PTEST_PATH}/test/ diff --git a/meta-python/recipes-devtools/python/python3-html5lib_1.1.bb b/meta-python/recipes-devtools/python/python3-html5lib_1.1.bb index ee44e837e1..d6272a07c3 100644 --- a/meta-python/recipes-devtools/python/python3-html5lib_1.1.bb +++ b/meta-python/recipes-devtools/python/python3-html5lib_1.1.bb @@ -8,10 +8,10 @@ SRC_URI[sha256sum] = "b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c1 inherit pypi setuptools3 RDEPENDS:${PN} += "\ - ${PYTHON_PN}-lxml \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-webencodings \ - ${PYTHON_PN}-xml \ + python3-lxml \ + python3-six \ + python3-webencodings \ + python3-xml \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-httpcore_1.0.5.bb b/meta-python/recipes-devtools/python/python3-httpcore_1.0.5.bb new file mode 100644 index 0000000000..6b0f8af4d5 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-httpcore_1.0.5.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] = "34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61" + +DEPENDS += "\ + python3-hatch-fancy-pypi-readme-native \ +" + +PACKAGECONFIG ??= "" +PACKAGECONFIG[http2] = ",,,python3-h2" +PACKAGECONFIG[socks] = ",,,python3-socksio" +PACKAGECONFIG[asyncio] = ",,,python3-anyio" +# Don't provide "trio" PACKAGECONFIG as nothing provides "python3-trio" currently. +# If somebody needs this please feel free to add python3-trio and enable the +# packageconfig below: +#PACKAGECONFIG[trio] = ",,,python3-trio" + +RDEPENDS:${PN} += "\ + python3-certifi \ + python3-h11 \ +" diff --git a/meta-python/recipes-devtools/python/python3-httplib2_0.20.2.bb b/meta-python/recipes-devtools/python/python3-httplib2_0.22.0.bb index bda1d1f0bc..9318ad9182 100644 --- a/meta-python/recipes-devtools/python/python3-httplib2_0.20.2.bb +++ b/meta-python/recipes-devtools/python/python3-httplib2_0.22.0.bb @@ -4,12 +4,12 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=56e5e931172b6164b62dc7c4aba6c8cf" -SRC_URI[sha256sum] = "e404681d2fbcec7506bcb52c503f2b021e95bee0ef7d01e5c221468a2406d8dc" +SRC_URI[sha256sum] = "d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta RDEPENDS:${PN} += "\ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-pyparsing \ + python3-compression \ + python3-netclient \ + python3-pyparsing \ " diff --git a/meta-python/recipes-devtools/python/python3-httptools/run-ptest b/meta-python/recipes-devtools/python/python3-httptools/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-httptools/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-httptools_0.6.1.bb b/meta-python/recipes-devtools/python/python3-httptools_0.6.1.bb new file mode 100644 index 0000000000..4192697df2 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-httptools_0.6.1.bb @@ -0,0 +1,22 @@ +SUMMARY = "A collection of framework independent HTTP protocol utils." +HOMEPAGE = "https://github.com/MagicStack/httptools" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=0a2d82955bf3facdf04cb882655e840e" + +inherit pypi setuptools3 ptest + +SRC_URI[sha256sum] = "c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a" + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} diff --git a/meta-python/recipes-devtools/python/python3-httpx_0.27.2.bb b/meta-python/recipes-devtools/python/python3-httpx_0.27.2.bb new file mode 100644 index 0000000000..e4e1eeea73 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-httpx_0.27.2.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] = "f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2" + +DEPENDS += "\ + python3-hatch-fancy-pypi-readme-native \ +" + +PACKAGECONFIG ??= "" +PACKAGECONFIG[brotli] = ",,,python3-brotli" +PACKAGECONFIG[http2] = ",,,python3-h2" +PACKAGECONFIG[socks] = ",,,python3-socksio" + +RDEPENDS:${PN} += "\ + python3-anyio \ + python3-certifi \ + python3-httpcore \ + python3-idna \ + python3-sniffio \ + python3-json \ + python3-core \ + python3-netclient \ + python3-compression \ +" + +PACKAGES += "\ + ${PN}-cli \ +" + +RDEPENDS:${PN}-cli += "\ + ${PN} \ + python3-click \ + python3-pygments \ + python3-rich \ +" + +FILES:${PN} = "\ + ${libdir}/${PYTHON_DIR} \ +" + +FILES:${PN}-cli = "\ + ${bindir}/httpx \ +" diff --git a/meta-python/recipes-devtools/python/python3-huey_2.4.1.bb b/meta-python/recipes-devtools/python/python3-huey_2.5.1.bb index 64bd8880ec..471fd6cc2a 100644 --- a/meta-python/recipes-devtools/python/python3-huey_2.4.1.bb +++ b/meta-python/recipes-devtools/python/python3-huey_2.5.1.bb @@ -5,7 +5,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=5cac039fcc82f01141cc170b48f315d4" PYPI_PACKAGE = "huey" -SRC_URI[sha256sum] = "bd55e90746cec16e7a61d6dc60d4591c74cba59000dca96c387a4d4eee1395f6" +SRC_URI[sha256sum] = "8a323783ab434a095a4e72b8c48c5b8f957f9031fa860474a390a0927e957112" RDEPENDS:${PN} += " \ python3-datetime \ diff --git a/meta-python/recipes-devtools/python/python3-humanfriendly_10.0.bb b/meta-python/recipes-devtools/python/python3-humanfriendly_10.0.bb index 7d185989d9..b32fe2e1d0 100644 --- a/meta-python/recipes-devtools/python/python3-humanfriendly_10.0.bb +++ b/meta-python/recipes-devtools/python/python3-humanfriendly_10.0.bb @@ -11,14 +11,14 @@ SRC_URI[sha256sum] = "6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2 inherit pypi setuptools3 RDEPENDS:${PN}:class-target += " \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-fcntl \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-math \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-stringold \ + python3-datetime \ + python3-fcntl \ + python3-io \ + python3-logging \ + python3-math \ + python3-numbers \ + python3-shell \ + python3-stringold \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-humanize_3.12.0.bb b/meta-python/recipes-devtools/python/python3-humanize_4.10.0.bb index 1aecc5a967..a8668e1489 100644 --- a/meta-python/recipes-devtools/python/python3-humanize_3.12.0.bb +++ b/meta-python/recipes-devtools/python/python3-humanize_4.10.0.bb @@ -5,17 +5,18 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENCE;md5=4ecc42519e84f6f3e23529464df7bd1d" -SRC_URI[sha256sum] = "5ec1a66e230a3e31fb3f184aab9436ea13d4e37c168e0ffc345ae5bb57e58be6" +SRC_URI[sha256sum] = "06b6eb0293e4b85e8d385397c5868926820db32b9b654b932f57fa41c23c9978" -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 \ - ${PYTHON_PN}-setuptools \ + python3-datetime \ + python3-setuptools \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-hyperlink_21.0.0.bb b/meta-python/recipes-devtools/python/python3-hyperlink_21.0.0.bb index e9bf92aa1a..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,9 +5,9 @@ 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 " diff --git a/meta-python/recipes-devtools/python/python3-icecream_2.1.3.bb b/meta-python/recipes-devtools/python/python3-icecream_2.1.3.bb new file mode 100644 index 0000000000..ec3a4b90f1 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-icecream_2.1.3.bb @@ -0,0 +1,17 @@ +SUMMARY = "Never use print() to debug again; inspect variables, expressions, and program execution with a single, simple function call." +HOMEPAGE = "https://github.com/gruns/icecream" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=eca5ce1610d64ed40920efdce85ff8d1" + +SRC_URI[sha256sum] = "0aa4a7c3374ec36153a1d08f81e3080e83d8ac1eefd97d2f4fe9544e8f9b49de" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-asttokens \ + python3-colorama \ + python3-executing \ + python3-numbers \ + python3-pygments \ + python3-pprint \ +" diff --git a/meta-python/recipes-devtools/python/python3-icu/0001-Fix-host-contamination-of-include-files.patch b/meta-python/recipes-devtools/python/python3-icu/0001-Fix-host-contamination-of-include-files.patch index c45217a88a..7bb5ee58cc 100644 --- a/meta-python/recipes-devtools/python/python3-icu/0001-Fix-host-contamination-of-include-files.patch +++ b/meta-python/recipes-devtools/python/python3-icu/0001-Fix-host-contamination-of-include-files.patch @@ -1,4 +1,4 @@ -From 8abf79f77d9151d6786da3c8e868117822bce6d4 Mon Sep 17 00:00:00 2001 +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 @@ -10,25 +10,26 @@ Also, don't use icu-config Upstream-Status: Inappropriate [OE specific] Signed-off-by: Armin Kuster <akuster808@gmail.com> Signed-off-by: Khem Raj <raj.khem@gmail.com> +Signed-off-by: Wang Mingyu <wangmy@fujitsu.com> --- setup.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/setup.py b/setup.py -index e647db4..abed399 100644 +index 176c9ab..0a10268 100644 --- a/setup.py +++ b/setup.py -@@ -81,7 +81,7 @@ Building PyICU %s for ICU %s (max ICU major version supported: %s) +@@ -68,7 +68,7 @@ elif platform.startswith('freebsd'): CONFIGURE_WITH_ICU_CONFIG = { - 'darwin': True, + 'darwin': False, - 'linux': True, + 'linux': False, 'freebsd': False, # not tested 'win32': False, # no icu-config 'sunos5': False, # not tested -@@ -267,7 +267,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, @@ -36,5 +37,5 @@ index e647db4..abed399 100644 extra_link_args=_lflags, libraries=_libraries)], -- -2.31.1 +2.34.1 diff --git a/meta-python/recipes-devtools/python/python3-icu_2.13.1.bb b/meta-python/recipes-devtools/python/python3-icu_2.13.1.bb new file mode 100644 index 0000000000..6a590de5fd --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-icu_2.13.1.bb @@ -0,0 +1,19 @@ +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] = "d4919085eaa07da12bade8ee721e7bbf7ade0151ca0f82946a26c8f4b98cdceb" + +SRC_URI += "file://0001-Fix-host-contamination-of-include-files.patch" + +inherit pkgconfig pypi python_setuptools_build_meta + +# it's lowercase pyicu instead of ${PYPI_PACKAGE} in this version +S = "${WORKDIR}/pyicu-${PV}" diff --git a/meta-python/recipes-devtools/python/python3-icu_2.7.2.bb b/meta-python/recipes-devtools/python/python3-icu_2.7.2.bb deleted file mode 100644 index 2433a8c9d3..0000000000 --- a/meta-python/recipes-devtools/python/python3-icu_2.7.2.bb +++ /dev/null @@ -1,13 +0,0 @@ -SUMMARY = "Python extension wrapping the ICU C++ API" -SECTION = "devel/python" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://setup.py;beginline=244;endline=252;md5=3e00c41c6d04310707992b93307a224f" - -DEPENDS += "icu" - -PYPI_PACKAGE = "PyICU" -SRC_URI[sha256sum] = "1382869b22d91cc99274f9b525fa7d9199b44d9007ff0036a09747839a01e9dc" - -SRC_URI += "file://0001-Fix-host-contamination-of-include-files.patch" - -inherit pkgconfig 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-ifaddr_0.1.7.bb b/meta-python/recipes-devtools/python/python3-ifaddr_0.2.0.bb index b73063eaaa..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,10 +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} += " \ - ${PYTHON_PN}-ctypes \ + python3-ctypes \ " diff --git a/meta-python/recipes-devtools/python/python3-imageio_2.11.1.bb b/meta-python/recipes-devtools/python/python3-imageio_2.35.1.bb index eddbef8b05..6142884e72 100644 --- a/meta-python/recipes-devtools/python/python3-imageio_2.11.1.bb +++ b/meta-python/recipes-devtools/python/python3-imageio_2.35.1.bb @@ -3,10 +3,9 @@ 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" +LIC_FILES_CHKSUM = "file://LICENSE;md5=24cb9a367a9e641b459a01c4d15256ba" - -SRC_URI[sha256sum] = "73e53bbf21777173232cd7a1c66361516b58cd09d4828a10dcfe83bb14c2b187" +SRC_URI[sha256sum] = "4952dfeef3c3947957f6d5dedb1f4ca31c6e509a476891062396834048aeed2a" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-imgtool/cbor2.patch b/meta-python/recipes-devtools/python/python3-imgtool/cbor2.patch deleted file mode 100644 index 3e8c202bce..0000000000 --- a/meta-python/recipes-devtools/python/python3-imgtool/cbor2.patch +++ /dev/null @@ -1,67 +0,0 @@ -Upstream-Status: Submitted [https://github.com/mcu-tools/mcuboot/pull/1190] -Signed-off-by: Ross Burton <ross.burton@arm.com> - -From f9c6f31b936d34df9a6551609cb16ed9c348be88 Mon Sep 17 00:00:00 2001 -From: Ross Burton <ross.burton@arm.com> -Date: Tue, 2 Nov 2021 11:12:04 +0000 -Subject: [PATCH] imgtool: prefer cbor2 over cbor - -The cbor module is unmaintained, with the last release in 2016[1]. The -cbor2 module however is under active development and was last released -just last month[2]. - -As the APIs are identical, we can import cbor2 and if that fails fall -back to cbor. - -[1] https://pypi.org/project/cbor/#history -[2] https://pypi.org/project/cbor2/#history - -Closes #1189 - -Signed-off-by: Ross Burton <ross.burton@arm.com> ---- - scripts/imgtool.nix | 2 +- - scripts/imgtool/boot_record.py | 7 +++++-- - scripts/requirements.txt | 2 +- - scripts/setup.py | 2 +- - 4 files changed, 8 insertions(+), 5 deletions(-) - -diff --git a/scripts/imgtool/boot_record.py b/scripts/imgtool/boot_record.py -index ac433aa..6f0045e 100644 ---- a/scripts/imgtool/boot_record.py -+++ b/scripts/imgtool/boot_record.py -@@ -16,8 +16,11 @@ - # limitations under the License. - - from enum import Enum --import cbor - -+try: -+ from cbor2 import dumps -+except ImportError: -+ from cbor import dumps - - class SwComponent(int, Enum): - """ -@@ -46,4 +49,4 @@ def create_sw_component_data(sw_type, sw_version, sw_measurement_description, - # list because later it will be modified by the bootloader. - properties[SwComponent.MEASUREMENT_VALUE] = sw_measurement_value - -- return cbor.dumps(properties) -+ return dumps(properties) -diff --git a/scripts/setup.py b/scripts/setup.py -index a228ea3..692cfb7 100644 ---- a/scripts/setup.py -+++ b/scripts/setup.py -@@ -17,7 +17,7 @@ setuptools.setup( - 'cryptography>=2.4.2', - 'intelhex>=2.2.1', - 'click', -- 'cbor>=1.0.0', -+ 'cbor2', - ], - entry_points={ - "console_scripts": ["imgtool=imgtool.main:imgtool"] --- -2.25.1 - diff --git a/meta-python/recipes-devtools/python/python3-imgtool_1.8.0.bb b/meta-python/recipes-devtools/python/python3-imgtool_2.1.0.bb index c957fce3ac..aafcf38272 100644 --- a/meta-python/recipes-devtools/python/python3-imgtool_1.8.0.bb +++ b/meta-python/recipes-devtools/python/python3-imgtool_2.1.0.bb @@ -1,11 +1,9 @@ SUMMARY = "MCUboot's image signing and key management tool" LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://imgtool/main.py;beginline=3;endline=18;md5=9965f09ae52c04886a1f04e13ccdce57" +LIC_FILES_CHKSUM = "file://imgtool/main.py;beginline=3;endline=18;md5=0645fb61e2f961a110302fbfdb227446" -SRC_URI += "file://cbor2.patch;striplevel=2" - -SRC_URI[sha256sum] = "4858f5c5f48cfa4a0bb99e60d00aa291172a7ecc2afe4fb77ed96121f59b6e2f" +SRC_URI[sha256sum] = "4f7fbcdf53c44eaaa6226504510ccb52f7ef00c997503cf94934b330c9607b60" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-importlib-metadata_8.4.0.bb b/meta-python/recipes-devtools/python/python3-importlib-metadata_8.4.0.bb new file mode 100644 index 0000000000..b81d173839 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-importlib-metadata_8.4.0.bb @@ -0,0 +1,20 @@ +SUMMARY = "Read metadata from Python packages" +HOMEPAGE = "https://pypi.org/project/importlib-metadata/" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57" + +inherit pypi python_setuptools_build_meta + +PYPI_PACKAGE = "importlib_metadata" +UPSTREAM_CHECK_REGEX = "/importlib-metadata/(?P<pver>(\d+[\.\-_]*)+)/" + +SRC_URI[sha256sum] = "9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5" + +S = "${WORKDIR}/importlib_metadata-${PV}" + +DEPENDS += "python3-setuptools-scm-native" +RDEPENDS:${PN} += "python3-zipp" +RDEPENDS:${PN}:append:class-target = " python3-misc" +RDEPENDS:${PN}:append:class-nativesdk = " python3-misc" + +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_21.3.0.bb deleted file mode 100644 index 60c80a2c85..0000000000 --- a/meta-python/recipes-devtools/python/python3-incremental_21.3.0.bb +++ /dev/null @@ -1,19 +0,0 @@ -DESCRIPTION = "Incremental is a small library that versions your Python projects" -HOMEPAGE = "https://github.com/twisted/incremental" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=6ca9b07f08e2c72d48c74d363d1e0e15" - -SRC_URI[sha256sum] = "02f5de5aff48f6b9f665d99d48bfc7ec03b6e3943210de7cfc88856d755d6f57" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-twisted \ - ${PYTHON_PN}-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" -BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-incremental_24.7.2.bb b/meta-python/recipes-devtools/python/python3-incremental_24.7.2.bb new file mode 100644 index 0000000000..dc8ecb3302 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-incremental_24.7.2.bb @@ -0,0 +1,33 @@ +DESCRIPTION = "Incremental is a small library that versions your Python projects" +HOMEPAGE = "https://github.com/twisted/incremental" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=6ca9b07f08e2c72d48c74d363d1e0e15" + +SRC_URI[sha256sum] = "fb4f1d47ee60efe87d4f6f0ebb5f70b9760db2b2574c59c8e8912be4ebd464c9" + +inherit pypi python_setuptools_build_meta + +PACKAGE_BEFORE_PN = "\ + ${PN}-scripts \ + ${PN}-tests \ +" + +FILES:${PN}-scripts = "\ + ${PYTHON_SITEPACKAGES_DIR}/incremental/update.py \ + ${PYTHON_SITEPACKAGES_DIR}/incremental/__pycache__/update*.pyc \ +" + +RDEPENDS:${PN}-scripts = "\ + python3-click \ +" + +FILES:${PN}-tests = "${PYTHON_SITEPACKAGES_DIR}/incremental/tests" + +# The tests require unit testing tool 'trial' from the twisted package +RDEPENDS:${PN}-tests = "\ + ${PN}-scripts \ + python3-twisted \ +" + +BBCLASSEXTEND = "native" + diff --git a/meta-python/recipes-devtools/python/python3-inflate64/0001-Do-not-override-const-qualifier.patch b/meta-python/recipes-devtools/python/python3-inflate64/0001-Do-not-override-const-qualifier.patch new file mode 100644 index 0000000000..5391a11da0 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-inflate64/0001-Do-not-override-const-qualifier.patch @@ -0,0 +1,83 @@ +From 7e3a795cbeea94b3324aa926f2b11904cb169acc Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Tue, 2 Jul 2024 22:02:38 -0700 +Subject: [PATCH] Do not override 'const' qualifier + +This has worked so far but with fortified system headers from +Glibc 2.40+ and clang compiler it ends up in compile errors + +| In file included from /mnt/b/yoe/master/build/tmp/work/riscv64-yoe-linux/python3-inflate64/1.0.0/recipe-sysroot/usr/include/string.h:548: +| /mnt/b/yoe/master/build/tmp/work/riscv64-yoe-linux/python3-inflate64/1.0.0/recipe-sysroot/usr/include/bits/string_fortified.h:77:66: error: pass_object_size attribute only applies to constant pointer arguments +| 77 | __NTH (strcpy (__fortify_clang_overload_arg (char *, __restrict, __dest), +| | ^ +| /mnt/b/yoe/master/build/tmp/work/riscv64-yoe-linux/python3-inflate64/1.0.0/recipe-sysroot/usr/include/bits/string_fortified.h:86:66: error: pass_object_size attribute only applies to constant pointer arguments +| 86 | __NTH (stpcpy (__fortify_clang_overload_arg (char *, __restrict, __dest), +| | ^ +| /mnt/b/yoe/master/build/tmp/work/riscv64-yoe-linux/python3-inflate64/1.0.0/recipe-sysroot/usr/include/bits/string_fortified.h:96:67: error: pass_object_size attribute only applies to constant pointer arguments +| 96 | __NTH (strncpy (__fortify_clang_overload_arg (char *, __restrict, __dest), +| | ^ +| /mnt/b/yoe/master/build/tmp/work/riscv64-yoe-linux/python3-inflate64/1.0.0/recipe-sysroot/usr/include/bits/string_fortified.h:107:56: error: pass_object_size attribute only applies to constant pointer arguments +| 107 | __NTH (stpncpy (__fortify_clang_overload_arg (char *, ,__dest), +| | ^ +| /mnt/b/yoe/master/build/tmp/work/riscv64-yoe-linux/python3-inflate64/1.0.0/recipe-sysroot/usr/include/bits/string_fortified.h:136:66: error: pass_object_size attribute only applies to constant pointer arguments +| 136 | __NTH (strcat (__fortify_clang_overload_arg (char *, __restrict, __dest), +| | ^ +| /mnt/b/yoe/master/build/tmp/work/riscv64-yoe-linux/python3-inflate64/1.0.0/recipe-sysroot/usr/include/bits/string_fortified.h:145:67: error: pass_object_size attribute only applies to constant pointer arguments +| 145 | __NTH (strncat (__fortify_clang_overload_arg (char *, __restrict, __dest), +| | ^ +| /mnt/b/yoe/master/build/tmp/work/riscv64-yoe-linux/python3-inflate64/1.0.0/recipe-sysroot/usr/include/bits/string_fortified.h:161:67: error: pass_object_size attribute only applies to constant pointer arguments +| 161 | __NTH (strlcpy (__fortify_clang_overload_arg (char *, __restrict, __dest), + +Therefore adjust needed places to use const qualifier + +Upstream-Status: Submitted [https://codeberg.org/miurahr/inflate64/pulls/13] +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + src/lib/deflate.h | 2 +- + src/lib/deflate_tree.c | 4 ++-- + src/lib/inflate64_config.h | 3 --- + 3 files changed, 3 insertions(+), 6 deletions(-) + +diff --git a/src/lib/deflate.h b/src/lib/deflate.h +index 72a324f..c780be9 100644 +--- a/src/lib/deflate.h ++++ b/src/lib/deflate.h +@@ -288,6 +288,6 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, char FAR *buf, + extern const unsigned char ZLIB_INTERNAL _dist_code[]; + #endif + #endif +-extern uch ZLIB_INTERNAL length_code[]; ++extern const uch ZLIB_INTERNAL length_code[]; + + #endif /* DEFLATE_H */ +diff --git a/src/lib/deflate_tree.c b/src/lib/deflate_tree.c +index 5a66139..cdee934 100644 +--- a/src/lib/deflate_tree.c ++++ b/src/lib/deflate_tree.c +@@ -78,10 +78,10 @@ local const uch bl_order[BL_CODES] + + #define DIST_CODE_LEN 768 /* see definition of array dist_code below */ + +-local int base_length[LENGTH_CODES]; ++local const int base_length[LENGTH_CODES]; + /* First normalized length for each code (0 = MIN_MATCH) */ + +-uch length_code[BASE_MATCH-MIN_MATCH+1]; ++const uch length_code[BASE_MATCH-MIN_MATCH+1]; + /* length code for each normalized match length (0 == MIN_MATCH) */ + + #if defined(GEN_TREES_H) || !defined(STDC) +diff --git a/src/lib/inflate64_config.h b/src/lib/inflate64_config.h +index 16cfd12..ade7300 100644 +--- a/src/lib/inflate64_config.h ++++ b/src/lib/inflate64_config.h +@@ -53,9 +53,6 @@ + # define FAR + #endif + +-#ifndef const +-# define const +-#endif + #define z_const const + + typedef unsigned char uch; 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..9fbd5157af --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-inflate64_1.0.0.bb @@ -0,0 +1,17 @@ +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 += "file://0001-Do-not-override-const-qualifier.patch" +SRC_URI[sha256sum] = "3278827b803cf006a1df251f3e13374c7d26db779e5a33329cc11789b804bc2d" + +PYPI_PACKAGE = "inflate64" + +RDEPENDS:${PN} += "\ + python3-core \ + python3-importlib-metadata \ +" diff --git a/meta-python/recipes-devtools/python/python3-inflection/run-ptest b/meta-python/recipes-devtools/python/python3-inflection/run-ptest index 0caffb794c..f1c8729f0e 100644 --- a/meta-python/recipes-devtools/python/python3-inflection/run-ptest +++ b/meta-python/recipes-devtools/python/python3-inflection/run-ptest @@ -1,4 +1,4 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO test_inflection.py | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-inflection_0.5.1.bb b/meta-python/recipes-devtools/python/python3-inflection_0.5.1.bb index ea3b76d511..5c6f4e2356 100644 --- a/meta-python/recipes-devtools/python/python3-inflection_0.5.1.bb +++ b/meta-python/recipes-devtools/python/python3-inflection_0.5.1.bb @@ -13,8 +13,9 @@ SRC_URI +=" \ file://run-ptest \ " -RDEPENDS:${PN}_ptest +=" \ - ${PYTHON_PN}_pytest \ +RDEPENDS:${PN}-ptest +=" \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { @@ -22,6 +23,6 @@ do_install_ptest() { } -RDEPENDS:${PN} += "${PYTHON_PN}-pytest" +RDEPENDS:${PN} += "python3-pytest" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-inotify/new-test-inotify.patch b/meta-python/recipes-devtools/python/python3-inotify/new-test-inotify.patch new file mode 100644 index 0000000000..e462615e14 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-inotify/new-test-inotify.patch @@ -0,0 +1,620 @@ +From 80010e27d774e8b722d569384492eaab2bc4ac61 Mon Sep 17 00:00:00 2001 +From: Joe Slater <joe.slater@windriver.com> +Date: Thu, 27 Jul 2023 15:01:04 +0000 +Subject: [PATCH] working commit + +It is not safe to assume the values returned by add_watch(), +so we add a local helper get_wd() to retrieve them. This fixes +a problem in TestInotifyTree.test__cycle() where the +wd's for the 'aa' and 'bb' paths are not '2' and '3', +respectively. + +A second issue is that Inotify._get_event_names() should +return a set or sorted list to avoid comparison problems, +but that is not addressed here since it could be viewed as +changing the API. + +This test_inotify.py is based on the version in the fix_tests branch of +pyinotify as of commit d7d3c58... + +Upstream-Status: Submitted [github.com/dsoprea/PyInotify/pull/104] + +Signed-off-by: Joe Slater <joe.slater@windriver.com> +--- + tests/test_inotify.py | 346 ++++++++++++++++++++++++++++++++---------- + 1 file changed, 262 insertions(+), 84 deletions(-) + +diff --git a/tests/test_inotify.py b/tests/test_inotify.py +index d9f1f84..d89a49e 100644 +--- a/tests/test_inotify.py ++++ b/tests/test_inotify.py +@@ -2,6 +2,7 @@ + + import os + import unittest ++import time + + import inotify.constants + import inotify.calls +@@ -15,6 +16,11 @@ except NameError: + else: + _HAS_PYTHON2_UNICODE_SUPPORT = True + ++# Inotify does not have a get for watch descriptors ++# ++def get_wd(i, path): ++ return i._Inotify__watches[path] ++ + + class TestInotify(unittest.TestCase): + def __init__(self, *args, **kwargs): +@@ -29,11 +35,11 @@ class TestInotify(unittest.TestCase): + @unittest.skipIf(_HAS_PYTHON2_UNICODE_SUPPORT is True, "Not in Python 3") + def test__international_naming_python3(self): + with inotify.test_support.temp_path() as path: +- inner_path = os.path.join(path, '新增資料夾') ++ inner_path = os.path.join(path, u'新增資料夾') + os.mkdir(inner_path) + + i = inotify.adapters.Inotify() +- i.add_watch(inner_path) ++ wd = i.add_watch(inner_path) + + with open(os.path.join(inner_path, 'filename'), 'w'): + pass +@@ -41,12 +47,27 @@ class TestInotify(unittest.TestCase): + events = self.__read_all_events(i) + + expected = [ +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=256, cookie=0, len=16), ['IN_CREATE'], inner_path, 'filename'), +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=32, cookie=0, len=16), ['IN_OPEN'], inner_path, 'filename'), +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], inner_path, 'filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd, mask=256, cookie=0, len=16), ['IN_CREATE'], inner_path, 'filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd, mask=32, cookie=0, len=16), ['IN_OPEN'], inner_path, 'filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], inner_path, 'filename'), + ] + +- self.assertEquals(events, expected) ++ if events != expected: ++ print("ACTUAL:") ++ print("") ++ ++ for i, event in enumerate(events): ++ print(event) ++ ++ print("") ++ ++ print("EXPECTED:") ++ print("") ++ ++ for i, event in enumerate(expected): ++ print(event) ++ ++ raise Exception("Events not correct.") + + @unittest.skipIf(_HAS_PYTHON2_UNICODE_SUPPORT is False, "Not in Python 2") + def test__international_naming_python2(self): +@@ -55,7 +76,7 @@ class TestInotify(unittest.TestCase): + os.mkdir(inner_path) + + i = inotify.adapters.Inotify() +- i.add_watch(inner_path) ++ wd = i.add_watch(inner_path) + + with open(os.path.join(inner_path, u'filename料夾'), 'w'): + pass +@@ -63,12 +84,28 @@ class TestInotify(unittest.TestCase): + events = self.__read_all_events(i) + + expected = [ +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=256, cookie=0, len=16), ['IN_CREATE'], inner_path, u'filename料夾'), +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=32, cookie=0, len=16), ['IN_OPEN'], inner_path, u'filename料夾'), +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], inner_path, u'filename料夾'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd, mask=256, cookie=0, len=16), ['IN_CREATE'], inner_path, u'filename料夾'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd, mask=32, cookie=0, len=16), ['IN_OPEN'], inner_path, u'filename料夾'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], inner_path, u'filename料夾'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd, mask=16, cookie=0, len=16), ['IN_CLOSE_NOWRITE'], inner_path, u'filename料夾'), + ] + +- self.assertEquals(events, expected) ++ if events != expected: ++ print("ACTUAL:") ++ print("") ++ ++ for i, event in enumerate(events): ++ print(event) ++ ++ print("") ++ ++ print("EXPECTED:") ++ print("") ++ ++ for i, event in enumerate(expected): ++ print(event) ++ ++ raise Exception("Events not correct.") + + def test__cycle(self): + with inotify.test_support.temp_path() as path: +@@ -79,7 +116,7 @@ class TestInotify(unittest.TestCase): + os.mkdir(path2) + + i = inotify.adapters.Inotify() +- i.add_watch(path1) ++ wd = i.add_watch(path1) + + with open('ignored_new_file', 'w'): + pass +@@ -96,32 +133,47 @@ class TestInotify(unittest.TestCase): + + expected = [ + ( +- inotify.adapters._INOTIFY_EVENT(wd=1, mask=256, cookie=0, len=16), ++ inotify.adapters._INOTIFY_EVENT(wd=wd, mask=256, cookie=0, len=16), + ['IN_CREATE'], + path1, + 'seen_new_file' + ), + ( +- inotify.adapters._INOTIFY_EVENT(wd=1, mask=32, cookie=0, len=16), ++ inotify.adapters._INOTIFY_EVENT(wd=wd, mask=32, cookie=0, len=16), + ['IN_OPEN'], + path1, + 'seen_new_file' + ), + ( +- inotify.adapters._INOTIFY_EVENT(wd=1, mask=8, cookie=0, len=16), ++ inotify.adapters._INOTIFY_EVENT(wd=wd, mask=8, cookie=0, len=16), + ['IN_CLOSE_WRITE'], + path1, + 'seen_new_file' + ), + ( +- inotify.adapters._INOTIFY_EVENT(wd=1, mask=512, cookie=0, len=16), ++ inotify.adapters._INOTIFY_EVENT(wd=wd, mask=512, cookie=0, len=16), + ['IN_DELETE'], + path1, + 'seen_new_file' + ) + ] + +- self.assertEquals(events, expected) ++ if events != expected: ++ print("ACTUAL:") ++ print("") ++ ++ for i, event in enumerate(events): ++ print(event) ++ ++ print("") ++ ++ print("EXPECTED:") ++ print("") ++ ++ for i, event in enumerate(expected): ++ print(event) ++ ++ raise Exception("Events not correct.") + + # This can't be removed until *after* we've read the events because + # they'll be flushed the moment we remove the watch. +@@ -131,7 +183,7 @@ class TestInotify(unittest.TestCase): + pass + + events = self.__read_all_events(i) +- self.assertEquals(events, []) ++ self.assertEqual(events, []) + + @staticmethod + def _open_write_close(*args): +@@ -167,23 +219,47 @@ class TestInotify(unittest.TestCase): + with inotify.test_support.temp_path() as path: + path1 = TestInotify._make_temp_path(path, 'aa') + path2 = TestInotify._make_temp_path(path, 'bb') ++ + i = inotify.adapters.Inotify([path1, path2]) ++ + TestInotify._open_write_close('ignored_new_file') + TestInotify._open_write_close(path1, 'seen_new_file') + TestInotify._open_write_close(path2, 'seen_new_file2') ++ ++ wd_path1 = get_wd(i, path1) ++ wd_path2 = get_wd(i, path2) ++ ++ + os.remove(os.path.join(path1, 'seen_new_file')) ++ + events = self.__read_all_events(i) ++ + expected = [ +- TestInotify._event_create(wd=1, path=path1, filename='seen_new_file'), +- TestInotify._event_open(wd=1, path=path1, filename='seen_new_file'), +- TestInotify._event_close_write(wd=1, path=path1, filename='seen_new_file'), +- TestInotify._event_create(wd=2, path=path2, filename='seen_new_file2'), +- TestInotify._event_open(wd=2, path=path2, filename='seen_new_file2'), +- TestInotify._event_close_write(wd=2, path=path2, filename='seen_new_file2'), +- TestInotify._event_general(wd=1, mask=512, type_name='IN_DELETE', +- path=path1, filename='seen_new_file') ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=256, cookie=0, len=16), ['IN_CREATE'], path1, u'seen_new_file'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=32, cookie=0, len=16), ['IN_OPEN'], path1, u'seen_new_file'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path1, u'seen_new_file'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=256, cookie=0, len=16), ['IN_CREATE'], path2, u'seen_new_file2'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=32, cookie=0, len=16), ['IN_OPEN'], path2, u'seen_new_file2'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path2, u'seen_new_file2'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=512, cookie=0, len=16), ['IN_DELETE'], path1, u'seen_new_file'), + ] +- self.assertEquals(events, expected) ++ ++ if events != expected: ++ print("ACTUAL:") ++ print("") ++ ++ for i, event in enumerate(events): ++ print(event) ++ ++ print("") ++ ++ print("EXPECTED:") ++ print("") ++ ++ for i, event in enumerate(expected): ++ print(event) ++ ++ raise Exception("Events not correct.") + + def test__error_on_watch_nonexistent_folder(self): + i = inotify.adapters.Inotify() +@@ -201,7 +277,7 @@ class TestInotify(unittest.TestCase): + i = inotify.adapters.Inotify() + names = i._get_event_names(all_mask) + +- self.assertEquals(names, all_names) ++ self.assertEqual(names, all_names) + + + class TestInotifyTree(unittest.TestCase): +@@ -219,56 +295,101 @@ class TestInotifyTree(unittest.TestCase): + path1 = os.path.join(path, 'aa') + os.mkdir(path1) + ++ time.sleep(.10) ++ + path2 = os.path.join(path, 'bb') + os.mkdir(path2) + ++ time.sleep(.10) ++ + i = inotify.adapters.InotifyTree(path) + + with open('seen_new_file1', 'w'): + pass + ++ time.sleep(.10) ++ + with open(os.path.join(path1, 'seen_new_file2'), 'w'): + pass + ++ time.sleep(.10) ++ + with open(os.path.join(path2, 'seen_new_file3'), 'w'): + pass + ++ time.sleep(.10) ++ ++ wd_path = get_wd(i.inotify, path) ++ wd_path1 = get_wd(i.inotify, path1) ++ wd_path2 = get_wd(i.inotify, path2) ++ + os.remove(os.path.join(path, 'seen_new_file1')) ++ ++ time.sleep(.10) ++ + os.remove(os.path.join(path1, 'seen_new_file2')) ++ ++ time.sleep(.10) ++ + os.remove(os.path.join(path2, 'seen_new_file3')) + ++ time.sleep(.10) ++ + os.rmdir(path1) ++ ++ time.sleep(.10) ++ + os.rmdir(path2) + +- events = self.__read_all_events(i) ++ time.sleep(.10) + ++ events = self.__read_all_events(i) ++ events = sorted(events) ++ + expected = [ +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=256, cookie=0, len=16), ['IN_CREATE'], path, 'seen_new_file1'), +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=32, cookie=0, len=16), ['IN_OPEN'], path, 'seen_new_file1'), +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path, 'seen_new_file1'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path, mask=256, cookie=0, len=16), ['IN_CREATE'], path, 'seen_new_file1'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path, mask=32, cookie=0, len=16), ['IN_OPEN'], path, 'seen_new_file1'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path, 'seen_new_file1'), + +- (inotify.adapters._INOTIFY_EVENT(wd=2, mask=256, cookie=0, len=16), ['IN_CREATE'], path1, 'seen_new_file2'), +- (inotify.adapters._INOTIFY_EVENT(wd=2, mask=32, cookie=0, len=16), ['IN_OPEN'], path1, 'seen_new_file2'), +- (inotify.adapters._INOTIFY_EVENT(wd=2, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path1, 'seen_new_file2'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=256, cookie=0, len=16), ['IN_CREATE'], path1, 'seen_new_file2'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=32, cookie=0, len=16), ['IN_OPEN'], path1, 'seen_new_file2'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path1, 'seen_new_file2'), + +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=256, cookie=0, len=16), ['IN_CREATE'], path2, 'seen_new_file3'), +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=32, cookie=0, len=16), ['IN_OPEN'], path2, 'seen_new_file3'), +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path2, 'seen_new_file3'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=256, cookie=0, len=16), ['IN_CREATE'], path2, 'seen_new_file3'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=32, cookie=0, len=16), ['IN_OPEN'], path2, 'seen_new_file3'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path2, 'seen_new_file3'), + +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=512, cookie=0, len=16), ['IN_DELETE'], path, 'seen_new_file1'), +- (inotify.adapters._INOTIFY_EVENT(wd=2, mask=512, cookie=0, len=16), ['IN_DELETE'], path1, 'seen_new_file2'), +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=512, cookie=0, len=16), ['IN_DELETE'], path2, 'seen_new_file3'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path, mask=512, cookie=0, len=16), ['IN_DELETE'], path, 'seen_new_file1'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=512, cookie=0, len=16), ['IN_DELETE'], path1, 'seen_new_file2'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=512, cookie=0, len=16), ['IN_DELETE'], path2, 'seen_new_file3'), + +- (inotify.adapters._INOTIFY_EVENT(wd=2, mask=1024, cookie=0, len=0), ['IN_DELETE_SELF'], path1, ''), +- (inotify.adapters._INOTIFY_EVENT(wd=2, mask=32768, cookie=0, len=0), ['IN_IGNORED'], path1, ''), +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=1073742336, cookie=0, len=16), ['IN_ISDIR', 'IN_DELETE'], path, 'aa'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=1024, cookie=0, len=0), ['IN_DELETE_SELF'], path1, ''), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=32768, cookie=0, len=0), ['IN_IGNORED'], path1, ''), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path, mask=1073742336, cookie=0, len=16), ['IN_DELETE', 'IN_ISDIR'], path, 'aa'), + +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=1024, cookie=0, len=0), ['IN_DELETE_SELF'], path2, ''), +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=32768, cookie=0, len=0), ['IN_IGNORED'], path2, ''), +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=1073742336, cookie=0, len=16), ['IN_ISDIR', 'IN_DELETE'], path, 'bb'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=1024, cookie=0, len=0), ['IN_DELETE_SELF'], path2, ''), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=32768, cookie=0, len=0), ['IN_IGNORED'], path2, ''), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path, mask=1073742336, cookie=0, len=16), ['IN_DELETE', 'IN_ISDIR'], path, 'bb'), + ] + +- self.assertEquals(events, expected) ++ expected = sorted(expected) ++ ++ if events != expected: ++ print("ACTUAL:") ++ print("") ++ ++ for i, event in enumerate(events): ++ print(event) ++ ++ print("") ++ ++ print("EXPECTED:") ++ print("") ++ ++ for i, event in enumerate(expected): ++ print(event) ++ ++ raise Exception("Events not correct.") + + def test__renames(self): + +@@ -283,26 +404,30 @@ class TestInotifyTree(unittest.TestCase): + new_path = os.path.join(path, 'new_folder') + + os.mkdir(old_path) ++ ++ wd_path = get_wd(i.inotify, path) + + events1 = self.__read_all_events(i) + + expected = [ +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=1073742080, cookie=events1[0][0].cookie, len=16), ['IN_ISDIR', 'IN_CREATE'], path, 'old_folder'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path, mask=1073742080, cookie=events1[0][0].cookie, len=16), ['IN_CREATE', 'IN_ISDIR'], path, 'old_folder'), + ] + +- self.assertEquals(events1, expected) +- ++ self.assertEqual(events1, expected) + + os.rename(old_path, new_path) + ++ wd_old_path = get_wd(i.inotify, old_path) ++ + events2 = self.__read_all_events(i) + + expected = [ +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=1073741888, cookie=events2[0][0].cookie, len=16), ['IN_MOVED_FROM', 'IN_ISDIR'], path, 'old_folder'), +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=1073741952, cookie=events2[1][0].cookie, len=16), ['IN_MOVED_TO', 'IN_ISDIR'], path, 'new_folder'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path, mask=1073741888, cookie=events2[0][0].cookie, len=16), ['IN_MOVED_FROM', 'IN_ISDIR'], path, 'old_folder'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path, mask=1073741952, cookie=events2[1][0].cookie, len=16), ['IN_MOVED_TO', 'IN_ISDIR'], path, 'new_folder'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_old_path, mask=2048, cookie=0, len=0), ['IN_MOVE_SELF'], new_path, '') + ] + +- self.assertEquals(events2, expected) ++ self.assertEqual(events2, expected) + + + with open(os.path.join(new_path, 'old_filename'), 'w'): +@@ -318,21 +443,33 @@ class TestInotifyTree(unittest.TestCase): + events3 = self.__read_all_events(i) + + expected = [ +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=256, cookie=0, len=16), ['IN_CREATE'], new_path, 'old_filename'), +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=32, cookie=0, len=16), ['IN_OPEN'], new_path, 'old_filename'), +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], new_path, 'old_filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_old_path, mask=256, cookie=0, len=16), ['IN_CREATE'], new_path, 'old_filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_old_path, mask=32, cookie=0, len=16), ['IN_OPEN'], new_path, 'old_filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_old_path, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], new_path, 'old_filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_old_path, mask=64, cookie=events3[3][0].cookie, len=16), ['IN_MOVED_FROM'], new_path, 'old_filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_old_path, mask=128, cookie=events3[4][0].cookie, len=16), ['IN_MOVED_TO'], new_path, 'new_filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_old_path, mask=512, cookie=0, len=16), ['IN_DELETE'], new_path, 'new_filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_old_path, mask=1024, cookie=0, len=0), ['IN_DELETE_SELF'], new_path, ''), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_old_path, mask=32768, cookie=0, len=0), ['IN_IGNORED'], new_path, ''), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path, mask=1073742336, cookie=0, len=16), ['IN_DELETE', 'IN_ISDIR'], path, 'new_folder'), ++ ] + +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=64, cookie=events3[3][0].cookie, len=16), ['IN_MOVED_FROM'], new_path, 'old_filename'), +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=128, cookie=events3[4][0].cookie, len=16), ['IN_MOVED_TO'], new_path, 'new_filename'), ++ if events3 != expected: ++ print("ACTUAL:") ++ print("") + +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=512, cookie=0, len=16), ['IN_DELETE'], new_path, 'new_filename'), ++ for i, event in enumerate(events3): ++ print(event) + +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=1024, cookie=0, len=0), ['IN_DELETE_SELF'], new_path, ''), +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=32768, cookie=0, len=0), ['IN_IGNORED'], new_path, ''), +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=1073742336, cookie=0, len=16), ['IN_ISDIR', 'IN_DELETE'], path, 'new_folder'), +- ] ++ print("") ++ ++ print("EXPECTED:") ++ print("") + +- self.assertEquals(events3, expected) ++ for i, event in enumerate(expected): ++ print(event) ++ ++ raise Exception("Events not correct.") + + def test__automatic_new_watches_on_new_paths(self): + +@@ -346,39 +483,60 @@ class TestInotifyTree(unittest.TestCase): + path2 = os.path.join(path1, 'folder2') + + os.mkdir(path1) ++ ++ wd_path = get_wd(i.inotify, path) + + events = self.__read_all_events(i) + + expected = [ +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=1073742080, cookie=0, len=16), ['IN_ISDIR', 'IN_CREATE'], path, 'folder1'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path, mask=1073742080, cookie=0, len=16), ['IN_CREATE', 'IN_ISDIR'], path, 'folder1'), + ] + +- self.assertEquals(events, expected) ++ self.assertEqual(events, expected) + + + os.mkdir(path2) + ++ wd_path1 = get_wd(i.inotify, path1) ++ + events = self.__read_all_events(i) + + expected = [ +- (inotify.adapters._INOTIFY_EVENT(wd=2, mask=1073742080, cookie=0, len=16), ['IN_ISDIR', 'IN_CREATE'], path1, 'folder2'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=1073742080, cookie=0, len=16), ['IN_CREATE', 'IN_ISDIR'], path1, 'folder2'), + ] + +- self.assertEquals(events, expected) ++ self.assertEqual(events, expected) + + + with open(os.path.join(path2,'filename'), 'w'): + pass + ++ wd_path2 = get_wd(i.inotify, path2) ++ + events = self.__read_all_events(i) + + expected = [ +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=256, cookie=0, len=16), ['IN_CREATE'], path2, 'filename'), +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=32, cookie=0, len=16), ['IN_OPEN'], path2, 'filename'), +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path2, 'filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=256, cookie=0, len=16), ['IN_CREATE'], path2, 'filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=32, cookie=0, len=16), ['IN_OPEN'], path2, 'filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path2, 'filename'), + ] + +- self.assertEquals(events, expected) ++ if events != expected: ++ print("ACTUAL:") ++ print("") ++ ++ for i, event in enumerate(events): ++ print(event) ++ ++ print("") ++ ++ print("EXPECTED:") ++ print("") ++ ++ for i, event in enumerate(expected): ++ print(event) ++ ++ raise Exception("Events not correct.") + + def test__automatic_new_watches_on_existing_paths(self): + +@@ -396,16 +554,33 @@ class TestInotifyTree(unittest.TestCase): + + with open(os.path.join(path2,'filename'), 'w'): + pass ++ ++ wd = get_wd(i.inotify, path2) + + events = self.__read_all_events(i) + + expected = [ +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=256, cookie=0, len=16), ['IN_CREATE'], path2, 'filename'), +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=32, cookie=0, len=16), ['IN_OPEN'], path2, 'filename'), +- (inotify.adapters._INOTIFY_EVENT(wd=3, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path2, 'filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd, mask=256, cookie=0, len=16), ['IN_CREATE'], path2, 'filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd, mask=32, cookie=0, len=16), ['IN_OPEN'], path2, 'filename'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path2, 'filename'), + ] + +- self.assertEquals(events, expected) ++ if events != expected: ++ print("ACTUAL:") ++ print("") ++ ++ for i, event in enumerate(events): ++ print(event) ++ ++ print("") ++ ++ print("EXPECTED:") ++ print("") ++ ++ for i, event in enumerate(expected): ++ print(event) ++ ++ raise Exception("Events not correct.") + + + class TestInotifyTrees(unittest.TestCase): +@@ -428,6 +603,9 @@ class TestInotifyTrees(unittest.TestCase): + + i = inotify.adapters.InotifyTrees([path1, path2]) + ++ wd_path1 = get_wd(i.inotify, path1) ++ wd_path2 = get_wd(i.inotify, path2) ++ + with open(os.path.join(path1, 'seen_new_file1'), 'w'): + pass + +@@ -437,13 +615,13 @@ class TestInotifyTrees(unittest.TestCase): + events = self.__read_all_events(i) + + expected = [ +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=256, cookie=0, len=16), ['IN_CREATE'], path1, 'seen_new_file1'), +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=32, cookie=0, len=16), ['IN_OPEN'], path1, 'seen_new_file1'), +- (inotify.adapters._INOTIFY_EVENT(wd=1, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path1, 'seen_new_file1'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=256, cookie=0, len=16), ['IN_CREATE'], path1, 'seen_new_file1'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=32, cookie=0, len=16), ['IN_OPEN'], path1, 'seen_new_file1'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path1, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path1, 'seen_new_file1'), + +- (inotify.adapters._INOTIFY_EVENT(wd=2, mask=256, cookie=0, len=16), ['IN_CREATE'], path2, 'seen_new_file2'), +- (inotify.adapters._INOTIFY_EVENT(wd=2, mask=32, cookie=0, len=16), ['IN_OPEN'], path2, 'seen_new_file2'), +- (inotify.adapters._INOTIFY_EVENT(wd=2, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path2, 'seen_new_file2'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=256, cookie=0, len=16), ['IN_CREATE'], path2, 'seen_new_file2'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=32, cookie=0, len=16), ['IN_OPEN'], path2, 'seen_new_file2'), ++ (inotify.adapters._INOTIFY_EVENT(wd=wd_path2, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], path2, 'seen_new_file2'), + ] + +- self.assertEquals(events, expected) ++ self.assertEqual(events, expected) +-- +2.35.5 + diff --git a/meta-python/recipes-devtools/python/python3-inotify/run-ptest b/meta-python/recipes-devtools/python/python3-inotify/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-inotify/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-inotify_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 fd636421bd..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" @@ -14,7 +14,8 @@ SRC_URI += " \ inherit pypi setuptools3 ptest RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { @@ -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 8b39679e45..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 \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-ipython-genutils_0.2.0.bb b/meta-python/recipes-devtools/python/python3-ipython-genutils_0.2.0.bb index 2a28cf9ecb..3261d80474 100644 --- a/meta-python/recipes-devtools/python/python3-ipython-genutils_0.2.0.bb +++ b/meta-python/recipes-devtools/python/python3-ipython-genutils_0.2.0.bb @@ -1,11 +1,13 @@ SUMMARY = "Vestigial utilities from IPython" HOMEPAGE = "http://ipython.org" -AUTHOR = "IPython Development Team <ipython-dev@scipy.org>" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://COPYING.md;md5=f7c3032c3ac398265224533a0a333a35" PYPI_PACKAGE = "ipython_genutils" +UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/ipython_genutils" +UPSTREAM_CHECK_REGEX = "/ipython_genutils/(?P<pver>(\d+[\.\-_]*)+)" + SRC_URI[md5sum] = "5a4f9781f78466da0ea1a648f3e1f79f" SRC_URI[sha256sum] = "eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8" diff --git a/meta-python/recipes-devtools/python/python3-ipython_7.28.0.bb b/meta-python/recipes-devtools/python/python3-ipython_7.28.0.bb deleted file mode 100644 index c5d05a8dad..0000000000 --- a/meta-python/recipes-devtools/python/python3-ipython_7.28.0.bb +++ /dev/null @@ -1,28 +0,0 @@ -SUMMARY = "IPython: Productive Interactive Computing" -HOMEPAGE = "https://ipython.org" -AUTHOR = "The IPython Development Team <ipython-dev@python.org>" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://COPYING.rst;md5=59b20262b8663cdd094005bddf47af5f" - -PYPI_PACKAGE = "ipython" - -SRC_URI[sha256sum] = "2097be5c814d1b974aea57673176a924c4c8c9583890e7a5f082f547b9975b11" - -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.27.0.bb b/meta-python/recipes-devtools/python/python3-ipython_8.27.0.bb new file mode 100644 index 0000000000..94e731b88a --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-ipython_8.27.0.bb @@ -0,0 +1,26 @@ +SUMMARY = "IPython: Productive Interactive Computing" +HOMEPAGE = "https://ipython.org" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://COPYING.rst;md5=59b20262b8663cdd094005bddf47af5f" + +SRC_URI[sha256sum] = "0b99a2dc9f15fd68692e898e5568725c6d49c527d36a9fb5960ffbdeaa82ff7e" + +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 python_setuptools_build_meta pypi diff --git a/meta-python/recipes-devtools/python/python3-iso3166/run-ptest b/meta-python/recipes-devtools/python/python3-iso3166/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-iso3166/run-ptest +++ b/meta-python/recipes-devtools/python/python3-iso3166/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-iso3166_2.0.2.bb b/meta-python/recipes-devtools/python/python3-iso3166_2.1.1.bb index bc05f066a6..3aa084d10a 100644 --- a/meta-python/recipes-devtools/python/python3-iso3166_2.0.2.bb +++ b/meta-python/recipes-devtools/python/python3-iso3166_2.1.1.bb @@ -3,16 +3,17 @@ HOMEPAGE = "https://pypi.org/project/iso3166/" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=5e2f4edc7e7408a82e4a1d05f229b695" -SRC_URI[sha256sum] = "04d02cfcfc18a6f8a9a4edb4d0a55e2e4fc575626c29d702f750de415e88d372" +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 \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-iso8601_0.1.16.bb b/meta-python/recipes-devtools/python/python3-iso8601_0.1.16.bb deleted file mode 100644 index 2923647c28..0000000000 --- a/meta-python/recipes-devtools/python/python3-iso8601_0.1.16.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] = "36532f77cc800594e8f16641edae7f1baf7932f05d8e508545b95fc53c6dc85b" - -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 dd39541726..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.10.1.bb b/meta-python/recipes-devtools/python/python3-isort_5.10.1.bb deleted file mode 100644 index 5cb41c5fcf..0000000000 --- a/meta-python/recipes-devtools/python/python3-isort_5.10.1.bb +++ /dev/null @@ -1,20 +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] = "e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-profile \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-pprint \ - ${PYTHON_PN}-difflib \ -" - -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-itsdangerous_2.0.1.bb b/meta-python/recipes-devtools/python/python3-itsdangerous_2.0.1.bb deleted file mode 100644 index 48a77dc8f8..0000000000 --- a/meta-python/recipes-devtools/python/python3-itsdangerous_2.0.1.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=4cda9a0ebd516714f360b0e9418cfb37" - -SRC_URI[sha256sum] = "9e724d68fc22902a1435351f84c3fb8623f303fffcc566a4cb952df8c572cff0" - -inherit pypi setuptools3 - -CLEANBROKEN = "1" - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-simplejson \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-json \ -" diff --git a/meta-python/recipes-devtools/python/python3-itsdangerous_2.2.0.bb b/meta-python/recipes-devtools/python/python3-itsdangerous_2.2.0.bb new file mode 100644 index 0000000000..f4d8d52967 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-itsdangerous_2.2.0.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.txt;md5=4cda9a0ebd516714f360b0e9418cfb37" + +SRC_URI[sha256sum] = "e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173" + +inherit pypi python_setuptools_build_meta + +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.3.bb b/meta-python/recipes-devtools/python/python3-javaobj-py3_0.4.4.bb index eb93e71733..d71101ee2c 100644 --- a/meta-python/recipes-devtools/python/python3-javaobj-py3_0.4.3.bb +++ b/meta-python/recipes-devtools/python/python3-javaobj-py3_0.4.4.bb @@ -5,10 +5,15 @@ DESCRIPTION = "python-javaobj is a python library that provides functions\ representation is a standard data interchange format in Java world." HOMEPAGE = "https://github.com/tcalmant/python-javaobj" LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57" +LIC_FILES_CHKSUM = "file://LICENSE;md5=d273d63619c9aeaf15cdaf76422c4f87" -SRC_URI[sha256sum] = "38f74db3a57e9998a9774e3614afb95cb396f139f29b3fdb130c5af554435259" +SRC_URI[sha256sum] = "e4e3257ef2cf81a3339787a4d5cf924e54c91f095a723f6d2584dae61d4396ed" inherit pypi setuptools3 BBCLASSEXTEND = "native nativesdk" + +RDEPENDS:${PN} += " \ + python3-compression \ + python3-logging \ +" diff --git a/meta-python/recipes-devtools/python/python3-jdatetime_3.6.4.bb b/meta-python/recipes-devtools/python/python3-jdatetime_5.0.0.bb index ad1ca428fe..f1dd368ea0 100644 --- a/meta-python/recipes-devtools/python/python3-jdatetime_3.6.4.bb +++ b/meta-python/recipes-devtools/python/python3-jdatetime_5.0.0.bb @@ -1,9 +1,9 @@ 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=f6890b2f685363312aff7f520831cdef" +LIC_FILES_CHKSUM = "file://LICENSE;md5=c80be45b33471b4a23cf53d06a8172be" -SRC_URI[sha256sum] = "39d0be41076b3a3850c3bfa90817e7ed459edc0e9cadce37dc7229b11f121c7e" +SRC_URI[sha256sum] = "2cc603d913c0d8e328928454d3d295261cb037e9950227f67c9629ab4710fdf9" PYPI_PACKAGE = "jdatetime" @@ -12,6 +12,6 @@ inherit pypi setuptools3 CLEANBROKEN = "1" RDEPENDS:${PN} += " \ - ${PYTHON_PN}-modules \ + python3-modules \ " diff --git a/meta-python/recipes-devtools/python/python3-jdcal/run-ptest b/meta-python/recipes-devtools/python/python3-jdcal/run-ptest index 5cec711696..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-jdcal/run-ptest +++ b/meta-python/recipes-devtools/python/python3-jdcal/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-jdcal_1.4.1.bb b/meta-python/recipes-devtools/python/python3-jdcal_1.4.1.bb index 8655150b03..afabe14a8a 100644 --- a/meta-python/recipes-devtools/python/python3-jdcal_1.4.1.bb +++ b/meta-python/recipes-devtools/python/python3-jdcal_1.4.1.bb @@ -12,14 +12,15 @@ inherit pypi setuptools3 ptest SRC_URI[md5sum] = "e05bdb60fa80f25bc60e73e0c6b7c5dc" SRC_URI[sha256sum] = "472872e096eb8df219c23f2689fc336668bdb43d194094b5cc1707e1640acfc8" -RDEPENDS:${PN} += "${PYTHON_PN}-compression ${PYTHON_PN}-io ${PYTHON_PN}-pprint ${PYTHON_PN}-shell" +RDEPENDS:${PN} += "python3-compression python3-io python3-pprint python3-shell" SRC_URI += " \ file://run-ptest \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-jedi_0.18.1.bb b/meta-python/recipes-devtools/python/python3-jedi_0.19.1.bb index fb582c54bc..56395c3b5d 100644 --- a/meta-python/recipes-devtools/python/python3-jedi_0.18.1.bb +++ b/meta-python/recipes-devtools/python/python3-jedi_0.19.1.bb @@ -1,20 +1,19 @@ SUMMARY = "An autocompletion tool for Python that can be used for text editors." HOMEPAGE = "https://github.com/davidhalter/jedi" -AUTHOR = "David Halter <davidhalter88@gmail.com>" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=5ed06eebfcb244cd66ebf6cef9c23ab4" PYPI_PACKAGE = "jedi" -SRC_URI[sha256sum] = "74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab" +SRC_URI[sha256sum] = "cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd" RDEPENDS:${PN} = " \ - ${PYTHON_PN}-parso \ - ${PYTHON_PN}-core \ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-pydoc \ - ${PYTHON_PN}-compile \ - ${PYTHON_PN}-json \ + python3-parso \ + python3-core \ + python3-compression \ + python3-pydoc \ + python3-compile \ + python3-json \ " inherit setuptools3 pypi diff --git a/meta-python/recipes-devtools/python/python3-jmespath_0.10.0.bb b/meta-python/recipes-devtools/python/python3-jmespath_1.0.1.bb index c395143cc9..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,8 +4,7 @@ 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 diff --git a/meta-python/recipes-devtools/python/python3-joblib_1.1.0.bb b/meta-python/recipes-devtools/python/python3-joblib_1.4.2.bb index e69cfefd1f..399ccd22e9 100644 --- a/meta-python/recipes-devtools/python/python3-joblib_1.1.0.bb +++ b/meta-python/recipes-devtools/python/python3-joblib_1.4.2.bb @@ -2,13 +2,12 @@ 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 +inherit python_setuptools_build_meta pypi -SRC_URI[sha256sum] = "4158fcecd13733f8be669be0683b96ebdbbd38d23559f54dca7205aea1bf1e35" +SRC_URI[sha256sum] = "2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e" RDEPENDS:${PN} += " \ python3-asyncio \ - python3-distutils \ python3-json \ python3-multiprocessing \ python3-pprint \ diff --git a/meta-python/recipes-devtools/python/python3-jsbeautifier_1.15.1.bb b/meta-python/recipes-devtools/python/python3-jsbeautifier_1.15.1.bb new file mode 100644 index 0000000000..5a0e5a8499 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-jsbeautifier_1.15.1.bb @@ -0,0 +1,19 @@ +SUMMARY = "JavaScript unobfuscator and beautifier." +HOMEPAGE = "https://beautifier.io/" +LICENSE = "MIT" +SECTION = "devel/python" +LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=8227180126797a0148f94f483f3e1489" + +inherit pypi setuptools3 + +SRC_URI[sha256sum] = "ebd733b560704c602d744eafc839db60a1ee9326e30a2a80c4adb8718adc1b24" + +PYPI_PACKAGE="jsbeautifier" + +RDEPENDS:${PN} += "\ + python3-core \ + python3-stringold \ + python3-shell \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-jsmin/7a75d76c2d6bfb917f30ced8f5c0a9a4157f7819.patch b/meta-python/recipes-devtools/python/python3-jsmin/7a75d76c2d6bfb917f30ced8f5c0a9a4157f7819.patch new file mode 100644 index 0000000000..2646e2f5a0 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-jsmin/7a75d76c2d6bfb917f30ced8f5c0a9a4157f7819.patch @@ -0,0 +1,82 @@ +From 7a75d76c2d6bfb917f30ced8f5c0a9a4157f7819 Mon Sep 17 00:00:00 2001 +From: aekoroglu <ali.erdinc.koroglu@intel.com> +Date: Fri, 24 Jun 2022 14:12:59 +0300 +Subject: [PATCH] DeprecationWarning invalid escape sequence fix + +Upstream-Status: Submitted [https://github.com/tikitu/jsmin/pull/38] +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + jsmin/test.py | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +diff --git a/jsmin/test.py b/jsmin/test.py +index 173ac65..afea4e7 100644 +--- a/jsmin/test.py ++++ b/jsmin/test.py +@@ -337,8 +337,8 @@ def testImplicitSemicolon3(self): + self.assertMinified("return//comment...\r\na", "return\na") + + def testSingleComment2(self): +- self.assertMinified('x.replace(/\//, "_")// slash to underscore', +- 'x.replace(/\//,"_")') ++ self.assertMinified('x.replace(/\\//, "_")// slash to underscore', ++ 'x.replace(/\\//,"_")') + + def testSlashesNearComments(self): + original = ''' +@@ -383,8 +383,8 @@ def test_space_in_regex(self): + self.assertMinified(original, original) + + def test_brackets_around_slashed_regex(self): +- original = 'function a() { /\//.test("a") }' +- expected = 'function a(){/\//.test("a")}' ++ original = 'function a() { /\\//.test("a") }' ++ expected = 'function a(){/\\//.test("a")}' + self.assertMinified(original, expected) + + def test_angular_1(self): +@@ -455,12 +455,12 @@ def testBackticksTagged(self): + def test_issue_bitbucket_16(self): + original = """ + f = function() { +- return /DataTree\/(.*)\//.exec(this._url)[1]; ++ return /DataTree\\/(.*)\\//.exec(this._url)[1]; + } + """ + self.assertMinified( + original, +- 'f=function(){return /DataTree\/(.*)\//.exec(this._url)[1];}') ++ 'f=function(){return /DataTree\\/(.*)\\//.exec(this._url)[1];}') + + def test_issue_bitbucket_17(self): + original = "// hi\n/^(get|post|head|put)$/i.test('POST')" +@@ -470,7 +470,7 @@ def test_issue_bitbucket_17(self): + def test_issue_6(self): + original = ''' + respond.regex = { +- comments: /\/\*[^*]*\*+([^/][^*]*\*+)*\//gi, ++ comments: /\\/\\*[^*]*\\*+([^/][^*]*\\*+)*\\//gi, + urls: 'whatever' + }; + ''' +@@ -548,16 +548,16 @@ def test_issue_9_multi_comments(self): + + def test_issue_12_re_nl_if(self): + original = ''' +- var re = /\d{4}/ ++ var re = /\\d{4}/ + if (1) { console.log(2); }''' + self.assertMinified( +- original, 'var re=/\d{4}/\nif(1){console.log(2);}') ++ original, 'var re=/\\d{4}/\nif(1){console.log(2);}') + + def test_issue_12_re_nl_other(self): + original = ''' +- var re = /\d{4}/ ++ var re = /\\d{4}/ + g = 10''' +- self.assertMinified(original , 'var re=/\d{4}/\ng=10') ++ self.assertMinified(original , 'var re=/\\d{4}/\ng=10') + + def test_preserve_copyright(self): + original = ''' diff --git a/meta-python/recipes-devtools/python/python3-jsmin/run-ptest b/meta-python/recipes-devtools/python/python3-jsmin/run-ptest index cbcfffda5b..586608d7b2 100644 --- a/meta-python/recipes-devtools/python/python3-jsmin/run-ptest +++ b/meta-python/recipes-devtools/python/python3-jsmin/run-ptest @@ -1,3 +1,2 @@ #!/bin/sh - -python3 test.py +pytest -vv test.py | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' diff --git a/meta-python/recipes-devtools/python/python3-jsmin_3.0.0.bb b/meta-python/recipes-devtools/python/python3-jsmin_3.0.1.bb index 733c9639c7..c3129e7b53 100644 --- a/meta-python/recipes-devtools/python/python3-jsmin_3.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-jsmin_3.0.1.bb @@ -5,16 +5,17 @@ LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=3a3301ce2ad647e172f4a1016c67324d" inherit setuptools3 pypi ptest -SRC_URI[sha256sum] = "88fc1bd6033a47c5911dbcada7d279c7a8b7ad0841909590f6a742c20c4d2e08" +SRC_URI[sha256sum] = "c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5cc2bfc" BBCLASSEXTEND = "native nativesdk" SRC_URI += " \ + file://7a75d76c2d6bfb917f30ced8f5c0a9a4157f7819.patch \ file://run-ptest \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-jsonpatch_1.32.bb b/meta-python/recipes-devtools/python/python3-jsonpatch_1.32.bb deleted file mode 100644 index 2a653cce88..0000000000 --- a/meta-python/recipes-devtools/python/python3-jsonpatch_1.32.bb +++ /dev/null @@ -1,15 +0,0 @@ -SUMMARY = "Appling JSON patches in Python 2.6+ and 3.x" -HOMEPAGE = "https://github.com/stefankoegl/python-json-patch" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://COPYING;md5=32b15c843b7a329130f4e266a281ebb3" - -inherit pypi setuptools3 - -SRC_URI[sha256sum] = "b6ddfe6c3db30d81a96aaeceb6baf916094ffa23d7dd5fa2c13e13f8b6e600c2" - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-jsonpointer \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-stringold \ -" diff --git a/meta-python/recipes-devtools/python/python3-jsonpatch_1.33.bb b/meta-python/recipes-devtools/python/python3-jsonpatch_1.33.bb new file mode 100644 index 0000000000..6a1715c6df --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-jsonpatch_1.33.bb @@ -0,0 +1,15 @@ +SUMMARY = "Appling JSON patches in Python 2.6+ and 3.x" +HOMEPAGE = "https://github.com/stefankoegl/python-json-patch" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=4f81c84f9a053e31fe9402a2a4e78864" + +inherit pypi setuptools3 + +SRC_URI[sha256sum] = "9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c" + +RDEPENDS:${PN} += " \ + python3-json \ + python3-jsonpointer \ + python3-netclient \ + python3-stringold \ +" diff --git a/meta-python/recipes-devtools/python/python3-jsonpath-rw_1.4.0.bb b/meta-python/recipes-devtools/python/python3-jsonpath-rw_1.4.0.bb index 51280eb9e2..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-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_5.0.3.bb b/meta-python/recipes-devtools/python/python3-jsonrpcserver_5.0.3.bb deleted file mode 100644 index c2500300f1..0000000000 --- a/meta-python/recipes-devtools/python/python3-jsonrpcserver_5.0.3.bb +++ /dev/null @@ -1,21 +0,0 @@ -SUMMARY = "Library to process JSON-RPC requests" -HOMEPAGE = "https://github.com/bcb/jsonrpcserver" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=61b63ea9d36f6fb63ddaaaac8265304f" - -SRC_URI[sha256sum] = "0cc514559596fa380bf188e31b0cdf3d9e6d9cc162fdca8a49ed511b291a9ae1" - -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-jstyleson_0.0.2.bb b/meta-python/recipes-devtools/python/python3-jstyleson_0.0.2.bb index e70ce33efc..ff9d7dd552 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 @@ -4,7 +4,7 @@ HOMEPAGE = "https://github.com/linjackson78/jstyleson" SRC_URI += " file://LICENSE " LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://${WORKDIR}/LICENSE;md5=d97b96c7337934ee448ffd4392f32079" +LIC_FILES_CHKSUM = "file://${UNPACKDIR}/LICENSE;md5=d97b96c7337934ee448ffd4392f32079" PYPI_PACKAGE_EXT = "tar.gz" @@ -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 11ab8b0a5f..ba1819979b 100644 --- a/meta-python/recipes-devtools/python/python3-keras-applications_1.0.8.bb +++ b/meta-python/recipes-devtools/python/python3-keras-applications_1.0.8.bb @@ -7,7 +7,6 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=366e2fd3c9714f162d3663b6f97cfe41" SRC_URI = "git://github.com/keras-team/keras-applications.git;branch=master;protocol=https" SRCREV ?= "3b180cb10eda683dda7913ecee2e6487288d292d" - inherit setuptools3 S = "${WORKDIR}/git" diff --git a/meta-python/recipes-devtools/python/python3-kivy/0001-add-support-for-glesv2.patch b/meta-python/recipes-devtools/python/python3-kivy/0001-add-support-for-glesv2.patch index bb236b4195..e38b31d34d 100644 --- a/meta-python/recipes-devtools/python/python3-kivy/0001-add-support-for-glesv2.patch +++ b/meta-python/recipes-devtools/python/python3-kivy/0001-add-support-for-glesv2.patch @@ -1,6 +1,19 @@ +From 98224fec48d6e0f32b28d81220bf1ee1637ce045 Mon Sep 17 00:00:00 2001 +From: William Huang <whuang8933@gmail.com> +Date: Thu, 2 Sep 2021 07:25:07 -0400 +Subject: [PATCH] recipes-devtools: python: add support for Kivy + +Upstream-Status: Pending + +--- + setup.py | 16 +++++++++++++--- + 1 file changed, 13 insertions(+), 3 deletions(-) + +diff --git a/setup.py b/setup.py +index 35e34afdd..0ba3aca72 100644 --- a/setup.py +++ b/setup.py -@@ -695,7 +695,18 @@ def determine_gl_flags(): +@@ -730,7 +730,18 @@ def determine_gl_flags(): c_options['use_x11'] = True c_options['use_egl'] = True else: @@ -20,7 +33,7 @@ return flags, base_flags -@@ -723,14 +734,13 @@ def determine_sdl2(): +@@ -774,14 +785,13 @@ def determine_sdl2(): sdl_inc = join(include, 'SDL2') if isdir(sdl_inc): sdl2_paths.append(sdl_inc) @@ -34,5 +47,5 @@ - ['/usr/local/lib/']) + ['']) - if sdl2_flags: - flags = merge(flags, sdl2_flags) + if kivy_sdl2_path: + # If we have a custom path, we need to add the rpath to the linker diff --git a/meta-python/recipes-devtools/python/python3-kivy_2.0.0.bb b/meta-python/recipes-devtools/python/python3-kivy_2.3.0.bb index 3daf13473a..045ac23106 100644 --- a/meta-python/recipes-devtools/python/python3-kivy_2.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-kivy_2.3.0.bb @@ -2,22 +2,19 @@ SUMMARY = "Open source Python library for rapid development of applications \ that make use of innovative user interfaces, such as multi-touch apps." HOMEPAGE = "https://kivy.org/" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=f0c851d60495c7e27225a819e179208a" +LIC_FILES_CHKSUM = "file://LICENSE;md5=6d3bc49400e35d5a2279d14c40dcfb09" inherit setuptools3 pkgconfig features_check -SRC_URI = "\ - git://github.com/kivy/kivy.git;protocol=https;branch=master \ -" - # Kivy's setup files only look for GLES libraries for Android, iOS, RPi, # and mali-based OS's. We need to patch the setup file to tell Kivy setup # that our machine has GLES libaries installed as well -# Also, if using SDL2 as backend, SDL2 needs to be configured wth gles -SRC_URI += " \ - file://0001-add-support-for-glesv2.patch \ -" -SRCREV = "dedcb6bcabe3d8d6758dcee607e8c33b174d782b" +# 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" @@ -42,7 +39,9 @@ export KIVY_GRAPHICS KIVY_CROSS_SYSROOT="${RECIPE_SYSROOT}" export KIVY_CROSS_SYSROOT -REQUIRED_DISTRO_FEATURES += "x11 opengl" +REQUIRED_DISTRO_FEATURES += "opengl gobject-introspection-data" + +ANY_OF_DISTRO_FEATURES = "x11 wayland" DEPENDS += " \ gstreamer1.0 \ @@ -71,3 +70,15 @@ RDEPENDS:${PN} = " \ python3-pillow \ python3-pygments \ " + +# http://errors.yoctoproject.org/Errors/Details/766917/ +# python3-kivy/2.3.0/git/kivy/graphics/cgl_backend/cgl_gl.c:4568:52: error: assignment to 'void (*)(GLuint, GLsizei, const GLchar **, const GLint *)' {aka 'void (*)(unsigned int, int, const char **, const int *)'} from incompatible pointer type 'void (*)(GLuint, GLsizei, const GLchar * const*, const GLint *)' {aka 'void (*)(unsigned int, int, const char * const*, const int *)'} [-Wincompatible-pointer-types] +# python3-kivy/2.3.0/git/kivy/core/window/_window_sdl2.c:8781:23: error: passing argument 1 of 'SDL_SetEventFilter' from incompatible pointer type [-Wincompatible-pointer-types] +CFLAGS += "-Wno-error=incompatible-pointer-types" + +do_compile:append() { + for f in `find ${B} -name *.c` + do + sed -i -e "/BEGIN: Cython Metadata/,/END: Cython Metadata/d" $f + done +} diff --git a/meta-python/recipes-devtools/python/python3-kiwisolver_1.3.2.bb b/meta-python/recipes-devtools/python/python3-kiwisolver_1.4.7.bb index dac6cd48b9..9c422490ef 100644 --- a/meta-python/recipes-devtools/python/python3-kiwisolver_1.3.2.bb +++ b/meta-python/recipes-devtools/python/python3-kiwisolver_1.4.7.bb @@ -1,11 +1,11 @@ SUMMARY = "A fast implementation of the Cassowary constraint solver" HOMEPAGE = "https://github.com/nucleic/kiwi" LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://setup.py;endline=7;md5=e54bd74bd9d0a84ae3f8f6d21ada0ab4" +LIC_FILES_CHKSUM = "file://LICENSE;md5=5f7ce5ba663b186ce35b78df96a2eb0a" -SRC_URI[sha256sum] = "fc4453705b81d03568d5b808ad8f09c77c47534f6ac2e72e733f9ca4714aa75c" +SRC_URI[sha256sum] = "9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta DEPENDS += "\ python3-cppy-native \ diff --git a/meta-python/recipes-devtools/python/python3-langtable_0.0.56.bb b/meta-python/recipes-devtools/python/python3-langtable_0.0.68.bb index b8f052ea31..64eb57dd38 100644 --- a/meta-python/recipes-devtools/python/python3-langtable_0.0.56.bb +++ b/meta-python/recipes-devtools/python/python3-langtable_0.0.68.bb @@ -1,12 +1,12 @@ 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[sha256sum] = "318af0fd616711ce5cd2a7b11a6761183ba9c1ff76a762919e08d85645fc854b" +SRC_URI[sha256sum] = "3965a4d57a066a595ea8a87f6a5295412e65a7f39dbaad95c7327d48b11799fe" inherit pypi setuptools3 python3native @@ -16,8 +16,8 @@ DISTUTILS_INSTALL_ARGS += " \ FILES:${PN} += "${datadir}/*" RDEPENDS:${PN} += " \ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-doctest \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-xml \ + python3-compression \ + python3-doctest \ + python3-logging \ + python3-xml \ " diff --git a/meta-python/recipes-devtools/python/python3-lazy-object-proxy_1.10.0.bb b/meta-python/recipes-devtools/python/python3-lazy-object-proxy_1.10.0.bb new file mode 100644 index 0000000000..195f94705b --- /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" + +SRC_URI[sha256sum] = "78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69" + +inherit pypi python_setuptools_build_meta 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 60eb2a62be..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 ${PYTHON_PN}-pip-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..222489302d --- /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 python_setuptools_build_meta 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..5ad2a59951 --- /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://COPYING;md5=d94c10c546b419eddc6296157ec40747" + +SRC_URI[md5sum] = "34b48098c1fba26de79a0d67a17a588a" +SRC_URI[sha256sum] = "e9ca006a4df2488a60bd9a740011ee948d81904be2364f017e560169508f560f" + +inherit pypi setuptools3 + +PYPI_PACKAGE = "libevdev" + +RDEPENDS:${PN} += " \ + libevdev \ + python3-ctypes \ +" diff --git a/meta-python/recipes-devtools/python/python3-license-expression/run-ptest b/meta-python/recipes-devtools/python/python3-license-expression/run-ptest deleted file mode 100644 index 5cec711696..0000000000 --- a/meta-python/recipes-devtools/python/python3-license-expression/run-ptest +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -pytest diff --git a/meta-python/recipes-devtools/python/python3-license-expression_21.6.14.bb b/meta-python/recipes-devtools/python/python3-license-expression_21.6.14.bb deleted file mode 100644 index efa8854411..0000000000 --- a/meta-python/recipes-devtools/python/python3-license-expression_21.6.14.bb +++ /dev/null @@ -1,35 +0,0 @@ -SUMMARY = "Utility library to parse, compare, simplify and normalize license expressions" -HOMEPAGE = "https://github.com/nexB/license-expression" - -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://apache-2.0.LICENSE;md5=9429839cdc4b292ff46e88b524c6e0c9" - -SRC_URI[sha256sum] = "9de87a427c9a449eee7913472fb9ed03b63036295547369fdbf95f76a8b924b2" - -inherit pypi ptest setuptools3 - -DEPENDS += "\ - ${PYTHON_PN}-setuptools-scm-native \ - ${PYTHON_PN}-wheel-native \ -" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-booleanpy \ -" - -BBCLASSEXTEND = "native nativesdk" - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ -" - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/tests - install -d ${D}${PTEST_PATH}/src - cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ - cp -rf ${S}/src/* ${D}${PTEST_PATH}/src/ -} diff --git a/meta-python/recipes-devtools/python/python3-linux-procfs_0.7.3.bb b/meta-python/recipes-devtools/python/python3-linux-procfs_0.7.3.bb new file mode 100644 index 0000000000..8c53d38ce3 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-linux-procfs_0.7.3.bb @@ -0,0 +1,14 @@ +DESCRIPTION = "Python classes to extract information from the Linux kernel /proc files." +HOMEPAGE = "https://git.kernel.org/pub/scm/libs/python/python-linux-procfs/python-linux-procfs.git/" +SECTION = "devel/python" +LICENSE = "GPL-2.0-only" +LIC_FILES_CHKSUM = "file://COPYING;md5=6a6855782848d572347212f667a2d637" + +SRC_URI = "git://git.kernel.org/pub/scm/libs/python/python-linux-procfs/python-linux-procfs.git;branch=main" +SRCREV = "59ecd1ba018141a02ffe59c16a9346991dfd0d48" + +S = "${WORKDIR}/git" + +inherit setuptools3 + +RDEPENDS:${PN} += "python3-six" diff --git a/meta-python/recipes-devtools/python/python3-lockfile_0.12.2.bb b/meta-python/recipes-devtools/python/python3-lockfile_0.12.2.bb index b9dc4722af..af738e08ec 100644 --- a/meta-python/recipes-devtools/python/python3-lockfile_0.12.2.bb +++ b/meta-python/recipes-devtools/python/python3-lockfile_0.12.2.bb @@ -12,6 +12,9 @@ SRC_URI[sha256sum] = "6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361 inherit pypi setuptools3 DEPENDS += "python3-distutils-extra-native python3-pbr-native" -RDEPENDS:${PN} += "python3-sqlite3" +RDEPENDS:${PN} += " \ + python3-io \ + python3-sqlite3 \ +" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-lorem/run-ptest b/meta-python/recipes-devtools/python/python3-lorem/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-lorem/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-lorem_0.1.1.bb b/meta-python/recipes-devtools/python/python3-lorem_0.1.1.bb index 9ce7a6293c..97b3e72364 100644 --- a/meta-python/recipes-devtools/python/python3-lorem_0.1.1.bb +++ b/meta-python/recipes-devtools/python/python3-lorem_0.1.1.bb @@ -5,12 +5,25 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=5301c01b2bcdeedba23645f94db2f179" SRC_URI[md5sum] = "e3f0064a94c13e19780eb724affdb426" SRC_URI[sha256sum] = "785f4109a241fc2891e59705e85d065f6e6d3ed6ad91750a8cb54d4f3e59d934" +SRC_URI += "\ + file://run-ptest \ +" + PYPI_PACKAGE = "lorem" -inherit pypi setuptools3 +inherit pypi setuptools3 ptest CLEANBROKEN = "1" RDEPENDS:${PN} += " \ python3 \ " +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} diff --git a/meta-python/recipes-devtools/python/python3-lrparsing/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.17.bb b/meta-python/recipes-devtools/python/python3-lrparsing_1.0.17.bb index 24e4e2671d..8cd60d3a0f 100644 --- a/meta-python/recipes-devtools/python/python3-lrparsing_1.0.17.bb +++ b/meta-python/recipes-devtools/python/python3-lrparsing_1.0.17.bb @@ -1,13 +1,15 @@ 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 = "${SOURCEFORGE_MIRROR}/lrparsing/lrparsing-${PV}.tar.gz \ + file://0001-setup.py-use-setuptools-instead-of-distutils.patch \ + " SRC_URI[sha256sum] = "7c060d9f03cf582fdbc0ae0fef0ea2ff6fd56251047ba7e425af97e23f46f582" RDEPENDS:${PN} = " \ 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..236daca490 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-lru-dict_1.3.0.bb @@ -0,0 +1,9 @@ +DESCRIPTION = "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 = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=9d10a486ee04034fdef5162fd791f153" + +SRC_URI[sha256sum] = "54fd1966d6bd1fcde781596cb86068214edeebff1db13a2cea11079e3fd07b6b" + +inherit pypi python_setuptools_build_meta 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 c37cc22c46..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 a551e46fcb..74b9be5023 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 +inherit pypi python_setuptools_build_meta -SRC_URI[sha256sum] = "a9b445ecc686e9413ddac655544da21d801bbc6b94612736cf59283e6b92bcbb" +SRC_URI[sha256sum] = "7e2a0d6a4c968c64980255d681ec27914d9abd5a66a9019b289bf3ad050c2125" CLEANBROKEN = "1" PYPI_PACKAGE = "luma.oled" RDEPENDS:${PN} += " \ - ${PYTHON_PN}-luma-core \ + python3-luma-core \ " diff --git a/meta-python/recipes-devtools/python/python3-lxml_4.6.3.bb b/meta-python/recipes-devtools/python/python3-lxml_4.6.3.bb deleted file mode 100644 index d5594847f4..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 = "https://lxml.de/" -SECTION = "devel/python" -LICENSE = "BSD-3-Clause & 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 pkgconfig pypi setuptools3 - -# {standard input}: Assembler messages: -# {standard input}:1488805: Error: branch out of range -DEBUG_OPTIMIZATION:remove:mips = " -Og" -DEBUG_OPTIMIZATION:append:mips = " -O" -BUILD_OPTIMIZATION:remove:mips = " -Og" -BUILD_OPTIMIZATION:append:mips = " -O" - -DEBUG_OPTIMIZATION:remove:mipsel = " -Og" -DEBUG_OPTIMIZATION:append:mipsel = " -O" -BUILD_OPTIMIZATION:remove:mipsel = " -Og" -BUILD_OPTIMIZATION:append:mipsel = " -O" - -BBCLASSEXTEND = "native nativesdk" - -RDEPENDS:${PN} += "libxml2 libxslt ${PYTHON_PN}-compression" - -CLEANBROKEN = "1" diff --git a/meta-python/recipes-devtools/python/python3-lz4/run-ptest b/meta-python/recipes-devtools/python/python3-lz4/run-ptest 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-link-in-sysroot-not-in-host-directories.patch b/meta-python/recipes-devtools/python/python3-m2crypto/0001-setup.py-link-in-sysroot-not-in-host-directories.patch index f4c74384f9..0baadfcaa5 100644 --- a/meta-python/recipes-devtools/python/python3-m2crypto/0001-setup.py-link-in-sysroot-not-in-host-directories.patch +++ b/meta-python/recipes-devtools/python/python3-m2crypto/0001-setup.py-link-in-sysroot-not-in-host-directories.patch @@ -5,7 +5,7 @@ Subject: [PATCH] setup.py: link in sysroot, not in host directories Signed-off-by: Koen Kooi <koen@dominion.thruhere.net> -Upstream-status: Unknown +Upstream-Status: Pending [Unknown] --- setup.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/meta-python/recipes-devtools/python/python3-m2crypto/avoid-host-contamination.patch b/meta-python/recipes-devtools/python/python3-m2crypto/avoid-host-contamination.patch index 9d9b8449ba..3cd6f7c276 100644 --- a/meta-python/recipes-devtools/python/python3-m2crypto/avoid-host-contamination.patch +++ b/meta-python/recipes-devtools/python/python3-m2crypto/avoid-host-contamination.patch @@ -1,6 +1,6 @@ Filter out '/usr/include' for swig to avoid host contamination issue. -Upstream-Status: Upstream-Status: Inappropriate [cross compile specific] +Upstream-Status: Inappropriate [cross compile specific] Signed-off-by: Kai Kang <kai.kang@windriver.com> --- diff --git a/meta-python/recipes-devtools/python/python3-m2crypto_0.38.0.bb b/meta-python/recipes-devtools/python/python3-m2crypto_0.40.1.bb index 51a0dd676e..1d8c22d196 100644 --- a/meta-python/recipes-devtools/python/python3-m2crypto_0.38.0.bb +++ b/meta-python/recipes-devtools/python/python3-m2crypto_0.40.1.bb @@ -7,41 +7,45 @@ LIC_FILES_CHKSUM = "file://LICENCE;md5=b0e1f0b7d0ce8a62c18b1287b991800e" FILESEXTRAPATHS:prepend := "${THISDIR}/python-m2crypto:" SRC_URI += "file://0001-setup.py-link-in-sysroot-not-in-host-directories.patch \ - file://cross-compile-platform.patch \ - file://avoid-host-contamination.patch \ - file://0001-setup.py-address-openssl-3.x-build-issue.patch \ - " -SRC_URI[sha256sum] = "99f2260a30901c949a8dc6d5f82cd5312ffb8abc92e76633baf231bbbcb2decb" + file://cross-compile-platform.patch \ + file://avoid-host-contamination.patch \ + file://0001-setup.py-address-openssl-3.x-build-issue.patch \ + " +SRC_URI[sha256sum] = "bbfd113ec55708c05816252a4f09e4237df4f3bbfc8171cbbc33057d257bbb30" PYPI_PACKAGE = "M2Crypto" inherit pypi siteinfo setuptools3 DEPENDS += "openssl swig-native" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-distutils \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-netserver \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-smtpd \ - ${PYTHON_PN}-xmlrpc \ + python3-datetime \ + python3-setuptools \ + python3-logging \ + python3-netclient \ + python3-netserver \ + python3-numbers \ + python3-xmlrpc \ " DISTUTILS_BUILD_ARGS += "build_ext --openssl=${STAGING_EXECPREFIXDIR} -I${STAGING_INCDIR}" DISTUTILS_INSTALL_ARGS += "build_ext --openssl=${STAGING_EXECPREFIXDIR}" -SWIG_FEATURES:x86 = "-D__i386__" -SWIG_FEATURES:x32 = "-D__ILP32__" - -SWIG_FEATURES ?= "-D__${HOST_ARCH}__ ${@['-D__ILP32__','-D__LP64__'][d.getVar('SITEINFO_BITS') != '32']}" +SWIG_FEATURES ?= "-D__${HOST_ARCH}__ ${@['-D__ILP32__','-D__LP64__'][d.getVar('SITEINFO_BITS') != '32']} -DOPENSSL_NO_FILENAMES" SWIG_FEATURES:append:riscv64 = " -D__SIZEOF_POINTER__=${SITEINFO_BITS}/8 -D__riscv_xlen=${SITEINFO_BITS}" SWIG_FEATURES:append:riscv32 = " -D__SIZEOF_POINTER__=${SITEINFO_BITS}/8 -D__riscv_xlen=${SITEINFO_BITS}" SWIG_FEATURES:append:mipsarch = " -D_MIPS_SZPTR=${SITEINFO_BITS}" SWIG_FEATURES:append:powerpc64le = " -D__powerpc64__" +SWIG_FEATURES:append:x86 = " -D__i386__" +SWIG_FEATURES:append:x32 = " -D__ILP32__" + export SWIG_FEATURES export STAGING_DIR +do_install:append() { + rm -f ${D}${PYTHON_SITEPACKAGES_DIR}/M2Crypto/SSL/__pycache__/*.cpython-*.pyc + rm -f ${D}${PYTHON_SITEPACKAGES_DIR}/M2Crypto/__pycache__/*.cpython-*.pyc +} + BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-marshmallow/run-ptest b/meta-python/recipes-devtools/python/python3-marshmallow/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-marshmallow/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-marshmallow_3.14.1.bb b/meta-python/recipes-devtools/python/python3-marshmallow_3.14.1.bb deleted file mode 100644 index ddfe4b99c6..0000000000 --- a/meta-python/recipes-devtools/python/python3-marshmallow_3.14.1.bb +++ /dev/null @@ -1,18 +0,0 @@ -SUMMARY = "Simplified object serialization in python" -DESCRIPTION = "Marshmallow is an ORM/ODM/framework-agnostic library for converting complex datatypes, such as objects, to and from native Python datatypes." -AUTHOR = "Marius Kriegerowski <mk@quakesaver.net>" -HOMEPAGE = "https://github.com/marshmallow-code/marshmallow" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "\ - file://LICENSE;md5=5bccd400dedfa74364481e56aacc0b4a \ - file://docs/license.rst;md5=13da439ad060419fb7cf364523017cfb" - -SRC_URI = "git://github.com/marshmallow-code/marshmallow.git;protocol=https;branch=dev" - -SRCREV = "41afdefd93afd1b95f48f45fd284ff8add3e91b7" - -S = "${WORKDIR}/git" - -inherit setuptools3 - -RDEPENDS:${PN} += "python3-core" diff --git a/meta-python/recipes-devtools/python/python3-marshmallow_3.22.0.bb b/meta-python/recipes-devtools/python/python3-marshmallow_3.22.0.bb new file mode 100644 index 0000000000..269522dcea --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-marshmallow_3.22.0.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] = "4972f529104a220bb8637d595aa4c9762afbe7f7a77d82dc58c1615d70c5823e" + +inherit python_flit_core pypi ptest + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-pytz \ + python3-simplejson \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + rm -rf ${S}/tests/mypy_test_cases + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} + +RDEPENDS:${PN} += " \ + python3-compression \ + python3-datetime \ + python3-email \ + python3-json \ + python3-numbers \ + python3-pprint \ + python3-packaging \ +" diff --git a/meta-python/recipes-devtools/python/python3-matplotlib-inline_0.1.2.bb b/meta-python/recipes-devtools/python/python3-matplotlib-inline_0.1.2.bb deleted file mode 100644 index f060f93337..0000000000 --- a/meta-python/recipes-devtools/python/python3-matplotlib-inline_0.1.2.bb +++ /dev/null @@ -1,8 +0,0 @@ -SUMMARY = "Inline Matplotlib backend for Jupyter" -HOMEPAGE = "https://pypi.org/project/matplotlib-inline/" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=c2728819a4288030f51c594327977be0" - -SRC_URI[sha256sum] = "f41d5ff73c9f5385775d5c0bc13b424535c8402fe70ea8210f93e11f3683993e" - -inherit pypi diff --git a/meta-python/recipes-devtools/python/python3-matplotlib-inline_0.1.7.bb b/meta-python/recipes-devtools/python/python3-matplotlib-inline_0.1.7.bb new file mode 100644 index 0000000000..335565643a --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-matplotlib-inline_0.1.7.bb @@ -0,0 +1,11 @@ +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] = "8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90" + +PYPI_PACKAGE = "matplotlib_inline" +inherit pypi python_setuptools_build_meta + +RDEPENDS:${PN} = "python3-traitlets" 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 9e933f5c4b..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.7.0.bb index 513a5a9f22..5304917842 100644 --- a/meta-python/recipes-devtools/python/python3-mccabe_0.6.1.bb +++ b/meta-python/recipes-devtools/python/python3-mccabe_0.7.0.bb @@ -4,9 +4,10 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=a489dc62bacbdad3335c0f160a974f0f" -SRC_URI[md5sum] = "723df2f7b1737b8887475bac4c763e1e" -SRC_URI[sha256sum] = "dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" +SRC_URI[sha256sum] = "348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325" inherit pypi setuptools3 -DEPENDS += "${PYTHON_PN}-pytest-runner-native" +DEPENDS += "python3-pytest-runner-native" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-meld3_2.0.1.bb b/meta-python/recipes-devtools/python/python3-meld3_2.0.1.bb index 1223ae9532..7ebf9f1411 100644 --- a/meta-python/recipes-devtools/python/python3-meld3_2.0.1.bb +++ b/meta-python/recipes-devtools/python/python3-meld3_2.0.1.bb @@ -12,3 +12,8 @@ SRC_URI[md5sum] = "1add16caefc9e6b82ef4f40532cb4918" SRC_URI[sha256sum] = "3ea266994f1aa83507679a67b493b852c232a7905e29440a6b868558cad5e775" inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-cgitb \ + python3-xml \ +" diff --git a/meta-python/recipes-devtools/python/python3-mock_4.0.3.bb b/meta-python/recipes-devtools/python/python3-mock_4.0.3.bb deleted file mode 100644 index 8f2305b50b..0000000000 --- a/meta-python/recipes-devtools/python/python3-mock_4.0.3.bb +++ /dev/null @@ -1,16 +0,0 @@ -DESCRIPTION = "A Python Mocking and Patching Library for Testing" -HOMEPAGE = "https://pypi.python.org/pypi/mock" -SECTION = "devel/python" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=de9dfbf780446b18aab11f00baaf5b7e" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += "${PYTHON_PN}-prettytable \ - ${PYTHON_PN}-cmd2 \ - ${PYTHON_PN}-pyparsing \ - ${PYTHON_PN}-mccabe \ - ${PYTHON_PN}-pep8 \ - ${PYTHON_PN}-pyflakes" - -SRC_URI[sha256sum] = "7d3fbbde18228f4ff2f1f119a45cdffa458b4c0dee32eb4d2bb2f82554bac7bc" diff --git a/meta-python/recipes-devtools/python/python3-mock_5.1.0.bb b/meta-python/recipes-devtools/python/python3-mock_5.1.0.bb new file mode 100644 index 0000000000..1b89260e1b --- /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 = "BSD-2-Clause" +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-moteus_0.3.72.bb b/meta-python/recipes-devtools/python/python3-moteus_0.3.72.bb new file mode 100644 index 0000000000..be560c7180 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-moteus_0.3.72.bb @@ -0,0 +1,17 @@ +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[sha256sum] = "3aa30eea9ab9bc7209ab7c6f382650265ab648663edead5c54d69d9f0a3fd36e" + +S = "${WORKDIR}/moteus-${PV}" + +RDEPENDS:${PN} += "\ + python3-can \ + python3-importlib-metadata \ + python3-pyelftools \ + python3-pyserial \ +" diff --git a/meta-python/recipes-devtools/python/python3-mpmath_1.2.1.bb b/meta-python/recipes-devtools/python/python3-mpmath_1.3.0.bb index 3337df4903..236fbd85bc 100644 --- a/meta-python/recipes-devtools/python/python3-mpmath_1.2.1.bb +++ b/meta-python/recipes-devtools/python/python3-mpmath_1.3.0.bb @@ -4,13 +4,16 @@ SUMMARY = "Python library for arbitrary-precision floating-point arithmetic" HOMEPAGE = "https://pypi.org/project/mpmath/" LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=71970bd3749eebe1bfef9f1efff5b37a" +LIC_FILES_CHKSUM = "file://LICENSE;md5=bde3c575382996b75d85702949512751" -SRC_URI[sha256sum] = "79ffb45cf9f4b101a807595bcb3e72e0396202e0b1d25d689134b48c4216a81a" +SRC_URI[sha256sum] = "7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f" inherit pypi setuptools3 -DEPENDS += "${PYTHON_PN}-setuptools-scm-native" -RDEPENDS:${PN} += "python3-image" +DEPENDS += "python3-setuptools-scm-native" +RDEPENDS:${PN} += " \ + python3-image \ + python3-math \ +" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-msgpack/run-ptest b/meta-python/recipes-devtools/python/python3-msgpack/run-ptest index 5cec711696..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-msgpack/run-ptest +++ b/meta-python/recipes-devtools/python/python3-msgpack/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-msgpack_1.0.2.bb b/meta-python/recipes-devtools/python/python3-msgpack_1.1.0.bb index 19c9caa406..eb04dc2e0f 100644 --- a/meta-python/recipes-devtools/python/python3-msgpack_1.0.2.bb +++ b/meta-python/recipes-devtools/python/python3-msgpack_1.1.0.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 +inherit pypi python_setuptools_build_meta ptest -SRC_URI[sha256sum] = "fae04496f5bc150eefad4e9571d1a76c55d021325dcd484ce45065ebbdd00984" +SRC_URI[sha256sum] = "dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e" RDEPENDS:${PN}:class-target += "\ - ${PYTHON_PN}-io \ + python3-io \ " BBCLASSEXTEND = "native nativesdk" @@ -18,7 +17,8 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-msk_0.3.16.bb b/meta-python/recipes-devtools/python/python3-msk_0.4.0.bb index a1572276be..8fa2c62cc4 100644 --- a/meta-python/recipes-devtools/python/python3-msk_0.3.16.bb +++ b/meta-python/recipes-devtools/python/python3-msk_0.4.0.bb @@ -1,10 +1,9 @@ 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" +LIC_FILES_CHKSUM = "file://README.md;md5=f518abfcfc3935b1f0ec8f2332cb30d3" -SRC_URI[md5sum] = "8a4fc92a074544f81f482da2c21ef989" -SRC_URI[sha256sum] = "c6a717fc068f7c69ddc8cb21dbeeda7cfa97a4e9f41690459c9fbec68b16ee87" +SRC_URI[sha256sum] = "f698f193112a8628e776e67b89a95c3f78095857c045dd9cde4cf915a5fbdd80" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-msm_0.8.8.bb b/meta-python/recipes-devtools/python/python3-msm_0.8.8.bb index 848b25dae8..966ff86dee 100644 --- a/meta-python/recipes-devtools/python/python3-msm_0.8.8.bb +++ b/meta-python/recipes-devtools/python/python3-msm_0.8.8.bb @@ -8,10 +8,18 @@ SRC_URI[sha256sum] = "a502aee54917cd394217b31c977a1ba3d9541a0120e0a045c49fd77b32 inherit pypi setuptools3 -RDEPENDS:${PN} += "\ - python3-pako \ - python3-monotonic \ +RDEPENDS:${PN} += " \ python3-appdirs \ + python3-git \ + python3-fasteners \ + python3-io \ + python3-json \ + python3-lazy \ + python3-monotonic \ + python3-multiprocessing \ + python3-pako \ + python3-pyyaml \ + python3-requests \ " do_install:append() { diff --git a/meta-python/recipes-devtools/python/python3-multidict/run-ptest b/meta-python/recipes-devtools/python/python3-multidict/run-ptest index 5cec711696..d74acaf564 100644 --- a/meta-python/recipes-devtools/python/python3-multidict/run-ptest +++ b/meta-python/recipes-devtools/python/python3-multidict/run-ptest @@ -1,3 +1,2 @@ #!/bin/sh - -pytest +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-multidict_5.2.0.bb b/meta-python/recipes-devtools/python/python3-multidict_5.2.0.bb deleted file mode 100644 index 05b18fa0b5..0000000000 --- a/meta-python/recipes-devtools/python/python3-multidict_5.2.0.bb +++ /dev/null @@ -1,24 +0,0 @@ -SUMMARY = "Multidicts are useful for working with HTTP headers, URL query args etc." -HOMEPAGE = "https://github.com/aio-libs/multidict/" - -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=84c63e2bcd84e619d249af5181e2147f" - -SRC_URI[sha256sum] = "0dd1c93edb444b33ba2274b66f63def8a327d607c6c790772f448a53b6ea59ce" - -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/ -} - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-multidict_6.0.5.bb b/meta-python/recipes-devtools/python/python3-multidict_6.0.5.bb new file mode 100644 index 0000000000..6346152aec --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-multidict_6.0.5.bb @@ -0,0 +1,30 @@ +SUMMARY = "Multidicts are useful for working with HTTP headers, URL query args etc." +HOMEPAGE = "https://github.com/aio-libs/multidict/" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=b4fef6e4b0828c2401fb983363985b39" + +inherit pypi python_setuptools_build_meta 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 += " \ + python3-pytest \ + python3-pytest-cov \ + 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-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.910.bb b/meta-python/recipes-devtools/python/python3-mypy_0.910.bb deleted file mode 100644 index 1a494af5af..0000000000 --- a/meta-python/recipes-devtools/python/python3-mypy_0.910.bb +++ /dev/null @@ -1,23 +0,0 @@ -SUMMARY = "Optional static typing for Python 3 and 2 (PEP 484)" -HOMEPAGE = "https://github.com/python/mypy" -LICENSE = "MIT & Python-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=17b7180fcfc43c4e70c07c71588604c4" - -PYPI_PACKAGE = "mypy" - -inherit pypi setuptools3 - -SRC_URI[sha256sum] = "704098302473cb31a218f1775a873b376b30b4c18229421e9e9dc8916fd16150" - -BBCLASSEXTEND = "native" - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-mypy-extensions \ - ${PYTHON_PN}-typed-ast \ - ${PYTHON_PN}-typing-extensions \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-pprint \ - ${PYTHON_PN}-difflib \ - ${PYTHON_PN}-toml \ -" diff --git a/meta-python/recipes-devtools/python/python3-mypy_1.10.0.bb b/meta-python/recipes-devtools/python/python3-mypy_1.10.0.bb new file mode 100644 index 0000000000..534ff90666 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-mypy_1.10.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] = "3d087fcbec056c4ee34974da493a826ce316947485cef3901f511848e687c131" + +BBCLASSEXTEND = "native" + +DEPENDS += " \ + python3-mypy-extensions-native \ + python3-types-psutil-native \ + python3-types-setuptools-native \ + python3-typing-extensions-native \ +" + +RDEPENDS:${PN} += " \ + python3-modules \ + python3-mypy-extensions \ + python3-typing-extensions \ +" diff --git a/meta-python/recipes-devtools/python/python3-natsort_8.0.0.bb b/meta-python/recipes-devtools/python/python3-natsort_8.4.0.bb index 7c2b7deb67..206e322fbd 100644 --- a/meta-python/recipes-devtools/python/python3-natsort_8.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-natsort_8.4.0.bb @@ -1,10 +1,10 @@ SUMMARY = "Simple yet flexible natural sorting in Python." SECTION = "devel/python" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=58db8ac9e152dd9b700f4d39ff40a31a" +LIC_FILES_CHKSUM = "file://LICENSE;md5=d32431d1b650010945da4e078011c8fa" PYPI_PACKAGE = "natsort" -SRC_URI[sha256sum] = "a0a4fd71aee20a6d648da61e01180a63f7268e69983d0440bd3ad80ef1ba6981" +SRC_URI[sha256sum] = "45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581" inherit pypi setuptools3 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 6f3c096cf0..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 ad03eec851..0000000000 --- a/meta-python/recipes-devtools/python/python3-netaddr_0.8.0.bb +++ /dev/null @@ -1,13 +0,0 @@ -SUMMARY = "A network address manipulation library for Python." -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=e6345d695ffe3776f68a56fe7962db44" - -SRC_URI[md5sum] = "34cad578473b66ad77bc3b2a7613ed4a" -SRC_URI[sha256sum] = "d6cc57c7a07b1d9d2e917aa8b36ae8ce61c35ba3fcd1b83ca31c5a0ee2b5a243" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-pprint \ - ${PYTHON_PN}-xml \ -" diff --git a/meta-python/recipes-devtools/python/python3-netaddr_1.3.0.bb b/meta-python/recipes-devtools/python/python3-netaddr_1.3.0.bb new file mode 100644 index 0000000000..b8a772566a --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-netaddr_1.3.0.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] = "5c3c3d9895b551b763779ba7db7a03487dc1f8e3b385af819af341ae9ef6e48a" + +inherit pypi python_setuptools_build_meta ptest + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/netaddr/tests/* ${D}${PTEST_PATH}/tests/ +} + +do_install_ptest:append:libc-musl () { + sed -i -e "/--automake/ s/$/ -k 'not test_strategy_ipv6'/" ${D}${PTEST_PATH}/run-ptest +} diff --git a/meta-python/recipes-devtools/python/python3-netifaces/0001-netifaces-initialize-msghdr-in-a-portable-way.patch b/meta-python/recipes-devtools/python/python3-netifaces/0001-netifaces-initialize-msghdr-in-a-portable-way.patch new file mode 100644 index 0000000000..7ff86cc8be --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-netifaces/0001-netifaces-initialize-msghdr-in-a-portable-way.patch @@ -0,0 +1,49 @@ +From cbcd19f38ae4b31c57c57ce3619b8d2674defb68 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Sun, 28 Aug 2022 08:11:27 -0700 +Subject: [PATCH] netifaces: initialize msghdr in a portable way + +musl has padding bytes inside the msghdr struct which means initializing +full structure will cause wrong assignments, doing partial assignment is +more portable and assign the elements after that + +Fixes +netifaces.c:1808:9: error: incompatible pointer to integer conversion initializing 'int' with an expression of type 'void *' [-Wint-conversion] + NULL, + ^~~~ + +Upstream-Status: Inappropriate [Upstream Repo is read-only] +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + netifaces.c | 15 ++++++--------- + 1 file changed, 6 insertions(+), 9 deletions(-) + +diff --git a/netifaces.c b/netifaces.c +index 839c42c..7da78e7 100644 +--- a/netifaces.c ++++ b/netifaces.c +@@ -1800,15 +1800,12 @@ gateways (PyObject *self) + do { + struct sockaddr_nl sanl_from; + struct iovec iov = { msgbuf, bufsize }; +- struct msghdr msghdr = { +- &sanl_from, +- sizeof(sanl_from), +- &iov, +- 1, +- NULL, +- 0, +- 0 +- }; ++ struct msghdr msghdr = { 0 }; ++ ++ msghdr.msg_name = &sanl_from; ++ msghdr.msg_namelen = sizeof(sanl_from); ++ msghdr.msg_iov = &iov; ++ msghdr.msg_iovlen = 1; + int nllen; + + ret = recvmsg (s, &msghdr, 0); +-- +2.37.2 + diff --git a/meta-python/recipes-devtools/python/python3-netifaces_0.11.0.bb b/meta-python/recipes-devtools/python/python3-netifaces_0.11.0.bb index 09e54b0baa..f211c69543 100644 --- a/meta-python/recipes-devtools/python/python3-netifaces_0.11.0.bb +++ b/meta-python/recipes-devtools/python/python3-netifaces_0.11.0.bb @@ -4,6 +4,8 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=a53cbc7cb75660694e138ba973c148df" -SRC_URI[sha256sum] = "043a79146eb2907edf439899f262b3dfe41717d34124298ed281139a8b93ca32" - inherit pypi setuptools3 + +SRC_URI += "file://0001-netifaces-initialize-msghdr-in-a-portable-way.patch" + +SRC_URI[sha256sum] = "043a79146eb2907edf439899f262b3dfe41717d34124298ed281139a8b93ca32" diff --git a/meta-python/recipes-devtools/python/python3-networkx_2.6.2.bb b/meta-python/recipes-devtools/python/python3-networkx_2.6.2.bb deleted file mode 100644 index e7676a7138..0000000000 --- a/meta-python/recipes-devtools/python/python3-networkx_2.6.2.bb +++ /dev/null @@ -1,19 +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=5cfa4d8f5881e0d053bb497130b9c73a" - -SRC_URI[sha256sum] = "2306f1950ce772c5a59a57f5486d59bb9cab98497c45fc49cbc45ac0dec119bb" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-decorator \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-pickle \ - ${PYTHON_PN}-html \ - ${PYTHON_PN}-xml \ - ${PYTHON_PN}-json \ - " 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.1.bb b/meta-python/recipes-devtools/python/python3-nmap_1.5.1.bb deleted file mode 100644 index ed0e980c8d..0000000000 --- a/meta-python/recipes-devtools/python/python3-nmap_1.5.1.bb +++ /dev/null @@ -1,18 +0,0 @@ -DESCRIPTION = "python-nmap is a python library which helps in using nmap port scanner" -HOMEPAGE = "https://www.nmmapper.com/" -SECTION = "devel/python" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" - -DEPENDS += "${PYTHON_PN}-wheel-native" - -PYPI_PACKAGE = "python3-nmap" - -SRC_URI[sha256sum] = "0e6667153a84938bdc0e95a64cd86397b4c46724c422873ea8f1d007d248926a" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += "nmap \ - ${PYTHON_PN}-requests \ - ${PYTHON_PN}-simplejson \ -" diff --git a/meta-python/recipes-devtools/python/python3-nmap_1.9.1.bb b/meta-python/recipes-devtools/python/python3-nmap_1.9.1.bb new file mode 100644 index 0000000000..25e382088b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-nmap_1.9.1.bb @@ -0,0 +1,18 @@ +DESCRIPTION = "python-nmap is a python library which helps in using nmap port scanner" +HOMEPAGE = "https://www.nmmapper.com/" +SECTION = "devel/python" +LICENSE = "GPL-3.0-only" +LIC_FILES_CHKSUM = "file://LICENSE;md5=1ebbd3e34237af26da5dc08a4e440464" + +DEPENDS += "python3-wheel-native" + +PYPI_PACKAGE = "python3-nmap" + +SRC_URI[sha256sum] = "8465cfb013f5cdfa8a1050c40cdae600b581ee32f1864ec404927aee49b4262c" + +inherit pypi setuptools3 + +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.4.bb b/meta-python/recipes-devtools/python/python3-nocasedict_2.0.4.bb new file mode 100644 index 0000000000..31bd15f8b9 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-nocasedict_2.0.4.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] = "4ca934f65df57b10d0fcab5f0c39e9dccb93577ff9f22bef98265ddbf12f8af1" + +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.3.bb b/meta-python/recipes-devtools/python/python3-nocaselist_2.0.3.bb new file mode 100644 index 0000000000..a869453875 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-nocaselist_2.0.3.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] = "55714da8433fb4843ce797404977e4385d5e3df9e4aa00f7dde983fd87410fef" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-six \ +" diff --git a/meta-python/recipes-devtools/python/python3-ntplib_0.4.0.bb b/meta-python/recipes-devtools/python/python3-ntplib_0.4.0.bb index e8620b14b5..d0a8d7a823 100644 --- a/meta-python/recipes-devtools/python/python3-ntplib_0.4.0.bb +++ b/meta-python/recipes-devtools/python/python3-ntplib_0.4.0.bb @@ -1,13 +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://ntplib.py;beginline=1;endline=23;md5=afa07338a9595257e94c205c3e72224d" +LIC_FILES_CHKSUM = "file://LICENSE;md5=40707636fe237d725e2bd32cd949b7fe" -SRC_URI = "git://github.com/cf-natali/ntplib.git;branch=master;protocol=https" -SRCREV ?= "b9c11c5906bc802a20a2dab390e57c50be558808" +SRC_URI[sha256sum] = "899d8fb5f8c2555213aea95efca02934c7343df6ace9d7628a5176b176906267" -S = "${WORKDIR}/git" +inherit pypi setuptools3 -inherit setuptools3 python3native - -RDEPENDS:${PN} += "${PYTHON_PN}-datetime ${PYTHON_PN}-io" +RDEPENDS:${PN} += "python3-datetime python3-io" diff --git a/meta-python/recipes-devtools/python/python3-oauthlib_3.1.1.bb b/meta-python/recipes-devtools/python/python3-oauthlib_3.2.2.bb index c2ec856fdb..833fdbcc58 100644 --- a/meta-python/recipes-devtools/python/python3-oauthlib_3.1.1.bb +++ b/meta-python/recipes-devtools/python/python3-oauthlib_3.2.2.bb @@ -4,7 +4,7 @@ HOMEPAGE = "https://github.com/idan/oauthlib" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=abd2675e944a2011aed7e505290ba482" -SRC_URI[sha256sum] = "8f0215fcc533dd8dd1bee6f4c412d4f0cd7297307d43ac61666389e3bc3198a3" +SRC_URI[sha256sum] = "9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918" inherit pypi setuptools3 @@ -14,9 +14,9 @@ inherit pypi setuptools3 # # Uncomment this line to enable all the optional features. #PACKAGECONFIG ?= "test signedtoken signals rsa" -PACKAGECONFIG[test] = ",,,${PYTHON_PN}-blinker ${PYTHON_PN}-cryptography ${PYTHON_PN}-nose ${PYTHON_PN}-pyjwt" -PACKAGECONFIG[signedtoken] = ",,,${PYTHON_PN}-cryptography ${PYTHON_PN}-pyjwt" -PACKAGECONFIG[signals] = ",,,${PYTHON_PN}-blinker" -PACKAGECONFIG[rsa] = ",,,${PYTHON_PN}-cryptography" +PACKAGECONFIG[test] = ",,,python3-blinker python3-cryptography python3-pytest python3-pyjwt" +PACKAGECONFIG[signedtoken] = ",,,python3-cryptography python3-pyjwt" +PACKAGECONFIG[signals] = ",,,python3-blinker" +PACKAGECONFIG[rsa] = ",,,python3-cryptography" -RDEPENDS:${PN} += "${PYTHON_PN}-core ${PYTHON_PN}-crypt ${PYTHON_PN}-datetime ${PYTHON_PN}-json ${PYTHON_PN}-logging ${PYTHON_PN}-math ${PYTHON_PN}-netclient ${PYTHON_PN}-unittest" +RDEPENDS:${PN} += "python3-core python3-crypt python3-datetime python3-json python3-logging python3-math python3-netclient python3-unittest" diff --git a/meta-python/recipes-devtools/python/python3-obd_0.7.1.bb b/meta-python/recipes-devtools/python/python3-obd_0.7.1.bb deleted file mode 100644 index b3a78ad651..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.2.bb b/meta-python/recipes-devtools/python/python3-oletools_0.60.2.bb new file mode 100644 index 0000000000..162ebcab2d --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-oletools_0.60.2.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=181754d317256f1b037529d3e994e1b4" + +SRC_URI[sha256sum] = "ad452099f4695ffd8855113f453348200d195ee9fa341a09e197d66ee7e0b2c3" + +inherit pypi setuptools3 + +PYPI_PACKAGE = "oletools" +PYPI_PACKAGE_EXT = "zip" diff --git a/meta-python/recipes-devtools/python/python3-openpyxl_3.0.9.bb b/meta-python/recipes-devtools/python/python3-openpyxl_3.1.5.bb index 4dfd4490ab..990d3cf33e 100644 --- a/meta-python/recipes-devtools/python/python3-openpyxl_3.0.9.bb +++ b/meta-python/recipes-devtools/python/python3-openpyxl_3.1.5.bb @@ -9,15 +9,15 @@ LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=8227180126797a0148 inherit pypi setuptools3 -SRC_URI[sha256sum] = "40f568b9829bf9e446acfffce30250ac1fa39035124d55fc024025c41481c90f" +SRC_URI[sha256sum] = "cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-pprint \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-jdcal \ - ${PYTHON_PN}-et-xmlfile \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-xml \ + python3-compression \ + python3-io \ + python3-pprint \ + python3-shell \ + python3-jdcal \ + python3-et-xmlfile \ + python3-numbers \ + python3-xml \ " diff --git a/meta-python/recipes-devtools/python/python3-ordered-set/run-ptest b/meta-python/recipes-devtools/python/python3-ordered-set/run-ptest index 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 323fe18fd1..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.6.1.bb b/meta-python/recipes-devtools/python/python3-paho-mqtt_2.1.0.bb index 81a6d0a9c9..0c3e6e9266 100644 --- a/meta-python/recipes-devtools/python/python3-paho-mqtt_1.6.1.bb +++ b/meta-python/recipes-devtools/python/python3-paho-mqtt_2.1.0.bb @@ -5,11 +5,15 @@ LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=8e5f264c6988aec56808a3a11e77b913 \ " SRCNAME = "paho-mqtt" -inherit pypi setuptools3 +inherit pypi python_hatchling python_setuptools_build_meta -SRC_URI[sha256sum] = "2a8291c81623aec00372b5a85558a372c747cbca8e9934dfe218638b8eefc26f" +SRC_URI[sha256sum] = "12d6e7511d4137555a3f6ea167ae846af2c7357b10bc6fa4f7c3968fc1723834" -DEPENDS += "${PYTHON_PN}-pytest-runner-native" +PYPI_SRC_URI = "https://files.pythonhosted.org/packages/39/15/0a6214e76d4d32e7f663b109cf71fb22561c2be0f701d67f93950cd40542/paho_mqtt-${PV}.tar.gz" + +S = "${WORKDIR}/paho_mqtt-${PV}" + +DEPENDS += "python3-pytest-runner-native" do_install:append() { install -d -m0755 ${D}${datadir}/${BPN}/examples @@ -18,16 +22,16 @@ do_install:append() { PACKAGES =+ "${PN}-examples" -RDEPENDS:${PN}-examples += "${PN} ${PYTHON_PN}-core" +RDEPENDS:${PN}-examples += "${PN} python3-core" FILES:${PN}-examples = "${datadir}/${BPN}/examples" RDEPENDS:${PN} = "\ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-math \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-threading \ + python3-io \ + python3-logging \ + python3-math \ + python3-netclient \ + python3-threading \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pako_0.3.1.bb b/meta-python/recipes-devtools/python/python3-pako_0.3.1.bb index 65af4121f9..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 @@ -8,5 +8,13 @@ SRC_URI[sha256sum] = "c033a073bb818ca336ae1fccba2655bd60dfe77744f85d4517abd3160d inherit pypi setuptools3 do_install:append() { - rm -rf ${D}/usr/share + 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/0001-pyproject.toml-Downgrade-numpy-version-needs-to-1.x.patch b/meta-python/recipes-devtools/python/python3-pandas/0001-pyproject.toml-Downgrade-numpy-version-needs-to-1.x.patch new file mode 100644 index 0000000000..b0ef8ce00c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pandas/0001-pyproject.toml-Downgrade-numpy-version-needs-to-1.x.patch @@ -0,0 +1,27 @@ +From d81d95274d84ac51fc02e0fa91affc7f3cbefccb Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Sat, 24 Aug 2024 10:21:43 -0700 +Subject: [PATCH] pyproject.toml: Downgrade numpy version needs to 1.x + +Drop it when numpy is upgraded to 2.x or newer in core + +Upstream-Status: Inappropriate [OE workaround] + +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + pyproject.toml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/pyproject.toml b/pyproject.toml +index 5158d60..d3daa78 100644 +--- a/pyproject.toml ++++ b/pyproject.toml +@@ -8,7 +8,7 @@ requires = [ + "Cython>=3.0.5", # Note: sync with setup.py, environment.yml and asv.conf.json + # Force numpy higher than 2.0rc1, so that built wheels are compatible + # with both numpy 1 and 2 +- "numpy>=2.0.0rc1", ++ "numpy>=1.24.0", + "versioneer[toml]" + ] + diff --git a/meta-python/recipes-devtools/python/python3-pandas/0001-pyproject.toml-don-t-pin-dependency-versions.patch b/meta-python/recipes-devtools/python/python3-pandas/0001-pyproject.toml-don-t-pin-dependency-versions.patch new file mode 100644 index 0000000000..f60f43a5b0 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pandas/0001-pyproject.toml-don-t-pin-dependency-versions.patch @@ -0,0 +1,37 @@ +From d46b8720a6bccb345f6bdd7ee2f5c357e7eb227b Mon Sep 17 00:00:00 2001 +From: Trevor Gamblin <tgamblin@baylibre.com> +Date: Mon, 12 Aug 2024 11:27:36 -0400 +Subject: [PATCH] pyproject.toml: don't pin dependency versions + +Pandas will fail to build if the exact versions aren't found, but newer +ones actually work. Since newer versions of pandas are adjusting the +requires section of pyproject toml further, just patch it for us. + +Upstream-Status: Inappropriate [OE-Specific] + +Signed-off-by: Trevor Gamblin <tgamblin@baylibre.com> +--- + pyproject.toml | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/pyproject.toml b/pyproject.toml +index db9f055799..5158d60f59 100644 +--- a/pyproject.toml ++++ b/pyproject.toml +@@ -2,10 +2,10 @@ + # Minimum requirements for the build system to execute. + # See https://github.com/scipy/scipy/pull/12940 for the AIX issue. + requires = [ +- "meson-python==0.13.1", +- "meson==1.2.1", ++ "meson-python>=0.13.1", ++ "meson>=1.2.1", + "wheel", +- "Cython==3.0.5", # Note: sync with setup.py, environment.yml and asv.conf.json ++ "Cython>=3.0.5", # Note: sync with setup.py, environment.yml and asv.conf.json + # Force numpy higher than 2.0rc1, so that built wheels are compatible + # with both numpy 1 and 2 + "numpy>=2.0.0rc1", +-- +2.39.2 + diff --git a/meta-python/recipes-devtools/python/python3-pandas_1.3.4.bb b/meta-python/recipes-devtools/python/python3-pandas_1.3.4.bb deleted file mode 100644 index cde43184bb..0000000000 --- a/meta-python/recipes-devtools/python/python3-pandas_1.3.4.bb +++ /dev/null @@ -1,26 +0,0 @@ -SUMMARY = "pandas library for high-performance data analysis tools" -DESCRIPTION = "pandas is an open source, BSD-licensed library providing \ -high-performance, easy-to-use data structures and data analysis tools for \ -the Python programming language." -HOMEPAGE = "http://pandas.pydata.org/" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=3f23c5c092b74d245d48eeef72bc3fd2" - -SRC_URI[sha256sum] = "a2aa18d3f0b7d538e21932f637fbfe8518d085238b429e4790a35e1e44a96ffc" - -inherit pypi setuptools3 - -DEPENDS += " \ - ${PYTHON_PN}-numpy-native ${PYTHON_PN}-cython-native \ -" - -CFLAGS:append:toolchain-clang = " -Wno-error=deprecated-declarations" - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-numpy \ - ${PYTHON_PN}-dateutil \ - ${PYTHON_PN}-dateutil-zoneinfo \ - ${PYTHON_PN}-pytz \ - ${PYTHON_PN}-profile \ -" diff --git a/meta-python/recipes-devtools/python/python3-pandas_2.2.2.bb b/meta-python/recipes-devtools/python/python3-pandas_2.2.2.bb new file mode 100644 index 0000000000..25b03c8e32 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pandas_2.2.2.bb @@ -0,0 +1,43 @@ +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 += " \ + file://0001-pyproject.toml-don-t-pin-dependency-versions.patch \ + file://0001-pyproject.toml-Downgrade-numpy-version-needs-to-1.x.patch \ + " + +SRC_URI[sha256sum] = "9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54" + +inherit pypi python_mesonpy + +DEPENDS += " \ + python3-cython-native \ + python3-numpy-native \ + python3-versioneer-native \ +" + +PACKAGESPLITFUNCS =+ "fix_cythonized_sources" + +fix_cythonized_sources() { + for f in `grep -l -r -e '\/* Generated by Cython.*/$' ${PKGD}${TARGET_DBGSRC_DIR}`; do + if [ -e $f ]; then + sed -i -e 's#${RECIPE_SYSROOT_NATIVE}##g' $f + fi + done +} + +CFLAGS:append:toolchain-clang = " -Wno-error=deprecated-declarations" + +RDEPENDS:${PN} += " \ + python3-json \ + python3-numpy \ + python3-dateutil \ + python3-dateutil-zoneinfo \ + python3-pytz \ + python3-profile \ +" diff --git a/meta-python/recipes-devtools/python/python3-parallax_1.0.6.bb b/meta-python/recipes-devtools/python/python3-parallax_1.0.6.bb index 14c90ffb58..1fc967d953 100644 --- a/meta-python/recipes-devtools/python/python3-parallax_1.0.6.bb +++ b/meta-python/recipes-devtools/python/python3-parallax_1.0.6.bb @@ -8,6 +8,6 @@ SRC_URI[sha256sum] = "c16703202ff67aed4740c0727df304abe9f3e7851e653533b24de21b33 inherit pypi setuptools3 -RDEPENDS:${PN} += "${PYTHON_PN}-fcntl ${PYTHON_PN}-threading ${PYTHON_PN}-unixadmin" +RDEPENDS:${PN} += "python3-fcntl python3-threading python3-unixadmin" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-paramiko_2.8.0.bb b/meta-python/recipes-devtools/python/python3-paramiko_3.5.0.bb index 1942a1d6c5..8ccf939f7a 100644 --- a/meta-python/recipes-devtools/python/python3-paramiko_2.8.0.bb +++ b/meta-python/recipes-devtools/python/python3-paramiko_3.5.0.bb @@ -1,9 +1,9 @@ DESCRIPTION = "The leading native Python SSHv2 protocol library." HOMEPAGE = "https://github.com/paramiko/paramiko/" -LICENSE = "LGPL-2.1" +LICENSE = "LGPL-2.1-only" LIC_FILES_CHKSUM = "file://LICENSE;md5=fd0120fc2e9f841c73ac707a30389af5" -SRC_URI[sha256sum] = "e673b10ee0f1c80d46182d3af7751d033d9b573dd7054d2d0aa46be186c3c1d2" +SRC_URI[sha256sum] = "ad11e540da4f55cedda52931f1a3f812a8238a7af7f62a60de538cd80bb28124" PYPI_PACKAGE = "paramiko" @@ -11,9 +11,10 @@ inherit pypi setuptools3 CLEANBROKEN = "1" -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-bcrypt \ - ${PYTHON_PN}-cryptography \ - ${PYTHON_PN}-pynacl \ - ${PYTHON_PN}-unixadmin \ +RDEPENDS:${PN} += " \ + python3-bcrypt \ + python3-cryptography \ + python3-logging \ + python3-pynacl \ + python3-unixadmin \ " diff --git a/meta-python/recipes-devtools/python/python3-parse-type/run-ptest b/meta-python/recipes-devtools/python/python3-parse-type/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-parse-type/run-ptest +++ b/meta-python/recipes-devtools/python/python3-parse-type/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-parse-type_0.5.2.bb b/meta-python/recipes-devtools/python/python3-parse-type_0.5.2.bb deleted file mode 100644 index 7eebbfb503..0000000000 --- a/meta-python/recipes-devtools/python/python3-parse-type_0.5.2.bb +++ /dev/null @@ -1,30 +0,0 @@ -SUMMARY = "Simplifies building parse types based on the parse module" -HOMEPAGE = "https://github.com/jenisys/parse_type" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=16374dbaeaca1890153edb3f41371222" - -SRC_URI[md5sum] = "b954062f14ab723a91fe1e2be15e859d" -SRC_URI[sha256sum] = "7f690b18d35048c15438d6d0571f9045cffbec5907e0b1ccf006f889e3a38c0b" - -PYPI_PACKAGE = "parse_type" -inherit pypi ptest setuptools3 - -RDEPENDS:${PN} += "${PYTHON_PN}-parse ${PYTHON_PN}-six" - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ -" - -do_configure:prepend() { - sed -i -e "/python_version >= 3.0/d" ${S}/setup.py - sed -i -e "/use_2to3/d" ${S}/setup.py -} - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/tests - cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ -} diff --git a/meta-python/recipes-devtools/python/python3-parse-type_0.6.3.bb b/meta-python/recipes-devtools/python/python3-parse-type_0.6.3.bb new file mode 100644 index 0000000000..06843c03cb --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-parse-type_0.6.3.bb @@ -0,0 +1,25 @@ +SUMMARY = "Simplifies building parse types based on the parse module" +HOMEPAGE = "https://github.com/jenisys/parse_type" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=2e469278ace89c246d52505acc39c3da" + +SRC_URI[sha256sum] = "8e99d2f52fab2f0f1f3d68ba9d026060140bf0e53680aada0111fb27b2f0e93a" +SRC_URI += " \ + file://run-ptest \ +" + +PYPI_PACKAGE = "parse_type" + +inherit pypi ptest python_setuptools_build_meta + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} + +RDEPENDS:${PN} += "python3-parse" +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-six \ + python3-unittest-automake-output \ +" diff --git a/meta-python/recipes-devtools/python/python3-parse/run-ptest b/meta-python/recipes-devtools/python/python3-parse/run-ptest index 40c284799d..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-parse/run-ptest +++ b/meta-python/recipes-devtools/python/python3-parse/run-ptest @@ -1,2 +1,3 @@ #!/bin/sh -pytest + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-parse_1.19.0.bb b/meta-python/recipes-devtools/python/python3-parse_1.19.0.bb deleted file mode 100644 index 2bf55cbaff..0000000000 --- a/meta-python/recipes-devtools/python/python3-parse_1.19.0.bb +++ /dev/null @@ -1,25 +0,0 @@ -SUMMARY = "Parse strings using a specification based on the Python format() syntax" -HOMEPAGE = "https://github.com/r1chardj0n3s/parse" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=8ab458ad281b60e6f1b39b3feafbfc05" - -SRC_URI[sha256sum] = "9ff82852bcb65d139813e2a5197627a94966245c897796760a3a2a8eb66f020b" - -inherit pypi setuptools3 ptest - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-logging \ - " - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ -" - -do_install_ptest() { - cp -f ${S}/test_parse.py ${D}${PTEST_PATH}/ -} diff --git a/meta-python/recipes-devtools/python/python3-parse_1.20.2.bb b/meta-python/recipes-devtools/python/python3-parse_1.20.2.bb new file mode 100644 index 0000000000..6e7139bfbe --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-parse_1.20.2.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] = "b41d604d16503c79d81af5165155c0b20f6c8d6c559efa66b4b695c3e5a0a0ce" + +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 950e82d1e9..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,17 +1,16 @@ SUMMARY = "A Python Parser" HOMEPAGE = "https://github.com/davidhalter/parso" -AUTHOR = "David Halter <davidhalter88@gmail.com>" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=cbaa2675b2424d771451332a7a69503f" PYPI_PACKAGE = "parso" -SRC_URI[sha256sum] = "12b83492c6239ce32ff5eed6d3639d6a536170723c6f3f1506869f1ace413398" +SRC_URI[sha256sum] = "eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d" inherit setuptools3 pypi RDEPENDS:${PN} = " \ - ${PYTHON_PN}-crypt \ - ${PYTHON_PN}-difflib \ - ${PYTHON_PN}-logging \ + python3-crypt \ + python3-difflib \ + python3-logging \ " diff --git a/meta-python/recipes-devtools/python/python3-passlib_1.7.4.bb b/meta-python/recipes-devtools/python/python3-passlib_1.7.4.bb index dc692303fe..8b66e25922 100644 --- a/meta-python/recipes-devtools/python/python3-passlib_1.7.4.bb +++ b/meta-python/recipes-devtools/python/python3-passlib_1.7.4.bb @@ -15,7 +15,7 @@ SRC_URI[sha256sum] = "defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c415 inherit pypi setuptools3 RDEPENDS:${PN} += "\ - ${PYTHON_PN}-crypt \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-netclient \ + python3-crypt \ + python3-logging \ + python3-netclient \ " diff --git a/meta-python/recipes-devtools/python/python3-pastedeploy_2.1.1.bb b/meta-python/recipes-devtools/python/python3-pastedeploy_3.1.0.bb index 86f29e119d..27f32bf1af 100644 --- a/meta-python/recipes-devtools/python/python3-pastedeploy_2.1.1.bb +++ b/meta-python/recipes-devtools/python/python3-pastedeploy_3.1.0.bb @@ -6,7 +6,7 @@ LIC_FILES_CHKSUM = "file://license.txt;md5=1798f29d55080c60365e6283cb49779c" inherit pypi PYPI_PACKAGE = "PasteDeploy" -SRC_URI[sha256sum] = "6dead6ab9823a85d585ef27f878bc647f787edb9ca8da0716aa9f1261b464817" +SRC_URI[sha256sum] = "9ddbaf152f8095438a9fe81f82c78a6714b92ae8e066bed418b6a7ff6a095a95" S = "${WORKDIR}/PasteDeploy-${PV}" diff --git a/meta-python/recipes-devtools/python/python3-path/run-ptest b/meta-python/recipes-devtools/python/python3-path/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-path/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-path_17.0.0.bb b/meta-python/recipes-devtools/python/python3-path_17.0.0.bb new file mode 100644 index 0000000000..e809952079 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-path_17.0.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] = "e1540261d22df1416fb1b498b3b1ed5353a371a48fe197d66611bb01e7fab2d5" + +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}/tests/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-pathlib2_2.3.7.bb b/meta-python/recipes-devtools/python/python3-pathlib2_2.3.7.bb new file mode 100644 index 0000000000..d4de40893a --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pathlib2_2.3.7.bb @@ -0,0 +1,12 @@ +SUMMARY = "Object-oriented filesystem paths" +HOMEPAGE = "https://github.com/mcmtroffaes/pathlib2" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=2dc08586cce3ab91bfa091b655c0e440" + +SRC_URI[sha256sum] = "7a4329d67beff9a712e1d3ae147e4e3e108b0bfd284ffdea03a635126c76b3c0" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-six python3-ctypes" + +BBCLASSEXTEND = "native nativesdk" 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.3.3.bb b/meta-python/recipes-devtools/python/python3-pdm-backend_2.3.3.bb new file mode 100644 index 0000000000..e78f1957a7 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pdm-backend_2.3.3.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] = "a8616f628ec84353d7a0ba86b228dcf01bab5debc9e4d1a29e5311a52425d594" + +inherit pypi python_setuptools_build_meta + +PYPI_PACKAGE= "pdm_backend" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pdm_2.16.1.bb b/meta-python/recipes-devtools/python/python3-pdm_2.16.1.bb new file mode 100644 index 0000000000..91ec759386 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pdm_2.16.1.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] = "b8680028b3aff3af8e15b483467da36bb9f02fcd402cf939da8ab6375d955131" + +inherit pypi python_setuptools_build_meta + +DEPENDS += " \ + python3-pdm-backend-native \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pep8_1.7.1.bb b/meta-python/recipes-devtools/python/python3-pep8_1.7.1.bb index f3e03ed309..68507e2482 100644 --- a/meta-python/recipes-devtools/python/python3-pep8_1.7.1.bb +++ b/meta-python/recipes-devtools/python/python3-pep8_1.7.1.bb @@ -9,9 +9,9 @@ SRC_URI[sha256sum] = "603a46e5c358ce20ac4807a0eeafac7505d1125a4c1bd8378757ada06f inherit pypi setuptools3 -RDEPENDS:${PN} += "${PYTHON_PN}-prettytable \ - ${PYTHON_PN}-cmd2 \ - ${PYTHON_PN}-pyparsing" +RDEPENDS:${PN} += "python3-prettytable \ + python3-cmd2 \ + python3-pyparsing" SRC_URI[md5sum] = "603821d06db945c71d811b5a8d78423c" SRC_URI[sha256sum] = "fe249b52e20498e59e0b5c5256aa52ee99fc295b26ec9eaa85776ffdb9fe6374" diff --git a/meta-python/recipes-devtools/python/python3-periphery_2.3.0.bb b/meta-python/recipes-devtools/python/python3-periphery_2.4.1.bb index 4d81b8d244..c2764b27d2 100644 --- a/meta-python/recipes-devtools/python/python3-periphery_2.3.0.bb +++ b/meta-python/recipes-devtools/python/python3-periphery_2.4.1.bb @@ -2,14 +2,14 @@ DESCRIPTION = "A pure Python 2/3 library for peripheral I/O (GPIO, LED, PWM, SPI HOMEPAGE = "http://pythonhosted.org/python-periphery/" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=fed1784a083509430580a913df680706" +LIC_FILES_CHKSUM = "file://LICENSE;md5=30fe6f023a80fb33989fb3b9d773fea0" -SRC_URI[sha256sum] = "8a8ec019d9b330a6a6f69a7de61d14b4c98b102d76359047c5ce0263e12246a6" +SRC_URI[sha256sum] = "61d461d736982a6f766e878720ab10a68151e2e8c1086600d9389ac47e40e88a" inherit pypi setuptools3 PYPI_PACKAGE = "python-periphery" -RDEPENDS:${PN} += "${PYTHON_PN}-mmap \ - ${PYTHON_PN}-ctypes \ - ${PYTHON_PN}-fcntl" +RDEPENDS:${PN} += "python3-mmap \ + python3-ctypes \ + python3-fcntl" diff --git a/meta-python/recipes-devtools/python/python3-petact_0.1.2.bb b/meta-python/recipes-devtools/python/python3-petact_0.1.2.bb index 58cd05e222..b7fa69ffa8 100644 --- a/meta-python/recipes-devtools/python/python3-petact_0.1.2.bb +++ b/meta-python/recipes-devtools/python/python3-petact_0.1.2.bb @@ -7,3 +7,9 @@ SRC_URI[md5sum] = "47e9a6abc91b4022953e4007ddae9e68" SRC_URI[sha256sum] = "5dcb0d44f86a601e41a2def9770993cd0ea45c76d37eb3f35e3dd61aa50350e6" inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-compression \ + python3-crypt \ + python3-io \ +" diff --git a/meta-python/recipes-devtools/python/python3-pexpect_4.8.0.bb b/meta-python/recipes-devtools/python/python3-pexpect_4.9.0.bb index ed25406085..521df9dcd4 100644 --- a/meta-python/recipes-devtools/python/python3-pexpect_4.8.0.bb +++ b/meta-python/recipes-devtools/python/python3-pexpect_4.9.0.bb @@ -6,20 +6,19 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=1c7a725251880af8c6a148181665385b" SRC_URI += "file://0001-FSM.py-change-shebang-from-python-to-python3.patch" -SRC_URI[md5sum] = "153eb25184249d6a85fde9acf4804085" -SRC_URI[sha256sum] = "fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c" +SRC_URI[sha256sum] = "ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f" inherit pypi setuptools3 UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/pexpect" RDEPENDS:${PN} = "\ - ${PYTHON_PN}-core \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-terminal \ - ${PYTHON_PN}-resource \ - ${PYTHON_PN}-fcntl \ - ${PYTHON_PN}-ptyprocess \ + python3-core \ + python3-io \ + python3-terminal \ + python3-resource \ + python3-fcntl \ + python3-ptyprocess \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pickleshare_0.7.5.bb b/meta-python/recipes-devtools/python/python3-pickleshare_0.7.5.bb index 9d67e4f338..bb16c78ce8 100644 --- a/meta-python/recipes-devtools/python/python3-pickleshare_0.7.5.bb +++ b/meta-python/recipes-devtools/python/python3-pickleshare_0.7.5.bb @@ -1,6 +1,5 @@ SUMMARY = "Tiny 'shelve'-like database with concurrency support" HOMEPAGE = "https://github.com/pickleshare/pickleshare" -AUTHOR = "Ville Vainio <vivainio@gmail.com>" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=905c08218089ffebea3a64c82fc4d7d0" @@ -10,3 +9,5 @@ SRC_URI[md5sum] = "44ab782615894a812ab96669a122a634" SRC_URI[sha256sum] = "87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca" inherit setuptools3 pypi + +RDEPENDS:${PN} += "python3-pickle" diff --git a/meta-python/recipes-devtools/python/python3-pid_3.0.4.bb b/meta-python/recipes-devtools/python/python3-pid_3.0.4.bb index 412dcfce40..c90f551056 100644 --- a/meta-python/recipes-devtools/python/python3-pid_3.0.4.bb +++ b/meta-python/recipes-devtools/python/python3-pid_3.0.4.bb @@ -9,4 +9,4 @@ SRC_URI[sha256sum] = "0e33670e83f6a33ebb0822e43a609c3247178d4a375ff50a4689e266d8 inherit pypi setuptools3 -RDEPENDS:${PN} += "${PYTHON_PN}-fcntl ${PYTHON_PN}-logging ${PYTHON_PN}-io" +RDEPENDS:${PN} += "python3-fcntl python3-logging python3-io" diff --git a/meta-python/recipes-devtools/python/python3-pika_1.2.0.bb b/meta-python/recipes-devtools/python/python3-pika_1.2.0.bb deleted file mode 100644 index aa3179f2a6..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/0001-support-cross-compiling.patch b/meta-python/recipes-devtools/python/python3-pillow/0001-support-cross-compiling.patch index e4ba35b886..220c4edc3f 100644 --- a/meta-python/recipes-devtools/python/python3-pillow/0001-support-cross-compiling.patch +++ b/meta-python/recipes-devtools/python/python3-pillow/0001-support-cross-compiling.patch @@ -1,4 +1,4 @@ -From cd09b6f68aa49c72e9a9bb0765e8c666238a7b7e Mon Sep 17 00:00:00 2001 +From 5b28d19d6513cc3eb3105d3f917df352283f3c5e Mon Sep 17 00:00:00 2001 From: Leon Anavi <leon.anavi@konsulko.com> Date: Mon, 11 Jan 2021 13:25:12 +0000 Subject: [PATCH] support cross compiling @@ -12,10 +12,10 @@ Signed-off-by: Leon Anavi <leon.anavi@konsulko.com> 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py -index cbc2641c..302bc6e7 100755 +index 0abfaaddc..557420a6b 100644 --- a/setup.py +++ b/setup.py -@@ -123,7 +123,7 @@ _LIB_IMAGING = ( +@@ -129,7 +129,7 @@ _LIB_IMAGING = ( "codec_fd", ) @@ -24,7 +24,7 @@ index cbc2641c..302bc6e7 100755 class DependencyException(Exception): -@@ -408,12 +408,12 @@ class pil_build_ext(build_ext): +@@ -508,12 +508,12 @@ class pil_build_ext(build_ext): _add_directory(library_dirs, match.group(1)) # include, rpath, if set as environment variables: @@ -39,6 +39,3 @@ index cbc2641c..302bc6e7 100755 if k in os.environ: for d in os.environ[k].split(os.path.pathsep): _add_directory(library_dirs, d) --- -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.4.0.bb b/meta-python/recipes-devtools/python/python3-pillow_10.4.0.bb new file mode 100644 index 0000000000..a9cb903ac1 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pillow_10.4.0.bb @@ -0,0 +1,73 @@ +DESCRIPTION = "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 = "HPND" +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 = "9b4fae77178e827ab17118fbc89c739ffd6a0fab" + +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)} \ +" +# python3-compile for filecmp module +RDEPENDS:${PN}-ptest += " \ + bash \ + ghostscript \ + jpeg-tools \ + libwebp \ + python3-compile \ + 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.3.2.bb b/meta-python/recipes-devtools/python/python3-pillow_8.3.2.bb deleted file mode 100644 index bc6c801c36..0000000000 --- a/meta-python/recipes-devtools/python/python3-pillow_8.3.2.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.3.x;protocol=https \ - file://0001-support-cross-compiling.patch \ - file://0001-explicitly-set-compile-options.patch \ -" -SRCREV ?= "8013f130a5077b238a4346b73e149432b180a8ea" - -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.18.bb b/meta-python/recipes-devtools/python/python3-pint_0.24.1.bb index a7a1384da1..8959a72ff7 100644 --- a/meta-python/recipes-devtools/python/python3-pint_0.18.bb +++ b/meta-python/recipes-devtools/python/python3-pint_0.24.1.bb @@ -8,9 +8,12 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=bccf824202692270a1e0829a62e3f47b" PYPI_PACKAGE := "Pint" -inherit pypi ptest setuptools3 +inherit ptest python_setuptools_build_meta -SRC_URI[sha256sum] = "8c4bce884c269051feb7abc69dbfd18403c0c764abc83da132e8a7222f8ba801" +SRCREV = "4c2caccfc6cdac1f80a9bfa15ebea1ca49836881" +SRC_URI = "git://github.com/hgrecco/pint;protocol=https;branch=master" +S = "${WORKDIR}/git" +#SRC_URI[sha256sum] = "e1509b91606dbc52527c600a4ef74ffac12fff70688aff20e9072409346ec9b4" DEPENDS += "python3-setuptools-scm-native" @@ -21,15 +24,18 @@ SRC_URI += " \ " RDEPENDS:${PN} += " \ - ${PYTHON_PN}-setuptools \ - ${PYTHON_PN}-packaging \ + python3-setuptools \ + python3-packaging \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-appdirs \ + python3-flexcache \ + python3-flexparser \ + python3-pytest \ " do_install_ptest() { install -d ${D}${PTEST_PATH}/testsuite - cp -rf ${S}/pint/testsuite/* ${D}${PTEST_PATH}/testsuite/ + cp -rf ${S}/pint/* ${D}${PTEST_PATH}/ } diff --git a/meta-python/recipes-devtools/python/python3-pkgconfig_1.5.5.bb b/meta-python/recipes-devtools/python/python3-pkgconfig_1.5.5.bb index 2d68a78e37..9ff4d1318d 100644 --- a/meta-python/recipes-devtools/python/python3-pkgconfig_1.5.5.bb +++ b/meta-python/recipes-devtools/python/python3-pkgconfig_1.5.5.bb @@ -7,10 +7,10 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=faa7f82be8f220bff6156be4790344fc" SRC_URI[sha256sum] = "deb4163ef11f75b520d822d9505c1f462761b4309b1bb713d08689759ea8b899" RDEPENDS:${PN} = "pkgconfig \ - ${PYTHON_PN}-shell \ + 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.3.6.bb b/meta-python/recipes-devtools/python/python3-platformdirs_4.3.6.bb new file mode 100644 index 0000000000..02d8c3cec7 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-platformdirs_4.3.6.bb @@ -0,0 +1,32 @@ +SUMMARY = "A small Python module for determining appropriate platform-specific dirs" +HOMEPAGE = "https://github.com/platformdirs/platformdirs" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ea4f5a41454746a9ed111e3d8723d17a" + +SRC_URI += " \ + file://run-ptest \ +" + +SRC_URI[sha256sum] = "357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907" + +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 99c037bb73..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 486e70c8fd..0000000000 --- a/meta-python/recipes-devtools/python/python3-polyline_1.4.0.bb +++ /dev/null @@ -1,26 +0,0 @@ -SUMMARY = "A Python implementation of Google's Encoded Polyline Algorithm Format" -HOMEPAGE = "https://pypi.org/project/polyline/" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=0fbd13500cabd06dd751ba6b2be304c6" - -SRC_URI[md5sum] = "b97c57378605c4a856c437569f95a0cb" -SRC_URI[sha256sum] = "7c7f89d09a09c7b6161bdbfb4fd304b186fc7a2060fa4f31cb3f61c646a5c074" - -inherit pypi setuptools3 ptest - -RDEPENDS:${PN} += "python3-six" - -BBCLASSEXTEND = "native nativesdk" - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ -" - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/test - cp -rf ${S}/test/* ${D}${PTEST_PATH}/test/ -} diff --git a/meta-python/recipes-devtools/python/python3-polyline_2.0.2.bb b/meta-python/recipes-devtools/python/python3-polyline_2.0.2.bb new file mode 100644 index 0000000000..00cb51be41 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-polyline_2.0.2.bb @@ -0,0 +1,26 @@ +SUMMARY = "A Python implementation of Google's Encoded Polyline Algorithm Format" +HOMEPAGE = "https://github.com/frederickjansen/polyline" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=1fb8d1dc685695195bb3c1e48adfef48" + +SRC_URI[sha256sum] = "10541e759c5fd51f746ee304e9af94744089a4055b6257b293b3afd1df64e369" + +inherit pypi python_setuptools_build_meta ptest + +RDEPENDS:${PN} += "python3-six" + +BBCLASSEXTEND = "native nativesdk" + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/test + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/test/ +} diff --git a/meta-python/recipes-devtools/python/python3-portion_2.2.0.bb b/meta-python/recipes-devtools/python/python3-portion_2.4.2.bb index e712c8f1ed..a5e26f302b 100644 --- a/meta-python/recipes-devtools/python/python3-portion_2.2.0.bb +++ b/meta-python/recipes-devtools/python/python3-portion_2.4.2.bb @@ -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 +inherit pypi python_setuptools_build_meta -SRC_URI[sha256sum] = "b6bfb08a7834787aca076da1200b735d97beef61b60a462b05213e7354a099cf" +SRC_URI[sha256sum] = "5289b40d98959b16b3f6927781678935d3df1b7c14947f5d7778e5e04dd9a065" + +RDEPENDS:${PN} = "\ + python3-sortedcontainers \ +" BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-posix-ipc_1.0.5.bb b/meta-python/recipes-devtools/python/python3-posix-ipc_1.0.5.bb deleted file mode 100644 index d66ef0e3c4..0000000000 --- a/meta-python/recipes-devtools/python/python3-posix-ipc_1.0.5.bb +++ /dev/null @@ -1,15 +0,0 @@ -DESCRIPTION = "POSIX IPC primitives (semaphores, shared memory and message queues) for Python" -HOMEPAGE = "http://semanchuk.com/philip/posix_ipc/" -SECTION = "devel/python" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=dc089fb2f37e90799a54c19a20c9880f" - -PYPI_PACKAGE = "posix_ipc" - -# Archived version so we need to overwrite what the pypi class will derive -PYPI_SRC_URI = "https://pypi.python.org/packages/source/p/${PYPI_PACKAGE}/${PYPI_PACKAGE}-${PV}.tar.gz" - -SRC_URI[md5sum] = "8c9443859492ecf3aae9182aa6b5c78c" -SRC_URI[sha256sum] = "6cddb1ce2cf4aae383f2a0079c26c69bee257fe2720f372201ef047f8ceb8b97" - -inherit setuptools3 pypi diff --git a/meta-python/recipes-devtools/python/python3-posix-ipc_1.1.1.bb b/meta-python/recipes-devtools/python/python3-posix-ipc_1.1.1.bb new file mode 100644 index 0000000000..a71187399b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-posix-ipc_1.1.1.bb @@ -0,0 +1,11 @@ +DESCRIPTION = "POSIX IPC primitives (semaphores, shared memory and message queues) for Python" +HOMEPAGE = "http://semanchuk.com/philip/posix_ipc/" +SECTION = "devel/python" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=513d94a7390d4d72f3475e2d45c739b5" + +PYPI_PACKAGE = "posix_ipc" + +SRC_URI[sha256sum] = "e2456ba0cfb2ee5ba14121450e8d825b3c4a1461fca0761220aab66d4111cbb7" + +inherit setuptools3 pypi diff --git a/meta-python/recipes-devtools/python/python3-prctl_1.8.1.bb b/meta-python/recipes-devtools/python/python3-prctl_1.8.1.bb index 8426e48113..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,15 +4,13 @@ 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;protocol=https;branch=main \ file://0001-support-cross-complication.patch \ " diff --git a/meta-python/recipes-devtools/python/python3-precise-runner/run-ptest b/meta-python/recipes-devtools/python/python3-precise-runner/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-precise-runner/run-ptest +++ b/meta-python/recipes-devtools/python/python3-precise-runner/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-precise-runner_0.3.1.bb b/meta-python/recipes-devtools/python/python3-precise-runner_0.3.1.bb index 9e5435bada..1fb72de126 100644 --- a/meta-python/recipes-devtools/python/python3-precise-runner_0.3.1.bb +++ b/meta-python/recipes-devtools/python/python3-precise-runner_0.3.1.bb @@ -13,7 +13,8 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-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.4.0.bb b/meta-python/recipes-devtools/python/python3-prettytable_2.4.0.bb deleted file mode 100644 index 8f5eb42996..0000000000 --- a/meta-python/recipes-devtools/python/python3-prettytable_2.4.0.bb +++ /dev/null @@ -1,43 +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] = "18e56447f636b447096977d468849c1e2d3cfa0af8e7b5acfcf83a64790c0aca" - -do_install:append() { - perm_files=`find "${D}${PYTHON_SITEPACKAGES_DIR}/" -name "*.txt" -o -name "PKG-INFO"` - for f in $perm_files; do - chmod 644 "${f}" - done -} - -UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/PrettyTable/" -UPSTREAM_CHECK_REGEX = "/PrettyTable/(?P<pver>(\d+[\.\-_]*)+)" - -BBCLASSEXTEND = "native nativesdk" -inherit pypi ptest setuptools3 - -SRC_URI += " \ - file://run-ptest \ -" - -DEPENDS += "${PYTHON_PN}-setuptools-scm-native" - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-math \ - ${PYTHON_PN}-html \ - ${PYTHON_PN}-wcwidth \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-importlib-metadata \ -" - -RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-sqlite3 \ -" - -do_install_ptest() { - cp -f ${S}/tests/test_prettytable.py ${D}${PTEST_PATH}/ -} diff --git a/meta-python/recipes-devtools/python/python3-prettytable_3.11.0.bb b/meta-python/recipes-devtools/python/python3-prettytable_3.11.0.bb new file mode 100644 index 0000000000..df11141a5a --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-prettytable_3.11.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] = "7e23ca1e68bbfd06ba8de98bf553bf3493264c96d5e8a615c0471025deeba722" +SRC_URI += " \ + file://run-ptest \ +" +inherit pypi ptest python_hatchling + +do_install:append() { + perm_files=`find "${D}${PYTHON_SITEPACKAGES_DIR}/" -name "*.txt" -o -name "PKG-INFO"` + for f in $perm_files; do + chmod 644 "${f}" + done +} + +DEPENDS += "\ + python3-hatch-vcs-native \ +" + +RDEPENDS:${PN} += " \ + python3-compression \ + python3-html \ + python3-importlib-metadata \ + python3-json \ + python3-math \ + python3-wcwidth \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-pytest-lazy-fixtures \ + python3-sqlite3 \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-process-tests_2.1.2.bb b/meta-python/recipes-devtools/python/python3-process-tests_3.0.0.bb index 24ab0399f9..a16497b984 100644 --- a/meta-python/recipes-devtools/python/python3-process-tests_2.1.2.bb +++ b/meta-python/recipes-devtools/python/python3-process-tests_3.0.0.bb @@ -4,12 +4,18 @@ SUMMARY = "Tools for testing processes." HOMEPAGE = "https://github.com/ionelmc/python-process-tests" LICENSE = "BSD-2-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=37031056aff37e4b3310872a9a3d0b1e" +LIC_FILES_CHKSUM = "file://LICENSE;md5=aea36d49429f53e06868d87cd9d62349" -SRC_URI[sha256sum] = "a3747ad947bdfc93e5c986bdb17a6d718f3f26e8577a0807a00962f29e26deba" +SRC_URI[sha256sum] = "e5d57dea7161251e91cadb84bf3ecc85275fb121fd478e579f800777b1d424bd" inherit pypi setuptools3 RDEPENDS:${PN} += "python3-core" BBCLASSEXTEND = "native nativesdk" + +RDEPENDS:${PN} += " \ + python3-io \ + python3-logging \ + python3-unittest \ +" diff --git a/meta-python/recipes-devtools/python/python3-progress_1.6.bb b/meta-python/recipes-devtools/python/python3-progress_1.6.bb index 1333da98da..59d1f90e98 100644 --- a/meta-python/recipes-devtools/python/python3-progress_1.6.bb +++ b/meta-python/recipes-devtools/python/python3-progress_1.6.bb @@ -8,8 +8,8 @@ SRC_URI[sha256sum] = "c9c86e98b5c03fa1fe11e3b67c1feda4788b8d0fe7336c2ff7d5644ccf inherit pypi setuptools3 RDEPENDS:${PN}:class-target += " \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-math \ + python3-datetime \ + python3-math \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.22.bb b/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.47.bb index e8cc876972..9997785dcd 100644 --- a/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.22.bb +++ b/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.47.bb @@ -3,23 +3,23 @@ HOMEPAGE = "https://python-prompt-toolkit.readthedocs.io/" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=b2cde7da89f0c1f3e49bf968d00d554f" -SRC_URI[sha256sum] = "449f333dd120bd01f5d296a8ce1452114ba3a71fae7288d2f0ae2c918764fa72" +SRC_URI[sha256sum] = "1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360" inherit pypi setuptools3 PYPI_PACKAGE = "prompt_toolkit" RDEPENDS:${PN} += " \ - ${PYTHON_PN}-core \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-terminal \ - ${PYTHON_PN}-threading \ - ${PYTHON_PN}-wcwidth \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-image \ - ${PYTHON_PN}-asyncio \ - ${PYTHON_PN}-xml \ + python3-core \ + python3-six \ + python3-terminal \ + python3-threading \ + python3-wcwidth \ + python3-datetime \ + python3-shell \ + python3-image \ + python3-asyncio \ + python3-xml \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-protobuf_3.19.0.bb b/meta-python/recipes-devtools/python/python3-protobuf_3.19.0.bb deleted file mode 100644 index 4ef51c6c20..0000000000 --- a/meta-python/recipes-devtools/python/python3-protobuf_3.19.0.bb +++ /dev/null @@ -1,39 +0,0 @@ -DESCRIPTION = "Protocol Buffers" -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" - -inherit pypi setuptools3 - -SRC_URI[sha256sum] = "6a1dc6584d24ef86f5b104bcad64fa0fe06ed36e5687f426e0445d363a041d18" - -# http://errors.yoctoproject.org/Errors/Details/184715/ -# Can't find required file: ../src/google/protobuf/descriptor.proto -CLEANBROKEN = "1" - -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 \ -" - -# For usage in other recipies when compiling protobuf files (e.g. by grpcio-tools) -BBCLASSEXTEND = "native nativesdk" - -DISTUTILS_BUILD_ARGS += "--cpp_implementation" -DISTUTILS_INSTALL_ARGS += "--cpp_implementation" - -do_compile:prepend:class-native () { - export KOKORO_BUILD_NUMBER="1" -} diff --git a/meta-python/recipes-devtools/python/python3-protobuf_4.25.3.bb b/meta-python/recipes-devtools/python/python3-protobuf_4.25.3.bb new file mode 100644 index 0000000000..c7e1f3c3f2 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-protobuf_4.25.3.bb @@ -0,0 +1,46 @@ +DESCRIPTION = "Protocol Buffers" +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=53dbfa56f61b90215a9f8f0d527c043d" + +inherit pypi setuptools3 +SRC_URI[sha256sum] = "25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c" + +# http://errors.yoctoproject.org/Errors/Details/184715/ +# Can't find required file: ../src/google/protobuf/descriptor.proto +CLEANBROKEN = "1" + +UPSTREAM_CHECK_REGEX = "protobuf/(?P<pver>\d+(\.\d+)+)/" + +DEPENDS += "protobuf" + +RDEPENDS:${PN} += " \ + python3-ctypes \ + python3-datetime \ + python3-json \ + python3-logging \ + python3-netclient \ + python3-numbers \ + python3-pkgutil \ + python3-unittest \ +" + +# For usage in other recipies when compiling protobuf files (e.g. by grpcio-tools) +BBCLASSEXTEND = "native nativesdk" + +DISTUTILS_BUILD_ARGS += "--cpp_implementation" +DISTUTILS_INSTALL_ARGS += "--cpp_implementation" + +do_compile:prepend:class-native () { + export KOKORO_BUILD_NUMBER="1" +} + +do_install:append () { + # Remove useless and problematic .pth file. python3-protobuf is installed in the standard + # location of site packages. No need for such .pth file. + # NOTE: do not drop this removal until the following issue in upstream cpython is resolved: + # https://github.com/python/cpython/issues/122220 + rm -f ${D}${PYTHON_SITEPACKAGES_DIR}/protobuf-*-nspkg.pth +} 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 7186d3c975..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 ff1155eeb1..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 \ + python3-core \ + python3-fcntl \ + python3-terminal \ + python3-resource \ " BBCLASSEXTEND = "native nativesdk" @@ -30,10 +30,12 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-fcntl \ - ${PYTHON_PN}-terminal \ - ${PYTHON_PN}-resource \ + 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.10.5.bb b/meta-python/recipes-devtools/python/python3-pulsectl_24.8.0.bb index 0b867b83a2..580d41d0cf 100644 --- a/meta-python/recipes-devtools/python/python3-pulsectl_21.10.5.bb +++ b/meta-python/recipes-devtools/python/python3-pulsectl_24.8.0.bb @@ -3,7 +3,7 @@ HOMEPAGE = "https://github.com/mk-fg/python-pulse-control" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://COPYING;md5=f1d10048469ff90123263eb5e214061d" -SRC_URI[sha256sum] = "b347983fb78baab168f4dc4804ab2c59ca5b813bf62f8146dfb5fcb6ab6c8ba2" +SRC_URI[sha256sum] = "b051506d0d73d3cc4357cefd3de17bb859d7ecf004e994b0f7cfa87851bc7156" RDEPENDS:${PN} += " \ libpulse \ diff --git a/meta-python/recipes-devtools/python/python3-pure-eval_0.2.3.bb b/meta-python/recipes-devtools/python/python3-pure-eval_0.2.3.bb new file mode 100644 index 0000000000..f52b235e8f --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pure-eval_0.2.3.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] = "5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42" + +RDEPENDS:${PN} += " \ + python3-datetime \ + python3-numbers \ +" diff --git a/meta-python/recipes-devtools/python/python3-py-cpuinfo/0001-test_cli.py-disable.patch b/meta-python/recipes-devtools/python/python3-py-cpuinfo/0001-test_cli.py-disable.patch new file mode 100644 index 0000000000..e4165d2d66 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-py-cpuinfo/0001-test_cli.py-disable.patch @@ -0,0 +1,32 @@ +From 620cb80b0bb5ec58fe15592f033487a4e1cd3859 Mon Sep 17 00:00:00 2001 +From: Trevor Gamblin <tgamblin@baylibre.com> +Date: Thu, 12 Oct 2023 16:46:53 -0400 +Subject: [PATCH] test_cli.py: disable + +These tests fail if .../site-packages/cpuinfo/cpuinfo.py isn't +executable, but setting it so during do_install doesn't seem to work. +Disable them for now so that the ptests work with the remaining ~150 +successes. + +Upstream-Status: Inappropriate [OE-Specific] + +Signed-off-by: Trevor Gamblin <tgamblin@baylibre.com> +--- + tests/test_cli.py | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/tests/test_cli.py b/tests/test_cli.py +index a6b1985..43c4334 100644 +--- a/tests/test_cli.py ++++ b/tests/test_cli.py +@@ -6,6 +6,7 @@ import helpers + + + ++@unittest.skip("Disable while permissions issues are figured out") + class TestCLI(unittest.TestCase): + def setUp(self): + helpers.backup_data_source(cpuinfo) +-- +2.41.0 + diff --git a/meta-python/recipes-devtools/python/python3-py-cpuinfo/run-ptest b/meta-python/recipes-devtools/python/python3-py-cpuinfo/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-py-cpuinfo/run-ptest +++ b/meta-python/recipes-devtools/python/python3-py-cpuinfo/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-py-cpuinfo_8.0.0.bb b/meta-python/recipes-devtools/python/python3-py-cpuinfo_9.0.0.bb index 6de2f17459..2d59a99b14 100644 --- a/meta-python/recipes-devtools/python/python3-py-cpuinfo_8.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-py-cpuinfo_9.0.0.bb @@ -4,22 +4,32 @@ SUMMARY = "Get CPU info with pure Python 2 & 3" HOMEPAGE = "https://github.com/workhorsy/py-cpuinfo" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=b0b97c022f12b14d9e02de0b283ee9e9" +LIC_FILES_CHKSUM = "file://LICENSE;md5=d2379ecb0d7a8299101b1e4c160cd1f7" -SRC_URI[sha256sum] = "5f269be0e08e33fd959de96b34cd4aeeeacac014dd8305f70eb28d06de2345c5" +SRC_URI[sha256sum] = "3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690" -inherit ptest pypi setuptools3 +inherit ptest pypi python_setuptools_build_meta 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-compile \ python3-pytest \ + python3-unittest-automake-output \ " RDEPENDS:${PN} += "python3-core python3-ctypes python3-datetime python3-json python3-io python3-mmap python3-multiprocessing python3-netclient python3-pickle python3-pprint python3-shell" diff --git a/meta-python/recipes-devtools/python/python3-py-ubjson_0.16.1.bb b/meta-python/recipes-devtools/python/python3-py-ubjson_0.16.1.bb index 222eb1e0e8..0db9d65fd3 100644 --- a/meta-python/recipes-devtools/python/python3-py-ubjson_0.16.1.bb +++ b/meta-python/recipes-devtools/python/python3-py-ubjson_0.16.1.bb @@ -8,7 +8,7 @@ SRC_URI[sha256sum] = "b9bfb8695a1c7e3632e800fb83c943bf67ed45ddd87cd0344851610c69 inherit pypi setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-numbers \ + python3-numbers \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-py7zr_0.22.0.bb b/meta-python/recipes-devtools/python/python3-py7zr_0.22.0.bb new file mode 100644 index 0000000000..c5cf1e8362 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-py7zr_0.22.0.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] = "c6c7aea5913535184003b73938490f9a4d8418598e533f9ca991d3b8e45a139e" + +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-py_1.11.0.bb b/meta-python/recipes-devtools/python/python3-py_1.11.0.bb new file mode 100644 index 0000000000..31d5a377a7 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-py_1.11.0.bb @@ -0,0 +1,14 @@ +SUMMARY = "Library with cross-python path, ini-parsing, io, code, log facilities" +HOMEPAGE = "http://py.readthedocs.io/" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=a6bb0320b04a0a503f12f69fea479de9" + +SRC_URI[sha256sum] = "51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719" + +DEPENDS += "python3-setuptools-scm-native" + +inherit pypi python_setuptools_build_meta + +BBCLASSEXTEND = "native nativesdk" + +RDEPENDS:${PN} += "python3-netclient" diff --git a/meta-python/recipes-devtools/python/python3-pyalsaaudio_0.9.0.bb b/meta-python/recipes-devtools/python/python3-pyalsaaudio_0.11.0.bb index c1e549bcb5..8917c88605 100644 --- a/meta-python/recipes-devtools/python/python3-pyalsaaudio_0.9.0.bb +++ b/meta-python/recipes-devtools/python/python3-pyalsaaudio_0.11.0.bb @@ -1,12 +1,11 @@ SUMMARY = "ALSA bindings" SECTION = "devel/python" -LICENSE = "PSF" +LICENSE = "PSF-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=1a3b161aa0fcec32a0c8907a2219ad9d" inherit pypi setuptools3 -SRC_URI[md5sum] = "48c40424a79c2568676a41643d93f1f7" -SRC_URI[sha256sum] = "3ca069c736c8ad2a3047b5033468d983a2480f94fad4feb0169c056060e01e69" +SRC_URI[sha256sum] = "a78a9dca33524b2c9064b34e21f5ab874272313cf324a9a77592f396a5e0fddc" DEPENDS += "alsa-lib" diff --git a/meta-python/recipes-devtools/python/python3-pyasn1-modules/run-ptest b/meta-python/recipes-devtools/python/python3-pyasn1-modules/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-pyasn1-modules/run-ptest +++ b/meta-python/recipes-devtools/python/python3-pyasn1-modules/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-pyasn1-modules_0.2.8.bb b/meta-python/recipes-devtools/python/python3-pyasn1-modules_0.4.1.bb index d6a2749c24..e8c0f960aa 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.1.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] = "c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c" -inherit pypi ptest setuptools3 +PYPI_PACKAGE = "pyasn1_modules" -RDEPENDS:${PN} = "${PYTHON_PN}-pyasn1" +inherit pypi ptest python_setuptools_build_meta + +RDEPENDS:${PN} = "python3-pyasn1" BBCLASSEXTEND = "native nativesdk" @@ -20,7 +21,8 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-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.38.1.bb b/meta-python/recipes-devtools/python/python3-pyatspi_2.46.1.bb index 8ae9ac996d..2b6a6c2c0e 100644 --- a/meta-python/recipes-devtools/python/python3-pyatspi_2.38.1.bb +++ b/meta-python/recipes-devtools/python/python3-pyatspi_2.46.1.bb @@ -2,20 +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=master" -SRCREV = "6d5f47ee8e8a36140b52bf52fe954a131a0aa5dd" +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/*" + +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 802ca35100..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..6a325dbe8b --- /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 python_setuptools_build_meta + +SRC_URI += "file://0001-Remove-absolute-paths-into-build-machine-system-dirs.patch" + +DEPENDS += "portaudio-v19" + +RDEPENDS:${PN} += "portaudio-v19" diff --git a/meta-python/recipes-devtools/python/python3-pybcj_1.0.2.bb b/meta-python/recipes-devtools/python/python3-pybcj_1.0.2.bb new file mode 100644 index 0000000000..8cb176f2b5 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pybcj_1.0.2.bb @@ -0,0 +1,24 @@ +SUMMARY = "bcj filter library" +HOMEPAGE = "https://codeberg.org/miurahr/pybcj" +LICENSE = "LGPL-2.1-or-later" +SECTION = "devel/python" +LIC_FILES_CHKSUM = "file://LICENSE;md5=4fbd65380cdd255951079008b364516c" + +SRC_URI[sha256sum] = "c7f5bef7f47723c53420e377bc64d2553843bee8bcac5f0ad076ab1524780018" + +inherit pypi python_setuptools_build_meta pypi + +#PROVIDES = "python3-pybcj" + +DEPENDS += " \ + python3-setuptools-scm-native \ + python3-toml-native \ + python3-wheel-native \ +" + +RDEPENDS:${PN} += "\ + python3-email \ + python3-importlib-metadata \ + python3-core \ + python3-compression \ +" diff --git a/meta-python/recipes-devtools/python/python3-pybind11-json_0.2.11.bb b/meta-python/recipes-devtools/python/python3-pybind11-json_0.2.14.bb index e06579a6cc..8211e06dce 100644 --- a/meta-python/recipes-devtools/python/python3-pybind11-json_0.2.11.bb +++ b/meta-python/recipes-devtools/python/python3-pybind11-json_0.2.14.bb @@ -2,7 +2,7 @@ SUMMARY = "Using nlohmann::json with pybind11" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=0e25ff0ec476d06d366439e1120cce98" -SRCREV = "0fbbe3bbb27bd07a5ec7d71cbb1f17eaf4d37702" +SRCREV = "1399451fde59f4d931c72213f209b3e83a07290b" 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 deleted file mode 100644 index 699eb61550..0000000000 --- a/meta-python/recipes-devtools/python/python3-pybind11/0001-Do-not-strip-binaries.patch +++ /dev/null @@ -1,48 +0,0 @@ -From debd676cd94f92a30b3be45f1245aa13d8c398c0 Mon Sep 17 00:00:00 2001 -From: Philip Balister <philip@balister.org> -Date: Wed, 8 Jul 2020 09:41:43 -0400 -Subject: [PATCH] Do not strip binaries. - - * OpenEmbedded strips them after creating debug packages. - -Signed-off-by: Philip Balister <philip@balister.org> -Signed-off-by: Leon Anavi <leon.anavi@konsulko.com> ---- - tools/pybind11NewTools.cmake | 5 ----- - tools/pybind11Tools.cmake | 4 ---- - 2 files changed, 9 deletions(-) - -diff --git a/tools/pybind11NewTools.cmake b/tools/pybind11NewTools.cmake -index 18da8be1..82ebf5e7 100644 ---- a/tools/pybind11NewTools.cmake -+++ b/tools/pybind11NewTools.cmake -@@ -246,11 +246,6 @@ function(pybind11_add_module target_name) - endif() - endif() - -- if(NOT MSVC AND NOT ${CMAKE_BUILD_TYPE} MATCHES Debug|RelWithDebInfo) -- # Strip unnecessary sections of the binary on Linux/macOS -- pybind11_strip(${target_name}) -- endif() -- - if(MSVC) - target_link_libraries(${target_name} PRIVATE pybind11::windows_extras) - endif() -diff --git a/tools/pybind11Tools.cmake b/tools/pybind11Tools.cmake -index 32313539..a7d81012 100644 ---- a/tools/pybind11Tools.cmake -+++ b/tools/pybind11Tools.cmake -@@ -201,10 +201,6 @@ function(pybind11_add_module target_name) - endif() - endif() - -- if(NOT MSVC AND NOT ${CMAKE_BUILD_TYPE} MATCHES Debug|RelWithDebInfo) -- pybind11_strip(${target_name}) -- endif() -- - if(MSVC) - target_link_libraries(${target_name} PRIVATE pybind11::windows_extras) - endif() --- -2.17.1 - diff --git a/meta-python/recipes-devtools/python/python3-pybind11_2.12.0.bb b/meta-python/recipes-devtools/python/python3-pybind11_2.12.0.bb new file mode 100644 index 0000000000..0403e406a4 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pybind11_2.12.0.bb @@ -0,0 +1,33 @@ +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 = "3e9dfa2866941655c56877882565e7577de6fc7b" +SRC_URI = "\ + git://github.com/pybind/pybind11.git;branch=stable;protocol=https \ +" + +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.8.1.bb b/meta-python/recipes-devtools/python/python3-pybind11_2.8.1.bb deleted file mode 100644 index 3c6b2a657d..0000000000 --- a/meta-python/recipes-devtools/python/python3-pybind11_2.8.1.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;branch=master;protocol=https \ - file://0001-Do-not-strip-binaries.patch \ - file://0001-Do-not-check-pointer-size-when-cross-compiling.patch \ -" -SRCREV = "f7b499615e14d70ab098a20deb0cdb3889998a1a" - -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 cc659ea678..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,9 +4,11 @@ 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" @@ -20,5 +22,5 @@ do_configure:prepend() { RDEPENDS:${PN} += "\ bluez5 \ - ${PYTHON_PN}-fcntl \ + python3-fcntl \ " diff --git a/meta-python/recipes-devtools/python/python3-pycares_4.4.0.bb b/meta-python/recipes-devtools/python/python3-pycares_4.4.0.bb new file mode 100644 index 0000000000..13ccaf99f0 --- /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 python_setuptools_build_meta + +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_10.1.0.bb b/meta-python/recipes-devtools/python/python3-pychromecast_10.1.0.bb deleted file mode 100644 index d6f72d5c0a..0000000000 --- a/meta-python/recipes-devtools/python/python3-pychromecast_10.1.0.bb +++ /dev/null @@ -1,18 +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] = "ff6e196bd8d46ce648eb3739f3ab04168e287b167fc82abe1216d8fca21772f7" - -PYPI_PACKAGE = "PyChromecast" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-zeroconf \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-requests \ - ${PYTHON_PN}-protobuf \ -" diff --git a/meta-python/recipes-devtools/python/python3-pychromecast_14.0.1.bb b/meta-python/recipes-devtools/python/python3-pychromecast_14.0.1.bb new file mode 100644 index 0000000000..dee4bf6ebe --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pychromecast_14.0.1.bb @@ -0,0 +1,17 @@ +SUMMARY = "Library for Python 3.6+ to communicate with the Google Chromecast." +HOMEPAGE = "https://github.com/balloob/pychromecast" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=b1dbd4e85f47b389bdadee9c694669f5" + +SRC_URI += "file://0001-Allow-newer-version-of-wheel-and-setuptools.patch" +SRC_URI[sha256sum] = "e16e0a7f9488319191b8b4fa21ca0beb4bf12eeda5c9bf640241188f2bea0a3e" + +PYPI_PACKAGE = "PyChromecast" + +inherit pypi python_setuptools_build_meta + +RDEPENDS:${PN} += "\ + python3-zeroconf (>=0.131.0) \ + python3-protobuf (>=4.25.2) \ + python3-casttube (>=0.2.1) \ +" diff --git a/meta-python/recipes-devtools/python/python3-pycocotools/0001-downgrade-numpy-version-to-1.26.4.patch b/meta-python/recipes-devtools/python/python3-pycocotools/0001-downgrade-numpy-version-to-1.26.4.patch new file mode 100644 index 0000000000..cd3e462ddf --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pycocotools/0001-downgrade-numpy-version-to-1.26.4.patch @@ -0,0 +1,26 @@ +From 7222a8b9b6e05b89116ca14644aa8db79eecd3c6 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Sat, 24 Aug 2024 00:19:23 -0700 +Subject: [PATCH] downgrade numpy version to 1.26.4+ + +We can drop it when OE-core upgrades numpy to 2.x + +Upstream-Status: Inappropriate [OE workaround] +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + pyproject.toml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/pyproject.toml b/pyproject.toml +index 1bfbd91..cbee520 100644 +--- a/pyproject.toml ++++ b/pyproject.toml +@@ -1,7 +1,7 @@ + [build-system] + requires = [ + "cython>=0.27.3", +- "numpy>=2.0.0rc1", ++ "numpy>=1.26.4", + "setuptools>=43.0.0", + "wheel", + ] diff --git a/meta-python/recipes-devtools/python/python3-pycocotools_2.0.2.bb b/meta-python/recipes-devtools/python/python3-pycocotools_2.0.8.bb index d47b7b563e..4d4251316c 100644 --- a/meta-python/recipes-devtools/python/python3-pycocotools_2.0.2.bb +++ b/meta-python/recipes-devtools/python/python3-pycocotools_2.0.8.bb @@ -3,10 +3,15 @@ SUMMARY = "COCO is a large image dataset designed for object detection, segmenta LICENSE = "BSD-2-Clause" LIC_FILES_CHKSUM = "file://pycocotools/coco.py;beginline=45;endline=45;md5=12cb539683cf245df8b6ce782d78f647" -inherit setuptools3 pypi +inherit pypi python_setuptools_build_meta -SRC_URI[md5sum] = "33858f23c8b99ce8116b70c32f6b6dd9" -SRC_URI[sha256sum] = "24717a12799b4471c2e54aa210d642e6cd4028826a1d49fcc2b0e3497e041f1a" +SRC_URI += "file://0001-downgrade-numpy-version-to-1.26.4.patch" + +SRC_URI[sha256sum] = "8f2bcedb786ba26c367a3680f9c4eb5b2ad9dccb2b34eaeb205e0a021e1dfb8d" DEPENDS = "python3-cython-native python3-numpy-native virtual/crypt" RDEPENDS:${PN} = "python3-matplotlib python3-pillow python3-profile" + +do_compile:append() { + sed -i -e "/BEGIN: Cython Metadata/,/END: Cython Metadata/d" ${B}/pycocotools/_mask.c +} diff --git a/meta-python/recipes-devtools/python/python3-pycodestyle_2.8.0.bb b/meta-python/recipes-devtools/python/python3-pycodestyle_2.12.1.bb index 31720e2aab..9572d21f3b 100644 --- a/meta-python/recipes-devtools/python/python3-pycodestyle_2.8.0.bb +++ b/meta-python/recipes-devtools/python/python3-pycodestyle_2.12.1.bb @@ -4,7 +4,7 @@ LICENSE = "MIT" SECTION = "devel/python" LIC_FILES_CHKSUM = "file://LICENSE;md5=a8546d0e77f416fb05a26acd89c8b3bd" -SRC_URI[sha256sum] = "eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f" +SRC_URI[sha256sum] = "6838eae08bbce4f6accd5d5572075c63626a15ee3e6f842df996bf62f6d73521" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-pycparser_2.21.bb b/meta-python/recipes-devtools/python/python3-pycparser_2.21.bb deleted file mode 100644 index 53b7367903..0000000000 --- a/meta-python/recipes-devtools/python/python3-pycparser_2.21.bb +++ /dev/null @@ -1,21 +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=2c28cdeabcb88f5843d934381b4b4fea" - -SRC_URI[sha256sum] = "e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206" - -inherit pypi setuptools3 - -BBCLASSEXTEND = "native nativesdk" - -RDEPENDS:${PN}:class-target += "\ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-ply \ - ${PYTHON_PN}-pprint \ - " - -RSUGGESTS:${PN}:class-target += "\ - 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.44.1.bb b/meta-python/recipes-devtools/python/python3-pycurl_7.45.3.bb index a80fed62de..8dcc2dff18 100644 --- a/meta-python/recipes-devtools/python/python3-pycurl_7.44.1.bb +++ b/meta-python/recipes-devtools/python/python3-pycurl_7.45.3.bb @@ -7,16 +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.1-only | MIT" LIC_FILES_CHKSUM = "file://COPYING-LGPL;md5=4fbd65380cdd255951079008b364516c \ - file://COPYING-MIT;md5=75f131c591546fd1277ca49c9a81ab1b \ + file://COPYING-MIT;md5=be42e1b1e58c8d59c2901fd747bfc55d \ " -SRC_URI[sha256sum] = "5bcef4d988b74b99653602101e17d8401338d596b9234d263c728a0c3df003e8" +SRC_URI[sha256sum] = "8c2471af9079ad798e1645ec0b0d3d4223db687379d17dd36a70637449f81d6b" + +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..531632f32b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pydantic-core-crates.inc @@ -0,0 +1,198 @@ +# Autogenerated with 'bitbake -c update_crates python3-pydantic-core' + +# from Cargo.lock +SRC_URI += " \ + crate://crates.io/ahash/0.8.11 \ + crate://crates.io/aho-corasick/1.1.3 \ + crate://crates.io/autocfg/1.3.0 \ + crate://crates.io/base64/0.22.1 \ + crate://crates.io/bitvec/1.0.1 \ + crate://crates.io/cc/1.0.101 \ + crate://crates.io/cfg-if/1.0.0 \ + crate://crates.io/displaydoc/0.2.5 \ + crate://crates.io/enum_dispatch/0.3.13 \ + crate://crates.io/equivalent/1.0.1 \ + crate://crates.io/form_urlencoded/1.2.1 \ + crate://crates.io/funty/2.0.0 \ + crate://crates.io/getrandom/0.2.15 \ + crate://crates.io/hashbrown/0.14.5 \ + crate://crates.io/heck/0.5.0 \ + crate://crates.io/hex/0.4.3 \ + crate://crates.io/icu_collections/1.5.0 \ + crate://crates.io/icu_locid/1.5.0 \ + crate://crates.io/icu_locid_transform/1.5.0 \ + crate://crates.io/icu_locid_transform_data/1.5.0 \ + crate://crates.io/icu_normalizer/1.5.0 \ + crate://crates.io/icu_normalizer_data/1.5.0 \ + crate://crates.io/icu_properties/1.5.1 \ + crate://crates.io/icu_properties_data/1.5.0 \ + crate://crates.io/icu_provider/1.5.0 \ + crate://crates.io/icu_provider_macros/1.5.0 \ + crate://crates.io/idna/0.5.0 \ + crate://crates.io/idna/1.0.1 \ + crate://crates.io/indexmap/2.2.6 \ + crate://crates.io/indoc/2.0.5 \ + crate://crates.io/itoa/1.0.11 \ + crate://crates.io/jiter/0.5.0 \ + 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/libc/0.2.155 \ + crate://crates.io/litemap/0.7.3 \ + crate://crates.io/memchr/2.7.4 \ + crate://crates.io/memoffset/0.9.1 \ + crate://crates.io/num-bigint/0.4.6 \ + crate://crates.io/num-integer/0.1.46 \ + crate://crates.io/num-traits/0.2.19 \ + crate://crates.io/once_cell/1.19.0 \ + crate://crates.io/percent-encoding/2.3.1 \ + crate://crates.io/portable-atomic/1.6.0 \ + crate://crates.io/proc-macro2/1.0.86 \ + crate://crates.io/pyo3/0.22.2 \ + crate://crates.io/pyo3-build-config/0.22.2 \ + crate://crates.io/pyo3-ffi/0.22.2 \ + crate://crates.io/pyo3-macros/0.22.2 \ + crate://crates.io/pyo3-macros-backend/0.22.2 \ + crate://crates.io/python3-dll-a/0.2.10 \ + crate://crates.io/quote/1.0.36 \ + crate://crates.io/radium/0.7.0 \ + crate://crates.io/regex/1.10.5 \ + crate://crates.io/regex-automata/0.4.7 \ + crate://crates.io/regex-syntax/0.8.4 \ + crate://crates.io/rustversion/1.0.17 \ + crate://crates.io/ryu/1.0.18 \ + crate://crates.io/serde/1.0.204 \ + crate://crates.io/serde_derive/1.0.204 \ + crate://crates.io/serde_json/1.0.121 \ + crate://crates.io/smallvec/1.13.2 \ + crate://crates.io/speedate/0.14.4 \ + crate://crates.io/stable_deref_trait/1.2.0 \ + crate://crates.io/static_assertions/1.1.0 \ + crate://crates.io/strum/0.26.3 \ + crate://crates.io/strum_macros/0.26.4 \ + crate://crates.io/syn/2.0.68 \ + crate://crates.io/synstructure/0.13.1 \ + crate://crates.io/tap/1.0.1 \ + crate://crates.io/target-lexicon/0.12.14 \ + crate://crates.io/tinystr/0.7.6 \ + crate://crates.io/tinyvec/1.6.1 \ + crate://crates.io/tinyvec_macros/0.1.1 \ + crate://crates.io/unicode-bidi/0.3.15 \ + crate://crates.io/unicode-ident/1.0.12 \ + crate://crates.io/unicode-normalization/0.1.23 \ + crate://crates.io/unindent/0.2.3 \ + crate://crates.io/url/2.5.2 \ + crate://crates.io/utf16_iter/1.0.5 \ + crate://crates.io/utf8_iter/1.0.4 \ + crate://crates.io/uuid/1.9.1 \ + crate://crates.io/version_check/0.9.5 \ + crate://crates.io/wasi/0.11.0+wasi-snapshot-preview1 \ + crate://crates.io/write16/1.0.0 \ + crate://crates.io/writeable/0.5.5 \ + crate://crates.io/wyz/0.5.1 \ + crate://crates.io/yoke/0.7.4 \ + crate://crates.io/yoke-derive/0.7.4 \ + crate://crates.io/zerocopy/0.7.34 \ + crate://crates.io/zerocopy-derive/0.7.34 \ + crate://crates.io/zerofrom/0.1.4 \ + crate://crates.io/zerofrom-derive/0.1.4 \ + crate://crates.io/zerovec/0.10.4 \ + crate://crates.io/zerovec-derive/0.10.3 \ +" + +SRC_URI[ahash-0.8.11.sha256sum] = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +SRC_URI[aho-corasick-1.1.3.sha256sum] = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +SRC_URI[autocfg-1.3.0.sha256sum] = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +SRC_URI[base64-0.22.1.sha256sum] = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +SRC_URI[bitvec-1.0.1.sha256sum] = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +SRC_URI[cc-1.0.101.sha256sum] = "ac367972e516d45567c7eafc73d24e1c193dcf200a8d94e9db7b3d38b349572d" +SRC_URI[cfg-if-1.0.0.sha256sum] = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +SRC_URI[displaydoc-0.2.5.sha256sum] = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +SRC_URI[enum_dispatch-0.3.13.sha256sum] = "aa18ce2bc66555b3218614519ac839ddb759a7d6720732f979ef8d13be147ecd" +SRC_URI[equivalent-1.0.1.sha256sum] = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +SRC_URI[form_urlencoded-1.2.1.sha256sum] = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +SRC_URI[funty-2.0.0.sha256sum] = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" +SRC_URI[getrandom-0.2.15.sha256sum] = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +SRC_URI[hashbrown-0.14.5.sha256sum] = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +SRC_URI[heck-0.5.0.sha256sum] = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +SRC_URI[hex-0.4.3.sha256sum] = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +SRC_URI[icu_collections-1.5.0.sha256sum] = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +SRC_URI[icu_locid-1.5.0.sha256sum] = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +SRC_URI[icu_locid_transform-1.5.0.sha256sum] = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +SRC_URI[icu_locid_transform_data-1.5.0.sha256sum] = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" +SRC_URI[icu_normalizer-1.5.0.sha256sum] = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +SRC_URI[icu_normalizer_data-1.5.0.sha256sum] = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +SRC_URI[icu_properties-1.5.1.sha256sum] = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +SRC_URI[icu_properties_data-1.5.0.sha256sum] = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +SRC_URI[icu_provider-1.5.0.sha256sum] = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +SRC_URI[icu_provider_macros-1.5.0.sha256sum] = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +SRC_URI[idna-0.5.0.sha256sum] = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +SRC_URI[idna-1.0.1.sha256sum] = "44a986806a1cc899952ba462bc1f28afbfd5850ab6cb030ccb20dd02cc527a24" +SRC_URI[indexmap-2.2.6.sha256sum] = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +SRC_URI[indoc-2.0.5.sha256sum] = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" +SRC_URI[itoa-1.0.11.sha256sum] = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +SRC_URI[jiter-0.5.0.sha256sum] = "02e23549143ef50eddffd46ba8cd0229b0a4500aef7518cf2eb0f41c9a09d22b" +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[libc-0.2.155.sha256sum] = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +SRC_URI[litemap-0.7.3.sha256sum] = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" +SRC_URI[memchr-2.7.4.sha256sum] = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +SRC_URI[memoffset-0.9.1.sha256sum] = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +SRC_URI[num-bigint-0.4.6.sha256sum] = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +SRC_URI[num-integer-0.1.46.sha256sum] = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +SRC_URI[num-traits-0.2.19.sha256sum] = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +SRC_URI[once_cell-1.19.0.sha256sum] = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +SRC_URI[percent-encoding-2.3.1.sha256sum] = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +SRC_URI[portable-atomic-1.6.0.sha256sum] = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" +SRC_URI[proc-macro2-1.0.86.sha256sum] = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +SRC_URI[pyo3-0.22.2.sha256sum] = "831e8e819a138c36e212f3af3fd9eeffed6bf1510a805af35b0edee5ffa59433" +SRC_URI[pyo3-build-config-0.22.2.sha256sum] = "1e8730e591b14492a8945cdff32f089250b05f5accecf74aeddf9e8272ce1fa8" +SRC_URI[pyo3-ffi-0.22.2.sha256sum] = "5e97e919d2df92eb88ca80a037969f44e5e70356559654962cbb3316d00300c6" +SRC_URI[pyo3-macros-0.22.2.sha256sum] = "eb57983022ad41f9e683a599f2fd13c3664d7063a3ac5714cae4b7bee7d3f206" +SRC_URI[pyo3-macros-backend-0.22.2.sha256sum] = "ec480c0c51ddec81019531705acac51bcdbeae563557c982aa8263bb96880372" +SRC_URI[python3-dll-a-0.2.10.sha256sum] = "bd0b78171a90d808b319acfad166c4790d9e9759bbc14ac8273fe133673dd41b" +SRC_URI[quote-1.0.36.sha256sum] = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +SRC_URI[radium-0.7.0.sha256sum] = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +SRC_URI[regex-1.10.5.sha256sum] = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +SRC_URI[regex-automata-0.4.7.sha256sum] = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +SRC_URI[regex-syntax-0.8.4.sha256sum] = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +SRC_URI[rustversion-1.0.17.sha256sum] = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +SRC_URI[ryu-1.0.18.sha256sum] = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +SRC_URI[serde-1.0.204.sha256sum] = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" +SRC_URI[serde_derive-1.0.204.sha256sum] = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" +SRC_URI[serde_json-1.0.121.sha256sum] = "4ab380d7d9f22ef3f21ad3e6c1ebe8e4fc7a2000ccba2e4d71fc96f15b2cb609" +SRC_URI[smallvec-1.13.2.sha256sum] = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +SRC_URI[speedate-0.14.4.sha256sum] = "08a20480dbd4c693f0b0f3210f2cee5bfa21a176c1fa4df0e65cc0474e7fa557" +SRC_URI[stable_deref_trait-1.2.0.sha256sum] = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +SRC_URI[static_assertions-1.1.0.sha256sum] = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +SRC_URI[strum-0.26.3.sha256sum] = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +SRC_URI[strum_macros-0.26.4.sha256sum] = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +SRC_URI[syn-2.0.68.sha256sum] = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" +SRC_URI[synstructure-0.13.1.sha256sum] = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +SRC_URI[tap-1.0.1.sha256sum] = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +SRC_URI[target-lexicon-0.12.14.sha256sum] = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" +SRC_URI[tinystr-0.7.6.sha256sum] = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +SRC_URI[tinyvec-1.6.1.sha256sum] = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" +SRC_URI[tinyvec_macros-0.1.1.sha256sum] = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +SRC_URI[unicode-bidi-0.3.15.sha256sum] = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +SRC_URI[unicode-ident-1.0.12.sha256sum] = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +SRC_URI[unicode-normalization-0.1.23.sha256sum] = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +SRC_URI[unindent-0.2.3.sha256sum] = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce" +SRC_URI[url-2.5.2.sha256sum] = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +SRC_URI[utf16_iter-1.0.5.sha256sum] = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" +SRC_URI[utf8_iter-1.0.4.sha256sum] = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +SRC_URI[uuid-1.9.1.sha256sum] = "5de17fd2f7da591098415cff336e12965a28061ddace43b59cb3c430179c9439" +SRC_URI[version_check-0.9.5.sha256sum] = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +SRC_URI[wasi-0.11.0+wasi-snapshot-preview1.sha256sum] = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +SRC_URI[write16-1.0.0.sha256sum] = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" +SRC_URI[writeable-0.5.5.sha256sum] = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +SRC_URI[wyz-0.5.1.sha256sum] = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +SRC_URI[yoke-0.7.4.sha256sum] = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +SRC_URI[yoke-derive-0.7.4.sha256sum] = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +SRC_URI[zerocopy-0.7.34.sha256sum] = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" +SRC_URI[zerocopy-derive-0.7.34.sha256sum] = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" +SRC_URI[zerofrom-0.1.4.sha256sum] = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +SRC_URI[zerofrom-derive-0.1.4.sha256sum] = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +SRC_URI[zerovec-0.10.4.sha256sum] = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +SRC_URI[zerovec-derive-0.10.3.sha256sum] = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" diff --git a/meta-python/recipes-devtools/python/python3-pydantic-core/0001-dont-embed-RUSTFLAGS-in-final-binary-1396.patch b/meta-python/recipes-devtools/python/python3-pydantic-core/0001-dont-embed-RUSTFLAGS-in-final-binary-1396.patch new file mode 100644 index 0000000000..5d732d5bee --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pydantic-core/0001-dont-embed-RUSTFLAGS-in-final-binary-1396.patch @@ -0,0 +1,58 @@ +From e07c41b3bad75948201a2201387225694c2fb501 Mon Sep 17 00:00:00 2001 +From: Boxy <rust@boxyuwu.dev> +Date: Wed, 7 Aug 2024 17:11:02 +0100 +Subject: [PATCH] dont embed `RUSTFLAGS` in final binary (#1396) + +Upstream-Status: Backport [https://github.com/pydantic/pydantic-core/pull/1396] + +See discussion upstream in: +https://github.com/pydantic/pydantic-core/issues/1365 + +Backport fix from: +https://github.com/pydantic/pydantic-core/commit/e07c41b3bad75948201a2201387225694c2fb501 + +Signed-off-by: Tim Orling <tim.orling@konsulko.com> +--- + build.rs | 9 +++++++++ + src/lib.rs | 5 ++++- + 2 files changed, 13 insertions(+), 1 deletion(-) + +diff --git a/build.rs b/build.rs +index d1093c74..f8f66901 100644 +--- a/build.rs ++++ b/build.rs +@@ -36,6 +36,15 @@ fn main() { + println!("cargo:rustc-cfg=has_coverage_attribute"); + } + println!("cargo:rustc-check-cfg=cfg(has_coverage_attribute)"); ++ ++ if std::env::var("RUSTFLAGS") ++ .unwrap_or_default() ++ .contains("-Cprofile-use=") ++ { ++ println!("cargo:rustc-cfg=specified_profile_use"); ++ } ++ println!("cargo:rustc-check-cfg=cfg(specified_profile_use)"); ++ + generate_self_schema(); + println!("cargo:rustc-env=PROFILE={}", std::env::var("PROFILE").unwrap()); + } +diff --git a/src/lib.rs b/src/lib.rs +index eb598424..eb486da6 100644 +--- a/src/lib.rs ++++ b/src/lib.rs +@@ -98,7 +98,10 @@ pub fn build_info() -> String { + format!( + "profile={} pgo={}", + env!("PROFILE"), +- option_env!("RUSTFLAGS").unwrap_or("").contains("-Cprofile-use="), ++ // We use a `cfg!` here not `env!`/`option_env!` as those would ++ // embed `RUSTFLAGS` into the generated binary which causes problems ++ // with reproducable builds. ++ cfg!(specified_profile_use), + ) + } + +-- +2.46.0 + 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.21.0.bb b/meta-python/recipes-devtools/python/python3-pydantic-core_2.21.0.bb new file mode 100644 index 0000000000..b24e141f60 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pydantic-core_2.21.0.bb @@ -0,0 +1,51 @@ +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" + +require ${BPN}-crates.inc + +SRC_URI += "file://run-ptest" +SRC_URI += "file://0001-dont-embed-RUSTFLAGS-in-final-binary-1396.patch" + +SRC_URI[sha256sum] = "79c747f9916e5b6cb588dfd994d9ac15a93e43eb07467d9e6f24d892c176bbf5" + +DEPENDS = "python3-maturin-native python3-typing-extensions" + +inherit pypi cargo-update-recipe-crates python_maturin + +PYPI_PACKAGE = "pydantic_core" + +RDEPENDS:${PN} += " \ + python3-compression \ + python3-typing-extensions \ +" + +INSANE_SKIP:${PN} = "already-stripped" +INSANE_SKIP:${PN} += "buildpaths" + +# python3-misc is for Lib/timeit.py which is not split out elsewhere +inherit ptest +RDEPENDS:${PN}-ptest += "\ + python3-dateutil \ + python3-dirty-equals \ + python3-hypothesis \ + python3-misc \ + python3-pytest \ + python3-pytest-mock \ + python3-pytest-timeout \ + python3-pytest-benchmark \ + python3-tzdata \ + python3-unittest-automake-output \ + python3-zoneinfo \ +" + +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.8.2.bb b/meta-python/recipes-devtools/python/python3-pydantic_2.8.2.bb new file mode 100644 index 0000000000..de610d7815 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pydantic_2.8.2.bb @@ -0,0 +1,59 @@ +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] = "6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a" + +DEPENDS += "python3-hatch-fancy-pypi-readme-native" + +RECIPE_NO_UPDATE_REASON = "Must be updated in sync with python3-pydantic-core." + +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-email-validator \ + python3-pydoc \ + python3-pytest \ + python3-pytest-mock \ + python3-rich \ + python3-unittest-automake-output \ + python3-unixadmin \ +" + +do_install_ptest() { + cp -rf ${S}/tests/ ${D}${PTEST_PATH}/ + # Requires 'ruff' (python3-ruff) which we cannot build + # until we have Rust 1.71+ in oe-core + rm -f ${D}${PTEST_PATH}/tests/test_docs.py + # We are not trying to support mypy + rm -f ${D}${PTEST_PATH}/tests/test_mypy.py + # We are not trying to run benchmarks + rm -rf ${D}${PTEST_PATH}/tests/benchmarks + sed -i -e "/--automake/ s/$/ -k 'not test_config_validation_error_cause and not test_dataclass_config_validate_default and not test_annotated_validator_nested and not test_use_bare and not test_use_no_fields and not test_validator_bad_fields_throws_configerror and not test_assert_raises_validation_error and not test_model_config_validate_default'/" ${D}${PTEST_PATH}/run-ptest +} diff --git a/meta-python/recipes-devtools/python/python3-pydbus-manager_git.bb b/meta-python/recipes-devtools/python/python3-pydbus-manager_git.bb deleted file mode 100644 index 796f7219ac..0000000000 --- a/meta-python/recipes-devtools/python/python3-pydbus-manager_git.bb +++ /dev/null @@ -1,15 +0,0 @@ -SUMMARY = "DBus.ObjectManager implementation for pydbus" -AUTHOR = "Sébastien Corne" - -LICENSE = "WTFPL" -LIC_FILES_CHKSUM = "file://LICENSE;md5=0fd5bb1dae91ba145745db55870be6a7" - -inherit setuptools3 - -SRC_URI = "git://github.com/seebz/pydbus-manager.git;branch=master;protocol=https" -SRCREV = "6b576b969cbda50521dca62a7df929167207f9fc" -PV = "git${SRCPV}" - -S = "${WORKDIR}/git" - -RDEPENDS:${PN} += "python3-pydbus" diff --git a/meta-python/recipes-devtools/python/python3-pydbus/0001-Support-asynchronous-calls-58.patch b/meta-python/recipes-devtools/python/python3-pydbus/0001-Support-asynchronous-calls-58.patch deleted file mode 100644 index c5cb9a8780..0000000000 --- a/meta-python/recipes-devtools/python/python3-pydbus/0001-Support-asynchronous-calls-58.patch +++ /dev/null @@ -1,93 +0,0 @@ -From 39a7d79ee6c548902fbac8b95c934af7e4c69260 Mon Sep 17 00:00:00 2001 -From: Vendula Poncova <vponcova@redhat.com> -Date: Thu, 2 Aug 2018 15:30:45 +0800 -Subject: [PATCH 1/2] Support asynchronous calls (#58) - -Added support for asynchronous calls of methods. A method is called -synchronously unless its callback parameter is specified. A callback -is a function f(*args, returned=None, error=None), where args is -callback_args specified in the method call, returned is a return -value of the method and error is an exception raised by the method. - -Example of an asynchronous call: - -def func(x, y, returned=None, error=None): - pass - -proxy.Method(a, b, callback=func, callback_args=(x, y)) - -Upstream-Status: Cherry-pick [https://src.fedoraproject.org/cgit/rpms/python-pydbus.git/] - -Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> ---- - pydbus/proxy_method.py | 44 ++++++++++++++++++++++++++++++++++++++------ - 1 file changed, 38 insertions(+), 6 deletions(-) - -diff --git a/pydbus/proxy_method.py b/pydbus/proxy_method.py -index 8798edd..4ea4304 100644 ---- a/pydbus/proxy_method.py -+++ b/pydbus/proxy_method.py -@@ -65,15 +65,34 @@ class ProxyMethod(object): - - # Python 2 sux - for kwarg in kwargs: -- if kwarg not in ("timeout",): -+ if kwarg not in ("timeout", "callback", "callback_args"): - raise TypeError(self.__qualname__ + " got an unexpected keyword argument '{}'".format(kwarg)) - timeout = kwargs.get("timeout", None) -+ callback = kwargs.get("callback", None) -+ callback_args = kwargs.get("callback_args", tuple()) -+ -+ call_args = ( -+ instance._bus_name, -+ instance._path, -+ self._iface_name, -+ self.__name__, -+ GLib.Variant(self._sinargs, args), -+ GLib.VariantType.new(self._soutargs), -+ 0, -+ timeout_to_glib(timeout), -+ None -+ ) -+ -+ if callback: -+ call_args += (self._finish_async_call, (callback, callback_args)) -+ instance._bus.con.call(*call_args) -+ return None -+ else: -+ ret = instance._bus.con.call_sync(*call_args) -+ return self._unpack_return(ret) - -- ret = instance._bus.con.call_sync( -- instance._bus_name, instance._path, -- self._iface_name, self.__name__, GLib.Variant(self._sinargs, args), GLib.VariantType.new(self._soutargs), -- 0, timeout_to_glib(timeout), None).unpack() -- -+ def _unpack_return(self, values): -+ ret = values.unpack() - if len(self._outargs) == 0: - return None - elif len(self._outargs) == 1: -@@ -81,6 +100,19 @@ class ProxyMethod(object): - else: - return ret - -+ def _finish_async_call(self, source, result, user_data): -+ error = None -+ return_args = None -+ -+ try: -+ ret = source.call_finish(result) -+ return_args = self._unpack_return(ret) -+ except Exception as err: -+ error = err -+ -+ callback, callback_args = user_data -+ callback(*callback_args, returned=return_args, error=error) -+ - def __get__(self, instance, owner): - if instance is None: - return self --- -2.7.4 - diff --git a/meta-python/recipes-devtools/python/python3-pydbus/0001-make-direction-attribute-conforming-to-introspect.dt.patch b/meta-python/recipes-devtools/python/python3-pydbus/0001-make-direction-attribute-conforming-to-introspect.dt.patch new file mode 100644 index 0000000000..1bd17986e6 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pydbus/0001-make-direction-attribute-conforming-to-introspect.dt.patch @@ -0,0 +1,40 @@ +From 5fe65a35e0e7106347639f0258206fadb451c439 Mon Sep 17 00:00:00 2001 +From: Hiroaki KAWAI <hiroaki.kawai@gmail.com> +Date: Wed, 1 Feb 2017 18:00:33 +0900 +Subject: [PATCH 1/3] make direction attribute conforming to introspect.dtd + +direction attribute defaults to "in" as +in the DTD(*1), direction attribute is defined as following: + +``` +<!ATTRLIST arg direction (in|out) "in"> +``` + +*1) http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd + +Adapted from Fedora [https://src.fedoraproject.org/cgit/rpms/python-pydbus.git/] + +Upstream-Status: Inactive-Upstream (Last release 12/18/2016; Last commit 05/6/2018) + +Signed-off-by: Derek Straka <derek@asterius.io> +--- + pydbus/proxy_method.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/pydbus/proxy_method.py b/pydbus/proxy_method.py +index 8798edd..3e6e6ee 100644 +--- a/pydbus/proxy_method.py ++++ b/pydbus/proxy_method.py +@@ -33,8 +33,8 @@ class ProxyMethod(object): + self.__name__ = method.attrib["name"] + self.__qualname__ = self._iface_name + "." + self.__name__ + +- self._inargs = [(arg.attrib.get("name", ""), arg.attrib["type"]) for arg in method if arg.tag == "arg" and arg.attrib["direction"] == "in"] +- self._outargs = [arg.attrib["type"] for arg in method if arg.tag == "arg" and arg.attrib["direction"] == "out"] ++ self._inargs = [(arg.attrib.get("name", ""), arg.attrib["type"]) for arg in method if arg.tag == "arg" and arg.attrib.get("direction", "in") == "in"] ++ self._outargs = [arg.attrib["type"] for arg in method if arg.tag == "arg" and arg.attrib.get("direction", "in") == "out"] + self._sinargs = "(" + "".join(x[1] for x in self._inargs) + ")" + self._soutargs = "(" + "".join(self._outargs) + ")" + +-- +2.13.5 diff --git a/meta-python/recipes-devtools/python/python3-pydbus/0002-Support-asynchronous-calls-58.patch b/meta-python/recipes-devtools/python/python3-pydbus/0002-Support-asynchronous-calls-58.patch new file mode 100644 index 0000000000..b3c57edade --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pydbus/0002-Support-asynchronous-calls-58.patch @@ -0,0 +1,206 @@ +From 31d6dd7893a5e1bb9eb14bfcee861a5b62f64960 Mon Sep 17 00:00:00 2001 +From: Vendula Poncova <vponcova@redhat.com> +Date: Thu, 27 Jul 2017 18:41:29 +0200 +Subject: [PATCH 2/3] Support asynchronous calls (#58) + +Added support for asynchronous calls of methods. A method is called +synchronously unless its callback parameter is specified. A callback +is a function f(*args, returned=None, error=None), where args is +callback_args specified in the method call, returned is a return +value of the method and error is an exception raised by the method. + +Example of an asynchronous call: + +def func(x, y, returned=None, error=None): + pass + +proxy.Method(a, b, callback=func, callback_args=(x, y)) + +Adapted from Fedora [https://src.fedoraproject.org/cgit/rpms/python-pydbus.git/] + +Upstream-Status: Inactive-Upstream (Last release 12/18/2016; Last commit 05/6/2018) + +Signed-off-by: Derek Straka <derek@asterius.io> +--- + doc/tutorial.rst | 11 ++++++++- + pydbus/proxy_method.py | 44 ++++++++++++++++++++++++++++++----- + tests/publish_async.py | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++ + tests/run.sh | 1 + + 4 files changed, 112 insertions(+), 7 deletions(-) + create mode 100644 tests/publish_async.py + +diff --git a/doc/tutorial.rst b/doc/tutorial.rst +index 7474de3..b8479cf 100644 +--- a/doc/tutorial.rst ++++ b/doc/tutorial.rst +@@ -84,7 +84,8 @@ All objects have methods, properties and signals. + Setting up an event loop + ======================== + +-To handle signals emitted by exported objects, or to export your own objects, you need to setup an event loop. ++To handle signals emitted by exported objects, to asynchronously call methods ++or to export your own objects, you need to setup an event loop. + + The only main loop supported by ``pydbus`` is GLib.MainLoop. + +@@ -156,6 +157,14 @@ To call a method:: + + dev.Disconnect() + ++To asynchronously call a method:: ++ ++ def print_result(returned=None, error=None): ++ print(returned, error) ++ ++ dev.GetAppliedConnection(0, callback=print_result) ++ loop.run() ++ + To read a property:: + + print(dev.Autoconnect) +diff --git a/pydbus/proxy_method.py b/pydbus/proxy_method.py +index 3e6e6ee..442fe07 100644 +--- a/pydbus/proxy_method.py ++++ b/pydbus/proxy_method.py +@@ -65,15 +65,34 @@ class ProxyMethod(object): + + # Python 2 sux + for kwarg in kwargs: +- if kwarg not in ("timeout",): ++ if kwarg not in ("timeout", "callback", "callback_args"): + raise TypeError(self.__qualname__ + " got an unexpected keyword argument '{}'".format(kwarg)) + timeout = kwargs.get("timeout", None) ++ callback = kwargs.get("callback", None) ++ callback_args = kwargs.get("callback_args", tuple()) ++ ++ call_args = ( ++ instance._bus_name, ++ instance._path, ++ self._iface_name, ++ self.__name__, ++ GLib.Variant(self._sinargs, args), ++ GLib.VariantType.new(self._soutargs), ++ 0, ++ timeout_to_glib(timeout), ++ None ++ ) ++ ++ if callback: ++ call_args += (self._finish_async_call, (callback, callback_args)) ++ instance._bus.con.call(*call_args) ++ return None ++ else: ++ ret = instance._bus.con.call_sync(*call_args) ++ return self._unpack_return(ret) + +- ret = instance._bus.con.call_sync( +- instance._bus_name, instance._path, +- self._iface_name, self.__name__, GLib.Variant(self._sinargs, args), GLib.VariantType.new(self._soutargs), +- 0, timeout_to_glib(timeout), None).unpack() +- ++ def _unpack_return(self, values): ++ ret = values.unpack() + if len(self._outargs) == 0: + return None + elif len(self._outargs) == 1: +@@ -81,6 +100,19 @@ class ProxyMethod(object): + else: + return ret + ++ def _finish_async_call(self, source, result, user_data): ++ error = None ++ return_args = None ++ ++ try: ++ ret = source.call_finish(result) ++ return_args = self._unpack_return(ret) ++ except Exception as err: ++ error = err ++ ++ callback, callback_args = user_data ++ callback(*callback_args, returned=return_args, error=error) ++ + def __get__(self, instance, owner): + if instance is None: + return self +diff --git a/tests/publish_async.py b/tests/publish_async.py +new file mode 100644 +index 0000000..3f79b62 +--- /dev/null ++++ b/tests/publish_async.py +@@ -0,0 +1,63 @@ ++from pydbus import SessionBus ++from gi.repository import GLib ++from threading import Thread ++import sys ++ ++done = 0 ++loop = GLib.MainLoop() ++ ++class TestObject(object): ++ ''' ++<node> ++ <interface name='net.lew21.pydbus.tests.publish_async'> ++ <method name='HelloWorld'> ++ <arg type='i' name='x' direction='in'/> ++ <arg type='s' name='response' direction='out'/> ++ </method> ++ </interface> ++</node> ++ ''' ++ def __init__(self, id): ++ self.id = id ++ ++ def HelloWorld(self, x): ++ res = self.id + ": " + str(x) ++ print(res) ++ return res ++ ++bus = SessionBus() ++ ++with bus.publish("net.lew21.pydbus.tests.publish_async", TestObject("Obj")): ++ remote = bus.get("net.lew21.pydbus.tests.publish_async") ++ ++ def callback(x, returned=None, error=None): ++ print("asyn: " + returned) ++ assert (returned is not None) ++ assert(error is None) ++ assert(x == int(returned.split()[1])) ++ ++ global done ++ done += 1 ++ if done == 3: ++ loop.quit() ++ ++ def t1_func(): ++ remote.HelloWorld(1, callback=callback, callback_args=(1,)) ++ remote.HelloWorld(2, callback=callback, callback_args=(2,)) ++ print("sync: " + remote.HelloWorld(3)) ++ remote.HelloWorld(4, callback=callback, callback_args=(4,)) ++ ++ t1 = Thread(None, t1_func) ++ t1.daemon = True ++ ++ def handle_timeout(): ++ print("ERROR: Timeout.") ++ sys.exit(1) ++ ++ GLib.timeout_add_seconds(2, handle_timeout) ++ ++ t1.start() ++ ++ loop.run() ++ ++ t1.join() +diff --git a/tests/run.sh b/tests/run.sh +index 8d93644..271c58a 100755 +--- a/tests/run.sh ++++ b/tests/run.sh +@@ -15,4 +15,5 @@ then + "$PYTHON" $TESTS_DIR/publish.py + "$PYTHON" $TESTS_DIR/publish_properties.py + "$PYTHON" $TESTS_DIR/publish_multiface.py ++ "$PYTHON" $TESTS_DIR/publish_async.py + fi +-- +2.13.5 diff --git a/meta-python/recipes-devtools/python/python3-pydbus/0002-Support-transformation-between-D-Bus-errors-and-exce.patch b/meta-python/recipes-devtools/python/python3-pydbus/0002-Support-transformation-between-D-Bus-errors-and-exce.patch deleted file mode 100644 index f5c0390c54..0000000000 --- a/meta-python/recipes-devtools/python/python3-pydbus/0002-Support-transformation-between-D-Bus-errors-and-exce.patch +++ /dev/null @@ -1,203 +0,0 @@ -From 69968dec867053e38de0b91d76ac41d5a5735e36 Mon Sep 17 00:00:00 2001 -From: Vendula Poncova <vponcova@redhat.com> -Date: Thu, 2 Aug 2018 15:31:56 +0800 -Subject: [PATCH 2/2] Support transformation between D-Bus errors and - exceptions. - -Exceptions can be registered with decorators, raised in a remote -method and recreated after return from the remote call. - -Upstream-Status: Cherry-pick [https://src.fedoraproject.org/cgit/rpms/python-pydbus.git/] - -Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> ---- - pydbus/error.py | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++ - pydbus/proxy_method.py | 18 ++++++++-- - pydbus/registration.py | 16 ++++++--- - 3 files changed, 123 insertions(+), 8 deletions(-) - create mode 100644 pydbus/error.py - -diff --git a/pydbus/error.py b/pydbus/error.py -new file mode 100644 -index 0000000..aaa3510 ---- /dev/null -+++ b/pydbus/error.py -@@ -0,0 +1,97 @@ -+from gi.repository import GLib, Gio -+ -+ -+def register_error(name, domain, code): -+ """Register and map decorated exception class to a DBus error.""" -+ def decorated(cls): -+ error_registration.register_error(cls, name, domain, code) -+ return cls -+ -+ return decorated -+ -+ -+def map_error(error_name): -+ """Map decorated exception class to a DBus error.""" -+ def decorated(cls): -+ error_registration.map_error(cls, error_name) -+ return cls -+ -+ return decorated -+ -+ -+def map_by_default(cls): -+ """Map decorated exception class to all unknown DBus errors.""" -+ error_registration.map_by_default(cls) -+ return cls -+ -+ -+class ErrorRegistration(object): -+ """Class for mapping exceptions to DBus errors.""" -+ -+ _default = None -+ _map = dict() -+ _reversed_map = dict() -+ -+ def map_by_default(self, exception_cls): -+ """Set the exception class as a default.""" -+ self._default = exception_cls -+ -+ def map_error(self, exception_cls, name): -+ """Map the exception class to a DBus name.""" -+ self._map[name] = exception_cls -+ self._reversed_map[exception_cls] = name -+ -+ def register_error(self, exception_cls, name, domain, code): -+ """Map and register the exception class to a DBus name.""" -+ self.map_error(exception_cls, name) -+ return Gio.DBusError.register_error(domain, code, name) -+ -+ def is_registered_exception(self, obj): -+ """Is the exception registered?""" -+ return obj.__class__ in self._reversed_map -+ -+ def get_dbus_name(self, obj): -+ """Get the DBus name of the exception.""" -+ return self._reversed_map.get(obj.__class__) -+ -+ def get_exception_class(self, name): -+ """Get the exception class mapped to the DBus name.""" -+ return self._map.get(name, self._default) -+ -+ def transform_message(self, name, message): -+ """Transform the message of the exception.""" -+ prefix = "{}:{}: ".format("GDBus.Error", name) -+ -+ if message.startswith(prefix): -+ return message[len(prefix):] -+ -+ return message -+ -+ def transform_exception(self, e): -+ """Transform the remote error to the exception.""" -+ if not isinstance(e, GLib.Error): -+ return e -+ -+ if not Gio.DBusError.is_remote_error(e): -+ return e -+ -+ # Get DBus name of the error. -+ name = Gio.DBusError.get_remote_error(e) -+ # Get the exception class. -+ exception_cls = self.get_exception_class(name) -+ -+ # Return the original exception. -+ if not exception_cls: -+ return e -+ -+ # Return new exception. -+ message = self.transform_message(name, e.message) -+ exception = exception_cls(message) -+ exception.dbus_name = name -+ exception.dbus_domain = e.domain -+ exception.dbus_code = e.code -+ return exception -+ -+ -+# Default error registration. -+error_registration = ErrorRegistration() -diff --git a/pydbus/proxy_method.py b/pydbus/proxy_method.py -index 4ea4304..e9496f5 100644 ---- a/pydbus/proxy_method.py -+++ b/pydbus/proxy_method.py -@@ -2,6 +2,7 @@ from gi.repository import GLib - from .generic import bound_method - from .identifier import filter_identifier - from .timeout import timeout_to_glib -+from .error import error_registration - - try: - from inspect import Signature, Parameter -@@ -87,9 +88,20 @@ class ProxyMethod(object): - call_args += (self._finish_async_call, (callback, callback_args)) - instance._bus.con.call(*call_args) - return None -+ - else: -- ret = instance._bus.con.call_sync(*call_args) -- return self._unpack_return(ret) -+ result = None -+ error = None -+ -+ try: -+ result = instance._bus.con.call_sync(*call_args) -+ except Exception as e: -+ error = error_registration.transform_exception(e) -+ -+ if error: -+ raise error -+ -+ return self._unpack_return(result) - - def _unpack_return(self, values): - ret = values.unpack() -@@ -108,7 +120,7 @@ class ProxyMethod(object): - ret = source.call_finish(result) - return_args = self._unpack_return(ret) - except Exception as err: -- error = err -+ error = error_registration.transform_exception(err) - - callback, callback_args = user_data - callback(*callback_args, returned=return_args, error=error) -diff --git a/pydbus/registration.py b/pydbus/registration.py -index f531539..1d2cbcb 100644 ---- a/pydbus/registration.py -+++ b/pydbus/registration.py -@@ -5,6 +5,7 @@ from . import generic - from .exitable import ExitableWithAliases - from functools import partial - from .method_call_context import MethodCallContext -+from .error import error_registration - import logging - - try: -@@ -91,11 +92,16 @@ class ObjectWrapper(ExitableWithAliases("unwrap")): - logger = logging.getLogger(__name__) - logger.exception("Exception while handling %s.%s()", interface_name, method_name) - -- #TODO Think of a better way to translate Python exception types to DBus error types. -- e_type = type(e).__name__ -- if not "." in e_type: -- e_type = "unknown." + e_type -- invocation.return_dbus_error(e_type, str(e)) -+ if error_registration.is_registered_exception(e): -+ name = error_registration.get_dbus_name(e) -+ invocation.return_dbus_error(name, str(e)) -+ else: -+ logger.info("name is not registered") -+ e_type = type(e).__name__ -+ if not "." in e_type: -+ e_type = "unknown." + e_type -+ -+ invocation.return_dbus_error(e_type, str(e)) - - def Get(self, interface_name, property_name): - type = self.readable_properties[interface_name + "." + property_name] --- -2.7.4 - diff --git a/meta-python/recipes-devtools/python/python3-pydbus/0003-Support-transformation-between-D-Bus-errors-and-exce.patch b/meta-python/recipes-devtools/python/python3-pydbus/0003-Support-transformation-between-D-Bus-errors-and-exce.patch new file mode 100644 index 0000000000..a1b8a6c38c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pydbus/0003-Support-transformation-between-D-Bus-errors-and-exce.patch @@ -0,0 +1,495 @@ +From 773858e1afd21cdf3ceef2cd35509f0b4882bf16 Mon Sep 17 00:00:00 2001 +From: Vendula Poncova <vponcova@redhat.com> +Date: Tue, 1 Aug 2017 16:54:24 +0200 +Subject: [PATCH 3/3] Support transformation between D-Bus errors and + exceptions. + +Exceptions can be registered with decorators, raised in a remote +method and recreated after return from the remote call. + +Adapted from Fedora [https://src.fedoraproject.org/cgit/rpms/python-pydbus.git/] + +Upstream-Status: Inactive-Upstream (Last release 12/18/2016; Last commit 05/6/2018) + +Signed-off-by: Derek Straka <derek@asterius.io> +--- + doc/tutorial.rst | 47 ++++++++++++++++++ + pydbus/error.py | 97 ++++++++++++++++++++++++++++++++++++ + pydbus/proxy_method.py | 18 +++++-- + pydbus/registration.py | 16 ++++-- + tests/error.py | 67 +++++++++++++++++++++++++ + tests/publish_error.py | 132 +++++++++++++++++++++++++++++++++++++++++++++++++ + tests/run.sh | 2 + + 7 files changed, 371 insertions(+), 8 deletions(-) + create mode 100644 pydbus/error.py + create mode 100644 tests/error.py + create mode 100644 tests/publish_error.py + +diff --git a/doc/tutorial.rst b/doc/tutorial.rst +index b8479cf..7fe55e1 100644 +--- a/doc/tutorial.rst ++++ b/doc/tutorial.rst +@@ -341,6 +341,53 @@ See ``help(bus.request_name)`` and ``help(bus.register_object)`` for details. + + .. -------------------------------------------------------------------- + ++Error handling ++============== ++ ++You can map D-Bus errors to your exception classes for better error handling. ++To handle D-Bus errors, use the ``@map_error`` decorator:: ++ ++ from pydbus.error import map_error ++ ++ @map_error("org.freedesktop.DBus.Error.InvalidArgs") ++ class InvalidArgsException(Exception): ++ pass ++ ++ try: ++ ... ++ catch InvalidArgsException as e: ++ print(e) ++ ++To register new D-Bus errors, use the ``@register_error`` decorator:: ++ ++ from pydbus.error import register_error ++ ++ @map_error("net.lew21.pydbus.TutorialExample.MyError", MY_DOMAIN, MY_EXCEPTION_CODE) ++ class MyException(Exception): ++ pass ++ ++Then you can raise ``MyException`` from the D-Bus method of the remote object:: ++ ++ def Method(): ++ raise MyException("Message") ++ ++And catch the same exception on the client side:: ++ ++ try: ++ proxy.Method() ++ catch MyException as e: ++ print(e) ++ ++To handle all unknown D-Bus errors, use the ``@map_by_default`` decorator to specify the default exception:: ++ ++ from pydbus.error import map_by_default ++ ++ @map_by_default ++ class DefaultException(Exception): ++ pass ++ ++.. -------------------------------------------------------------------- ++ + Data types + ========== + +diff --git a/pydbus/error.py b/pydbus/error.py +new file mode 100644 +index 0000000..aaa3510 +--- /dev/null ++++ b/pydbus/error.py +@@ -0,0 +1,97 @@ ++from gi.repository import GLib, Gio ++ ++ ++def register_error(name, domain, code): ++ """Register and map decorated exception class to a DBus error.""" ++ def decorated(cls): ++ error_registration.register_error(cls, name, domain, code) ++ return cls ++ ++ return decorated ++ ++ ++def map_error(error_name): ++ """Map decorated exception class to a DBus error.""" ++ def decorated(cls): ++ error_registration.map_error(cls, error_name) ++ return cls ++ ++ return decorated ++ ++ ++def map_by_default(cls): ++ """Map decorated exception class to all unknown DBus errors.""" ++ error_registration.map_by_default(cls) ++ return cls ++ ++ ++class ErrorRegistration(object): ++ """Class for mapping exceptions to DBus errors.""" ++ ++ _default = None ++ _map = dict() ++ _reversed_map = dict() ++ ++ def map_by_default(self, exception_cls): ++ """Set the exception class as a default.""" ++ self._default = exception_cls ++ ++ def map_error(self, exception_cls, name): ++ """Map the exception class to a DBus name.""" ++ self._map[name] = exception_cls ++ self._reversed_map[exception_cls] = name ++ ++ def register_error(self, exception_cls, name, domain, code): ++ """Map and register the exception class to a DBus name.""" ++ self.map_error(exception_cls, name) ++ return Gio.DBusError.register_error(domain, code, name) ++ ++ def is_registered_exception(self, obj): ++ """Is the exception registered?""" ++ return obj.__class__ in self._reversed_map ++ ++ def get_dbus_name(self, obj): ++ """Get the DBus name of the exception.""" ++ return self._reversed_map.get(obj.__class__) ++ ++ def get_exception_class(self, name): ++ """Get the exception class mapped to the DBus name.""" ++ return self._map.get(name, self._default) ++ ++ def transform_message(self, name, message): ++ """Transform the message of the exception.""" ++ prefix = "{}:{}: ".format("GDBus.Error", name) ++ ++ if message.startswith(prefix): ++ return message[len(prefix):] ++ ++ return message ++ ++ def transform_exception(self, e): ++ """Transform the remote error to the exception.""" ++ if not isinstance(e, GLib.Error): ++ return e ++ ++ if not Gio.DBusError.is_remote_error(e): ++ return e ++ ++ # Get DBus name of the error. ++ name = Gio.DBusError.get_remote_error(e) ++ # Get the exception class. ++ exception_cls = self.get_exception_class(name) ++ ++ # Return the original exception. ++ if not exception_cls: ++ return e ++ ++ # Return new exception. ++ message = self.transform_message(name, e.message) ++ exception = exception_cls(message) ++ exception.dbus_name = name ++ exception.dbus_domain = e.domain ++ exception.dbus_code = e.code ++ return exception ++ ++ ++# Default error registration. ++error_registration = ErrorRegistration() +diff --git a/pydbus/proxy_method.py b/pydbus/proxy_method.py +index 442fe07..a73f9eb 100644 +--- a/pydbus/proxy_method.py ++++ b/pydbus/proxy_method.py +@@ -2,6 +2,7 @@ from gi.repository import GLib + from .generic import bound_method + from .identifier import filter_identifier + from .timeout import timeout_to_glib ++from .error import error_registration + + try: + from inspect import Signature, Parameter +@@ -87,9 +88,20 @@ class ProxyMethod(object): + call_args += (self._finish_async_call, (callback, callback_args)) + instance._bus.con.call(*call_args) + return None ++ + else: +- ret = instance._bus.con.call_sync(*call_args) +- return self._unpack_return(ret) ++ result = None ++ error = None ++ ++ try: ++ result = instance._bus.con.call_sync(*call_args) ++ except Exception as e: ++ error = error_registration.transform_exception(e) ++ ++ if error: ++ raise error ++ ++ return self._unpack_return(result) + + def _unpack_return(self, values): + ret = values.unpack() +@@ -108,7 +120,7 @@ class ProxyMethod(object): + ret = source.call_finish(result) + return_args = self._unpack_return(ret) + except Exception as err: +- error = err ++ error = error_registration.transform_exception(err) + + callback, callback_args = user_data + callback(*callback_args, returned=return_args, error=error) +diff --git a/pydbus/registration.py b/pydbus/registration.py +index f531539..1d2cbcb 100644 +--- a/pydbus/registration.py ++++ b/pydbus/registration.py +@@ -5,6 +5,7 @@ from . import generic + from .exitable import ExitableWithAliases + from functools import partial + from .method_call_context import MethodCallContext ++from .error import error_registration + import logging + + try: +@@ -91,11 +92,16 @@ class ObjectWrapper(ExitableWithAliases("unwrap")): + logger = logging.getLogger(__name__) + logger.exception("Exception while handling %s.%s()", interface_name, method_name) + +- #TODO Think of a better way to translate Python exception types to DBus error types. +- e_type = type(e).__name__ +- if not "." in e_type: +- e_type = "unknown." + e_type +- invocation.return_dbus_error(e_type, str(e)) ++ if error_registration.is_registered_exception(e): ++ name = error_registration.get_dbus_name(e) ++ invocation.return_dbus_error(name, str(e)) ++ else: ++ logger.info("name is not registered") ++ e_type = type(e).__name__ ++ if not "." in e_type: ++ e_type = "unknown." + e_type ++ ++ invocation.return_dbus_error(e_type, str(e)) + + def Get(self, interface_name, property_name): + type = self.readable_properties[interface_name + "." + property_name] +diff --git a/tests/error.py b/tests/error.py +new file mode 100644 +index 0000000..3ec507d +--- /dev/null ++++ b/tests/error.py +@@ -0,0 +1,67 @@ ++from pydbus.error import ErrorRegistration ++ ++ ++class ExceptionA(Exception): ++ pass ++ ++ ++class ExceptionB(Exception): ++ pass ++ ++ ++class ExceptionC(Exception): ++ pass ++ ++ ++class ExceptionD(Exception): ++ pass ++ ++ ++class ExceptionE(Exception): ++ pass ++ ++ ++def test_error_mapping(): ++ r = ErrorRegistration() ++ r.map_error(ExceptionA, "net.lew21.pydbus.tests.ErrorA") ++ r.map_error(ExceptionB, "net.lew21.pydbus.tests.ErrorB") ++ r.map_error(ExceptionC, "net.lew21.pydbus.tests.ErrorC") ++ ++ assert r.is_registered_exception(ExceptionA("Test")) ++ assert r.is_registered_exception(ExceptionB("Test")) ++ assert r.is_registered_exception(ExceptionC("Test")) ++ assert not r.is_registered_exception(ExceptionD("Test")) ++ assert not r.is_registered_exception(ExceptionE("Test")) ++ ++ assert r.get_dbus_name(ExceptionA("Test")) == "net.lew21.pydbus.tests.ErrorA" ++ assert r.get_dbus_name(ExceptionB("Test")) == "net.lew21.pydbus.tests.ErrorB" ++ assert r.get_dbus_name(ExceptionC("Test")) == "net.lew21.pydbus.tests.ErrorC" ++ ++ assert r.get_exception_class("net.lew21.pydbus.tests.ErrorA") == ExceptionA ++ assert r.get_exception_class("net.lew21.pydbus.tests.ErrorB") == ExceptionB ++ assert r.get_exception_class("net.lew21.pydbus.tests.ErrorC") == ExceptionC ++ assert r.get_exception_class("net.lew21.pydbus.tests.ErrorD") is None ++ assert r.get_exception_class("net.lew21.pydbus.tests.ErrorE") is None ++ ++ r.map_by_default(ExceptionD) ++ assert not r.is_registered_exception(ExceptionD("Test")) ++ assert r.get_exception_class("net.lew21.pydbus.tests.ErrorD") == ExceptionD ++ assert r.get_exception_class("net.lew21.pydbus.tests.ErrorE") == ExceptionD ++ ++ ++def test_transform_message(): ++ r = ErrorRegistration() ++ n1 = "net.lew21.pydbus.tests.ErrorA" ++ m1 = "GDBus.Error:net.lew21.pydbus.tests.ErrorA: Message1" ++ ++ n2 = "net.lew21.pydbus.tests.ErrorB" ++ m2 = "GDBus.Error:net.lew21.pydbus.tests.ErrorB: Message2" ++ ++ assert r.transform_message(n1, m1) == "Message1" ++ assert r.transform_message(n2, m2) == "Message2" ++ assert r.transform_message(n1, m2) == m2 ++ assert r.transform_message(n2, m1) == m1 ++ ++ ++test_error_mapping() ++test_transform_message() +diff --git a/tests/publish_error.py b/tests/publish_error.py +new file mode 100644 +index 0000000..aa8a18a +--- /dev/null ++++ b/tests/publish_error.py +@@ -0,0 +1,132 @@ ++import sys ++from threading import Thread ++from gi.repository import GLib, Gio ++from pydbus import SessionBus ++from pydbus.error import register_error, map_error, map_by_default, error_registration ++ ++import logging ++logger = logging.getLogger('pydbus.registration') ++logger.disabled = True ++ ++loop = GLib.MainLoop() ++DOMAIN = Gio.DBusError.quark() # TODO: Register new domain. ++ ++ ++@register_error("net.lew21.pydbus.tests.ErrorA", DOMAIN, 1000) ++class ExceptionA(Exception): ++ pass ++ ++ ++@register_error("net.lew21.pydbus.tests.ErrorB", DOMAIN, 2000) ++class ExceptionB(Exception): ++ pass ++ ++ ++@map_error("org.freedesktop.DBus.Error.InvalidArgs") ++class ExceptionC(Exception): ++ pass ++ ++ ++@map_by_default ++class ExceptionD(Exception): ++ pass ++ ++ ++class ExceptionE(Exception): ++ pass ++ ++ ++class TestObject(object): ++ ''' ++<node> ++ <interface name='net.lew21.pydbus.tests.TestInterface'> ++ <method name='RaiseA'> ++ <arg type='s' name='msg' direction='in'/> ++ </method> ++ <method name='RaiseB'> ++ <arg type='s' name='msg' direction='in'/> ++ </method> ++ <method name='RaiseD'> ++ <arg type='s' name='msg' direction='in'/> ++ </method> ++ <method name='RaiseE'> ++ <arg type='s' name='msg' direction='in'/> ++ </method> ++ </interface> ++</node> ++ ''' ++ ++ def RaiseA(self, msg): ++ raise ExceptionA(msg) ++ ++ def RaiseB(self, msg): ++ raise ExceptionB(msg) ++ ++ def RaiseD(self, msg): ++ raise ExceptionD(msg) ++ ++ def RaiseE(self, msg): ++ raise ExceptionE(msg) ++ ++bus = SessionBus() ++ ++with bus.publish("net.lew21.pydbus.tests.Test", TestObject()): ++ remote = bus.get("net.lew21.pydbus.tests.Test") ++ ++ def t_func(): ++ # Test new registered errors. ++ try: ++ remote.RaiseA("Test A") ++ except ExceptionA as e: ++ assert str(e) == "Test A" ++ ++ try: ++ remote.RaiseB("Test B") ++ except ExceptionB as e: ++ assert str(e) == "Test B" ++ ++ # Test mapped errors. ++ try: ++ remote.Get("net.lew21.pydbus.tests.TestInterface", "Foo") ++ except ExceptionC as e: ++ assert str(e) == "No such property 'Foo'" ++ ++ # Test default errors. ++ try: ++ remote.RaiseD("Test D") ++ except ExceptionD as e: ++ assert str(e) == "Test D" ++ ++ try: ++ remote.RaiseE("Test E") ++ except ExceptionD as e: ++ assert str(e) == "Test E" ++ ++ # Test with no default errors. ++ error_registration.map_by_default(None) ++ ++ try: ++ remote.RaiseD("Test D") ++ except Exception as e: ++ assert not isinstance(e, ExceptionD) ++ ++ try: ++ remote.RaiseE("Test E") ++ except Exception as e: ++ assert not isinstance(e, ExceptionD) ++ assert not isinstance(e, ExceptionE) ++ ++ loop.quit() ++ ++ t = Thread(None, t_func) ++ t.daemon = True ++ ++ def handle_timeout(): ++ print("ERROR: Timeout.") ++ sys.exit(1) ++ ++ GLib.timeout_add_seconds(4, handle_timeout) ++ ++ t.start() ++ loop.run() ++ t.join() +diff --git a/tests/run.sh b/tests/run.sh +index 271c58a..a08baf8 100755 +--- a/tests/run.sh ++++ b/tests/run.sh +@@ -10,10 +10,11 @@ PYTHON=${1:-python} + + "$PYTHON" $TESTS_DIR/context.py + "$PYTHON" $TESTS_DIR/identifier.py ++"$PYTHON" $TESTS_DIR/error.py + if [ "$2" != "dontpublish" ] + then + "$PYTHON" $TESTS_DIR/publish.py + "$PYTHON" $TESTS_DIR/publish_properties.py + "$PYTHON" $TESTS_DIR/publish_multiface.py + "$PYTHON" $TESTS_DIR/publish_async.py + fi +-- +2.13.5 diff --git a/meta-python/recipes-devtools/python/python3-pydbus/run-ptest b/meta-python/recipes-devtools/python/python3-pydbus/run-ptest new file mode 100644 index 0000000000..782ceed3bb --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pydbus/run-ptest @@ -0,0 +1,15 @@ +#!/bin/sh + +for case in `find tests -type f -name '*.sh'`; do + bash $case python3 >$case.output 2>&1 + ret=$? + if [ $ret -ne 0 ]; then + cat $case.output + echo "FAIL: ${case}" + elif grep -i 'SKIP' $case.output; then + echo "SKIP: ${case}" + else + echo "PASS: ${case}" + fi + rm -f $case.output +done
\ No newline at end of file diff --git a/meta-python/recipes-devtools/python/python3-pydbus_0.6.0.bb b/meta-python/recipes-devtools/python/python3-pydbus_0.6.0.bb index 188934ab97..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.6.bb b/meta-python/recipes-devtools/python/python3-pydicti_1.2.1.bb index 17c52881ed..2363c29059 100644 --- a/meta-python/recipes-devtools/python/python3-pydicti_1.1.6.bb +++ b/meta-python/recipes-devtools/python/python3-pydicti_1.2.1.bb @@ -3,6 +3,6 @@ HOMEPAGE = "https://github.com/coldfix/pydicti" LICENSE = "WTFPL" LIC_FILES_CHKSUM = "file://COPYING;md5=389a9e29629d1f05e115f8f05c283df5" -SRC_URI[sha256sum] = "32eb329de2023c92158ac6c2d67837adf96195f188ba8d768b3248a0218b5a65" +SRC_URI[sha256sum] = "63e0756ff27a335e92916ff40be589a21a58894b3a93099edf0f3cbf695690dc" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-pyexpect_1.0.21.bb b/meta-python/recipes-devtools/python/python3-pyexpect_1.0.22.bb index 1b80770d73..1cbd2384a3 100644 --- a/meta-python/recipes-devtools/python/python3-pyexpect_1.0.21.bb +++ b/meta-python/recipes-devtools/python/python3-pyexpect_1.0.22.bb @@ -7,5 +7,6 @@ LIC_FILES_CHKSUM = "file://README.md;md5=a6aa1e7097aca5955f9a2e1c8b0ce158" inherit pypi setuptools3 -SRC_URI[md5sum] = "c661939158d6a1acbcc2191bedc47751" -SRC_URI[sha256sum] = "96e900d6af928a94c2a75b4935ddda44872c218121d0467c549ae19e7608a9a2" +SRC_URI[sha256sum] = "659351e7ee8923b42de8a774fabfc806acf07377d7fd19f2ea4412ef8f619c6a" + +RDEPENDS:${PN} += "python3-numbers" diff --git a/meta-python/recipes-devtools/python/python3-pyfanotify/0001-ext-define-FNM_EXTMATCH-if-not-already-defined.patch b/meta-python/recipes-devtools/python/python3-pyfanotify/0001-ext-define-FNM_EXTMATCH-if-not-already-defined.patch 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.3.0.bb b/meta-python/recipes-devtools/python/python3-pyfanotify_0.3.0.bb new file mode 100644 index 0000000000..214e80635e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyfanotify_0.3.0.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] = "95ee17caec25436e10d59d5d45e28d2dc659819cc6de55f29fcbdcd5ee2fa8d3" + +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 5bbc33ade0..02ebeaad79 100644 --- a/meta-python/recipes-devtools/python/python3-pyfirmata_1.1.0.bb +++ b/meta-python/recipes-devtools/python/python3-pyfirmata_1.1.0.bb @@ -4,7 +4,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=84ddcef430b7c44caa22b2ff4b37a3df" PYPI_PACKAGE = "pyFirmata" RDEPENDS:${PN} = "\ - ${PYTHON_PN}-pyserial \ + python3-pyserial \ " SRC_URI[md5sum] = "159673cfb56c72ceafc30fe91eedd847" diff --git a/meta-python/recipes-devtools/python/python3-pyflakes_2.4.0.bb b/meta-python/recipes-devtools/python/python3-pyflakes_3.2.0.bb index 827ff0b292..b7ee20ebe4 100644 --- a/meta-python/recipes-devtools/python/python3-pyflakes_2.4.0.bb +++ b/meta-python/recipes-devtools/python/python3-pyflakes_3.2.0.bb @@ -3,7 +3,7 @@ HOMEPAGE = "https://github.com/PyCQA/pyflakes" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=690c2d09203dc9e07c4083fc45ea981f" -SRC_URI[sha256sum] = "05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c" +SRC_URI[sha256sum] = "1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f" inherit pypi setuptools3 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 056ecb549a..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..dcc9ebfa93 --- /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_hatchling + +DEPENDS += "python3-hatch-vcs-native" + +UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/PyHamcrest/" +UPSTREAM_CHECK_REGEX = "/PyHamcrest/(?P<pver>(\d+[\.\-_]*)+)" + +RDEPENDS:${PN} += " \ + python3-asyncio \ + 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 8dd5e1580a..0000000000 --- a/meta-python/recipes-devtools/python/python3-pyinotify_0.9.6.bb +++ /dev/null @@ -1,19 +0,0 @@ -DESCRIPTION = "Python pyinotify: Linux filesystem events monitoring" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://COPYING;md5=ab173cade7965b411528464589a08382" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-ctypes \ - ${PYTHON_PN}-fcntl \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-misc \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-smtpd \ - ${PYTHON_PN}-threading \ -" - -SRC_URI[md5sum] = "8e580fa1ff3971f94a6f81672b76c406" -SRC_URI[sha256sum] = "9c998a5d7606ca835065cdabc013ae6c66eb9ea76a00a1e3bc6e0cfe2b4f71f4" - -inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-pyjks_20.0.0.bb b/meta-python/recipes-devtools/python/python3-pyjks_20.0.0.bb index 87e212d9dc..c0cca98ff6 100644 --- a/meta-python/recipes-devtools/python/python3-pyjks_20.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-pyjks_20.0.0.bb @@ -11,12 +11,12 @@ SRC_URI[sha256sum] = "0378cec15fb11b2ed27ba54dad9fd987d48e6f62f49fcff138f5f7a8b3 inherit pypi setuptools3 -RDEPENDS:${PN} = "\ - ${PYTHON_PN}-javaobj-py3 \ - ${PYTHON_PN}-pyasn1 \ - ${PYTHON_PN}-pyasn1-modules \ - ${PYTHON_PN}-pycryptodome \ - ${PYTHON_PN}-twofish\ +RDEPENDS:${PN} = " \ + python3-javaobj-py3 \ + python3-pyasn1 \ + python3-pyasn1-modules \ + python3-pycryptodomex \ + python3-twofish \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pyjwt_2.3.0.bb b/meta-python/recipes-devtools/python/python3-pyjwt_2.3.0.bb deleted file mode 100644 index 19ba30780e..0000000000 --- a/meta-python/recipes-devtools/python/python3-pyjwt_2.3.0.bb +++ /dev/null @@ -1,15 +0,0 @@ -SUMMARY = "JSON Web Token implementation in Python" -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" - -SRC_URI[sha256sum] = "b888b4d56f06f6dcd777210c334e69c737be74755d3e5e9ee3fe67dc18a0ee41" - -PYPI_PACKAGE = "PyJWT" -inherit pypi setuptools3 - -RDEPENDS:${PN} = "${PYTHON_PN}-cryptography" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pyjwt_2.9.0.bb b/meta-python/recipes-devtools/python/python3-pyjwt_2.9.0.bb new file mode 100644 index 0000000000..7bc3cffdd3 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyjwt_2.9.0.bb @@ -0,0 +1,18 @@ +SUMMARY = "JSON Web Token implementation in Python" +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=e4b56d2c9973d8cf54655555be06e551" + +SRC_URI[sha256sum] = "7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c" + +PYPI_PACKAGE = "pyjwt" +inherit pypi python_setuptools_build_meta + +RDEPENDS:${PN} = "\ + python3-cryptography \ + python3-json \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pykwalify_1.8.0.bb b/meta-python/recipes-devtools/python/python3-pykwalify_1.8.0.bb index 6d93f384e0..d94051df89 100644 --- a/meta-python/recipes-devtools/python/python3-pykwalify_1.8.0.bb +++ b/meta-python/recipes-devtools/python/python3-pykwalify_1.8.0.bb @@ -11,9 +11,10 @@ PYPI_PACKAGE = "pykwalify" inherit setuptools3 pypi RDEPENDS:${PN} = "\ - ${PYTHON_PN}-docopt \ - ${PYTHON_PN}-dateutil \ - ${PYTHON_PN}-ruamel-yaml \ + python3-dateutil \ + python3-docopt \ + python3-logging \ + python3-ruamel-yaml \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pylint/0001-Adjust-test-expectations-for-ptest.patch b/meta-python/recipes-devtools/python/python3-pylint/0001-Adjust-test-expectations-for-ptest.patch new file mode 100644 index 0000000000..8edecbf1bd --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pylint/0001-Adjust-test-expectations-for-ptest.patch @@ -0,0 +1,44 @@ +From f3a213cf4922c122e554277ea2031c0c54cd3fe5 Mon Sep 17 00:00:00 2001 +From: Dan McGregor <dan.mcgregor@vecima.com> +Date: Wed, 13 Mar 2024 14:08:25 -0600 +Subject: [PATCH] Adjust test expectations for ptest + +Because of the way we install ptests, some first party imports +became third party. Reflect that in the test case. + +Upstream-Status: Inappropriate (embedded specific) +Signed-off-by: Dan McGregor <dan.mcgregor@vecima.com> +--- + tests/functional/w/wrong_import_order.txt | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +diff --git a/tests/functional/w/wrong_import_order.txt b/tests/functional/w/wrong_import_order.txt +index 068d2140d..9594ff9e0 100644 +--- a/tests/functional/w/wrong_import_order.txt ++++ b/tests/functional/w/wrong_import_order.txt +@@ -3,14 +3,14 @@ wrong-import-order:14:0:14:10::"standard import ""sys"" should be placed before + wrong-import-order:15:0:15:15::"standard import ""datetime"" should be placed before third party imports ""six"", ""astroid.are_exclusive""":UNDEFINED
+ wrong-import-order:18:0:18:22::"third party import ""totally_missing"" should be placed before local import ""package.Class""":UNDEFINED
+ wrong-import-order:20:0:20:14::"third party import ""astroid"" should be placed before local imports ""package.Class"", "".package""":UNDEFINED
+-wrong-import-order:22:0:22:22::"first party import ""pylint.checkers"" should be placed before local imports ""package.Class"", "".package"", "".package2""":UNDEFINED
+-wrong-import-order:23:0:23:25::"first party import ""pylint.config"" should be placed before local imports ""package.Class"", "".package"", "".package2""":UNDEFINED
+-wrong-import-order:24:0:24:17::"first party import ""pylint.sys"" should be placed before local imports ""package.Class"", "".package"", "".package2""":UNDEFINED
+-wrong-import-order:25:0:25:28::"first party import ""pylint.pyreverse"" should be placed before local imports ""package.Class"", "".package"", "".package2""":UNDEFINED
+-wrong-import-order:30:0:30:40::"third party import ""six.moves.urllib.parse.quote"" should be placed before first party imports ""pylint.checkers"", ""pylint.config"", ""pylint.sys"", ""pylint.pyreverse"" and local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
+-wrong-import-order:31:0:31:23::"first party import ""pylint.constants"" should be placed before local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
+-wrong-import-order:32:0:32:19::"standard import ""re"" should be placed before third party imports ""six"", ""astroid.are_exclusive"", ""unused_import"", ""totally_missing"", ""astroid"", ""six.moves.urllib.parse.quote"", first party imports ""pylint.checkers"", ""pylint.config"", ""pylint.sys"", ""pylint.pyreverse"", ""pylint.constants"", and local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
+-wrong-import-order:32:0:32:19::"third party import ""requests"" should be placed before first party imports ""pylint.checkers"", ""pylint.config"", ""pylint.sys"", ""pylint.pyreverse"", ""pylint.constants"" and local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
+-wrong-import-order:33:0:33:24::"first party import ""pylint.exceptions"" should be placed before local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
+-wrong-import-order:34:0:34:21::"first party import ""pylint.message"" should be placed before local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
+-wrong-import-order:35:0:35:11::"standard import ""time"" should be placed before third party imports ""six"", ""astroid.are_exclusive"", ""unused_import"" (...) ""astroid"", ""six.moves.urllib.parse.quote"", ""requests"", first party imports ""pylint.checkers"", ""pylint.config"", ""pylint.sys"" (...) ""pylint.constants"", ""pylint.exceptions"", ""pylint.message"", and local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
++wrong-import-order:22:0:22:22::"third party import ""pylint.checkers"" should be placed before local imports ""package.Class"", "".package"", "".package2""":UNDEFINED
++wrong-import-order:23:0:23:25::"third party import ""pylint.config"" should be placed before local imports ""package.Class"", "".package"", "".package2""":UNDEFINED
++wrong-import-order:24:0:24:17::"third party import ""pylint.sys"" should be placed before local imports ""package.Class"", "".package"", "".package2""":UNDEFINED
++wrong-import-order:25:0:25:28::"third party import ""pylint.pyreverse"" should be placed before local imports ""package.Class"", "".package"", "".package2""":UNDEFINED
++wrong-import-order:30:0:30:40::"third party import ""six.moves.urllib.parse.quote"" should be placed before local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
++wrong-import-order:31:0:31:23::"third party import ""pylint.constants"" should be placed before local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
++wrong-import-order:32:0:32:19::"standard import ""re"" should be placed before third party imports ""six"", ""astroid.are_exclusive"", ""unused_import"" (...) ""pylint.pyreverse"", ""six.moves.urllib.parse.quote"", ""pylint.constants"" and local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
++wrong-import-order:32:0:32:19::"third party import ""requests"" should be placed before local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
++wrong-import-order:33:0:33:24::"third party import ""pylint.exceptions"" should be placed before local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
++wrong-import-order:34:0:34:21::"third party import ""pylint.message"" should be placed before local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
++wrong-import-order:35:0:35:11::"standard import ""time"" should be placed before third party imports ""six"", ""astroid.are_exclusive"", ""unused_import"" (...) ""requests"", ""pylint.exceptions"", ""pylint.message"" and local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
diff --git a/meta-python/recipes-devtools/python/python3-pylint/run-ptest b/meta-python/recipes-devtools/python/python3-pylint/run-ptest new file mode 100644 index 0000000000..ed424cb879 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pylint/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --benchmark-disable -vv --minimal-messages-config --automake tests/test_functional.py diff --git a/meta-python/recipes-devtools/python/python3-pylint_1.8.3.bb b/meta-python/recipes-devtools/python/python3-pylint_1.8.3.bb deleted file mode 100644 index 47a40fdce2..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.2.2.bb b/meta-python/recipes-devtools/python/python3-pylint_3.2.2.bb new file mode 100644 index 0000000000..eae30dfbff --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pylint_3.2.2.bb @@ -0,0 +1,58 @@ +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=main;protocol=https \ + file://0001-Adjust-test-expectations-for-ptest.patch \ + file://run-ptest \ + " +SRCREV = "769ffd20bbf321a6cf23f5e7221a0b8221f51482" + +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 \ + " +# python3-misc for timeit.py +RDEPENDS:${PN}-ptest += " \ + python3-core \ + python3-git \ + python3-misc \ + 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.13.0.bb b/meta-python/recipes-devtools/python/python3-pymetno_0.13.0.bb new file mode 100644 index 0000000000..1937606642 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pymetno_0.13.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 = "921812ddad3f147489916c3c7ab7fb7a80d8c646" +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.148.bb b/meta-python/recipes-devtools/python/python3-pymisp_2.4.148.bb deleted file mode 100644 index e091e8757c..0000000000 --- a/meta-python/recipes-devtools/python/python3-pymisp_2.4.148.bb +++ /dev/null @@ -1,24 +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 = "6f7157cf26a6b4ec102021c8f1197a40380b12e3" -S = "${WORKDIR}/git" - -inherit setuptools3 - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-dateutil \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-jsonschema \ - ${PYTHON_PN}-requests \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-deprecated \ - ${PYTHON_PN}-wrapt \ -" - -# Fixes: python3-pymisp requires /bin/bash, but no -# providers found in RDEPENDS:python3-pymisp? [file-rdep] -RDEPENDS:${PN} += "bash" diff --git a/meta-python/recipes-devtools/python/python3-pymisp_2.4.198.bb b/meta-python/recipes-devtools/python/python3-pymisp_2.4.198.bb new file mode 100644 index 0000000000..b902061c05 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pymisp_2.4.198.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] = "f5583263c2fcd380570c084b21c4e4812a01c32daa7baafcdc3f87153edc9303" + +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.7.2.bb b/meta-python/recipes-devtools/python/python3-pymodbus_3.7.2.bb new file mode 100644 index 0000000000..b240837d42 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pymodbus_3.7.2.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] = "6cc63a14c8cca83f5b6d9dae3319565061bd49503ee7282df681201c16357eef" + +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_4.0.bb b/meta-python/recipes-devtools/python/python3-pymongo_4.8.0.bb index ea057c1804..fcce456d86 100644 --- a/meta-python/recipes-devtools/python/python3-pymongo_4.0.bb +++ b/meta-python/recipes-devtools/python/python3-pymongo_4.8.0.bb @@ -8,23 +8,29 @@ HOMEPAGE = "http://github.com/mongodb/mongo-python-driver" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327" -SRC_URI[sha256sum] = "6d158eadba3aaab276a3b188b7f467ab0384b68c1d31cfa87335e52addd9dcb6" +SRC_URI[sha256sum] = "454f2295875744dc70f1881e4b2eb99cdad008a33574bc8aaf120530f66c0cde" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta python_hatchling -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 \ +DEPENDS += " \ + python3-hatch-requirements-txt-native \ +" + +RDEPENDS:python3-bson += " \ + python3-datetime \ + python3-json \ + python3-netclient \ + python3-numbers \ + python3-threading \ " RDEPENDS:${PN} += " \ - ${PYTHON_PN}-bson \ - ${PYTHON_PN}-pprint \ + python3-bson \ + python3-pprint \ + python3-difflib \ + python3-logging \ " diff --git a/meta-python/recipes-devtools/python/python3-pymysql_1.0.2.bb b/meta-python/recipes-devtools/python/python3-pymysql_1.1.0.bb index 1f6fbd3bb1..5e56a64aa1 100644 --- a/meta-python/recipes-devtools/python/python3-pymysql_1.0.2.bb +++ b/meta-python/recipes-devtools/python/python3-pymysql_1.1.0.bb @@ -8,9 +8,12 @@ HOMEPAGE = "https://pymysql.readthedocs.io" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=528175c84163bb800d23ad835c7fa0fc" -SRC_URI[sha256sum] = "816927a350f38d56072aeca5dfb10221fe1dc653745853d30a216637f5d7ad36" +SRC_URI[sha256sum] = "4f13a7df8bf36a51e81dd9f3605fede45a4878fe02f9236349fd82a3f0612f96" PYPI_PACKAGE = "PyMySQL" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta -RDEPENDS:${PN} += "${PYTHON_PN}-cryptography" +UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/pymysql/" +UPSTREAM_CHECK_REGEX = "/pymysql/(?P<pver>(\d+[\.\-_]*)+)" + +RDEPENDS:${PN} += "python3-cryptography" diff --git a/meta-python/recipes-devtools/python/python3-pynacl_1.4.0.bb b/meta-python/recipes-devtools/python/python3-pynacl_1.5.0.bb index b4a6b7af6f..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,22 +4,14 @@ 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 \ - libsodium \ -" - -RDEPENDS:${PN} = "\ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-cffi \ + python3-cffi-native \ libsodium \ " @@ -30,3 +22,17 @@ do_compile:prepend() { do_install:prepend() { export SODIUM_INSTALL=system } + +RDEPENDS:${PN} = "\ + python3-six \ + python3-cffi \ + libsodium \ +" + +RPROVIDES:${PN} = "python3-nacl" + +# in meta-virtualization layer +# +RCONFLICTS:${PN} = "python3-nacl" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pynetlinux/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_21.0.0.bb b/meta-python/recipes-devtools/python/python3-pyopenssl_21.0.0.bb deleted file mode 100644 index a7e0ae4b14..0000000000 --- a/meta-python/recipes-devtools/python/python3-pyopenssl_21.0.0.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] = "5e2d8c5e46d0d865ae933bef5230090bdaf5506281e9eec60fa250ee80600cb3" - -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.9.0.bb index 2870ec9c01..80af514fab 100644 --- a/meta-python/recipes-devtools/python/python3-pyperclip_1.8.2.bb +++ b/meta-python/recipes-devtools/python/python3-pyperclip_1.9.0.bb @@ -3,12 +3,12 @@ HOMEPAGE = "https://github.com/asweigart/pyperclip" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=d7dd4b0d1f7153322a546e89b5a0a632" -SRC_URI[sha256sum] = "105254a8b04934f0bc84e9c24eb360a591aaf6535c9def5f29d92af107a9bf57" +SRC_URI[sha256sum] = "b7de0142ddc81bfc5c7507eea19da920b92252b548b96186caf94a5e2527d310" inherit pypi setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-ctypes \ + python3-ctypes \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pyperf_2.3.0.bb b/meta-python/recipes-devtools/python/python3-pyperf_2.7.0.bb index 5172b0a05e..f3ebfe2d9b 100644 --- a/meta-python/recipes-devtools/python/python3-pyperf_2.3.0.bb +++ b/meta-python/recipes-devtools/python/python3-pyperf_2.7.0.bb @@ -13,11 +13,11 @@ Features: \ LICENSE = "MIT" LIC_FILES_CHKSUM = "file://COPYING;md5=78bc2e6e87c8c61272937b879e6dc2f8" -SRC_URI[sha256sum] = "8a85dd42e067131d5b26b71472336da7f7f4b87ff9c97350d89f5ff0de9adedc" +SRC_URI[sha256sum] = "4201c6601032f374e9c900c6d2544a2f5891abedc1a96eec0e7b2338a6247589" -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/rpath.patch b/meta-python/recipes-devtools/python/python3-pyproj/rpath.patch new file mode 100644 index 0000000000..347996a808 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyproj/rpath.patch @@ -0,0 +1,18 @@ +Description: Don't set RPATH in libraries. +Author: Bas Couwenberg <sebastic@debian.org> +Forwarded: not-needed + +Upstream-Status: Inappropriate [OE-Specific] +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- a/setup.py ++++ b/setup.py +@@ -194,9 +194,6 @@ def get_extension_modules(): + ext_options = { + "include_dirs": include_dirs, + "library_dirs": library_dirs, +- "runtime_library_dirs": ( +- library_dirs if os.name != "nt" and sys.platform != "cygwin" else None +- ), + "libraries": get_libraries(library_dirs), + } + # setup cythonized modules 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..cad9464ccf --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyproj_3.6.1.bb @@ -0,0 +1,31 @@ +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" + +inherit pypi python_setuptools_build_meta + +SRC_URI += "file://rpath.patch" + +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}/.." + +do_compile:append() { + for f in `find ${B} -name *.c` + do + sed -i -e "/BEGIN: Cython Metadata/,/END: Cython Metadata/d" $f + done + python_pep517_do_compile +} diff --git a/meta-python/recipes-devtools/python/python3-pyproject-api_1.7.2.bb b/meta-python/recipes-devtools/python/python3-pyproject-api_1.7.2.bb new file mode 100644 index 0000000000..ee8949add7 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyproject-api_1.7.2.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] = "dc5b0e0f6e291a4f22b46e182c9c6d4915c62b1f089b8de1b73f2d06ae453593" + +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.19.bb b/meta-python/recipes-devtools/python/python3-pyroute2_0.5.19.bb deleted file mode 100644 index a85b0929d4..0000000000 --- a/meta-python/recipes-devtools/python/python3-pyroute2_0.5.19.bb +++ /dev/null @@ -1,36 +0,0 @@ -SUMMARY = "A pure Python netlink and Linux network configuration library" -LICENSE = "GPLv2 & Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE.GPL.v2;md5=b234ee4d69f5fce4486a80fdaf4a4263 \ - file://LICENSE.Apache.v2;md5=34281e312165f843a2b7d1f114fe65ce" - -SRC_URI[sha256sum] = "45460d12ed2a5caf272a357a3360b36d1e346f17afe1425b66fc21d70f462b29" - -inherit setuptools3 pypi ptest - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-ctypes \ - ${PYTHON_PN}-distutils \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-multiprocessing \ - ${PYTHON_PN}-pickle \ - ${PYTHON_PN}-pkgutil \ - ${PYTHON_PN}-pprint \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-unixadmin \ -" - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-fcntl \ -" - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/tests - cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ -} diff --git a/meta-python/recipes-devtools/python/python3-pyroute2_0.7.12.bb b/meta-python/recipes-devtools/python/python3-pyroute2_0.7.12.bb new file mode 100644 index 0000000000..cf9885df71 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyroute2_0.7.12.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] = "54d226fc3ff2732f49bac9b26853c50c9d05be05a4d9daf09c7cf6d77301eff3" + +inherit python_setuptools_build_meta pypi ptest + +RDEPENDS:${PN} += " \ + python3-ctypes \ + python3-io \ + python3-json \ + python3-fcntl \ + python3-logging \ + python3-multiprocessing \ + python3-pickle \ + python3-pkgutil \ + python3-pprint \ + python3-shell \ + python3-unixadmin \ +" + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-fcntl \ + python3-pytest \ + python3-sqlite3 \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ + sed -e "s|'test_unit|'tests/test_unit|g" -i ${D}${PTEST_PATH}/tests/test_unit/test_nlmsg/test_marshal.py \ + ${D}${PTEST_PATH}/tests/test_unit/test_iproute_match/test_match.py +} diff --git a/meta-python/recipes-devtools/python/python3-pyruvate-crates.inc b/meta-python/recipes-devtools/python/python3-pyruvate-crates.inc new file mode 100644 index 0000000000..b8a74e617f --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyruvate-crates.inc @@ -0,0 +1,216 @@ +# Autogenerated with 'bitbake -c update_crates python3-pyruvate' + +# from Cargo.lock +SRC_URI += " \ + crate://crates.io/aho-corasick/0.7.20 \ + crate://crates.io/autocfg/1.1.0 \ + crate://crates.io/bitflags/1.3.2 \ + crate://crates.io/block-buffer/0.10.3 \ + crate://crates.io/cc/1.0.78 \ + crate://crates.io/cfg-if/1.0.0 \ + crate://crates.io/cpufeatures/0.2.5 \ + crate://crates.io/cpython/0.7.1 \ + crate://crates.io/crossbeam/0.8.2 \ + crate://crates.io/crossbeam-channel/0.5.6 \ + crate://crates.io/crossbeam-deque/0.8.2 \ + crate://crates.io/crossbeam-epoch/0.9.13 \ + crate://crates.io/crossbeam-queue/0.3.8 \ + crate://crates.io/crossbeam-utils/0.8.14 \ + crate://crates.io/crypto-common/0.1.6 \ + crate://crates.io/digest/0.10.6 \ + crate://crates.io/encoding/0.2.33 \ + crate://crates.io/encoding-index-japanese/1.20141219.5 \ + crate://crates.io/encoding-index-korean/1.20141219.5 \ + crate://crates.io/encoding-index-simpchinese/1.20141219.5 \ + crate://crates.io/encoding-index-singlebyte/1.20141219.5 \ + crate://crates.io/encoding-index-tradchinese/1.20141219.5 \ + crate://crates.io/encoding_index_tests/0.1.4 \ + crate://crates.io/env_logger/0.10.0 \ + crate://crates.io/errno/0.2.8 \ + crate://crates.io/errno-dragonfly/0.1.2 \ + crate://crates.io/fastrand/1.8.0 \ + crate://crates.io/generic-array/0.14.6 \ + crate://crates.io/getrandom/0.2.8 \ + crate://crates.io/hermit-abi/0.1.19 \ + crate://crates.io/hermit-abi/0.2.6 \ + crate://crates.io/hmac/0.12.1 \ + crate://crates.io/httparse/1.8.0 \ + crate://crates.io/humantime/2.1.0 \ + crate://crates.io/instant/0.1.12 \ + crate://crates.io/io-lifetimes/1.0.3 \ + crate://crates.io/is-terminal/0.4.1 \ + crate://crates.io/itoa/1.0.5 \ + crate://crates.io/libc/0.2.138 \ + crate://crates.io/libsystemd/0.5.0 \ + crate://crates.io/linux-raw-sys/0.1.4 \ + crate://crates.io/log/0.4.17 \ + crate://crates.io/memchr/2.5.0 \ + crate://crates.io/memoffset/0.6.5 \ + crate://crates.io/memoffset/0.7.1 \ + crate://crates.io/minimal-lexical/0.2.1 \ + crate://crates.io/mio/0.8.5 \ + crate://crates.io/nix/0.23.2 \ + crate://crates.io/nix/0.26.1 \ + crate://crates.io/nom/7.1.1 \ + crate://crates.io/num-traits/0.2.15 \ + crate://crates.io/num_cpus/1.14.0 \ + crate://crates.io/num_threads/0.1.6 \ + crate://crates.io/once_cell/1.16.0 \ + crate://crates.io/paste/1.0.11 \ + crate://crates.io/pin-utils/0.1.0 \ + crate://crates.io/ppv-lite86/0.2.17 \ + crate://crates.io/proc-macro2/1.0.49 \ + crate://crates.io/python3-sys/0.7.1 \ + crate://crates.io/quote/1.0.23 \ + crate://crates.io/rand/0.8.5 \ + crate://crates.io/rand_chacha/0.3.1 \ + crate://crates.io/rand_core/0.6.4 \ + crate://crates.io/redox_syscall/0.2.16 \ + crate://crates.io/regex/1.7.0 \ + crate://crates.io/regex-syntax/0.6.28 \ + crate://crates.io/remove_dir_all/0.5.3 \ + crate://crates.io/rustix/0.36.5 \ + crate://crates.io/scopeguard/1.1.0 \ + crate://crates.io/serde/1.0.151 \ + crate://crates.io/serde_derive/1.0.151 \ + crate://crates.io/sha2/0.10.6 \ + crate://crates.io/signal-hook/0.3.14 \ + crate://crates.io/signal-hook-registry/1.4.0 \ + crate://crates.io/simplelog/0.12.0 \ + crate://crates.io/spmc/0.3.0 \ + crate://crates.io/static_assertions/1.1.0 \ + crate://crates.io/subtle/2.4.1 \ + crate://crates.io/syn/1.0.107 \ + crate://crates.io/tempfile/3.3.0 \ + crate://crates.io/termcolor/1.1.3 \ + crate://crates.io/thiserror/1.0.38 \ + crate://crates.io/thiserror-impl/1.0.38 \ + crate://crates.io/threadpool/1.8.1 \ + crate://crates.io/time/0.3.17 \ + crate://crates.io/time-core/0.1.0 \ + crate://crates.io/time-macros/0.2.6 \ + crate://crates.io/typenum/1.16.0 \ + crate://crates.io/unicode-ident/1.0.6 \ + crate://crates.io/urlencoding/2.1.2 \ + crate://crates.io/uuid/0.8.2 \ + crate://crates.io/version_check/0.9.4 \ + crate://crates.io/wasi/0.11.0+wasi-snapshot-preview1 \ + crate://crates.io/winapi/0.3.9 \ + crate://crates.io/winapi-i686-pc-windows-gnu/0.4.0 \ + crate://crates.io/winapi-util/0.1.5 \ + crate://crates.io/winapi-x86_64-pc-windows-gnu/0.4.0 \ + crate://crates.io/windows-sys/0.42.0 \ + crate://crates.io/windows_aarch64_gnullvm/0.42.0 \ + crate://crates.io/windows_aarch64_msvc/0.42.0 \ + crate://crates.io/windows_i686_gnu/0.42.0 \ + crate://crates.io/windows_i686_msvc/0.42.0 \ + crate://crates.io/windows_x86_64_gnu/0.42.0 \ + crate://crates.io/windows_x86_64_gnullvm/0.42.0 \ + crate://crates.io/windows_x86_64_msvc/0.42.0 \ +" + +SRC_URI[aho-corasick-0.7.20.sha256sum] = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +SRC_URI[autocfg-1.1.0.sha256sum] = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +SRC_URI[bitflags-1.3.2.sha256sum] = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +SRC_URI[block-buffer-0.10.3.sha256sum] = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +SRC_URI[cc-1.0.78.sha256sum] = "a20104e2335ce8a659d6dd92a51a767a0c062599c73b343fd152cb401e828c3d" +SRC_URI[cfg-if-1.0.0.sha256sum] = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +SRC_URI[cpufeatures-0.2.5.sha256sum] = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +SRC_URI[cpython-0.7.1.sha256sum] = "3052106c29da7390237bc2310c1928335733b286287754ea85e6093d2495280e" +SRC_URI[crossbeam-0.8.2.sha256sum] = "2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c" +SRC_URI[crossbeam-channel-0.5.6.sha256sum] = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" +SRC_URI[crossbeam-deque-0.8.2.sha256sum] = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" +SRC_URI[crossbeam-epoch-0.9.13.sha256sum] = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a" +SRC_URI[crossbeam-queue-0.3.8.sha256sum] = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +SRC_URI[crossbeam-utils-0.8.14.sha256sum] = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" +SRC_URI[crypto-common-0.1.6.sha256sum] = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +SRC_URI[digest-0.10.6.sha256sum] = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +SRC_URI[encoding-0.2.33.sha256sum] = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" +SRC_URI[encoding-index-japanese-1.20141219.5.sha256sum] = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" +SRC_URI[encoding-index-korean-1.20141219.5.sha256sum] = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" +SRC_URI[encoding-index-simpchinese-1.20141219.5.sha256sum] = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" +SRC_URI[encoding-index-singlebyte-1.20141219.5.sha256sum] = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" +SRC_URI[encoding-index-tradchinese-1.20141219.5.sha256sum] = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" +SRC_URI[encoding_index_tests-0.1.4.sha256sum] = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" +SRC_URI[env_logger-0.10.0.sha256sum] = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" +SRC_URI[errno-0.2.8.sha256sum] = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" +SRC_URI[errno-dragonfly-0.1.2.sha256sum] = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +SRC_URI[fastrand-1.8.0.sha256sum] = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" +SRC_URI[generic-array-0.14.6.sha256sum] = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +SRC_URI[getrandom-0.2.8.sha256sum] = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +SRC_URI[hermit-abi-0.1.19.sha256sum] = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +SRC_URI[hermit-abi-0.2.6.sha256sum] = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +SRC_URI[hmac-0.12.1.sha256sum] = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +SRC_URI[httparse-1.8.0.sha256sum] = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +SRC_URI[humantime-2.1.0.sha256sum] = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +SRC_URI[instant-0.1.12.sha256sum] = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +SRC_URI[io-lifetimes-1.0.3.sha256sum] = "46112a93252b123d31a119a8d1a1ac19deac4fac6e0e8b0df58f0d4e5870e63c" +SRC_URI[is-terminal-0.4.1.sha256sum] = "927609f78c2913a6f6ac3c27a4fe87f43e2a35367c0c4b0f8265e8f49a104330" +SRC_URI[itoa-1.0.5.sha256sum] = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" +SRC_URI[libc-0.2.138.sha256sum] = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" +SRC_URI[libsystemd-0.5.0.sha256sum] = "8144587c71c16756b1055d3dcb0c75cb605a10ecd6523cc33702d5f90902bf6d" +SRC_URI[linux-raw-sys-0.1.4.sha256sum] = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" +SRC_URI[log-0.4.17.sha256sum] = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +SRC_URI[memchr-2.5.0.sha256sum] = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +SRC_URI[memoffset-0.6.5.sha256sum] = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +SRC_URI[memoffset-0.7.1.sha256sum] = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +SRC_URI[minimal-lexical-0.2.1.sha256sum] = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +SRC_URI[mio-0.8.5.sha256sum] = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" +SRC_URI[nix-0.23.2.sha256sum] = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" +SRC_URI[nix-0.26.1.sha256sum] = "46a58d1d356c6597d08cde02c2f09d785b09e28711837b1ed667dc652c08a694" +SRC_URI[nom-7.1.1.sha256sum] = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" +SRC_URI[num-traits-0.2.15.sha256sum] = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +SRC_URI[num_cpus-1.14.0.sha256sum] = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5" +SRC_URI[num_threads-0.1.6.sha256sum] = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +SRC_URI[once_cell-1.16.0.sha256sum] = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" +SRC_URI[paste-1.0.11.sha256sum] = "d01a5bd0424d00070b0098dd17ebca6f961a959dead1dbcbbbc1d1cd8d3deeba" +SRC_URI[pin-utils-0.1.0.sha256sum] = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +SRC_URI[ppv-lite86-0.2.17.sha256sum] = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +SRC_URI[proc-macro2-1.0.49.sha256sum] = "57a8eca9f9c4ffde41714334dee777596264c7825420f521abc92b5b5deb63a5" +SRC_URI[python3-sys-0.7.1.sha256sum] = "49f8b50d72fb3015735aa403eebf19bbd72c093bfeeae24ee798be5f2f1aab52" +SRC_URI[quote-1.0.23.sha256sum] = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +SRC_URI[rand-0.8.5.sha256sum] = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +SRC_URI[rand_chacha-0.3.1.sha256sum] = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +SRC_URI[rand_core-0.6.4.sha256sum] = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +SRC_URI[redox_syscall-0.2.16.sha256sum] = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +SRC_URI[regex-1.7.0.sha256sum] = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" +SRC_URI[regex-syntax-0.6.28.sha256sum] = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" +SRC_URI[remove_dir_all-0.5.3.sha256sum] = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +SRC_URI[rustix-0.36.5.sha256sum] = "a3807b5d10909833d3e9acd1eb5fb988f79376ff10fce42937de71a449c4c588" +SRC_URI[scopeguard-1.1.0.sha256sum] = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +SRC_URI[serde-1.0.151.sha256sum] = "97fed41fc1a24994d044e6db6935e69511a1153b52c15eb42493b26fa87feba0" +SRC_URI[serde_derive-1.0.151.sha256sum] = "255abe9a125a985c05190d687b320c12f9b1f0b99445e608c21ba0782c719ad8" +SRC_URI[sha2-0.10.6.sha256sum] = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +SRC_URI[signal-hook-0.3.14.sha256sum] = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d" +SRC_URI[signal-hook-registry-1.4.0.sha256sum] = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +SRC_URI[simplelog-0.12.0.sha256sum] = "48dfff04aade74dd495b007c831cd6f4e0cee19c344dd9dc0884c0289b70a786" +SRC_URI[spmc-0.3.0.sha256sum] = "02a8428da277a8e3a15271d79943e80ccc2ef254e78813a166a08d65e4c3ece5" +SRC_URI[static_assertions-1.1.0.sha256sum] = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +SRC_URI[subtle-2.4.1.sha256sum] = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +SRC_URI[syn-1.0.107.sha256sum] = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" +SRC_URI[tempfile-3.3.0.sha256sum] = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +SRC_URI[termcolor-1.1.3.sha256sum] = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +SRC_URI[thiserror-1.0.38.sha256sum] = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +SRC_URI[thiserror-impl-1.0.38.sha256sum] = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" +SRC_URI[threadpool-1.8.1.sha256sum] = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +SRC_URI[time-0.3.17.sha256sum] = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" +SRC_URI[time-core-0.1.0.sha256sum] = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" +SRC_URI[time-macros-0.2.6.sha256sum] = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" +SRC_URI[typenum-1.16.0.sha256sum] = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +SRC_URI[unicode-ident-1.0.6.sha256sum] = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" +SRC_URI[urlencoding-2.1.2.sha256sum] = "e8db7427f936968176eaa7cdf81b7f98b980b18495ec28f1b5791ac3bfe3eea9" +SRC_URI[uuid-0.8.2.sha256sum] = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +SRC_URI[version_check-0.9.4.sha256sum] = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +SRC_URI[wasi-0.11.0+wasi-snapshot-preview1.sha256sum] = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +SRC_URI[winapi-0.3.9.sha256sum] = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +SRC_URI[winapi-i686-pc-windows-gnu-0.4.0.sha256sum] = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +SRC_URI[winapi-util-0.1.5.sha256sum] = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +SRC_URI[winapi-x86_64-pc-windows-gnu-0.4.0.sha256sum] = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +SRC_URI[windows-sys-0.42.0.sha256sum] = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +SRC_URI[windows_aarch64_gnullvm-0.42.0.sha256sum] = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" +SRC_URI[windows_aarch64_msvc-0.42.0.sha256sum] = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" +SRC_URI[windows_i686_gnu-0.42.0.sha256sum] = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" +SRC_URI[windows_i686_msvc-0.42.0.sha256sum] = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" +SRC_URI[windows_x86_64_gnu-0.42.0.sha256sum] = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" +SRC_URI[windows_x86_64_gnullvm-0.42.0.sha256sum] = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" +SRC_URI[windows_x86_64_msvc-0.42.0.sha256sum] = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" diff --git a/meta-python/recipes-devtools/python/python3-pyruvate/0001-check-for-mips-targets-for-stat.st_dev-definitions.patch b/meta-python/recipes-devtools/python/python3-pyruvate/0001-check-for-mips-targets-for-stat.st_dev-definitions.patch 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..297eecad0e --- /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=${UNPACKDIR}/cargo_home/bitbake/nix-0.23.2/ \ + file://0001-musl-Define-SOCK_NONBLOCK-with-O_NONBLOCK.patch;patchdir=${UNPACKDIR}/cargo_home/bitbake/libc-0.2.138/ \ + file://0001-musl-riscv32-Define-F_SETLK-F_SETLKW-and-fix-F_GETLK.patch;patchdir=${UNPACKDIR}/cargo_home/bitbake/libc-0.2.138/ \ + file://0001-musl-Move-F_OFD_GETLK-F_OFD_SETLK-and-F_OFD_SETLKW-t.patch;patchdir=${UNPACKDIR}/cargo_home/bitbake/libc-0.2.138/ \ + file://0001-musl-Define-O_LARGEFILE-for-riscv32.patch;patchdir=${UNPACKDIR}/cargo_home/bitbake/libc-0.2.138/ \ + file://0001-musl-Define-SOCK_SEQPACKET-in-common-place.patch;patchdir=${UNPACKDIR}/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=${UNPACKDIR}/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.1.1.bb b/meta-python/recipes-devtools/python/python3-pyscaffold_4.5.bb index 9769cd6b98..dda81e2256 100644 --- a/meta-python/recipes-devtools/python/python3-pyscaffold_4.1.1.bb +++ b/meta-python/recipes-devtools/python/python3-pyscaffold_4.5.bb @@ -5,18 +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] = "8972252fda90d1020a93f1e99db370c002d18f52ff2fca9c3cc2a0aee74d07ad" - -BBCLASSEXTEND = "native nativesdk" - 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 4766d92266..ade137a385 100644 --- a/meta-python/recipes-devtools/python/python3-pyserial_3.5.bb +++ b/meta-python/recipes-devtools/python/python3-pyserial_3.5.bb @@ -9,6 +9,7 @@ inherit pypi setuptools3 ptest do_install:append() { rm -f ${D}${bindir}/pyserial-miniterm rm -f ${D}${bindir}/pyserial-ports + rm -rf ${D}${bindir}/__pycache__ rmdir ${D}${bindir} } @@ -36,14 +37,14 @@ FILES:${PN}-win32 = " \ " RDEPENDS:${PN} = "\ - ${PYTHON_PN}-fcntl \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-stringold \ - ${PYTHON_PN}-threading \ + python3-fcntl \ + python3-io \ + python3-logging \ + python3-netclient \ + python3-numbers \ + python3-shell \ + python3-stringold \ + python3-threading \ " BBCLASSEXTEND = "native nativesdk" @@ -53,7 +54,8 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-pysocks_1.7.1.bb b/meta-python/recipes-devtools/python/python3-pysocks_1.7.1.bb deleted file mode 100644 index 9144401703..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.54.bb b/meta-python/recipes-devtools/python/python3-pysonos_0.0.54.bb index e8d75e9d75..6a484b8ae9 100644 --- a/meta-python/recipes-devtools/python/python3-pysonos_0.0.54.bb +++ b/meta-python/recipes-devtools/python/python3-pysonos_0.0.54.bb @@ -9,7 +9,7 @@ SRC_URI[sha256sum] = "2a72897cfd342382573632d80d38776884a38c8d02353d9d5da4e9e8e8 inherit pypi setuptools3 RDEPENDS:${PN} += "\ - ${PYTHON_PN}-ifaddr \ - ${PYTHON_PN}-requests \ - ${PYTHON_PN}-xmltodict \ + python3-ifaddr \ + python3-requests \ + python3-xmltodict \ " diff --git a/meta-python/recipes-devtools/python/python3-pystache/0001-Modernize-python-versions-remove-py2x-and-fix-tests-.patch b/meta-python/recipes-devtools/python/python3-pystache/0001-Modernize-python-versions-remove-py2x-and-fix-tests-.patch deleted file mode 100644 index d268cc5cd9..0000000000 --- a/meta-python/recipes-devtools/python/python3-pystache/0001-Modernize-python-versions-remove-py2x-and-fix-tests-.patch +++ /dev/null @@ -1,4150 +0,0 @@ -From 8bb1ac2d81f697598a766714f2c439d78c85d71e Mon Sep 17 00:00:00 2001 -From: Stephen L Arnold <nerdboy@gentoo.org> -Date: Sat, 7 Nov 2020 12:38:33 -0800 -Subject: [PATCH] Modernize python versions (remove py2x) and fix tests, update - spec - -* migrate to github actions for CI, add conda recipe/workflow -* fix document processing, update pandoc args and history -* convert doctests and modules to py3 -* convert packaging/setup.py to pep517, keep doc processing -* cleanup tox cfg, add coverage, readme status -* add pep8speaks cfg, cleanup warnings, use correct env -* update setup_description.rst for packaging -* set version for test release => 0.6.0 and deploy - -Upstream-Status: Backport [https://github.com/defunkt/pystache/pull/214] -Signed-off-by: Stephen L Arnold <nerdboy@gentoo.org> ---- - .coveragerc | 38 +++ - .gitchangelog.rc | 295 +++++++++++++++++++++ - .github/workflows/ci.yml | 73 ++++++ - .github/workflows/conda.yml | 55 ++++ - .github/workflows/release.yml | 94 +++++++ - .github/workflows/wheels.yml | 82 ++++++ - .pep8speaks.yml | 15 ++ - HISTORY.md | 37 ++- - MANIFEST.in | 8 +- - README.md | 141 +++++----- - TODO.md | 5 +- - conda/meta.yaml | 50 ++++ - pyproject.toml | 3 + - pystache/__init__.py | 2 +- - pystache/commands/render.py | 4 +- - pystache/common.py | 13 +- - pystache/defaults.py | 2 +- - pystache/loader.py | 14 +- - pystache/parsed.py | 6 +- - pystache/parser.py | 20 +- - pystache/renderengine.py | 2 +- - pystache/renderer.py | 22 +- - pystache/specloader.py | 2 +- - pystache/tests/benchmark.py | 15 +- - pystache/tests/common.py | 10 +- - pystache/tests/examples/unicode_output.py | 2 +- - pystache/tests/main.py | 28 +- - pystache/tests/spectesting.py | 16 +- - pystache/tests/test___init__.py | 4 +- - pystache/tests/test_commands.py | 2 +- - pystache/tests/test_defaults.py | 18 +- - pystache/tests/test_examples.py | 40 +-- - pystache/tests/test_loader.py | 46 ++-- - pystache/tests/test_pystache.py | 6 +- - pystache/tests/test_renderengine.py | 148 +++++------ - pystache/tests/test_renderer.py | 86 +++---- - pystache/tests/test_simple.py | 20 +- - pystache/tests/test_specloader.py | 60 ++--- - setup.cfg | 74 +++++- - setup.py | 134 +--------- - setup_description.rst | 297 +++++++++++++--------- - tox.ini | 118 +++++++-- - travis.yml_disabled | 52 ++++ - 43 files changed, 1487 insertions(+), 672 deletions(-) - create mode 100644 .coveragerc - create mode 100644 .gitchangelog.rc - create mode 100644 .github/workflows/ci.yml - create mode 100644 .github/workflows/conda.yml - create mode 100644 .github/workflows/release.yml - create mode 100644 .github/workflows/wheels.yml - create mode 100644 .pep8speaks.yml - create mode 100644 conda/meta.yaml - create mode 100644 pyproject.toml - create mode 100644 travis.yml_disabled - -diff --git a/.coveragerc b/.coveragerc -new file mode 100644 -index 0000000..9a336dd ---- /dev/null -+++ b/.coveragerc -@@ -0,0 +1,38 @@ -+# .coveragerc to control coverage.py -+[run] -+branch = True -+ -+source = pystache -+ -+omit = -+ .tox/* -+ setup.py -+ pystache/tests/* -+ -+#plugins = -+# coverage_python_version -+ -+[report] -+# must set this to True to see missing -+#show_missing = True -+ -+# Regexes for lines to exclude from consideration -+exclude_lines = -+ # Have to re-enable the standard pragma -+ pragma: no cover -+ -+ # Don't complain about missing debug-only code: -+ def __repr__ -+ if self\.debug -+ -+ # Don't complain if tests don't hit defensive assertion code: -+ raise AssertionError -+ raise NotImplementedError -+ -+ # Don't complain if non-runnable code isn't run: -+ if 0: -+ -+ignore_errors = True -+ -+[html] -+directory = cover -diff --git a/.gitchangelog.rc b/.gitchangelog.rc -new file mode 100644 -index 0000000..5cf63a0 ---- /dev/null -+++ b/.gitchangelog.rc -@@ -0,0 +1,295 @@ -+# -*- coding: utf-8; mode: python -*- -+## -+## Format -+## -+## ACTION: [AUDIENCE:] COMMIT_MSG [!TAG ...] -+## -+## Description -+## -+## ACTION is one of 'chg', 'fix', 'new' -+## -+## Is WHAT the change is about. -+## -+## 'chg' is for refactor, small improvement, cosmetic changes... -+## 'fix' is for bug fixes -+## 'new' is for new features, big improvement -+## -+## AUDIENCE is optional and one of 'dev', 'usr', 'pkg', 'test', 'doc' -+## -+## Is WHO is concerned by the change. -+## -+## 'dev' is for developpers (API changes, refactors...) -+## 'usr' is for final users (UI changes) -+## 'pkg' is for packagers (packaging changes) -+## 'test' is for testers (test only related changes) -+## 'doc' is for doc guys (doc only changes) -+## -+## COMMIT_MSG is ... well ... the commit message itself. -+## -+## TAGs are additionnal adjective as 'refactor' 'minor' 'cosmetic' -+## -+## They are preceded with a '!' or a '@' (prefer the former, as the -+## latter is wrongly interpreted in github.) Commonly used tags are: -+## -+## 'refactor' is obviously for refactoring code only -+## 'minor' is for a very meaningless change (a typo, adding a comment) -+## 'cosmetic' is for cosmetic driven change (re-indentation, 80-col...) -+## 'wip' is for partial functionality but complete subfunctionality. -+## -+## Example: -+## -+## new: usr: support of bazaar implemented -+## chg: re-indentend some lines !cosmetic -+## new: dev: updated code to be compatible with last version of killer lib. -+## fix: pkg: updated year of licence coverage. -+## new: test: added a bunch of test around user usability of feature X. -+## fix: typo in spelling my name in comment. !minor -+## -+## Please note that multi-line commit message are supported, and only the -+## first line will be considered as the "summary" of the commit message. So -+## tags, and other rules only applies to the summary. The body of the commit -+## message will be displayed in the changelog without reformatting. -+ -+ -+## -+## ``ignore_regexps`` is a line of regexps -+## -+## Any commit having its full commit message matching any regexp listed here -+## will be ignored and won't be reported in the changelog. -+## -+ignore_regexps = [ -+ r'@minor', r'!minor', -+ r'@cosmetic', r'!cosmetic', -+ r'@refactor', r'!refactor', -+ r'@wip', r'!wip', -+ r'^([cC]hg|[fF]ix|[nN]ew)\s*:\s*[p|P]kg:', -+ r'^([cC]hg|[fF]ix|[nN]ew)\s*:\s*[d|D]ev:', -+ r'^(.{3,3}\s*:)?\s*[fF]irst commit.?\s*$', -+ r'^$', ## ignore commits with empty messages -+] -+ -+ -+## ``section_regexps`` is a list of 2-tuples associating a string label and a -+## list of regexp -+## -+## Commit messages will be classified in sections thanks to this. Section -+## titles are the label, and a commit is classified under this section if any -+## of the regexps associated is matching. -+## -+## Please note that ``section_regexps`` will only classify commits and won't -+## make any changes to the contents. So you'll probably want to go check -+## ``subject_process`` (or ``body_process``) to do some changes to the subject, -+## whenever you are tweaking this variable. -+## -+section_regexps = [ -+ ('New', [ -+ r'^[nN]ew\s*:\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$', -+ ]), -+ ('Features', [ -+ r'^([nN]ew|[fF]eat)\s*:\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$', -+ ]), -+ ('Changes', [ -+ r'^[cC]hg\s*:\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$', -+ ]), -+ ('Fixes', [ -+ r'^[fF]ix\s*:\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$', -+ ]), -+ -+ ('Other', None ## Match all lines -+ ), -+] -+ -+ -+## ``body_process`` is a callable -+## -+## This callable will be given the original body and result will -+## be used in the changelog. -+## -+## Available constructs are: -+## -+## - any python callable that take one txt argument and return txt argument. -+## -+## - ReSub(pattern, replacement): will apply regexp substitution. -+## -+## - Indent(chars=" "): will indent the text with the prefix -+## Please remember that template engines gets also to modify the text and -+## will usually indent themselves the text if needed. -+## -+## - Wrap(regexp=r"\n\n"): re-wrap text in separate paragraph to fill 80-Columns -+## -+## - noop: do nothing -+## -+## - ucfirst: ensure the first letter is uppercase. -+## (usually used in the ``subject_process`` pipeline) -+## -+## - final_dot: ensure text finishes with a dot -+## (usually used in the ``subject_process`` pipeline) -+## -+## - strip: remove any spaces before or after the content of the string -+## -+## - SetIfEmpty(msg="No commit message."): will set the text to -+## whatever given ``msg`` if the current text is empty. -+## -+## Additionally, you can `pipe` the provided filters, for instance: -+#body_process = Wrap(regexp=r'\n(?=\w+\s*:)') | Indent(chars=" ") -+#body_process = Wrap(regexp=r'\n(?=\w+\s*:)') -+#body_process = noop -+body_process = ReSub(r'((^|\n)[A-Z]\w+(-\w+)*: .*(\n\s+.*)*)+$', r'') | strip -+ -+ -+## ``subject_process`` is a callable -+## -+## This callable will be given the original subject and result will -+## be used in the changelog. -+## -+## Available constructs are those listed in ``body_process`` doc. -+subject_process = (strip | -+ ReSub(r'^([cC]hg|[fF]ix|[nN]ew)\s*:\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n@]*)(@[a-z]+\s+)*$', r'\4') | -+ SetIfEmpty("No commit message.") | ucfirst | final_dot) -+ -+ -+## ``tag_filter_regexp`` is a regexp -+## -+## Tags that will be used for the changelog must match this regexp. -+## -+#tag_filter_regexp = r'^v?[0-9]+\.[0-9]+(\.[0-9]+)?$' -+tag_filter_regexp = r'^[0-9]+\.[0-9]+(\.[0-9]+)?$' -+ -+ -+## ``unreleased_version_label`` is a string or a callable that outputs a string -+## -+## This label will be used as the changelog Title of the last set of changes -+## between last valid tag and HEAD if any. -+unreleased_version_label = "(unreleased)" -+#unreleased_version_label = lambda: swrap( -+# ["git", "describe", "--tags"], -+#shell=False) -+ -+ -+## ``output_engine`` is a callable -+## -+## This will change the output format of the generated changelog file -+## -+## Available choices are: -+## -+## - rest_py -+## -+## Legacy pure python engine, outputs ReSTructured text. -+## This is the default. -+## -+## - mustache(<template_name>) -+## -+## Template name could be any of the available templates in -+## ``templates/mustache/*.tpl``. -+## Requires python package ``pystache``. -+## Examples: -+## - mustache("markdown") -+## - mustache("restructuredtext") -+## -+## - makotemplate(<template_name>) -+## -+## Template name could be any of the available templates in -+## ``templates/mako/*.tpl``. -+## Requires python package ``mako``. -+## Examples: -+## - makotemplate("restructuredtext") -+## -+#output_engine = rest_py -+#output_engine = mustache("restructuredtext") -+output_engine = mustache("markdown") -+#output_engine = makotemplate("restructuredtext") -+ -+ -+## ``include_merge`` is a boolean -+## -+## This option tells git-log whether to include merge commits in the log. -+## The default is to include them. -+include_merge = True -+ -+ -+## ``log_encoding`` is a string identifier -+## -+## This option tells gitchangelog what encoding is outputed by ``git log``. -+## The default is to be clever about it: it checks ``git config`` for -+## ``i18n.logOutputEncoding``, and if not found will default to git's own -+## default: ``utf-8``. -+#log_encoding = 'utf-8' -+ -+ -+## ``publish`` is a callable -+## -+## Sets what ``gitchangelog`` should do with the output generated by -+## the output engine. ``publish`` is a callable taking one argument -+## that is an interator on lines from the output engine. -+## -+## Some helper callable are provided: -+## -+## Available choices are: -+## -+## - stdout -+## -+## Outputs directly to standard output -+## (This is the default) -+## -+## - FileInsertAtFirstRegexMatch(file, pattern, idx=lamda m: m.start(), flags) -+## -+## Creates a callable that will parse given file for the given -+## regex pattern and will insert the output in the file. -+## ``idx`` is a callable that receive the matching object and -+## must return a integer index point where to insert the -+## the output in the file. Default is to return the position of -+## the start of the matched string. -+## -+## - FileRegexSubst(file, pattern, replace, flags) -+## -+## Apply a replace inplace in the given file. Your regex pattern must -+## take care of everything and might be more complex. Check the README -+## for a complete copy-pastable example. -+## -+# publish = FileInsertIntoFirstRegexMatch( -+# "CHANGELOG.rst", -+# r'/(?P<rev>[0-9]+\.[0-9]+(\.[0-9]+)?)\s+\([0-9]+-[0-9]{2}-[0-9]{2}\)\n--+\n/', -+# idx=lambda m: m.start(1) -+# ) -+#publish = stdout -+ -+ -+## ``revs`` is a list of callable or a list of string -+## -+## callable will be called to resolve as strings and allow dynamical -+## computation of these. The result will be used as revisions for -+## gitchangelog (as if directly stated on the command line). This allows -+## to filter exaclty which commits will be read by gitchangelog. -+## -+## To get a full documentation on the format of these strings, please -+## refer to the ``git rev-list`` arguments. There are many examples. -+## -+## Using callables is especially useful, for instance, if you -+## are using gitchangelog to generate incrementally your changelog. -+## -+## Some helpers are provided, you can use them:: -+## -+## - FileFirstRegexMatch(file, pattern): will return a callable that will -+## return the first string match for the given pattern in the given file. -+## If you use named sub-patterns in your regex pattern, it'll output only -+## the string matching the regex pattern named "rev". -+## -+## - Caret(rev): will return the rev prefixed by a "^", which is a -+## way to remove the given revision and all its ancestor. -+## -+## Please note that if you provide a rev-list on the command line, it'll -+## replace this value (which will then be ignored). -+## -+## If empty, then ``gitchangelog`` will act as it had to generate a full -+## changelog. -+## -+## The default is to use all commits to make the changelog. -+#revs = ["^1.0.3", ] -+#revs = [ -+# Caret( -+# FileFirstRegexMatch( -+# "CHANGELOG.rst", -+# r"(?P<rev>[0-9]+\.[0-9]+(\.[0-9]+)?)\s+\([0-9]+-[0-9]{2}-[0-9]{2}\)\n--+\n")), -+# "HEAD" -+#] -+revs = [] -diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml -new file mode 100644 -index 0000000..356dd2c ---- /dev/null -+++ b/.github/workflows/ci.yml -@@ -0,0 +1,73 @@ -+# This workflow will install Python dependencies, run tests and lint with a variety of Python versions -+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions -+ -+name: ci -+ -+on: -+ push: -+ branches: [ master ] -+ pull_request: -+ branches: [ master ] -+ -+jobs: -+ build: -+ -+ runs-on: ${{ matrix.os }} -+ defaults: -+ run: -+ shell: bash -+ env: -+ OS: ${{ matrix.os }} -+ PYTHON: ${{ matrix.python-version }} -+ PYTHONIOENCODING: utf-8 -+ PIP_DOWNLOAD_CACHE: ${{ github.workspace }}/../.pip_download_cache -+ strategy: -+ fail-fast: false -+ matrix: -+ os: [ubuntu-20.04, macos-latest, windows-latest] -+ python-version: [3.6, 3.7, 3.8, 3.9] -+ steps: -+ - name: Set git crlf/eol -+ run: | -+ git config --global core.autocrlf false -+ git config --global core.eol lf -+ -+ - uses: actions/checkout@v2 -+ with: -+ submodules: True -+ -+ - name: Set up Python ${{ matrix.python-version }} -+ uses: actions/setup-python@v2 -+ with: -+ python-version: ${{ matrix.python-version }} -+ -+ - name: Install dependencies -+ run: | -+ python -m pip install --upgrade pip -+ pip install tox tox-gh-actions -+ -+ - name: Run tests with coverage -+ run: | -+ tox -+ env: -+ PLATFORM: ${{ matrix.os }} -+ -+ - name: Upload coverage to Codecov -+ uses: codecov/codecov-action@v1 -+ with: -+ env_vars: OS,PYTHON -+ -+ - name: Test with specs and pystache-test -+ run: | -+ tox -e setup . ext/spec/specs -+ -+ - name: Check pkg builds -+ run: | -+ tox -e deploy -+ -+ - name: Check docs -+ if: runner.os == 'Linux' -+ run: | -+ sudo apt-get -qq update -+ sudo apt-get install -y pandoc -+ tox -e docs -diff --git a/.github/workflows/conda.yml b/.github/workflows/conda.yml -new file mode 100644 -index 0000000..261f9ad ---- /dev/null -+++ b/.github/workflows/conda.yml -@@ -0,0 +1,55 @@ -+name: Conda -+ -+on: -+ workflow_dispatch: -+ pull_request: -+ push: -+ branches: -+ - master -+ -+jobs: -+ build: -+ strategy: -+ fail-fast: false -+ matrix: -+ platform: [ubuntu-18.04, windows-latest, macos-latest] -+ python-version: [3.6, 3.7, 3.8, 3.9] -+ -+ runs-on: ${{ matrix.platform }} -+ -+ # The setup-miniconda action needs this to activate miniconda -+ defaults: -+ run: -+ shell: "bash -l {0}" -+ -+ steps: -+ - uses: actions/checkout@v2 -+ with: -+ fetch-depth: 0 -+ -+ - name: Cache conda -+ uses: actions/cache@v1 -+ with: -+ path: ~/conda_pkgs_dir -+ key: ${{matrix.os}}-conda-pkgs-${{hashFiles('**/conda/meta.yaml')}} -+ -+ - name: Get conda -+ uses: conda-incubator/setup-miniconda@v2 -+ with: -+ python-version: ${{ matrix.python-version }} -+ channels: conda-forge -+ channel-priority: strict -+ use-only-tar-bz2: true -+ auto-activate-base: true -+ -+ - name: Prepare -+ run: conda install conda-build conda-verify -+ -+ - name: Build -+ run: conda build conda -+ -+ - name: Install -+ run: conda install -c ${CONDA_PREFIX}/conda-bld/ pystache -+ -+ - name: Test -+ run: python test_pystache.py -diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml -new file mode 100644 -index 0000000..f33c4b5 ---- /dev/null -+++ b/.github/workflows/release.yml -@@ -0,0 +1,94 @@ -+name: Release -+ -+on: -+ push: -+ # release on tag push -+ tags: -+ - '*' -+ -+jobs: -+ wheels: -+ -+ runs-on: ${{ matrix.os }} -+ defaults: -+ run: -+ shell: bash -+ env: -+ PYTHONIOENCODING: utf-8 -+ strategy: -+ fail-fast: false -+ matrix: -+ os: [ubuntu-18.04, macos-latest, windows-latest] -+ python-version: [3.6, 3.7, 3.8, 3.9] -+ exclude: -+ - os: windows-latest -+ python-version: 2.7 -+ -+ steps: -+ - name: Set git crlf/eol -+ run: | -+ git config --global core.autocrlf false -+ git config --global core.eol lf -+ -+ - uses: actions/checkout@v2 -+ with: -+ fetch-depth: 0 -+ -+ - name: Set up Python ${{ matrix.python-version }} -+ uses: actions/setup-python@v2 -+ with: -+ python-version: ${{ matrix.python-version }} -+ -+ - name: Install dependencies -+ run: | -+ python -m pip install --upgrade pip wheel -+ pip install tox tox-gh-actions -+ -+ - name: Build dist pkgs -+ run: | -+ tox -e deploy -+ -+ - name: Upload artifacts -+ if: matrix.python-version == 3.7 && runner.os == 'Linux' -+ uses: actions/upload-artifact@v2 -+ with: -+ name: wheels -+ path: ./dist/*.whl -+ -+ create_release: -+ name: Create Release -+ needs: [wheels] -+ runs-on: ubuntu-18.04 -+ -+ steps: -+ - name: Get version -+ id: get_version -+ run: | -+ echo "VERSION=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV -+ echo ${{ env.VERSION }} -+ -+ - uses: actions/checkout@v2 -+ with: -+ fetch-depth: 0 -+ -+ # download all artifacts to project dir -+ - uses: actions/download-artifact@v2 -+ -+ - name: Generate changes file -+ uses: sarnold/gitchangelog-action@master -+ with: -+ github_token: ${{ secrets.GITHUB_TOKEN}} -+ -+ - name: Create release -+ id: create_release -+ uses: softprops/action-gh-release@v1 -+ env: -+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -+ with: -+ tag_name: ${{ env.VERSION }} -+ name: Release v${{ env.VERSION }} -+ body_path: CHANGES.md -+ draft: false -+ prerelease: false -+ files: | -+ wheels/pystache*.whl -diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml -new file mode 100644 -index 0000000..58f0c5e ---- /dev/null -+++ b/.github/workflows/wheels.yml -@@ -0,0 +1,82 @@ -+name: Wheels -+ -+on: -+ workflow_dispatch: -+ pull_request: -+ #push: -+ #branches: [ master ] -+ -+jobs: -+ build: -+ -+ runs-on: ${{ matrix.os }} -+ defaults: -+ run: -+ shell: bash -+ env: -+ PYTHONIOENCODING: utf-8 -+ strategy: -+ fail-fast: false -+ matrix: -+ os: [ubuntu-18.04, macos-latest, windows-latest] -+ python-version: [3.6, 3.7, 3.8, 3.9] -+ -+ steps: -+ - name: Set git crlf/eol -+ run: | -+ git config --global core.autocrlf false -+ git config --global core.eol lf -+ -+ - uses: actions/checkout@v2 -+ with: -+ fetch-depth: 0 -+ -+ - name: Set up Python ${{ matrix.python-version }} -+ uses: actions/setup-python@v2 -+ with: -+ python-version: ${{ matrix.python-version }} -+ -+ - name: Install dependencies -+ run: | -+ python -m pip install --upgrade pip wheel -+ pip install tox tox-gh-actions -+ -+ - name: Build dist pkgs -+ run: | -+ tox -e deploy -+ -+ - name: Upload artifacts -+ if: matrix.python-version == 3.7 && runner.os == 'Linux' -+ uses: actions/upload-artifact@v2 -+ with: -+ name: wheels -+ path: ./dist/*.whl -+ -+ check_artifact: -+ name: Check wheel artifact -+ needs: [build] -+ runs-on: ${{ matrix.os }} -+ defaults: -+ run: -+ shell: bash -+ env: -+ PYTHONIOENCODING: utf-8 -+ strategy: -+ fail-fast: false -+ matrix: -+ os: [ubuntu-18.04, macos-latest, windows-latest] -+ python-version: [3.6, 3.8, 3.9] -+ -+ steps: -+ - name: Set up Python ${{ matrix.python-version }} -+ uses: actions/setup-python@v2 -+ with: -+ python-version: ${{ matrix.python-version }} -+ -+ # download all artifacts to project dir -+ - uses: actions/download-artifact@v2 -+ -+ - name: Check wheel install -+ run: | -+ bash -c 'export WHL=$(ls wheels/*.whl); python -m pip install $WHL' -+ pystache-test -diff --git a/.pep8speaks.yml b/.pep8speaks.yml -new file mode 100644 -index 0000000..e841b66 ---- /dev/null -+++ b/.pep8speaks.yml -@@ -0,0 +1,15 @@ -+scanner: -+ linter: flake8 # Other option is pycodestyle -+ -+no_blank_comment: False # If True, no comment is made on PR without any errors. -+descending_issues_order: True # If True, PEP 8 issues in message will be displayed in descending order of line numbers in the file -+ -+[flake8] -+exclude = -+ .git, -+ .github, -+ __pycache__, -+ build, -+ dist -+ -+max-line-length = 110 -diff --git a/HISTORY.md b/HISTORY.md -index e5b7638..60b6308 100644 ---- a/HISTORY.md -+++ b/HISTORY.md -@@ -1,7 +1,42 @@ - History - ======= - --**Note:** Official support for Python 2.4 will end with Pystache version 0.6.0. -+**Note:** Official support for Python 2.7 will end with Pystache version 0.6.0. -+ -+0.6.0 (2021-03-04) -+------------------ -+ -+- Bump spec versions to latest => v1.1.3 -+- Modernize python and CI tools, update docs/doctests -+- Update unicode conversion test for py3-only -+- Add pep8speaks cfg, cleanup warnings -+- Remove superfluous setup test/unused imports -+- Add conda recipe/CI build -+ -+0.5.6 (2021-02-28) -+------------------ -+ -+- Use correct wheel name in release workflow, limit wheels -+- Add install check/test of downloaded wheel -+- Update/add ci workflows and tox cfg, bump to next dev0 version -+ -+0.5.5 (2020-12-16) -+------------------ -+ -+- fix document processing, update pandoc args and history -+- add release.yml to CI, test env settings -+- fix bogus commit message, update versions and tox cf -+- add post-test steps for building pkgs with/without doc updates -+- add CI build check, fix MANIFEST.in pruning -+ -+0.5.4-2 (2020-11-09) -+-------------------- -+ -+- Merge pull request #1 from sarnold/rebase-up -+- Bugfix: test_specloader.py: fix test_find__with_directory on other OSs -+- Bugfix: pystache/loader.py: remove stray windows line-endings -+- fix crufty (and insecure) http urls -+- Bugfix: modernize python versions (keep py27) and fix spec_test load cmd - - 0.5.4 (2014-07-11) - ------------------ -diff --git a/MANIFEST.in b/MANIFEST.in -index bdc64bf..1593143 100644 ---- a/MANIFEST.in -+++ b/MANIFEST.in -@@ -1,7 +1,4 @@ --include README.md --include HISTORY.md --include LICENSE --include TODO.md -+include README.md HISTORY.md TODO.md LICENSE - include setup_description.rst - include tox.ini - include test_pystache.py -@@ -11,3 +8,6 @@ recursive-include pystache/tests *.mustache *.txt - # We deliberately exclude the gh/ directory because it contains copies - # of resources needed only for the web page hosted on GitHub (via the - # gh-pages branch). -+exclude *.ini *travis* -+prune gh -+prune .git* -diff --git a/README.md b/README.md -index 54a9608..1203b7a 100644 ---- a/README.md -+++ b/README.md -@@ -10,11 +10,25 @@ Pystache - <!-- --> - <!-- We leave the leading brackets empty here. Otherwise, unwanted --> - <!-- caption text shows up in the reST version converted by pandoc. --> --![](http://defunkt.github.com/pystache/images/logo_phillips.png "mustachioed, monocled snake by David Phillips") -+[![ci](https://github.com/sarnold/pystache/actions/workflows/ci.yml/badge.svg)](https://github.com/sarnold/pystache/actions/workflows/ci.yml) -+[![Conda](https://github.com/sarnold/pystache/actions/workflows/conda.yml/badge.svg)](https://github.com/sarnold/pystache/actions/workflows/conda.yml) -+[![Wheels](https://github.com/sarnold/pystache/actions/workflows/wheels.yml/badge.svg)](https://github.com/sarnold/pystache/actions/workflows/wheels.yml) -+[![Release](https://github.com/sarnold/pystache/actions/workflows/release.yml/badge.svg)](https://github.com/sarnold/pystache/actions/workflows/release.yml) -+[![Python](https://img.shields.io/badge/python-3.6+-blue.svg)](https://www.python.org/downloads/) - --![](https://secure.travis-ci.org/defunkt/pystache.png "Travis CI current build status") -+[![Latest release](https://img.shields.io/github/v/release/sarnold/pystache?include_prereleases)](https://github.com/sarnold/pystache/releases/latest) -+[![License](https://img.shields.io/github/license/sarnold/pystache)](https://github.com/sarnold/pystache/blob/master/LICENSE) -+[![Maintainability](https://api.codeclimate.com/v1/badges/a8fa1bf4638bfc6581b6/maintainability)](https://codeclimate.com/github/sarnold/pystache/maintainability) -+[![codecov](https://codecov.io/gh/sarnold/pystache/branch/master/graph/badge.svg?token=5PZNMZBI6K)](https://codecov.io/gh/sarnold/pystache) - --[Pystache](http://defunkt.github.com/pystache) is a Python -+ -+ -+This updated fork of Pystache is currently tested on Python 3.6+ and in -+Conda, on Linux, Macos, and Windows (Python 2.7 support has been removed). -+ -+![](gh/images/logo_phillips_small.png "mustachioed, monocled snake by David Phillips") -+ -+[Pystache](http://sarnold.github.com/pystache) is a Python - implementation of [Mustache](http://mustache.github.com/). Mustache is a - framework-agnostic, logic-free templating system inspired by - [ctemplate](http://code.google.com/p/google-ctemplate/) and -@@ -27,10 +41,10 @@ provides a good introduction to Mustache's syntax. For a more complete - (and more current) description of Mustache's behavior, see the official - [Mustache spec](https://github.com/mustache/spec). - --Pystache is [semantically versioned](http://semver.org) and can be found --on [PyPI](http://pypi.python.org/pypi/pystache). This version of --Pystache passes all tests in [version --1.1.2](https://github.com/mustache/spec/tree/v1.1.2) of the spec. -+Pystache is [semantically versioned](http://semver.org) and older versions -+can still be found on [PyPI](http://pypi.python.org/pypi/pystache). This -+version of Pystache now passes all tests in [version -+1.1.3](https://github.com/mustache/spec/tree/v1.1.3) of the spec. - - - Requirements -@@ -38,41 +52,25 @@ Requirements - - Pystache is tested with-- - --- Python 2.4 (requires simplejson [version -- 2.0.9](http://pypi.python.org/pypi/simplejson/2.0.9) or earlier) --- Python 2.5 (requires -- [simplejson](http://pypi.python.org/pypi/simplejson/)) --- Python 2.6 --- Python 2.7 --- Python 3.1 --- Python 3.2 --- Python 3.3 --- [PyPy](http://pypy.org/) -+- Python 3.6 -+- Python 3.7 -+- Python 3.8 -+- Python 3.9 -+- Conda (py36-py39) - - [Distribute](http://packages.python.org/distribute/) (the setuptools fork) --is recommended over [setuptools](http://pypi.python.org/pypi/setuptools), --and is required in some cases (e.g. for Python 3 support). --If you use [pip](http://www.pip-installer.org/), you probably already satisfy --this requirement. -+is no longer required over [setuptools](http://pypi.python.org/pypi/setuptools), -+as the current packaging is now PEP517-compliant. - - JSON support is needed only for the command-line interface and to run --the spec tests. We require simplejson for earlier versions of Python --since Python's [json](http://docs.python.org/library/json.html) module --was added in Python 2.6. -- --For Python 2.4 we require an earlier version of simplejson since --simplejson stopped officially supporting Python 2.4 in simplejson --version 2.1.0. Earlier versions of simplejson can be installed manually, --as follows: -+the spec tests; PyYAML can still be used (see the Develop section). - -- pip install 'simplejson<2.1.0' -- --Official support for Python 2.4 will end with Pystache version 0.6.0. -+Official support for Python 2 will end with Pystache version 0.6.0. - - Install It - ---------- - -- pip install pystache -+ pip install -U pystache -f https://github.com/sarnold/pystache/releases/ - - And test it-- - -@@ -85,12 +83,12 @@ Use It - ------ - - >>> import pystache -- >>> print pystache.render('Hi {{person}}!', {'person': 'Mom'}) -+ >>> print(pystache.render('Hi {{person}}!', {'person': 'Mom'})) - Hi Mom! - - You can also create dedicated view classes to hold your view logic. - --Here's your view class (in .../examples/readme.py): -+Here's your view class (in ../pystache/tests/examples/readme.py): - - class SayHello(object): - def to(self): -@@ -109,7 +107,7 @@ directory as your class definition): - Pull it together: - - >>> renderer = pystache.Renderer() -- >>> print renderer.render(hello) -+ >>> print(renderer.render(hello)) - Hello, Pizza! - - For greater control over rendering (e.g. to specify a custom template -@@ -117,22 +115,22 @@ directory), use the `Renderer` class like above. One can pass attributes - to the Renderer class constructor or set them on a Renderer instance. To - customize template loading on a per-view basis, subclass `TemplateSpec`. - See the docstrings of the --[Renderer](https://github.com/defunkt/pystache/blob/master/pystache/renderer.py) -+[Renderer](https://github.com/sarnold/pystache/blob/master/pystache/renderer.py) - class and --[TemplateSpec](https://github.com/defunkt/pystache/blob/master/pystache/template_spec.py) -+[TemplateSpec](https://github.com/sarnold/pystache/blob/master/pystache/template_spec.py) - class for more information. - - You can also pre-parse a template: - - >>> parsed = pystache.parse(u"Hey {{#who}}{{.}}!{{/who}}") -- >>> print parsed -- [u'Hey ', _SectionNode(key=u'who', index_begin=12, index_end=18, parsed=[_EscapeNode(key=u'.'), u'!'])] -+ >>> print(parsed) -+ ['Hey ', _SectionNode(key='who', index_begin=12, index_end=18, parsed=[_EscapeNode(key='.'), '!'])] - - And then: - -- >>> print renderer.render(parsed, {'who': 'Pops'}) -+ >>> print(renderer.render(parsed, {'who': 'Pops'})) - Hey Pops! -- >>> print renderer.render(parsed, {'who': 'you'}) -+ >>> print(renderer.render(parsed, {'who': 'you'})) - Hey you! - - Python 3 -@@ -194,15 +192,16 @@ To test from a source distribution (without installing)-- - python test_pystache.py - - To test Pystache with multiple versions of Python (with a single --command!), you can use [tox](http://pypi.python.org/pypi/tox): -+command!) and different platforms, you can use [tox](http://pypi.python.org/pypi/tox): -+ -+ pip install tox -+ tox -e setup - -- pip install 'virtualenv<1.8' # Version 1.8 dropped support for Python 2.4. -- pip install 'tox<1.4' # Version 1.4 dropped support for Python 2.4. -- tox -+To run tests on multiple versions with coverage, run: - --If you do not have all Python versions listed in `tox.ini`-- -+ tox -e py38-linux,py39-linux # for example - -- tox -e py26,py32 # for example -+(substitute your platform above, eg, macos or windows) - - The source distribution tests also include doctests and tests from the - Mustache spec. To include tests from the Mustache spec in your test -@@ -217,57 +216,33 @@ parses the json files. To install PyYAML-- - - pip install pyyaml - -+Once the submodule is available, you can run the full test set with: -+ -+ tox -e setup . ext/spec/specs -+ - To run a subset of the tests, you can use - [nose](http://somethingaboutorange.com/mrl/projects/nose/0.11.1/testing.html): - - pip install nose - nosetests --tests pystache/tests/test_context.py:GetValueTests.test_dictionary__key_present - --### Using Python 3 with Pystache from source -- --Pystache is written in Python 2 and must be converted to Python 3 prior to --using it with Python 3. The installation process (and tox) do this --automatically. - --To convert the code to Python 3 manually (while using Python 3)-- -+Mailing List (old) -+------------------ - -- python setup.py build -- --This writes the converted code to a subdirectory called `build`. --By design, Python 3 builds --[cannot](https://bitbucket.org/tarek/distribute/issue/292/allow-use_2to3-with-python-2) --be created from Python 2. -- --To convert the code without using setup.py, you can use --[2to3](http://docs.python.org/library/2to3.html) as follows (two steps)-- -- -- 2to3 --write --nobackups --no-diffs --doctests_only pystache -- 2to3 --write --nobackups --no-diffs pystache -- --This converts the code (and doctests) in place. -- --To `import pystache` from a source distribution while using Python 3, be --sure that you are importing from a directory containing a converted --version of the code (e.g. from the `build` directory after converting), --and not from the original (unconverted) source directory. Otherwise, you will --get a syntax error. You can help prevent this by not running the Python --IDE from the project directory when importing Pystache while using Python 3. -- -- --Mailing List -------------- -- --There is a [mailing list](http://librelist.com/browser/pystache/). Note -+There is(was) a [mailing list](http://librelist.com/browser/pystache/). Note - that there is a bit of a delay between posting a message and seeing it - appear in the mailing list archive. - - Credits - ------- - -- >>> context = { 'author': 'Chris Wanstrath', 'maintainer': 'Chris Jerdonek' } -- >>> print pystache.render("Author: {{author}}\nMaintainer: {{maintainer}}", context) -+ >>> import pystache -+ >>> context = { 'author': 'Chris Wanstrath', 'maintainer': 'Chris Jerdonek','refurbisher': 'Steve Arnold' } -+ >>> print(pystache.render("Author: {{author}}\nMaintainer: {{maintainer}}\nRefurbisher: {{refurbisher}}", context)) - Author: Chris Wanstrath - Maintainer: Chris Jerdonek -+ Refurbisher: Steve Arnold - - Pystache logo by [David Phillips](http://davidphillips.us/) is licensed - under a [Creative Commons Attribution-ShareAlike 3.0 Unported -diff --git a/TODO.md b/TODO.md -index cd82417..76853a4 100644 ---- a/TODO.md -+++ b/TODO.md -@@ -6,11 +6,10 @@ In development branch: - * Figure out a way to suppress center alignment of images in reST output. - * Add a unit test for the change made in 7ea8e7180c41. This is with regard - to not requiring spec tests when running tests from a downloaded sdist. --* End support for Python 2.4. --* Add Python 3.3 to tox file (after deprecating 2.4). -+* End support for Python 2.7 (done as of 03/03/21 - SA) -+* Release 0.6.0 on github, make a pypi account (SA) - * Turn the benchmarking script at pystache/tests/benchmark.py into a command - in pystache/commands, or make it a subcommand of one of the existing - commands (i.e. using a command argument). - * Provide support for logging in at least one of the commands. --* Make sure command parsing to pystache-test doesn't break with Python 2.4 and earlier. - * Combine pystache-test with the main command. -diff --git a/conda/meta.yaml b/conda/meta.yaml -new file mode 100644 -index 0000000..e7f4fd9 ---- /dev/null -+++ b/conda/meta.yaml -@@ -0,0 +1,50 @@ -+{% set name = "pystache" %} -+{% set version = "0.6.0.dev0" %} -+ -+package: -+ name: {{ name|lower }} -+ version: {{ version }} -+ -+source: -+ path: .. -+ -+build: -+ number: 0 -+ script: {{ PYTHON }} -m pip install . --no-deps --ignore-installed -vvv -+ noarch: python -+ entry_points: -+ - pystache = pystache.commands.render:main -+ - pystache-test = pystache.commands.test:main -+ -+requirements: -+ build: -+ - python -+ - setuptools -+ -+ run: -+ - python -+ -+test: -+ imports: -+ - pystache -+ - pystache.commands -+ - pystache.tests -+ - pystache.tests.data -+ - pystache.tests.data.locator -+ - pystache.tests.examples -+ -+ commands: -+ - pystache --help -+ - pystache-test -+ -+ -+about: -+ home: https://github.com/sarnold/pystache -+ license: MIT -+ license_family: MIT -+ license_file: LICENSE -+ summary: Mustache for Python -+ -+extra: -+ recipe-maintainers: -+ - sarnold -diff --git a/pyproject.toml b/pyproject.toml -new file mode 100644 -index 0000000..2f21011 ---- /dev/null -+++ b/pyproject.toml -@@ -0,0 +1,3 @@ -+[build-system] -+requires = ["setuptools>=40.8.0", "wheel"] -+build-backend = "setuptools.build_meta" -diff --git a/pystache/__init__.py b/pystache/__init__.py -index 4cf2434..5edc1c5 100644 ---- a/pystache/__init__.py -+++ b/pystache/__init__.py -@@ -10,4 +10,4 @@ from pystache.init import parse, render, Renderer, TemplateSpec - - __all__ = ['parse', 'render', 'Renderer', 'TemplateSpec'] - --__version__ = '0.5.4' # Also change in setup.py. -+__version__ = '0.6.0' -diff --git a/pystache/commands/render.py b/pystache/commands/render.py -index 1a9c309..9c913e7 100644 ---- a/pystache/commands/render.py -+++ b/pystache/commands/render.py -@@ -22,7 +22,7 @@ except: - from sys import exc_info - ex_type, ex_value, tb = exc_info() - new_ex = Exception("%s: %s" % (ex_type.__name__, ex_value)) -- raise new_ex.__class__, new_ex, tb -+ raise new_ex.__class__(new_ex).with_traceback(tb) - - # The optparse module is deprecated in Python 2.7 in favor of argparse. - # However, argparse is not available in Python 2.6 and earlier. -@@ -88,7 +88,7 @@ def main(sys_argv=sys.argv): - context = json.loads(context) - - rendered = renderer.render(template, context) -- print rendered -+ print(rendered) - - - if __name__=='__main__': -diff --git a/pystache/common.py b/pystache/common.py -index fb266dd..0e9b091 100644 ---- a/pystache/common.py -+++ b/pystache/common.py -@@ -5,17 +5,12 @@ Exposes functionality needed throughout the project. - - """ - --from sys import version_info - - def _get_string_types(): -- # TODO: come up with a better solution for this. One of the issues here -- # is that in Python 3 there is no common base class for unicode strings -- # and byte strings, and 2to3 seems to convert all of "str", "unicode", -- # and "basestring" to Python 3's "str". -- if version_info < (3, ): -- return basestring -- # The latter evaluates to "bytes" in Python 3 -- even after conversion by 2to3. -- return (unicode, type(u"a".encode('utf-8'))) -+ """ -+ Return the Python3 string type (no more python2) -+ """ -+ return (str, type("a".encode('utf-8'))) - - - _STRING_TYPES = _get_string_types() -diff --git a/pystache/defaults.py b/pystache/defaults.py -index bcfdf4c..2fab0e0 100644 ---- a/pystache/defaults.py -+++ b/pystache/defaults.py -@@ -39,7 +39,7 @@ STRING_ENCODING = sys.getdefaultencoding() - FILE_ENCODING = sys.getdefaultencoding() - - # The delimiters to start with when parsing. --DELIMITERS = (u'{{', u'}}') -+DELIMITERS = ('{{', '}}') - - # How to handle missing tags when rendering a template. - MISSING_TAGS = MissingTags.ignore -diff --git a/pystache/loader.py b/pystache/loader.py -index d4a7e53..ea01d17 100644 ---- a/pystache/loader.py -+++ b/pystache/loader.py -@@ -6,6 +6,7 @@ This module provides a Loader class for locating and reading templates. - """ - - import os -+import platform - import sys - - from pystache import common -@@ -24,7 +25,7 @@ def _make_to_unicode(): - """ - if encoding is None: - encoding = defaults.STRING_ENCODING -- return unicode(s, encoding, defaults.DECODE_ERRORS) -+ return str(s, encoding, defaults.DECODE_ERRORS) - return to_unicode - - -@@ -86,7 +87,7 @@ class Loader(object): - def _make_locator(self): - return Locator(extension=self.extension) - -- def unicode(self, s, encoding=None): -+ def str(self, s, encoding=None): - """ - Convert a string to unicode using the given encoding, and return it. - -@@ -104,8 +105,8 @@ class Loader(object): - Defaults to None. - - """ -- if isinstance(s, unicode): -- return unicode(s) -+ if isinstance(s, str): -+ return str(s) - - return self.to_unicode(s, encoding) - -@@ -118,8 +119,9 @@ class Loader(object): - - if encoding is None: - encoding = self.file_encoding -- -- return self.unicode(b, encoding) -+ if platform.system() == "Windows": -+ return self.str(b, encoding).replace('\r', '') -+ return self.str(b, encoding) - - def load_file(self, file_name): - """ -diff --git a/pystache/parsed.py b/pystache/parsed.py -index 372d96c..75d417d 100644 ---- a/pystache/parsed.py -+++ b/pystache/parsed.py -@@ -41,10 +41,10 @@ class ParsedTemplate(object): - """ - # We avoid use of the ternary operator for Python 2.4 support. - def get_unicode(node): -- if type(node) is unicode: -+ if type(node) is str: - return node - return node.render(engine, context) -- parts = map(get_unicode, self._parse_tree) -+ parts = list(map(get_unicode, self._parse_tree)) - s = ''.join(parts) - -- return unicode(s) -+ return str(s) -diff --git a/pystache/parser.py b/pystache/parser.py -index c6a171f..1afd50a 100644 ---- a/pystache/parser.py -+++ b/pystache/parser.py -@@ -11,8 +11,8 @@ from pystache import defaults - from pystache.parsed import ParsedTemplate - - --END_OF_LINE_CHARACTERS = [u'\r', u'\n'] --NON_BLANK_RE = re.compile(ur'^(.)', re.M) -+END_OF_LINE_CHARACTERS = ['\r', '\n'] -+NON_BLANK_RE = re.compile(r'^(.)', re.M) - - - # TODO: add some unit tests for this. -@@ -30,12 +30,12 @@ def parse(template, delimiters=None): - - Examples: - -- >>> parsed = parse(u"Hey {{#who}}{{name}}!{{/who}}") -- >>> print str(parsed).replace('u', '') # This is a hack to get the test to pass both in Python 2 and 3. -+ >>> parsed = parse("Hey {{#who}}{{name}}!{{/who}}") -+ >>> print(str(parsed).replace('u', '')) # This is an old hack. - ['Hey ', _SectionNode(key='who', index_begin=12, index_end=21, parsed=[_EscapeNode(key='name'), '!'])] - - """ -- if type(template) is not unicode: -+ if type(template) is not str: - raise Exception("Template is not unicode: %s" % type(template)) - parser = _Parser(delimiters) - return parser.parse(template) -@@ -94,7 +94,7 @@ class _CommentNode(object): - return _format(self) - - def render(self, engine, context): -- return u'' -+ return '' - - - class _ChangeNode(object): -@@ -106,7 +106,7 @@ class _ChangeNode(object): - return _format(self) - - def render(self, engine, context): -- return u'' -+ return '' - - - class _EscapeNode(object): -@@ -147,7 +147,7 @@ class _PartialNode(object): - def render(self, engine, context): - template = engine.resolve_partial(self.key) - # Indent before rendering. -- template = re.sub(NON_BLANK_RE, self.indent + ur'\1', template) -+ template = re.sub(NON_BLANK_RE, self.indent + r'\1', template) - - return engine.render(template, context) - -@@ -168,7 +168,7 @@ class _InvertedNode(object): - # Note that lambdas are considered truthy for inverted sections - # per the spec. - if data: -- return u'' -+ return '' - return self.parsed_section.render(engine, context) - - -@@ -218,7 +218,7 @@ class _SectionNode(object): - parts.append(self.parsed.render(engine, context)) - context.pop() - -- return unicode(''.join(parts)) -+ return str(''.join(parts)) - - - class _Parser(object): -diff --git a/pystache/renderengine.py b/pystache/renderengine.py -index c797b17..2f1e341 100644 ---- a/pystache/renderengine.py -+++ b/pystache/renderengine.py -@@ -160,7 +160,7 @@ class RenderEngine(object): - if not is_string(val): - # In case the template is an integer, for example. - val = self.to_str(val) -- if type(val) is not unicode: -+ if type(val) is not str: - val = self.literal(val) - return self.render(val, context, delimiters) - -diff --git a/pystache/renderer.py b/pystache/renderer.py -index ff6a90c..064f040 100644 ---- a/pystache/renderer.py -+++ b/pystache/renderer.py -@@ -32,7 +32,7 @@ class Renderer(object): - >>> partials = {'partial': 'Hello, {{thing}}!'} - >>> renderer = Renderer(partials=partials) - >>> # We apply print to make the test work in Python 3 after 2to3. -- >>> print renderer.render('{{>partial}}', {'thing': 'world'}) -+ >>> print(renderer.render('{{>partial}}', {'thing': 'world'})) - Hello, world! - - To customize string coercion (e.g. to render False values as ''), one can -@@ -130,7 +130,7 @@ class Renderer(object): - if string_encoding is None: - string_encoding = defaults.STRING_ENCODING - -- if isinstance(search_dirs, basestring): -+ if isinstance(search_dirs, str): - search_dirs = [search_dirs] - - self._context = None -@@ -177,16 +177,16 @@ class Renderer(object): - """ - # We type-check to avoid "TypeError: decoding Unicode is not supported". - # We avoid the Python ternary operator for Python 2.4 support. -- if isinstance(s, unicode): -+ if isinstance(s, str): - return s -- return self.unicode(s) -+ return self.str(s) - - def _to_unicode_hard(self, s): - """ - Convert a basestring to a string with type unicode (not subclass). - - """ -- return unicode(self._to_unicode_soft(s)) -+ return str(self._to_unicode_soft(s)) - - def _escape_to_unicode(self, s): - """ -@@ -195,9 +195,9 @@ class Renderer(object): - Returns a unicode string (not subclass). - - """ -- return unicode(self.escape(self._to_unicode_soft(s))) -+ return str(self.escape(self._to_unicode_soft(s))) - -- def unicode(self, b, encoding=None): -+ def str(self, b, encoding=None): - """ - Convert a byte string to unicode, using string_encoding and decode_errors. - -@@ -222,7 +222,7 @@ class Renderer(object): - - # TODO: Wrap UnicodeDecodeErrors with a message about setting - # the string_encoding and decode_errors attributes. -- return unicode(b, encoding, self.decode_errors) -+ return str(b, encoding, self.decode_errors) - - def _make_loader(self): - """ -@@ -230,7 +230,7 @@ class Renderer(object): - - """ - return Loader(file_encoding=self.file_encoding, extension=self.file_extension, -- to_unicode=self.unicode, search_dirs=self.search_dirs) -+ to_unicode=self.str, search_dirs=self.search_dirs) - - def _make_load_template(self): - """ -@@ -299,7 +299,7 @@ class Renderer(object): - try: - return load_partial(name) - except TemplateNotFoundError: -- return u'' -+ return '' - - return resolve_partial - -@@ -316,7 +316,7 @@ class Renderer(object): - try: - return context_get(stack, name) - except KeyNotFoundError: -- return u'' -+ return '' - - return resolve_context - -diff --git a/pystache/specloader.py b/pystache/specloader.py -index 3a77d4c..a82d52a 100644 ---- a/pystache/specloader.py -+++ b/pystache/specloader.py -@@ -83,7 +83,7 @@ class SpecLoader(object): - - """ - if spec.template is not None: -- return self.loader.unicode(spec.template, spec.template_encoding) -+ return self.loader.str(spec.template, spec.template_encoding) - - path = self._find(spec) - -diff --git a/pystache/tests/benchmark.py b/pystache/tests/benchmark.py -index d46e973..6cb54f8 100755 ---- a/pystache/tests/benchmark.py -+++ b/pystache/tests/benchmark.py -@@ -13,6 +13,13 @@ tests/benchmark.py 10000 - import sys - from timeit import Timer - -+try: -+ import chevron as pystache -+ print('Using module: chevron') -+except (ImportError): -+ import pystache -+ print('Using module: pystache') -+ - import pystache - - # TODO: make the example realistic. -@@ -76,17 +83,17 @@ def main(sys_argv): - args = sys_argv[1:] - count = int(args[0]) - -- print "Benchmarking: %sx" % count -- print -+ print("Benchmarking: %sx" % count) -+ print() - - for example in examples: - - test = make_test_function(example) - - t = Timer(test,) -- print min(t.repeat(repeat=3, number=count)) -+ print(min(t.repeat(repeat=3, number=count))) - -- print "Done" -+ print("Done") - - - if __name__ == '__main__': -diff --git a/pystache/tests/common.py b/pystache/tests/common.py -index 222e14f..12b76b5 100644 ---- a/pystache/tests/common.py -+++ b/pystache/tests/common.py -@@ -72,8 +72,8 @@ def _find_files(root_dir, should_include): - # http://docs.python.org/library/os.html#os.walk - for dir_path, dir_names, file_names in os.walk(root_dir): - new_paths = [os.path.join(dir_path, file_name) for file_name in file_names] -- new_paths = filter(is_module, new_paths) -- new_paths = filter(should_include, new_paths) -+ new_paths = list(filter(is_module, new_paths)) -+ new_paths = list(filter(should_include, new_paths)) - paths.extend(new_paths) - - return paths -@@ -183,7 +183,7 @@ class AssertExceptionMixin: - try: - callable(*args, **kwds) - raise Exception("Expected exception: %s: %s" % (exception_type, repr(msg))) -- except exception_type, err: -+ except exception_type as err: - self.assertEqual(str(err), msg) - - -@@ -228,10 +228,10 @@ class Attachable(object): - """ - def __init__(self, **kwargs): - self.__args__ = kwargs -- for arg, value in kwargs.iteritems(): -+ for arg, value in kwargs.items(): - setattr(self, arg, value) - - def __repr__(self): - return "%s(%s)" % (self.__class__.__name__, - ", ".join("%s=%s" % (k, repr(v)) -- for k, v in self.__args__.iteritems())) -+ for k, v in self.__args__.items())) -diff --git a/pystache/tests/examples/unicode_output.py b/pystache/tests/examples/unicode_output.py -index da0e1d2..7bdea36 100644 ---- a/pystache/tests/examples/unicode_output.py -+++ b/pystache/tests/examples/unicode_output.py -@@ -8,4 +8,4 @@ TODO: add a docstring. - class UnicodeOutput(object): - - def name(self): -- return u'Henri Poincaré' -+ return 'Henri Poincaré' -diff --git a/pystache/tests/main.py b/pystache/tests/main.py -index 8af6b2e..17f2fb2 100644 ---- a/pystache/tests/main.py -+++ b/pystache/tests/main.py -@@ -88,7 +88,7 @@ def main(sys_argv): - - """ - # TODO: use logging module -- print "pystache: running tests: argv: %s" % repr(sys_argv) -+ print("pystache: running tests: argv: %s" % repr(sys_argv)) - - should_source_exist = False - spec_test_dir = None -@@ -131,11 +131,9 @@ def main(sys_argv): - module_names = _discover_test_modules(PACKAGE_DIR) - sys_argv.extend(module_names) - if project_dir is not None: -- # Add the current module for unit tests contained here (e.g. -- # to include SetupTests). -+ # Add the current module for unit tests contained here - sys_argv.append(__name__) - -- SetupTests.project_dir = project_dir - - extra_tests = make_extra_tests(project_dir, spec_test_dir) - test_program_class = make_test_program_class(extra_tests) -@@ -166,25 +164,3 @@ def _discover_test_modules(package_dir): - raise Exception("No unit-test modules found--\n in %s" % package_dir) - - return names -- -- --class SetupTests(TestCase): -- -- """Tests about setup.py.""" -- -- project_dir = None -- -- def test_version(self): -- """ -- Test that setup.py's version matches the package's version. -- -- """ -- original_path = list(sys.path) -- -- sys.path.insert(0, self.project_dir) -- -- try: -- from setup import VERSION -- self.assertEqual(VERSION, pystache.__version__) -- finally: -- sys.path = original_path -diff --git a/pystache/tests/spectesting.py b/pystache/tests/spectesting.py -index ec8a08d..2dd57e8 100644 ---- a/pystache/tests/spectesting.py -+++ b/pystache/tests/spectesting.py -@@ -37,7 +37,7 @@ except ImportError: - from sys import exc_info - ex_type, ex_value, tb = exc_info() - new_ex = Exception("%s: %s" % (ex_type.__name__, ex_value)) -- raise new_ex.__class__, new_ex, tb -+ raise new_ex.__class__(new_ex).with_traceback(tb) - file_extension = 'json' - parser = json - else: -@@ -62,7 +62,7 @@ def get_spec_tests(spec_test_dir): - - """ - # TODO: use logging module instead. -- print "pystache: spec tests: using %s" % _get_parser_info() -+ print("pystache: spec tests: using %s" % _get_parser_info()) - - cases = [] - -@@ -103,7 +103,7 @@ def _read_spec_tests(path): - - """ - b = common.read(path) -- u = unicode(b, encoding=FILE_ENCODING) -+ u = str(b, encoding=FILE_ENCODING) - spec_data = parse(u) - tests = spec_data['tests'] - -@@ -133,7 +133,7 @@ def _convert_children(node): - return - # Otherwise, node is a dict, so attempt the conversion. - -- for key in node.keys(): -+ for key in list(node.keys()): - val = node[key] - - if not isinstance(val, dict) or val.get('__tag__') != 'code': -@@ -158,9 +158,9 @@ def _deserialize_spec_test(data, file_path): - context = data['data'] - description = data['desc'] - # PyYAML seems to leave ASCII strings as byte strings. -- expected = unicode(data['expected']) -+ expected = str(data['expected']) - # TODO: switch to using dict.get(). -- partials = data.has_key('partials') and data['partials'] or {} -+ partials = 'partials' in data and data['partials'] or {} - template = data['template'] - test_name = data['name'] - -@@ -237,8 +237,8 @@ def parse(u): - value = loader.construct_mapping(node) - return eval(value['python'], {}) - -- yaml.add_constructor(u'!code', code_constructor) -- return yaml.load(u) -+ yaml.add_constructor('!code', code_constructor) -+ return yaml.full_load(u) - - - class SpecTestBase(unittest.TestCase, AssertStringMixin): -diff --git a/pystache/tests/test___init__.py b/pystache/tests/test___init__.py -index eae42c1..63d2c3b 100644 ---- a/pystache/tests/test___init__.py -+++ b/pystache/tests/test___init__.py -@@ -6,9 +6,9 @@ Tests of __init__.py. - """ - - # Calling "import *" is allowed only at the module level. --GLOBALS_INITIAL = globals().keys() -+GLOBALS_INITIAL = list(globals().keys()) - from pystache import * --GLOBALS_PYSTACHE_IMPORTED = globals().keys() -+GLOBALS_PYSTACHE_IMPORTED = list(globals().keys()) - - import unittest - -diff --git a/pystache/tests/test_commands.py b/pystache/tests/test_commands.py -index 2529d25..34fe8ba 100644 ---- a/pystache/tests/test_commands.py -+++ b/pystache/tests/test_commands.py -@@ -39,7 +39,7 @@ class CommandsTestCase(unittest.TestCase): - - """ - actual = self.callScript("Hi {{thing}}", '{"thing": "world"}') -- self.assertEqual(actual, u"Hi world\n") -+ self.assertEqual(actual, "Hi world\n") - - def tearDown(self): - sys.stdout = ORIGINAL_STDOUT -diff --git a/pystache/tests/test_defaults.py b/pystache/tests/test_defaults.py -index c78ea7c..5399bb0 100644 ---- a/pystache/tests/test_defaults.py -+++ b/pystache/tests/test_defaults.py -@@ -31,37 +31,37 @@ class DefaultsConfigurableTestCase(unittest.TestCase, AssertStringMixin): - self.saved[e] = getattr(pystache.defaults, e) - - def tearDown(self): -- for key, value in self.saved.items(): -+ for key, value in list(self.saved.items()): - setattr(pystache.defaults, key, value) - - def test_tag_escape(self): - """Test that changes to defaults.TAG_ESCAPE take effect.""" -- template = u"{{foo}}" -+ template = "{{foo}}" - context = {'foo': '<'} - actual = pystache.render(template, context) -- self.assertString(actual, u"<") -+ self.assertString(actual, "<") - - pystache.defaults.TAG_ESCAPE = lambda u: u - actual = pystache.render(template, context) -- self.assertString(actual, u"<") -+ self.assertString(actual, "<") - - def test_delimiters(self): - """Test that changes to defaults.DELIMITERS take effect.""" -- template = u"[[foo]]{{foo}}" -+ template = "[[foo]]{{foo}}" - context = {'foo': 'FOO'} - actual = pystache.render(template, context) -- self.assertString(actual, u"[[foo]]FOO") -+ self.assertString(actual, "[[foo]]FOO") - - pystache.defaults.DELIMITERS = ('[[', ']]') - actual = pystache.render(template, context) -- self.assertString(actual, u"FOO{{foo}}") -+ self.assertString(actual, "FOO{{foo}}") - - def test_missing_tags(self): - """Test that changes to defaults.MISSING_TAGS take effect.""" -- template = u"{{foo}}" -+ template = "{{foo}}" - context = {} - actual = pystache.render(template, context) -- self.assertString(actual, u"") -+ self.assertString(actual, "") - - pystache.defaults.MISSING_TAGS = 'strict' - self.assertRaises(pystache.context.KeyNotFoundError, -diff --git a/pystache/tests/test_examples.py b/pystache/tests/test_examples.py -index 5c9f74d..9f93de3 100644 ---- a/pystache/tests/test_examples.py -+++ b/pystache/tests/test_examples.py -@@ -7,15 +7,15 @@ TODO: add a docstring. - - import unittest - --from examples.comments import Comments --from examples.double_section import DoubleSection --from examples.escaped import Escaped --from examples.unescaped import Unescaped --from examples.template_partial import TemplatePartial --from examples.delimiters import Delimiters --from examples.unicode_output import UnicodeOutput --from examples.unicode_input import UnicodeInput --from examples.nested_context import NestedContext -+from .examples.comments import Comments -+from .examples.double_section import DoubleSection -+from .examples.escaped import Escaped -+from .examples.unescaped import Unescaped -+from .examples.template_partial import TemplatePartial -+from .examples.delimiters import Delimiters -+from .examples.unicode_output import UnicodeOutput -+from .examples.unicode_input import UnicodeInput -+from .examples.nested_context import NestedContext - from pystache import Renderer - from pystache.tests.common import EXAMPLES_DIR - from pystache.tests.common import AssertStringMixin -@@ -29,34 +29,34 @@ class TestView(unittest.TestCase, AssertStringMixin): - self.assertString(actual, expected) - - def test_comments(self): -- self._assert(Comments(), u"<h1>A Comedy of Errors</h1>") -+ self._assert(Comments(), "<h1>A Comedy of Errors</h1>") - - def test_double_section(self): -- self._assert(DoubleSection(), u"* first\n* second\n* third") -+ self._assert(DoubleSection(), "* first\n* second\n* third") - - def test_unicode_output(self): - renderer = Renderer() - actual = renderer.render(UnicodeOutput()) -- self.assertString(actual, u'<p>Name: Henri Poincaré</p>') -+ self.assertString(actual, '<p>Name: Henri Poincaré</p>') - - def test_unicode_input(self): - renderer = Renderer() - actual = renderer.render(UnicodeInput()) -- self.assertString(actual, u'abcdé') -+ self.assertString(actual, 'abcdé') - - def test_escaping(self): -- self._assert(Escaped(), u"<h1>Bear > Shark</h1>") -+ self._assert(Escaped(), "<h1>Bear > Shark</h1>") - - def test_literal(self): - renderer = Renderer() - actual = renderer.render(Unescaped()) -- self.assertString(actual, u"<h1>Bear > Shark</h1>") -+ self.assertString(actual, "<h1>Bear > Shark</h1>") - - def test_template_partial(self): - renderer = Renderer(search_dirs=EXAMPLES_DIR) - actual = renderer.render(TemplatePartial(renderer=renderer)) - -- self.assertString(actual, u"""<h1>Welcome</h1> -+ self.assertString(actual, """<h1>Welcome</h1> - Again, Welcome!""") - - def test_template_partial_extension(self): -@@ -65,7 +65,7 @@ Again, Welcome!""") - view = TemplatePartial(renderer=renderer) - - actual = renderer.render(view) -- self.assertString(actual, u"""Welcome -+ self.assertString(actual, """Welcome - ------- - - ## Again, Welcome! ##""") -@@ -73,7 +73,7 @@ Again, Welcome!""") - def test_delimiters(self): - renderer = Renderer() - actual = renderer.render(Delimiters()) -- self.assertString(actual, u"""\ -+ self.assertString(actual, """\ - * It worked the first time. - * And it worked the second time. - * Then, surprisingly, it worked the third time. -@@ -82,7 +82,7 @@ Again, Welcome!""") - def test_nested_context(self): - renderer = Renderer() - actual = renderer.render(NestedContext(renderer)) -- self.assertString(actual, u"one and foo and two") -+ self.assertString(actual, "one and foo and two") - - def test_nested_context_is_available_in_view(self): - renderer = Renderer() -@@ -91,7 +91,7 @@ Again, Welcome!""") - view.template = '{{#herp}}{{#derp}}{{nested_context_in_view}}{{/derp}}{{/herp}}' - - actual = renderer.render(view) -- self.assertString(actual, u'it works!') -+ self.assertString(actual, 'it works!') - - def test_partial_in_partial_has_access_to_grand_parent_context(self): - renderer = Renderer(search_dirs=EXAMPLES_DIR) -diff --git a/pystache/tests/test_loader.py b/pystache/tests/test_loader.py -index f2c2187..315daff 100644 ---- a/pystache/tests/test_loader.py -+++ b/pystache/tests/test_loader.py -@@ -55,23 +55,23 @@ class LoaderTests(unittest.TestCase, AssertStringMixin, SetupDefaults): - - def test_init__to_unicode__default(self): - loader = Loader() -- self.assertRaises(TypeError, loader.to_unicode, u"abc") -+ self.assertRaises(TypeError, loader.to_unicode, "abc") - - decode_errors = defaults.DECODE_ERRORS - string_encoding = defaults.STRING_ENCODING - -- nonascii = u'abcdé'.encode('utf-8') -+ nonascii = 'abcdé'.encode('utf-8') - - loader = Loader() - self.assertRaises(UnicodeDecodeError, loader.to_unicode, nonascii) - - defaults.DECODE_ERRORS = 'ignore' - loader = Loader() -- self.assertString(loader.to_unicode(nonascii), u'abcd') -+ self.assertString(loader.to_unicode(nonascii), 'abcd') - - defaults.STRING_ENCODING = 'utf-8' - loader = Loader() -- self.assertString(loader.to_unicode(nonascii), u'abcdé') -+ self.assertString(loader.to_unicode(nonascii), 'abcdé') - - - def _get_path(self, filename): -@@ -83,9 +83,9 @@ class LoaderTests(unittest.TestCase, AssertStringMixin, SetupDefaults): - - """ - loader = Loader() -- actual = loader.unicode("foo") -+ actual = loader.str("foo") - -- self.assertString(actual, u"foo") -+ self.assertString(actual, "foo") - - def test_unicode__basic__input_unicode(self): - """ -@@ -93,24 +93,24 @@ class LoaderTests(unittest.TestCase, AssertStringMixin, SetupDefaults): - - """ - loader = Loader() -- actual = loader.unicode(u"foo") -+ actual = loader.str("foo") - -- self.assertString(actual, u"foo") -+ self.assertString(actual, "foo") - - def test_unicode__basic__input_unicode_subclass(self): - """ - Test unicode(): default arguments with unicode-subclass input. - - """ -- class UnicodeSubclass(unicode): -+ class UnicodeSubclass(str): - pass - -- s = UnicodeSubclass(u"foo") -+ s = UnicodeSubclass("foo") - - loader = Loader() -- actual = loader.unicode(s) -+ actual = loader.str(s) - -- self.assertString(actual, u"foo") -+ self.assertString(actual, "foo") - - def test_unicode__to_unicode__attribute(self): - """ -@@ -119,16 +119,16 @@ class LoaderTests(unittest.TestCase, AssertStringMixin, SetupDefaults): - """ - loader = Loader() - -- non_ascii = u'abcdé'.encode('utf-8') -- self.assertRaises(UnicodeDecodeError, loader.unicode, non_ascii) -+ non_ascii = 'abcdé'.encode('utf-8') -+ self.assertRaises(UnicodeDecodeError, loader.str, non_ascii) - - def to_unicode(s, encoding=None): - if encoding is None: - encoding = 'utf-8' -- return unicode(s, encoding) -+ return str(s, encoding) - - loader.to_unicode = to_unicode -- self.assertString(loader.unicode(non_ascii), u"abcdé") -+ self.assertString(loader.str(non_ascii), "abcdé") - - def test_unicode__encoding_argument(self): - """ -@@ -137,12 +137,12 @@ class LoaderTests(unittest.TestCase, AssertStringMixin, SetupDefaults): - """ - loader = Loader() - -- non_ascii = u'abcdé'.encode('utf-8') -+ non_ascii = 'abcdé'.encode('utf-8') - -- self.assertRaises(UnicodeDecodeError, loader.unicode, non_ascii) -+ self.assertRaises(UnicodeDecodeError, loader.str, non_ascii) - -- actual = loader.unicode(non_ascii, encoding='utf-8') -- self.assertString(actual, u'abcdé') -+ actual = loader.str(non_ascii, encoding='utf-8') -+ self.assertString(actual, 'abcdé') - - # TODO: check the read() unit tests. - def test_read(self): -@@ -153,7 +153,7 @@ class LoaderTests(unittest.TestCase, AssertStringMixin, SetupDefaults): - loader = Loader() - path = self._get_path('ascii.mustache') - actual = loader.read(path) -- self.assertString(actual, u'ascii: abc') -+ self.assertString(actual, 'ascii: abc') - - def test_read__file_encoding__attribute(self): - """ -@@ -167,7 +167,7 @@ class LoaderTests(unittest.TestCase, AssertStringMixin, SetupDefaults): - - loader.file_encoding = 'utf-8' - actual = loader.read(path) -- self.assertString(actual, u'non-ascii: é') -+ self.assertString(actual, 'non-ascii: é') - - def test_read__encoding__argument(self): - """ -@@ -180,7 +180,7 @@ class LoaderTests(unittest.TestCase, AssertStringMixin, SetupDefaults): - self.assertRaises(UnicodeDecodeError, loader.read, path) - - actual = loader.read(path, encoding='utf-8') -- self.assertString(actual, u'non-ascii: é') -+ self.assertString(actual, 'non-ascii: é') - - def test_read__to_unicode__attribute(self): - """ -diff --git a/pystache/tests/test_pystache.py b/pystache/tests/test_pystache.py -index 5447f8d..cf5d6af 100644 ---- a/pystache/tests/test_pystache.py -+++ b/pystache/tests/test_pystache.py -@@ -71,14 +71,14 @@ class PystacheTests(unittest.TestCase): - template = "{{#stats}}({{key}} & {{value}}){{/stats}}" - stats = [] - stats.append({'key': 123, 'value': ['something']}) -- stats.append({'key': u"chris", 'value': 0.900}) -+ stats.append({'key': "chris", 'value': 0.900}) - context = { 'stats': stats } - self._assert_rendered(self.non_strings_expected, template, context) - - def test_unicode(self): - template = 'Name: {{name}}; Age: {{age}}' -- context = {'name': u'Henri Poincaré', 'age': 156 } -- self._assert_rendered(u'Name: Henri Poincaré; Age: 156', template, context) -+ context = {'name': 'Henri Poincaré', 'age': 156} -+ self._assert_rendered('Name: Henri Poincaré; Age: 156', template, context) - - def test_sections(self): - template = """<ul>{{#users}}<li>{{name}}</li>{{/users}}</ul>""" -diff --git a/pystache/tests/test_renderengine.py b/pystache/tests/test_renderengine.py -index db916f7..ed604c5 100644 ---- a/pystache/tests/test_renderengine.py -+++ b/pystache/tests/test_renderengine.py -@@ -33,11 +33,11 @@ def mock_literal(s): - s: a byte string or unicode string. - - """ -- if isinstance(s, unicode): -+ if isinstance(s, str): - # Strip off unicode super classes, if present. -- u = unicode(s) -+ u = str(s) - else: -- u = unicode(s, encoding='ascii') -+ u = str(s, encoding='ascii') - - # We apply upper() to make sure we are actually using our custom - # function in the tests -@@ -94,17 +94,17 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - engine = kwargs.get('engine', self._engine()) - - if partials is not None: -- engine.resolve_partial = lambda key: unicode(partials[key]) -+ engine.resolve_partial = lambda key: str(partials[key]) - - context = ContextStack(*context) - - # RenderEngine.render() only accepts unicode template strings. -- actual = engine.render(unicode(template), context) -+ actual = engine.render(str(template), context) - - self.assertString(actual=actual, expected=expected) - - def test_render(self): -- self._assert_render(u'Hi Mom', 'Hi {{person}}', {'person': 'Mom'}) -+ self._assert_render('Hi Mom', 'Hi {{person}}', {'person': 'Mom'}) - - def test__resolve_partial(self): - """ -@@ -112,10 +112,10 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - - """ - engine = self._engine() -- partials = {'partial': u"{{person}}"} -+ partials = {'partial': "{{person}}"} - engine.resolve_partial = lambda key: partials[key] - -- self._assert_render(u'Hi Mom', 'Hi {{>partial}}', {'person': 'Mom'}, engine=engine) -+ self._assert_render('Hi Mom', 'Hi {{>partial}}', {'person': 'Mom'}, engine=engine) - - def test__literal(self): - """ -@@ -125,13 +125,13 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - engine = self._engine() - engine.literal = lambda s: s.upper() - -- self._assert_render(u'BAR', '{{{foo}}}', {'foo': 'bar'}, engine=engine) -+ self._assert_render('BAR', '{{{foo}}}', {'foo': 'bar'}, engine=engine) - - def test_literal__sigil(self): - template = "<h1>{{& thing}}</h1>" - context = {'thing': 'Bear > Giraffe'} - -- expected = u"<h1>Bear > Giraffe</h1>" -+ expected = "<h1>Bear > Giraffe</h1>" - - self._assert_render(expected, template, context) - -@@ -143,7 +143,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - engine = self._engine() - engine.escape = lambda s: "**" + s - -- self._assert_render(u'**bar', '{{foo}}', {'foo': 'bar'}, engine=engine) -+ self._assert_render('**bar', '{{foo}}', {'foo': 'bar'}, engine=engine) - - def test__escape_does_not_call_literal(self): - """ -@@ -157,7 +157,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - template = 'literal: {{{foo}}} escaped: {{foo}}' - context = {'foo': 'bar'} - -- self._assert_render(u'literal: BAR escaped: **bar', template, context, engine=engine) -+ self._assert_render('literal: BAR escaped: **bar', template, context, engine=engine) - - def test__escape_preserves_unicode_subclasses(self): - """ -@@ -167,7 +167,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - variable value is markupsafe.Markup when escaping. - - """ -- class MyUnicode(unicode): -+ class MyUnicode(str): - pass - - def escape(s): -@@ -182,7 +182,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - template = '{{foo1}} {{foo2}}' - context = {'foo1': MyUnicode('bar'), 'foo2': 'bar'} - -- self._assert_render(u'**bar bar**', template, context, engine=engine) -+ self._assert_render('**bar bar**', template, context, engine=engine) - - # Custom to_str for testing purposes. - def _to_str(self, val): -@@ -197,9 +197,9 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - template = '{{value}}' - context = {'value': None} - -- self._assert_render(u'None', template, context, engine=engine) -+ self._assert_render('None', template, context, engine=engine) - engine.to_str = self._to_str -- self._assert_render(u'', template, context, engine=engine) -+ self._assert_render('', template, context, engine=engine) - - def test_to_str__lambda(self): - """Test the to_str attribute for a lambda.""" -@@ -207,9 +207,9 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - template = '{{value}}' - context = {'value': lambda: None} - -- self._assert_render(u'None', template, context, engine=engine) -+ self._assert_render('None', template, context, engine=engine) - engine.to_str = self._to_str -- self._assert_render(u'', template, context, engine=engine) -+ self._assert_render('', template, context, engine=engine) - - def test_to_str__section_list(self): - """Test the to_str attribute for a section list.""" -@@ -217,9 +217,9 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - template = '{{#list}}{{.}}{{/list}}' - context = {'list': [None, None]} - -- self._assert_render(u'NoneNone', template, context, engine=engine) -+ self._assert_render('NoneNone', template, context, engine=engine) - engine.to_str = self._to_str -- self._assert_render(u'', template, context, engine=engine) -+ self._assert_render('', template, context, engine=engine) - - def test_to_str__section_lambda(self): - # TODO: add a test for a "method with an arity of 1". -@@ -239,7 +239,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - template = '{{text}} {{int}} {{{int}}}' - context = {'int': 100, 'text': 'foo'} - -- self._assert_render(u'FOO 100 100', template, context, engine=engine) -+ self._assert_render('FOO 100 100', template, context, engine=engine) - - def test_tag__output_not_interpolated(self): - """ -@@ -248,7 +248,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - """ - template = '{{template}}: {{planet}}' - context = {'template': '{{planet}}', 'planet': 'Earth'} -- self._assert_render(u'{{planet}}: Earth', template, context) -+ self._assert_render('{{planet}}: Earth', template, context) - - def test_tag__output_not_interpolated__section(self): - """ -@@ -257,7 +257,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - """ - template = '{{test}}' - context = {'test': '{{#hello}}'} -- self._assert_render(u'{{#hello}}', template, context) -+ self._assert_render('{{#hello}}', template, context) - - ## Test interpolation with "falsey" values - # -@@ -268,17 +268,17 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - def test_interpolation__falsey__zero(self): - template = '{{.}}' - context = 0 -- self._assert_render(u'0', template, context) -+ self._assert_render('0', template, context) - - def test_interpolation__falsey__none(self): - template = '{{.}}' - context = None -- self._assert_render(u'None', template, context) -+ self._assert_render('None', template, context) - - def test_interpolation__falsey__zero(self): - template = '{{.}}' - context = False -- self._assert_render(u'False', template, context) -+ self._assert_render('False', template, context) - - # Built-in types: - # -@@ -310,7 +310,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - Check tag interpolation with a built-in type: string. - - """ -- self._assert_builtin_type('abc', 'upper', 'ABC', u'xyz') -+ self._assert_builtin_type('abc', 'upper', 'ABC', 'xyz') - - def test_interpolation__built_in_type__integer(self): - """ -@@ -324,7 +324,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - # - # we need to resort to built-in attributes (double-underscored) on - # the integer type. -- self._assert_builtin_type(15, '__neg__', -15, u'999') -+ self._assert_builtin_type(15, '__neg__', -15, '999') - - def test_interpolation__built_in_type__list(self): - """ -@@ -338,7 +338,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - - template = '{{#section}}{{%s}}{{/section}}' % attr_name - context = {'section': item, attr_name: 7} -- self._assert_render(u'7', template, context) -+ self._assert_render('7', template, context) - - # This test is also important for testing 2to3. - def test_interpolation__nonascii_nonunicode(self): -@@ -347,8 +347,8 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - - """ - template = '{{nonascii}}' -- context = {'nonascii': u'abcdé'.encode('utf-8')} -- self._assert_render(u'abcdé', template, context) -+ context = {'nonascii': 'abcdé'.encode('utf-8')} -+ self._assert_render('abcdé', template, context) - - def test_implicit_iterator__literal(self): - """ -@@ -358,7 +358,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - template = """{{#test}}{{{.}}}{{/test}}""" - context = {'test': ['<', '>']} - -- self._assert_render(u'<>', template, context) -+ self._assert_render('<>', template, context) - - def test_implicit_iterator__escaped(self): - """ -@@ -368,7 +368,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - template = """{{#test}}{{.}}{{/test}}""" - context = {'test': ['<', '>']} - -- self._assert_render(u'<>', template, context) -+ self._assert_render('<>', template, context) - - def test_literal__in_section(self): - """ -@@ -378,7 +378,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - template = '{{#test}}1 {{{less_than}}} 2{{/test}}' - context = {'test': {'less_than': '<'}} - -- self._assert_render(u'1 < 2', template, context) -+ self._assert_render('1 < 2', template, context) - - def test_literal__in_partial(self): - """ -@@ -389,11 +389,11 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - partials = {'partial': '1 {{{less_than}}} 2'} - context = {'less_than': '<'} - -- self._assert_render(u'1 < 2', template, context, partials=partials) -+ self._assert_render('1 < 2', template, context, partials=partials) - - def test_partial(self): - partials = {'partial': "{{person}}"} -- self._assert_render(u'Hi Mom', 'Hi {{>partial}}', {'person': 'Mom'}, partials=partials) -+ self._assert_render('Hi Mom', 'Hi {{>partial}}', {'person': 'Mom'}, partials=partials) - - def test_partial__context_values(self): - """ -@@ -406,7 +406,9 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - partials = {'partial': 'unescaped: {{{foo}}} escaped: {{foo}}'} - context = {'foo': '<'} - -- self._assert_render(u'unescaped: < escaped: <', template, context, engine=engine, partials=partials) -+ self._assert_render( -+ 'unescaped: < escaped: <', -+ template, context, engine=engine, partials=partials) - - ## Test cases related specifically to lambdas. - -@@ -417,8 +419,8 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - - """ - template = '{{#nonascii}}{{.}}{{/nonascii}}' -- context = {'nonascii': u'abcdé'.encode('utf-8')} -- self._assert_render(u'abcdé', template, context) -+ context = {'nonascii': 'abcdé'.encode('utf-8')} -+ self._assert_render('abcdé', template, context) - - # This test is also important for testing 2to3. - def test_lambda__returning_nonascii_nonunicode(self): -@@ -427,8 +429,8 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - - """ - template = '{{lambda}}' -- context = {'lambda': lambda: u'abcdé'.encode('utf-8')} -- self._assert_render(u'abcdé', template, context) -+ context = {'lambda': lambda: 'abcdé'.encode('utf-8')} -+ self._assert_render('abcdé', template, context) - - ## Test cases related specifically to sections. - -@@ -440,7 +442,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - template = '{{/section}}' - try: - self._assert_render(None, template) -- except ParsingError, err: -+ except ParsingError as err: - self.assertEqual(str(err), "Section end tag mismatch: section != None") - - def test_section__end_tag_mismatch(self): -@@ -451,7 +453,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - template = '{{#section_start}}{{/section_end}}' - try: - self._assert_render(None, template) -- except ParsingError, err: -+ except ParsingError as err: - self.assertEqual(str(err), "Section end tag mismatch: section_end != section_start") - - def test_section__context_values(self): -@@ -464,7 +466,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - template = '{{#test}}unescaped: {{{foo}}} escaped: {{foo}}{{/test}}' - context = {'test': {'foo': '<'}} - -- self._assert_render(u'unescaped: < escaped: <', template, context, engine=engine) -+ self._assert_render('unescaped: < escaped: <', template, context, engine=engine) - - def test_section__context_precedence(self): - """ -@@ -473,7 +475,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - """ - template = '{{entree}} : {{#vegetarian}}{{entree}}{{/vegetarian}}' - context = {'entree': 'chicken', 'vegetarian': {'entree': 'beans and rice'}} -- self._assert_render(u'chicken : beans and rice', template, context) -+ self._assert_render('chicken : beans and rice', template, context) - - def test_section__list_referencing_outer_context(self): - """ -@@ -491,7 +493,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - - template = "{{#list}}{{greeting}} {{name}}, {{/list}}" - -- self._assert_render(u"Hi Al, Hi Bob, ", template, context) -+ self._assert_render("Hi Al, Hi Bob, ", template, context) - - def test_section__output_not_interpolated(self): - """ -@@ -500,7 +502,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - """ - template = '{{#section}}{{template}}{{/section}}: {{planet}}' - context = {'section': True, 'template': '{{planet}}', 'planet': 'Earth'} -- self._assert_render(u'{{planet}}: Earth', template, context) -+ self._assert_render('{{planet}}: Earth', template, context) - - # TODO: have this test case added to the spec. - def test_section__string_values_not_lists(self): -@@ -511,7 +513,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - template = '{{#section}}foo{{/section}}' - context = {'section': '123'} - # If strings were interpreted as lists, this would give "foofoofoo". -- self._assert_render(u'foo', template, context) -+ self._assert_render('foo', template, context) - - def test_section__nested_truthy(self): - """ -@@ -525,7 +527,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - """ - template = '| A {{#bool}}B {{#bool}}C{{/bool}} D{{/bool}} E |' - context = {'bool': True} -- self._assert_render(u'| A B C D E |', template, context) -+ self._assert_render('| A B C D E |', template, context) - - def test_section__nested_with_same_keys(self): - """ -@@ -537,16 +539,16 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - # Start with an easier, working case. - template = '{{#x}}{{#z}}{{y}}{{/z}}{{/x}}' - context = {'x': {'z': {'y': 1}}} -- self._assert_render(u'1', template, context) -+ self._assert_render('1', template, context) - - template = '{{#x}}{{#x}}{{y}}{{/x}}{{/x}}' - context = {'x': {'x': {'y': 1}}} -- self._assert_render(u'1', template, context) -+ self._assert_render('1', template, context) - - def test_section__lambda(self): - template = '{{#test}}Mom{{/test}}' - context = {'test': (lambda text: 'Hi %s' % text)} -- self._assert_render(u'Hi Mom', template, context) -+ self._assert_render('Hi Mom', template, context) - - # This test is also important for testing 2to3. - def test_section__lambda__returning_nonascii_nonunicode(self): -@@ -555,8 +557,8 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - - """ - template = '{{#lambda}}{{/lambda}}' -- context = {'lambda': lambda text: u'abcdé'.encode('utf-8')} -- self._assert_render(u'abcdé', template, context) -+ context = {'lambda': lambda text: 'abcdé'.encode('utf-8')} -+ self._assert_render('abcdé', template, context) - - def test_section__lambda__returning_nonstring(self): - """ -@@ -565,7 +567,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - """ - template = '{{#lambda}}foo{{/lambda}}' - context = {'lambda': lambda text: len(text)} -- self._assert_render(u'3', template, context) -+ self._assert_render('3', template, context) - - def test_section__iterable(self): - """ -@@ -575,10 +577,10 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - template = '{{#iterable}}{{.}}{{/iterable}}' - - context = {'iterable': (i for i in range(3))} # type 'generator' -- self._assert_render(u'012', template, context) -+ self._assert_render('012', template, context) - -- context = {'iterable': xrange(4)} # type 'xrange' -- self._assert_render(u'0123', template, context) -+ context = {'iterable': range(4)} # type 'xrange' -+ self._assert_render('0123', template, context) - - d = {'foo': 0, 'bar': 0} - # We don't know what order of keys we'll be given, but from the -@@ -586,8 +588,8 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - # "If items(), keys(), values(), iteritems(), iterkeys(), and - # itervalues() are called with no intervening modifications to - # the dictionary, the lists will directly correspond." -- expected = u''.join(d.keys()) -- context = {'iterable': d.iterkeys()} # type 'dictionary-keyiterator' -+ expected = ''.join(list(d.keys())) -+ context = {'iterable': iter(d.keys())} # type 'dictionary-keyiterator' - self._assert_render(expected, template, context) - - def test_section__lambda__tag_in_output(self): -@@ -605,7 +607,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - """ - template = '{{#test}}Hi {{person}}{{/test}}' - context = {'person': 'Mom', 'test': (lambda text: text + " :)")} -- self._assert_render(u'Hi Mom :)', template, context) -+ self._assert_render('Hi Mom :)', template, context) - - def test_section__lambda__list(self): - """ -@@ -621,7 +623,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - 'lambdas': [lambda text: "~{{%s}}~" % text, - lambda text: "#{{%s}}#" % text]} - -- self._assert_render(u'<~bar~#bar#>', template, context) -+ self._assert_render('<~bar~#bar#>', template, context) - - def test_section__lambda__mixed_list(self): - """ -@@ -636,7 +638,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - context = {'foo': 'bar', - 'lambdas': [lambda text: "~{{%s}}~" % text, 1]} - -- self._assert_render(u'<~bar~foo>', template, context) -+ self._assert_render('<~bar~foo>', template, context) - - def test_section__lambda__not_on_context_stack(self): - """ -@@ -653,7 +655,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - """ - context = {'foo': 'bar', 'lambda': (lambda text: "{{.}}")} - template = '{{#foo}}{{#lambda}}blah{{/lambda}}{{/foo}}' -- self._assert_render(u'bar', template, context) -+ self._assert_render('bar', template, context) - - def test_section__lambda__no_reinterpolation(self): - """ -@@ -670,15 +672,15 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - """ - template = '{{#planet}}{{#lambda}}dot{{/lambda}}{{/planet}}' - context = {'planet': 'Earth', 'dot': '~{{.}}~', 'lambda': (lambda text: "#{{%s}}#" % text)} -- self._assert_render(u'#~{{.}}~#', template, context) -+ self._assert_render('#~{{.}}~#', template, context) - - def test_comment__multiline(self): - """ - Check that multiline comments are permitted. - - """ -- self._assert_render(u'foobar', 'foo{{! baz }}bar') -- self._assert_render(u'foobar', 'foo{{! \nbaz }}bar') -+ self._assert_render('foobar', 'foo{{! baz }}bar') -+ self._assert_render('foobar', 'foo{{! \nbaz }}bar') - - def test_custom_delimiters__sections(self): - """ -@@ -689,7 +691,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - """ - template = '{{=[[ ]]=}}[[#foo]]bar[[/foo]]' - context = {'foo': True} -- self._assert_render(u'bar', template, context) -+ self._assert_render('bar', template, context) - - def test_custom_delimiters__not_retroactive(self): - """ -@@ -698,7 +700,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - Test case for issue #35: https://github.com/defunkt/pystache/issues/35 - - """ -- expected = u' {{foo}} ' -+ expected = ' {{foo}} ' - self._assert_render(expected, '{{=$ $=}} {{foo}} ') - self._assert_render(expected, '{{=$ $=}} {{foo}} $={{ }}=$') # was yielding u' '. - -@@ -713,7 +715,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - template = 'Hello, {{person.name}}. I see you are {{person.details.age}}.' - person = Attachable(name='Biggles', details={'age': 42}) - context = {'person': person} -- self._assert_render(u'Hello, Biggles. I see you are 42.', template, context) -+ self._assert_render('Hello, Biggles. I see you are 42.', template, context) - - def test_dot_notation__multiple_levels(self): - """ -@@ -722,7 +724,7 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - """ - template = """Hello, Mr. {{person.name.lastname}}. - I see you're back from {{person.travels.last.country.city}}.""" -- expected = u"""Hello, Mr. Pither. -+ expected = """Hello, Mr. Pither. - I see you're back from Cornwall.""" - context = {'person': {'name': {'firstname': 'unknown', 'lastname': 'Pither'}, - 'travels': {'last': {'country': {'city': 'Cornwall'}}}, -@@ -758,10 +760,10 @@ class RenderTests(unittest.TestCase, AssertStringMixin, AssertExceptionMixin): - context = {'a': {'b': 'A.B'}, 'c': {'a': 'A'} } - - template = '{{a.b}}' -- self._assert_render(u'A.B', template, context) -+ self._assert_render('A.B', template, context) - - template = '{{#c}}{{a}}{{/c}}' -- self._assert_render(u'A', template, context) -+ self._assert_render('A', template, context) - - template = '{{#c}}{{a.b}}{{/c}}' - self.assertException(KeyNotFoundError, "Key %(unicode)s'a.b' not found: missing %(unicode)s'b'" % -diff --git a/pystache/tests/test_renderer.py b/pystache/tests/test_renderer.py -index 0dbe0d9..e0d2448 100644 ---- a/pystache/tests/test_renderer.py -+++ b/pystache/tests/test_renderer.py -@@ -10,7 +10,7 @@ import os - import sys - import unittest - --from examples.simple import Simple -+from .examples.simple import Simple - from pystache import Renderer - from pystache import TemplateSpec - from pystache.common import TemplateNotFoundError -@@ -33,7 +33,7 @@ def _make_renderer(): - def mock_unicode(b, encoding=None): - if encoding is None: - encoding = 'ascii' -- u = unicode(b, encoding=encoding) -+ u = str(b, encoding=encoding) - return u.upper() - - -@@ -197,13 +197,13 @@ class RendererTests(unittest.TestCase, AssertStringMixin): - - """ - renderer = self._renderer() -- b = u"é".encode('utf-8') -+ b = "é".encode('utf-8') - - renderer.string_encoding = "ascii" -- self.assertRaises(UnicodeDecodeError, renderer.unicode, b) -+ self.assertRaises(UnicodeDecodeError, renderer.str, b) - - renderer.string_encoding = "utf-8" -- self.assertEqual(renderer.unicode(b), u"é") -+ self.assertEqual(renderer.str(b), "é") - - def test_unicode__decode_errors(self): - """ -@@ -212,14 +212,14 @@ class RendererTests(unittest.TestCase, AssertStringMixin): - """ - renderer = self._renderer() - renderer.string_encoding = "ascii" -- b = u"déf".encode('utf-8') -+ b = "déf".encode('utf-8') - - renderer.decode_errors = "ignore" -- self.assertEqual(renderer.unicode(b), "df") -+ self.assertEqual(renderer.str(b), "df") - - renderer.decode_errors = "replace" - # U+FFFD is the official Unicode replacement character. -- self.assertEqual(renderer.unicode(b), u'd\ufffd\ufffdf') -+ self.assertEqual(renderer.str(b), u'd\ufffd\ufffdf') - - ## Test the _make_loader() method. - -@@ -243,7 +243,7 @@ class RendererTests(unittest.TestCase, AssertStringMixin): - renderer = self._renderer() - renderer.file_encoding = 'enc' - renderer.file_extension = 'ext' -- renderer.unicode = unicode_ -+ renderer.str = unicode_ - - loader = renderer._make_loader() - -@@ -260,12 +260,12 @@ class RendererTests(unittest.TestCase, AssertStringMixin): - """ - renderer = self._renderer() - rendered = renderer.render('foo') -- self.assertEqual(type(rendered), unicode) -+ self.assertEqual(type(rendered), str) - - def test_render__unicode(self): - renderer = self._renderer() -- actual = renderer.render(u'foo') -- self.assertEqual(actual, u'foo') -+ actual = renderer.render('foo') -+ self.assertEqual(actual, 'foo') - - def test_render__str(self): - renderer = self._renderer() -@@ -274,8 +274,8 @@ class RendererTests(unittest.TestCase, AssertStringMixin): - - def test_render__non_ascii_character(self): - renderer = self._renderer() -- actual = renderer.render(u'Poincaré') -- self.assertEqual(actual, u'Poincaré') -+ actual = renderer.render('Poincaré') -+ self.assertEqual(actual, 'Poincaré') - - def test_render__context(self): - """ -@@ -326,7 +326,7 @@ class RendererTests(unittest.TestCase, AssertStringMixin): - - """ - renderer = _make_renderer() -- template = u"déf".encode("utf-8") -+ template = "déf".encode("utf-8") - - # Check that decode_errors and string_encoding are both respected. - renderer.decode_errors = 'ignore' -@@ -334,7 +334,7 @@ class RendererTests(unittest.TestCase, AssertStringMixin): - self.assertEqual(renderer.render(template), "df") - - renderer.string_encoding = 'utf_8' -- self.assertEqual(renderer.render(template), u"déf") -+ self.assertEqual(renderer.render(template), "déf") - - def test_make_resolve_partial(self): - """ -@@ -347,7 +347,7 @@ class RendererTests(unittest.TestCase, AssertStringMixin): - - actual = resolve_partial('foo') - self.assertEqual(actual, 'bar') -- self.assertEqual(type(actual), unicode, "RenderEngine requires that " -+ self.assertEqual(type(actual), str, "RenderEngine requires that " - "resolve_partial return unicode strings.") - - def test_make_resolve_partial__unicode(self): -@@ -362,7 +362,7 @@ class RendererTests(unittest.TestCase, AssertStringMixin): - self.assertEqual(resolve_partial("partial"), "foo") - - # Now with a value that is already unicode. -- renderer.partials = {'partial': u'foo'} -+ renderer.partials = {'partial': 'foo'} - resolve_partial = renderer._make_resolve_partial() - # If the next line failed, we would get the following error: - # TypeError: decoding Unicode is not supported -@@ -373,7 +373,7 @@ class RendererTests(unittest.TestCase, AssertStringMixin): - data_dir = get_data_path() - renderer = Renderer(search_dirs=data_dir) - actual = renderer.render_name("say_hello", to='foo') -- self.assertString(actual, u"Hello, foo") -+ self.assertString(actual, "Hello, foo") - - def test_render_path(self): - """ -@@ -412,7 +412,7 @@ class RendererTests(unittest.TestCase, AssertStringMixin): - - spec = Spec() - actual = renderer.render(spec) -- self.assertString(actual, u'hello, world') -+ self.assertString(actual, 'hello, world') - - def test_render__view(self): - """ -@@ -484,7 +484,7 @@ class Renderer_MakeRenderEngineTests(unittest.TestCase, AssertStringMixin, Asser - Check that resolve_partial returns unicode (and not a subclass). - - """ -- class MyUnicode(unicode): -+ class MyUnicode(str): - pass - - renderer = Renderer() -@@ -495,12 +495,12 @@ class Renderer_MakeRenderEngineTests(unittest.TestCase, AssertStringMixin, Asser - - actual = engine.resolve_partial('str') - self.assertEqual(actual, "foo") -- self.assertEqual(type(actual), unicode) -+ self.assertEqual(type(actual), str) - - # Check that unicode subclasses are not preserved. - actual = engine.resolve_partial('subclass') - self.assertEqual(actual, "abc") -- self.assertEqual(type(actual), unicode) -+ self.assertEqual(type(actual), str) - - def test__resolve_partial__not_found(self): - """ -@@ -512,7 +512,7 @@ class Renderer_MakeRenderEngineTests(unittest.TestCase, AssertStringMixin, Asser - engine = renderer._make_render_engine() - resolve_partial = engine.resolve_partial - -- self.assertString(resolve_partial('foo'), u'') -+ self.assertString(resolve_partial('foo'), '') - - def test__resolve_partial__not_found__missing_tags_strict(self): - """ -@@ -539,7 +539,7 @@ class Renderer_MakeRenderEngineTests(unittest.TestCase, AssertStringMixin, Asser - engine = renderer._make_render_engine() - resolve_partial = engine.resolve_partial - -- self.assertString(resolve_partial('foo'), u'') -+ self.assertString(resolve_partial('foo'), '') - - def test__resolve_partial__not_found__partials_dict__missing_tags_strict(self): - """ -@@ -566,12 +566,12 @@ class Renderer_MakeRenderEngineTests(unittest.TestCase, AssertStringMixin, Asser - - """ - renderer = self._make_renderer() -- renderer.unicode = mock_unicode -+ renderer.str = mock_unicode - - engine = renderer._make_render_engine() - literal = engine.literal - -- b = u"foo".encode("ascii") -+ b = "foo".encode("ascii") - self.assertEqual(literal(b), "FOO") - - def test__literal__handles_unicode(self): -@@ -585,7 +585,7 @@ class Renderer_MakeRenderEngineTests(unittest.TestCase, AssertStringMixin, Asser - engine = renderer._make_render_engine() - literal = engine.literal - -- self.assertEqual(literal(u"foo"), "foo") -+ self.assertEqual(literal("foo"), "foo") - - def test__literal__returns_unicode(self): - """ -@@ -598,16 +598,16 @@ class Renderer_MakeRenderEngineTests(unittest.TestCase, AssertStringMixin, Asser - engine = renderer._make_render_engine() - literal = engine.literal - -- self.assertEqual(type(literal("foo")), unicode) -+ self.assertEqual(type(literal("foo")), str) - -- class MyUnicode(unicode): -+ class MyUnicode(str): - pass - - s = MyUnicode("abc") - - self.assertEqual(type(s), MyUnicode) -- self.assertTrue(isinstance(s, unicode)) -- self.assertEqual(type(literal(s)), unicode) -+ self.assertTrue(isinstance(s, str)) -+ self.assertEqual(type(literal(s)), str) - - ## Test the engine's escape attribute. - -@@ -630,12 +630,12 @@ class Renderer_MakeRenderEngineTests(unittest.TestCase, AssertStringMixin, Asser - - """ - renderer = Renderer() -- renderer.unicode = mock_unicode -+ renderer.str = mock_unicode - - engine = renderer._make_render_engine() - escape = engine.escape - -- b = u"foo".encode('ascii') -+ b = "foo".encode('ascii') - self.assertEqual(escape(b), "FOO") - - def test__escape__has_access_to_original_unicode_subclass(self): -@@ -644,16 +644,16 @@ class Renderer_MakeRenderEngineTests(unittest.TestCase, AssertStringMixin, Asser - - """ - renderer = Renderer() -- renderer.escape = lambda s: unicode(type(s).__name__) -+ renderer.escape = lambda s: str(type(s).__name__) - - engine = renderer._make_render_engine() - escape = engine.escape - -- class MyUnicode(unicode): -+ class MyUnicode(str): - pass - -- self.assertEqual(escape(u"foo".encode('ascii')), unicode.__name__) -- self.assertEqual(escape(u"foo"), unicode.__name__) -+ self.assertEqual(escape("foo".encode('ascii')), str.__name__) -+ self.assertEqual(escape("foo"), str.__name__) - self.assertEqual(escape(MyUnicode("foo")), MyUnicode.__name__) - - def test__escape__returns_unicode(self): -@@ -667,17 +667,17 @@ class Renderer_MakeRenderEngineTests(unittest.TestCase, AssertStringMixin, Asser - engine = renderer._make_render_engine() - escape = engine.escape - -- self.assertEqual(type(escape("foo")), unicode) -+ self.assertEqual(type(escape("foo")), str) - - # Check that literal doesn't preserve unicode subclasses. -- class MyUnicode(unicode): -+ class MyUnicode(str): - pass - - s = MyUnicode("abc") - - self.assertEqual(type(s), MyUnicode) -- self.assertTrue(isinstance(s, unicode)) -- self.assertEqual(type(escape(s)), unicode) -+ self.assertTrue(isinstance(s, str)) -+ self.assertEqual(type(escape(s)), str) - - ## Test the missing_tags attribute. - -@@ -706,7 +706,7 @@ class Renderer_MakeRenderEngineTests(unittest.TestCase, AssertStringMixin, Asser - stack = ContextStack({'foo': 'bar'}) - - self.assertEqual('bar', engine.resolve_context(stack, 'foo')) -- self.assertString(u'', engine.resolve_context(stack, 'missing')) -+ self.assertString('', engine.resolve_context(stack, 'missing')) - - def test__resolve_context__missing_tags_strict(self): - """ -diff --git a/pystache/tests/test_simple.py b/pystache/tests/test_simple.py -index 07b059f..b88bf35 100644 ---- a/pystache/tests/test_simple.py -+++ b/pystache/tests/test_simple.py -@@ -2,11 +2,11 @@ import unittest - - import pystache - from pystache import Renderer --from examples.nested_context import NestedContext --from examples.complex import Complex --from examples.lambdas import Lambdas --from examples.template_partial import TemplatePartial --from examples.simple import Simple -+from .examples.nested_context import NestedContext -+from .examples.complex import Complex -+from .examples.lambdas import Lambdas -+from .examples.template_partial import TemplatePartial -+from .examples.simple import Simple - - from pystache.tests.common import EXAMPLES_DIR - from pystache.tests.common import AssertStringMixin -@@ -20,7 +20,7 @@ class TestSimple(unittest.TestCase, AssertStringMixin): - view.template = '{{#foo}}{{thing1}} and {{thing2}} and {{outer_thing}}{{/foo}}{{^foo}}Not foo!{{/foo}}' - - actual = renderer.render(view) -- self.assertString(actual, u"one and foo and two") -+ self.assertString(actual, "one and foo and two") - - def test_looping_and_negation_context(self): - template = '{{#item}}{{header}}: {{name}} {{/item}}{{^item}} Shouldnt see me{{/item}}' -@@ -40,7 +40,7 @@ class TestSimple(unittest.TestCase, AssertStringMixin): - - renderer = Renderer() - actual = renderer.render(view) -- self.assertString(actual, u'bar != bar. oh, it does!') -+ self.assertString(actual, 'bar != bar. oh, it does!') - - def test_rendering_partial(self): - renderer = Renderer(search_dirs=EXAMPLES_DIR) -@@ -49,11 +49,11 @@ class TestSimple(unittest.TestCase, AssertStringMixin): - view.template = '{{>inner_partial}}' - - actual = renderer.render(view) -- self.assertString(actual, u'Again, Welcome!') -+ self.assertString(actual, 'Again, Welcome!') - - view.template = '{{#looping}}{{>inner_partial}} {{/looping}}' - actual = renderer.render(view) -- self.assertString(actual, u"Again, Welcome! Again, Welcome! Again, Welcome! ") -+ self.assertString(actual, "Again, Welcome! Again, Welcome! Again, Welcome! ") - - def test_non_existent_value_renders_blank(self): - view = Simple() -@@ -77,7 +77,7 @@ class TestSimple(unittest.TestCase, AssertStringMixin): - view = TemplatePartial(renderer=renderer) - - actual = renderer.render(view) -- self.assertString(actual, u"""Welcome -+ self.assertString(actual, """Welcome - ------- - - ## Again, Welcome! ##""") -diff --git a/pystache/tests/test_specloader.py b/pystache/tests/test_specloader.py -index cacc0fc..dcdc55f 100644 ---- a/pystache/tests/test_specloader.py -+++ b/pystache/tests/test_specloader.py -@@ -9,11 +9,11 @@ import os.path - import sys - import unittest - --import examples --from examples.simple import Simple --from examples.complex import Complex --from examples.lambdas import Lambdas --from examples.inverted import Inverted, InvertedLists -+from . import examples -+from .examples.simple import Simple -+from .examples.complex import Complex -+from .examples.lambdas import Lambdas -+from .examples.inverted import Inverted, InvertedLists - from pystache import Renderer - from pystache import TemplateSpec - from pystache.common import TemplateNotFoundError -@@ -70,7 +70,7 @@ class ViewTestCase(unittest.TestCase, AssertStringMixin): - renderer2 = Renderer(search_dirs=EXAMPLES_DIR) - - actual = renderer1.render(spec) -- self.assertString(actual, u"Partial: ") -+ self.assertString(actual, "Partial: ") - - actual = renderer2.render(spec) - self.assertEqual(actual, "Partial: No tags...") -@@ -79,7 +79,7 @@ class ViewTestCase(unittest.TestCase, AssertStringMixin): - renderer = Renderer() - actual = renderer.render(Simple()) - -- self.assertString(actual, u"Hi pizza!") -+ self.assertString(actual, "Hi pizza!") - - def test_non_callable_attributes(self): - view = Simple() -@@ -92,7 +92,7 @@ class ViewTestCase(unittest.TestCase, AssertStringMixin): - def test_complex(self): - renderer = Renderer() - actual = renderer.render(Complex()) -- self.assertString(actual, u"""\ -+ self.assertString(actual, """\ - <h1>Colors</h1> - <ul> - <li><strong>red</strong></li> -@@ -111,7 +111,7 @@ class ViewTestCase(unittest.TestCase, AssertStringMixin): - - renderer = Renderer() - actual = renderer.render(view) -- self.assertString(actual, u'nopqrstuvwxyz') -+ self.assertString(actual, 'nopqrstuvwxyz') - - def test_higher_order_lambda(self): - view = Lambdas() -@@ -119,7 +119,7 @@ class ViewTestCase(unittest.TestCase, AssertStringMixin): - - renderer = Renderer() - actual = renderer.render(view) -- self.assertString(actual, u'abcdefghijklmnopqrstuvwxyz') -+ self.assertString(actual, 'abcdefghijklmnopqrstuvwxyz') - - def test_partials_with_lambda(self): - view = Lambdas() -@@ -127,7 +127,7 @@ class ViewTestCase(unittest.TestCase, AssertStringMixin): - - renderer = Renderer(search_dirs=EXAMPLES_DIR) - actual = renderer.render(view) -- self.assertEqual(actual, u'nopqrstuvwxyz') -+ self.assertEqual(actual, 'nopqrstuvwxyz') - - def test_hierarchical_partials_with_lambdas(self): - view = Lambdas() -@@ -135,12 +135,12 @@ class ViewTestCase(unittest.TestCase, AssertStringMixin): - - renderer = Renderer(search_dirs=EXAMPLES_DIR) - actual = renderer.render(view) -- self.assertString(actual, u'nopqrstuvwxyznopqrstuvwxyz') -+ self.assertString(actual, 'nopqrstuvwxyznopqrstuvwxyz') - - def test_inverted(self): - renderer = Renderer() - actual = renderer.render(Inverted()) -- self.assertString(actual, u"""one, two, three, empty list""") -+ self.assertString(actual, """one, two, three, empty list""") - - def test_accessing_properties_on_parent_object_from_child_objects(self): - parent = Thing() -@@ -152,12 +152,12 @@ class ViewTestCase(unittest.TestCase, AssertStringMixin): - renderer = Renderer() - actual = renderer.render(view, {'parent': parent}) - -- self.assertString(actual, u'derp') -+ self.assertString(actual, 'derp') - - def test_inverted_lists(self): - renderer = Renderer() - actual = renderer.render(InvertedLists()) -- self.assertString(actual, u"""one, two, three, empty list""") -+ self.assertString(actual, """one, two, three, empty list""") - - - def _make_specloader(): -@@ -176,7 +176,7 @@ def _make_specloader(): - """ - if encoding is None: - encoding = 'ascii' -- return unicode(s, encoding, 'strict') -+ return str(s, encoding, 'strict') - - loader = Loader(file_encoding='ascii', to_unicode=to_unicode) - return SpecLoader(loader=loader) -@@ -222,7 +222,7 @@ class SpecLoaderTests(unittest.TestCase, AssertIsMixin, AssertStringMixin, - custom.template = "abc" - - spec_loader = self._make_specloader() -- self._assert_template(spec_loader, custom, u"abc") -+ self._assert_template(spec_loader, custom, "abc") - - def test_load__template__type_unicode(self): - """ -@@ -230,10 +230,10 @@ class SpecLoaderTests(unittest.TestCase, AssertIsMixin, AssertStringMixin, - - """ - custom = TemplateSpec() -- custom.template = u"abc" -+ custom.template = "abc" - - spec_loader = self._make_specloader() -- self._assert_template(spec_loader, custom, u"abc") -+ self._assert_template(spec_loader, custom, "abc") - - def test_load__template__unicode_non_ascii(self): - """ -@@ -241,10 +241,10 @@ class SpecLoaderTests(unittest.TestCase, AssertIsMixin, AssertStringMixin, - - """ - custom = TemplateSpec() -- custom.template = u"é" -+ custom.template = "é" - - spec_loader = self._make_specloader() -- self._assert_template(spec_loader, custom, u"é") -+ self._assert_template(spec_loader, custom, "é") - - def test_load__template__with_template_encoding(self): - """ -@@ -252,14 +252,14 @@ class SpecLoaderTests(unittest.TestCase, AssertIsMixin, AssertStringMixin, - - """ - custom = TemplateSpec() -- custom.template = u'é'.encode('utf-8') -+ custom.template = 'é'.encode('utf-8') - - spec_loader = self._make_specloader() - -- self.assertRaises(UnicodeDecodeError, self._assert_template, spec_loader, custom, u'é') -+ self.assertRaises(UnicodeDecodeError, self._assert_template, spec_loader, custom, 'é') - - custom.template_encoding = 'utf-8' -- self._assert_template(spec_loader, custom, u'é') -+ self._assert_template(spec_loader, custom, 'é') - - # TODO: make this test complete. - def test_load__template__correct_loader(self): -@@ -279,10 +279,10 @@ class SpecLoaderTests(unittest.TestCase, AssertIsMixin, AssertStringMixin, - self.encoding = None - - # Overrides the existing method. -- def unicode(self, s, encoding=None): -+ def str(self, s, encoding=None): - self.s = s - self.encoding = encoding -- return u"foo" -+ return "foo" - - loader = MockLoader() - custom_loader = SpecLoader() -@@ -293,7 +293,7 @@ class SpecLoaderTests(unittest.TestCase, AssertIsMixin, AssertStringMixin, - view.template_encoding = "encoding-foo" - - # Check that our unicode() above was called. -- self._assert_template(custom_loader, view, u'foo') -+ self._assert_template(custom_loader, view, 'foo') - self.assertEqual(loader.s, "template-foo") - self.assertEqual(loader.encoding, "encoding-foo") - -@@ -410,7 +410,7 @@ class TemplateSpecTests(unittest.TestCase, AssertPathsMixin): - loader = self._make_loader() - actual = loader.load(custom) - -- self.assertEqual(type(actual), unicode) -+ self.assertEqual(type(actual), str) - self.assertEqual(actual, expected) - - def test_get_template(self): -@@ -420,7 +420,7 @@ class TemplateSpecTests(unittest.TestCase, AssertPathsMixin): - """ - view = SampleView() - -- self._assert_get_template(view, u"ascii: abc") -+ self._assert_get_template(view, "ascii: abc") - - def test_get_template__template_encoding(self): - """ -@@ -432,4 +432,4 @@ class TemplateSpecTests(unittest.TestCase, AssertPathsMixin): - self.assertRaises(UnicodeDecodeError, self._assert_get_template, view, 'foo') - - view.template_encoding = 'utf-8' -- self._assert_get_template(view, u"non-ascii: é") -+ self._assert_get_template(view, "non-ascii: é") -diff --git a/setup.cfg b/setup.cfg -index 861a9f5..f6f1279 100644 ---- a/setup.cfg -+++ b/setup.cfg -@@ -1,5 +1,71 @@ --[egg_info] --tag_build = --tag_date = 0 --tag_svn_revision = 0 -+[metadata] -+name = pystache -+version = attr: pystache.__version__ -+author = Chris Wanstrath -+author_email = chris@ozmm.org -+maintainer = Steve Arnold -+maintainer_email = nerdboy@gentoo.org -+description = Mustache for Python -+url = https://github.com/sarnold/pystache -+license = MIT -+license_files = LICENSE -+classifiers = -+ Development Status :: 4 - Beta -+ Intended Audience :: Developers -+ License :: OSI Approved :: MIT License -+ Programming Language :: Python :: 3 -+ Programming Language :: Python :: 3.6 -+ Programming Language :: Python :: 3.7 -+ Programming Language :: Python :: 3.8 -+ Programming Language :: Python :: 3.9 - -+[options] -+python_requires = >=3.6 -+zip_safe = True -+include_package_data = True -+packages = find: -+ -+[options.package_data] -+* = *.mustache, *.txt -+ -+[options.entry_points] -+console_scripts = -+ pystache=pystache.commands.render:main -+ pystache-test=pystache.commands.test:main -+ -+[options.extras_require] -+test = -+ nose -+ -+cov = -+ coverage -+ -+[bdist_wheel] -+universal = 0 -+ -+[check-manifest] -+ignore = -+ .codeclimate.yml -+ .gitattributes -+ .coveragerc -+ .gitignore -+ .pep8speaks.yml -+ codecov.yml -+ -+[flake8] -+exclude = -+ .git, -+ __pycache__, -+ build, -+ dist -+ -+max-line-length = 110 -+ -+[nosetests] -+traverse-namespace = 1 -+verbosity = 3 -+with-coverage = 1 -+with-doctest = 1 -+doctest-extension = rst -+cover-package = pystache -+cover-xml = 1 -diff --git a/setup.py b/setup.py -index 0d99aae..f0b7d7f 100644 ---- a/setup.py -+++ b/setup.py -@@ -28,7 +28,7 @@ it on the PyPI project page. If PyPI finds any issues, it will render it - instead as plain-text, which we do not want. - - To check in advance that PyPI will accept and parse the reST file as HTML, --you can use the rst2html program installed by the docutils package -+you can use the rst2html.py program installed by the docutils package - (http://docutils.sourceforge.net/). To install docutils: - - $ pip install docutils -@@ -89,30 +89,7 @@ import os - import shutil - import sys - -- --py_version = sys.version_info -- --# distutils does not seem to support the following setup() arguments. --# It displays a UserWarning when setup() is passed those options: --# --# * entry_points --# * install_requires --# --# distribute works with Python 2.3.5 and above: --# --# http://packages.python.org/distribute/setuptools.html#building-and-distributing-packages-with-distribute --# --if py_version < (2, 3, 5): -- # TODO: this might not work yet. -- import distutils as dist -- from distutils import core -- setup = core.setup --else: -- import setuptools as dist -- setup = dist.setup -- -- --VERSION = '0.5.4' # Also change in pystache/__init__.py. -+from setuptools import setup - - FILE_ENCODING = 'utf-8' - -@@ -126,22 +103,6 @@ TEMP_EXTENSION = '.temp' - - PREP_COMMAND = 'prep' - --CLASSIFIERS = ( -- 'Development Status :: 4 - Beta', -- 'License :: OSI Approved :: MIT License', -- 'Programming Language :: Python', -- 'Programming Language :: Python :: 2', -- 'Programming Language :: Python :: 2.4', -- 'Programming Language :: Python :: 2.5', -- 'Programming Language :: Python :: 2.6', -- 'Programming Language :: Python :: 2.7', -- 'Programming Language :: Python :: 3', -- 'Programming Language :: Python :: 3.1', -- 'Programming Language :: Python :: 3.2', -- 'Programming Language :: Python :: 3.3', -- 'Programming Language :: Python :: Implementation :: PyPy', --) -- - # Comments in reST begin with two dots. - RST_LONG_DESCRIPTION_INTRO = """\ - .. Do not edit this file. This file is auto-generated for PyPI by setup.py -@@ -221,7 +182,7 @@ def convert_md_to_rst(md_path, rst_temp_path): - - """ - # Pandoc uses the UTF-8 character encoding for both input and output. -- command = "pandoc --write=rst --output=%s %s" % (rst_temp_path, md_path) -+ command = "pandoc -f markdown-smart --write=rst --output=%s %s" % (rst_temp_path, md_path) - print("converting with pandoc: %s to %s\n-->%s" % (md_path, rst_temp_path, - command)) - -@@ -308,65 +269,9 @@ Run the following command and commit the changes-- - os.system('python setup.py sdist upload') - - --# We use the package simplejson for older Python versions since Python --# does not contain the module json before 2.6: --# --# http://docs.python.org/library/json.html --# --# Moreover, simplejson stopped officially support for Python 2.4 in version 2.1.0: --# --# https://github.com/simplejson/simplejson/blob/master/CHANGES.txt --# --requires = [] --if py_version < (2, 5): -- requires.append('simplejson<2.1') --elif py_version < (2, 6): -- requires.append('simplejson') -- --INSTALL_REQUIRES = requires -- --# TODO: decide whether to use find_packages() instead. I'm not sure that --# find_packages() is available with distutils, for example. --PACKAGES = [ -- 'pystache', -- 'pystache.commands', -- # The following packages are only for testing. -- 'pystache.tests', -- 'pystache.tests.data', -- 'pystache.tests.data.locator', -- 'pystache.tests.examples', --] -- -- --# The purpose of this function is to follow the guidance suggested here: --# --# http://packages.python.org/distribute/python3.html#note-on-compatibility-with-setuptools --# --# The guidance is for better compatibility when using setuptools (e.g. with --# earlier versions of Python 2) instead of Distribute, because of new --# keyword arguments to setup() that setuptools may not recognize. --def get_extra_args(): -- """ -- Return a dictionary of extra args to pass to setup(). -- -- """ -- extra = {} -- # TODO: it might be more correct to check whether we are using -- # Distribute instead of setuptools, since use_2to3 doesn't take -- # effect when using Python 2, even when using Distribute. -- if py_version >= (3, ): -- # Causes 2to3 to be run during the build step. -- extra['use_2to3'] = True -- -- return extra -- -- - def main(sys_argv): - - # TODO: use the logging module instead of printing. -- # TODO: include the following in a verbose mode. -- sys.stderr.write("pystache: using: version %s of %s\n" % (repr(dist.__version__), repr(dist))) -- - command = sys_argv[-1] - - if command == 'publish': -@@ -377,35 +282,10 @@ def main(sys_argv): - sys.exit() - - long_description = read(RST_DESCRIPTION_PATH) -- template_files = ['*.mustache', '*.txt'] -- extra_args = get_extra_args() -- -- setup(name='pystache', -- version=VERSION, -- license='MIT', -- description='Mustache for Python', -- long_description=long_description, -- author='Chris Wanstrath', -- author_email='chris@ozmm.org', -- maintainer='Chris Jerdonek', -- maintainer_email='chris.jerdonek@gmail.com', -- url='http://github.com/defunkt/pystache', -- install_requires=INSTALL_REQUIRES, -- packages=PACKAGES, -- package_data = { -- # Include template files so tests can be run. -- 'pystache.tests.data': template_files, -- 'pystache.tests.data.locator': template_files, -- 'pystache.tests.examples': template_files, -- }, -- entry_points = { -- 'console_scripts': [ -- 'pystache=pystache.commands.render:main', -- 'pystache-test=pystache.commands.test:main', -- ], -- }, -- classifiers = CLASSIFIERS, -- **extra_args -+ -+ setup( -+ long_description=long_description, -+ long_description_content_type='text/x-rst', - ) - - -diff --git a/setup_description.rst b/setup_description.rst -index 724c457..d7f1bc0 100644 ---- a/setup_description.rst -+++ b/setup_description.rst -@@ -4,13 +4,17 @@ - Pystache - ======== - --.. figure:: http://defunkt.github.com/pystache/images/logo_phillips.png -- :alt: mustachioed, monocled snake by David Phillips -+|ci| |Conda| |Wheels| |Release| |Python| - --.. figure:: https://secure.travis-ci.org/defunkt/pystache.png -- :alt: Travis CI current build status -+|Latest release| |License| |Maintainability| |codecov| - --`Pystache <http://defunkt.github.com/pystache>`__ is a Python -+This updated fork of Pystache is currently tested on Python 3.6+ and in -+Conda, on Linux, Macos, and Windows (Python 2.7 support has been -+removed). -+ -+|image9| -+ -+`Pystache <http://sarnold.github.com/pystache>`__ is a Python - implementation of `Mustache <http://mustache.github.com/>`__. Mustache - is a framework-agnostic, logic-free templating system inspired by - `ctemplate <http://code.google.com/p/google-ctemplate/>`__ and -@@ -23,62 +27,45 @@ page provides a good introduction to Mustache's syntax. For a more - complete (and more current) description of Mustache's behavior, see the - official `Mustache spec <https://github.com/mustache/spec>`__. - --Pystache is `semantically versioned <http://semver.org>`__ and can be --found on `PyPI <http://pypi.python.org/pypi/pystache>`__. This version --of Pystache passes all tests in `version --1.1.2 <https://github.com/mustache/spec/tree/v1.1.2>`__ of the spec. -+Pystache is `semantically versioned <http://semver.org>`__ and older -+versions can still be found on -+`PyPI <http://pypi.python.org/pypi/pystache>`__. This version of -+Pystache now passes all tests in `version -+1.1.3 <https://github.com/mustache/spec/tree/v1.1.3>`__ of the spec. - - Requirements - ------------ - - Pystache is tested with-- - --- Python 2.4 (requires simplejson `version -- 2.0.9 <http://pypi.python.org/pypi/simplejson/2.0.9>`__ or earlier) --- Python 2.5 (requires -- `simplejson <http://pypi.python.org/pypi/simplejson/>`__) --- Python 2.6 --- Python 2.7 --- Python 3.1 --- Python 3.2 --- Python 3.3 --- `PyPy <http://pypy.org/>`__ -+- Python 3.6 -+- Python 3.7 -+- Python 3.8 -+- Python 3.9 -+- Conda (py36-py39) - - `Distribute <http://packages.python.org/distribute/>`__ (the setuptools --fork) is recommended over --`setuptools <http://pypi.python.org/pypi/setuptools>`__, and is required --in some cases (e.g. for Python 3 support). If you use --`pip <http://www.pip-installer.org/>`__, you probably already satisfy --this requirement. -+fork) is no longer required over -+`setuptools <http://pypi.python.org/pypi/setuptools>`__, as the current -+packaging is now PEP517-compliant. - - JSON support is needed only for the command-line interface and to run --the spec tests. We require simplejson for earlier versions of Python --since Python's `json <http://docs.python.org/library/json.html>`__ --module was added in Python 2.6. -- --For Python 2.4 we require an earlier version of simplejson since --simplejson stopped officially supporting Python 2.4 in simplejson --version 2.1.0. Earlier versions of simplejson can be installed manually, --as follows: -- --:: -- -- pip install 'simplejson<2.1.0' -+the spec tests; PyYAML can still be used (see the Develop section). - --Official support for Python 2.4 will end with Pystache version 0.6.0. -+Official support for Python 2 will end with Pystache version 0.6.0. - - Install It - ---------- - - :: - -- pip install pystache -+ pip install -U pystache -f https://github.com/sarnold/pystache/releases/ - - And test it-- - - :: - -- pystache-test -+ pystache-test - - To install and test from source (e.g. from GitHub), see the Develop - section. -@@ -88,68 +75,68 @@ Use It - - :: - -- >>> import pystache -- >>> print pystache.render('Hi {{person}}!', {'person': 'Mom'}) -- Hi Mom! -+ >>> import pystache -+ >>> print(pystache.render('Hi {{person}}!', {'person': 'Mom'})) -+ Hi Mom! - - You can also create dedicated view classes to hold your view logic. - --Here's your view class (in .../examples/readme.py): -+Here's your view class (in ../pystache/tests/examples/readme.py): - - :: - -- class SayHello(object): -- def to(self): -- return "Pizza" -+ class SayHello(object): -+ def to(self): -+ return "Pizza" - - Instantiating like so: - - :: - -- >>> from pystache.tests.examples.readme import SayHello -- >>> hello = SayHello() -+ >>> from pystache.tests.examples.readme import SayHello -+ >>> hello = SayHello() - --Then your template, say\_hello.mustache (by default in the same --directory as your class definition): -+Then your template, say_hello.mustache (by default in the same directory -+as your class definition): - - :: - -- Hello, {{to}}! -+ Hello, {{to}}! - - Pull it together: - - :: - -- >>> renderer = pystache.Renderer() -- >>> print renderer.render(hello) -- Hello, Pizza! -+ >>> renderer = pystache.Renderer() -+ >>> print(renderer.render(hello)) -+ Hello, Pizza! - - For greater control over rendering (e.g. to specify a custom template - directory), use the ``Renderer`` class like above. One can pass - attributes to the Renderer class constructor or set them on a Renderer - instance. To customize template loading on a per-view basis, subclass - ``TemplateSpec``. See the docstrings of the --`Renderer <https://github.com/defunkt/pystache/blob/master/pystache/renderer.py>`__ -+`Renderer <https://github.com/sarnold/pystache/blob/master/pystache/renderer.py>`__ - class and --`TemplateSpec <https://github.com/defunkt/pystache/blob/master/pystache/template_spec.py>`__ -+`TemplateSpec <https://github.com/sarnold/pystache/blob/master/pystache/template_spec.py>`__ - class for more information. - - You can also pre-parse a template: - - :: - -- >>> parsed = pystache.parse(u"Hey {{#who}}{{.}}!{{/who}}") -- >>> print parsed -- [u'Hey ', _SectionNode(key=u'who', index_begin=12, index_end=18, parsed=[_EscapeNode(key=u'.'), u'!'])] -+ >>> parsed = pystache.parse(u"Hey {{#who}}{{.}}!{{/who}}") -+ >>> print(parsed) -+ ['Hey ', _SectionNode(key='who', index_begin=12, index_end=18, parsed=[_EscapeNode(key='.'), '!'])] - - And then: - - :: - -- >>> print renderer.render(parsed, {'who': 'Pops'}) -- Hey Pops! -- >>> print renderer.render(parsed, {'who': 'you'}) -- Hey you! -+ >>> print(renderer.render(parsed, {'who': 'Pops'})) -+ Hey Pops! -+ >>> print(renderer.render(parsed, {'who': 'you'})) -+ Hey you! - - Python 3 - -------- -@@ -211,22 +198,24 @@ To test from a source distribution (without installing)-- - - :: - -- python test_pystache.py -+ python test_pystache.py - - To test Pystache with multiple versions of Python (with a single --command!), you can use `tox <http://pypi.python.org/pypi/tox>`__: -+command!) and different platforms, you can use -+`tox <http://pypi.python.org/pypi/tox>`__: - - :: - -- pip install 'virtualenv<1.8' # Version 1.8 dropped support for Python 2.4. -- pip install 'tox<1.4' # Version 1.4 dropped support for Python 2.4. -- tox -+ pip install tox -+ tox -e setup - --If you do not have all Python versions listed in ``tox.ini``-- -+To run tests on multiple versions with coverage, run: - - :: - -- tox -e py26,py32 # for example -+ tox -e py38-linux,py39-linux # for example -+ -+(substitute your platform above, eg, macos or windows) - - The source distribution tests also include doctests and tests from the - Mustache spec. To include tests from the Mustache spec in your test -@@ -234,8 +223,8 @@ runs: - - :: - -- git submodule init -- git submodule update -+ git submodule init -+ git submodule update - - The test harness parses the spec's (more human-readable) yaml files if - `PyYAML <http://pypi.python.org/pypi/PyYAML>`__ is present. Otherwise, -@@ -243,94 +232,113 @@ it parses the json files. To install PyYAML-- - - :: - -- pip install pyyaml -+ pip install pyyaml -+ -+Once the submodule is available, you can run the full test set with: -+ -+:: -+ -+ tox -e setup . ext/spec/specs - - To run a subset of the tests, you can use - `nose <http://somethingaboutorange.com/mrl/projects/nose/0.11.1/testing.html>`__: - - :: - -- pip install nose -- nosetests --tests pystache/tests/test_context.py:GetValueTests.test_dictionary__key_present -+ pip install nose -+ nosetests --tests pystache/tests/test_context.py:GetValueTests.test_dictionary__key_present - --Using Python 3 with Pystache from source --~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+Mailing List (old) -+------------------ - --Pystache is written in Python 2 and must be converted to Python 3 prior --to using it with Python 3. The installation process (and tox) do this --automatically. -+There is(was) a `mailing -+list <http://librelist.com/browser/pystache/>`__. Note that there is a -+bit of a delay between posting a message and seeing it appear in the -+mailing list archive. - --To convert the code to Python 3 manually (while using Python 3)-- -+Credits -+------- - - :: - -- python setup.py build -+ >>> import pystache -+ >>> context = { 'author': 'Chris Wanstrath', 'maintainer': 'Chris Jerdonek','refurbisher': 'Steve Arnold' } -+ >>> print(pystache.render("Author: {{author}}\nMaintainer: {{maintainer}}\nRefurbisher: {{refurbisher}}", context)) -+ Author: Chris Wanstrath -+ Maintainer: Chris Jerdonek -+ Refurbisher: Steve Arnold - --This writes the converted code to a subdirectory called ``build``. By --design, Python 3 builds --`cannot <https://bitbucket.org/tarek/distribute/issue/292/allow-use_2to3-with-python-2>`__ --be created from Python 2. -+Pystache logo by `David Phillips <http://davidphillips.us/>`__ is -+licensed under a `Creative Commons Attribution-ShareAlike 3.0 Unported -+License <http://creativecommons.org/licenses/by-sa/3.0/deed.en_US>`__. -+|image10| - --To convert the code without using setup.py, you can use --`2to3 <http://docs.python.org/library/2to3.html>`__ as follows (two --steps)-- -+History -+======= - --:: -+**Note:** Official support for Python 2.7 will end with Pystache version -+0.6.0. - -- 2to3 --write --nobackups --no-diffs --doctests_only pystache -- 2to3 --write --nobackups --no-diffs pystache -+0.6.0 (2021-03-04) -+------------------ - --This converts the code (and doctests) in place. -+- Bump spec versions to latest => v1.1.3 -+- Modernize python and CI tools, update docs/doctests -+- Update unicode conversion test for py3-only -+- Add pep8speaks cfg, cleanup warnings -+- Remove superfluous setup test/unused imports -+- Add conda recipe/CI build - --To ``import pystache`` from a source distribution while using Python 3, --be sure that you are importing from a directory containing a converted --version of the code (e.g. from the ``build`` directory after --converting), and not from the original (unconverted) source directory. --Otherwise, you will get a syntax error. You can help prevent this by not --running the Python IDE from the project directory when importing --Pystache while using Python 3. -+.. _section-1: - --Mailing List -------------- -+0.5.6 (2021-02-28) -+------------------ - --There is a `mailing list <http://librelist.com/browser/pystache/>`__. --Note that there is a bit of a delay between posting a message and seeing --it appear in the mailing list archive. -+- Use correct wheel name in release workflow, limit wheels -+- Add install check/test of downloaded wheel -+- Update/add ci workflows and tox cfg, bump to next dev0 version - --Credits --------- -+.. _section-2: - --:: -+0.5.5 (2020-12-16) -+------------------ - -- >>> context = { 'author': 'Chris Wanstrath', 'maintainer': 'Chris Jerdonek' } -- >>> print pystache.render("Author: {{author}}\nMaintainer: {{maintainer}}", context) -- Author: Chris Wanstrath -- Maintainer: Chris Jerdonek -+- fix document processing, update pandoc args and history -+- add release.yml to CI, test env settings -+- fix bogus commit message, update versions and tox cf -+- add post-test steps for building pkgs with/without doc updates -+- add CI build check, fix MANIFEST.in pruning - --Pystache logo by `David Phillips <http://davidphillips.us/>`__ is --licensed under a `Creative Commons Attribution-ShareAlike 3.0 Unported --License <http://creativecommons.org/licenses/by-sa/3.0/deed.en_US>`__. --|image0| -+.. _section-3: - --History --======= -+0.5.4-2 (2020-11-09) -+-------------------- - --**Note:** Official support for Python 2.4 will end with Pystache version --0.6.0. -+- Merge pull request #1 from sarnold/rebase-up -+- Bugfix: test_specloader.py: fix test_find__with_directory on other -+ OSs -+- Bugfix: pystache/loader.py: remove stray windows line-endings -+- fix crufty (and insecure) http urls -+- Bugfix: modernize python versions (keep py27) and fix spec_test load -+ cmd -+ -+.. _section-4: - - 0.5.4 (2014-07-11) - ------------------ - - - Bugfix: made test with filenames OS agnostic (issue #162). - -+.. _section-5: -+ - 0.5.3 (2012-11-03) - ------------------ - - - Added ability to customize string coercion (e.g. to have None render - as ``''``) (issue #130). --- Added Renderer.render\_name() to render a template by name (issue -+- Added Renderer.render_name() to render a template by name (issue - #122). --- Added TemplateSpec.template\_path to specify an absolute path to a -+- Added TemplateSpec.template_path to specify an absolute path to a - template (issue #41). - - Added option of raising errors on missing tags/partials: - ``Renderer(missing_tags='strict')`` (issue #110). -@@ -355,6 +363,8 @@ History - - More robust handling of byte strings in Python 3. - - Added Creative Commons license for David Phillips's logo. - -+.. _section-6: -+ - 0.5.2 (2012-05-03) - ------------------ - -@@ -367,16 +377,20 @@ History - context stack (issue #113). - - Bugfix: lists of lambdas for sections were not rendered (issue #114). - -+.. _section-7: -+ - 0.5.1 (2012-04-24) - ------------------ - - - Added support for Python 3.1 and 3.2. - - Added tox support to test multiple Python versions. - - Added test script entry point: pystache-test. --- Added \_\_version\_\_ package attribute. -+- Added \__version_\_ package attribute. - - Test harness now supports both YAML and JSON forms of Mustache spec. - - Test harness no longer requires nose. - -+.. _section-8: -+ - 0.5.0 (2012-04-03) - ------------------ - -@@ -435,11 +449,15 @@ Bug fixes: - - Passing ``**kwargs`` to ``Template()`` with no context no longer - raises an exception. - -+.. _section-9: -+ - 0.4.1 (2012-03-25) - ------------------ - - - Added support for Python 2.4. [wangtz, jvantuyl] - -+.. _section-10: -+ - 0.4.0 (2011-01-12) - ------------------ - -@@ -447,19 +465,25 @@ Bug fixes: - - Add support for inverted lists - - Decoupled template loading - -+.. _section-11: -+ - 0.3.1 (2010-05-07) - ------------------ - - - Fix package - -+.. _section-12: -+ - 0.3.0 (2010-05-03) - ------------------ - --- View.template\_path can now hold a list of path -+- View.template_path can now hold a list of path - - Add {{& blah}} as an alias for {{{ blah }}} - - Higher Order Sections - - Inverted sections - -+.. _section-13: -+ - 0.2.0 (2010-02-15) - ------------------ - -@@ -473,12 +497,16 @@ Bug fixes: - [enaeseth] - - Template file encoding awareness. [enaeseth] - -+.. _section-14: -+ - 0.1.1 (2009-11-13) - ------------------ - - - Ensure we're dealing with strings, always - - Tests can be run by executing the test file directly - -+.. _section-15: -+ - 0.1.0 (2009-11-12) - ------------------ - -@@ -510,4 +538,23 @@ 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. - --.. |image0| image:: http://i.creativecommons.org/l/by-sa/3.0/88x31.png -+.. |ci| image:: https://github.com/sarnold/pystache/actions/workflows/ci.yml/badge.svg -+ :target: https://github.com/sarnold/pystache/actions/workflows/ci.yml -+.. |Conda| image:: https://github.com/sarnold/pystache/actions/workflows/conda.yml/badge.svg -+ :target: https://github.com/sarnold/pystache/actions/workflows/conda.yml -+.. |Wheels| image:: https://github.com/sarnold/pystache/actions/workflows/wheels.yml/badge.svg -+ :target: https://github.com/sarnold/pystache/actions/workflows/wheels.yml -+.. |Release| image:: https://github.com/sarnold/pystache/actions/workflows/release.yml/badge.svg -+ :target: https://github.com/sarnold/pystache/actions/workflows/release.yml -+.. |Python| image:: https://img.shields.io/badge/python-3.6+-blue.svg -+ :target: https://www.python.org/downloads/ -+.. |Latest release| image:: https://img.shields.io/github/v/release/sarnold/pystache?include_prereleases -+ :target: https://github.com/sarnold/pystache/releases/latest -+.. |License| image:: https://img.shields.io/github/license/sarnold/pystache -+ :target: https://github.com/sarnold/pystache/blob/master/LICENSE -+.. |Maintainability| image:: https://api.codeclimate.com/v1/badges/a8fa1bf4638bfc6581b6/maintainability -+ :target: https://codeclimate.com/github/sarnold/pystache/maintainability -+.. |codecov| image:: https://codecov.io/gh/sarnold/pystache/branch/master/graph/badge.svg?token=5PZNMZBI6K -+ :target: https://codecov.io/gh/sarnold/pystache -+.. |image9| image:: gh/images/logo_phillips_small.png -+.. |image10| image:: http://i.creativecommons.org/l/by-sa/3.0/88x31.png -diff --git a/tox.ini b/tox.ini -index d1eaebf..66c4515 100644 ---- a/tox.ini -+++ b/tox.ini -@@ -1,36 +1,110 @@ --# A tox configuration file to test across multiple Python versions. --# --# http://pypi.python.org/pypi/tox --# - [tox] --# Tox 1.4 drops py24 and adds py33. In the current version, we want to --# support 2.4, so we can't simultaneously support 3.3. --envlist = py24,py25,py26,py27,py27-yaml,py27-noargs,py31,py32,pypy -+envlist = py{36,37,38,39}-{linux,macos,windows} -+skip_missing_interpreters = true -+isolated_build = true -+#skipsdist = true -+ -+[gh-actions] -+python = -+ 3.6: py36 -+ 3.7: py37 -+ 3.8: py38 -+ 3.9: py39 -+ -+[gh-actions:env] -+PLATFORM = -+ ubuntu-18.04: linux -+ macos-latest: macos -+ windows-latest: windows - - [testenv] -+passenv = CI PYTHON PYTHONIOENCODING -+ -+deps = -+ pip>=20.0.1 -+ nose -+ coverage -+ -+commands = -+ nosetests -sx . {posargs} -+ -+[testenv:bare] - # Change the working directory so that we don't import the pystache located - # in the original location. -+deps = -+ pip>=20.0.1 -+ -e . -+ - changedir = - {envbindir} -+ - commands = -- pystache-test {toxinidir} -+ pystache-test -+ -+[testenv:bench] -+passenv = CI PYTHON PYTHONIOENCODING - --# Check that the spec tests work with PyYAML. --[testenv:py27-yaml] --basepython = -- python2.7 - deps = -- PyYAML --changedir = -- {envbindir} -+ pip>=20.0.1 -+ # uncomment for comparison, posargs expects a number, eg, 10000 -+ #chevron -+ -+commands_pre = -+ pip install . -+ - commands = -- pystache-test {toxinidir} -+ python pystache/tests/benchmark.py {posargs} -+ -+[testenv:setup] -+passenv = CI PYTHON PYTHONIOENCODING -+ -+deps = -+ pyyaml -+ twine -+ -+commands = -+ python setup.py install -+ twine check dist/* -+ pystache-test {posargs} -+ -+[testenv:deploy] -+passenv = CI PYTHON PYTHONIOENCODING -+allowlist_externals = bash -+ -+deps = -+ pip>=19.0.1 -+ wheel -+ pep517 -+ twine -+ -+commands = -+ python -m pep517.build . -+ twine check dist/* -+ -+[testenv:check] -+passenv = CI PYTHON PYTHONIOENCODING -+skip_install = true -+ -+allowlist_externals = bash -+ -+deps = -+ pip>=20.0.1 - --# Check that pystache-test works from an install with no arguments. --[testenv:py27-noargs] --basepython = -- python2.7 --changedir = -- {envbindir} - commands = -+ bash -c 'export WHL_FILE=$(ls dist/*.whl); \ -+ python -m pip install $WHL_FILE' - pystache-test -+ -+[testenv:docs] -+passenv = CI PYTHON PYTHONIOENCODING -+allowlist_externals = bash -+ -+deps = -+ pip>=19.0.1 -+ wheel -+ docutils -+ # apt/emerge pandoc first -+ -+commands = -+ python setup.py prep -+ bash -c 'python setup.py --long-description | rst2html.py -v --no-raw > out.html' -diff --git a/travis.yml_disabled b/travis.yml_disabled -new file mode 100644 -index 0000000..f0b4042 ---- /dev/null -+++ b/travis.yml_disabled -@@ -0,0 +1,52 @@ -+dist: xenial -+language: python -+ -+# Travis CI has no plans to support Jython and no longer supports Python 2.5. -+python: -+ - "2.7" -+ - "3.5" -+ - "3.6" -+ - "3.7" -+ - "3.8" -+ - "3.9-dev" -+ - "nightly" -+ -+matrix: -+ fast_finish: true -+ include: -+ - os: osx -+ # osx is goofy, ``python`` is always py2, images mutate fast -+ language: shell -+ before_install: -+ - pip3 install --upgrade pip wheel -+ install: -+ - python3 setup.py install -+ script: -+ - pystache-test . ext/spec/specs -+ - os: windows -+ # windows is even goofier, install path is different for python/python3 -+ # but either way you get python3 and the cmd is always ``python`` o.O -+ # (also versions mutuate like bacteria) -+ language: shell -+ before_install: -+ - choco install python3 --params "/InstallDir:C:\\Python" -+ - python -m pip install --upgrade pip wheel -+ env: PATH="/c/Python:/c/Python/Scripts:$PATH" -+ install: -+ - python setup.py install -+ script: -+ - pystache-test . ext/spec/specs -+ allow_failures: -+ - python: "nightly" -+ -+# command to install dependencies -+install: -+ - pip install --upgrade pip -+ - pip install codecov -+ -+script: -+ - python setup.py install -+ # Include the spec tests directory for Mustache spec tests and the -+ # project directory for doctests. -+ - pystache-test . ext/spec/specs -+ #- tox --- -2.33.0 - 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 0ae5a19115..0000000000 --- a/meta-python/recipes-devtools/python/python3-pystache_0.5.4.bb +++ /dev/null @@ -1,17 +0,0 @@ -SUMMARY = "Python implementation of Mustache" -HOMEPAGE = "https://github.com/defunkt/pystache" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=eb4417802c56384aac71b34505528a60" - -SRC_URI += "file://0001-Modernize-python-versions-remove-py2x-and-fix-tests-.patch" - -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 cdfb7d3b0c..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.16.0.bb b/meta-python/recipes-devtools/python/python3-pytest-asyncio_0.16.0.bb deleted file mode 100644 index 1dfeab6332..0000000000 --- a/meta-python/recipes-devtools/python/python3-pytest-asyncio_0.16.0.bb +++ /dev/null @@ -1,14 +0,0 @@ -DESCRIPTION = "pytest-asyncio is an Apache2 licensed library, written in Python, for testing asyncio code with pytest" - -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=d2794c0df5b907fdace235a619d80314" - -SRC_URI[sha256sum] = "7496c5977ce88c34379df64a66459fe395cd05543f0a2f837016e7144391fcfb" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-pytest \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pytest-asyncio_0.23.6.bb b/meta-python/recipes-devtools/python/python3-pytest-asyncio_0.23.6.bb new file mode 100644 index 0000000000..492020477e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pytest-asyncio_0.23.6.bb @@ -0,0 +1,16 @@ +DESCRIPTION = "pytest-asyncio is an Apache2 licensed library, written in Python, for testing asyncio code with pytest" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=136e4f49dbf29942c572a3a8f6e88a77" + +SRC_URI[sha256sum] = "ffe523a89c1c222598c76856e76852b787504ddb72dd5d9b6617ffa8aa2cde5f" + +inherit pypi python_setuptools_build_meta + +DEPENDS += "python3-setuptools-scm-native" + +RDEPENDS:${PN} += " \ + python3-pytest \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pytest-benchmark_3.4.1.bb b/meta-python/recipes-devtools/python/python3-pytest-benchmark_4.0.0.bb index bde9935ffe..98ba6c3822 100644 --- a/meta-python/recipes-devtools/python/python3-pytest-benchmark_3.4.1.bb +++ b/meta-python/recipes-devtools/python/python3-pytest-benchmark_4.0.0.bb @@ -1,12 +1,9 @@ -# Copyright (C) 2021 Khem Raj <raj.khem@gmail.com> -# Released under the MIT license (see COPYING.MIT for the terms) - SUMMARY = "A ``pytest`` fixture for benchmarking code. It will group the tests into rounds that are calibrated to the chosen timer." HOMEPAGE = "https://github.com/ionelmc/pytest-benchmark" LICENSE = "BSD-2-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=9c5c2c74370826468065c5702b8a1fcf" +LIC_FILES_CHKSUM = "file://LICENSE;md5=c7d2e9d24c2b5bad57ca894da972e22e" -SRC_URI[sha256sum] = "40e263f912de5a81d891619032983557d62a3d85843f9a9f30b98baea0cd7b47" +SRC_URI[sha256sum] = "fb0785b83efe599a6a956361c0691ae1dbb5318018561af10f3e915caa0048d1" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-pytest-cov_5.0.0.bb b/meta-python/recipes-devtools/python/python3-pytest-cov_5.0.0.bb new file mode 100644 index 0000000000..e3e4affb9d --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pytest-cov_5.0.0.bb @@ -0,0 +1,15 @@ +SUMMARY = "Pytest plugin for measuring coverage." +HOMEPAGE = "https://github.com/pytest-dev/pytest-cov" +LICENSE = "MIT" +LIC_FILES_CHKSUM = " \ + file://LICENSE;md5=cbc4e25353c748c817db2daffe605e43 \ +" + +SRC_URI[sha256sum] = "5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857" + +inherit pypi setuptools3 + +DEPENDS += "python3-setuptools-scm-native" +RDEPENDS:${PN} += "python3-coverage python3-pytest" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pytest-forked_1.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-freezer_0.4.8.bb b/meta-python/recipes-devtools/python/python3-pytest-freezer_0.4.8.bb new file mode 100644 index 0000000000..6ff69a3964 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pytest-freezer_0.4.8.bb @@ -0,0 +1,15 @@ +SUMMARY = "Pytest plugin providing a fixture interface for spulec/freezegun" +HOMEPAGE = "https://github.com/pytest-dev/pytest-freezer" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=1661a0f2b9b83ed73b8e05b5683b10d0" + +SRC_URI[sha256sum] = "8ee2f724b3ff3540523fa355958a22e6f4c1c819928b78a7a183ae4248ce6ee6" + +inherit pypi python_flit_core + +RDEPENDS:${PN} = "\ + python3-freezegun (>=1.0) \ + python3-pytest (>=3.6) \ +" + +PYPI_PACKAGE = "pytest_freezer" diff --git a/meta-python/recipes-devtools/python/python3-pytest-helpers-namespace_2021.4.29.bb b/meta-python/recipes-devtools/python/python3-pytest-helpers-namespace_2021.12.29.bb index c1f9f96ff4..6698b6dde3 100644 --- a/meta-python/recipes-devtools/python/python3-pytest-helpers-namespace_2021.4.29.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] = "183524e3db4e2a1fea92e0ca3662a624ba44c9f3568da15679d7535ba6838a6a" +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 \ + 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 cd0450f519..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..154ec255cb --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pytest-html_4.1.1.bb @@ -0,0 +1,23 @@ +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-jinja2 \ + python3-pytest \ + python3-pytest-metadata \ +" + +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.1.1.bb b/meta-python/recipes-devtools/python/python3-pytest-lazy-fixtures_1.1.1.bb new file mode 100644 index 0000000000..bd6d81aec4 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pytest-lazy-fixtures_1.1.1.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] = "0c561f0d29eea5b55cf29b9264a3241999ffdb74c6b6e8c4ccc0bd2c934d01ed" + +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 060eee3a5a..9243f6646e 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,15 @@ 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 +inherit pypi python_poetry_core RDEPENDS:${PN} = " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pytest-mock/0001-test_pytest_mock-skip-args-introspection-tests.patch b/meta-python/recipes-devtools/python/python3-pytest-mock/0001-test_pytest_mock-skip-args-introspection-tests.patch new file mode 100644 index 0000000000..f024e79d93 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pytest-mock/0001-test_pytest_mock-skip-args-introspection-tests.patch @@ -0,0 +1,38 @@ +From e184fb950ad3b52c5c16438d39fe4d516c784e30 Mon Sep 17 00:00:00 2001 +From: Trevor Gamblin <tgamblin@baylibre.com> +Date: Thu, 12 Oct 2023 17:32:40 -0400 +Subject: [PATCH] test_pytest_mock: skip args introspection tests + +Disable these two tests for now so that python3-pytest-mock can have +successful ptest runs. + +Upstream-Status: Inappropriate [OE-Specific] + +Signed-off-by: Trevor Gamblin <tgamblin@baylibre.com> +--- + tests/test_pytest_mock.py | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/tests/test_pytest_mock.py b/tests/test_pytest_mock.py +index 3d53241..157b6c3 100644 +--- a/tests/test_pytest_mock.py ++++ b/tests/test_pytest_mock.py +@@ -581,6 +581,7 @@ def test_assert_called_wrapper(mocker: MockerFixture) -> None: + stub.assert_called() + + ++@pytest.mark.skip("Async not correctly detected, skip for now") + @pytest.mark.usefixtures("needs_assert_rewrite") + def test_assert_called_args_with_introspection(mocker: MockerFixture) -> None: + stub = mocker.stub() +@@ -597,6 +598,7 @@ def test_assert_called_args_with_introspection(mocker: MockerFixture) -> None: + stub.assert_called_once_with(*wrong_args) + + ++@pytest.mark.skip("Async not correctly detected, skip for now") + @pytest.mark.usefixtures("needs_assert_rewrite") + def test_assert_called_kwargs_with_introspection(mocker: MockerFixture) -> None: + stub = mocker.stub() +-- +2.41.0 + diff --git a/meta-python/recipes-devtools/python/python3-pytest-mock/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.14.0.bb b/meta-python/recipes-devtools/python/python3-pytest-mock_3.14.0.bb new file mode 100644 index 0000000000..fe2479c836 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pytest-mock_3.14.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://0001-test_pytest_mock-skip-args-introspection-tests.patch \ + file://run-ptest \ +" +SRCREV = "8733134b6194395e9cd3c745adcc9a9c09b0279e" + +inherit python_setuptools_build_meta ptest + +DEPENDS += "python3-setuptools-scm-native" + +RDEPENDS:${PN} += " \ + python3-asyncio \ + python3-mock \ + 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.1.bb b/meta-python/recipes-devtools/python/python3-pytest-runner_5.3.1.bb deleted file mode 100644 index 28b7053218..0000000000 --- a/meta-python/recipes-devtools/python/python3-pytest-runner_5.3.1.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] = "0fce5b8dc68760f353979d99fdd6b3ad46330b6b1837e2077a89ebcf204aac91" - -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-runner_6.0.1.bb b/meta-python/recipes-devtools/python/python3-pytest-runner_6.0.1.bb new file mode 100644 index 0000000000..e5e5e048bd --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pytest-runner_6.0.1.bb @@ -0,0 +1,15 @@ +SUMMARY = "Invoke py.test as distutils command with dependency resolution" +HOMEPAGE = "https://pypi.org/project/pytest-runner/" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=7a7126e068206290f3fe9f8d6c713ea6" + +SRC_URI[sha256sum] = "70d4739585a7008f37bf4933c013fdb327b8878a5a69fcbb3316c88882f0f49b" + +inherit pypi python_setuptools_build_meta + +DEPENDS += " \ + python3-setuptools-scm-native" + +RDEPENDS:${PN} = "python3-setuptools python3-debugger python3-json python3-io" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pytest-socket_0.7.0.bb b/meta-python/recipes-devtools/python/python3-pytest-socket_0.7.0.bb new file mode 100644 index 0000000000..86b03724a0 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pytest-socket_0.7.0.bb @@ -0,0 +1,14 @@ +SUMMARY = "Pytest Plugin to disable socket calls during tests" +HOMEPAGE = "https://github.com/miketheman/pytest-socket" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=1752f63a3a8a02fed42e580e9b94a081" + +SRC_URI[sha256sum] = "71ab048cbbcb085c15a4423b73b619a8b35d6a307f46f78ea46be51b1b7e11b3" + +inherit pypi python_poetry_core + +RDEPENDS:${PN} = "python3-pytest" + +BBCLASSEXTEND = "native nativesdk" + +PYPI_PACKAGE = "pytest_socket" diff --git a/meta-python/recipes-devtools/python/python3-pytest-subtests_0.5.0.bb b/meta-python/recipes-devtools/python/python3-pytest-subtests_0.5.0.bb deleted file mode 100644 index 2e03512bde..0000000000 --- a/meta-python/recipes-devtools/python/python3-pytest-subtests_0.5.0.bb +++ /dev/null @@ -1,16 +0,0 @@ -DESCRIPTION = "unittest subTest() support and subtests fixture." - -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=242b4e17fa287dcf7aef372f6bc3dcb1" - -SRC_URI[sha256sum] = "5bd1e4bf0eda4c89a6cd42b0ee28e1d2ca0848de3fd67ad8cdd6d559ed00f120" - -inherit pypi setuptools3 - -DEPENDS += "${PYTHON_PN}-setuptools-scm-native" - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-pytest \ -" - -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 972c99e38f..dff6af4e0a 100644 --- a/meta-python/recipes-devtools/python/python3-pytest-tempdir_2019.10.12.bb +++ b/meta-python/recipes-devtools/python/python3-pytest-tempdir_2019.10.12.bb @@ -10,5 +10,5 @@ SRC_URI[sha256sum] = "e7d91813a9aa991db87dacdef8cfd3f1657632d731d56d06238c5ffb63 inherit pypi setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ " diff --git a/meta-python/recipes-devtools/python/python3-pytest-timeout_2.0.1.bb b/meta-python/recipes-devtools/python/python3-pytest-timeout_2.3.1.bb index a790a6551f..fe9d814c0e 100644 --- a/meta-python/recipes-devtools/python/python3-pytest-timeout_2.0.1.bb +++ b/meta-python/recipes-devtools/python/python3-pytest-timeout_2.3.1.bb @@ -3,10 +3,8 @@ HOMEPAGE = "https://github.com/pytest-dev/pytest-timeout/" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=d8048cd156eda3df2e7f111b0ae9ceff" -PYPI_PACKAGE = "pytest-timeout" +SRC_URI[sha256sum] = "12397729125c6ecbdaca01035b9e5239d4db97352320af155b3f5de1ba5165d9" -SRC_URI[sha256sum] = "a5ec4eceddb8ea726911848593d668594107e797621e97f93a1d1dbc6fbb9080" +inherit pypi python_setuptools_build_meta -inherit pypi setuptools3 - -RDEPENDS:${PN} = "${PYTHON_PN}-pytest" +RDEPENDS:${PN} = "python3-pytest" diff --git a/meta-python/recipes-devtools/python/python3-pytest-unordered_0.6.0.bb b/meta-python/recipes-devtools/python/python3-pytest-unordered_0.6.0.bb new file mode 100644 index 0000000000..bf1420cf93 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pytest-unordered_0.6.0.bb @@ -0,0 +1,12 @@ +SUMMARY = "Test equality of unordered collections in pytest" +HOMEPAGE = "https://github.com/utapyngo/pytest-unordered" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=fcd3af2d38a4d4dfd5138c6f163dbe2e" + +SRC_URI[sha256sum] = "f61b4f6e06a60a92db50968954efac93e2f584290a49f53ad135e3f32f57e02a" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-pytest" + +BBCLASSEXTEND = "native nativesdk" 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.12118.bb b/meta-python/recipes-devtools/python/python3-python-vlc_3.0.20123.bb index 3e799cf622..960da1437c 100644 --- a/meta-python/recipes-devtools/python/python3-python-vlc_3.0.12118.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] = "566f2f7c303f6800851cacc016df1c6eeec094ad63e0a49d87db9d698094f1fb" +SRC_URI[sha256sum] = "244fbb9e392a0326841fca926d6d12a2a36c546982191f493f148fa19e66b1d4" inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-ctypes \ + python3-logging \ +" diff --git a/meta-python/recipes-devtools/python/python3-pythonping_1.1.0.bb b/meta-python/recipes-devtools/python/python3-pythonping_1.1.4.bb index 55e642c278..62f5c0caad 100644 --- a/meta-python/recipes-devtools/python/python3-pythonping_1.1.0.bb +++ b/meta-python/recipes-devtools/python/python3-pythonping_1.1.4.bb @@ -4,7 +4,7 @@ SECTION = "devel/python" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://setup.py;beginline=12;endline=12;md5=2d33c00f47720c7e35e1fdb4b9fab027" -SRC_URI[sha256sum] = "71199bdeee942ba1258b65f88ca5624278e63b31e7643ee8ca7292d2f5f77e99" +SRC_URI[sha256sum] = "acef84640fee6f20b725f2a1d2392771f2845554cfabcef30b1fdea5030161af" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-pytoml/run-ptest b/meta-python/recipes-devtools/python/python3-pytoml/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-pytoml/run-ptest +++ b/meta-python/recipes-devtools/python/python3-pytoml/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-pytoml_0.1.21.bb b/meta-python/recipes-devtools/python/python3-pytoml_0.1.21.bb index 0f04a12039..1717085967 100644 --- a/meta-python/recipes-devtools/python/python3-pytoml_0.1.21.bb +++ b/meta-python/recipes-devtools/python/python3-pytoml_0.1.21.bb @@ -16,12 +16,13 @@ SRC_URI += " \ " RDEPENDS:${PN} += " \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-stringold \ + python3-datetime \ + python3-stringold \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-pytz-deprecation-shim_0.1.0.post0.bb b/meta-python/recipes-devtools/python/python3-pytz-deprecation-shim_0.1.0.post0.bb deleted file mode 100644 index 76487c830f..0000000000 --- a/meta-python/recipes-devtools/python/python3-pytz-deprecation-shim_0.1.0.post0.bb +++ /dev/null @@ -1,16 +0,0 @@ -SUMMARY = "Shims to help you safely remove pytz" -HOMEPAGE = "https://github.com/pganssle/pytz-deprecation-shim" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=fca9fd5c15a28eb874ba38577a585d48" - -SRC_URI[sha256sum] = "af097bae1b616dde5c5744441e2ddc69e74dfdcb0c263129610d85b87445a59d" - -PYPI_PACKAGE = "pytz_deprecation_shim" -PYPI_SRC_URI = "https://files.pythonhosted.org/packages/94/f0/909f94fea74759654390a3e1a9e4e185b6cd9aa810e533e3586f39da3097/${PYPI_PACKAGE}-${PV}.tar.gz" - -inherit pypi setuptools3 - -do_compile:prepend() { - echo "from setuptools import setup" > ${S}/setup.py - echo "setup()" >> ${S}/setup.py -} 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.3.bb b/meta-python/recipes-devtools/python/python3-pytz_2021.3.bb deleted file mode 100644 index 119342a4bd..0000000000 --- a/meta-python/recipes-devtools/python/python3-pytz_2021.3.bb +++ /dev/null @@ -1,35 +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[sha256sum] = "acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326" - -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 dc70b482b1..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.3.bb b/meta-python/recipes-devtools/python/python3-pyudev_0.24.3.bb new file mode 100644 index 0000000000..a44fdad3fd --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyudev_0.24.3.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] = "2e945427a21674893bb97632401db62139d91cea1ee96137cc7b07ad22198fc7" + +inherit pypi python_setuptools_build_meta + +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_16.0.0.bb b/meta-python/recipes-devtools/python/python3-pyunormalize_16.0.0.bb new file mode 100644 index 0000000000..19463bc224 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyunormalize_16.0.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=e2c2ee871081d4e4c24f32e37c413c73" + +SRC_URI[sha256sum] = "2e1dfbb4a118154ae26f70710426a52a364b926c9191f764601f5a8cb12761f7" + +inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-pyusb_1.2.1.bb b/meta-python/recipes-devtools/python/python3-pyusb_1.2.1.bb index 286e9672b1..2282e0300b 100644 --- a/meta-python/recipes-devtools/python/python3-pyusb_1.2.1.bb +++ b/meta-python/recipes-devtools/python/python3-pyusb_1.2.1.bb @@ -3,7 +3,7 @@ HOMEPAGE = "http://pyusb.sourceforge.net/" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=e64a29fcd3c3dd356a24e235dfcb3905" -DEPENDS += "libusb1 ${PYTHON_PN}-setuptools-scm-native" +DEPENDS += "libusb1 python3-setuptools-scm-native" RDEPENDS:${PN} += " \ python3-logging \ @@ -13,6 +13,6 @@ SRC_URI[sha256sum] = "a4cc7404a203144754164b8b40994e2849fde1cfff06b08492f12fff9d inherit pypi setuptools3 -RDEPENDS:${PN} += "libusb1" +RDEPENDS:${PN} += "python3-ctypes" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-pyyaml-include/run-ptest b/meta-python/recipes-devtools/python/python3-pyyaml-include/run-ptest new file mode 100755 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyyaml-include/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-pyyaml-include_2.1.bb b/meta-python/recipes-devtools/python/python3-pyyaml-include_2.1.bb new file mode 100644 index 0000000000..058699fdf2 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyyaml-include_2.1.bb @@ -0,0 +1,32 @@ +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 = "dc16153b28f5cab997814c0ce9b43dc4c58507e7" + +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-fsspec \ + python3-aiohttp \ + python3-requests \ + python3-pytest \ + python3-unittest-automake-output \ +" +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.3.0.bb b/meta-python/recipes-devtools/python/python3-pyzmq_22.3.0.bb deleted file mode 100644 index 87605c2b3e..0000000000 --- a/meta-python/recipes-devtools/python/python3-pyzmq_22.3.0.bb +++ /dev/null @@ -1,29 +0,0 @@ -SUMMARY = "Pyzmq provides Zero message queue access for the Python language" -HOMEPAGE = "http://zeromq.org/bindings:python" -LICENSE = "BSD-3-Clause & 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] = "8eddc033e716f8c91c6a2112f0a8ebc5e00532b4a6ae1eb0ccc48e027f9c671c" - -inherit pypi pkgconfig setuptools3 - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-multiprocessing \ - ${PYTHON_PN}-json \ -" - -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.16.1.bb b/meta-python/recipes-devtools/python/python3-pyzstd_0.16.1.bb new file mode 100644 index 0000000000..a4aae4aca9 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-pyzstd_0.16.1.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] = "ed50c08233878c155c73ab2622e115cd9e46c0f1c2e2ddd76f2e7ca24933f195" + +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.11.bb b/meta-python/recipes-devtools/python/python3-qface_2.0.11.bb new file mode 100644 index 0000000000..9ecaf5698c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-qface_2.0.11.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] = "b55c239f3ae7e23c5c8434f38901c5bcacb6afd17e88e37934b46e44558df295" + +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_7.3.1.bb b/meta-python/recipes-devtools/python/python3-qrcode_7.3.1.bb deleted file mode 100644 index f6de60e1a9..0000000000 --- a/meta-python/recipes-devtools/python/python3-qrcode_7.3.1.bb +++ /dev/null @@ -1,11 +0,0 @@ -SUMMARY = "QR Code image generator" -SECTION = "devel/python" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=4b802d2a65df4626623c79757f486af9" - -PYPI_PACKAGE = "qrcode" -SRC_URI[sha256sum] = "375a6ff240ca9bd41adc070428b5dfc1dcfbb0f2507f1ac848f6cded38956578" - -inherit pypi setuptools3 - -RDEPENDS:${PN} = "python3-six python3-pillow" diff --git a/meta-python/recipes-devtools/python/python3-qrcode_7.4.2.bb b/meta-python/recipes-devtools/python/python3-qrcode_7.4.2.bb new file mode 100644 index 0000000000..49cf62860e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-qrcode_7.4.2.bb @@ -0,0 +1,15 @@ +SUMMARY = "QR Code image generator" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=4b802d2a65df4626623c79757f486af9" + +SRC_URI[sha256sum] = "9dd969454827e127dbd93696b20747239e6d540e082937c90f14ac95b30f5845" + +inherit pypi python_setuptools_build_meta + +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.19.bb b/meta-python/recipes-devtools/python/python3-rapidjson_1.19.bb new file mode 100644 index 0000000000..bfc05a7354 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-rapidjson_1.19.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=6fe0b2465366662d7cfa6793ccbab563" + +SRC_URI[sha256sum] = "81e7260f6297cad564389b700783c0a33de71310b9eb01fd013faec5e7ed4eff" + +# Inheriting ptest provides functionality for packaging and installing runtime tests for this recipe +inherit setuptools3 pypi ptest + +PYPI_PACKAGE = "python-rapidjson" + +SETUPTOOLS_BUILD_ARGS += " --rj-include-dir=${RECIPE_SYSROOT}${includedir}" + +# run-ptest is a shell script that starts the test suite +SRC_URI += " \ + file://run-ptest \ +" + +DEPENDS += " \ + rapidjson \ +" + +# Adding required python package for the ptest (pytest and pytest->automake report translation) +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ + python3-pytz \ +" + +RDEPENDS:${PN} += " \ + python3-core \ +" + +# Installing the test suite on the target +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} diff --git a/meta-python/recipes-devtools/python/python3-rarfile_4.2.bb b/meta-python/recipes-devtools/python/python3-rarfile_4.2.bb new file mode 100644 index 0000000000..41cff4bfc4 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-rarfile_4.2.bb @@ -0,0 +1,23 @@ +SUMMARY = "RAR archive reader for Python" +HOMEPAGE = "https://github.com/markokr/rarfile" +LICENSE = "ISC" +SECTION = "devel/python" +LIC_FILES_CHKSUM = "file://LICENSE;md5=1916695551f7eec48dfd97db9467b831" + +inherit setuptools3 + +SRC_URI[sha256sum] = "8e1c8e72d0845ad2b32a47ab11a719bc2e41165ec101fd4d3fe9e92aa3f469ef" + +inherit pypi + +PYPI_PACKAGE="rarfile" + +RDEPENDS:${PN} += "\ + p7zip \ + python3-core \ + python3-datetime \ + python3-crypt \ + python3-io \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-raven_6.10.0.bb b/meta-python/recipes-devtools/python/python3-raven_6.10.0.bb index b0d19c31ad..79a38983de 100644 --- a/meta-python/recipes-devtools/python/python3-raven_6.10.0.bb +++ b/meta-python/recipes-devtools/python/python3-raven_6.10.0.bb @@ -11,3 +11,8 @@ SRC_URI[sha256sum] = "3fa6de6efa2493a7c827472e984ce9b020797d0da16f1db67197bcc23c PYPI_PACKAGE = "raven" inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-json \ + python3-logging \ +" diff --git a/meta-python/recipes-devtools/python/python3-rdflib_6.0.2.bb b/meta-python/recipes-devtools/python/python3-rdflib_6.0.2.bb deleted file mode 100644 index 49e6d33ab4..0000000000 --- a/meta-python/recipes-devtools/python/python3-rdflib_6.0.2.bb +++ /dev/null @@ -1,17 +0,0 @@ -SUMMARY = "RDFLib is a pure Python package for working with RDF" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=b6cde159c801514e0e45a40cf0a9d3d9" - -SRC_URI[sha256sum] = "6136ae056001474ee2aff5fc5b956e62a11c3a9c66bb0f3d9c0aaa5fbb56854e" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-isodate \ - ${PYTHON_PN}-pyparsing \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-xml \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-redis_3.5.3.bb b/meta-python/recipes-devtools/python/python3-redis_3.5.3.bb deleted file mode 100644 index 92f6e3ed26..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.8.bb b/meta-python/recipes-devtools/python/python3-redis_5.0.8.bb new file mode 100644 index 0000000000..1dddd04bc9 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-redis_5.0.8.bb @@ -0,0 +1,21 @@ +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" + +# Prefix archive to avoid clashing with the main redis archives +PYPI_ARCHIVE_NAME_PREFIX="pypi-" + +SRC_URI[sha256sum] = "0c5b10d387568dfe0698c6fad6615750c24170e548ca2deac10c649d463e9870" + +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.10.8.bb b/meta-python/recipes-devtools/python/python3-regex_2024.9.11.bb index e7978970c7..8fbae0cdcc 100644 --- a/meta-python/recipes-devtools/python/python3-regex_2021.10.8.bb +++ b/meta-python/recipes-devtools/python/python3-regex_2024.9.11.bb @@ -1,11 +1,11 @@ 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 +inherit pypi python_setuptools_build_meta -SRC_URI[sha256sum] = "26895d7c9bbda5c52b3635ce5991caa90fbb1ddfac9c9ff1c7ce505e2282fb2a" +SRC_URI[sha256sum] = "6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd" RDEPENDS:${PN} += " \ python3-stringold \ diff --git a/meta-python/recipes-devtools/python/python3-requests-file/run-ptest b/meta-python/recipes-devtools/python/python3-requests-file/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-requests-file/run-ptest +++ b/meta-python/recipes-devtools/python/python3-requests-file/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-requests-file_1.5.1.bb b/meta-python/recipes-devtools/python/python3-requests-file_2.1.0.bb index 21cdb8c127..4e0adc39f6 100644 --- a/meta-python/recipes-devtools/python/python3-requests-file_1.5.1.bb +++ b/meta-python/recipes-devtools/python/python3-requests-file_2.1.0.bb @@ -3,17 +3,21 @@ HOMEPAGE = "http://github.com/dashea/requests-file" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=9cc728d6087e43796227b0a31422de6b" -SRC_URI[md5sum] = "c96daf6b0c56687556e8a52748fd896c" -SRC_URI[sha256sum] = "07d74208d3389d01c38ab89ef403af0cfec63957d53a0081d8eca738d0247d8e" +SRC_URI[sha256sum] = "0f549a3f3b0699415ac04d167e9cb39bccfb730cb832b4d20be3d9867356e658" -inherit pypi setuptools3 ptest +PYPI_PACKAGE = "requests_file" + +inherit pypi python_setuptools_build_meta ptest SRC_URI += " \ file://run-ptest \ " +DEPENDS += "python3-setuptools-scm-native" + RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-requests-futures_1.0.0.bb b/meta-python/recipes-devtools/python/python3-requests-futures_1.0.1.bb index 4b57e13a9a..28f034f7e3 100644 --- a/meta-python/recipes-devtools/python/python3-requests-futures_1.0.0.bb +++ b/meta-python/recipes-devtools/python/python3-requests-futures_1.0.1.bb @@ -3,8 +3,7 @@ HOMEPAGE = "https://github.com/ross/requests-futures" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE;md5=e1e50798d0afe0e1f87594c6619a2fa5" -SRC_URI[md5sum] = "601b5e90413bb00e06148752d31f0cc7" -SRC_URI[sha256sum] = "35547502bf1958044716a03a2f47092a89efe8f9789ab0c4c528d9c9c30bc148" +SRC_URI[sha256sum] = "f55a4ef80070e2858e7d1e73123d2bfaeaf25b93fd34384d8ddf148e2b676373" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-requests-mock_1.12.1.bb b/meta-python/recipes-devtools/python/python3-requests-mock_1.12.1.bb new file mode 100644 index 0000000000..248526b00b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-requests-mock_1.12.1.bb @@ -0,0 +1,9 @@ +SUMMARY = "Mocked responses for the requests library" +HOMEPAGE = "https://github.com/jamielennox/requests-mock" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3b2eea41aec0f2973a45e1e45f28aa32" + +DEPENDS = "python3-setuptools-scm-native" +SRC_URI[sha256sum] = "e9e12e333b525156e82a3c852f22016b9158220d2f47454de9cae8a77d371401" + +inherit pypi python_setuptools_build_meta 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 12531d75fe..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_1.0.0.bb index 366f41ca81..9cbe4927a2 100644 --- a/meta-python/recipes-devtools/python/python3-requests-toolbelt_0.9.1.bb +++ b/meta-python/recipes-devtools/python/python3-requests-toolbelt_1.0.0.bb @@ -1,27 +1,29 @@ DESCRIPTION = "A utility belt for advanced users of python-requests." HOMEPAGE = "https://toolbelt.readthedocs.org" -AUTHOR = "Ian Cordasco, Cory Benfield" LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=71760e0f1dda8cff91b0bc9246caf571" +LIC_FILES_CHKSUM = "file://LICENSE;md5=6f14302a4b4099009ab38b4dde5f1075" SRC_URI = "file://run-ptest \ + file://090856f4159c40a2927fb88546419f2e1697ad5f.patch \ + file://720240501dca0b4eacc3295665d7ced8719e11d2.patch \ " -SRC_URI[md5sum] = "b1509735c4b4cf95df2619facbc3672e" -SRC_URI[sha256sum] = "968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0" +SRC_URI[sha256sum] = "7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6" inherit pypi setuptools3 ptest RDEPENDS:${PN} += " \ - ${PYTHON_PN}-requests (>=2.0.1) \ + python3-requests (>=2.0.1) \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-betamax \ - ${PYTHON_PN}-mock \ - ${PYTHON_PN}-multiprocessing \ + python3-betamax \ + python3-mock \ + python3-multiprocessing \ + python3-pytest \ + python3-trustme \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-requests-unixsocket_0.3.0.bb b/meta-python/recipes-devtools/python/python3-requests-unixsocket_0.3.0.bb 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_2.26.0.bb b/meta-python/recipes-devtools/python/python3-requests_2.26.0.bb deleted file mode 100644 index 406e42a5e0..0000000000 --- a/meta-python/recipes-devtools/python/python3-requests_2.26.0.bb +++ /dev/null @@ -1,25 +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[sha256sum] = "b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7" - -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.3.bb b/meta-python/recipes-devtools/python/python3-responses_0.25.3.bb new file mode 100644 index 0000000000..50835883d8 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-responses_0.25.3.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] = "617b9247abd9ae28313d57a75880422d55ec63c29d33d629697590a034358dba" + +RDEPENDS:${PN} += " \ + python3-mock \ + python3-pyyaml \ + python3-requests \ + python3-urllib3 \ +" 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 new file mode 100644 index 0000000000..e374979cb4 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-rfc3986-validator_0.1.1.bb @@ -0,0 +1,24 @@ +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" +UPSTREAM_CHECK_REGEX = "/rfc3986-validator/(?P<pver>(\d+[\.\-_]*)+)/" + +inherit pypi setuptools3 + +SRC_URI += "\ + 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-rlp_4.0.1.bb b/meta-python/recipes-devtools/python/python3-rlp_4.0.1.bb new file mode 100644 index 0000000000..46ca600ea2 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-rlp_4.0.1.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] = "bcefb11013dfadf8902642337923bd0c786dc8a27cb4c21da6e154e52869ecb1" + +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 d9465af081..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.1.2.bb b/meta-python/recipes-devtools/python/python3-robotframework_7.1.bb index 0c3de5da79..979aba6812 100644 --- a/meta-python/recipes-devtools/python/python3-robotframework_4.1.2.bb +++ b/meta-python/recipes-devtools/python/python3-robotframework_7.1.bb @@ -13,18 +13,18 @@ inherit pypi setuptools3 PYPI_PACKAGE_EXT = "zip" -SRC_URI[sha256sum] = "7ea2454b847cfcb211e2906743c5c4a868ab096ab4ce1547ab102d91fb224443" +SRC_URI[sha256sum] = "34796d387e182b36f05d82f3bbc802bd6a30192ebf1e03c76d2086d0d04faaff" RDEPENDS:${PN} += " \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-pprint \ - ${PYTHON_PN}-xml \ - ${PYTHON_PN}-difflib \ - ${PYTHON_PN}-threading \ - ${PYTHON_PN}-html \ - ${PYTHON_PN}-docutils \ - ${PYTHON_PN}-ctypes \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-profile \ + python3-shell \ + python3-pprint \ + python3-xml \ + python3-difflib \ + python3-threading \ + python3-html \ + python3-docutils \ + python3-ctypes \ + python3-logging \ + python3-numbers \ + python3-profile \ " diff --git a/meta-python/recipes-devtools/python/python3-rsa_4.7.2.bb b/meta-python/recipes-devtools/python/python3-rsa_4.9.bb index 4a9b9a9d3f..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,12 +1,11 @@ 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} = "\ pyrsa-decrypt \ @@ -27,14 +26,14 @@ ALTERNATIVE_PRIORITY = "30" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-crypt \ - ${PYTHON_PN}-doctest \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-math \ - ${PYTHON_PN}-multiprocessing \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-pickle \ + python3-compression \ + python3-crypt \ + python3-doctest \ + python3-logging \ + python3-math \ + python3-multiprocessing \ + python3-netclient \ + python3-pickle \ " -RDEPENDS:${PN} += "${PYTHON_PN}-pyasn1" +RDEPENDS:${PN} += "python3-pyasn1" diff --git a/meta-python/recipes-devtools/python/python3-schedule_1.2.1.bb b/meta-python/recipes-devtools/python/python3-schedule_1.2.1.bb new file mode 100644 index 0000000000..6ebde30e61 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-schedule_1.2.1.bb @@ -0,0 +1,10 @@ +SUMMARY = "Job scheduling for humans" +HOMEPAGE = "https://github.com/dbader/schedule" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=6400f153491d45ea3459761627ca24b2" + +SRC_URI[sha256sum] = "843bc0538b99c93f02b8b50e3e39886c06f2d003b24f48e1aa4cadfa3f341279" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "python3-datetime python3-logging python3-math" diff --git a/meta-python/recipes-devtools/python/python3-schedutils_0.6.bb b/meta-python/recipes-devtools/python/python3-schedutils_0.6.bb new file mode 100644 index 0000000000..50868b9c40 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-schedutils_0.6.bb @@ -0,0 +1,12 @@ +DESCRIPTION = "Python interface for the Linux scheduler functions etc." +HOMEPAGE = "https://git.kernel.org/pub/scm/libs/python/python-schedutils/python-schedutils.git/" +SECTION = "devel/python" +LICENSE = "GPL-2.0-only" +LIC_FILES_CHKSUM = "file://COPYING;md5=8ca43cbc842c2336e835926c2166c28b" + +SRC_URI = "git://git.kernel.org/pub/scm/libs/python/python-schedutils/python-schedutils.git;branch=main" +SRCREV = "46469f425f9844f355f6496785ee1ce993b58747" + +S = "${WORKDIR}/git" + +inherit setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-scikit-build_0.18.1.bb b/meta-python/recipes-devtools/python/python3-scikit-build_0.18.1.bb new file mode 100644 index 0000000000..eacd67a05c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-scikit-build_0.18.1.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] = "a4152ac5a084d499c28a7797be0628d8366c336e2fb0e1a063eb32e55efcb8e7" + +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..a7a20707ef --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-screeninfo_0.8.1.bb @@ -0,0 +1,14 @@ +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" + +SRC_URI[sha256sum] = "9983076bcc7e34402a1a9e4d7dabf3729411fd2abb3f3b4be7eba73519cd2ed1" + +inherit pypi python_poetry_core + +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.18.bb b/meta-python/recipes-devtools/python/python3-scrypt_0.8.24.bb index 691742d6d3..94c83e4952 100644 --- a/meta-python/recipes-devtools/python/python3-scrypt_0.8.18.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] = "bcf04257af12e6d52974d177a7b08e314b66f350a73f9b6f7b232d69a6a1e041" +SRC_URI[sha256sum] = "98ffde45e4a95461d73ded54ba7a26857679920d4f8ff320f6f7ade6e29531bd" inherit pypi ptest setuptools3 dos2unix @@ -14,11 +14,12 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " RDEPENDS:${PN} += " \ - ${PYTHON_PN}-ctypes \ + python3-ctypes \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-sdbus_0.12.0.bb b/meta-python/recipes-devtools/python/python3-sdbus_0.12.0.bb new file mode 100644 index 0000000000..054e941152 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-sdbus_0.12.0.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] = "c3692d75704438a78adc1439350bc32f30d6b38ad344cfc94773db89c6ce4a89" + +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 b47bcae008..0000000000 --- a/meta-python/recipes-devtools/python/python3-semver_2.13.0.bb +++ /dev/null @@ -1,24 +0,0 @@ -DESCRIPTION = "Python module for Semantic Versioning" -HOMEPAGE = "https://github.com/k-bx/python-semver" -BUGTRACKER = "https://github.com/k-bx/python-semver/issues" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e910b35b0ef4e1f665b9a75d6afb7709" - -SRC_URI[md5sum] = "e98b5fb283ea84daa5195087de83ebf1" -SRC_URI[sha256sum] = "fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f" - -inherit pypi setuptools3 ptest - -BBCLASSEXTEND = "native nativesdk" - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ -" - -do_install_ptest() { - cp -f ${S}/test_semver.py ${D}${PTEST_PATH}/ -} diff --git a/meta-python/recipes-devtools/python/python3-semver_3.0.2.bb b/meta-python/recipes-devtools/python/python3-semver_3.0.2.bb new file mode 100644 index 0000000000..25222bb5ff --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-semver_3.0.2.bb @@ -0,0 +1,26 @@ +DESCRIPTION = "Python module for Semantic Versioning" +HOMEPAGE = "https://github.com/python-semver/python-semver" +BUGTRACKER = "https://github.com/python-semver/python-semver" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=d9da679db3bdce30a1b4328d5c474f98" + +SRC_URI[sha256sum] = "6253adb39c70f6e51afed2fa7152bcd414c411286088fb4b9effb133885ab4cc" + +inherit pypi python_setuptools_build_meta ptest + +BBCLASSEXTEND = "native nativesdk" + +SRC_URI += " \ + file://run-ptest \ +" + +DEPENDS += " python3-setuptools-scm-native" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + cp -rf ${S}/tests ${D}${PTEST_PATH}/ +} diff --git a/meta-python/recipes-devtools/python/python3-sentry-sdk_1.4.3.bb b/meta-python/recipes-devtools/python/python3-sentry-sdk_1.4.3.bb deleted file mode 100644 index c5614a381d..0000000000 --- a/meta-python/recipes-devtools/python/python3-sentry-sdk_1.4.3.bb +++ /dev/null @@ -1,14 +0,0 @@ -SUMMARY = "The new Python SDK for Sentry.io" -DESCRIPTION = "This is the next line of the Python SDK \ -for Sentry, intended to replace the raven package on PyPI." -HOMEPAGE = "https://github.com/getsentry/sentry-python" -LICENSE = "BSD-2-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=0c79f8d3c91fc847350efd28bfe0a341" - -RDEPENDS:${PN} += "python3-urllib3" - -SRC_URI[sha256sum] = "b9844751e40710e84a457c5bc29b21c383ccb2b63d76eeaad72f7f1c808c8828" - -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.40.bb b/meta-python/recipes-devtools/python/python3-serpent_1.41.bb index 935531a856..9265081fd0 100644 --- a/meta-python/recipes-devtools/python/python3-serpent_1.40.bb +++ b/meta-python/recipes-devtools/python/python3-serpent_1.41.bb @@ -2,17 +2,20 @@ SUMMARY = "Serialization based on ast.literal_eval" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=d7c28f460fafe7be454fcdcac0b60263" -SRC_URI[sha256sum] = "10b34e7f8e3207ee6fb70dcdc9bce473851ee3daf0b47c58aec1b48032ac11ce" +SRC_URI[sha256sum] = "0407035fe3c6644387d48cff1467d5aa9feff814d07372b78677ed0ee3ed7095" inherit pypi ptest setuptools3 SRC_URI += " \ file://run-ptest \ " - +# python3-misc for timeit.py RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-pytz \ + python3-attrs \ + python3-misc \ + python3-pytest \ + python3-pytz \ + python3-unittest-automake-output \ " do_install_ptest() { @@ -21,6 +24,6 @@ do_install_ptest() { } RDEPENDS:${PN} += "\ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-numbers \ -" + python3-netclient \ + python3-numbers \ +" diff --git a/meta-python/recipes-devtools/python/python3-service-identity/run-ptest b/meta-python/recipes-devtools/python/python3-service-identity/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-service-identity/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-service-identity_21.1.0.bb b/meta-python/recipes-devtools/python/python3-service-identity_21.1.0.bb new file mode 100644 index 0000000000..a1d6a3c0d8 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-service-identity_21.1.0.bb @@ -0,0 +1,34 @@ +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 python_setuptools_build_meta ptest + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN} += " \ + python3-attr \ + python3-cryptography \ + python3-pyasn1-modules \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-attrs \ + python3-pytest \ + python3-six \ + 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.2.bb b/meta-python/recipes-devtools/python/python3-sh_1.14.2.bb deleted file mode 100644 index f8cecfdfcb..0000000000 --- a/meta-python/recipes-devtools/python/python3-sh_1.14.2.bb +++ /dev/null @@ -1,22 +0,0 @@ -SUMMARY = "Python subprocess replacement" -HOMEPAGE = "https://github.com/amoffat/sh" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=5317094292296f03405f59ae5f6544b6" - -SRC_URI[sha256sum] = "9d7bd0334d494b2a4609fe521b2107438cdb21c0e469ffeeb191489883d6fe0d" - -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.7.bb b/meta-python/recipes-devtools/python/python3-sh_2.0.7.bb new file mode 100644 index 0000000000..8f8d970a93 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-sh_2.0.7.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] = "029d45198902bfb967391eccfd13a88d92f7cebd200411e93f99ebacc6afbb35" + +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 36512cba9a..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,23 +3,23 @@ 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 \ + python3-pytest \ + python3-unittest-automake-output \ " -do_configure:prepend() { - sed -i -e "/use_2to3=True,/d" ${S}/setup.py -} + do_install_ptest() { cp -f ${S}/test_simpleeval.py ${D}${PTEST_PATH}/ } diff --git a/meta-python/recipes-devtools/python/python3-simplejson_3.17.6.bb b/meta-python/recipes-devtools/python/python3-simplejson_3.19.3.bb index b836f97fe0..094efcd8a8 100644 --- a/meta-python/recipes-devtools/python/python3-simplejson_3.17.6.bb +++ b/meta-python/recipes-devtools/python/python3-simplejson_3.19.3.bb @@ -4,18 +4,18 @@ HOMEPAGE = "http://cheeseshop.python.org/pypi/simplejson" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=c6338d7abd321c0b50a2a547e441c52e" -SRC_URI[sha256sum] = "cf98038d2abf63a1ada5730e91e84c642ba6c225b0198c3684151b1f80c5f8a6" +SRC_URI[sha256sum] = "8e086896c36210ab6050f2f9f095a5f1e03c83fa0e7f296d6cba425411364680" inherit pypi setuptools3 RDEPENDS:${PN} += "\ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-netserver \ - ${PYTHON_PN}-numbers \ + python3-io \ + python3-netserver \ + python3-numbers \ " PACKAGES =+ "${PN}-tests" -RDEPENDS:${PN}-tests = "${PN} ${PYTHON_PN}-unittest" +RDEPENDS:${PN}-tests = "${PN} python3-unittest" FILES:${PN}-tests+= " \ ${PYTHON_SITEPACKAGES_DIR}/simplejson/tests \ ${PYTHON_SITEPACKAGES_DIR}/simplejson/tool.py* \ diff --git a/meta-python/recipes-devtools/python/python3-slip-dbus/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 00d83ab61b..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" +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 \ + 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 a277930126..779562d041 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 @@ -2,17 +2,17 @@ SUMMARY = "Drop-in replacement for smbus-cffi/smbus-python in pure Python" DESCRIPTION = "smbus2 is a drop-in replacement for smbus-cffi/smbus-python in pure Python" HOMEPAGE = "https://github.com/kplindegaard/smbus2" LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" +LIC_FILES_CHKSUM = "file://LICENSE;md5=2a3eca2de44816126b3c6f33811a9fba" inherit pypi setuptools3 -SRC_URI[sha256sum] = "6276eb599b76c4e74372f2582d2282f03b4398f0da16bc996608e4f21557ca9b" +SRC_URI[sha256sum] = "36f2288a8e1a363cb7a7b2244ec98d880eb5a728a2494ac9c71e9de7bf6a803a" CLEANBROKEN = "1" PYPI_PACKAGE = "smbus2" RDEPENDS:${PN} += "\ - ${PYTHON_PN}-ctypes \ - ${PYTHON_PN}-fcntl \ + python3-ctypes \ + python3-fcntl \ " diff --git a/meta-python/recipes-devtools/python/python3-smbus_4.3.bb b/meta-python/recipes-devtools/python/python3-smbus_4.3.bb index e2fd20fc00..b305a128a2 100644 --- a/meta-python/recipes-devtools/python/python3-smbus_4.3.bb +++ b/meta-python/recipes-devtools/python/python3-smbus_4.3.bb @@ -1,11 +1,16 @@ SUMMARY = "Set of i2c tools for linux - Python module" -LICENSE = "GPLv2" -LIC_FILES_CHKSUM = "file://smbusmodule.c;beginline=1;endline=18;md5=46e424fb045901ab25e0f92c28c80055" +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 " +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}/py-smbus" -inherit distutils3 +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.2.0.bb b/meta-python/recipes-devtools/python/python3-smpplib_2.2.3.bb index 00a4939147..7979f04c5b 100644 --- a/meta-python/recipes-devtools/python/python3-smpplib_2.2.0.bb +++ b/meta-python/recipes-devtools/python/python3-smpplib_2.2.3.bb @@ -1,10 +1,10 @@ SUMMARY = "SMPP library for python" SECTION = "devel/python" -LICENSE = "GPLv3.0" +LICENSE = "GPL-3.0-only" LIC_FILES_CHKSUM = "file://README.md;md5=8b4e2ac8cf248f7b991784f88b630852" PYPI_PACKAGE = "smpplib" -SRC_URI[sha256sum] = "3d513178a35573f66faac4ef2127c4bd73307ddb463d145b17b013cf709d9ddd" +SRC_URI[sha256sum] = "5215a95b0538d26f189600e0982b31da8281f7453cd6e2862c5b21e3e1002331" inherit pypi setuptools3 ptest @@ -13,15 +13,16 @@ SRC_URI += " \ " RDEPENDS:${PN} += " \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-six \ + python3-logging \ + python3-six \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-unittest \ - ${PYTHON_PN}-profile \ - ${PYTHON_PN}-mock \ + python3-mock \ + python3-profile \ + python3-pytest \ + python3-unittest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-snagboot_1.3.bb b/meta-python/recipes-devtools/python/python3-snagboot_1.3.bb new file mode 100644 index 0000000000..5ed5169ae5 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-snagboot_1.3.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] = "b9d781bdc79d92d940e27d89d3025eab6dc459087dad126766e2bf76dc9dddee" + +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 f8e6281a18..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" diff --git a/meta-python/recipes-devtools/python/python3-sniffio_1.3.1.bb b/meta-python/recipes-devtools/python/python3-sniffio_1.3.1.bb new file mode 100644 index 0000000000..82c457c39f --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-sniffio_1.3.1.bb @@ -0,0 +1,21 @@ +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 python_setuptools_build_meta + +SRC_URI[sha256sum] = "f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" + +DEPENDS += "\ + python3-setuptools-scm-native \ +" + +RDEPENDS:${PN} += " \ + python3-numbers \ + python3-core \ +" diff --git a/meta-python/recipes-devtools/python/python3-socketio_5.11.2.bb b/meta-python/recipes-devtools/python/python3-socketio_5.11.2.bb new file mode 100644 index 0000000000..4251a81d6c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-socketio_5.11.2.bb @@ -0,0 +1,28 @@ +SUMMARY = "Socket.IO server" +HOMEPAGE = "https://github.com/miguelgrinberg/python-socketio/" +SECTION = "devel/python" + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=42d0a9e728978f0eeb759c3be91536b8" + +inherit pypi python_setuptools_build_meta + +PYPI_PACKAGE = "python-socketio" + +SRC_URI[sha256sum] = "ae6a1de5c5209ca859dc574dccc8931c4be17ee003e74ce3b8d1306162bb4a37" + +PACKAGECONFIG ?= "asyncio_client client" +PACKAGECONFIG[asyncio_client] = ",,,python3-aiohttp python3-websockets" +PACKAGECONFIG[client] = ",,,python3-requests python3-websocket-client" + +RDEPENDS:${PN} += "\ + python3-engineio \ + python3-logging \ + python3-math \ + python3-pickle \ + python3-json \ + python3-threading \ + python3-six \ + python3-attrs \ + python3-bidict \ + " diff --git a/meta-python/recipes-devtools/python/python3-socketio_5.5.0.bb b/meta-python/recipes-devtools/python/python3-socketio_5.5.0.bb deleted file mode 100644 index 425dadc4f1..0000000000 --- a/meta-python/recipes-devtools/python/python3-socketio_5.5.0.bb +++ /dev/null @@ -1,28 +0,0 @@ -SUMMARY = "Socket.IO server" -HOMEPAGE = "https://github.com/miguelgrinberg/python-socketio/" -SECTION = "devel/python" - -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=42d0a9e728978f0eeb759c3be91536b8" - -inherit pypi setuptools3 - -PYPI_PACKAGE = "python-socketio" - -SRC_URI[sha256sum] = "ce972ea1b82aa1811fa10d30cf0d5c251b9a1558c3d66829b6fe70854bcccf0b" - -PACKAGECONFIG ?= "asyncio_client client" -PACKAGECONFIG[asyncio_client] = ",,,${PYTHON_PN}-aiohttp ${PYTHON_PN}-websockets" -PACKAGECONFIG[client] = ",,,${PYTHON_PN}-requests ${PYTHON_PN}-websocket-client" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-engineio \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-math \ - ${PYTHON_PN}-pickle \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-threading \ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-attrs \ - ${PYTHON_PN}-bidict \ - " diff --git a/meta-python/recipes-devtools/python/python3-socksio/0001-Unpin-flit-core-dependency.patch b/meta-python/recipes-devtools/python/python3-socksio/0001-Unpin-flit-core-dependency.patch new file mode 100644 index 0000000000..75be61fc4f --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-socksio/0001-Unpin-flit-core-dependency.patch @@ -0,0 +1,21 @@ +From 5c50fd76e7459bb822ff8f712172a78e21b8dd04 Mon Sep 17 00:00:00 2001 +From: Theodore Ni <3806110+tjni@users.noreply.github.com> +Date: Sun, 13 Aug 2023 09:21:49 -0700 +Subject: [PATCH] Unpin flit-core dependency + +Upstream-Status: Submitted [https://github.com/sethmlarson/socksio/pull/61] +--- + pyproject.toml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/pyproject.toml b/pyproject.toml +index 2d6c5a3..60c63ea 100644 +--- a/pyproject.toml ++++ b/pyproject.toml +@@ -1,5 +1,5 @@ + [build-system] +-requires = ["flit_core >=2,<3"] ++requires = ["flit_core >=2"] + build-backend = "flit_core.buildapi" + + [tool.flit.metadata] diff --git a/meta-python/recipes-devtools/python/python3-socksio_1.0.0.bb b/meta-python/recipes-devtools/python/python3-socksio_1.0.0.bb new file mode 100644 index 0000000000..4353a52ee1 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-socksio_1.0.0.bb @@ -0,0 +1,10 @@ +SUMMARY = "Sans-I/O implementation of SOCKS4, SOCKS4A, and SOCKS5." +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=0b4dda8edb09eec767aaded3cbf8f6b1" + +inherit pypi python_flit_core + +SRC_URI += "file://0001-Unpin-flit-core-dependency.patch" + +SRC_URI[sha256sum] = "f88beb3da5b5c38b9890469de67d0cb0f9d494b78b106ca1845f96c10b91c4ac" diff --git a/meta-python/recipes-devtools/python/python3-soupsieve/run-ptest b/meta-python/recipes-devtools/python/python3-soupsieve/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-soupsieve/run-ptest +++ b/meta-python/recipes-devtools/python/python3-soupsieve/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-soupsieve_2.3.1.bb b/meta-python/recipes-devtools/python/python3-soupsieve_2.3.1.bb deleted file mode 100644 index f4cf93daba..0000000000 --- a/meta-python/recipes-devtools/python/python3-soupsieve_2.3.1.bb +++ /dev/null @@ -1,29 +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] = "b8d49b1cd4f037c7082a9683dfa1801aa2597fb11c3a1155b7a5b94829b4f1f9" - -inherit pypi setuptools3 ptest - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-beautifulsoup4 \ -" - -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.6.bb b/meta-python/recipes-devtools/python/python3-soupsieve_2.6.bb new file mode 100644 index 0000000000..6572a68459 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-soupsieve_2.6.bb @@ -0,0 +1,31 @@ +SUMMARY = "CSS selector library for python-beautifulsoup4" +HOMEPAGE = "https://github.com/facelessuser/soupsieve" + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE.md;md5=1bdfa4c8e8b6830bcf8e78cba1669e4d" + +SRC_URI[sha256sum] = "e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb" + +inherit pypi python_hatchling python_setuptools_build_meta ptest + +SRC_URI += " \ + file://run-ptest \ +" +RDEPENDS:${PN} += " \ + python3-core \ + python3-datetime \ + python3-beautifulsoup4 \ +" + +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 06d98cbe1e..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.27.bb b/meta-python/recipes-devtools/python/python3-sqlalchemy_1.4.27.bb deleted file mode 100644 index 3dad546fb2..0000000000 --- a/meta-python/recipes-devtools/python/python3-sqlalchemy_1.4.27.bb +++ /dev/null @@ -1,23 +0,0 @@ -DESCRIPTION = "Python SQL toolkit and Object Relational Mapper that gives \ -application developers the full power and flexibility of SQL" -HOMEPAGE = "http://www.sqlalchemy.org/" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=3359ed561ac16aaa25b6c6eff84df595" - -SRC_URI[sha256sum] = "d768359daeb3a86644f3854c6659e4496a3e6bba2b4651ecc87ce7ad415b320c" - -PYPI_PACKAGE = "SQLAlchemy" -inherit pypi setuptools3 - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-pickle \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-threading \ - ${PYTHON_PN}-compression \ - ${PYTHON_PN}-profile \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-sqlalchemy_2.0.32.bb b/meta-python/recipes-devtools/python/python3-sqlalchemy_2.0.32.bb new file mode 100644 index 0000000000..bb319d566d --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-sqlalchemy_2.0.32.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] = "c1b88cc8b02b6a5f0efb0345a03672d4c897dc7d92585176f88c67346f565ea8" + +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 deleted file mode 100644 index 94121340d5..0000000000 --- a/meta-python/recipes-devtools/python/python3-sqlparse/0001-sqlparse-change-shebang-to-python3.patch +++ /dev/null @@ -1,111 +0,0 @@ -From 7fd00ab8c1b663052d57e735b6b956d5c92fbaed 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> -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 - -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 -+++ b/sqlparse/__main__.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/cli.py b/sqlparse/cli.py -index 7a8aacb..9c727e8 100755 ---- a/sqlparse/cli.py -+++ b/sqlparse/cli.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> --- -2.17.1 - diff --git a/meta-python/recipes-devtools/python/python3-sqlparse/run-ptest b/meta-python/recipes-devtools/python/python3-sqlparse/run-ptest index 3385d68939..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-sqlparse/run-ptest +++ b/meta-python/recipes-devtools/python/python3-sqlparse/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-sqlparse_0.4.2.bb b/meta-python/recipes-devtools/python/python3-sqlparse_0.5.1.bb index 0980ff9c24..62de2327cb 100644 --- a/meta-python/recipes-devtools/python/python3-sqlparse_0.4.2.bb +++ b/meta-python/recipes-devtools/python/python3-sqlparse_0.5.1.bb @@ -4,20 +4,21 @@ SECTION = "devel/python" 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:append = " \ + file://run-ptest \ +" -SRC_URI[sha256sum] = "0c00730c74263a94e5a9919ade150dfc3b19c574389985446148402998287dae" +SRC_URI[sha256sum] = "bb6b4df465655ef332548e24f08e205afc81b9ab86cb1c45657a7ff173a3a00e" export BUILD_SYS export HOST_SYS -inherit pypi ptest setuptools3 +inherit pypi ptest python_hatchling -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.5.0.bb b/meta-python/recipes-devtools/python/python3-stevedore_5.2.0.bb index 8d345e66e5..7cc0a2e529 100644 --- a/meta-python/recipes-devtools/python/python3-stevedore_3.5.0.bb +++ b/meta-python/recipes-devtools/python/python3-stevedore_5.2.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] = "f40253887d8712eaa2bb0ea3830374416736dc8ec0e22f5a65092c1174c44335" +SRC_URI[sha256sum] = "46b93ca40e1114cea93d738a6c1e365396981bb6bb78c27045b7587c9473544d" -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..a952722619 --- /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://${UNPACKDIR}/LICENSE;md5=497c556f42b1355b64190da2f3d88f93" + +SRC_URI[sha256sum] = "f7f39c583fd92027bd9d06127b259aee7a5b7945c1f1fa56263811e1e766996d" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += "\ + python3-setuptools \ + " + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-strenum/0001-patch-versioneer-for-python-3.12-compatibility.patch b/meta-python/recipes-devtools/python/python3-strenum/0001-patch-versioneer-for-python-3.12-compatibility.patch new file mode 100644 index 0000000000..cdf3f1acb7 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-strenum/0001-patch-versioneer-for-python-3.12-compatibility.patch @@ -0,0 +1,37 @@ +From 3a71c9bc3747201e5bebe0e80b98ac6219209875 Mon Sep 17 00:00:00 2001 +From: alperak <alperyasinak1@gmail.com> +Date: Thu, 8 Feb 2024 14:09:32 +0300 +Subject: [PATCH] Patch versioneer for Python 3.12 compatibility + +AttributeError: 'ConfigParser' object has no attribute 'readfp'. Did you mean: 'read'? +AttributeError: module 'configparser' has no attribute 'SafeConfigParser'. Did you mean: 'RawConfigParser'? + +readfp and SafeConfigParser has been deprecated since Python 3.2 and removed in Python 3.12 (due October 2023). Use read_file and ConfigParser instead. + +https://docs.python.org/3/whatsnew/3.12.html#configparser + +Upstream-Status: Submitted [https://github.com/irgeek/StrEnum/pull/34] +Signed-off-by: alperak <alperyasinak1@gmail.com> +--- + versioneer.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/versioneer.py b/versioneer.py +index 64fea1c..3aa5da3 100644 +--- a/versioneer.py ++++ b/versioneer.py +@@ -339,9 +339,9 @@ def get_config_from_root(root): + # configparser.NoOptionError (if it lacks "VCS="). See the docstring at + # the top of versioneer.py for instructions on writing your setup.cfg . + setup_cfg = os.path.join(root, "setup.cfg") +- parser = configparser.SafeConfigParser() ++ parser = configparser.ConfigParser() + with open(setup_cfg, "r") as f: +- parser.readfp(f) ++ parser.read_file(f) + VCS = parser.get("versioneer", "VCS") # mandatory + + def get(parser, name): +-- +2.25.1 + diff --git a/meta-python/recipes-devtools/python/python3-strenum_0.4.15.bb b/meta-python/recipes-devtools/python/python3-strenum_0.4.15.bb new file mode 100644 index 0000000000..cbe7fcc215 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-strenum_0.4.15.bb @@ -0,0 +1,14 @@ +SUMMARY = "An Enum that inherits from str" +HOMEPAGE = "https://github.com/irgeek/StrEnum" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ba0eb3de1df70bde0ed48488cfd81269" + +SRC_URI += "file://0001-patch-versioneer-for-python-3.12-compatibility.patch" + +DEPENDS = "python3-pytest-runner-native" + +SRC_URI[sha256sum] = "878fb5ab705442070e4dd1929bb5e2249511c0bcf2b0eeacf3bcd80875c82eff" + +PYPI_PACKAGE = "StrEnum" + +inherit pypi python_setuptools_build_meta diff --git a/meta-python/recipes-devtools/python/python3-supervisor_4.2.2.bb b/meta-python/recipes-devtools/python/python3-supervisor_4.2.5.bb index f89c206dd5..e104e1c0ce 100644 --- a/meta-python/recipes-devtools/python/python3-supervisor_4.2.2.bb +++ b/meta-python/recipes-devtools/python/python3-supervisor_4.2.5.bb @@ -7,12 +7,16 @@ HOMEPAGE = "https://github.com/Supervisor/supervisor" LICENSE = "BSD-4-Clause" LIC_FILES_CHKSUM = "file://LICENSES.txt;md5=5b4e3a2172bba4c47cded5885e7e507e" -SRC_URI[sha256sum] = "5b2b8882ec8a3c3733cce6965cc098b6d80b417f21229ab90b18fe551d619f90" +SRC_URI[sha256sum] = "34761bae1a23c58192281a5115fb07fbf22c9b0133c08166beffc70fed3ebc12" PYPI_PACKAGE = "supervisor" inherit pypi systemd setuptools3 RDEPENDS:${PN} = "\ - ${PYTHON_PN}-meld3 \ + python3-meld3 \ + python3-io \ + python3-xmlrpc \ + python3-resource \ + python3-setuptools \ " SRC_URI += "file://supervisord.conf \ @@ -24,6 +28,6 @@ do_install:append() { install -d ${D}${sysconfdir}/supervisor install -d ${D}${systemd_system_unitdir} - install -m 0644 ${WORKDIR}/supervisord.conf ${D}${sysconfdir}/supervisor - install -m 0644 ${WORKDIR}/supervisor.service ${D}${systemd_system_unitdir} + install -m 0644 ${UNPACKDIR}/supervisord.conf ${D}${sysconfdir}/supervisor + install -m 0644 ${UNPACKDIR}/supervisor.service ${D}${systemd_system_unitdir} } diff --git a/meta-python/recipes-devtools/python/python3-sympy_1.13.2.bb b/meta-python/recipes-devtools/python/python3-sympy_1.13.2.bb new file mode 100644 index 0000000000..02577964ca --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-sympy_1.13.2.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] = "401449d84d07be9d0c7a46a64bd54fe097667d5e7181bfe67ec777be9e01cb13" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-misc \ + python3-mpmath \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-sympy_1.9.bb b/meta-python/recipes-devtools/python/python3-sympy_1.9.bb deleted file mode 100644 index 92018698e7..0000000000 --- a/meta-python/recipes-devtools/python/python3-sympy_1.9.bb +++ /dev/null @@ -1,12 +0,0 @@ -SUMMARY = "Computer algebra system (CAS) in Python" -HOMEPAGE = "https://pypi.org/project/sympy/" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=42976c55ba05d15b32a7b4757dee5e64" - -SRC_URI[sha256sum] = "c7a880e229df96759f955d4f3970d4cabce79f60f5b18830c08b90ce77cd5fdc" - -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 cbc9f44bc7..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 pkgconfig setuptools3 - -SRC_URI[md5sum] = "5071ea5bcb976186e92a3f5e75df221d" -SRC_URI[sha256sum] = "fd0e44bf70eadae45aadc292cb0a7eb5b0b6372cd1b391228047d33895db83e7" - -# allow for common patches for python- and python3-systemd -FILESEXTRAPATHS:prepend := "${THISDIR}/python-systemd:" - -SRC_URI += "file://endian.patch" - -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..fe0aabf0ff --- /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 python_setuptools_build_meta + +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 7f212ddd87..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.4.bb b/meta-python/recipes-devtools/python/python3-texttable_1.7.0.bb index 6916a72d34..56448f738e 100644 --- a/meta-python/recipes-devtools/python/python3-texttable_1.6.4.bb +++ b/meta-python/recipes-devtools/python/python3-texttable_1.7.0.bb @@ -5,6 +5,6 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=7a97cdac2d9679ffdcfef3dc036d24f6" inherit pypi setuptools3 -SRC_URI[sha256sum] = "42ee7b9e15f7b225747c3fa08f43c5d6c83bc899f80ff9bae9319334824076e9" +SRC_URI[sha256sum] = "2d2068fb55115807d3ac77a4ca68fa48803e84ebb0ee2340f858107a36522638" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-toml_0.10.2.bb b/meta-python/recipes-devtools/python/python3-toml_0.10.2.bb new file mode 100644 index 0000000000..649464b961 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-toml_0.10.2.bb @@ -0,0 +1,15 @@ +SUMMARY = "Python Library for Tom's Obvious, Minimal Language" +HOMEPAGE = "https://github.com/uiri/toml" +LICENSE = "MIT" +SECTION = "devel/python" +LIC_FILES_CHKSUM = "file://LICENSE;md5=16c77b2b1050d2f03cb9c2ed0edaf4f0" + +SRC_URI[sha256sum] = "b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" + +inherit pypi setuptools3 + +BBCLASSEXTEND = "native nativesdk" + +RDEPENDS:${PN} += " \ + python3-misc \ +" 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-tomli_2.0.1.bb b/meta-python/recipes-devtools/python/python3-tomli_2.0.1.bb new file mode 100644 index 0000000000..9401ed897f --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-tomli_2.0.1.bb @@ -0,0 +1,18 @@ +SUMMARY = "A lil' TOML parser" +DESCRIPTION = "Tomli is a Python library for parsing TOML. Tomli is fully \ +compatible with TOML v1.0.0." +HOMEPAGE = "https://github.com/hukkin/tomli" +BUGTRACKER = "https://github.com/hukkin/tomli/issues" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=aaaaf0879d17df0110d1aa8c8c9f46f5" + +inherit pypi python_flit_core + +SRC_URI[sha256sum] = "de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + +BBCLASSEXTEND = "native nativesdk" + +RDEPENDS:${PN} += " \ + python3-datetime \ + 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.13.2.bb b/meta-python/recipes-devtools/python/python3-tomlkit_0.13.2.bb new file mode 100644 index 0000000000..9fca145407 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-tomlkit_0.13.2.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] = "fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79" + +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.1.bb index 1dedc51029..b8f6752f28 100644 --- a/meta-python/recipes-devtools/python/python3-tornado_6.1.bb +++ b/meta-python/recipes-devtools/python/python3-tornado_6.4.1.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] = "92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta # Requires _compression which is currently located in misc -RDEPENDS:${PN} += "${PYTHON_PN}-compression ${PYTHON_PN}-numbers ${PYTHON_PN}-email \ - ${PYTHON_PN}-pkgutil ${PYTHON_PN}-html ${PYTHON_PN}-json ${PYTHON_PN}-certifi ${PYTHON_PN}-threading \ - ${PYTHON_PN}-ctypes ${PYTHON_PN}-misc" +RDEPENDS:${PN} += " \ + python3-asyncio \ + python3-certifi \ + python3-compression \ + python3-ctypes \ + python3-email \ + python3-html \ + python3-json \ + python3-misc \ + python3-multiprocessing \ + python3-numbers \ + python3-pkgutil \ + python3-pycurl \ + python3-threading \ + python3-unittest \ +" -RDEPENDS:${PN}-test += "${PN} ${PYTHON_PN}-unittest" +RDEPENDS:${PN}-test += "python3-unittest" PACKAGES =+ "\ ${PN}-test \ " FILES:${PN}-test = " \ - ${libdir}/${PYTHON_DIR}/site-packages/*/test \ - ${libdir}/${PYTHON_DIR}/site-packages/*/testing.py* \ + ${PYTHON_SITEPACKAGES_DIR}/*/test \ " + +BBCLASSEXTEND += "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-tox_4.15.1.bb b/meta-python/recipes-devtools/python/python3-tox_4.15.1.bb new file mode 100644 index 0000000000..367fafab49 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-tox_4.15.1.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] = "53a092527d65e873e39213ebd4bd027a64623320b6b0326136384213f95b7076" + +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.62.3.bb b/meta-python/recipes-devtools/python/python3-tqdm_4.62.3.bb deleted file mode 100644 index 148431d0ad..0000000000 --- a/meta-python/recipes-devtools/python/python3-tqdm_4.62.3.bb +++ /dev/null @@ -1,19 +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=1672e2674934fd93a31c09cf17f34100" - -SRC_URI[sha256sum] = "d359de7217506c9851b7869f3708d8ee53ed70a1b8edbba4dbcb47442592920d" - -inherit pypi setuptools3 - -DEPENDS += "${PYTHON_PN}-setuptools-scm-native" - -RDEPENDS:${PN} += " \ - python3-logging \ - python3-numbers \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-tqdm_4.66.5.bb b/meta-python/recipes-devtools/python/python3-tqdm_4.66.5.bb new file mode 100644 index 0000000000..409936d5c5 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-tqdm_4.66.5.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] = "e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad" + +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 5c5754740b..eee9ab88ba 100644 --- a/meta-python/recipes-devtools/python/python3-trafaret-config_2.0.2.bb +++ b/meta-python/recipes-devtools/python/python3-trafaret-config_2.0.2.bb @@ -8,8 +8,8 @@ SRC_URI[sha256sum] = "440b6b49e5e975f9a640a2519abb2feddd96eb2aeb1715f87f947a7a07 inherit pypi setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-trafaret \ - ${PYTHON_PN}-pyyaml \ + python3-trafaret \ + python3-pyyaml \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-trafaret_2.1.0.bb b/meta-python/recipes-devtools/python/python3-trafaret_2.1.1.bb index 0b3d2427cd..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 \ + 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.1.1.bb b/meta-python/recipes-devtools/python/python3-traitlets_5.1.1.bb deleted file mode 100644 index bfed02d6f5..0000000000 --- a/meta-python/recipes-devtools/python/python3-traitlets_5.1.1.bb +++ /dev/null @@ -1,16 +0,0 @@ -SUMMARY = "Traitlets Python config system" -HOMEPAGE = "http://ipython.org" -AUTHOR = "IPython Development Team <ipython-dev@scipy.org>" -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://COPYING.md;md5=eec4de4d599518742e54e75954e33b46" - -PYPI_PACKAGE = "traitlets" - -SRC_URI[sha256sum] = "059f456c5a7c1c82b98c2e8c799f39c9b8128f6d0d46941ee118daace9eb70c7" - -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.10.bb b/meta-python/recipes-devtools/python/python3-transitions_0.9.2.bb index 46292987b1..3a27b666cf 100644 --- a/meta-python/recipes-devtools/python/python3-transitions_0.8.10.bb +++ b/meta-python/recipes-devtools/python/python3-transitions_0.9.2.bb @@ -1,9 +1,9 @@ SUMMARY = "A lightweight, object-oriented Python state machine implementation with many extensions." LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=baac7be1f4c17620df74188e23da6d47" +LIC_FILES_CHKSUM = "file://LICENSE;md5=de0a0876a688a4483bfafa764773ab39" inherit pypi setuptools3 -SRC_URI[sha256sum] = "b0385975a842e885c1a55c719d2f90164471665794d39d51f9eb3f11e1d9c8ac" +SRC_URI[sha256sum] = "2f8490dbdbd419366cef1516032ab06d07ccb5839ef54905e842a472692d4204" 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..dab18f28b6 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-trustme_1.1.0.bb @@ -0,0 +1,36 @@ +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-attrs \ + python3-pyopenssl \ + python3-pyasn1-modules \ + python3-pytest \ + python3-service-identity \ + python3-six \ + 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.1.1.bb index 111366dba0..13ddc08cd0 100644 --- a/meta-python/recipes-devtools/python/python3-twine_3.4.1.bb +++ b/meta-python/recipes-devtools/python/python3-twine_5.1.1.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] = "9aa0825139c02b3434d913545c7b847a21c835e11597f5255842d457da2322db" -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.7.0.bb b/meta-python/recipes-devtools/python/python3-twisted_21.7.0.bb deleted file mode 100644 index 4e9472793b..0000000000 --- a/meta-python/recipes-devtools/python/python3-twisted_21.7.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] = "2cd652542463277378b0d349f47c62f20d9306e57d1247baabd6d1d38a109006" - -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_24.7.0.bb b/meta-python/recipes-devtools/python/python3-twisted_24.7.0.bb new file mode 100644 index 0000000000..e0472d1d87 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-twisted_24.7.0.bb @@ -0,0 +1,177 @@ +DESCRIPTION = "Twisted is an event-driven networking framework written in Python and licensed under the LGPL. \ +Twisted supports TCP, UDP, SSL/TLS, multicast, Unix sockets, a large number of protocols \ +(including HTTP, NNTP, IMAP, SSH, IRC, FTP, and others), and much more." +HOMEPAGE = "https://twisted.org" + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=c1c5d2c2493b848f83864bdedd67bbf5" + +SRC_URI[sha256sum] = "5a60147f044187a127ec7da96d170d49bcce50c6fd36f594e60f4587eff4d394" + +inherit pypi python_hatchling + +do_install:append() { + # remove some useless files before packaging + find ${D} \( -name "*.bat" -o -name "*.c" -o -name "*.h" \) -exec rm -f {} \; +} + +PACKAGES =+ "\ + ${PN}-zsh \ + ${PN}-test \ + ${PN}-protocols \ + ${PN}-conch \ + ${PN}-mail \ + ${PN}-names \ + ${PN}-runner \ + ${PN}-web \ + ${PN}-words \ + ${PN}-pair \ + ${PN}-core \ +" + +DEPENDS += " \ + python3-hatch-fancy-pypi-readme-native \ + python3-incremental-native \ +" + +RDEPENDS:${PN} = "\ + ${PN}-core \ + ${PN}-conch \ + ${PN}-mail \ + ${PN}-names \ + ${PN}-pair \ + ${PN}-protocols \ + ${PN}-runner \ + ${PN}-web \ + ${PN}-words \ + ${PN}-zsh \ +" + +RDEPENDS:${PN}-core = "python3-appdirs \ + python3-asyncio \ + python3-attrs \ + python3-automat \ + python3-constantly \ + python3-core \ + python3-debugger \ + python3-hyperlink \ + python3-incremental \ + python3-pyserial \ + python3-typing-extensions \ + python3-unixadmin \ + python3-zopeinterface \ +" +RDEPENDS:${PN}-test = "${PN} python3-pyhamcrest" +RDEPENDS:${PN}-conch = "${PN}-core ${PN}-protocols python3-bcrypt python3-cryptography python3-pickle" +RDEPENDS:${PN}-mail = "${PN}-core ${PN}-protocols" +RDEPENDS:${PN}-names = "${PN}-core" +RDEPENDS:${PN}-runner = "${PN}-core ${PN}-protocols" +RDEPENDS:${PN}-web += "${PN}-core ${PN}-protocols" +RDEPENDS:${PN}-words += "${PN}-core" +RDEPENDS:${PN}-pair += "${PN}-core" + +FILES:${PN}-test = " \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/test \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/*/test \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/protocols/haproxy/test/ \ +" + +FILES:${PN}-protocols = " \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/protocols/*.py* \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/protocols/haproxy \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/protocols/__pycache__/*pyc \ +" + +FILES:${PN}-zsh = " \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/python/twisted-completion.zsh \ +" + +FILES:${PN}-conch = " \ + ${bindir}/ckeygen \ + ${bindir}/tkconch \ + ${bindir}/conch \ + ${bindir}/cftp \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_conch.py* \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_conch*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/conch \ +" + +FILES:${PN}-core = " \ + ${bindir}/twist \ + ${bindir}/twistd \ + ${bindir}/trial \ + ${bindir}/pyhtmlizer \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/*.py* \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/application \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/cred \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/enterprise \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/internet \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/persisted \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/protocols \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/scripts \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/spread \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/tap \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/trial \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/*.py* \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/python/*.py* \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/*.py* \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/logger \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/_threads \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/positioning \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/py.typed \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/__pycache__/*pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/python/__pycache__/*pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/__init__*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/cred_anonymous*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/cred_file*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/cred_memory*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/cred_sshkeys*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/cred_unix*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_core*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_ftp*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_inet*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_portforward*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_reactors*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_socks*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_trial*.pyc \ +" + +FILES:${PN}-mail = " \ + ${bindir}/mailmail \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_mail.py* \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_mail*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/mail \ +" + +FILES:${PN}-names = " \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_names.py* \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_names*.pyc \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/names \ +" + +FILES:${PN}-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}-pair = " \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/pair \ +" + +FILES:${PN}-doc += " \ + ${PYTHON_SITEPACKAGES_DIR}/twisted/python/_pydoctortemplates \ +" + diff --git a/meta-python/recipes-devtools/python/python3-twitter_4.1.0.bb b/meta-python/recipes-devtools/python/python3-twitter_4.1.0.bb deleted file mode 100644 index ac1dab8d83..0000000000 --- a/meta-python/recipes-devtools/python/python3-twitter_4.1.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] = "88e2938de5ac7043c9ba8b8358996fbc5806059d63c96269d22527a40ca7d511" - -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 8b55b3641c..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 a117f17202..1232f5e99f 100644 --- a/meta-python/recipes-devtools/python/python3-txdbus_1.1.2.bb +++ b/meta-python/recipes-devtools/python/python3-txdbus_1.1.2.bb @@ -1,5 +1,4 @@ SUMMARY = "A native Python implementation of the DBus protocol for Twisted applications." -AUTHOR = "Tom Cocagne" HOMEPAGE = "https://pypi.org/project/txdbus/" SECTION = "devel/python" LICENSE = "MIT" @@ -10,4 +9,4 @@ SRC_URI[sha256sum] = "8375a5fb68a12054f0def91af800c821fb2232949337756ed975f88d8e inherit pypi setuptools3 -RDEPENDS:${PN} += "python3-six python3-twisted" +RDEPENDS:${PN} += "python3-twisted-core" diff --git a/meta-python/recipes-devtools/python/python3-typed-ast_1.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.13.2.bb b/meta-python/recipes-devtools/python/python3-typeguard_4.3.0.bb index b7ae4a32c4..3f6acdd8e7 100644 --- a/meta-python/recipes-devtools/python/python3-typeguard_2.13.2.bb +++ b/meta-python/recipes-devtools/python/python3-typeguard_4.3.0.bb @@ -3,18 +3,27 @@ HOMEPAGE = "https://pypi.org/project/typeguard/" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=f0e423eea5c91e7aa21bdb70184b3e53" -SRC_URI[sha256sum] = "7e50071590ab997509aa0977609eb5cf9d73d84c1f416cb4fab78b77a9d15326" +SRC_URI[sha256sum] = "92ee6a0aec9135181eae6067ebd617fd9de8d75d714fb548728a4933b1dea651" -inherit pypi setuptools3 ptest +inherit pypi python_setuptools_build_meta ptest SRC_URI += " \ file://run-ptest \ " +RDEPENDS:${PN} += " \ + python3-core \ + python3-compression \ + python3-unittest \ + python3-typing-extensions \ +" + RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-typing-extensions \ - ${PYTHON_PN}-unixadmin \ + python3-pytest \ + python3-typing-extensions \ + python3-unittest-automake-output \ + python3-unixadmin \ + python3-mypy \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-typer/run-ptest b/meta-python/recipes-devtools/python/python3-typer/run-ptest new file mode 100644 index 0000000000..94b40789b1 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-typer/run-ptest @@ -0,0 +1,6 @@ +#!/bin/sh + +# Ignore the test_tutorial and test_completion. +# Because it needs the docs_src package what is not in Yocto. +# And the tests are not that useful for Yocto. +pytest --automake --ignore tests/test_tutorial --ignore tests/test_completion diff --git a/meta-python/recipes-devtools/python/python3-typer_0.12.5.bb b/meta-python/recipes-devtools/python/python3-typer_0.12.5.bb new file mode 100644 index 0000000000..e175b54207 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-typer_0.12.5.bb @@ -0,0 +1,41 @@ +SUMMARY = "Typer, build great CLIs. Easy to code. Based on Python type hints." +DESCRIPTION = "\ + Typer is a library for building CLI applications that users will love using and developers will love creating. Based on Python type hints. \ + It's also a command line tool to run scripts, automatically converting them to CLI applications. \ +" +HOMEPAGE = "https://github.com/tiangolo/typer" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=173d405eb704b1499218013178722617" + +SRC_URI[sha256sum] = "f592f089bedcc8ec1b974125d64851029c3b1af145f04aca64d69410f0c9b722" + +inherit pypi python_setuptools_build_meta ptest + +DEPENDS += "\ + python3-pdm-backend-native \ + python3-pdm-native \ +" + +SRC_URI:append = " \ + file://run-ptest \ +" + +PYPI_PACKAGE = "typer" + +RDEPENDS:${PN} += "\ + python3-click \ + python3-shellingham \ +" + +RDEPENDS:${PN}-ptest += "\ + python3-coverage \ + python3-pytest \ + python3-typing-extensions \ + 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-types-psutil_6.0.0.20240901.bb b/meta-python/recipes-devtools/python/python3-types-psutil_6.0.0.20240901.bb new file mode 100644 index 0000000000..331756e461 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-types-psutil_6.0.0.20240901.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=c2d9643b4523fdf462545aeb1356ad23" + +inherit pypi setuptools3 + +SRC_URI[sha256sum] = "437affa76670363db9ffecfa4f153cc6900bf8a7072b3420f3bc07a593f92226" + +BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-types-python-dateutil_2.9.0.20240906.bb b/meta-python/recipes-devtools/python/python3-types-python-dateutil_2.9.0.20240906.bb new file mode 100644 index 0000000000..5c3a477432 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-types-python-dateutil_2.9.0.20240906.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=c2d9643b4523fdf462545aeb1356ad23" + +SRC_URI[sha256sum] = "9706c3b68284c25adffc47319ecc7947e5bb86b3773f843c73906fd598bc176e" + +inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-types-setuptools_73.0.0.20240822.bb b/meta-python/recipes-devtools/python/python3-types-setuptools_73.0.0.20240822.bb new file mode 100644 index 0000000000..2eaa2d136e --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-types-setuptools_73.0.0.20240822.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=c2d9643b4523fdf462545aeb1356ad23" + +inherit pypi setuptools3 + +SRC_URI[sha256sum] = "3a060681098eb3fbc2fea0a86f7f6af6aa1ca71906039d88d891ea2cecdd4dbf" + +BBCLASSEXTEND = "native" diff --git a/meta-python/recipes-devtools/python/python3-typing-extensions_3.10.0.0.bb b/meta-python/recipes-devtools/python/python3-typing-extensions_3.10.0.0.bb deleted file mode 100644 index a8e632487d..0000000000 --- a/meta-python/recipes-devtools/python/python3-typing-extensions_3.10.0.0.bb +++ /dev/null @@ -1,12 +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[sha256sum] = "50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342" - -inherit pypi setuptools3 - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-tzdata/run-ptest b/meta-python/recipes-devtools/python/python3-tzdata/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-tzdata/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-tzdata_2024.1.bb b/meta-python/recipes-devtools/python/python3-tzdata_2024.1.bb new file mode 100644 index 0000000000..d81ded430a --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-tzdata_2024.1.bb @@ -0,0 +1,25 @@ +SUMMARY = "Provider of IANA time zone data" +HOMEPAGE = "https://github.com/python/tzdata" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=fca9fd5c15a28eb874ba38577a585d48 \ + file://licenses/LICENSE_APACHE;md5=86d3f3a95c324c9479bd8986968f4327" + +SRC_URI[sha256sum] = "2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd" + +inherit pypi python_setuptools_build_meta + +inherit ptest + +SRC_URI += "file://run-ptest" + +RDEPENDS:${PN}-ptest += "\ + python3-attrs \ + python3-pytest \ + python3-pytest-subtests \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + cp -rf ${S}/tests/ ${D}${PTEST_PATH}/ + install ${S}/VERSION ${D}${PTEST_PATH}/ +} diff --git a/meta-python/recipes-devtools/python/python3-tzlocal_4.1.bb b/meta-python/recipes-devtools/python/python3-tzlocal_4.1.bb deleted file mode 100644 index 29a69f8b8f..0000000000 --- a/meta-python/recipes-devtools/python/python3-tzlocal_4.1.bb +++ /dev/null @@ -1,12 +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[sha256sum] = "0f28015ac68a5c067210400a9197fc5d36ba9bc3f8eaf1da3cbd59acdfed9e09" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-pytz-deprecation-shim \ -" 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.8.0.bb index 3f26ba011c..6cde243fe8 100644 --- a/meta-python/recipes-devtools/python/python3-u-msgpack-python_2.7.1.bb +++ b/meta-python/recipes-devtools/python/python3-u-msgpack-python_2.8.0.bb @@ -1,10 +1,9 @@ DESCRIPTION = "A portable, lightweight MessagePack serializer and deserializer written in pure Python." LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=9eb4691bcb66360acee473a8cf75f594" +LIC_FILES_CHKSUM = "file://LICENSE;md5=17df11353545c53a2df0ce7655859306" -SRC_URI[md5sum] = "8691cea6bc7b44bce6e2115260a54323" -SRC_URI[sha256sum] = "b7e7d433cab77171a4c752875d91836f3040306bab5063fb6dbe11f64ea69551" +SRC_URI[sha256sum] = "b801a83d6ed75e6df41e44518b4f2a9c221dc2da4bcd5380e3a0feda520bc61a" inherit pypi setuptools3 ptest @@ -13,7 +12,8 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { @@ -21,7 +21,7 @@ do_install_ptest() { } RDEPENDS:${PN} += " \ - ${PYTHON_PN}-datetime \ + python3-datetime \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-uefi-firmware_1.11.bb b/meta-python/recipes-devtools/python/python3-uefi-firmware_1.11.bb new file mode 100644 index 0000000000..67e668ac69 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-uefi-firmware_1.11.bb @@ -0,0 +1,21 @@ +SUMMARY = "Various data structures and parsing tools for UEFI firmware." +DESCRIPTION = "This package contains Python UEFI firmware parser tool. The \ +UEFI firmware parser is a simple module and set of scripts for parsing, \ +extracting, and recreating UEFI firmware volumes. This includes parsing \ +modules for BIOS, OptionROM, Intel ME and other formats too." +HOMEPAGE = "https://github.com/theopolis/uefi-firmware-parser" +LICENSE = "BSD-2-Clause & BSD-3-Clause" +LIC_FILES_CHKSUM = "file://setup.py;md5=5a59066a8676f17262ef7e691f8ef253" + +SRC_URI = "git://github.com/theopolis/uefi-firmware-parser;protocol=https;branch=master" + +SRCREV = "f289219b99eb525cbc58e4dc2b07df3811f92ef7" + +S = "${WORKDIR}/git" + +inherit setuptools3 + +RDEPENDS:${PN} += " \ + python3-ctypes \ + python3-logging \ +" diff --git a/meta-python/recipes-devtools/python/python3-ujson/run-ptest b/meta-python/recipes-devtools/python/python3-ujson/run-ptest index b1539453a6..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-ujson/run-ptest +++ b/meta-python/recipes-devtools/python/python3-ujson/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -python3 tests/test_ujson.py +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-ujson_4.3.0.bb b/meta-python/recipes-devtools/python/python3-ujson_5.10.0.bb index 7949a636ce..18ce5cc301 100644 --- a/meta-python/recipes-devtools/python/python3-ujson_4.3.0.bb +++ b/meta-python/recipes-devtools/python/python3-ujson_5.10.0.bb @@ -2,27 +2,31 @@ 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" +LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e0039a83d8a99726b5418f0b03302d0a" -SRC_URI[sha256sum] = "baee56eca35cb5fbe02c28bd9c0936be41a96fa5c0812d9d4b7edeb5c3d568a0" +SRC_URI[sha256sum] = "b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1" inherit pypi ptest setuptools3 +# let OE do the strip operation +export UJSON_BUILD_NO_STRIP = "1" + +DEPENDS += "python3-setuptools-scm-native" + SRC_URI += " \ file://run-ptest \ " -DEPENDS += "${PYTHON_PN}-setuptools-scm-native" - RDEPENDS:${PN} += "\ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-numbers \ + python3-datetime \ + python3-numbers \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-pytz \ + python3-json \ + python3-pytest \ + python3-pytz \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-unidiff/run-ptest b/meta-python/recipes-devtools/python/python3-unidiff/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-unidiff/run-ptest +++ b/meta-python/recipes-devtools/python/python3-unidiff/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-unidiff_0.7.0.bb b/meta-python/recipes-devtools/python/python3-unidiff_0.7.5.bb index b3013180d1..d77252beac 100644 --- a/meta-python/recipes-devtools/python/python3-unidiff_0.7.0.bb +++ b/meta-python/recipes-devtools/python/python3-unidiff_0.7.5.bb @@ -3,7 +3,7 @@ HOMEPAGE = "http://github.com/matiasb/python-unidiff" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=4c434b08ef42fea235bb019b5e5a97b3" -SRC_URI[sha256sum] = "91bb13b4969514a400679d9ae5e29a6ffad85346087677f8b5e2e036af817447" +SRC_URI[sha256sum] = "2e5f0162052248946b9f0970a40e9e124236bf86c82b70821143a6fc1dea2574" inherit pypi setuptools3 ptest @@ -12,7 +12,8 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { @@ -21,6 +22,6 @@ do_install_ptest() { } RDEPENDS:${PN} += " \ - ${PYTHON_PN}-codecs \ - ${PYTHON_PN}-io \ + python3-codecs \ + python3-io \ " diff --git a/meta-python/recipes-devtools/python/python3-unoconv_0.9.0.bb b/meta-python/recipes-devtools/python/python3-unoconv_0.9.0.bb new file mode 100644 index 0000000000..8bfb8a6deb --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-unoconv_0.9.0.bb @@ -0,0 +1,23 @@ +SUMMARY = "Universal Office Converter - Office document conversion" +HOMEPAGE = "https://github.com/unoconv/unoconv" +LICENSE = "GPL-2.0-only" +SECTION = "devel/python" +LIC_FILES_CHKSUM = "file://COPYING;md5=94d55d512a9ba36caa9b7df079bae19f" + +SRC_URI[sha256sum] = "308ebfd98e67d898834876348b27caf41470cd853fbe2681cc7dacd8fd5e6031" + +inherit pypi setuptools3 + +PYPI_PACKAGE="unoconv" + +RDEPENDS:${PN} += "\ + python3-setuptools \ + python3-core \ + python3-shell \ +" + +do_install:append() { + sed -i -e 's:^#!/usr/bin/env python$:#!/usr/bin/env python3:' ${D}/usr/bin/unoconv +} + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-uritemplate/run-ptest b/meta-python/recipes-devtools/python/python3-uritemplate/run-ptest index b63c4de0d9..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-uritemplate/run-ptest +++ b/meta-python/recipes-devtools/python/python3-uritemplate/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-uritemplate_4.1.1.bb b/meta-python/recipes-devtools/python/python3-uritemplate_4.1.1.bb index eaf8bda846..e741b6268d 100644 --- a/meta-python/recipes-devtools/python/python3-uritemplate_4.1.1.bb +++ b/meta-python/recipes-devtools/python/python3-uritemplate_4.1.1.bb @@ -2,7 +2,6 @@ # https://git.yoctoproject.org/cgit/cgit.cgi/meta-cloud-services/tree/meta-openstack/recipes-devtools/python/python3-uritemplate_3.0.0.bb?h=master SUMMARY = "Simple python library to deal with URI Templates." -AUTHOR = "Ian Cordasco" LICENSE = "Apache-2.0 | BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=0f6d769bdcfacac3c1a1ffa568937fe0" @@ -15,7 +14,8 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-urllib3_1.26.7.bb b/meta-python/recipes-devtools/python/python3-urllib3_1.26.7.bb deleted file mode 100644 index 72696749bc..0000000000 --- a/meta-python/recipes-devtools/python/python3-urllib3_1.26.7.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] = "4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece" - -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.5.0.bb b/meta-python/recipes-devtools/python/python3-uswid_0.5.0.bb new file mode 100644 index 0000000000..1381d7e880 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-uswid_0.5.0.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 = "BSD-2-Clause-Patent" +LIC_FILES_CHKSUM = "file://LICENSE;md5=f3636dfe71e94cc72918423cec0d1971" + +SRC_URI[sha256sum] = "bdcd7ee5afac1da60ee688c357aa12f5f8d74bc28012446b10e2b4a9cf52fc6d" + +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.34.0.bb b/meta-python/recipes-devtools/python/python3-validators_0.34.0.bb new file mode 100644 index 0000000000..ebba683884 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-validators_0.34.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] = "647fe407b45af9a74d245b943b18e6a816acf4926974278f6dd617778e1e781f" + +inherit pypi python_setuptools_build_meta ptest + +SRC_URI += " \ + file://run-ptest \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-pytest \ + python3-unittest-automake-output \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ +} + +RDEPENDS:${PN} += " \ + python3-crypt \ + python3-datetime \ + python3-netclient \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-versioneer_0.29.bb b/meta-python/recipes-devtools/python/python3-versioneer_0.29.bb new file mode 100644 index 0000000000..bdfbfd1be1 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-versioneer_0.29.bb @@ -0,0 +1,18 @@ +SUMMARY = "Easy VCS-based management of project version strings" +HOMEPAGE = "https://github.com/python-versioneer/python-versioneer" +SECTION = "devel/python" + +LICENSE = "Unlicense" +LIC_FILES_CHKSUM = "file://LICENSE;md5=f4c62131f879a8445e16a7f265aea635" + +SRC_URI[sha256sum] = "5ab283b9857211d61b53318b7c792cf68e798e765ee17c27ade9f6c924235731" + +inherit pypi python_setuptools_build_meta + +RDEPENDS:${PN} += "\ + python3-json \ + python3-netclient \ + python3-tomllib \ +" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-versiontools_1.9.1.bb b/meta-python/recipes-devtools/python/python3-versiontools_1.9.1.bb index 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.26.5.bb b/meta-python/recipes-devtools/python/python3-virtualenv_20.26.5.bb new file mode 100644 index 0000000000..82d60aeaab --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-virtualenv_20.26.5.bb @@ -0,0 +1,26 @@ +# 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] = "ce489cac131aa58f4b25e321d6d186171f78e6cb13fafbf32a840cee67733ff4" + +BBCLASSEXTEND = "native nativesdk" +inherit pypi python_hatchling + +DEPENDS += "\ + python3-hatch-vcs-native \ +" + +RDEPENDS:${PN} += " \ + python3-compression \ + python3-distlib \ + python3-filelock \ + python3-json \ + python3-misc \ + python3-modules \ + 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.1.6.bb b/meta-python/recipes-devtools/python/python3-watchdog_2.1.6.bb deleted file mode 100644 index 2bb110049f..0000000000 --- a/meta-python/recipes-devtools/python/python3-watchdog_2.1.6.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] = "a36e75df6c767cbf46f61a91c70b3ba71811dfa0aca4a324d9407a06a8b7a2e7" - -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_5.0.2.bb b/meta-python/recipes-devtools/python/python3-watchdog_5.0.2.bb new file mode 100644 index 0000000000..ad66523dea --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-watchdog_5.0.2.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] = "dcebf7e475001d2cdeb020be630dc5b687e9acdd60d16fea6bb4508e7b94cf76" + +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.20.1.bb b/meta-python/recipes-devtools/python/python3-web3_6.20.1.bb new file mode 100644 index 0000000000..b3487b6d8b --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-web3_6.20.1.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] = "a29bc1863734e1c05f128ddbc56878f299ea71776806e667b581a83b5d5be0ed" + +inherit pypi setuptools3 + +RDEPENDS:${PN} += " \ + python3-aiohttp \ + python3-eth-abi \ + python3-eth-account \ + python3-eth-hash \ + python3-eth-typing \ + python3-eth-utils \ + python3-hexbytes \ + python3-jsonschema \ + python3-protobuf \ + python3-pydantic \ + python3-requests \ + python3-typing-extensions \ + python3-websockets \ + python3-pyunormalize \ +" diff --git a/meta-python/recipes-devtools/python/python3-webargs_8.4.0.bb b/meta-python/recipes-devtools/python/python3-webargs_8.4.0.bb new file mode 100644 index 0000000000..78af013320 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-webargs_8.4.0.bb @@ -0,0 +1,17 @@ +SUMMARY = "Declarative parsing and validation of HTTP request objects, with built-in support for popular web frameworks." +HOMEPAGE = "https://github.com/marshmallow-code/webargs" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=dfbd4ae0074716275fc229c775723e8f" + +inherit pypi setuptools3 + +SRC_URI[sha256sum] = "ea99368214a4ce613924be99d71db58c269631e95eff4fa09b7354e52dc006a5" + +RDEPENDS:${PN} += "\ + python3-marshmallow \ + python3-packaging \ + python3-core \ + python3-json \ + python3-asyncio \ + python3-logging \ +" diff --git a/meta-python/recipes-devtools/python/python3-webencodings_0.5.1.bb b/meta-python/recipes-devtools/python/python3-webencodings_0.5.1.bb index ab33ce66e8..cedc790815 100644 --- a/meta-python/recipes-devtools/python/python3-webencodings_0.5.1.bb +++ b/meta-python/recipes-devtools/python/python3-webencodings_0.5.1.bb @@ -8,8 +8,8 @@ SRC_URI[sha256sum] = "b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab1674858 inherit pypi setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-codecs \ - ${PYTHON_PN}-json \ + python3-codecs \ + python3-json \ " BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-websocket-client_1.2.1.bb b/meta-python/recipes-devtools/python/python3-websocket-client_1.7.0.bb index b632853191..fc73f1b0a5 100644 --- a/meta-python/recipes-devtools/python/python3-websocket-client_1.2.1.bb +++ b/meta-python/recipes-devtools/python/python3-websocket-client_1.7.0.bb @@ -5,13 +5,13 @@ This provide the low level APIs for WebSocket. All APIs \ are the synchronous functions." HOMEPAGE = "https://github.com/websocket-client/websocket-client" LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=b1e01b26bacfc2232046c90a330332b3" +LIC_FILES_CHKSUM = "file://LICENSE;md5=6eae3bb7247ccb2c3a087ea8de759c01" -SRC_URI[sha256sum] = "8dfb715d8a992f5712fff8c843adae94e22b22a99b2c5e6b0ec4a1a981cc4e0d" +SRC_URI[sha256sum] = "10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6" inherit pypi setuptools3 RDEPENDS:${PN} = "\ - ${PYTHON_PN}-six \ - ${PYTHON_PN}-logging \ + python3-six \ + python3-logging \ " diff --git a/meta-python/recipes-devtools/python/python3-websockets_10.1.bb b/meta-python/recipes-devtools/python/python3-websockets_10.1.bb deleted file mode 100644 index 6dd29a9ff6..0000000000 --- a/meta-python/recipes-devtools/python/python3-websockets_10.1.bb +++ /dev/null @@ -1,15 +0,0 @@ -SUMMARY = "An implementation of the WebSocket Protocol (RFC 6455)" -HOMEPAGE = "https://github.com/aaugustin/websockets" - -LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENSE;md5=78c2cc91e172ca96d6f8e4a76c739ec6" - -inherit pypi setuptools3 - -SRC_URI[sha256sum] = "181d2b25de5a437b36aefedaf006ecb6fa3aa1328ec0236cdde15f32f9d3ff6d" - -BBCLASSEXTEND = "native nativesdk" - -RDEPENDS:${PN} = "\ - ${PYTHON_PN}-asyncio \ -" diff --git a/meta-python/recipes-devtools/python/python3-werkzeug_2.0.2.bb b/meta-python/recipes-devtools/python/python3-werkzeug_2.0.2.bb deleted file mode 100644 index 4c221cc41f..0000000000 --- a/meta-python/recipes-devtools/python/python3-werkzeug_2.0.2.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[sha256sum] = "aa2bb6fc8dee8d6c504c0ac1e7f5f7dc5810a9903e793b6f715a9f015bdadb9a" - -inherit pypi setuptools3 - -CLEANBROKEN = "1" - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-difflib \ - ${PYTHON_PN}-email \ - ${PYTHON_PN}-html \ - ${PYTHON_PN}-io \ - ${PYTHON_PN}-json \ - ${PYTHON_PN}-logging \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-netserver \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-pkgutil \ - ${PYTHON_PN}-pprint \ - ${PYTHON_PN}-simplejson \ - ${PYTHON_PN}-threading \ - ${PYTHON_PN}-unixadmin \ - ${PYTHON_PN}-misc \ - ${PYTHON_PN}-profile \ -" diff --git a/meta-python/recipes-devtools/python/python3-werkzeug_3.0.3.bb b/meta-python/recipes-devtools/python/python3-werkzeug_3.0.3.bb new file mode 100644 index 0000000000..a5e343bf25 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-werkzeug_3.0.3.bb @@ -0,0 +1,24 @@ +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.txt;md5=5dc88300786f1c214c1e9827a5229462" + +SRC_URI[sha256sum] = "097e5bfda9f0aba8da6b8545146def481d06aa7d3266e7448e2cccf67dd8bd18" + +inherit pypi python_flit_core + +RDEPENDS:${PN} += " \ + python3-markupsafe \ + python3-logging \ + python3-profile \ + python3-compression \ + python3-json \ + python3-difflib \ +" diff --git a/meta-python/recipes-devtools/python/python3-wheel_0.37.0.bb b/meta-python/recipes-devtools/python/python3-wheel_0.37.0.bb deleted file mode 100644 index aae4903d01..0000000000 --- a/meta-python/recipes-devtools/python/python3-wheel_0.37.0.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] = "e2ef7239991699e3355d54f8e968a21bb940a1dbf34a4d226741e64462516fad" - -inherit pypi setuptools3 - -BBCLASSEXTEND = "native" - diff --git a/meta-python/recipes-devtools/python/python3-whitenoise_6.7.0.bb b/meta-python/recipes-devtools/python/python3-whitenoise_6.7.0.bb new file mode 100644 index 0000000000..48d5a925c2 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-whitenoise_6.7.0.bb @@ -0,0 +1,18 @@ +SUMMARY = "Radically simplified static file serving for WSGI applications" +HOMEPAGE = "https://whitenoise.evans.io" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=aba4901cc64e401cea5a267eac2a2e1e" + +PYPI_PACKAGE = "whitenoise" + +SRC_URI[sha256sum] = "58c7a6cd811e275a6c91af22e96e87da0b1109e9a53bb7464116ef4c963bf636" + +inherit pypi python_setuptools_build_meta + +RDEPENDS:${PN}:append = " \ + python3-brotli \ + python3-coverage \ + python3-django \ + python3-pytest \ + python3-requests \ +" diff --git a/meta-python/recipes-devtools/python/python3-whoosh/0001-Mark-non-determinstic-test_minimize_dfa-test-as-XFAI.patch b/meta-python/recipes-devtools/python/python3-whoosh/0001-Mark-non-determinstic-test_minimize_dfa-test-as-XFAI.patch new file mode 100644 index 0000000000..91fea24524 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-whoosh/0001-Mark-non-determinstic-test_minimize_dfa-test-as-XFAI.patch @@ -0,0 +1,29 @@ +From ede95a4f4487b4fc3cad8452ae388376966fca0e Mon Sep 17 00:00:00 2001 +From: Chris Lamb <lamby@debian.org> +Date: Fri, 5 Apr 2019 15:48:23 +0200 +Subject: [PATCH] Mark non-determinstic test_minimize_dfa test as XFAIL + +Sourced from Debian [1] +[1] https://sources.debian.org/src/python-whoosh/2.7.4%2Bgit6-g9134ad92-8/debian/patches/0003-Mark-non-determinstic-test_minimize_dfa-test-as-XFAI.patch/ + +Upstream-Status: Pending +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + tests/test_automata.py | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/tests/test_automata.py b/tests/test_automata.py +index daab96c..7031dc3 100644 +--- a/tests/test_automata.py ++++ b/tests/test_automata.py +@@ -327,6 +327,7 @@ def test_regular(): + assert not ex.accept("bc") + + ++@pytest.mark.xfail(strict=False) + def test_minimize_dfa(): + # Example from www.cs.odu.edu/~toida/nerzic/390teched/regular/fa/min-fa.html + +-- +2.44.0 + diff --git a/meta-python/recipes-devtools/python/python3-whoosh/run-ptest b/meta-python/recipes-devtools/python/python3-whoosh/run-ptest index 3385d68939..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-whoosh/run-ptest +++ b/meta-python/recipes-devtools/python/python3-whoosh/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-whoosh_2.7.4.bb b/meta-python/recipes-devtools/python/python3-whoosh_2.7.4.bb index ed2a6d423f..406de2e525 100644 --- a/meta-python/recipes-devtools/python/python3-whoosh_2.7.4.bb +++ b/meta-python/recipes-devtools/python/python3-whoosh_2.7.4.bb @@ -7,6 +7,8 @@ Whoosh works can be extended or replaced to meet your needs exactly." LICENSE = "BSD-2-Clause" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=05303186defc6141143629961c7c8a60" +SRC_URI += "file://0001-Mark-non-determinstic-test_minimize_dfa-test-as-XFAI.patch" + SRC_URI[md5sum] = "893433e9c0525ac043df33e6e04caab2" SRC_URI[sha256sum] = "e0857375f63e9041e03fedd5b7541f97cf78917ac1b6b06c1fcc9b45375dda69" @@ -16,13 +18,13 @@ PYPI_PACKAGE_EXT = "zip" inherit ptest pypi setuptools3 RDEPENDS:${PN} += " \ - ${PYTHON_PN}-email \ - ${PYTHON_PN}-multiprocessing \ - ${PYTHON_PN}-netclient \ - ${PYTHON_PN}-numbers \ - ${PYTHON_PN}-pickle \ - ${PYTHON_PN}-shell \ - ${PYTHON_PN}-stringold \ + python3-email \ + python3-multiprocessing \ + python3-netclient \ + python3-numbers \ + python3-pickle \ + python3-shell \ + python3-stringold \ " SRC_URI += " \ @@ -30,8 +32,9 @@ SRC_URI += " \ " RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-fcntl \ + python3-fcntl \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-wpa-supplicant_0.2.bb b/meta-python/recipes-devtools/python/python3-wpa-supplicant_0.2.bb index 5ac7786ad3..b9c62ced78 100644 --- a/meta-python/recipes-devtools/python/python3-wpa-supplicant_0.2.bb +++ b/meta-python/recipes-devtools/python/python3-wpa-supplicant_0.2.bb @@ -10,6 +10,8 @@ SRC_URI[sha256sum] = "3ad0f40a696763bb0f4d4dec5b51f6b53ccfeb7c16ebb5897349303045 SRC_URI += "file://0001-cli-drop-the-second-argument-from-click.argument-dec.patch" PYPI_PACKAGE = "wpa_supplicant" +UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/wpa_supplicant" +UPSTREAM_CHECK_REGEX = "/wpa_supplicant/(?P<pver>(\d+[\.\-_]*)+)" inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-wrapt/run-ptest b/meta-python/recipes-devtools/python/python3-wrapt/run-ptest new file mode 100644 index 0000000000..8d2017d39c --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-wrapt/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-wrapt_1.13.3.bb b/meta-python/recipes-devtools/python/python3-wrapt_1.13.3.bb deleted file mode 100644 index 05ee4c6356..0000000000 --- a/meta-python/recipes-devtools/python/python3-wrapt_1.13.3.bb +++ /dev/null @@ -1,16 +0,0 @@ -SUMMARY = "A Python module for decorators, wrappers and monkey patching." -HOMEPAGE = "http://wrapt.readthedocs.org/" -LICENSE = "BSD-2-Clause" -SECTION = "devel/python" -LIC_FILES_CHKSUM = "file://LICENSE;md5=fdfc019b57affbe1d7a32e3d34e83db4" - -SRC_URI[sha256sum] = "1fea9cd438686e6682271d36f3481a9f3636195578bab9ca3382e2f5f01fc185" - -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..398d2fa6b7 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-wrapt_1.16.0.bb @@ -0,0 +1,32 @@ +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 \ +" + +# python3-misc for 'this' module +RDEPENDS:${PN}-ptest += " \ + python3-misc \ + 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 6a9e464404..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 bd6853e747..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 @@ -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 \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-xlsxwriter_3.0.2.bb b/meta-python/recipes-devtools/python/python3-xlsxwriter_3.2.0.bb index 04f25532a6..6e8f1b24da 100644 --- a/meta-python/recipes-devtools/python/python3-xlsxwriter_3.0.2.bb +++ b/meta-python/recipes-devtools/python/python3-xlsxwriter_3.2.0.bb @@ -1,8 +1,8 @@ SUMMARY = "Python 2 and 3 compatibility library" HOMEPAGE = "https://xlsxwriter.readthedocs.io" SECTION = "devel/python" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=e5c795ec8cf90514a6d844b1d3cc3224" +LICENSE = "BSD-2-Clause" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=a4bab8df34a9a138b4e0ca56b8559a05" inherit pypi setuptools3 @@ -16,6 +16,6 @@ RDEPENDS:${PN} += " \ python3-io \ " -SRC_URI[sha256sum] = "53005f03e8eb58f061ebf41d5767c7495ee0772c2396fe26b7e0ca22fa9c2570" +SRC_URI[sha256sum] = "9977d0c661a72866a61f9f7a809e25ebbb0fb7036baa3b9fe74afcfca6b3cb8c" 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.8.0.bb b/meta-python/recipes-devtools/python/python3-xmlschema_1.8.0.bb deleted file mode 100644 index d720dd3341..0000000000 --- a/meta-python/recipes-devtools/python/python3-xmlschema_1.8.0.bb +++ /dev/null @@ -1,20 +0,0 @@ -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" - -SRC_URI[sha256sum] = "fa4e22a708f08d15f605c9191e2500149ba1a848fff7fa4904c2f2c57dc1087f" - -PYPI_PACKAGE = "xmlschema" -inherit pypi setuptools3 - -DEPENDS += "\ - ${PYTHON_PN}-elementpath-native \ -" - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-elementpath \ - ${PYTHON_PN}-modules \ -" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-python/recipes-devtools/python/python3-xmlschema_3.4.1.bb b/meta-python/recipes-devtools/python/python3-xmlschema_3.4.1.bb new file mode 100644 index 0000000000..845735c9ba --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-xmlschema_3.4.1.bb @@ -0,0 +1,15 @@ +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=26aa26eda991a3a2b61c11b62d3fda65" + +SRC_URI[sha256sum] = "4f69eca6f2c446b06c74acd958e7d6613487c253d959a3b75078dfcc880b80ff" + +inherit pypi python_setuptools_build_meta + +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 1d871b2d35..0000000000 --- a/meta-python/recipes-devtools/python/python3-xmltodict_0.12.0.bb +++ /dev/null @@ -1,25 +0,0 @@ -SUMMARY = "Makes working with XML feel like you are working with JSON" -AUTHOR = "Martin Blech" -HOMEPAGE = "https://github.com/martinblech/xmltodict" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=01441d50dc74476db58a41ac10cb9fa2" - -SRC_URI[md5sum] = "ddb2bd078cef4f7e3021a578034ad941" -SRC_URI[sha256sum] = "50d8c638ed7ecb88d90561beedbf720c9b4e851a9fa6c47ebd64e99d166d8a21" - -PYPI_PACKAGE = "xmltodict" - -inherit pypi setuptools3 ptest - -SRC_URI += " \ - file://run-ptest \ -" - -RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ -" - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/tests - cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ -} diff --git a/meta-python/recipes-devtools/python/python3-xmodem_0.4.6.bb b/meta-python/recipes-devtools/python/python3-xmodem_0.4.6.bb deleted file mode 100644 index 9d722b84f6..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..e41afb56c0 --- /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://LICENSE;md5=90bc9522130d68de0dcbf33707bbf124" + +SRC_URI[sha256sum] = "2f1068aa8676f0d1d112498b5786c4f8ea4f89d8f25d07d3a0f293cd21db1c35" + +inherit pypi setuptools3 + +do_install:append() { + install -d ${D}${docdir}/${PN} + mv ${D}${prefix}/doc/* ${D}${docdir}/${PN}/ + rmdir ${D}${prefix}/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.2.bb b/meta-python/recipes-devtools/python/python3-xxhash_3.5.0.bb index 01343abc85..bfa14012d0 100644 --- a/meta-python/recipes-devtools/python/python3-xxhash_2.0.2.bb +++ b/meta-python/recipes-devtools/python/python3-xxhash_3.5.0.bb @@ -3,16 +3,19 @@ SECTION = "devel/python" LICENSE = "BSD-2-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=3a9dab7f159514231249aa3e108ab26b" -SRC_URI[sha256sum] = "b7bead8cf6210eadf9cecf356e17af794f57c0939a3d420a00d87ea652f87b49" +DEPENDS += "python3-setuptools-scm-native" + +SRC_URI[sha256sum] = "84f2caddf951c9cbf8dc2e22a89d4ccf5d86391ac6418fe81e3c67d0cf60b45f" SRC_URI += " \ file://run-ptest \ " -inherit pypi setuptools3 ptest +inherit pypi python_setuptools_build_meta ptest RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-pytest \ + python3-pytest \ + python3-unittest-automake-output \ " do_install_ptest() { diff --git a/meta-python/recipes-devtools/python/python3-yamlloader_1.1.0.bb b/meta-python/recipes-devtools/python/python3-yamlloader_1.4.1.bb index a5510d5dc7..55c48f889c 100644 --- a/meta-python/recipes-devtools/python/python3-yamlloader_1.1.0.bb +++ b/meta-python/recipes-devtools/python/python3-yamlloader_1.4.1.bb @@ -3,10 +3,10 @@ HOMEPAGE = "https://github.com/Phynix/yamlloader" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=6831ef36faa29329bce2420c5356f97e" -SRC_URI[sha256sum] = "8a297c7a197683ba02e5e2b882ffd6c6180d01bdefb534b69cd3962df020bfe6" +SRC_URI[sha256sum] = "b6fe40ecf5af596d840e920670ed3475f9813492bf6e55b24f2ad450c212bab5" -inherit pypi setuptools3 +inherit pypi python_setuptools_build_meta RDEPENDS:${PN}:class-target += "\ - ${PYTHON_PN}-pyyaml \ + python3-pyyaml \ " diff --git a/meta-python/recipes-devtools/python/python3-yappi/0001-Fix-imports-for-ptests.patch b/meta-python/recipes-devtools/python/python3-yappi/0001-test_functionality-convert-line-endings-to-Unix.patch index fa58897e68..70d4607c29 100644 --- a/meta-python/recipes-devtools/python/python3-yappi/0001-Fix-imports-for-ptests.patch +++ b/meta-python/recipes-devtools/python/python3-yappi/0001-test_functionality-convert-line-endings-to-Unix.patch @@ -1,43 +1,23 @@ -From 0dedc1c573ddc4e87475eb03c64555cd54a72e92 Mon Sep 17 00:00:00 2001 -From: Trevor Gamblin <trevor.gamblin@windriver.com> -Date: Mon, 7 Jun 2021 09:40:20 -0400 -Subject: [PATCH] Fix imports for tests +From 0136ca731cba8b056b3f2ff0e7df3953b94f1e87 Mon Sep 17 00:00:00 2001 +From: Tim Orling <tim.orling@konsulko.com> +Date: Sun, 24 Dec 2023 09:41:57 -0800 +Subject: [PATCH 1/2] test_functionality: convert line endings to Unix -Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> +Convert the Windows line endings with dos2unix to be like the +other files in tests/* + +Upstream-Status: Submitted [https://github.com/sumerc/yappi/pull/164] + +Signed-off-by: Tim Orling <tim.orling@konsulko.com> --- - tests/test_asyncio.py | 2 +- - tests/test_asyncio_context_vars.py | 2 +- - tests/test_functionality.py | 2 +- - tests/test_gevent.py | 2 +- - tests/test_hooks.py | 2 +- - tests/test_tags.py | 2 +- - 6 files changed, 6 insertions(+), 6 deletions(-) + tests/test_functionality.py | 3822 +++++++++++++++++------------------ + 1 file changed, 1911 insertions(+), 1911 deletions(-) ---- a/tests/test_asyncio.py -+++ b/tests/test_asyncio.py -@@ -2,7 +2,7 @@ import unittest - import yappi - import asyncio - import threading --from utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io -+from .utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io - - - @asyncio.coroutine ---- a/tests/test_asyncio_context_vars.py -+++ b/tests/test_asyncio_context_vars.py -@@ -5,7 +5,7 @@ import contextvars - import functools - import time - import os --import utils -+import tests.utils as utils - import yappi - - async_context_id = contextvars.ContextVar('async_context_id') +diff --git a/tests/test_functionality.py b/tests/test_functionality.py +index 0e99c47..38bbe67 100644 --- a/tests/test_functionality.py +++ b/tests/test_functionality.py -@@ -1,1916 +1,1916 @@ +@@ -1,1911 +1,1911 @@ -import os
-import sys
-import time
@@ -46,7 +26,7 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> -import yappi
-import _yappi
-import utils
--import multiprocessing # added to fix http://bugs.python.org/issue15881 for > Py2.6
+-import multiprocessing
-import subprocess
-
-_counter = 0
@@ -317,10 +297,10 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> - def test_profile_decorator(self):
-
- def aggregate(func, stats):
-- fname = "tests/%s.profile" % (func.__name__)
+- fname = f"tests/{func.__name__}.profile"
- try:
- stats.add(fname)
-- except IOError:
+- except OSError:
- pass
- stats.save(fname)
- raise Exception("messing around")
@@ -1231,7 +1211,7 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> - # TODO: I put dummy() to fix below, remove the comments after a while.
- self.assertTrue( # FIX: I see this fails sometimes?
- tsm is not None,
-- 'Could not find "_MainThread". Found: %s' % (', '.join(utils.get_stat_names(tstats))))
+- f"Could not find \"_MainThread\". Found: {', '.join(utils.get_stat_names(tstats))}")
-
- def test_ctx_stats(self):
- from threading import Thread
@@ -1311,7 +1291,7 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> - # TODO: I put dummy() to fix below, remove the comments after a while.
- self.assertTrue( # FIX: I see this fails sometimes
- tsmain is not None,
-- 'Could not find "_MainThread". Found: %s' % (', '.join(utils.get_stat_names(stats))))
+- f"Could not find \"_MainThread\". Found: {', '.join(utils.get_stat_names(stats))}")
- self.assertTrue(1.0 > tst2.ttot >= 0.5)
- self.assertTrue(1.0 > tst1.ttot >= 0.5)
-
@@ -1368,7 +1348,7 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> - ts = []
- for i in (0.01, 0.05, 0.1):
- t = threading.Thread(target=burn_cpu, args=(i, ))
-- t.name = "burn_cpu-%s" % str(i)
+- t.name = f"burn_cpu-{str(i)}"
- t.start()
- ts.append(t)
- for t in ts:
@@ -1395,10 +1375,7 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> - def test_producer_consumer_with_queues(self):
- # we currently just stress yappi, no functionality test is done here.
- yappi.start()
-- if utils.is_py3x():
-- from queue import Queue
-- else:
-- from Queue import Queue
+- from queue import Queue
- from threading import Thread
- WORKER_THREAD_COUNT = 50
- WORK_ITEM_COUNT = 2000
@@ -1457,7 +1434,6 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> - fsh = utils.find_stat_by_name(stats, "handler")
- self.assertTrue(fsh is not None)
-
-- @unittest.skipIf(not sys.version_info >= (3, 2), "requires Python 3.2")
- def test_concurrent_futures(self):
- yappi.start()
- from concurrent.futures import ThreadPoolExecutor
@@ -1467,7 +1443,6 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> - time.sleep(1.0)
- yappi.stop()
-
-- @unittest.skipIf(not sys.version_info >= (3, 2), "requires Python 3.2")
- def test_barrier(self):
- yappi.start()
- b = threading.Barrier(2, timeout=1)
@@ -1961,8 +1936,8 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> +import unittest +import yappi +import _yappi -+import tests.utils as utils -+import multiprocessing # added to fix http://bugs.python.org/issue15881 for > Py2.6 ++import utils ++import multiprocessing +import subprocess + +_counter = 0 @@ -2233,10 +2208,10 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> + def test_profile_decorator(self): + + def aggregate(func, stats): -+ fname = "tests/%s.profile" % (func.__name__) ++ fname = f"tests/{func.__name__}.profile" + try: + stats.add(fname) -+ except IOError: ++ except OSError: + pass + stats.save(fname) + raise Exception("messing around") @@ -3006,8 +2981,8 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> + + def test_issue_32(self): + ''' -+ Start yappi from different thread and we get Internal Error(15) as -+ the current_ctx_id() called while enumerating the threads in start() ++ Start yappi from different thread and we get Internal Error(15) as ++ the current_ctx_id() called while enumerating the threads in start() + and as it does not swap to the enumerated ThreadState* the THreadState_GetDict() + returns wrong object and thus sets an invalid id for the _ctx structure. + @@ -3147,7 +3122,7 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> + # TODO: I put dummy() to fix below, remove the comments after a while. + self.assertTrue( # FIX: I see this fails sometimes? + tsm is not None, -+ 'Could not find "_MainThread". Found: %s' % (', '.join(utils.get_stat_names(tstats)))) ++ f"Could not find \"_MainThread\". Found: {', '.join(utils.get_stat_names(tstats))}") + + def test_ctx_stats(self): + from threading import Thread @@ -3227,7 +3202,7 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> + # TODO: I put dummy() to fix below, remove the comments after a while. + self.assertTrue( # FIX: I see this fails sometimes + tsmain is not None, -+ 'Could not find "_MainThread". Found: %s' % (', '.join(utils.get_stat_names(stats)))) ++ f"Could not find \"_MainThread\". Found: {', '.join(utils.get_stat_names(stats))}") + self.assertTrue(1.0 > tst2.ttot >= 0.5) + self.assertTrue(1.0 > tst1.ttot >= 0.5) + @@ -3284,7 +3259,7 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> + ts = [] + for i in (0.01, 0.05, 0.1): + t = threading.Thread(target=burn_cpu, args=(i, )) -+ t.name = "burn_cpu-%s" % str(i) ++ t.name = f"burn_cpu-{str(i)}" + t.start() + ts.append(t) + for t in ts: @@ -3311,10 +3286,7 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> + def test_producer_consumer_with_queues(self): + # we currently just stress yappi, no functionality test is done here. + yappi.start() -+ if utils.is_py3x(): -+ from queue import Queue -+ else: -+ from Queue import Queue ++ from queue import Queue + from threading import Thread + WORKER_THREAD_COUNT = 50 + WORK_ITEM_COUNT = 2000 @@ -3373,7 +3345,6 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> + fsh = utils.find_stat_by_name(stats, "handler") + self.assertTrue(fsh is not None) + -+ @unittest.skipIf(not sys.version_info >= (3, 2), "requires Python 3.2") + def test_concurrent_futures(self): + yappi.start() + from concurrent.futures import ThreadPoolExecutor @@ -3383,7 +3354,6 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> + time.sleep(1.0) + yappi.stop() + -+ @unittest.skipIf(not sys.version_info >= (3, 2), "requires Python 3.2") + def test_barrier(self): + yappi.start() + b = threading.Barrier(2, timeout=1) @@ -3870,36 +3840,6 @@ Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com> + # import sys;sys.argv = ['', 'BasicUsage.test_run_as_script'] + # import sys;sys.argv = ['', 'MultithreadedScenarios.test_subsequent_profile'] + unittest.main() ---- a/tests/test_gevent.py -+++ b/tests/test_gevent.py -@@ -4,7 +4,7 @@ import yappi - import gevent - from gevent.event import Event - import threading --from utils import ( -+from .utils import ( - YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io, - burn_io_gevent - ) ---- a/tests/test_hooks.py -+++ b/tests/test_hooks.py -@@ -5,7 +5,7 @@ import unittest - import time - - import yappi --import utils -+import tests.utils as utils - - - def a(): ---- a/tests/test_tags.py -+++ b/tests/test_tags.py -@@ -2,7 +2,7 @@ import unittest - import yappi - import threading - import time --from utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io -+from .utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io - - - class MultiThreadTests(YappiUnitTestCase): +-- +2.34.1 + diff --git a/meta-python/recipes-devtools/python/python3-yappi/0002-Fix-import-of-tests.utils-to-enable-pytest.patch b/meta-python/recipes-devtools/python/python3-yappi/0002-Fix-import-of-tests.utils-to-enable-pytest.patch new file mode 100644 index 0000000000..96dd024125 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-yappi/0002-Fix-import-of-tests.utils-to-enable-pytest.patch @@ -0,0 +1,101 @@ +From 28eac38566327091221aabbc164ea8e433c66e7e Mon Sep 17 00:00:00 2001 +From: Tim Orling <tim.orling@konsulko.com> +Date: Sun, 24 Dec 2023 09:27:50 -0800 +Subject: [PATCH 2/2] Fix import of tests.utils to enable pytest + +Running the test cases with pytest leads to importlib errors +because the "utils" module cannot be found. + +Upstream-Status: Submitted [https://github.com/sumerc/yappi/pull/164] + +Signed-off-by: Tim Orling <tim.orling@konsulko.com> +--- + tests/test_asyncio.py | 2 +- + tests/test_asyncio_context_vars.py | 2 +- + tests/test_functionality.py | 2 +- + tests/test_gevent.py | 2 +- + tests/test_hooks.py | 2 +- + tests/test_tags.py | 2 +- + 6 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/tests/test_asyncio.py b/tests/test_asyncio.py +index 8e9e631..bb36f4a 100644 +--- a/tests/test_asyncio.py ++++ b/tests/test_asyncio.py +@@ -2,7 +2,7 @@ import unittest + import yappi + import asyncio + import threading +-from utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io ++from tests.utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io + + + async def async_sleep(sec): +diff --git a/tests/test_asyncio_context_vars.py b/tests/test_asyncio_context_vars.py +index 5bd750c..9a253c0 100644 +--- a/tests/test_asyncio_context_vars.py ++++ b/tests/test_asyncio_context_vars.py +@@ -5,7 +5,7 @@ import contextvars + import functools + import time + import os +-import utils ++import tests.utils as utils + import yappi + + async_context_id = contextvars.ContextVar('async_context_id') +diff --git a/tests/test_functionality.py b/tests/test_functionality.py +index 38bbe67..8098f17 100644 +--- a/tests/test_functionality.py ++++ b/tests/test_functionality.py +@@ -5,7 +5,7 @@ import threading + import unittest + import yappi + import _yappi +-import utils ++import tests.utils as utils + import multiprocessing + import subprocess + +diff --git a/tests/test_gevent.py b/tests/test_gevent.py +index ed9e6ae..502af5f 100644 +--- a/tests/test_gevent.py ++++ b/tests/test_gevent.py +@@ -2,7 +2,7 @@ import unittest + import _yappi + import yappi + import threading +-from utils import ( ++from tests.utils import ( + YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io, burn_io_gevent + ) + +diff --git a/tests/test_hooks.py b/tests/test_hooks.py +index 297c643..8c387fc 100644 +--- a/tests/test_hooks.py ++++ b/tests/test_hooks.py +@@ -5,7 +5,7 @@ import unittest + import time + + import yappi +-import utils ++import tests.utils as utils + + + def a(): +diff --git a/tests/test_tags.py b/tests/test_tags.py +index b0b531d..b5a4016 100644 +--- a/tests/test_tags.py ++++ b/tests/test_tags.py +@@ -2,7 +2,7 @@ import unittest + import yappi + import threading + import time +-from utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io ++from tests.utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io + + + class MultiThreadTests(YappiUnitTestCase): +-- +2.34.1 + diff --git a/meta-python/recipes-devtools/python/python3-yappi/run-ptest b/meta-python/recipes-devtools/python/python3-yappi/run-ptest index 3385d68939..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-yappi/run-ptest +++ b/meta-python/recipes-devtools/python/python3-yappi/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-yappi_1.3.3.bb b/meta-python/recipes-devtools/python/python3-yappi_1.3.3.bb deleted file mode 100644 index 45a5f058ac..0000000000 --- a/meta-python/recipes-devtools/python/python3-yappi_1.3.3.bb +++ /dev/null @@ -1,34 +0,0 @@ -SUMMARY = "Yet Another Python Profiler" -HOMEPAGE = "https://github.com/sumerc/yappi" - -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=71c208c9a4fd864385eb69ad4caa3bee" - -SRC_URI[sha256sum] = "855890cd9a90d833dd2df632d648de8ccd0a4c3131f1edc8abd004db0625b5e8" - -SRC_URI += " \ - file://run-ptest \ - file://0001-Fix-imports-for-ptests.patch \ -" - -inherit pypi setuptools3 ptest - -RDEPENDS:${PN} += "\ - ${PYTHON_PN}-datetime \ - ${PYTHON_PN}-pickle \ - ${PYTHON_PN}-threading \ -" - -RDEPENDS:${PN}-ptest += " \ - ${PYTHON_PN}-gevent \ - ${PYTHON_PN}-multiprocessing \ - ${PYTHON_PN}-pytest \ - ${PYTHON_PN}-profile \ - ${PYTHON_PN}-zopeinterface \ -" - -do_install_ptest() { - install -d ${D}${PTEST_PATH}/tests - cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/ - cp -f ${S}/yappi/yappi.py ${D}/${PTEST_PATH}/ -} diff --git a/meta-python/recipes-devtools/python/python3-yappi_1.6.0.bb b/meta-python/recipes-devtools/python/python3-yappi_1.6.0.bb new file mode 100644 index 0000000000..4349cab1e7 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-yappi_1.6.0.bb @@ -0,0 +1,37 @@ +SUMMARY = "Yet Another Python Profiler" +HOMEPAGE = "https://github.com/sumerc/yappi" + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=71c208c9a4fd864385eb69ad4caa3bee" + +SRC_URI[sha256sum] = "a9aaf72009d8c03067294151ee0470ac7a6dfa7b33baab40b198d6c1ef00430a" + +SRC_URI += " \ + file://run-ptest \ + file://0001-test_functionality-convert-line-endings-to-Unix.patch \ + file://0002-Fix-import-of-tests.utils-to-enable-pytest.patch \ +" + +inherit pypi python_setuptools_build_meta ptest + +RDEPENDS:${PN} += "\ + python3-datetime \ + python3-pickle \ + python3-threading \ +" + +RDEPENDS:${PN}-ptest += " \ + python3-gevent \ + python3-multiprocessing \ + python3-pytest \ + python3-profile \ + python3-unittest-automake-output \ + python3-zopeinterface \ +" + +do_install_ptest() { + install -d ${D}${PTEST_PATH}/tests + cp -rf ${S}/tests ${D}${PTEST_PATH} + cp -f ${S}/run_tests.py ${D}${PTEST_PATH} +} + diff --git a/meta-python/recipes-devtools/python/python3-yarl/run-ptest b/meta-python/recipes-devtools/python/python3-yarl/run-ptest index 3385d68939..8d2017d39c 100644 --- a/meta-python/recipes-devtools/python/python3-yarl/run-ptest +++ b/meta-python/recipes-devtools/python/python3-yarl/run-ptest @@ -1,3 +1,3 @@ #!/bin/sh -pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}' +pytest --automake diff --git a/meta-python/recipes-devtools/python/python3-yarl_1.11.1.bb b/meta-python/recipes-devtools/python/python3-yarl_1.11.1.bb new file mode 100644 index 0000000000..37d77b7183 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-yarl_1.11.1.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] = "1bb2d9e212fb7449b8fb73bc461b51eaa17cc8430b4a87d87be7b25052d92f53" + +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-yarl_1.7.2.bb b/meta-python/recipes-devtools/python/python3-yarl_1.7.2.bb deleted file mode 100644 index 0867d1cb53..0000000000 --- a/meta-python/recipes-devtools/python/python3-yarl_1.7.2.bb +++ /dev/null @@ -1,26 +0,0 @@ -SUMMARY = "The module provides handy URL class for url parsing and changing" -HOMEPAGE = "https://github.com/aio-libs/yarl/" -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE;md5=e581798a7b985311f29fa3e163ea27ae" - -SRC_URI[sha256sum] = "45399b46d60c253327a460e99856752009fcee5f5d3c80b2f7c0cae1c38d56dd" - -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-zeroconf_0.134.0.bb b/meta-python/recipes-devtools/python/python3-zeroconf_0.134.0.bb new file mode 100644 index 0000000000..b1b1a2e4c5 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-zeroconf_0.134.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] = "5be2c3a61cc81eb1bd4684bbdee19d708522d94bc8ac60dfe001a0fde4421092" + +DEPENDS += "python3-cython-native" + +inherit pypi python_poetry_core + +RDEPENDS:${PN} += " \ + python3-ifaddr (>=0.1.7) \ + python3-async-timeout \ +" diff --git a/meta-python/recipes-devtools/python/python3-zeroconf_0.36.13.bb b/meta-python/recipes-devtools/python/python3-zeroconf_0.36.13.bb deleted file mode 100644 index ccab7fe4c9..0000000000 --- a/meta-python/recipes-devtools/python/python3-zeroconf_0.36.13.bb +++ /dev/null @@ -1,13 +0,0 @@ -SUMMARY = "Pure Python Multicast DNS Service Discovery Library (Bonjour/Avahi compatible)" -HOMEPAGE = "https://github.com/jstasiak/python-zeroconf" -LICENSE = "LGPL-2.1" -LIC_FILES_CHKSUM = "file://COPYING;md5=3bb705b228ea4a14ea2728215b780d80" - -SRC_URI[sha256sum] = "196fa1bd6e166f0333e3e9fff076f9991bf2719c4788287eaec577c241ef96bf" - -inherit pypi setuptools3 - -RDEPENDS:${PN} += " \ - ${PYTHON_PN}-ifaddr \ - ${PYTHON_PN}-asyncio \ -" diff --git a/meta-python/recipes-devtools/python/python3-zopeevent_5.0.bb b/meta-python/recipes-devtools/python/python3-zopeevent_5.0.bb new file mode 100644 index 0000000000..4d914c63e9 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-zopeevent_5.0.bb @@ -0,0 +1,10 @@ +DESCRIPTION = "The zope.event package provides a simple event system" + +LICENSE = "ZPL-2.1" +LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=72092419572155ddc2d4fb7631c63dd3" + +SRC_URI[sha256sum] = "bac440d8d9891b4068e2b5a2c5e2c9765a9df762944bda6955f96bb9b91e67cd" + +PYPI_PACKAGE = "zope.event" + +inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python/python3-zopeinterface_5.4.0.bb b/meta-python/recipes-devtools/python/python3-zopeinterface_6.3.bb index b048c80e13..21d03f2e7d 100644 --- a/meta-python/recipes-devtools/python/python3-zopeinterface_5.4.0.bb +++ b/meta-python/recipes-devtools/python/python3-zopeinterface_6.3.bb @@ -5,13 +5,13 @@ LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e54fd776274c1b7423 PYPI_PACKAGE = "zope.interface" inherit pypi setuptools3 -SRC_URI[sha256sum] = "5dba5f530fec3f0988d83b78cc591b58c0b6eb8431a85edd1569a0539a8a5a0e" +SRC_URI[sha256sum] = "f83d6b4b22262d9a826c3bd4b2fbfafe1d0000f085ef8e44cd1328eea274ae6a" PACKAGES =. "${PN}-test " RPROVIDES:${PN} += "zope-interfaces" -RDEPENDS:${PN}:class-target += "${PYTHON_PN}-datetime" +RDEPENDS:${PN}:class-target += "python3-datetime" RDEPENDS:${PN}-test += "python3-unittest python3-doctest" FILES:${PN}-dbg += "${PYTHON_SITEPACKAGES_DIR}/*.egg/*/*/.debug" diff --git a/meta-python/recipes-devtools/python/tftpy_0.8.2.bb b/meta-python/recipes-devtools/python/tftpy_0.8.2.bb new file mode 100644 index 0000000000..c1b3234f72 --- /dev/null +++ b/meta-python/recipes-devtools/python/tftpy_0.8.2.bb @@ -0,0 +1,13 @@ +SUMMARY = "Tftpy is a TFTP library for the Python programming language. It includes client and server classes, with sample implementations." +DESCRIPTION = "Tftpy is a TFTP library for the Python programming language. It \ +includes client and server classes, with sample implementations. Hooks are \ +included for easy inclusion in a UI for populating progress indicators. It \ +supports RFCs 1350, 2347, 2348 and the tsize option from RFC 2349." + +HOMEPAGE = "https://github.com/msoulier/tftpy" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=22770e72ae03c61f5bcc4e333b61368d" + +SRC_URI[sha256sum] = "e1d1a680efd88eba176b351175844253067392a9b0f8b81588e3ff2b9e7bbb5b" + +inherit pypi setuptools3 diff --git a/meta-python/recipes-devtools/python3-attrdict3/python3-attrdict3_2.0.2.bb b/meta-python/recipes-devtools/python3-attrdict3/python3-attrdict3_2.0.2.bb new file mode 100644 index 0000000000..ee099c7ac9 --- /dev/null +++ b/meta-python/recipes-devtools/python3-attrdict3/python3-attrdict3_2.0.2.bb @@ -0,0 +1,14 @@ +SUMMARY = "AttrDict is an MIT-licensed library that provides mapping objects that allow their elements to be accessed both as keys and as attributes" +HOMEPAGE = "https://pypi.org/project/attrdict3/" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=2b37be7e71ebfc92a94bfacf6b20a1cc" + +DEPENDS = "" + +SRC_URI[sha256sum] = "004c171ca1120cc1755701db99d7fa4944afb1e68950434efdaa542513335fe8" + +inherit pypi setuptools3 + +BBCLASSEXTEND = "native" + +RDEPENDS:${PN} += "python3-six" diff --git a/meta-python/recipes-devtools/python3-gspread/python3-gspread_6.1.2.bb b/meta-python/recipes-devtools/python3-gspread/python3-gspread_6.1.2.bb new file mode 100644 index 0000000000..0aae1d0c96 --- /dev/null +++ b/meta-python/recipes-devtools/python3-gspread/python3-gspread_6.1.2.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] = "b147688b8c7a18c9835d5f998997ec17c97c0470babcab17f65ac2b3a32402b7" + +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.1.0b1.bb b/meta-python/recipes-devtools/python3-reedsolo/python3-reedsolo_2.1.0b1.bb new file mode 100644 index 0000000000..bd2b59d369 --- /dev/null +++ b/meta-python/recipes-devtools/python3-reedsolo/python3-reedsolo_2.1.0b1.bb @@ -0,0 +1,11 @@ +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] = "e11528d63e75461d45b86c23f9db8260303d6ab6cae075fa9eddb44527ad8ece" + +inherit pypi setuptools3 + +DEPENDS += "python3-cython-native" +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/0001-sip-Fix-build-with-gcc-14.patch b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/0001-sip-Fix-build-with-gcc-14.patch new file mode 100644 index 0000000000..4782e74ef3 --- /dev/null +++ b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/0001-sip-Fix-build-with-gcc-14.patch @@ -0,0 +1,31 @@ +From 5234a454a1b9f11f83e59909fb2972176497e02c Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Thu, 9 May 2024 17:35:11 -0700 +Subject: [PATCH] sip: Fix build with gcc-14 + +Fixes -Wincompatible-pointer-types +sip/siplib/siplib.c:3900:20: error: assignment to 'sipSimpleWrapper *' {aka 'struct _sipSimpleWrapper *'} from incompatible pointer type 'PyObject *' {aka 'struct _object *'} [-Wincompatible-pointer-types] +| 3900 | *selfp = va_arg(va, PyObject *); + +Upstream-Status: Pending +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + sip/siplib/siplib.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/sip/siplib/siplib.c b/sip/siplib/siplib.c +index 95563e5c..ae3fac60 100644 +--- a/sip/siplib/siplib.c ++++ b/sip/siplib/siplib.c +@@ -3897,7 +3897,7 @@ static int parsePass1(PyObject **parseErrp, sipSimpleWrapper **selfp, + { + case '#': + /* A ctor has an argument with the /Transfer/ annotation. */ +- *selfp = va_arg(va, PyObject *); ++ *selfp = (sipSimpleWrapper *)va_arg(va, PyObject *); + break; + + case 'B': +-- +2.45.0 + 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..cc6b6cef67 --- /dev/null +++ b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4_4.2.1.bb @@ -0,0 +1,39 @@ +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 \ + file://0001-sip-Fix-build-with-gcc-14.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 |