aboutsummaryrefslogtreecommitdiffstats
path: root/meta-python
diff options
context:
space:
mode:
Diffstat (limited to 'meta-python')
-rw-r--r--meta-python/README.md (renamed from meta-python/README)14
-rw-r--r--meta-python/classes/distutils-common-base.bbclass28
-rw-r--r--meta-python/classes/distutils3-base.bbclass9
-rw-r--r--meta-python/classes/distutils3.bbclass71
-rw-r--r--meta-python/conf/include/ptest-packagelists-meta-python.inc108
-rw-r--r--meta-python/conf/layer.conf6
-rw-r--r--meta-python/licenses/CRC32C-ADLER15
-rw-r--r--meta-python/licenses/WTFPL14
-rw-r--r--meta-python/recipes-connectivity/gateone/gateone/80oe.conf.in24
-rw-r--r--meta-python/recipes-connectivity/gateone/gateone/gateone-avahi.service10
-rw-r--r--meta-python/recipes-connectivity/gateone/gateone/gateone-init.in47
-rw-r--r--meta-python/recipes-connectivity/gateone/gateone/gateone.service.in10
-rw-r--r--meta-python/recipes-connectivity/gateone/gateone_git.bb85
-rw-r--r--meta-python/recipes-connectivity/python-gsocketpool/python-gsocketpool.inc12
-rw-r--r--meta-python/recipes-connectivity/python-gsocketpool/python-gsocketpool_0.1.6.bb2
-rw-r--r--meta-python/recipes-connectivity/python-gsocketpool/python3-gsocketpool_0.1.6.bb17
-rw-r--r--meta-python/recipes-connectivity/python-h2/python3-h2_4.1.0.bb11
-rw-r--r--meta-python/recipes-connectivity/python-hpack/python3-hpack_4.0.0.bb12
-rw-r--r--meta-python/recipes-connectivity/python-hyperframe/python3-hyperframe_6.0.1.bb9
-rw-r--r--meta-python/recipes-connectivity/python-mprpc/python-mprpc.inc13
-rw-r--r--meta-python/recipes-connectivity/python-mprpc/python-mprpc_0.1.17.bb2
-rw-r--r--meta-python/recipes-connectivity/python-mprpc/python3-mprpc_0.1.17.bb2
-rw-r--r--meta-python/recipes-connectivity/python-priority/python3-priority_2.0.0.bb9
-rw-r--r--meta-python/recipes-connectivity/python-pyconnman/python-pyconnman.inc12
-rw-r--r--meta-python/recipes-connectivity/python-pyconnman/python-pyconnman_0.1.0.bb5
-rw-r--r--meta-python/recipes-connectivity/python-pyconnman/python3-pyconnman_0.1.0.bb5
-rw-r--r--meta-python/recipes-connectivity/python-pyconnman/python3-pyconnman_0.2.0.bb12
-rw-r--r--meta-python/recipes-connectivity/python-pyro4/python-pyro4_4.73.bb18
-rw-r--r--meta-python/recipes-connectivity/python-pyro4/python3-pyro4_4.82.bb15
-rw-r--r--meta-python/recipes-connectivity/python-pytun/python-pytun_2.2.1.bb2
-rw-r--r--meta-python/recipes-connectivity/python-pytun/python3-pytun_2.2.1.bb2
-rw-r--r--meta-python/recipes-connectivity/python-thrift/python-thrift_0.11.0.bb18
-rw-r--r--meta-python/recipes-connectivity/python-thrift/python3-thrift_0.20.0.bb20
-rw-r--r--meta-python/recipes-connectivity/python-txws/python-txws_0.9.1.bb15
-rw-r--r--meta-python/recipes-connectivity/python-txws/python3-txws_0.9.1.bb19
-rw-r--r--meta-python/recipes-connectivity/python3-pytun/python3-pytun_2.4.1.bb (renamed from meta-python/recipes-connectivity/python-pytun/python-pytun.inc)5
-rw-r--r--meta-python/recipes-connectivity/telepathy/telepathy-python3-0.15.19/parallel_make.patch (renamed from meta-python/recipes-connectivity/telepathy/telepathy-python-0.15.19/parallel_make.patch)0
-rw-r--r--meta-python/recipes-connectivity/telepathy/telepathy-python3-0.15.19/remove_duplicate_install.patch (renamed from meta-python/recipes-connectivity/telepathy/telepathy-python-0.15.19/remove_duplicate_install.patch)10
-rw-r--r--meta-python/recipes-connectivity/telepathy/telepathy-python3-0.15.19/telepathy-python_fix_for_automake_1.12.patch (renamed from meta-python/recipes-connectivity/telepathy/telepathy-python-0.15.19/telepathy-python_fix_for_automake_1.12.patch)2
-rw-r--r--meta-python/recipes-connectivity/telepathy/telepathy-python3_0.15.19.bb33
-rw-r--r--meta-python/recipes-connectivity/telepathy/telepathy-python_0.15.19.bb32
-rw-r--r--meta-python/recipes-core/images/meta-python-image-all.bb5
-rw-r--r--meta-python/recipes-core/images/meta-python-image-base.bb7
-rw-r--r--meta-python/recipes-core/images/meta-python-image-ptest-all.bb25
-rw-r--r--meta-python/recipes-core/images/meta-python-image-ptest-fast.bb6
-rw-r--r--meta-python/recipes-core/images/meta-python-image-ptest.bb44
-rw-r--r--meta-python/recipes-core/images/meta-python-image.bb6
-rw-r--r--meta-python/recipes-core/images/meta-python-ptest-image.bb5
-rw-r--r--meta-python/recipes-core/packagegroups/packagegroup-meta-python.bb655
-rw-r--r--meta-python/recipes-devtools/gyp/gyp_git.bb7
-rw-r--r--meta-python/recipes-devtools/python-jsonref/files/migrate-to-pdm-backend.patch28
-rw-r--r--meta-python/recipes-devtools/python-jsonref/python-jsonref.inc11
-rw-r--r--meta-python/recipes-devtools/python-jsonref/python-jsonref_0.2.bb1
-rw-r--r--meta-python/recipes-devtools/python-jsonref/python3-jsonref_1.1.0.bb23
-rw-r--r--meta-python/recipes-devtools/python/files/0001-versioneer.py-do-not-use-SafeConfigParser.patch29
-rw-r--r--meta-python/recipes-devtools/python/pamela_0.3.0.bb15
-rw-r--r--meta-python/recipes-devtools/python/pamela_1.1.0.bb14
-rw-r--r--meta-python/recipes-devtools/python/pyrtm_0.4.2.bb21
-rw-r--r--meta-python/recipes-devtools/python/python-aiohttp.inc21
-rw-r--r--meta-python/recipes-devtools/python/python-alembic.inc15
-rw-r--r--meta-python/recipes-devtools/python/python-alembic_1.2.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-anyjson.inc13
-rw-r--r--meta-python/recipes-devtools/python/python-anyjson_0.3.3.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-appdirs.inc8
-rw-r--r--meta-python/recipes-devtools/python/python-appdirs_1.4.3.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-asn1crypto.inc23
-rw-r--r--meta-python/recipes-devtools/python/python-asn1crypto_1.0.1.bb7
-rw-r--r--meta-python/recipes-devtools/python/python-astroid.inc31
-rw-r--r--meta-python/recipes-devtools/python/python-astroid_1.6.5.bb10
-rw-r--r--meta-python/recipes-devtools/python/python-atomicwrites.inc7
-rw-r--r--meta-python/recipes-devtools/python/python-atomicwrites_1.3.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-attr.inc9
-rw-r--r--meta-python/recipes-devtools/python/python-attr_0.3.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-attrs.inc16
-rw-r--r--meta-python/recipes-devtools/python/python-attrs_19.2.0.bb6
-rw-r--r--meta-python/recipes-devtools/python/python-automat.inc24
-rw-r--r--meta-python/recipes-devtools/python/python-automat/0001-setup.py-remove-the-dependency-on-m2r.patch50
-rw-r--r--meta-python/recipes-devtools/python/python-automat_0.7.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-aws-iot-device-sdk-python_1.4.0.bb4
-rw-r--r--meta-python/recipes-devtools/python/python-babel.inc25
-rw-r--r--meta-python/recipes-devtools/python/python-babel_2.7.0.bb6
-rw-r--r--meta-python/recipes-devtools/python/python-backports-abc_0.4.bb18
-rw-r--r--meta-python/recipes-devtools/python/python-backports-functools-lru-cache_1.5.bb19
-rw-r--r--meta-python/recipes-devtools/python/python-backports-ssl_3.5.0.1.bb18
-rw-r--r--meta-python/recipes-devtools/python/python-bcrypt.inc17
-rw-r--r--meta-python/recipes-devtools/python/python-bcrypt_3.1.4.bb6
-rw-r--r--meta-python/recipes-devtools/python/python-beautifulsoup4.inc17
-rw-r--r--meta-python/recipes-devtools/python/python-beautifulsoup4_4.8.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-behave.inc15
-rw-r--r--meta-python/recipes-devtools/python/python-behave_1.2.6.bb8
-rw-r--r--meta-python/recipes-devtools/python/python-bitarray.inc11
-rw-r--r--meta-python/recipes-devtools/python/python-bitarray_0.8.3.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-blinker.inc7
-rw-r--r--meta-python/recipes-devtools/python/python-blinker_1.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-cachetools.inc16
-rw-r--r--meta-python/recipes-devtools/python/python-cachetools_3.1.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-can.inc18
-rw-r--r--meta-python/recipes-devtools/python/python-can_2.2.1.bb8
-rw-r--r--meta-python/recipes-devtools/python/python-certifi.inc13
-rw-r--r--meta-python/recipes-devtools/python/python-certifi_2019.9.11.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-cffi.inc17
-rw-r--r--meta-python/recipes-devtools/python/python-cffi_1.13.0.bb6
-rw-r--r--meta-python/recipes-devtools/python/python-chardet.inc23
-rw-r--r--meta-python/recipes-devtools/python/python-chardet_3.0.4.bb4
-rw-r--r--meta-python/recipes-devtools/python/python-cheetah_2.4.4.bb16
-rw-r--r--meta-python/recipes-devtools/python/python-click.inc25
-rw-r--r--meta-python/recipes-devtools/python/python-click_7.0.bb4
-rw-r--r--meta-python/recipes-devtools/python/python-cmd2.inc13
-rw-r--r--meta-python/recipes-devtools/python/python-cmd2_0.9.18.bb14
-rw-r--r--meta-python/recipes-devtools/python/python-coloredlogs.inc24
-rw-r--r--meta-python/recipes-devtools/python/python-coloredlogs_10.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-configparser.inc11
-rw-r--r--meta-python/recipes-devtools/python/python-configparser_3.8.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-constantly.inc11
-rw-r--r--meta-python/recipes-devtools/python/python-constantly_15.1.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-crcmod.inc14
-rw-r--r--meta-python/recipes-devtools/python/python-crcmod_1.7.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-cryptography-vectors.inc18
-rw-r--r--meta-python/recipes-devtools/python/python-cryptography-vectors_2.7.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-cryptography.inc58
-rw-r--r--meta-python/recipes-devtools/python/python-cryptography_2.7.bb22
-rw-r--r--meta-python/recipes-devtools/python/python-cython.inc40
-rw-r--r--meta-python/recipes-devtools/python/python-cython_0.29.13.bb10
-rw-r--r--meta-python/recipes-devtools/python/python-daemon/0001-Workaround-for-issue-2-1.patch31
-rw-r--r--meta-python/recipes-devtools/python/python-daemon_2.1.2.bb27
-rw-r--r--meta-python/recipes-devtools/python/python-daemonize_2.4.7.bb16
-rw-r--r--meta-python/recipes-devtools/python/python-dateutil.inc25
-rw-r--r--meta-python/recipes-devtools/python/python-dateutil_2.8.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-dbus_1.2.12.bb32
-rw-r--r--meta-python/recipes-devtools/python/python-dbusmock/0001-Add-functionality-to-add-own-objects-to-internal-obj.patch52
-rw-r--r--meta-python/recipes-devtools/python/python-dbusmock/0002-Add-possibility-to-import-templates-from-packages.patch27
-rw-r--r--meta-python/recipes-devtools/python/python-dbusmock_0.16.7.bb25
-rw-r--r--meta-python/recipes-devtools/python/python-decorator_4.4.0.bb4
-rw-r--r--meta-python/recipes-devtools/python/python-django-south.inc4
-rw-r--r--meta-python/recipes-devtools/python/python-django-south_1.0.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-django.inc41
-rw-r--r--meta-python/recipes-devtools/python/python-django_1.11.14.bb8
-rw-r--r--meta-python/recipes-devtools/python/python-djangorestframework_3.9.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-dnspython.inc20
-rw-r--r--meta-python/recipes-devtools/python/python-dnspython_1.15.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-docutils_0.14rc2.bb18
-rw-r--r--meta-python/recipes-devtools/python/python-dominate.inc11
-rw-r--r--meta-python/recipes-devtools/python/python-dominate_2.3.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-editor.inc9
-rw-r--r--meta-python/recipes-devtools/python/python-editor_1.0.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-engineio.inc13
-rw-r--r--meta-python/recipes-devtools/python/python-engineio_3.9.3.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-enum34_1.1.6.bb11
-rw-r--r--meta-python/recipes-devtools/python/python-epydoc_3.0.1.bb19
-rw-r--r--meta-python/recipes-devtools/python/python-evdev.inc21
-rw-r--r--meta-python/recipes-devtools/python/python-evdev_0.7.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-fann2.inc9
-rw-r--r--meta-python/recipes-devtools/python/python-feedformatter.inc16
-rw-r--r--meta-python/recipes-devtools/python/python-feedformatter_0.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-feedparser_5.2.1.bb17
-rw-r--r--meta-python/recipes-devtools/python/python-flask-babel.inc16
-rw-r--r--meta-python/recipes-devtools/python/python-flask-babel_0.11.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-flask-bcrypt_0.7.1.bb12
-rw-r--r--meta-python/recipes-devtools/python/python-flask-bootstrap.inc10
-rw-r--r--meta-python/recipes-devtools/python/python-flask-bootstrap_3.3.7.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-flask-login_0.4.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-flask-mail.inc12
-rw-r--r--meta-python/recipes-devtools/python/python-flask-mail_0.9.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-flask-migrate.inc14
-rw-r--r--meta-python/recipes-devtools/python/python-flask-migrate_2.2.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-flask-nav.inc13
-rw-r--r--meta-python/recipes-devtools/python/python-flask-nav_0.6.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-flask-navigation_0.2.0.bb15
-rw-r--r--meta-python/recipes-devtools/python/python-flask-pymongo.inc15
-rw-r--r--meta-python/recipes-devtools/python/python-flask-pymongo_2.3.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-flask-restful_0.3.6.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-flask-script.inc12
-rw-r--r--meta-python/recipes-devtools/python/python-flask-script_2.0.6.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-flask-sijax.inc6
-rw-r--r--meta-python/recipes-devtools/python/python-flask-sijax_0.4.1.bb4
-rw-r--r--meta-python/recipes-devtools/python/python-flask-socketio_3.3.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-flask-sqlalchemy.inc10
-rw-r--r--meta-python/recipes-devtools/python/python-flask-sqlalchemy_2.3.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-flask-uploads.inc12
-rw-r--r--meta-python/recipes-devtools/python/python-flask-uploads_0.2.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-flask-user.inc17
-rw-r--r--meta-python/recipes-devtools/python/python-flask-user_0.6.19.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-flask-wtf.inc15
-rw-r--r--meta-python/recipes-devtools/python/python-flask-wtf_0.14.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-flask-xstatic.inc10
-rw-r--r--meta-python/recipes-devtools/python/python-flask-xstatic/remove-pip-requires.patch2
-rw-r--r--meta-python/recipes-devtools/python/python-flask-xstatic_0.0.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-flask.inc16
-rw-r--r--meta-python/recipes-devtools/python/python-flask_1.0.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-funcsigs_1.0.2.bb18
-rw-r--r--meta-python/recipes-devtools/python/python-functools32_3.2.3-2.bb10
-rw-r--r--meta-python/recipes-devtools/python/python-future.inc13
-rw-r--r--meta-python/recipes-devtools/python/python-future_0.16.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-gdata_2.0.18.bb21
-rw-r--r--meta-python/recipes-devtools/python/python-gevent.inc35
-rw-r--r--meta-python/recipes-devtools/python/python-gevent/0002-setup.py-do-not-query-for-include-dir.patch26
-rw-r--r--meta-python/recipes-devtools/python/python-gevent/libev-conf.patch26
-rw-r--r--meta-python/recipes-devtools/python/python-gevent_1.4.0.bb4
-rw-r--r--meta-python/recipes-devtools/python/python-greenlet.inc9
-rw-r--r--meta-python/recipes-devtools/python/python-greenlet_0.4.15.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-grpcio-tools.inc16
-rw-r--r--meta-python/recipes-devtools/python/python-grpcio-tools_1.14.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-grpcio.inc30
-rw-r--r--meta-python/recipes-devtools/python/python-grpcio/0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch40
-rw-r--r--meta-python/recipes-devtools/python/python-grpcio/gettid.patch26
-rw-r--r--meta-python/recipes-devtools/python/python-grpcio/ppc-boringssl-support.patch17
-rw-r--r--meta-python/recipes-devtools/python/python-grpcio/riscv64_support.patch16
-rw-r--r--meta-python/recipes-devtools/python/python-grpcio_1.19.0.bb6
-rw-r--r--meta-python/recipes-devtools/python/python-html5lib.inc17
-rw-r--r--meta-python/recipes-devtools/python/python-html5lib_1.0.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-humanfriendly.inc25
-rw-r--r--meta-python/recipes-devtools/python/python-humanfriendly_4.18.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-humanize.inc14
-rw-r--r--meta-python/recipes-devtools/python/python-humanize_0.5.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-hyperlink.inc17
-rw-r--r--meta-python/recipes-devtools/python/python-hyperlink_19.0.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-idna-ssl.inc10
-rw-r--r--meta-python/recipes-devtools/python/python-idna.inc18
-rw-r--r--meta-python/recipes-devtools/python/python-idna_2.8.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-imaging/0001-python-imaging-setup.py-force-paths-for-zlib-freetyp.patch55
-rw-r--r--meta-python/recipes-devtools/python/python-imaging/allow.to.disable.some.features.patch65
-rw-r--r--meta-python/recipes-devtools/python/python-imaging/fix-freetype-includes.patch30
-rw-r--r--meta-python/recipes-devtools/python/python-imaging/python-imaging-CVE-2016-2533.patch38
-rw-r--r--meta-python/recipes-devtools/python/python-imaging/remove-host-libdir.patch25
-rw-r--r--meta-python/recipes-devtools/python/python-imaging_1.1.7.bb48
-rw-r--r--meta-python/recipes-devtools/python/python-importlib-metadata.inc12
-rw-r--r--meta-python/recipes-devtools/python/python-importlib-metadata_0.23.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-incremental_17.5.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-inflection.inc14
-rw-r--r--meta-python/recipes-devtools/python/python-inflection_0.3.1.bb4
-rw-r--r--meta-python/recipes-devtools/python/python-intervals.inc15
-rw-r--r--meta-python/recipes-devtools/python/python-intervals_1.5.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-iso8601.inc13
-rw-r--r--meta-python/recipes-devtools/python/python-iso8601_0.1.12.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-isodate.inc14
-rw-r--r--meta-python/recipes-devtools/python/python-isodate_0.6.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-isort.inc17
-rw-r--r--meta-python/recipes-devtools/python/python-isort_4.3.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-itsdangerous.inc14
-rw-r--r--meta-python/recipes-devtools/python/python-itsdangerous_0.24.bb6
-rw-r--r--meta-python/recipes-devtools/python/python-javaobj-py3_0.2.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-jinja2.inc17
-rw-r--r--meta-python/recipes-devtools/python/python-jinja2_2.10.3.bb8
-rw-r--r--meta-python/recipes-devtools/python/python-jsonpatch.inc12
-rw-r--r--meta-python/recipes-devtools/python/python-jsonpatch_1.24.bb4
-rw-r--r--meta-python/recipes-devtools/python/python-jsonpointer.inc13
-rw-r--r--meta-python/recipes-devtools/python/python-jsonpointer_2.0.bb4
-rw-r--r--meta-python/recipes-devtools/python/python-jsonschema.inc27
-rw-r--r--meta-python/recipes-devtools/python/python-jsonschema_3.1.1.bb12
-rw-r--r--meta-python/recipes-devtools/python/python-kconfiglib-10.42.0.inc8
-rw-r--r--meta-python/recipes-devtools/python/python-lazy-object-proxy.inc10
-rw-r--r--meta-python/recipes-devtools/python/python-lazy-object-proxy_1.3.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-libusb1_3.1.0.bb18
-rw-r--r--meta-python/recipes-devtools/python/python-linecache2_1.0.0.bb13
-rw-r--r--meta-python/recipes-devtools/python/python-lockfile_0.12.2.bb19
-rw-r--r--meta-python/recipes-devtools/python/python-lrparsing_1.0.16.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-lxml.inc55
-rw-r--r--meta-python/recipes-devtools/python/python-lxml_4.4.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-m2crypto.inc54
-rw-r--r--meta-python/recipes-devtools/python/python-m2crypto/m2crypto-0.26.4-gcc_macros.patch35
-rw-r--r--meta-python/recipes-devtools/python/python-m2crypto_0.30.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-mako.inc21
-rw-r--r--meta-python/recipes-devtools/python/python-mako_1.1.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-markupsafe.inc14
-rw-r--r--meta-python/recipes-devtools/python/python-markupsafe_1.1.1.bb6
-rw-r--r--meta-python/recipes-devtools/python/python-matplotlib/fix_setupext.patch110
-rw-r--r--meta-python/recipes-devtools/python/python-mccabe/0001-python-mccabe-remove-unnecessary-setup_requires-pyte.patch33
-rw-r--r--meta-python/recipes-devtools/python/python-mccabe_0.4.0.bb20
-rw-r--r--meta-python/recipes-devtools/python/python-mock_3.0.5.bb22
-rw-r--r--meta-python/recipes-devtools/python/python-monotonic_1.5.bb10
-rw-r--r--meta-python/recipes-devtools/python/python-more-itertools.inc9
-rw-r--r--meta-python/recipes-devtools/python/python-more-itertools_7.2.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-msgpack.inc13
-rw-r--r--meta-python/recipes-devtools/python/python-msgpack_0.6.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-ndg-httpsclient.inc25
-rw-r--r--meta-python/recipes-devtools/python/python-ndg-httpsclient_0.5.1.bb6
-rw-r--r--meta-python/recipes-devtools/python/python-netaddr.inc13
-rw-r--r--meta-python/recipes-devtools/python/python-netaddr_0.7.19.bb6
-rw-r--r--meta-python/recipes-devtools/python/python-networkx.inc10
-rw-r--r--meta-python/recipes-devtools/python/python-networkx_2.2.bb8
-rw-r--r--meta-python/recipes-devtools/python/python-numeric/0001-it-tries-to-define-this-function-differently-than-it.patch30
-rw-r--r--meta-python/recipes-devtools/python/python-numeric_24.2.bb16
-rw-r--r--meta-python/recipes-devtools/python/python-oauthlib.inc25
-rw-r--r--meta-python/recipes-devtools/python/python-obd.inc11
-rw-r--r--meta-python/recipes-devtools/python/python-packaging.inc10
-rw-r--r--meta-python/recipes-devtools/python/python-packaging_19.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-paho-mqtt.inc22
-rw-r--r--meta-python/recipes-devtools/python/python-paho-mqtt_1.4.0.bb6
-rw-r--r--meta-python/recipes-devtools/python/python-pam_1.8.2.bb15
-rw-r--r--meta-python/recipes-devtools/python/python-pandas.inc23
-rw-r--r--meta-python/recipes-devtools/python/python-parse-type.inc12
-rw-r--r--meta-python/recipes-devtools/python/python-parse-type_0.4.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-parse.inc14
-rw-r--r--meta-python/recipes-devtools/python/python-parse_1.8.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-passlib_1.7.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-paste_3.2.2.bb17
-rw-r--r--meta-python/recipes-devtools/python/python-pathlib2.inc9
-rw-r--r--meta-python/recipes-devtools/python/python-pathlib2_2.3.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pbr_5.4.3.bb13
-rw-r--r--meta-python/recipes-devtools/python/python-pep8_1.7.1.bb16
-rw-r--r--meta-python/recipes-devtools/python/python-periphery.inc7
-rw-r--r--meta-python/recipes-devtools/python/python-periphery_1.1.1.bb4
-rw-r--r--meta-python/recipes-devtools/python/python-pexpect.inc21
-rw-r--r--meta-python/recipes-devtools/python/python-pexpect_4.6.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pika.inc22
-rw-r--r--meta-python/recipes-devtools/python/python-pika_1.1.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pint.inc15
-rw-r--r--meta-python/recipes-devtools/python/python-pint_0.8.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pip_19.3.bb14
-rw-r--r--meta-python/recipes-devtools/python/python-pluggy.inc11
-rw-r--r--meta-python/recipes-devtools/python/python-pluggy_0.13.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-ply.inc18
-rw-r--r--meta-python/recipes-devtools/python/python-ply_3.11.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pocketsphinx.inc9
-rw-r--r--meta-python/recipes-devtools/python/python-pretend.inc9
-rw-r--r--meta-python/recipes-devtools/python/python-pretend_1.0.9.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-prettytable.inc25
-rw-r--r--meta-python/recipes-devtools/python/python-prettytable_0.7.2.bb3
-rw-r--r--meta-python/recipes-devtools/python/python-progress.inc14
-rw-r--r--meta-python/recipes-devtools/python/python-progress_1.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-prompt-toolkit.inc18
-rw-r--r--meta-python/recipes-devtools/python/python-prompt-toolkit_2.0.4.bb6
-rw-r--r--meta-python/recipes-devtools/python/python-protobuf.inc32
-rw-r--r--meta-python/recipes-devtools/python/python-protobuf_3.9.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-psutil.inc22
-rw-r--r--meta-python/recipes-devtools/python/python-psutil_5.6.3.bb6
-rw-r--r--meta-python/recipes-devtools/python/python-ptyprocess.inc20
-rw-r--r--meta-python/recipes-devtools/python/python-ptyprocess_0.6.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-py.inc10
-rw-r--r--meta-python/recipes-devtools/python/python-py_1.8.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pyalsaaudio.inc11
-rw-r--r--meta-python/recipes-devtools/python/python-pyalsaaudio_0.8.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pyasn1-modules.inc16
-rw-r--r--meta-python/recipes-devtools/python/python-pyasn1-modules_0.2.7.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pyasn1.inc16
-rw-r--r--meta-python/recipes-devtools/python/python-pyasn1_0.4.7.bb6
-rw-r--r--meta-python/recipes-devtools/python/python-pyaudio.inc13
-rw-r--r--meta-python/recipes-devtools/python/python-pybind11.inc7
-rw-r--r--meta-python/recipes-devtools/python/python-pybind11_2.2.3.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pybluez.inc21
-rw-r--r--meta-python/recipes-devtools/python/python-pybluez_0.22.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pycodestyle.inc12
-rw-r--r--meta-python/recipes-devtools/python/python-pycodestyle_2.5.0.bb10
-rw-r--r--meta-python/recipes-devtools/python/python-pycparser.inc17
-rw-r--r--meta-python/recipes-devtools/python/python-pycparser_2.19.bb6
-rw-r--r--meta-python/recipes-devtools/python/python-pycrypto.inc21
-rw-r--r--meta-python/recipes-devtools/python/python-pycrypto/CVE-2013-7459.patch98
-rw-r--r--meta-python/recipes-devtools/python/python-pycrypto/cross-compiling.patch23
-rw-r--r--meta-python/recipes-devtools/python/python-pycrypto_2.6.1.bb9
-rw-r--r--meta-python/recipes-devtools/python/python-pycryptodome.inc29
-rw-r--r--meta-python/recipes-devtools/python/python-pycryptodome_3.4.11.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pycurl.inc26
-rw-r--r--meta-python/recipes-devtools/python/python-pycurl_7.43.0.3.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pydbus.inc11
-rw-r--r--meta-python/recipes-devtools/python/python-pydbus_0.6.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pyexpect.inc11
-rw-r--r--meta-python/recipes-devtools/python/python-pyexpect_1.0.17.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pyfirmata.inc13
-rw-r--r--meta-python/recipes-devtools/python/python-pyfirmata_1.0.3.bb3
-rw-r--r--meta-python/recipes-devtools/python/python-pyflakes_2.1.1.bb16
-rw-r--r--meta-python/recipes-devtools/python/python-pyflame.inc18
-rw-r--r--meta-python/recipes-devtools/python/python-pyflame_1.6.7.bb4
-rw-r--r--meta-python/recipes-devtools/python/python-pygpgme/0001-reflect-2.1-reporting-for-key-imports.patch90
-rw-r--r--meta-python/recipes-devtools/python/python-pygpgme/0002-passphrase_cb-is-deprecated.patch52
-rw-r--r--meta-python/recipes-devtools/python/python-pygpgme/0003-handle-generic-error-when-no-passphrase-callback-pre.patch30
-rw-r--r--meta-python/recipes-devtools/python/python-pygpgme/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python-pygpgme_0.3.bb26
-rw-r--r--meta-python/recipes-devtools/python/python-pyhamcrest_1.9.0.bb10
-rw-r--r--meta-python/recipes-devtools/python/python-pyiface.inc11
-rw-r--r--meta-python/recipes-devtools/python/python-pyiface_0.0.11.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pyinotify.inc16
-rw-r--r--meta-python/recipes-devtools/python/python-pyinotify_0.9.6.bb6
-rw-r--r--meta-python/recipes-devtools/python/python-pyjks_17.1.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pyjwt.inc17
-rw-r--r--meta-python/recipes-devtools/python/python-pyjwt_1.6.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pylint.inc38
-rw-r--r--meta-python/recipes-devtools/python/python-pylint_1.8.3.bb4
-rw-r--r--meta-python/recipes-devtools/python/python-pymisp.inc15
-rw-r--r--meta-python/recipes-devtools/python/python-pymisp_2.4.93.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pymongo_3.9.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pymysql_0.9.3.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pynetlinux.inc11
-rw-r--r--meta-python/recipes-devtools/python/python-pynetlinux_1.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pyopenssl.inc23
-rw-r--r--meta-python/recipes-devtools/python/python-pyopenssl_19.0.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pyparsing.inc21
-rw-r--r--meta-python/recipes-devtools/python/python-pyparsing_2.4.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pyperclip.inc14
-rw-r--r--meta-python/recipes-devtools/python/python-pyperclip_1.7.0.bb7
-rw-r--r--meta-python/recipes-devtools/python/python-pyperf_1.6.1.bb4
-rw-r--r--meta-python/recipes-devtools/python/python-pyrex-native_0.9.9.bb5
-rw-r--r--meta-python/recipes-devtools/python/python-pyrex/pyrex-fix-optimized-mode.patch15
-rw-r--r--meta-python/recipes-devtools/python/python-pyrex_0.9.9.bb22
-rw-r--r--meta-python/recipes-devtools/python/python-pyroute2.inc25
-rw-r--r--meta-python/recipes-devtools/python/python-pyroute2_0.5.2.bb6
-rw-r--r--meta-python/recipes-devtools/python/python-pyrsistent.inc13
-rw-r--r--meta-python/recipes-devtools/python/python-pyrsistent_0.15.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pyserial.inc44
-rw-r--r--meta-python/recipes-devtools/python/python-pyserial_3.4.bb4
-rw-r--r--meta-python/recipes-devtools/python/python-pysmi_0.2.2.bb16
-rw-r--r--meta-python/recipes-devtools/python/python-pysnmp_4.4.9.bb26
-rw-r--r--meta-python/recipes-devtools/python/python-pysocks.inc18
-rw-r--r--meta-python/recipes-devtools/python/python-pysocks_1.7.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pysqlite.inc18
-rw-r--r--meta-python/recipes-devtools/python/python-pysqlite_2.8.3.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pystache.inc13
-rw-r--r--meta-python/recipes-devtools/python/python-pystache_0.5.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pytest-asyncio.inc13
-rw-r--r--meta-python/recipes-devtools/python/python-pytest-helpers-namespace_2016.7.10.bb7
-rw-r--r--meta-python/recipes-devtools/python/python-pytest-runner.inc16
-rw-r--r--meta-python/recipes-devtools/python/python-pytest-runner_5.1.bb5
-rw-r--r--meta-python/recipes-devtools/python/python-pytest-tempdir.inc10
-rw-r--r--meta-python/recipes-devtools/python/python-pytest-tempdir_2016.8.20.bb7
-rw-r--r--meta-python/recipes-devtools/python/python-pytest.inc41
-rw-r--r--meta-python/recipes-devtools/python/python-pytest/0001-setup.py-remove-the-setup_requires-for-setuptools-scm.patch36
-rw-r--r--meta-python/recipes-devtools/python/python-pytest_5.2.1.bb9
-rw-r--r--meta-python/recipes-devtools/python/python-pytz.inc20
-rwxr-xr-xmeta-python/recipes-devtools/python/python-pytz_2019.3.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pyudev.inc19
-rw-r--r--meta-python/recipes-devtools/python/python-pyudev_0.21.0.bb9
-rw-r--r--meta-python/recipes-devtools/python/python-pyusb.inc12
-rw-r--r--meta-python/recipes-devtools/python/python-pyusb_1.0.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pyyaml.inc18
-rw-r--r--meta-python/recipes-devtools/python/python-pyyaml_5.1.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-pyzmq.inc27
-rw-r--r--meta-python/recipes-devtools/python/python-pyzmq/club-rpath-out.patch13
-rw-r--r--meta-python/recipes-devtools/python/python-pyzmq_17.1.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-raven.inc13
-rw-r--r--meta-python/recipes-devtools/python/python-rdflib.inc15
-rw-r--r--meta-python/recipes-devtools/python/python-rdflib_4.2.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-redis.inc12
-rw-r--r--meta-python/recipes-devtools/python/python-redis_2.10.6.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-requests-oauthlib.inc7
-rw-r--r--meta-python/recipes-devtools/python/python-requests-oauthlib_0.8.0.bb3
-rw-r--r--meta-python/recipes-devtools/python/python-requests.inc28
-rw-r--r--meta-python/recipes-devtools/python/python-requests_2.22.0.bb4
-rw-r--r--meta-python/recipes-devtools/python/python-rfc3987.inc8
-rw-r--r--meta-python/recipes-devtools/python/python-rfc3987_1.3.8.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-robotframework-seriallibrary.inc15
-rw-r--r--meta-python/recipes-devtools/python/python-robotframework-seriallibrary_0.3.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-robotframework_3.0.4.bb6
-rw-r--r--meta-python/recipes-devtools/python/python-scrypt.inc16
-rw-r--r--meta-python/recipes-devtools/python/python-scrypt_0.8.6.bb3
-rw-r--r--meta-python/recipes-devtools/python/python-sdnotify.inc16
-rw-r--r--meta-python/recipes-devtools/python/python-sdnotify_0.3.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-selectors34_1.2.bb12
-rw-r--r--meta-python/recipes-devtools/python/python-semver.inc12
-rw-r--r--meta-python/recipes-devtools/python/python-semver_2.8.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-sentry-sdk.inc12
-rw-r--r--meta-python/recipes-devtools/python/python-serpent.inc13
-rw-r--r--meta-python/recipes-devtools/python/python-serpent_1.25.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-setuptools-scm.inc14
-rw-r--r--meta-python/recipes-devtools/python/python-setuptools-scm_2.1.0.bb4
-rw-r--r--meta-python/recipes-devtools/python/python-sh.inc32
-rw-r--r--meta-python/recipes-devtools/python/python-sh_1.12.14.bb8
-rw-r--r--meta-python/recipes-devtools/python/python-sijax.inc8
-rw-r--r--meta-python/recipes-devtools/python/python-sijax_0.3.2.bb11
-rw-r--r--meta-python/recipes-devtools/python/python-simplejson_3.16.0.bb4
-rw-r--r--meta-python/recipes-devtools/python/python-singledispatch_3.4.0.3.bb12
-rw-r--r--meta-python/recipes-devtools/python/python-slip-dbus.inc29
-rw-r--r--meta-python/recipes-devtools/python/python-slip-dbus_0.6.5.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-smbus.inc12
-rw-r--r--meta-python/recipes-devtools/python/python-smbus_4.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-snakefood_1.4.bb51
-rw-r--r--meta-python/recipes-devtools/python/python-snimpy_0.8.12.bb20
-rw-r--r--meta-python/recipes-devtools/python/python-socketio.inc28
-rw-r--r--meta-python/recipes-devtools/python/python-socketio_4.3.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-sparts_0.7.3.bb22
-rw-r--r--meta-python/recipes-devtools/python/python-speaklater.inc9
-rw-r--r--meta-python/recipes-devtools/python/python-speaklater_1.3.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-sqlalchemy.inc20
-rw-r--r--meta-python/recipes-devtools/python/python-sqlalchemy_1.1.17.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-statistics_1.0.3.5.bb15
-rw-r--r--meta-python/recipes-devtools/python/python-stevedore.inc15
-rw-r--r--meta-python/recipes-devtools/python/python-stevedore_1.31.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-strict-rfc3339.inc8
-rw-r--r--meta-python/recipes-devtools/python/python-strict-rfc3339_0.7.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-subprocess32_3.2.7.bb15
-rw-r--r--meta-python/recipes-devtools/python/python-systemd.inc18
-rw-r--r--meta-python/recipes-devtools/python/python-systemd_234.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-term.inc9
-rw-r--r--meta-python/recipes-devtools/python/python-toml.inc10
-rw-r--r--meta-python/recipes-devtools/python/python-toml_0.10.0.bb6
-rw-r--r--meta-python/recipes-devtools/python/python-tornado-redis_2.4.18.bb18
-rw-r--r--meta-python/recipes-devtools/python/python-tornado_5.1.bb8
-rw-r--r--meta-python/recipes-devtools/python/python-tqdm.inc13
-rw-r--r--meta-python/recipes-devtools/python/python-tqdm_4.31.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-traceback2_1.4.0.bb15
-rw-r--r--meta-python/recipes-devtools/python/python-twine.inc11
-rw-r--r--meta-python/recipes-devtools/python/python-twisted.inc250
-rw-r--r--meta-python/recipes-devtools/python/python-twisted_19.7.0.bb8
-rw-r--r--meta-python/recipes-devtools/python/python-twitter.inc17
-rw-r--r--meta-python/recipes-devtools/python/python-twitter_3.7.0.bb3
-rw-r--r--meta-python/recipes-devtools/python/python-twofish.inc13
-rw-r--r--meta-python/recipes-devtools/python/python-twofish_0.3.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-typing.inc9
-rw-r--r--meta-python/recipes-devtools/python/python-typing_3.7.4.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-tzlocal.inc8
-rw-r--r--meta-python/recipes-devtools/python/python-tzlocal_1.5.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-ujson.inc15
-rw-r--r--meta-python/recipes-devtools/python/python-ujson_1.35.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-unidiff.inc14
-rw-r--r--meta-python/recipes-devtools/python/python-unidiff_0.5.5.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-urllib3.inc21
-rw-r--r--meta-python/recipes-devtools/python/python-urllib3_1.25.6.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-vcversioner_2.16.0.0.bb17
-rw-r--r--meta-python/recipes-devtools/python/python-versiontools.inc10
-rw-r--r--meta-python/recipes-devtools/python/python-versiontools_1.9.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-visitor.inc6
-rw-r--r--meta-python/recipes-devtools/python/python-visitor_0.1.3.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-vobject_0.9.6.1.bb15
-rw-r--r--meta-python/recipes-devtools/python/python-waitress_1.3.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-wcwidth.inc8
-rw-r--r--meta-python/recipes-devtools/python/python-wcwidth_0.1.7.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-webcolors.inc12
-rw-r--r--meta-python/recipes-devtools/python/python-webcolors_1.8.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-webdav_0.1.2.bb19
-rw-r--r--meta-python/recipes-devtools/python/python-webencodings.inc15
-rw-r--r--meta-python/recipes-devtools/python/python-webencodings_0.5.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-websocket-client.inc18
-rw-r--r--meta-python/recipes-devtools/python/python-werkzeug.inc47
-rw-r--r--meta-python/recipes-devtools/python/python-werkzeug_0.14.1.bb7
-rw-r--r--meta-python/recipes-devtools/python/python-whoosh.inc24
-rw-r--r--meta-python/recipes-devtools/python/python-whoosh_2.7.4.bb6
-rw-r--r--meta-python/recipes-devtools/python/python-wrapt.inc15
-rw-r--r--meta-python/recipes-devtools/python/python-wrapt_1.11.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-wtforms.inc15
-rw-r--r--meta-python/recipes-devtools/python/python-wtforms_2.2.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-xlrd.inc14
-rw-r--r--meta-python/recipes-devtools/python/python-xlrd_1.1.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-xstatic-font-awesome.inc17
-rw-r--r--meta-python/recipes-devtools/python/python-xstatic-font-awesome_4.7.0.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-xstatic.inc14
-rw-r--r--meta-python/recipes-devtools/python/python-xstatic_1.0.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-xxhash.inc7
-rw-r--r--meta-python/recipes-devtools/python/python-yappi.inc16
-rw-r--r--meta-python/recipes-devtools/python/python-yappi_0.98.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-yarl.inc10
-rw-r--r--meta-python/recipes-devtools/python/python-zipp.inc10
-rw-r--r--meta-python/recipes-devtools/python/python-zipp_0.6.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python-zopeinterface.inc22
-rw-r--r--meta-python/recipes-devtools/python/python-zopeinterface_4.6.0.bb4
-rw-r--r--meta-python/recipes-devtools/python/python3-a2wsgi/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-a2wsgi_1.10.4.bb33
-rw-r--r--meta-python/recipes-devtools/python/python3-absl_2.1.0.bb (renamed from meta-python/recipes-devtools/python/python3-absl_0.7.0.bb)7
-rw-r--r--meta-python/recipes-devtools/python/python3-aenum_3.1.15.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-aiodns_3.2.0.bb18
-rw-r--r--meta-python/recipes-devtools/python/python3-aiofiles_0.4.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-aiofiles_23.2.1.bb (renamed from meta-python/recipes-devtools/python/python-aiofiles.inc)11
-rw-r--r--meta-python/recipes-devtools/python/python3-aiohappyeyeballs_2.3.2.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-aiohttp-jinja2_1.6.bb13
-rw-r--r--meta-python/recipes-devtools/python/python3-aiohttp_3.5.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-aiohttp_3.9.4.bb22
-rw-r--r--meta-python/recipes-devtools/python/python3-aiohue_4.7.1.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-aioredis_2.0.1.bb16
-rwxr-xr-xmeta-python/recipes-devtools/python/python3-aioserial_1.3.1.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-aiosignal_1.3.1.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-alembic_1.13.1.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-alembic_1.2.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-aniso8601_9.0.1.bb8
-rw-r--r--meta-python/recipes-devtools/python/python3-annotated-types_0.6.0.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-ansi2html_1.9.1.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-ansicolors/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-ansicolors_1.1.8.bb25
-rw-r--r--meta-python/recipes-devtools/python/python3-antlr4-runtime_4.13.1.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-anyio_4.3.0.bb27
-rw-r--r--meta-python/recipes-devtools/python/python3-anyjson_0.3.3.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-apiflask_2.1.1.bb18
-rw-r--r--meta-python/recipes-devtools/python/python3-apispec_6.4.0.bb10
-rw-r--r--meta-python/recipes-devtools/python/python3-appdirs/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-appdirs_1.4.3.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-appdirs_1.4.4.bb24
-rw-r--r--meta-python/recipes-devtools/python/python3-apply-defaults_0.1.6.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-argcomplete_3.2.3.bb18
-rw-r--r--meta-python/recipes-devtools/python/python3-argexec_1.0.3.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-argh_0.31.2.bb26
-rw-r--r--meta-python/recipes-devtools/python/python3-arpeggio_2.0.2.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-arrow/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-arrow_1.3.0.bb35
-rw-r--r--meta-python/recipes-devtools/python/python3-asciitree_0.3.3.bb9
-rw-r--r--meta-python/recipes-devtools/python/python3-asgiref/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-asgiref_3.8.1.bb30
-rw-r--r--meta-python/recipes-devtools/python/python3-asn1crypto_1.0.1.bb6
-rw-r--r--meta-python/recipes-devtools/python/python3-aspectlib/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-aspectlib_2.0.0.bb35
-rw-r--r--meta-python/recipes-devtools/python/python3-astor/0001-rtrip.py-convert-to-python3.patch36
-rw-r--r--meta-python/recipes-devtools/python/python3-astor_0.8.1.bb (renamed from meta-python/recipes-devtools/python/python3-astor_0.7.1.bb)6
-rw-r--r--meta-python/recipes-devtools/python/python3-astroid_1.6.5.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-astroid_3.1.0.bb37
-rw-r--r--meta-python/recipes-devtools/python/python3-asttokens_2.4.1.bb18
-rw-r--r--meta-python/recipes-devtools/python/python3-async-timeout_3.0.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-async-timeout_4.0.3.bb (renamed from meta-python/recipes-devtools/python/python-async-timeout.inc)11
-rw-r--r--meta-python/recipes-devtools/python/python3-asyncinotify_4.0.6.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-asyncio-glib_0.1.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-asyncio-throttle_1.0.2.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-atomicwrites_1.3.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-attr_0.3.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-attr_0.3.2.bb8
-rw-r--r--meta-python/recipes-devtools/python/python3-attrs_19.2.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-autobahn_23.6.2.bb21
-rw-r--r--meta-python/recipes-devtools/python/python3-autoflake_2.2.1.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-automat_0.7.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-automat_22.10.0.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-awesomeversion_24.2.0.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-aws-iot-device-sdk-python/0001-setup.py-Use-setuptools-instead-of-distutils.patch29
-rw-r--r--meta-python/recipes-devtools/python/python3-aws-iot-device-sdk-python_1.4.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-aws-iot-device-sdk-python_1.5.2.bb (renamed from meta-python/recipes-devtools/python/python-aws-iot-device-sdk-python.inc)37
-rw-r--r--meta-python/recipes-devtools/python/python3-babel_2.7.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-backcall_0.2.0.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-bandit_1.5.1.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-bandit_1.7.8.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-bcrypt_3.1.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-beautifulsoup4_4.12.3.bb18
-rw-r--r--meta-python/recipes-devtools/python/python3-beautifulsoup4_4.8.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-behave_1.2.6.bb18
-rw-r--r--meta-python/recipes-devtools/python/python3-betamax/0001-Drop-ptests-fixtures-and-recorde_modes.patch343
-rw-r--r--meta-python/recipes-devtools/python/python3-betamax/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-betamax_0.9.0.bb27
-rw-r--r--meta-python/recipes-devtools/python/python3-bidict_0.23.0.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-binwalk_2.3.4.bb25
-rw-r--r--meta-python/recipes-devtools/python/python3-bitarray_0.8.3.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-bitarray_2.9.2.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-bitstring_4.1.4.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-bitstruct_8.19.0.bb13
-rw-r--r--meta-python/recipes-devtools/python/python3-bleak/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-bleak_0.21.1.bb33
-rw-r--r--meta-python/recipes-devtools/python/python3-blinker/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-blinker_1.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-blinker_1.7.0.bb23
-rw-r--r--meta-python/recipes-devtools/python/python3-brotli_1.1.0.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-cachecontrol_0.14.0.bb28
-rw-r--r--meta-python/recipes-devtools/python/python3-cached-property_1.5.2.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-cachetools/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-cachetools_3.1.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-cachetools_5.3.3.bb33
-rw-r--r--meta-python/recipes-devtools/python/python3-can_2.2.1.bb7
-rw-r--r--meta-python/recipes-devtools/python/python3-can_4.2.2.bb29
-rw-r--r--meta-python/recipes-devtools/python/python3-cantools_39.4.4.bb24
-rw-r--r--meta-python/recipes-devtools/python/python3-cassandra-driver_3.14.0.bb8
-rw-r--r--meta-python/recipes-devtools/python/python3-cassandra-driver_3.29.1.bb (renamed from meta-python/recipes-devtools/python/python-cassandra-driver.inc)27
-rw-r--r--meta-python/recipes-devtools/python/python3-casttube_0.2.1.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-cbor2/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-cbor2_5.6.3.bb33
-rw-r--r--meta-python/recipes-devtools/python/python3-cchardet_2.1.7.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-cerberus_1.3.5.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-certifi_2019.9.11.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-cffi_1.13.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-chardet_3.0.4.bb7
-rw-r--r--meta-python/recipes-devtools/python/python3-charset-normalizer_3.3.2.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-cheetah_3.2.6.post1.bb (renamed from meta-python/recipes-devtools/python/python3-cheetah_3.2.3.bb)9
-rw-r--r--meta-python/recipes-devtools/python/python3-classes_0.4.1.bb10
-rw-r--r--meta-python/recipes-devtools/python/python3-click-repl_0.3.0.bb10
-rw-r--r--meta-python/recipes-devtools/python/python3-click-spinner/0001-Update-Versioneer-to-0.22.patch2489
-rw-r--r--meta-python/recipes-devtools/python/python3-click-spinner_0.1.10.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-click_7.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-cloudpickle_3.0.0.bb18
-rw-r--r--meta-python/recipes-devtools/python/python3-cmake/CMakeLists.txt11
-rw-r--r--meta-python/recipes-devtools/python/python3-cmake/run-cmake-from-path.patch13
-rw-r--r--meta-python/recipes-devtools/python/python3-cmake_3.28.3.bb37
-rw-r--r--meta-python/recipes-devtools/python/python3-cmd2_0.9.18.bb9
-rw-r--r--meta-python/recipes-devtools/python/python3-cmd2_2.4.3.bb23
-rw-r--r--meta-python/recipes-devtools/python/python3-colorama_0.4.1.bb10
-rw-r--r--meta-python/recipes-devtools/python/python3-colorama_0.4.6.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-colorclass_2.2.2.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-coloredlogs_10.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-coloredlogs_15.0.1.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-colorlog_6.8.2.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-colorzero_2.0.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-configargparse_1.7.bb21
-rw-r--r--meta-python/recipes-devtools/python/python3-configobj_5.0.8.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-configparser_3.8.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-configshell-fb_1.1.30.bb18
-rw-r--r--meta-python/recipes-devtools/python/python3-constantly_15.1.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-constantly_23.10.4.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-contextlib2_21.6.0.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-covdefaults/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-covdefaults_2.3.0.bb30
-rw-r--r--meta-python/recipes-devtools/python/python3-coverage_4.4.2.bb10
-rw-r--r--meta-python/recipes-devtools/python/python3-coverage_7.4.1.bb22
-rw-r--r--meta-python/recipes-devtools/python/python3-cppy/0001-Fix-build-error-as-following.patch28
-rw-r--r--meta-python/recipes-devtools/python/python3-cppy_1.2.1.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-crc32c_2.3.bb22
-rw-r--r--meta-python/recipes-devtools/python/python3-crcmod/0001-setup.py-use-setuptools-instead-of-distutils.patch22
-rw-r--r--meta-python/recipes-devtools/python/python3-crcmod_1.7.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-croniter_2.0.3.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-cryptography-vectors_2.7.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-cryptography/run-ptest2
-rw-r--r--meta-python/recipes-devtools/python/python3-cryptography_2.7.bb8
-rw-r--r--meta-python/recipes-devtools/python/python3-custom-inherit_2.4.1.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-cvxopt_1.3.2.bb21
-rw-r--r--meta-python/recipes-devtools/python/python3-cycler_0.12.1.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-cython_0.29.13.bb18
-rw-r--r--meta-python/recipes-devtools/python/python3-cytoolz_0.12.3.bb13
-rw-r--r--meta-python/recipes-devtools/python/python3-daemon_3.0.1.bb18
-rw-r--r--meta-python/recipes-devtools/python/python3-dateparser_1.2.0.bb23
-rw-r--r--meta-python/recipes-devtools/python/python3-dateutil_2.8.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-dateutil_2.9.0.bb24
-rw-r--r--meta-python/recipes-devtools/python/python3-dbus-fast_2.21.1.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-dbus-next_0.2.3.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-dbussy/setuptools.patch56
-rw-r--r--meta-python/recipes-devtools/python/python3-dbussy_1.3.bb22
-rw-r--r--meta-python/recipes-devtools/python/python3-decorator_4.4.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-decorator_5.1.1.bb (renamed from meta-python/recipes-devtools/python/python-decorator.inc)13
-rw-r--r--meta-python/recipes-devtools/python/python3-decouple_3.8.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-defusedxml_0.7.1.bb (renamed from meta-python/recipes-devtools/python/python3-defusedxml_0.6.0.bb)9
-rw-r--r--meta-python/recipes-devtools/python/python3-deprecated_1.2.14.bb13
-rw-r--r--meta-python/recipes-devtools/python/python3-dill_0.3.8.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-dirty-equals_0.7.1.bb21
-rw-r--r--meta-python/recipes-devtools/python/python3-diskcache_5.6.3.bb22
-rw-r--r--meta-python/recipes-devtools/python/python3-distlib_0.3.8.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-distro_1.9.0.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-django_1.11.14.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-django_4.2.11.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-django_5.0.4.bb9
-rw-r--r--meta-python/recipes-devtools/python/python3-djangorestframework_3.15.1.bb (renamed from meta-python/recipes-devtools/python/python-djangorestframework.inc)12
-rw-r--r--meta-python/recipes-devtools/python/python3-djangorestframework_3.9.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-dnspython/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-dnspython_1.15.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-dnspython_2.6.1.bb36
-rw-r--r--meta-python/recipes-devtools/python/python3-docopt_0.6.2.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-dominate/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-dominate_2.3.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-dominate_2.9.1.bb26
-rw-r--r--meta-python/recipes-devtools/python/python3-dt-schema_git.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-dynamic-dispatch_1.0.3.bb20
-rw-r--r--meta-python/recipes-devtools/python/python3-ecdsa/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-ecdsa_0.19.0.bb36
-rw-r--r--meta-python/recipes-devtools/python/python3-editor_1.0.4.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-elementpath_4.4.0.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-email-validator_2.1.0.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-engineio_3.9.3.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-engineio_4.9.0.bb20
-rw-r--r--meta-python/recipes-devtools/python/python3-et-xmlfile_1.1.0.bb23
-rw-r--r--meta-python/recipes-devtools/python/python3-eth-abi_5.1.0.bb18
-rw-r--r--meta-python/recipes-devtools/python/python3-eth-account_0.12.1.bb20
-rw-r--r--meta-python/recipes-devtools/python/python3-eth-hash_0.6.0.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-eth-keyfile_0.7.0.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-eth-keys_0.5.0.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-eth-rlp_2.1.0.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-eth-typing_4.1.0.bb9
-rw-r--r--meta-python/recipes-devtools/python/python3-eth-utils_3.0.0.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-evdev_0.7.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-evdev_1.6.1.bb22
-rw-r--r--meta-python/recipes-devtools/python/python3-eventlet_0.36.1.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-execnet/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-execnet_2.1.1.bb32
-rw-r--r--meta-python/recipes-devtools/python/python3-executing_2.0.1.bb9
-rw-r--r--meta-python/recipes-devtools/python/python3-expandvars_0.12.0.bb10
-rw-r--r--meta-python/recipes-devtools/python/python3-fann2_1.1.2.bb13
-rw-r--r--meta-python/recipes-devtools/python/python3-fasteners_0.19.bb (renamed from meta-python/recipes-devtools/python/python3-fasteners_0.15.bb)10
-rw-r--r--meta-python/recipes-devtools/python/python3-fastjsonschema/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-fastjsonschema_2.18.0.bb41
-rw-r--r--meta-python/recipes-devtools/python/python3-fastnumbers_5.1.0.bb10
-rw-r--r--meta-python/recipes-devtools/python/python3-feedformatter_0.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-fields_5.0.0.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-file-magic_0.4.1.bb21
-rw-r--r--meta-python/recipes-devtools/python/python3-filelock_3.13.4.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-babel_0.11.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-babel_4.0.0.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-cors_4.0.0.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-httpauth_4.8.0.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-jsonpify_1.5.0.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-jwt-extended_4.6.0.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-jwt_0.3.2.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-login_0.4.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-login_0.6.3.bb (renamed from meta-python/recipes-devtools/python/python-flask-login.inc)7
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-mail_0.9.1.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-marshmallow_1.2.1.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-migrate_2.2.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-migrate_4.0.7.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-nav_0.6.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-pymongo_2.3.0.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-restful_0.3.10.bb (renamed from meta-python/recipes-devtools/python/python-flask-restful.inc)7
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-restful_0.3.6.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-restx_1.3.0.bb13
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-script_2.0.6.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-socketio_3.3.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-socketio_5.3.6.bb (renamed from meta-python/recipes-devtools/python/python-flask-socketio.inc)11
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-sqlalchemy_2.3.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-sqlalchemy_3.1.1.bb13
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-uploads_0.2.1.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-user_0.6.19.bb24
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-versioned_0.9.4-20101221.bb9
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-wtf_0.14.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-flask-wtf_1.2.1.bb18
-rw-r--r--meta-python/recipes-devtools/python/python3-flask_1.0.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-flask_3.0.2.bb25
-rw-r--r--meta-python/recipes-devtools/python/python3-flexcache/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-flexcache_0.3.bb31
-rw-r--r--meta-python/recipes-devtools/python/python3-flexparser/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-flexparser_0.3.bb31
-rw-r--r--meta-python/recipes-devtools/python/python3-freezegun/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-freezegun_1.4.0.bb29
-rw-r--r--meta-python/recipes-devtools/python/python3-frozenlist_1.4.1.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-future_0.16.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-future_0.18.3.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-gast_0.5.4.bb (renamed from meta-python/recipes-devtools/python/python3-gast_0.2.2.bb)7
-rw-r--r--meta-python/recipes-devtools/python/python3-gcovr_7.2.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-geojson/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-geojson_3.1.0.bb26
-rw-r--r--meta-python/recipes-devtools/python/python3-geomet_1.1.0.bb24
-rw-r--r--meta-python/recipes-devtools/python/python3-gevent/0001-_setuputils.py-Do-not-add-sys_inc_dir.patch38
-rw-r--r--meta-python/recipes-devtools/python/python3-gevent_1.4.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-gevent_24.2.1.bb37
-rw-r--r--meta-python/recipes-devtools/python/python3-git-pw_2.6.0.bb20
-rw-r--r--meta-python/recipes-devtools/python/python3-gmpy2/0001-src-fix-python-3.12-builds.patch263
-rw-r--r--meta-python/recipes-devtools/python/python3-gmpy2_2.1.5.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-gmqtt_0.6.14.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-gnupg_0.5.2.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-google-api-core_2.18.0.bb25
-rw-r--r--meta-python/recipes-devtools/python/python3-google-api-python-client_1.7.11.bb9
-rw-r--r--meta-python/recipes-devtools/python/python3-google-api-python-client_2.125.0.bb20
-rw-r--r--meta-python/recipes-devtools/python/python3-google-auth-oauthlib/run-ptest4
-rw-r--r--meta-python/recipes-devtools/python/python3-google-auth-oauthlib_1.2.0.bb31
-rw-r--r--meta-python/recipes-devtools/python/python3-google-auth/run-ptest4
-rw-r--r--meta-python/recipes-devtools/python/python3-google-auth_2.29.0.bb41
-rw-r--r--meta-python/recipes-devtools/python/python3-googleapis-common-protos_1.63.0.bb13
-rw-r--r--meta-python/recipes-devtools/python/python3-gpiod/run-ptest15
-rw-r--r--meta-python/recipes-devtools/python/python3-gpiod_2.1.3.bb46
-rw-r--r--meta-python/recipes-devtools/python/python3-gpsd-py3_0.3.0.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-graphviz_0.20.3.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-greenlet_0.4.15.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-greenlet_3.0.3.bb9
-rw-r--r--meta-python/recipes-devtools/python/python3-greenstalk_2.0.2.bb10
-rw-r--r--meta-python/recipes-devtools/python/python3-grpcio-tools/0001-protobuf-Disable-musttail-attribute-on-mips.patch24
-rw-r--r--meta-python/recipes-devtools/python/python3-grpcio-tools/0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch59
-rw-r--r--meta-python/recipes-devtools/python/python3-grpcio-tools_1.14.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-grpcio-tools_1.62.1.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-grpcio/0001-Include-missing-cstdint-header.patch30
-rw-r--r--meta-python/recipes-devtools/python/python3-grpcio/0001-zlib-Include-unistd.h-for-open-close-C-APIs.patch24
-rw-r--r--meta-python/recipes-devtools/python/python3-grpcio/abseil-ppc-fixes.patch98
-rw-r--r--meta-python/recipes-devtools/python/python3-grpcio_1.19.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-grpcio_1.62.1.bb45
-rw-r--r--meta-python/recipes-devtools/python/python3-gunicorn/run-ptest7
-rw-r--r--meta-python/recipes-devtools/python/python3-gunicorn_21.2.0.bb26
-rw-r--r--meta-python/recipes-devtools/python/python3-h11_0.14.0.bb10
-rw-r--r--meta-python/recipes-devtools/python/python3-h5py/0001-Fix-Cython-3-compatibility.patch796
-rw-r--r--meta-python/recipes-devtools/python/python3-h5py/0001-cross-compiling-support.patch46
-rw-r--r--meta-python/recipes-devtools/python/python3-h5py/0001-setup_build.py-avoid-absolute-path.patch29
-rw-r--r--meta-python/recipes-devtools/python/python3-h5py_2.9.0.bb30
-rw-r--r--meta-python/recipes-devtools/python/python3-h5py_3.10.0.bb40
-rw-r--r--meta-python/recipes-devtools/python/python3-haversine_2.8.1.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-hexbytes_1.0.0.bb9
-rw-r--r--meta-python/recipes-devtools/python/python3-html2text/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-html2text_2020.1.16.bb28
-rw-r--r--meta-python/recipes-devtools/python/python3-html5lib_1.0.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-html5lib_1.1.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-httpcore_1.0.3.bb26
-rw-r--r--meta-python/recipes-devtools/python/python3-httplib2_0.22.0.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-httptools/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-httptools_0.6.1.bb22
-rw-r--r--meta-python/recipes-devtools/python/python3-httpx_0.27.0.bb48
-rw-r--r--meta-python/recipes-devtools/python/python3-huey_2.5.0.bb18
-rw-r--r--meta-python/recipes-devtools/python/python3-humanfriendly_10.0.bb24
-rw-r--r--meta-python/recipes-devtools/python/python3-humanfriendly_4.18.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-humanize_0.5.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-humanize_4.9.0.bb22
-rw-r--r--meta-python/recipes-devtools/python/python3-hyperlink_19.0.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-hyperlink_21.0.0.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-icecream_2.1.3.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-icu/0001-Fix-host-contamination-of-include-files.patch41
-rw-r--r--meta-python/recipes-devtools/python/python3-icu_2.12.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-idna-ssl_1.1.0.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-idna_2.8.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-ifaddr_0.2.0.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-imageio_2.34.0.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-imgtool_2.0.0.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-importlib-metadata_0.23.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-incremental_17.5.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-incremental_22.10.0.bb (renamed from meta-python/recipes-devtools/python/python-incremental.inc)13
-rw-r--r--meta-python/recipes-devtools/python/python3-inflate64_1.0.0.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-inflection/run-ptest4
-rw-r--r--meta-python/recipes-devtools/python/python3-inflection_0.3.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-inflection_0.5.1.bb28
-rw-r--r--meta-python/recipes-devtools/python/python3-inotify/new-test-inotify.patch620
-rw-r--r--meta-python/recipes-devtools/python/python3-inotify/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-inotify_git.bb33
-rw-r--r--meta-python/recipes-devtools/python/python3-intelhex_2.3.0.bb10
-rw-r--r--meta-python/recipes-devtools/python/python3-intervals/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-intervals_1.10.0.bb28
-rw-r--r--meta-python/recipes-devtools/python/python3-intervals_1.5.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-invoke_2.2.0.bb18
-rw-r--r--meta-python/recipes-devtools/python/python3-ipaddress_1.0.23.bb (renamed from meta-python/recipes-devtools/python/python-ipaddress_1.0.22.bb)8
-rw-r--r--meta-python/recipes-devtools/python/python3-iperf_0.1.11.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-ipy/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-ipy_1.01.bb33
-rw-r--r--meta-python/recipes-devtools/python/python3-ipython-genutils_0.2.0.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-ipython_8.23.0.bb28
-rw-r--r--meta-python/recipes-devtools/python/python3-iso3166/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-iso3166_2.1.1.bb26
-rw-r--r--meta-python/recipes-devtools/python/python3-iso8601_0.1.12.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-isodate_0.6.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-isort_4.3.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-isort_5.13.2.bb22
-rw-r--r--meta-python/recipes-devtools/python/python3-itsdangerous_0.24.bb6
-rw-r--r--meta-python/recipes-devtools/python/python3-itsdangerous_2.1.2.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-janus_1.0.0.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-javaobj-py3_0.2.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-javaobj-py3_0.4.4.bb (renamed from meta-python/recipes-devtools/python/python-javaobj-py3.inc)12
-rw-r--r--meta-python/recipes-devtools/python/python3-jdatetime_5.0.0.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-jdcal/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-jdcal_1.4.1.bb28
-rw-r--r--meta-python/recipes-devtools/python/python3-jedi_0.19.1.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-jinja2_2.10.3.bb4
-rw-r--r--meta-python/recipes-devtools/python/python3-jmespath_1.0.1.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-joblib_1.4.0.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-jsbeautifier_1.15.1.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-jsmin/7a75d76c2d6bfb917f30ced8f5c0a9a4157f7819.patch82
-rw-r--r--meta-python/recipes-devtools/python/python3-jsmin/run-ptest2
-rw-r--r--meta-python/recipes-devtools/python/python3-jsmin_3.0.1.bb23
-rw-r--r--meta-python/recipes-devtools/python/python3-jsonpatch_1.24.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-jsonpatch_1.33.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-jsonpath-rw_1.4.0.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-jsonpointer_2.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-jsonrpcclient_4.0.3.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-jsonschema_3.1.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-jstyleson/LICENSE8
-rw-r--r--meta-python/recipes-devtools/python/python3-jstyleson_0.0.2.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-kconfiglib_10.42.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-kconfiglib_14.1.0.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-keras-applications_1.0.8.bb (renamed from meta-python/recipes-devtools/python/python3-keras-applications_1.0.6.bb)7
-rw-r--r--meta-python/recipes-devtools/python/python3-keras-preprocessing_1.0.5.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-keras-preprocessing_1.1.2.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-kivy/0001-add-support-for-glesv2.patch51
-rw-r--r--meta-python/recipes-devtools/python/python3-kivy_2.3.0.bb72
-rw-r--r--meta-python/recipes-devtools/python/python3-kiwisolver_1.4.5.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-langtable_0.0.38.bb29
-rw-r--r--meta-python/recipes-devtools/python/python3-langtable_0.0.65.bb23
-rw-r--r--meta-python/recipes-devtools/python/python3-lazy-object-proxy_1.10.0.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-lazy-object-proxy_1.3.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-lazy_1.6.bb8
-rw-r--r--meta-python/recipes-devtools/python/python3-libconf_2.0.1.bb13
-rw-r--r--meta-python/recipes-devtools/python/python3-libevdev_0.11.bb18
-rw-r--r--meta-python/recipes-devtools/python/python3-linux-procfs_0.7.3.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-lockfile_0.12.2.bb20
-rw-r--r--meta-python/recipes-devtools/python/python3-lorem/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-lorem_0.1.1.bb29
-rw-r--r--meta-python/recipes-devtools/python/python3-lrparsing/0001-setup.py-use-setuptools-instead-of-distutils.patch27
-rw-r--r--meta-python/recipes-devtools/python/python3-lrparsing_1.0.16.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-lrparsing_1.0.17.bb (renamed from meta-python/recipes-devtools/python/python-lrparsing.inc)15
-rw-r--r--meta-python/recipes-devtools/python/python3-lru-dict_1.3.0.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-luma-core_2.4.2.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-luma-oled_3.13.0.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-lxml_4.4.1.bb3
-rw-r--r--meta-python/recipes-devtools/python/python3-lz4/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-lz4_4.3.3.bb34
-rw-r--r--meta-python/recipes-devtools/python/python3-m2crypto/0001-setup.py-address-openssl-3.x-build-issue.patch28
-rw-r--r--meta-python/recipes-devtools/python/python3-m2crypto/0001-setup.py-link-in-sysroot-not-in-host-directories.patch (renamed from meta-python/recipes-devtools/python/python-m2crypto/0001-setup.py-link-in-sysroot-not-in-host-directories.patch)14
-rw-r--r--meta-python/recipes-devtools/python/python3-m2crypto/avoid-host-contamination.patch23
-rw-r--r--meta-python/recipes-devtools/python/python3-m2crypto/cross-compile-platform.patch (renamed from meta-python/recipes-devtools/python/python-m2crypto/cross-compile-platform.patch)10
-rw-r--r--meta-python/recipes-devtools/python/python3-m2crypto_0.30.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-m2crypto_0.40.1.bb51
-rw-r--r--meta-python/recipes-devtools/python/python3-markdown_3.0.1.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-markupsafe_1.1.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-marshmallow/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-marshmallow_3.21.1.bb38
-rw-r--r--meta-python/recipes-devtools/python/python3-matplotlib-inline_0.1.6.bb8
-rw-r--r--meta-python/recipes-devtools/python/python3-matplotlib/matplotlib-disable-download.patch75
-rw-r--r--meta-python/recipes-devtools/python/python3-matplotlib_3.1.1.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-matplotlib_3.7.2.bb70
-rw-r--r--meta-python/recipes-devtools/python/python3-mccabe_0.7.0.bb13
-rw-r--r--meta-python/recipes-devtools/python/python3-meld3_1.0.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-meld3_2.0.1.bb (renamed from meta-python/recipes-devtools/python/python-meld3.inc)14
-rw-r--r--meta-python/recipes-devtools/python/python3-mock_5.1.0.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-monotonic_1.6.bb (renamed from meta-python/recipes-devtools/python/python3-monotonic_1.5.bb)10
-rw-r--r--meta-python/recipes-devtools/python/python3-more-itertools_7.2.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-moteus/0001-lib-python-remove-self-import-from-setup.py.patch32
-rw-r--r--meta-python/recipes-devtools/python/python3-moteus_0.3.67.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-mpmath_1.3.0.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-msgpack/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-msgpack_0.6.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-msgpack_1.0.7.bb27
-rw-r--r--meta-python/recipes-devtools/python/python3-msk_0.3.13.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-msk_0.4.0.bb10
-rw-r--r--meta-python/recipes-devtools/python/python3-msm_0.8.8.bb28
-rw-r--r--meta-python/recipes-devtools/python/python3-multidict/run-ptest2
-rw-r--r--meta-python/recipes-devtools/python/python3-multidict_4.5.2.bb9
-rw-r--r--meta-python/recipes-devtools/python/python3-multidict_6.0.5.bb30
-rw-r--r--meta-python/recipes-devtools/python/python3-multivolumefile_0.2.3.bb21
-rw-r--r--meta-python/recipes-devtools/python/python3-mypy-extensions_1.0.0.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-mypy_1.9.0.bb23
-rw-r--r--meta-python/recipes-devtools/python/python3-natsort_8.4.0.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-ndg-httpsclient_0.5.1.bb6
-rw-r--r--meta-python/recipes-devtools/python/python3-netaddr/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-netaddr_0.7.19.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-netaddr_1.2.1.bb25
-rw-r--r--meta-python/recipes-devtools/python/python3-netifaces/0001-netifaces-initialize-msghdr-in-a-portable-way.patch49
-rw-r--r--meta-python/recipes-devtools/python/python3-netifaces_0.11.0.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-networkx_2.3.bb8
-rw-r--r--meta-python/recipes-devtools/python/python3-networkx_3.1.bb23
-rw-r--r--meta-python/recipes-devtools/python/python3-ninja-syntax_1.7.2.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-ninja/CMakeLists.txt9
-rw-r--r--meta-python/recipes-devtools/python/python3-ninja/no-scikit-build.patch31
-rw-r--r--meta-python/recipes-devtools/python/python3-ninja/run-ninja-from-path.patch44
-rw-r--r--meta-python/recipes-devtools/python/python3-ninja_1.11.1.1.bb27
-rw-r--r--meta-python/recipes-devtools/python/python3-nmap_1.6.0.bb18
-rw-r--r--meta-python/recipes-devtools/python/python3-nocasedict_2.0.1.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-nocaselist_2.0.0.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-ntplib_0.3.3.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-ntplib_0.4.0.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-oauthlib_2.0.6.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-oauthlib_3.2.2.bb22
-rw-r--r--meta-python/recipes-devtools/python/python3-obd_0.7.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-obd_0.7.2.bb9
-rw-r--r--meta-python/recipes-devtools/python/python3-objectpath_0.6.1.bb9
-rw-r--r--meta-python/recipes-devtools/python/python3-olefile_0.47.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-oletools_0.60.1.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-openpyxl_3.1.2.bb23
-rw-r--r--meta-python/recipes-devtools/python/python3-ordered-set/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-ordered-set_3.0.1.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-ordered-set_4.1.0.bb23
-rw-r--r--meta-python/recipes-devtools/python/python3-packaging_19.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-padaos_0.1.10.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-padatious_0.4.7.bb9
-rw-r--r--meta-python/recipes-devtools/python/python3-padatious_0.4.8.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-paho-mqtt_1.4.0.bb3
-rw-r--r--meta-python/recipes-devtools/python/python3-paho-mqtt_2.0.0.bb37
-rw-r--r--meta-python/recipes-devtools/python/python3-pako_0.3.1.bb20
-rw-r--r--meta-python/recipes-devtools/python/python3-pandas_0.23.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pandas_2.0.3.bb38
-rw-r--r--meta-python/recipes-devtools/python/python3-parallax_1.0.6.bb13
-rw-r--r--meta-python/recipes-devtools/python/python3-paramiko_3.4.0.bb20
-rw-r--r--meta-python/recipes-devtools/python/python3-parse-type/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-parse-type_0.4.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-parse-type_0.6.2.bb25
-rw-r--r--meta-python/recipes-devtools/python/python3-parse/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-parse_1.20.1.bb27
-rw-r--r--meta-python/recipes-devtools/python/python3-parse_1.8.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-parsimonious_0.10.0.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-parso_0.8.4.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-passlib_1.7.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-passlib_1.7.4.bb (renamed from meta-python/recipes-devtools/python/python-passlib.inc)20
-rw-r--r--meta-python/recipes-devtools/python/python3-pastedeploy_3.1.0.bb21
-rw-r--r--meta-python/recipes-devtools/python/python3-path/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-path_16.14.0.bb34
-rw-r--r--meta-python/recipes-devtools/python/python3-pathlib2_2.3.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pathtools3_0.2.1.bb10
-rw-r--r--meta-python/recipes-devtools/python/python3-pcodedmp_1.2.6.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-pdm-backend_2.1.8.bb13
-rw-r--r--meta-python/recipes-devtools/python/python3-pdm_2.14.0.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-pefile_2023.2.7.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-pep8_1.7.1.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-periphery_1.1.1.bb4
-rw-r--r--meta-python/recipes-devtools/python/python3-periphery_2.4.1.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-petact_0.1.2.bb6
-rw-r--r--meta-python/recipes-devtools/python/python3-pexpect/0001-FSM.py-change-shebang-from-python-to-python3.patch25
-rw-r--r--meta-python/recipes-devtools/python/python3-pexpect_4.6.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pexpect_4.9.0.bb24
-rw-r--r--meta-python/recipes-devtools/python/python3-pickleshare_0.7.5.bb13
-rw-r--r--meta-python/recipes-devtools/python/python3-pid/0001-remove-requirement-of-nose.patch29
-rw-r--r--meta-python/recipes-devtools/python/python3-pid_3.0.4.bb (renamed from meta-python/recipes-devtools/python/python3-pid_2.2.0.bb)8
-rw-r--r--meta-python/recipes-devtools/python/python3-pika_1.1.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pika_1.3.2.bb26
-rw-r--r--meta-python/recipes-devtools/python/python3-pillow/0001-explicitly-set-compile-options.patch39
-rw-r--r--meta-python/recipes-devtools/python/python3-pillow/0001-support-cross-compiling.patch43
-rw-r--r--meta-python/recipes-devtools/python/python3-pillow/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-pillow_10.3.0.bb72
-rw-r--r--meta-python/recipes-devtools/python/python3-pillow_6.1.bb38
-rw-r--r--meta-python/recipes-devtools/python/python3-pint/run-ptest (renamed from meta-python/recipes-devtools/python/python-cryptography/run-ptest)3
-rw-r--r--meta-python/recipes-devtools/python/python3-pint_0.23.bb41
-rw-r--r--meta-python/recipes-devtools/python/python3-pint_0.8.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pkcs11_0.7.0.bb25
-rw-r--r--meta-python/recipes-devtools/python/python3-pkgconfig_1.5.5.bb (renamed from meta-python/recipes-devtools/python/python3-pkgconfig_1.4.0.bb)10
-rw-r--r--meta-python/recipes-devtools/python/python3-platformdirs/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-platformdirs_4.2.0.bb32
-rw-r--r--meta-python/recipes-devtools/python/python3-pluggy_0.13.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-ply_3.11.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pocketsphinx/0001-cython-Use-cythyon3-in-cmake-check.patch29
-rw-r--r--meta-python/recipes-devtools/python/python3-pocketsphinx_0.1.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pocketsphinx_5.0.3.bb20
-rw-r--r--meta-python/recipes-devtools/python/python3-polyline/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-polyline_2.0.2.bb26
-rw-r--r--meta-python/recipes-devtools/python/python3-portion_2.4.2.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-posix-ipc_1.1.1.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-prctl/0001-support-cross-complication.patch11
-rw-r--r--meta-python/recipes-devtools/python/python3-prctl_1.8.1.bb (renamed from meta-python/recipes-devtools/python/python3-prctl_1.7.bb)10
-rw-r--r--meta-python/recipes-devtools/python/python3-precise-runner/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-precise-runner_0.3.1.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-pretend_1.0.9.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-prettytable/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-prettytable_0.7.2.bb3
-rw-r--r--meta-python/recipes-devtools/python/python3-prettytable_3.10.0.bb45
-rw-r--r--meta-python/recipes-devtools/python/python3-process-tests_3.0.0.bb21
-rw-r--r--meta-python/recipes-devtools/python/python3-progress_1.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-progress_1.6.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-prompt-toolkit_2.0.4.bb7
-rw-r--r--meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.43.bb25
-rw-r--r--meta-python/recipes-devtools/python/python3-protobuf_3.9.2.bb10
-rw-r--r--meta-python/recipes-devtools/python/python3-protobuf_4.25.3.bb38
-rw-r--r--meta-python/recipes-devtools/python/python3-psutil_5.6.3.bb4
-rw-r--r--meta-python/recipes-devtools/python/python3-ptyprocess/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-ptyprocess_0.6.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-ptyprocess_0.7.0.bb44
-rw-r--r--meta-python/recipes-devtools/python/python3-pulsectl_24.4.0.bb (renamed from meta-python/recipes-devtools/python/python3-pulsectl_18.12.5.bb)8
-rw-r--r--meta-python/recipes-devtools/python/python3-pure-eval_0.2.2.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-py-cpuinfo/0001-test_cli.py-disable.patch32
-rw-r--r--meta-python/recipes-devtools/python/python3-py-cpuinfo/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-py-cpuinfo_9.0.0.bb36
-rw-r--r--meta-python/recipes-devtools/python/python3-py-ubjson_0.16.1.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-py7zr_0.20.8.bb29
-rw-r--r--meta-python/recipes-devtools/python/python3-py_1.8.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pyalsaaudio_0.10.0.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-pyalsaaudio_0.8.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pyasn1-modules/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-pyasn1-modules_0.2.7.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pyasn1-modules_0.4.0.bb31
-rw-r--r--meta-python/recipes-devtools/python/python3-pyasn1_0.4.7.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pyatspi_2.46.1.bb (renamed from meta-python/recipes-devtools/python/python3-pyatspi_2.32.1.bb)16
-rw-r--r--meta-python/recipes-devtools/python/python3-pyaudio/0001-Remove-absolute-paths-into-build-machine-system-dirs.patch28
-rw-r--r--meta-python/recipes-devtools/python/python3-pyaudio_0.2.11.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pyaudio_0.2.14.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-pybcj_1.0.2.bb24
-rw-r--r--meta-python/recipes-devtools/python/python3-pybind11-json_0.2.13.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-pybind11/0001-Do-not-strip-binaries.patch54
-rw-r--r--meta-python/recipes-devtools/python/python3-pybind11_2.11.1.bb34
-rw-r--r--meta-python/recipes-devtools/python/python3-pybind11_2.2.3.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pybluez/0001-Use-Py_ssize_t-when-parsing-buffer-length-fix-426-42.patch154
-rw-r--r--meta-python/recipes-devtools/python/python3-pybluez/py-3.11.patch454
-rw-r--r--meta-python/recipes-devtools/python/python3-pybluez_0.22.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pybluez_0.23.bb26
-rw-r--r--meta-python/recipes-devtools/python/python3-pycares_4.4.0.bb22
-rw-r--r--meta-python/recipes-devtools/python/python3-pychromecast/0001-Allow-newer-version-of-wheel-and-setuptools.patch22
-rw-r--r--meta-python/recipes-devtools/python/python3-pychromecast_14.0.1.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-pychromecast_4.0.1.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-pycocotools_2.0.7.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-pycodestyle_2.11.1.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-pycodestyle_2.5.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pycparser_2.19.bb6
-rw-r--r--meta-python/recipes-devtools/python/python3-pycrypto_2.6.1.bb9
-rw-r--r--meta-python/recipes-devtools/python/python3-pycryptodome_3.4.11.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pycurl_7.43.0.3.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pycurl_7.45.2.bb21
-rw-r--r--meta-python/recipes-devtools/python/python3-pydantic-core-crates.inc170
-rw-r--r--meta-python/recipes-devtools/python/python3-pydantic-core/0001-Bumps-pyo3-https-github.com-pyo3-pyo3-from-0.20.2-to.patch126
-rw-r--r--meta-python/recipes-devtools/python/python3-pydantic-core/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-pydantic-core_2.16.3.bb52
-rw-r--r--meta-python/recipes-devtools/python/python3-pydantic/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-pydantic_2.7.0.bb53
-rw-r--r--meta-python/recipes-devtools/python/python3-pydbus/0001-Support-asynchronous-calls-58.patch93
-rw-r--r--meta-python/recipes-devtools/python/python3-pydbus/0001-make-direction-attribute-conforming-to-introspect.dt.patch40
-rw-r--r--meta-python/recipes-devtools/python/python3-pydbus/0002-Support-asynchronous-calls-58.patch206
-rw-r--r--meta-python/recipes-devtools/python/python3-pydbus/0002-Support-transformation-between-D-Bus-errors-and-exce.patch203
-rw-r--r--meta-python/recipes-devtools/python/python3-pydbus/0003-Support-transformation-between-D-Bus-errors-and-exce.patch495
-rw-r--r--meta-python/recipes-devtools/python/python3-pydbus/run-ptest15
-rw-r--r--meta-python/recipes-devtools/python/python3-pydbus_0.6.0.bb30
-rw-r--r--meta-python/recipes-devtools/python/python3-pydicti_1.2.1.bb8
-rw-r--r--meta-python/recipes-devtools/python/python3-pyexpect_1.0.17.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pyexpect_1.0.22.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-pyfanotify/0001-ext-define-FNM_EXTMATCH-if-not-already-defined.patch29
-rw-r--r--meta-python/recipes-devtools/python/python3-pyfanotify_0.2.2.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-pyfirmata_1.0.3.bb3
-rw-r--r--meta-python/recipes-devtools/python/python3-pyfirmata_1.1.0.bb13
-rw-r--r--meta-python/recipes-devtools/python/python3-pyflakes_3.2.0.bb10
-rw-r--r--meta-python/recipes-devtools/python/python3-pyhamcrest_2.1.0.bb18
-rw-r--r--meta-python/recipes-devtools/python/python3-pyiface_0.0.11.bb20
-rw-r--r--meta-python/recipes-devtools/python/python3-pyinotify_0.9.6.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pyjks_17.1.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pyjks_20.0.0.bb (renamed from meta-python/recipes-devtools/python/python-pyjks.inc)18
-rw-r--r--meta-python/recipes-devtools/python/python3-pyjwt_1.6.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pyjwt_2.8.0.bb18
-rw-r--r--meta-python/recipes-devtools/python/python3-pykwalify_1.8.0.bb20
-rw-r--r--meta-python/recipes-devtools/python/python3-pylint/0001-Adjust-test-expectations-for-ptest.patch44
-rw-r--r--meta-python/recipes-devtools/python/python3-pylint/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-pylint_1.8.3.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pylint_3.1.0.bb57
-rw-r--r--meta-python/recipes-devtools/python/python3-pylyrics_1.1.0.bb8
-rw-r--r--meta-python/recipes-devtools/python/python3-pymemcache_4.0.0.bb22
-rw-r--r--meta-python/recipes-devtools/python/python3-pymetno_0.12.0.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-pymisp_2.4.188.bb22
-rw-r--r--meta-python/recipes-devtools/python/python3-pymisp_2.4.93.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pymodbus_3.6.7.bb31
-rw-r--r--meta-python/recipes-devtools/python/python3-pymongo_3.9.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pymongo_4.6.1.bb (renamed from meta-python/recipes-devtools/python/python-pymongo.inc)27
-rw-r--r--meta-python/recipes-devtools/python/python3-pymysql_0.9.3.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pymysql_1.1.0.bb (renamed from meta-python/recipes-devtools/python/python-pymysql.inc)11
-rw-r--r--meta-python/recipes-devtools/python/python3-pynacl_1.5.0.bb38
-rw-r--r--meta-python/recipes-devtools/python/python3-pynetlinux/0001-setup.py-switch-to-setuptools.patch32
-rw-r--r--meta-python/recipes-devtools/python/python3-pynetlinux/0002-Fixed-relative-imports.patch60
-rw-r--r--meta-python/recipes-devtools/python/python3-pynetlinux_1.1.bb23
-rw-r--r--meta-python/recipes-devtools/python/python3-pyopenssl_19.0.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pyparsing_2.4.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pyperclip_1.7.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pyperclip_1.8.2.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-pyperf_1.6.1.bb4
-rw-r--r--meta-python/recipes-devtools/python/python3-pyperf_2.6.3.bb (renamed from meta-python/recipes-devtools/python/python-pyperf.inc)8
-rw-r--r--meta-python/recipes-devtools/python/python3-pypng_0.20220715.0.bb8
-rw-r--r--meta-python/recipes-devtools/python/python3-pyppmd_1.1.0.bb20
-rw-r--r--meta-python/recipes-devtools/python/python3-pyproj_3.6.1.bb23
-rw-r--r--meta-python/recipes-devtools/python/python3-pyproject-api_1.6.1.bb23
-rw-r--r--meta-python/recipes-devtools/python/python3-pyrad/use-poetry-core.patch26
-rw-r--r--meta-python/recipes-devtools/python/python3-pyrad_2.4.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-pyroute2/run-ptest4
-rw-r--r--meta-python/recipes-devtools/python/python3-pyroute2_0.5.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pyroute2_0.7.10.bb41
-rw-r--r--meta-python/recipes-devtools/python/python3-pyrsistent_0.15.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pyruvate-crates.inc216
-rw-r--r--meta-python/recipes-devtools/python/python3-pyruvate/0001-check-for-mips-targets-for-stat.st_dev-definitions.patch47
-rw-r--r--meta-python/recipes-devtools/python/python3-pyruvate/0001-linux.rs-Define-consts-for-rv32-architecture.patch26
-rw-r--r--meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Define-O_LARGEFILE-for-riscv32.patch21
-rw-r--r--meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Define-SOCK_NONBLOCK-with-O_NONBLOCK.patch99
-rw-r--r--meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Define-SOCK_SEQPACKET-in-common-place.patch92
-rw-r--r--meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Move-F_OFD_GETLK-F_OFD_SETLK-and-F_OFD_SETLKW-t.patch140
-rw-r--r--meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-riscv32-Define-F_SETLK-F_SETLKW-and-fix-F_GETLK.patch35
-rw-r--r--meta-python/recipes-devtools/python/python3-pyruvate_1.2.1.bb47
-rw-r--r--meta-python/recipes-devtools/python/python3-pyscaffold_4.5.bb22
-rw-r--r--meta-python/recipes-devtools/python/python3-pyserial-asyncio_0.6.bb10
-rw-r--r--meta-python/recipes-devtools/python/python3-pyserial/run-ptest4
-rw-r--r--meta-python/recipes-devtools/python/python3-pyserial_3.4.bb7
-rw-r--r--meta-python/recipes-devtools/python/python3-pyserial_3.5.bb64
-rw-r--r--meta-python/recipes-devtools/python/python3-pysocks_1.7.1.bb6
-rw-r--r--meta-python/recipes-devtools/python/python3-pysonos_0.0.54.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-pystemd_0.13.2.bb24
-rw-r--r--meta-python/recipes-devtools/python/python3-pystemd_0.6.0.bb13
-rw-r--r--meta-python/recipes-devtools/python/python3-pytest-asyncio_0.10.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pytest-asyncio_0.23.6.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-pytest-benchmark_4.0.0.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-pytest-cache_1.0.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-pytest-cov_5.0.0.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-pytest-forked_1.6.0.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-pytest-helpers-namespace_2016.7.10.bb7
-rw-r--r--meta-python/recipes-devtools/python/python3-pytest-helpers-namespace_2021.12.29.bb (renamed from meta-python/recipes-devtools/python/python-pytest-helpers-namespace.inc)13
-rw-r--r--meta-python/recipes-devtools/python/python3-pytest-html_4.1.1.bb21
-rw-r--r--meta-python/recipes-devtools/python/python3-pytest-json-report_1.5.0.bb18
-rw-r--r--meta-python/recipes-devtools/python/python3-pytest-lazy-fixtures_1.0.7.bb21
-rw-r--r--meta-python/recipes-devtools/python/python3-pytest-localserver/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-pytest-localserver_0.8.1.bb29
-rw-r--r--meta-python/recipes-devtools/python/python3-pytest-metadata_2.0.2.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-pytest-mock/0001-test_pytest_mock-skip-args-introspection-tests.patch38
-rw-r--r--meta-python/recipes-devtools/python/python3-pytest-mock/403.patch92
-rw-r--r--meta-python/recipes-devtools/python/python3-pytest-mock/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-pytest-mock_3.12.0.bb33
-rw-r--r--meta-python/recipes-devtools/python/python3-pytest-runner_5.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pytest-tempdir_2016.8.20.bb7
-rw-r--r--meta-python/recipes-devtools/python/python3-pytest-tempdir_2019.10.12.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-pytest-timeout_2.3.1.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-pytest-xdist_3.5.0.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-pytest_5.2.1.bb4
-rw-r--r--meta-python/recipes-devtools/python/python3-python-vlc_3.0.20123.bb (renamed from meta-python/recipes-devtools/python/python3-python-vlc_3.0.7110.bb)10
-rw-r--r--meta-python/recipes-devtools/python/python3-pythonping_1.1.4.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-pytoml/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-pytoml_0.1.21.bb31
-rwxr-xr-xmeta-python/recipes-devtools/python/python3-pytz_2019.3.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pyu2f_0.1.5.bb20
-rw-r--r--meta-python/recipes-devtools/python/python3-pyudev_0.21.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pyudev_0.24.1.bb22
-rw-r--r--meta-python/recipes-devtools/python/python3-pyunormalize_15.1.0.bb8
-rw-r--r--meta-python/recipes-devtools/python/python3-pyusb_1.0.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pyusb_1.2.1.bb18
-rwxr-xr-xmeta-python/recipes-devtools/python/python3-pyyaml-include/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-pyyaml-include_1.3.2.bb29
-rw-r--r--meta-python/recipes-devtools/python/python3-pyyaml_5.1.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pyzmq/club-rpath-out.patch29
-rw-r--r--meta-python/recipes-devtools/python/python3-pyzmq/run-ptest4
-rw-r--r--meta-python/recipes-devtools/python/python3-pyzmq_17.1.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-pyzmq_25.1.2.bb58
-rw-r--r--meta-python/recipes-devtools/python/python3-pyzstd_0.15.10.bb18
-rw-r--r--meta-python/recipes-devtools/python/python3-qface_2.0.8.bb24
-rw-r--r--meta-python/recipes-devtools/python/python3-qrcode_7.4.2.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-rapidjson/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-rapidjson_1.14.bb40
-rw-r--r--meta-python/recipes-devtools/python/python3-rarfile_4.2.bb23
-rw-r--r--meta-python/recipes-devtools/python/python3-raven_6.10.0.bb20
-rw-r--r--meta-python/recipes-devtools/python/python3-rdflib_4.2.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-redis_2.10.6.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-redis_5.0.1.bb18
-rwxr-xr-xmeta-python/recipes-devtools/python/python3-regex_2019.08.19.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-regex_2023.12.25.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-requests-file/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-requests-file_1.4.3.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-requests-file_1.5.1.bb28
-rw-r--r--meta-python/recipes-devtools/python/python3-requests-ftp_0.3.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-requests-futures_1.0.1.bb (renamed from meta-python/recipes-devtools/python/python3-requests-futures_0.9.5.bb)5
-rw-r--r--meta-python/recipes-devtools/python/python3-requests-oauthlib_0.8.0.bb3
-rw-r--r--meta-python/recipes-devtools/python/python3-requests-oauthlib_2.0.0.bb8
-rw-r--r--meta-python/recipes-devtools/python/python3-requests-toolbelt/090856f4159c40a2927fb88546419f2e1697ad5f.patch1492
-rw-r--r--meta-python/recipes-devtools/python/python3-requests-toolbelt/720240501dca0b4eacc3295665d7ced8719e11d2.patch546
-rw-r--r--meta-python/recipes-devtools/python/python3-requests-toolbelt/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-requests-toolbelt_1.0.0.bb36
-rw-r--r--meta-python/recipes-devtools/python/python3-requests-unixsocket_0.3.0.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-requests_2.22.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-responses_0.25.0.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-rfc3987_1.3.8.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-rlp_4.0.0.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-robotframework-seriallibrary_0.3.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-robotframework-seriallibrary_0.4.3.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-robotframework_3.0.4.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-robotframework_7.0.bb (renamed from meta-python/recipes-devtools/python/python-robotframework.inc)28
-rw-r--r--meta-python/recipes-devtools/python/python3-rsa_4.9.bb39
-rw-r--r--meta-python/recipes-devtools/python/python3-ruamel-yaml_0.16.5.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-scapy_0.25.bb13
-rw-r--r--meta-python/recipes-devtools/python/python3-schedule_1.2.1.bb10
-rw-r--r--meta-python/recipes-devtools/python/python3-schedutils_0.6.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-scikit-build_0.17.6.bb22
-rw-r--r--meta-python/recipes-devtools/python/python3-screeninfo_0.8.1.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-scrypt/0001-py-scrypt-remove-the-hard-coded-include-paths.patch (renamed from meta-python/recipes-devtools/python/python-scrypt/0001-py-scrypt-remove-the-hard-coded-include-paths.patch)16
-rw-r--r--meta-python/recipes-devtools/python/python3-scrypt/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-scrypt_0.8.24.bb28
-rw-r--r--meta-python/recipes-devtools/python/python3-scrypt_0.8.6.bb3
-rw-r--r--meta-python/recipes-devtools/python/python3-sdbus_0.11.1.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-sdnotify/0001-setup.py-switch-to-setuptools.patch31
-rw-r--r--meta-python/recipes-devtools/python/python3-sdnotify_0.3.2.bb21
-rw-r--r--meta-python/recipes-devtools/python/python3-semver/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-semver_2.8.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-semver_3.0.2.bb26
-rw-r--r--meta-python/recipes-devtools/python/python3-sentry-sdk_0.7.14.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-sentry-sdk_1.45.0.bb22
-rw-r--r--meta-python/recipes-devtools/python/python3-serpent/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-serpent_1.25.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-serpent_1.41.bb27
-rw-r--r--meta-python/recipes-devtools/python/python3-service-identity/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-service-identity_21.1.0.bb32
-rw-r--r--meta-python/recipes-devtools/python/python3-setuptools-declarative-requirements_1.3.0.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-setuptools-scm_2.1.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-sh_1.12.14.bb5
-rw-r--r--meta-python/recipes-devtools/python/python3-sh_2.0.6.bb25
-rw-r--r--meta-python/recipes-devtools/python/python3-shellingham_1.5.4.bb10
-rw-r--r--meta-python/recipes-devtools/python/python3-sijax_0.3.2.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-simpleeval/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-simpleeval_0.9.13.bb25
-rw-r--r--meta-python/recipes-devtools/python/python3-simplejson_3.16.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-simplejson_3.19.2.bb (renamed from meta-python/recipes-devtools/python/python-simplejson.inc)19
-rw-r--r--meta-python/recipes-devtools/python/python3-slip-dbus/0001-setup.py-Use-setuptools-instead-of-distutils.patch38
-rw-r--r--meta-python/recipes-devtools/python/python3-slip-dbus/9b939c0b534c1b7958fa0a3c7aedf30bca910431.patch78
-rw-r--r--meta-python/recipes-devtools/python/python3-slip-dbus_0.6.5.bb36
-rw-r--r--meta-python/recipes-devtools/python/python3-smbus/0001-Use-setuptools-as-distutils-is-deprecated.patch25
-rw-r--r--meta-python/recipes-devtools/python/python3-smbus2_0.4.3.bb18
-rw-r--r--meta-python/recipes-devtools/python/python3-smbus_4.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-smbus_4.3.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-smpplib/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-smpplib_2.2.3.bb31
-rw-r--r--meta-python/recipes-devtools/python/python3-snagboot_1.2.bb21
-rw-r--r--meta-python/recipes-devtools/python/python3-snappy_0.6.1.bb13
-rw-r--r--meta-python/recipes-devtools/python/python3-sniffio_1.3.0.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-socketio_4.3.1.bb4
-rw-r--r--meta-python/recipes-devtools/python/python3-socketio_5.11.2.bb28
-rw-r--r--meta-python/recipes-devtools/python/python3-socksio/0001-Unpin-flit-core-dependency.patch21
-rw-r--r--meta-python/recipes-devtools/python/python3-socksio_1.0.0.bb10
-rw-r--r--meta-python/recipes-devtools/python/python3-soupsieve/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-soupsieve_2.5.bb26
-rw-r--r--meta-python/recipes-devtools/python/python3-speaklater_1.3.bb9
-rw-r--r--meta-python/recipes-devtools/python/python3-speedtest-cli_2.1.3.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-spidev_3.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-spidev_3.6.bb (renamed from meta-python/recipes-devtools/python/python-spidev.inc)10
-rw-r--r--meta-python/recipes-devtools/python/python3-sqlalchemy_1.1.17.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-sqlalchemy_2.0.29.bb25
-rw-r--r--meta-python/recipes-devtools/python/python3-sqlparse/0001-sqlparse-change-shebang-to-python3.patch41
-rw-r--r--meta-python/recipes-devtools/python/python3-sqlparse/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-sqlparse_0.4.4.bb29
-rw-r--r--meta-python/recipes-devtools/python/python3-sqlsoup_0.9.1.bb11
-rw-r--r--meta-python/recipes-devtools/python/python3-stack-data_0.6.3.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-stevedore_1.31.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-stevedore_5.1.0.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-stopit/LICENSE21
-rw-r--r--meta-python/recipes-devtools/python/python3-stopit_1.1.2.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-strenum/0001-patch-versioneer-for-python-3.12-compatibility.patch37
-rw-r--r--meta-python/recipes-devtools/python/python3-strenum_0.4.15.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-strict-rfc3339_0.7.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-supervisor_4.0.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-supervisor_4.2.5.bb (renamed from meta-python/recipes-devtools/python/python-supervisor.inc)19
-rw-r--r--meta-python/recipes-devtools/python/python3-sympy_1.12.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-systemd/0001-Provide-implementation-of-strndupa-for-musl.patch (renamed from meta-python/recipes-devtools/python/python-systemd/0001-Provide-implementation-of-strndupa-for-musl.patch)0
-rw-r--r--meta-python/recipes-devtools/python/python3-systemd_234.bb3
-rw-r--r--meta-python/recipes-devtools/python/python3-systemd_235.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-tabulate_0.9.0.bb21
-rw-r--r--meta-python/recipes-devtools/python/python3-telnetlib3_2.0.4.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-term_2.3.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-term_2.5.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-termcolor_1.1.0.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-termcolor_2.4.0.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-test-generator_0.1.2.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-textparser_0.24.0.bb13
-rw-r--r--meta-python/recipes-devtools/python/python3-texttable_1.7.0.bb10
-rw-r--r--meta-python/recipes-devtools/python/python3-tinyrecord_0.1.5.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-tinyrecord_0.2.0.bb (renamed from meta-python/recipes-devtools/python/python-tinyrecord.inc)8
-rw-r--r--meta-python/recipes-devtools/python/python3-toml_0.10.0.bb6
-rw-r--r--meta-python/recipes-devtools/python/python3-tomli-w/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-tomli-w_1.0.0.bb34
-rw-r--r--meta-python/recipes-devtools/python/python3-tomlkit/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-tomlkit_0.12.3.bb32
-rw-r--r--meta-python/recipes-devtools/python/python3-toolz_0.12.1.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-tornado_5.1.bb7
-rw-r--r--meta-python/recipes-devtools/python/python3-tornado_6.4.bb (renamed from meta-python/recipes-devtools/python/python-tornado.inc)34
-rw-r--r--meta-python/recipes-devtools/python/python3-tox_4.14.2.bb34
-rw-r--r--meta-python/recipes-devtools/python/python3-tqdm_4.31.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-tqdm_4.66.2.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-trafaret-config_2.0.2.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-trafaret_2.1.1.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-traitlets/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-traitlets_5.14.3.bb26
-rw-r--r--meta-python/recipes-devtools/python/python3-transitions_0.9.0.bb9
-rw-r--r--meta-python/recipes-devtools/python/python3-trustme/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-trustme_1.1.0.bb34
-rw-r--r--meta-python/recipes-devtools/python/python3-twine_1.13.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-twine_5.0.0.bb18
-rw-r--r--meta-python/recipes-devtools/python/python3-twisted_19.7.0.bb65
-rw-r--r--meta-python/recipes-devtools/python/python3-twisted_22.10.0.bb201
-rw-r--r--meta-python/recipes-devtools/python/python3-twitter_3.7.0.bb3
-rw-r--r--meta-python/recipes-devtools/python/python3-twitter_4.14.0.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-twofish/0002-setup.py-switch-to-setuptools.patch26
-rw-r--r--meta-python/recipes-devtools/python/python3-twofish_0.3.0.bb21
-rw-r--r--meta-python/recipes-devtools/python/python3-txaio_23.1.1.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-txdbus_1.1.2.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-typeguard/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-typeguard_4.2.1.bb39
-rw-r--r--meta-python/recipes-devtools/python/python3-types-psutil_5.9.5.20240316.bb10
-rw-r--r--meta-python/recipes-devtools/python/python3-types-python-dateutil_2.9.0.20240316.bb8
-rw-r--r--meta-python/recipes-devtools/python/python3-types-setuptools_69.0.0.20240125.bb10
-rw-r--r--meta-python/recipes-devtools/python/python3-tzlocal_1.5.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-tzlocal_5.2.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-u-msgpack-python/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-u-msgpack-python_2.8.0.bb27
-rw-r--r--meta-python/recipes-devtools/python/python3-uefi-firmware_1.11.bb21
-rw-r--r--meta-python/recipes-devtools/python/python3-ujson/0001-setup.py-Do-not-strip-debugging-symbols.patch37
-rw-r--r--meta-python/recipes-devtools/python/python3-ujson/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-ujson_1.35.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-ujson_5.9.0.bb35
-rw-r--r--meta-python/recipes-devtools/python/python3-unidiff/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-unidiff_0.5.5.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-unidiff_0.7.5.bb27
-rw-r--r--meta-python/recipes-devtools/python/python3-unoconv_0.9.0.bb23
-rw-r--r--meta-python/recipes-devtools/python/python3-uritemplate/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-uritemplate_4.1.1.bb26
-rw-r--r--meta-python/recipes-devtools/python/python3-urllib3_1.25.6.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-uswid_0.4.7.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-validators/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-validators_0.28.0.bb30
-rw-r--r--meta-python/recipes-devtools/python/python3-vcversioner_2.16.0.0.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-versioneer_0.29.bb18
-rw-r--r--meta-python/recipes-devtools/python/python3-versiontools_1.9.1.bb14
-rw-r--r--meta-python/recipes-devtools/python/python3-virtualenv_20.25.0.bb22
-rw-r--r--meta-python/recipes-devtools/python/python3-visitor_0.1.3.bb8
-rw-r--r--meta-python/recipes-devtools/python/python3-waitress_1.3.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-waitress_3.0.0.bb (renamed from meta-python/recipes-devtools/python/python-waitress.inc)9
-rw-r--r--meta-python/recipes-devtools/python/python3-wand_0.6.13.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-watchdog_4.0.0.bb18
-rw-r--r--meta-python/recipes-devtools/python/python3-watchdogdev_1.0.0.bb9
-rw-r--r--meta-python/recipes-devtools/python/python3-wcwidth_0.1.7.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-web3_6.17.0.bb26
-rw-r--r--meta-python/recipes-devtools/python/python3-webargs_8.4.0.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-webcolors_1.8.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-webencodings_0.5.1.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-websocket-client_0.56.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-websocket-client_1.7.0.bb17
-rw-r--r--meta-python/recipes-devtools/python/python3-websockets_8.0.2.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-werkzeug_0.14.1.bb4
-rw-r--r--meta-python/recipes-devtools/python/python3-werkzeug_3.0.1.bb23
-rw-r--r--meta-python/recipes-devtools/python/python3-wheel_0.32.3.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-whitenoise_6.6.0.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-whoosh/0001-Mark-non-determinstic-test_minimize_dfa-test-as-XFAI.patch29
-rw-r--r--meta-python/recipes-devtools/python/python3-whoosh/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-whoosh_2.7.4.bb45
-rw-r--r--meta-python/recipes-devtools/python/python3-wpa-supplicant/0001-cli-drop-the-second-argument-from-click.argument-dec.patch127
-rw-r--r--meta-python/recipes-devtools/python/python3-wpa-supplicant_0.2.bb18
-rw-r--r--meta-python/recipes-devtools/python/python3-wrapt/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-wrapt_1.11.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-wrapt_1.16.0.bb30
-rw-r--r--meta-python/recipes-devtools/python/python3-wsproto/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-wsproto_1.2.0.bb27
-rw-r--r--meta-python/recipes-devtools/python/python3-wtforms_2.2.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-wtforms_3.1.2.bb24
-rw-r--r--meta-python/recipes-devtools/python/python3-xlrd/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-xlrd_1.1.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-xlrd_2.0.1.bb39
-rw-r--r--meta-python/recipes-devtools/python/python3-xlsxwriter_3.1.9.bb21
-rw-r--r--meta-python/recipes-devtools/python/python3-xmlrunner_1.7.7.bb9
-rw-r--r--meta-python/recipes-devtools/python/python3-xmlschema_3.0.1.bb20
-rw-r--r--meta-python/recipes-devtools/python/python3-xmodem_0.4.7.bb19
-rw-r--r--meta-python/recipes-devtools/python/python3-xstatic-font-awesome_4.7.0.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-xstatic-font-awesome_6.2.1.1.bb16
-rw-r--r--meta-python/recipes-devtools/python/python3-xstatic_1.0.1.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-xstatic_1.0.3.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-xxhash/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-xxhash_1.4.2.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-xxhash_3.4.1.bb24
-rw-r--r--meta-python/recipes-devtools/python/python3-yamlloader_1.3.2.bb12
-rw-r--r--meta-python/recipes-devtools/python/python3-yappi/0001-test_functionality-convert-line-endings-to-Unix.patch3845
-rw-r--r--meta-python/recipes-devtools/python/python3-yappi/0002-Fix-import-of-tests.utils-to-enable-pytest.patch101
-rw-r--r--meta-python/recipes-devtools/python/python3-yappi/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-yappi_0.98.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-yappi_1.6.0.bb37
-rw-r--r--meta-python/recipes-devtools/python/python3-yarl/run-ptest3
-rw-r--r--meta-python/recipes-devtools/python/python3-yarl_1.3.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-yarl_1.9.4.bb33
-rw-r--r--meta-python/recipes-devtools/python/python3-zeroconf_0.132.0.bb15
-rw-r--r--meta-python/recipes-devtools/python/python3-zipp_0.6.0.bb2
-rw-r--r--meta-python/recipes-devtools/python/python3-zopeevent_5.0.bb10
-rw-r--r--meta-python/recipes-devtools/python/python3-zopeinterface_4.6.0.bb4
-rw-r--r--meta-python/recipes-devtools/python/python3-zopeinterface_6.3.bb23
-rw-r--r--meta-python/recipes-devtools/python/tftpy_0.8.2.bb13
-rw-r--r--meta-python/recipes-devtools/python3-attrdict3/python3-attrdict3_2.0.2.bb14
-rw-r--r--meta-python/recipes-devtools/python3-gspread/python3-gspread_6.1.0.bb14
-rw-r--r--meta-python/recipes-devtools/python3-piccata/python3-piccata_2.0.3.bb13
-rw-r--r--meta-python/recipes-devtools/python3-reedsolo/python3-reedsolo_2.0.13.bb10
-rw-r--r--meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/0001-sip-Conditionally-use-GetAssertStackTrace-under-USE_.patch32
-rw-r--r--meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/add-back-option-build-base.patch22
-rw-r--r--meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/not-overwrite-cflags-cxxflags.patch28
-rw-r--r--meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/wxgtk-fixup-build-scripts.patch53
-rw-r--r--meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4_4.2.1.bb38
-rw-r--r--meta-python/recipes-devtools/python3_oauth2client/python3-oauth2client_4.1.3.bb19
-rw-r--r--meta-python/recipes-extended/python-blivet/python3-blivet/0001-comment-out-selinux.patch70
-rw-r--r--meta-python/recipes-extended/python-blivet/python3-blivet/0002-run_program-support-timeout.patch13
-rw-r--r--meta-python/recipes-extended/python-blivet/python3-blivet/0003-support-infinit-timeout.patch17
-rw-r--r--meta-python/recipes-extended/python-blivet/python3-blivet/0004-fix-new.roots-object-is-not-iterable.patch28
-rw-r--r--meta-python/recipes-extended/python-blivet/python3-blivet/0005-fix-incorrect-timeout-while-system-time-changed.patch9
-rw-r--r--meta-python/recipes-extended/python-blivet/python3-blivet/0006-tweak-btrfs-packages.patch15
-rw-r--r--meta-python/recipes-extended/python-blivet/python3-blivet/0007-invoking-mount-with-infinite-timeout.patch9
-rw-r--r--meta-python/recipes-extended/python-blivet/python3-blivet/0008-use-oe-variable-to-replace-hardcoded-dir.patch17
-rw-r--r--meta-python/recipes-extended/python-blivet/python3-blivet/0010-invoking-mkfs-with-infinite-timeout.patch15
-rw-r--r--meta-python/recipes-extended/python-blivet/python3-blivet/0011-invoking-dd-with-infinite-timeout.patch11
-rw-r--r--meta-python/recipes-extended/python-blivet/python3-blivet_3.9.2.bb (renamed from meta-python/recipes-extended/python-blivet/python3-blivet_3.1.4.bb)30
-rw-r--r--meta-python/recipes-extended/python-blivet/python3-blivetgui/0001-Fix-return-type-of-BlivetUtils.get_disks-1658893.patch32
-rw-r--r--meta-python/recipes-extended/python-blivet/python3-blivetgui_2.1.10.bb28
-rw-r--r--meta-python/recipes-extended/python-blivet/python3-blivetgui_2.5.0.bb21
-rw-r--r--meta-python/recipes-extended/python-cson/python3-cson/0001-setup.py-Do-not-poke-at-git-describe-to-find-version.patch40
-rw-r--r--meta-python/recipes-extended/python-cson/python3-cson_git.bb (renamed from meta-python/recipes-extended/python-cson/python-cson_git.bb)15
-rw-r--r--meta-python/recipes-extended/python-meh/python3-meh_0.51.bb (renamed from meta-python/recipes-extended/python-meh/python3-meh_0.47.bb)15
-rw-r--r--meta-python/recipes-extended/python-pyephem/python-pyephem_3.7.6.0.bb17
-rw-r--r--meta-python/recipes-extended/python-pyephem/python3-pyephem_4.1.5.bb16
-rw-r--r--meta-python/recipes-extended/python-pykickstart/files/0001-support-authentication-for-kickstart.patch46
-rw-r--r--meta-python/recipes-extended/python-pykickstart/files/0002-pykickstart-parser.py-add-lock-for-readKickstart-and.patch19
-rw-r--r--meta-python/recipes-extended/python-pykickstart/files/0003-comment-out-sections-shutdown-and-environment-in-gen.patch12
-rw-r--r--meta-python/recipes-extended/python-pykickstart/files/0004-load.py-retry-to-invoke-request-with-timeout.patch25
-rw-r--r--meta-python/recipes-extended/python-pykickstart/python3-pykickstart_3.48.bb (renamed from meta-python/recipes-extended/python-pykickstart/python3-pykickstart_3.20.bb)8
-rw-r--r--meta-python/recipes-extended/python-pyparted/python-pyparted_3.11.2.bb8
-rw-r--r--meta-python/recipes-extended/python-pyparted/python3-pyparted_3.11.2.bb8
-rw-r--r--meta-python/recipes-extended/python-pyparted/python3-pyparted_3.12.0.bb (renamed from meta-python/recipes-extended/python-pyparted/python-pyparted.inc)21
-rw-r--r--meta-python/recipes-extended/python-rich/python3-rich_13.7.0.bb15
-rw-r--r--meta-python/recipes-extended/python3-portalocker/python3-portalocker/run-ptest3
-rw-r--r--meta-python/recipes-extended/python3-portalocker/python3-portalocker_2.8.2.bb36
-rw-r--r--meta-python/recipes-extended/python3-pydot/python3-pydot_2.0.0.bb11
-rw-r--r--meta-python/recipes-extended/pywbem/python-pywbem_0.11.0.bb20
-rw-r--r--meta-python/recipes-extended/pywbem/python3-pywbem_0.11.0.bb9
-rw-r--r--meta-python/recipes-extended/pywbem/python3-pywbem_1.6.3.bb (renamed from meta-python/recipes-extended/pywbem/python-pywbem.inc)55
-rw-r--r--meta-python/recipes-extended/pywbemtools/python3-pywbemtools_1.2.1.bb32
-rw-r--r--meta-python/recipes-extended/send2trash/python3-send2trash_1.8.3.bb14
-rw-r--r--meta-python/recipes-extended/tuna/tuna_0.19.bb24
-rw-r--r--meta-python/recipes-networking/python/python3-ldap_3.4.4.bb30
1537 files changed, 27640 insertions, 8981 deletions
diff --git a/meta-python/README b/meta-python/README.md
index 705b035d9e..36c193957c 100644
--- a/meta-python/README
+++ b/meta-python/README.md
@@ -14,17 +14,10 @@ The meta-python layer depends on:
URI: git://git.openembedded.org/openembedded-core
layers: meta
branch: master
- revision: HEAD
URI: git://git.openembedded.org/meta-openembedded
layers: meta-oe
branch: master
- revision: HEAD
-
-Please follow the recommended setup procedures of your OE distribution.
-For Angstrom that is:
- http://www.angstrom-distribution.org/building-angstrom,
-other distros should have similar online resources.
Contributing
-------------------------
@@ -37,13 +30,12 @@ before posting.
Send pull requests to openembedded-devel@lists.openembedded.org with
'[meta-python]' in the subject.
-When sending single patches, please use something like:
-'git send-email -M -1 --to=openembedded-devel@lists.openembedded.org --subject-prefix=meta-python][PATCH'
+When sending single patches, please use something like:
+git send-email -M -1 --to=openembedded-devel@lists.openembedded.org --subject-prefix='meta-python][PATCH'
Maintenance
-------------------------
-Layer Maintainers:
+Layer maintainers:
Tim "moto-timo" Orling <TicoTimo@gmail.com>
Derek Straka <derek@asterius.io>
-
diff --git a/meta-python/classes/distutils-common-base.bbclass b/meta-python/classes/distutils-common-base.bbclass
new file mode 100644
index 0000000000..59c750a3cf
--- /dev/null
+++ b/meta-python/classes/distutils-common-base.bbclass
@@ -0,0 +1,28 @@
+export STAGING_INCDIR
+export STAGING_LIBDIR
+
+# LDSHARED is the ld *command* used to create shared library
+export LDSHARED = "${CCLD} -shared"
+# LDXXSHARED is the ld *command* used to create shared library of C++
+# objects
+export LDCXXSHARED = "${CXX} -shared"
+# CCSHARED are the C *flags* used to create objects to go into a shared
+# library (module)
+export CCSHARED = "-fPIC -DPIC"
+# LINKFORSHARED are the flags passed to the $(CC) command that links
+# the python executable
+export LINKFORSHARED = "${SECURITY_CFLAGS} -Xlinker -export-dynamic"
+
+FILES:${PN} += "${libdir}/* ${libdir}/${PYTHON_DIR}/*"
+
+FILES:${PN}-staticdev += "\
+ ${PYTHON_SITEPACKAGES_DIR}/*.a \
+"
+FILES:${PN}-dev += "\
+ ${datadir}/pkgconfig \
+ ${libdir}/pkgconfig \
+ ${PYTHON_SITEPACKAGES_DIR}/*.la \
+"
+python __anonymous() {
+ bb.warn("distutils-common-base.bbclass is deprecated, please use setuptools3-base.bbclass instead")
+}
diff --git a/meta-python/classes/distutils3-base.bbclass b/meta-python/classes/distutils3-base.bbclass
new file mode 100644
index 0000000000..d36b4c4a3e
--- /dev/null
+++ b/meta-python/classes/distutils3-base.bbclass
@@ -0,0 +1,9 @@
+DEPENDS:append:class-target = " python3-native python3"
+DEPENDS:append:class-nativesdk = " python3-native python3"
+RDEPENDS:${PN} += "${@['', 'python3-core']['${CLASSOVERRIDE}' == 'class-target']}"
+
+inherit distutils-common-base python3native python3targetconfig
+
+python __anonymous() {
+ bb.warn("distutils3-base.bbclass is deprecated, please use setuptools3-base.bbclass instead")
+}
diff --git a/meta-python/classes/distutils3.bbclass b/meta-python/classes/distutils3.bbclass
new file mode 100644
index 0000000000..909415efa0
--- /dev/null
+++ b/meta-python/classes/distutils3.bbclass
@@ -0,0 +1,71 @@
+inherit distutils3-base
+
+B = "${WORKDIR}/build"
+distutils_do_configure[cleandirs] = "${B}"
+
+DISTUTILS_BUILD_ARGS ?= ""
+DISTUTILS_INSTALL_ARGS ?= "--root=${D} \
+ --prefix=${prefix} \
+ --install-lib=${PYTHON_SITEPACKAGES_DIR} \
+ --install-data=${datadir}"
+
+DISTUTILS_PYTHON = "python3"
+DISTUTILS_PYTHON:class-native = "nativepython3"
+
+DISTUTILS_SETUP_PATH ?= "${S}"
+
+python __anonymous() {
+ bb.warn("distutils3.bbclass is deprecated, please use setuptools3.bbclass instead")
+}
+
+distutils3_do_configure() {
+ :
+}
+
+distutils3_do_compile() {
+ cd ${DISTUTILS_SETUP_PATH}
+ NO_FETCH_BUILD=1 \
+ STAGING_INCDIR=${STAGING_INCDIR} \
+ STAGING_LIBDIR=${STAGING_LIBDIR} \
+ ${STAGING_BINDIR_NATIVE}/python3-native/python3 setup.py \
+ build --build-base=${B} ${DISTUTILS_BUILD_ARGS} || \
+ bbfatal_log "'python3 setup.py build ${DISTUTILS_BUILD_ARGS}' execution failed."
+}
+distutils3_do_compile[vardepsexclude] = "MACHINE"
+
+distutils3_do_install() {
+ cd ${DISTUTILS_SETUP_PATH}
+ install -d ${D}${PYTHON_SITEPACKAGES_DIR}
+ STAGING_INCDIR=${STAGING_INCDIR} \
+ STAGING_LIBDIR=${STAGING_LIBDIR} \
+ PYTHONPATH=${D}${PYTHON_SITEPACKAGES_DIR} \
+ ${STAGING_BINDIR_NATIVE}/python3-native/python3 setup.py \
+ build --build-base=${B} install --skip-build ${DISTUTILS_INSTALL_ARGS} || \
+ bbfatal_log "'python3 setup.py install ${DISTUTILS_INSTALL_ARGS}' execution failed."
+
+ # support filenames with *spaces*
+ find ${D} -name "*.py" -exec grep -q ${D} {} \; \
+ -exec sed -i -e s:${D}::g {} \;
+
+ for i in ${D}${bindir}/* ${D}${sbindir}/*; do
+ if [ -f "$i" ]; then
+ sed -i -e s:${PYTHON}:${USRBINPATH}/env\ ${DISTUTILS_PYTHON}:g $i
+ sed -i -e s:${STAGING_BINDIR_NATIVE}:${bindir}:g $i
+ fi
+ done
+
+ rm -f ${D}${PYTHON_SITEPACKAGES_DIR}/easy-install.pth
+
+ #
+ # FIXME: Bandaid against wrong datadir computation
+ #
+ if [ -e ${D}${datadir}/share ]; then
+ mv -f ${D}${datadir}/share/* ${D}${datadir}/
+ rmdir ${D}${datadir}/share
+ fi
+}
+distutils3_do_install[vardepsexclude] = "MACHINE"
+
+EXPORT_FUNCTIONS do_configure do_compile do_install
+
+export LDSHARED="${CCLD} -shared"
diff --git a/meta-python/conf/include/ptest-packagelists-meta-python.inc b/meta-python/conf/include/ptest-packagelists-meta-python.inc
new file mode 100644
index 0000000000..e07aaf3c0c
--- /dev/null
+++ b/meta-python/conf/include/ptest-packagelists-meta-python.inc
@@ -0,0 +1,108 @@
+#
+# Lists of the ptest in meta-python, sorted into two sets by the time they take
+# Please keep these sorted in alphabetical order
+#
+# A first pass at getting all meta-python recipes which inherit ptest
+# meta_python_ptest_recipes=$(bitbake-layers show-recipes --recipes-only --layer meta-python --inherits ptest --bare | tr '\n' ' ' | pcregrep -o1 '^NOTE:.+===(.+)$')
+#
+# ptests which take less than ~30s each
+PTESTS_FAST_META_PYTHON = "\
+ python3-a2wsgi \
+ python3-appdirs \
+ python3-ansicolors \
+ python3-asgiref \
+ python3-aspectlib \
+ python3-bleak \
+ python3-blinker \
+ python3-cachetools \
+ python3-cbor2 \
+ python3-click \
+ python3-dominate \
+ python3-execnet \
+ python3-flexcache \
+ python3-flexparser \
+ python3-freezegun \
+ python3-geojson \
+ python3-google-auth-oauthlib \
+ python3-gpiod \
+ python3-gunicorn \
+ python3-html2text \
+ python3-httptools \
+ python3-inflection \
+ python3-inotify \
+ python3-intervals \
+ python3-ipy \
+ python3-iso3166 \
+ python3-jdcal \
+ python3-jsmin \
+ python3-msgpack \
+ python3-multidict \
+ python3-netaddr \
+ python3-ordered-set \
+ python3-parse \
+ python3-parse-type \
+ python3-platformdirs \
+ python3-polyline \
+ python3-portalocker \
+ python3-precise-runner \
+ python3-prettytable \
+ python3-pydantic \
+ python3-pydantic-core \
+ python3-pylint \
+ python3-ptyprocess \
+ python3-py-cpuinfo \
+ python3-pyasn1-modules \
+ python3-pyroute2 \
+ python3-pyserial \
+ python3-pytest-mock \
+ python3-pytoml \
+ python3-pyyaml-include \
+ python3-pydbus \
+ python3-rapidjson \
+ python3-requests-file \
+ python3-requests-toolbelt \
+ python3-semver \
+ python3-serpent \
+ python3-service-identity \
+ python3-simpleeval \
+ python3-smpplib \
+ python3-soupsieve \
+ python3-sqlparse \
+ python3-tomli-w \
+ python3-tomlkit \
+ python3-trustme \
+ python3-typeguard \
+ python3-ujson \
+ python3-u-msgpack-python \
+ python3-unidiff \
+ python3-uritemplate \
+ python3-validators \
+ python3-wrapt \
+ python3-wsproto \
+ python3-xlrd \
+ python3-xmltodict \
+ python3-xxhash \
+ python3-yarl \
+"
+
+PTESTS_SLOW_META_PYTHON = "\
+ python3-arrow \
+ python3-ecdsa \
+ python3-google-auth \
+ python3-lz4 \
+ python3-marshmallow \
+ python3-pillow \
+ python3-pytest-localserver \
+ python3-scrypt \
+ python3-traitlets \
+ python3-yappi \
+"
+
+PTESTS_PROBLEMS_META_PYTHON ="\
+ python3-betamax \
+ python3-dnspython \
+ python3-fastjsonschema \
+ python3-pint \
+ python3-pyzmq \
+ python3-whoosh \
+"
diff --git a/meta-python/conf/layer.conf b/meta-python/conf/layer.conf
index db65943f56..f48b28b958 100644
--- a/meta-python/conf/layer.conf
+++ b/meta-python/conf/layer.conf
@@ -6,14 +6,14 @@ BBFILES += "${LAYERDIR}/recipes*/*/*.bb ${LAYERDIR}/recipes*/*/*.bbappend"
BBFILE_COLLECTIONS += "meta-python"
BBFILE_PATTERN_meta-python := "^${LAYERDIR}/"
-BBFILE_PRIORITY_meta-python = "7"
+BBFILE_PRIORITY_meta-python = "5"
# This should only be incremented on significant changes that will
# cause compatibility issues with other layers
LAYERVERSION_meta-python = "1"
-LAYERDEPENDS_meta-python = "core openembedded-layer"
+LAYERDEPENDS_meta-python = "core (>= 12) openembedded-layer"
-LAYERSERIES_COMPAT_meta-python = "thud warrior zeus"
+LAYERSERIES_COMPAT_meta-python = "scarthgap"
LICENSE_PATH += "${LAYERDIR}/licenses"
diff --git a/meta-python/licenses/CRC32C-ADLER b/meta-python/licenses/CRC32C-ADLER
new file mode 100644
index 0000000000..f1f0e94ee0
--- /dev/null
+++ b/meta-python/licenses/CRC32C-ADLER
@@ -0,0 +1,15 @@
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the author be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
diff --git a/meta-python/licenses/WTFPL b/meta-python/licenses/WTFPL
new file mode 100644
index 0000000000..5a8e332545
--- /dev/null
+++ b/meta-python/licenses/WTFPL
@@ -0,0 +1,14 @@
+ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ Version 2, December 2004
+
+ Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
+
+ Everyone is permitted to copy and distribute verbatim or modified
+ copies of this license document, and changing it is allowed as long
+ as the name is changed.
+
+ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. You just DO WHAT THE FUCK YOU WANT TO.
+
diff --git a/meta-python/recipes-connectivity/gateone/gateone/80oe.conf.in b/meta-python/recipes-connectivity/gateone/gateone/80oe.conf.in
deleted file mode 100644
index 4503da4221..0000000000
--- a/meta-python/recipes-connectivity/gateone/gateone/80oe.conf.in
+++ /dev/null
@@ -1,24 +0,0 @@
-// Some custom Gate One settings for OpenEmbedded
-{
- "*": {
- "gateone": { // These settings apply to all of Gate One
- "log_file_prefix": "@localstate@/log/gateone.log", // default would be /var/log/gateone/gateone.log
- "log_file_max_size": 5242880, // 5 megabyte logs for OE by default (default would normally be 100Mb)
- "log_file_num_backups": 2, // Default is normally 10
- "origins": ["*"], // Every device has a unique origin
- "logging": "info",
- "pid_file": "/run/gateone.pid",
- "session_dir": "/tmp/gateone",
- "user_dir": "@localstate@/lib/gateone/users"
- },
- "terminal": {
- // Disabling session logging for embedded devices is a good idea (limited/slow storage)
- "session_logging": false,
- "syslog_session_logging": false
-// "commands": {
-// // For some reason this doesn't work (never asks for the password)
-// "login": "setsid /bin/login" // Normally this would emulate logging into the host console
-// }
- }
- }
-}
diff --git a/meta-python/recipes-connectivity/gateone/gateone/gateone-avahi.service b/meta-python/recipes-connectivity/gateone/gateone/gateone-avahi.service
deleted file mode 100644
index 0f613d18e8..0000000000
--- a/meta-python/recipes-connectivity/gateone/gateone/gateone-avahi.service
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
-<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
-
-<service-group>
- <name replace-wildcards="yes">GateOne on %h</name>
- <service>
- <type>_https._tcp</type>
- <port>443</port>
- </service>
-</service-group>
diff --git a/meta-python/recipes-connectivity/gateone/gateone/gateone-init.in b/meta-python/recipes-connectivity/gateone/gateone/gateone-init.in
deleted file mode 100644
index 86d655c94d..0000000000
--- a/meta-python/recipes-connectivity/gateone/gateone/gateone-init.in
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/bin/sh -e
-### BEGIN INIT INFO
-# Provides: gateone
-# Required-Start: networking
-# Default-Start: 2 3 4 5
-# Default-Stop: 0 1 6
-# Short-Description: Gateone HTML5 ssh client
-# Description: Gateone HTML5 terminal emulator and SSH client.
-### END INIT INFO
-
-. /etc/init.d/functions
-
-NAME=gateone
-DAEMON=@bindir@/gateone
-PIDFILE=/run/gateone.pid
-WORKDIR=@localstate@/lib/gateone
-
-do_start() {
- cd $WORKDIR
- @bindir@/python $DAEMON > /dev/null 2>&1 &
- cd $OLDPWD
-}
-
-do_stop() {
- kill -TERM `cat $PIDFILE`
-}
-
-case "$1" in
- start)
- echo "Starting gateone"
- do_start
- ;;
- stop)
- echo "Stopping gateone"
- do_stop
- ;;
- restart|force-reload)
- echo "Restart gateone"
- do_stop
- sleep 1
- do_start
- ;;
- *)
- echo "Usage: $0 {start|stop|restart|force-reload}" >&2
- exit 1
- ;;
-esac
diff --git a/meta-python/recipes-connectivity/gateone/gateone/gateone.service.in b/meta-python/recipes-connectivity/gateone/gateone/gateone.service.in
deleted file mode 100644
index 44667275a2..0000000000
--- a/meta-python/recipes-connectivity/gateone/gateone/gateone.service.in
+++ /dev/null
@@ -1,10 +0,0 @@
-[Unit]
-Description=GateOne daemon
-ConditionPathExists=|@localstate@/lib/gateone
-
-[Service]
-WorkingDirectory=@localstate@/lib/gateone
-ExecStart=@bindir@/python @bindir@/gateone
-
-[Install]
-WantedBy=multi-user.target
diff --git a/meta-python/recipes-connectivity/gateone/gateone_git.bb b/meta-python/recipes-connectivity/gateone/gateone_git.bb
deleted file mode 100644
index 5d2ca00ef5..0000000000
--- a/meta-python/recipes-connectivity/gateone/gateone_git.bb
+++ /dev/null
@@ -1,85 +0,0 @@
-SUMMARY = "HTML5 (plugin-free) web-based terminal emulator and SSH client"
-LICENSE = "AGPL-3.0"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=834cbc6995db88433db17cdf8953a428"
-HOMEPAGE = "http://liftoffsoftware.com/Products/GateOne"
-
-PV = "1.2+git${SRCPV}"
-SRCREV = "f7a9be46cb90f57459ebd363d24702de0e651034"
-SRC_URI = "git://github.com/liftoff/GateOne.git;branch=master \
- file://gateone-avahi.service \
- file://80oe.conf.in \
- file://gateone.service.in \
- file://gateone-init.in \
-"
-
-S = "${WORKDIR}/git"
-
-inherit setuptools python-dir systemd update-rc.d
-
-DISTUTILS_INSTALL_ARGS += " \
- --install-data=${PYTHON_SITEPACKAGES_DIR} \
- --install-scripts=${bindir} \
- --skip_init_scripts"
-
-do_install_append() {
-
- # fix up hardcoded paths
- for file in gateone.service gateone-init 80oe.conf; do
- sed -e s:@bindir@:${bindir}:g \
- -e s:@localstate@:${localstatedir}:g \
- < ${WORKDIR}/$file.in \
- > ${WORKDIR}/$file
- done
-
- install -d ${D}${systemd_unitdir}/system
- install -m 0644 ${WORKDIR}/gateone.service ${D}${systemd_unitdir}/system
-
- install -d ${D}${sysconfdir}/init.d
- install -m 0755 ${WORKDIR}/gateone-init ${D}${sysconfdir}/init.d/gateone
-
- install -m 0755 -d ${D}${sysconfdir}/avahi/services/
- install -m 0644 ${WORKDIR}/gateone-avahi.service ${D}${sysconfdir}/avahi/services/
-
- install -m 0755 -d ${D}${sysconfdir}/gateone/conf.d/
- install -m 0644 ${WORKDIR}/80oe.conf ${D}${sysconfdir}/gateone/conf.d/80oe.conf
-
- install -d ${D}${localstatedir}/lib/gateone
-}
-
-FILES_${PN} = "${localstatedir}/lib ${bindir} ${base_libdir} ${sysconfdir} ${PYTHON_SITEPACKAGES_DIR}"
-RDEPENDS_${PN} = "mime-support \
- openssh-ssh \
- python-compression \
- python-contextlib \
- python-crypt \
- python-datetime \
- python-email \
- python-fcntl \
- python-futures \
- python-html \
- python-imaging \
- python-io \
- python-json \
- python-logging \
- python-misc \
- python-multiprocessing \
- python-netclient \
- python-pkgutil \
- python-pyopenssl \
- python-re \
- python-setuptools \
- python-shell \
- python-simplejson \
- python-subprocess \
- python-syslog \
- python-terminal \
- python-textutils \
- python-tornado \
- python-unixadmin \
- python-xml \
- python-html5lib \
- bash \
-"
-
-SYSTEMD_SERVICE_${PN} = "gateone.service"
-INITSCRIPT_NAME = "gateone"
diff --git a/meta-python/recipes-connectivity/python-gsocketpool/python-gsocketpool.inc b/meta-python/recipes-connectivity/python-gsocketpool/python-gsocketpool.inc
deleted file mode 100644
index 11971dc4a4..0000000000
--- a/meta-python/recipes-connectivity/python-gsocketpool/python-gsocketpool.inc
+++ /dev/null
@@ -1,12 +0,0 @@
-SUMMARY = "A simple connection pool for gevent"
-DESCRIPTION = "creates a pool of connections that can be used with gevent"
-HOMEPAGE = "https://github.com/studio-ousia/gsocketpool"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=4ba825394aec026b5f94edca44426859"
-DEPENDS += "${PYTHON_PN}-gevent"
-RDEPENDS_${PN} += "${PYTHON_PN}-gevent"
-
-SRC_URI[md5sum] = "49f5f292ef1b60944ae92ca426a5e550"
-SRC_URI[sha256sum] = "f2e2749aceadce6b27ca52e2b0a64af99797746a8681e1a2963f72007c14cb14"
-
-inherit pypi
diff --git a/meta-python/recipes-connectivity/python-gsocketpool/python-gsocketpool_0.1.6.bb b/meta-python/recipes-connectivity/python-gsocketpool/python-gsocketpool_0.1.6.bb
deleted file mode 100644
index e96ad1ca1b..0000000000
--- a/meta-python/recipes-connectivity/python-gsocketpool/python-gsocketpool_0.1.6.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-gsocketpool.inc
-inherit setuptools
diff --git a/meta-python/recipes-connectivity/python-gsocketpool/python3-gsocketpool_0.1.6.bb b/meta-python/recipes-connectivity/python-gsocketpool/python3-gsocketpool_0.1.6.bb
index 883621e214..60ac18155f 100644
--- a/meta-python/recipes-connectivity/python-gsocketpool/python3-gsocketpool_0.1.6.bb
+++ b/meta-python/recipes-connectivity/python-gsocketpool/python3-gsocketpool_0.1.6.bb
@@ -1,2 +1,15 @@
-require python-gsocketpool.inc
-inherit setuptools3
+SUMMARY = "A simple connection pool for gevent"
+DESCRIPTION = "creates a pool of connections that can be used with gevent"
+HOMEPAGE = "https://github.com/studio-ousia/gsocketpool"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=4ba825394aec026b5f94edca44426859"
+
+RDEPENDS:${PN} += " \
+ python3-gevent \
+ python3-logging \
+"
+
+SRC_URI[md5sum] = "49f5f292ef1b60944ae92ca426a5e550"
+SRC_URI[sha256sum] = "f2e2749aceadce6b27ca52e2b0a64af99797746a8681e1a2963f72007c14cb14"
+
+inherit pypi setuptools3
diff --git a/meta-python/recipes-connectivity/python-h2/python3-h2_4.1.0.bb b/meta-python/recipes-connectivity/python-h2/python3-h2_4.1.0.bb
new file mode 100644
index 0000000000..6b3ce25371
--- /dev/null
+++ b/meta-python/recipes-connectivity/python-h2/python3-h2_4.1.0.bb
@@ -0,0 +1,11 @@
+DESCRIPTION = "HTTP/2 State-Machine based protocol implementation"
+HOMEPAGE = "https://github.com/python-hyper/hyper-h2"
+LICENSE = "MIT"
+
+LIC_FILES_CHKSUM = "file://LICENSE;md5=aa3b9b4395563dd427be5f022ec321c1"
+
+SRC_URI[sha256sum] = "a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-hpack python3-hyperframe"
diff --git a/meta-python/recipes-connectivity/python-hpack/python3-hpack_4.0.0.bb b/meta-python/recipes-connectivity/python-hpack/python3-hpack_4.0.0.bb
new file mode 100644
index 0000000000..0297cb8c27
--- /dev/null
+++ b/meta-python/recipes-connectivity/python-hpack/python3-hpack_4.0.0.bb
@@ -0,0 +1,12 @@
+DESCRIPTION = "Pure-Python HPACK header compression"
+HOMEPAGE = "https://github.com/python-hyper/hpack"
+LICENSE = "MIT"
+
+LIC_FILES_CHKSUM = "file://LICENSE;md5=5bf1c68e73fbaec2b1687b7e71514393"
+
+SRC_URI[md5sum] = "27e01514ef06dc9fa0798d3dcb7de47c"
+SRC_URI[sha256sum] = "fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-logging"
diff --git a/meta-python/recipes-connectivity/python-hyperframe/python3-hyperframe_6.0.1.bb b/meta-python/recipes-connectivity/python-hyperframe/python3-hyperframe_6.0.1.bb
new file mode 100644
index 0000000000..2d46e96112
--- /dev/null
+++ b/meta-python/recipes-connectivity/python-hyperframe/python3-hyperframe_6.0.1.bb
@@ -0,0 +1,9 @@
+DESCRIPTION = "HTTP/2 framing layer for Python"
+HOMEPAGE = "https://github.com/python-hyper/hyperframe"
+LICENSE = "MIT"
+
+LIC_FILES_CHKSUM = "file://LICENSE;md5=5bf1c68e73fbaec2b1687b7e71514393"
+
+SRC_URI[sha256sum] = "ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"
+
+inherit pypi setuptools3
diff --git a/meta-python/recipes-connectivity/python-mprpc/python-mprpc.inc b/meta-python/recipes-connectivity/python-mprpc/python-mprpc.inc
deleted file mode 100644
index e9eebe84af..0000000000
--- a/meta-python/recipes-connectivity/python-mprpc/python-mprpc.inc
+++ /dev/null
@@ -1,13 +0,0 @@
-SUMMARY = "A gevent based messagpack rpc library"
-DESCRIPTION = "mprpc is a fast implementation of the messagepack rpc protocol for python. \
-It is based on gevent for handling connections and enabling concurrent connections."
-HOMEPAGE = "https://github.com/studio-ousia/mprpc"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=4ba825394aec026b5f94edca44426859"
-DEPENDS += "${PYTHON_PN}-gevent"
-RDEPENDS_${PN} += "${PYTHON_PN}-gevent ${PYTHON_PN}-msgpack ${PYTHON_PN}-gsocketpool"
-
-SRC_URI[md5sum] = "8d97961051422f3de315613434982d3b"
-SRC_URI[sha256sum] = "3589fd127482e291b1ec314d6f0e55cc13311c12932ace356d6178ea1ca28f6a"
-
-inherit pypi
diff --git a/meta-python/recipes-connectivity/python-mprpc/python-mprpc_0.1.17.bb b/meta-python/recipes-connectivity/python-mprpc/python-mprpc_0.1.17.bb
deleted file mode 100644
index 6b2ea21932..0000000000
--- a/meta-python/recipes-connectivity/python-mprpc/python-mprpc_0.1.17.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-mprpc.inc
-inherit setuptools
diff --git a/meta-python/recipes-connectivity/python-mprpc/python3-mprpc_0.1.17.bb b/meta-python/recipes-connectivity/python-mprpc/python3-mprpc_0.1.17.bb
deleted file mode 100644
index 837d604ed5..0000000000
--- a/meta-python/recipes-connectivity/python-mprpc/python3-mprpc_0.1.17.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-mprpc.inc
-inherit setuptools3
diff --git a/meta-python/recipes-connectivity/python-priority/python3-priority_2.0.0.bb b/meta-python/recipes-connectivity/python-priority/python3-priority_2.0.0.bb
new file mode 100644
index 0000000000..93b694c8b8
--- /dev/null
+++ b/meta-python/recipes-connectivity/python-priority/python3-priority_2.0.0.bb
@@ -0,0 +1,9 @@
+DESCRIPTION = "A pure-Python implementation of the HTTP/2 priority tree"
+HOMEPAGE = "https://github.com/python-hyper/priority"
+LICENSE = "MIT"
+
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae57d8a09fc8b6b164d7357339619045"
+
+SRC_URI[sha256sum] = "c965d54f1b8d0d0b19479db3924c7c36cf672dbf2aec92d43fbdaf4492ba18c0"
+
+inherit pypi setuptools3
diff --git a/meta-python/recipes-connectivity/python-pyconnman/python-pyconnman.inc b/meta-python/recipes-connectivity/python-pyconnman/python-pyconnman.inc
deleted file mode 100644
index beb2baf83d..0000000000
--- a/meta-python/recipes-connectivity/python-pyconnman/python-pyconnman.inc
+++ /dev/null
@@ -1,12 +0,0 @@
-DESCRIPTION = "Python-based Network Connectivity Management"
-HOMEPAGE = "https://pypi.python.org/pypi/pyconnman/"
-LICENSE = "Apache-2.0"
-
-LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
-
-SRC_URI[md5sum] = "b7fa82034b1c0e1fb1b518ffe3bb4fc0"
-SRC_URI[sha256sum] = "46c64c0692063fd0c9fb0216d49f7884bec9fa9760d8473db4b1e2f8162fab4a"
-
-inherit pypi
-
-RDEPENDS_${PN} = "connman"
diff --git a/meta-python/recipes-connectivity/python-pyconnman/python-pyconnman_0.1.0.bb b/meta-python/recipes-connectivity/python-pyconnman/python-pyconnman_0.1.0.bb
deleted file mode 100644
index 3c12db9446..0000000000
--- a/meta-python/recipes-connectivity/python-pyconnman/python-pyconnman_0.1.0.bb
+++ /dev/null
@@ -1,5 +0,0 @@
-require python-pyconnman.inc
-
-inherit setuptools
-
-RDEPENDS_${PN} += "python-dbus python-pprint"
diff --git a/meta-python/recipes-connectivity/python-pyconnman/python3-pyconnman_0.1.0.bb b/meta-python/recipes-connectivity/python-pyconnman/python3-pyconnman_0.1.0.bb
deleted file mode 100644
index e0f3fdd75f..0000000000
--- a/meta-python/recipes-connectivity/python-pyconnman/python3-pyconnman_0.1.0.bb
+++ /dev/null
@@ -1,5 +0,0 @@
-require python-pyconnman.inc
-
-inherit setuptools3
-
-RDEPENDS_${PN} += "python3-dbus python3-pprint"
diff --git a/meta-python/recipes-connectivity/python-pyconnman/python3-pyconnman_0.2.0.bb b/meta-python/recipes-connectivity/python-pyconnman/python3-pyconnman_0.2.0.bb
new file mode 100644
index 0000000000..359a2918cf
--- /dev/null
+++ b/meta-python/recipes-connectivity/python-pyconnman/python3-pyconnman_0.2.0.bb
@@ -0,0 +1,12 @@
+DESCRIPTION = "Python-based Network Connectivity Management"
+HOMEPAGE = "https://pypi.python.org/pypi/pyconnman/"
+LICENSE = "Apache-2.0"
+
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
+
+SRC_URI[md5sum] = "d60bdffbd9c920f005fdc5e05a8b94cd"
+SRC_URI[sha256sum] = "d3a63a039c82b08a1171b003eafa62c6f128aa4eaa1ce7a55a9401b48f9ad926"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} = "connman python3-dbus python3-pprint python3-future"
diff --git a/meta-python/recipes-connectivity/python-pyro4/python-pyro4_4.73.bb b/meta-python/recipes-connectivity/python-pyro4/python-pyro4_4.73.bb
deleted file mode 100644
index 88f5b18559..0000000000
--- a/meta-python/recipes-connectivity/python-pyro4/python-pyro4_4.73.bb
+++ /dev/null
@@ -1,18 +0,0 @@
-SUMMARY = "Python Remote Objects"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=cd13dafd4eeb0802bb6efea6b4a4bdbc"
-
-SRC_URI[md5sum] = "0375c061b93411feb86da01e801df888"
-SRC_URI[sha256sum] = "536b07a097d0619e7ab1effa3747fda177a24168d17a07a93ca9ac30977608f7"
-
-PYPI_PACKAGE = "Pyro4"
-
-inherit pypi setuptools
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-logging \
- ${PYTHON_PN}-selectors34 \
- ${PYTHON_PN}-serpent \
- ${PYTHON_PN}-threading \
- ${PYTHON_PN}-zlib \
- "
diff --git a/meta-python/recipes-connectivity/python-pyro4/python3-pyro4_4.82.bb b/meta-python/recipes-connectivity/python-pyro4/python3-pyro4_4.82.bb
new file mode 100644
index 0000000000..c49e67c919
--- /dev/null
+++ b/meta-python/recipes-connectivity/python-pyro4/python3-pyro4_4.82.bb
@@ -0,0 +1,15 @@
+SUMMARY = "Python Remote Objects"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=cd13dafd4eeb0802bb6efea6b4a4bdbc"
+
+SRC_URI[sha256sum] = "511f5b0804e92dd77dc33adf9c947787e3f9e9c5a96b12162f0557a7c4ce21fb"
+
+PYPI_PACKAGE = "Pyro4"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-logging \
+ python3-serpent \
+ python3-threading \
+ "
diff --git a/meta-python/recipes-connectivity/python-pytun/python-pytun_2.2.1.bb b/meta-python/recipes-connectivity/python-pytun/python-pytun_2.2.1.bb
deleted file mode 100644
index 3fc587f3a3..0000000000
--- a/meta-python/recipes-connectivity/python-pytun/python-pytun_2.2.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-pytun.inc
-inherit setuptools
diff --git a/meta-python/recipes-connectivity/python-pytun/python3-pytun_2.2.1.bb b/meta-python/recipes-connectivity/python-pytun/python3-pytun_2.2.1.bb
deleted file mode 100644
index 938d9d7398..0000000000
--- a/meta-python/recipes-connectivity/python-pytun/python3-pytun_2.2.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-pytun.inc
-inherit setuptools3
diff --git a/meta-python/recipes-connectivity/python-thrift/python-thrift_0.11.0.bb b/meta-python/recipes-connectivity/python-thrift/python-thrift_0.11.0.bb
deleted file mode 100644
index 10cff425e8..0000000000
--- a/meta-python/recipes-connectivity/python-thrift/python-thrift_0.11.0.bb
+++ /dev/null
@@ -1,18 +0,0 @@
-SUMMARY = "Python bindings for the Apache Thrift RPC system"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://PKG-INFO;md5=e3641ae1a26cf5c12a3a71bd3030ab0e"
-
-SRC_URI[md5sum] = "36165d5c80e6b101dbe9fcf7ef524d51"
-SRC_URI[sha256sum] = "7d59ac4fdcb2c58037ebd4a9da5f9a49e3e034bf75b3f26d9fe48ba3d8806e6b"
-
-inherit pypi setuptools
-
-# Use different filename to prevent conflicts with thrift itself
-PYPI_SRC_URI_append = ";downloadfilename=${BP}.${PYPI_PACKAGE_EXT}"
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-logging \
- ${PYTHON_PN}-six \
- ${PYTHON_PN}-stringold \
- ${PYTHON_PN}-threading \
-"
diff --git a/meta-python/recipes-connectivity/python-thrift/python3-thrift_0.20.0.bb b/meta-python/recipes-connectivity/python-thrift/python3-thrift_0.20.0.bb
new file mode 100644
index 0000000000..6a0a66aef5
--- /dev/null
+++ b/meta-python/recipes-connectivity/python-thrift/python3-thrift_0.20.0.bb
@@ -0,0 +1,20 @@
+SUMMARY = "Python bindings for the Apache Thrift RPC system"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=7145f7cdd263359b62d342a02f005515"
+
+SRC_URI[sha256sum] = "4dd662eadf6b8aebe8a41729527bd69adf6ceaa2a8681cbef64d1273b3e8feba"
+
+inherit pypi setuptools3
+
+# Use different filename to prevent conflicts with thrift itself
+PYPI_SRC_URI:append = ";downloadfilename=${BP}.${PYPI_PACKAGE_EXT}"
+
+RDEPENDS:${PN} += "\
+ python3-logging \
+ python3-scons \
+ python3-six \
+ python3-stringold \
+ python3-threading \
+"
+
+BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-connectivity/python-txws/python-txws_0.9.1.bb b/meta-python/recipes-connectivity/python-txws/python-txws_0.9.1.bb
deleted file mode 100644
index f3631cda34..0000000000
--- a/meta-python/recipes-connectivity/python-txws/python-txws_0.9.1.bb
+++ /dev/null
@@ -1,15 +0,0 @@
-SUMMARY = "Twisted Web Sockets"
-HOMEPAGE = "https://github.com/MostAwesomeDude/txWS"
-
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=76699830db7fa9e897f6a1ad05f98ec8"
-
-DEPENDS = "python-twisted python-six python-vcversioner python-six-native python-vcversioner-native"
-
-SRC_URI = "git://github.com/MostAwesomeDude/txWS.git"
-SRCREV= "88cf6d9b9b685ffa1720644bd53c742afb10a414"
-
-S = "${WORKDIR}/git"
-
-inherit setuptools
-
diff --git a/meta-python/recipes-connectivity/python-txws/python3-txws_0.9.1.bb b/meta-python/recipes-connectivity/python-txws/python3-txws_0.9.1.bb
new file mode 100644
index 0000000000..ab39606bdb
--- /dev/null
+++ b/meta-python/recipes-connectivity/python-txws/python3-txws_0.9.1.bb
@@ -0,0 +1,19 @@
+SUMMARY = "Twisted Web Sockets"
+HOMEPAGE = "https://github.com/MostAwesomeDude/txWS"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=76699830db7fa9e897f6a1ad05f98ec8"
+
+DEPENDS = "python3-twisted python3-six python3-vcversioner python3-six-native python3-vcversioner-native"
+
+RDEPENDS:${PN} += " \
+ python3-six \
+ python3-twisted \
+"
+
+SRC_URI = "git://github.com/MostAwesomeDude/txWS.git;branch=master;protocol=https"
+SRCREV= "88cf6d9b9b685ffa1720644bd53c742afb10a414"
+
+S = "${WORKDIR}/git"
+
+inherit setuptools3
diff --git a/meta-python/recipes-connectivity/python-pytun/python-pytun.inc b/meta-python/recipes-connectivity/python3-pytun/python3-pytun_2.4.1.bb
index 79a8bfb21b..08ec2cf670 100644
--- a/meta-python/recipes-connectivity/python-pytun/python-pytun.inc
+++ b/meta-python/recipes-connectivity/python3-pytun/python3-pytun_2.4.1.bb
@@ -2,9 +2,8 @@ SUMMARY = "Python TUN/TAP tunnel module"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=13f7629e8e4989b66b4a913ab05a91de"
-SRC_URI[md5sum] = "5b35b1cf80a02cca7ec72eb95d6b0192"
-SRC_URI[sha256sum] = "07595dadf85f5176eb08c8d4d9ba5b862a180e96633f670f91437c47a1bead0d"
+SRC_URI[sha256sum] = "20b53ea7a09dfe173c00ec0a00eea508b05e959f5dc4b4bb698aa52252192f8f"
PYPI_PACKAGE = "python-pytun"
-inherit pypi
+inherit pypi setuptools3
diff --git a/meta-python/recipes-connectivity/telepathy/telepathy-python-0.15.19/parallel_make.patch b/meta-python/recipes-connectivity/telepathy/telepathy-python3-0.15.19/parallel_make.patch
index 248824606e..248824606e 100644
--- a/meta-python/recipes-connectivity/telepathy/telepathy-python-0.15.19/parallel_make.patch
+++ b/meta-python/recipes-connectivity/telepathy/telepathy-python3-0.15.19/parallel_make.patch
diff --git a/meta-python/recipes-connectivity/telepathy/telepathy-python-0.15.19/remove_duplicate_install.patch b/meta-python/recipes-connectivity/telepathy/telepathy-python3-0.15.19/remove_duplicate_install.patch
index df95a4c138..04d2da8ef2 100644
--- a/meta-python/recipes-connectivity/telepathy/telepathy-python-0.15.19/remove_duplicate_install.patch
+++ b/meta-python/recipes-connectivity/telepathy/telepathy-python3-0.15.19/remove_duplicate_install.patch
@@ -2,14 +2,14 @@ commit f6c67662145de889055a86a6b3b12c70a45fc8d5
Author: Dongxiao Xu <dongxiao.xu@intel.com>
Date: Wed Sep 7 16:02:20 2011 +0800
- Avoid duplicated installation of errors.py
+Avoid duplicated installation of errors.py
- newer version of autotools don't seem to like listing files to install
- twice. Remove one errors.py from the installation list.
+newer version of autotools don't seem to like listing files to install
+twice. Remove one errors.py from the installation list.
- Signed-off-by: Dongxiao Xu <dongxiao.xu@intel.com>
+Signed-off-by: Dongxiao Xu <dongxiao.xu@intel.com>
- Upstream-Status: Inappropirate [upstream inactive]
+Upstream-Status: Inappropriate [upstream inactive]
diff --git a/src/Makefile.am b/src/Makefile.am
index 5c27dfe..7536e43 100644
diff --git a/meta-python/recipes-connectivity/telepathy/telepathy-python-0.15.19/telepathy-python_fix_for_automake_1.12.patch b/meta-python/recipes-connectivity/telepathy/telepathy-python3-0.15.19/telepathy-python_fix_for_automake_1.12.patch
index f613fdce4d..0498f3ddd0 100644
--- a/meta-python/recipes-connectivity/telepathy/telepathy-python-0.15.19/telepathy-python_fix_for_automake_1.12.patch
+++ b/meta-python/recipes-connectivity/telepathy/telepathy-python3-0.15.19/telepathy-python_fix_for_automake_1.12.patch
@@ -9,7 +9,7 @@ of warning-errors.
| make[1]: Leaving directory `/srv/home/nitin/builds2/build0/tmp/work/i586-poky-linux/telepathy-python-0.15.19-r4/telepathy-python-0.15.19/src'
| make: *** [all-recursive] Error 1
-Signed-Off-By: Nitin A Kamble <nitin.a.kamble@intel.com>
+Signed-off-by: Nitin A Kamble <nitin.a.kamble@intel.com>
2012/07/10
Index: telepathy-python-0.15.19/src/Makefile.am
===================================================================
diff --git a/meta-python/recipes-connectivity/telepathy/telepathy-python3_0.15.19.bb b/meta-python/recipes-connectivity/telepathy/telepathy-python3_0.15.19.bb
new file mode 100644
index 0000000000..23c2165047
--- /dev/null
+++ b/meta-python/recipes-connectivity/telepathy/telepathy-python3_0.15.19.bb
@@ -0,0 +1,33 @@
+SUMMARY = "Telepathy IM framework - Python package"
+HOMEPAGE = "http://telepathy.freedesktop.org/wiki/"
+LICENSE = "LGPL-2.1-or-later"
+LIC_FILES_CHKSUM = "file://COPYING;md5=2d5025d4aa3495befef8f17206a5b0a1 \
+ file://src/utils.py;beginline=1;endline=17;md5=9a07d1a9791a7429a14e7b25c6c86822"
+
+DEPENDS = "libxslt-native"
+
+SRC_URI = "http://telepathy.freedesktop.org/releases/telepathy-python/telepathy-python-${PV}.tar.gz \
+ file://parallel_make.patch \
+ file://remove_duplicate_install.patch \
+ file://telepathy-python_fix_for_automake_1.12.patch"
+
+
+S = "${WORKDIR}/telepathy-python-${PV}"
+
+inherit autotools python3native
+
+SRC_URI[md5sum] = "f7ca25ab3c88874015b7e9728f7f3017"
+SRC_URI[sha256sum] = "244c0e1bf4bbd78ae298ea659fe10bf3a73738db550156767cc2477aedf72376"
+
+FILES:${PN} += "\
+ ${PYTHON_SITEPACKAGES_DIR}/telepathy/*.py \
+ ${PYTHON_SITEPACKAGES_DIR}/telepathy/*/*.py \
+"
+
+do_install:append () {
+ rm -fr ${D}${PYTHON_SITEPACKAGES_DIR}/telepathy/__pycache__
+ rm -fr ${D}${PYTHON_SITEPACKAGES_DIR}/telepathy/__pycache__
+ rm -fr ${D}${PYTHON_SITEPACKAGES_DIR}/telepathy/*/__pycache__
+ rm -fr ${D}${PYTHON_SITEPACKAGES_DIR}/telepathy/*/__pycache__
+}
+RDEPENDS:${PN} += "python3-dbus"
diff --git a/meta-python/recipes-connectivity/telepathy/telepathy-python_0.15.19.bb b/meta-python/recipes-connectivity/telepathy/telepathy-python_0.15.19.bb
deleted file mode 100644
index b7aea24a79..0000000000
--- a/meta-python/recipes-connectivity/telepathy/telepathy-python_0.15.19.bb
+++ /dev/null
@@ -1,32 +0,0 @@
-SUMMARY = "Telepathy IM framework - Python package"
-HOMEPAGE = "http://telepathy.freedesktop.org/wiki/"
-LICENSE = "LGPLv2.1+"
-LIC_FILES_CHKSUM = "file://COPYING;md5=2d5025d4aa3495befef8f17206a5b0a1 \
- file://src/utils.py;beginline=1;endline=17;md5=9a07d1a9791a7429a14e7b25c6c86822"
-
-DEPENDS = "libxslt-native"
-RDEPENDS_${PN} += "python-dbus"
-
-SRC_URI = "http://telepathy.freedesktop.org/releases/${BPN}/${BPN}-${PV}.tar.gz \
- file://parallel_make.patch \
- file://remove_duplicate_install.patch \
- file://telepathy-python_fix_for_automake_1.12.patch"
-
-PR = "r6"
-
-inherit autotools pythonnative
-
-SRC_URI[md5sum] = "f7ca25ab3c88874015b7e9728f7f3017"
-SRC_URI[sha256sum] = "244c0e1bf4bbd78ae298ea659fe10bf3a73738db550156767cc2477aedf72376"
-
-FILES_${PN} += "\
- ${libdir}/python*/site-packages/telepathy/*.py \
- ${libdir}/python*/site-packages/telepathy/*/*.py \
-"
-
-do_install_append () {
- rm -f ${D}${libdir}/python*/site-packages/telepathy/*.pyc
- rm -f ${D}${libdir}/python*/site-packages/telepathy/*.pyo
- rm -f ${D}${libdir}/python*/site-packages/telepathy/*/*.pyc
- rm -f ${D}${libdir}/python*/site-packages/telepathy/*/*.pyo
-}
diff --git a/meta-python/recipes-core/images/meta-python-image-all.bb b/meta-python/recipes-core/images/meta-python-image-all.bb
new file mode 100644
index 0000000000..fbe3efc600
--- /dev/null
+++ b/meta-python/recipes-core/images/meta-python-image-all.bb
@@ -0,0 +1,5 @@
+require recipes-core/images/core-image-base.bb
+
+SUMMARY = "meta-python build test image"
+
+IMAGE_INSTALL += "packagegroup-meta-python3"
diff --git a/meta-python/recipes-core/images/meta-python-image-base.bb b/meta-python/recipes-core/images/meta-python-image-base.bb
deleted file mode 100644
index 81081e61b2..0000000000
--- a/meta-python/recipes-core/images/meta-python-image-base.bb
+++ /dev/null
@@ -1,7 +0,0 @@
-SUMMARY = "meta-python build test image"
-
-IMAGE_INSTALL = "packagegroup-core-boot"
-
-LICENSE = "MIT"
-
-inherit core-image
diff --git a/meta-python/recipes-core/images/meta-python-image-ptest-all.bb b/meta-python/recipes-core/images/meta-python-image-ptest-all.bb
new file mode 100644
index 0000000000..d6708c5fd0
--- /dev/null
+++ b/meta-python/recipes-core/images/meta-python-image-ptest-all.bb
@@ -0,0 +1,25 @@
+DESCRIPTION = "Recipe to trigger execution of all meta-python ptest images."
+HOMEPAGE = "https://www.openembedded.org/"
+
+LICENSE = "MIT"
+
+inherit features_check nopackages
+REQUIRED_DISTRO_FEATURES = "ptest"
+
+require conf/include/ptest-packagelists-meta-python.inc
+
+# Include the full set of ptests
+PTESTS_META_PYTHON = "${PTESTS_FAST_META_PYTHON} ${PTESTS_SLOW_META_PYTHON} ${PTESTS_PROBLEMS_META_PYTHON}"
+
+do_testimage[noexec] = "1"
+do_testimage[depends] = "${@' '.join(['meta-python-image-ptest-'+x+':do_testimage' for x in d.getVar('PTESTS_META_PYTHON').split()])}"
+
+do_build[depends] = "${@' '.join(['meta-python-image-ptest-'+x+':do_build' for x in d.getVar('PTESTS_META_PYTHON').split()])}"
+
+# normally image.bbclass would do this
+EXCLUDE_FROM_WORLD = "1"
+
+python () {
+ if bb.utils.contains('IMAGE_CLASSES', 'testimage', True, False, d):
+ bb.build.addtask("do_testimage", "", "", d)
+}
diff --git a/meta-python/recipes-core/images/meta-python-image-ptest-fast.bb b/meta-python/recipes-core/images/meta-python-image-ptest-fast.bb
new file mode 100644
index 0000000000..bb6e8213fe
--- /dev/null
+++ b/meta-python/recipes-core/images/meta-python-image-ptest-fast.bb
@@ -0,0 +1,6 @@
+require meta-python-image-ptest-all.bb
+
+DESCRIPTION = "Recipe to trigger execution of all fast meta-python ptest images."
+
+PTESTS_META_PYTHON = "${PTESTS_FAST_META_PYTHON}"
+
diff --git a/meta-python/recipes-core/images/meta-python-image-ptest.bb b/meta-python/recipes-core/images/meta-python-image-ptest.bb
new file mode 100644
index 0000000000..002bd7a39e
--- /dev/null
+++ b/meta-python/recipes-core/images/meta-python-image-ptest.bb
@@ -0,0 +1,44 @@
+inherit features_check
+REQUIRED_DISTRO_FEATURES = "ptest"
+
+require recipes-core/images/core-image-minimal.bb
+require conf/include/ptest-packagelists-meta-python.inc
+
+SUMMARY = "meta-python ptest test image"
+
+DESCRIPTION += "Also including the ${MCNAME} ptest package."
+HOMEPAGE = "https://www.openembedded.org/"
+
+PTESTS_META_PYTHON = "${PTESTS_SLOW_META_PYTHON} ${PTESTS_FAST_META_PYTHON} ${PTESTS_PROBLEMS_META_PYTHON}"
+
+IMAGE_INSTALL:append = " ${MCNAME}-ptest openssh"
+
+BBCLASSEXTEND = "${@' '.join(['mcextend:'+x for x in d.getVar('PTESTS_META_PYTHON').split()])}"
+
+# The image can be sufficiently large (~1.8GB) that we need to be careful that it fits in a live
+# image (which has a 4GB limit), so nullify the overhead factor (1.3x out of the
+# box) and explicitly add up to 1500MB.
+IMAGE_OVERHEAD_FACTOR = "1.0"
+IMAGE_ROOTFS_EXTRA_SPACE = "324288"
+# If a particular ptest needs more space, it can be customized:
+#IMAGE_ROOTFS_EXTRA_SPACE:virtclass-mcextend-<pn> = "1024288"
+
+# ptests need more memory than standard to avoid the OOM killer
+QB_MEM = "-m 1024"
+# If a particular ptest needs more memory, it can be customized:
+#QB_MEM:virtclass-mcextend-<pn> = "-m 4096"
+# python3-scrypt ptests run into OOMs on RISCV64 qemu
+QB_MEM:virtclass-mcextend-python3-scrypt = "-m 2048"
+QB_MEM:virtclass-mcextend-python3-fastjsonschema = "-m 2048"
+QB_MEM:virtclass-mcextend-python3-pillow = "-m 2048"
+
+TEST_SUITES = "ping ssh parselogs ptest"
+
+# Sadly at the moment the full set of ptests is not robust enough and sporadically fails in random places
+PTEST_EXPECT_FAILURE = "1"
+
+python () {
+ if not d.getVar("MCNAME"):
+ raise bb.parse.SkipRecipe("No class extension set")
+}
+
diff --git a/meta-python/recipes-core/images/meta-python-image.bb b/meta-python/recipes-core/images/meta-python-image.bb
deleted file mode 100644
index cc75fe6e4b..0000000000
--- a/meta-python/recipes-core/images/meta-python-image.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-require meta-python-image-base.bb
-
-SUMMARY = "meta-python build test image"
-
-IMAGE_INSTALL += "packagegroup-meta-python \
- packagegroup-meta-python3"
diff --git a/meta-python/recipes-core/images/meta-python-ptest-image.bb b/meta-python/recipes-core/images/meta-python-ptest-image.bb
deleted file mode 100644
index 7ee15354a2..0000000000
--- a/meta-python/recipes-core/images/meta-python-ptest-image.bb
+++ /dev/null
@@ -1,5 +0,0 @@
-require meta-python-image-base.bb
-
-SUMMARY = "meta-python ptest test image"
-
-IMAGE_INSTALL += "packagegroup-meta-python-ptest"
diff --git a/meta-python/recipes-core/packagegroups/packagegroup-meta-python.bb b/meta-python/recipes-core/packagegroups/packagegroup-meta-python.bb
index 42f416346d..8850f8eb9a 100644
--- a/meta-python/recipes-core/packagegroups/packagegroup-meta-python.bb
+++ b/meta-python/recipes-core/packagegroups/packagegroup-meta-python.bb
@@ -1,150 +1,537 @@
-SUMMARY = "Meta-oe ptest packagegroups"
+SUMMARY = "Meta-python ptest packagegroups"
inherit packagegroup
PROVIDES = "${PACKAGES}"
PACKAGES = ' \
- packagegroup-meta-python \
packagegroup-meta-python3 \
'
-RDEPENDS_packagegroup-meta-python = "\
- packagegroup-meta-python-extended \
- packagegroup-meta-python-connectivity \
-"
-
-RDEPENDS_packagegroup-meta-python3 = "\
- packagegroup-meta-python3-extended \
- packagegroup-meta-python3-connectivity \
-"
-
-RDEPENDS_packagegroup-meta-python = "\
- python-psutil python-certifi python-flask python-pyroute2 python-pyopenssl python-pylint \
- python-semver python-wrapt python-networkx python-behave python-dominate python-flask-user \
- python-attrs python-humanize python-six python-flask-login python-zopeinterface python-sijax \
- python-pyinotify python-stevedore python-pyjwt python-webdav python-twisted python-flask-sijax \
- python-functools32 python-javaobj-py3 python-pygpgme python-future python-attr \
- python-flask-xstatic python-m2crypto python-hyperlink python-imaging python-idna python-jinja2 \
- python-can python-flask-bcrypt python-requests python-paste python-flask-script python-serpent \
- python-cryptography python-pysmi python-xlrd python-appdirs python-jsonpatch python-bcrypt \
- python-ndg-httpsclient python-pytest python-linecache2 python-visitor python-backports-abc \
- python-setuptools-scm python-evdev python-pyjks python-jsonpointer python-cheetah python-gevent \
- python-smbus python-sqlalchemy python-scrypt python-werkzeug python-anyjson python-pexpect \
- python-robotframework-seriallibrary python-pyalsaaudio python-pytest-helpers-namespace \
- python-alembic python-flask-pymongo python-slip-dbus python-pydbus python-automat python-rfc3987 \
- python-tzlocal python-backports-ssl python-subprocess32 python-asn1crypto python-pybind11 \
- python-ptyprocess python-babel python-passlib python-sdnotify \
- python-lazy-object-proxy python-cryptography-vectors python-crcmod python-pyusb python-vobject \
- python-webcolors python-pyparsing python-beautifulsoup4 python-cffi python-tornado-redis \
- python-itsdangerous python-pyasn1-modules python-netaddr python-vcversioner \
- python-sh python-greenlet python-paho-mqtt python-traceback2 python-gdata python-dbusmock \
- python-whoosh python-lockfile python-isort python-wtforms python-feedparser python-flask-restful \
- python-pysnmp python-flask-babel python-pytest-tempdir python-flask-nav python-pyzmq python-pyyaml \
- python-protobuf python-pluggy python-jsonschema python-msgpack \
- python-periphery python-pint python-pycryptodome python-yappi python-pycrypto python-pretend \
- python-pyserial python-pyiface python-docutils python-grpcio-tools python-django-south \
- python-backports-functools-lru-cache python-py python-click python-flask-migrate \
- python-pyudev python-pystache python-blinker python-prompt-toolkit python-lxml \
- python-unidiff python-inflection python-twofish python-prettytable python-webencodings \
- python-mock python-pyexpect python-dnspython python-pysocks python-pynetlinux \
- python-daemon python-djangorestframework python-typing python-monotonic python-sparts \
- python-enum34 python-pyperclip python-flask-uploads python-pbr python-parse python-pyflakes \
- python-pyhamcrest python-mako python-incremental python-tornado python-xstatic-font-awesome \
- python-cmd2 python-strict-rfc3339 python-pycodestyle python-xstatic python-snakefood \
- python-pybluez python-flask-navigation python-pyfirmata python-pymongo python-pysqlite \
- python-progress python-flask-sqlalchemy python-pymisp python-pip python-ujson python-ply \
- python-pep8 python-dateutil python-pycparser python-daemonize python-astroid python-pyrex \
- python-markupsafe python-pytest-runner python-grpcio python-mccabe python-pytz python-selectors34 \
- python-cython python-chardet python-editor python-flask-bootstrap python-html5lib \
- python-singledispatch python-redis python-flask-mail python-funcsigs python-snimpy python-pyasn1 \
- python-decorator python-urllib3 python-feedformatter python-iso8601 \
- python-numeric python-robotframework python-django python-simplejson python-wcwidth \
- python-configparser python-epydoc python-intervals python-speaklater \
- python-aws-iot-device-sdk-python python-constantly python-bitarray python-flask-wtf \
- python-parse-type python-ipaddress python-dbus \
- ${@bb.utils.contains("DISTRO_FEATURES", "pam", "python-pam pamela", "", d)} \
- ${@bb.utils.contains("DISTRO_FEATURES", "systemd", "python-systemd", "", d)} \
-"
-
-RDEPENDS_packagegroup-meta-python3 = "\
- python3-pyserial python3-gevent python3-alembic python3-robotframework-seriallibrary \
- python3-rfc3987 python3-xlrd python3-bandit python3-constantly python3-inflection \
- python3-javaobj-py3 python3-sh python3-pycrypto python3-pyasn1 python3-pydbus python3-wtforms \
- python3-pybluez python3-babel python3-parse-type python3-bitarray python3-django-south \
- python3-pyusb python3-prctl python3-jinja2 python3-werkzeug python3-pyjks python3-requests-ftp \
- python3-behave python3-pyparsing python3-pyyaml python3-tzlocal python3-pretend python3-stevedore \
- python3-sijax python3-langtable python3-requests-file python3-crcmod python3-robotframework \
- python3-pint python3-coverage python3-iso8601 python3-ndg-httpsclient python3-yappi python3-twofish \
- python3-speaklater python3-smbus python3-djangorestframework python3-msgpack python3-jsonpointer \
- python3-flask-script python3-cassandra-driver python3-cython python3-ujson python3-aws-iot-device-sdk-python \
- python3-pytest-runner python3-pyiface python3-flask-login python3-markupsafe python3-setuptools-scm \
- python3-semver python3-sdnotify python3-flask-user python3-tornado python3-jsonpatch python3-pexpect \
- python3-progress python3-jsonschema python3-xstatic python3-pyroute2 python3-idna python3-sqlalchemy \
- python3-urllib3 python3-flask-mail python3-asn1crypto python3-pyinotify python3-intervals python3-pyperclip \
- python3-flask-bootstrap python3-pyudev python3-decorator python3-pybind11 python3-pluggy python3-redis \
- python3-pycryptodome python3-passlib python3-dominate python3-ply python3-ntplib python3-serpent python3-wrapt \
- python3-attrs python3-appdirs python3-isort python3-evdev python3-incremental python3-click python3-flask-nav \
- python3-webcolors python3-dateutil python3-blinker python3-hyperlink python3-lxml python3-pylint \
- python3-flask-migrate python3-pytest-tempdir python3-flask-restful python3-feedformatter \
- python3-pyasn1-modules python3-scapy python3-html5lib python3-dnspython python3-automat \
- python3-itsdangerous python3-pandas python3-pyfirmata python3-protobuf \
- python3-flask-babel python3-anyjson python3-flask-xstatic python3-multidict python3-prompt-toolkit \
- python3-periphery python3-greenlet python3-pytz python3-pyexpect python3-zopeinterface \
- python3-bcrypt python3-xstatic-font-awesome python3-m2crypto python3-parse python3-attr \
- python3-beautifulsoup4 python3-pycodestyle python3-oauthlib python3-grpcio python3-scrypt \
- python3-pyjwt python3-astroid python3-flask-pymongo python3-wcwidth python3-lazy-object-proxy \
- python3-websockets python3-pyzmq python3-pytest python3-chardet python3-vcversioner python3-whoosh \
- python3-pymisp python3-certifi python3-psutil python3-flask-sqlalchemy python3-humanize \
- python3-grpcio-tools python3-configparser python3-strict-rfc3339 python3-paho-mqtt \
- python3-pytest-helpers-namespace python3-flask python3-flask-wtf python3-visitor python3-pynetlinux \
- python3-requests python3-cryptography-vectors python3-spidev python3-pid python3-pymongo \
- python3-future python3-django python3-unidiff python3-webencodings python3-can python3-pyalsaaudio \
- python3-flask-sijax python3-cryptography python3-twisted python3-netaddr python3-pycparser \
- python3-flask-uploads python3-pysocks python3-cffi python3-editor python3-ptyprocess \
- python3-pyopenssl python3-ordered-set python3-simplejson python3-py \
+# Note that python3-cvxopt requires Fortran support. To enable this,
+# add the following to your local.conf:
+# FORTRAN:forcevariable = ",fortran"
+RDEPENDS:packagegroup-meta-python3 = "\
${@bb.utils.contains("DISTRO_FEATURES", "systemd", "python3-systemd", "", d)} \
-"
-
-RDEPENDS_packagegroup-meta-python-extended = "\
- python-pyephem \
- python-cson \
- python-pywbem \
- python-pyparted \
-"
-
-RDEPENDS_packagegroup-meta-python3-extended = "\
- python3-pykickstart \
+ ${@bb.utils.contains("DISTRO_FEATURES", "x11 systemd", "python3-blivetgui", "", d)} \
+ gyp \
+ ${@bb.utils.contains("DISTRO_FEATURES", "pam", "pamela", "", d)} \
+ pyrtm \
+ python3-absl \
+ python3-aenum \
+ python3-aiofiles \
+ python3-aiohttp \
+ python3-aiohttp-jinja2 \
+ python3-aiohue \
+ python3-aiosignal \
+ python3-alembic \
+ python3-ansi2html \
+ python3-ansicolors \
+ python3-appdirs \
+ python3-apply-defaults \
+ python3-argcomplete \
+ python3-argexec \
+ python3-argh \
+ python3-arpeggio \
+ python3-asciitree \
+ python3-aspectlib \
+ python3-astor \
+ python3-astroid \
+ python3-asttokens \
+ python3-async-timeout \
+ python3-asyncio-glib \
+ python3-attr \
+ python3-autobahn \
+ python3-automat \
+ python3-aws-iot-device-sdk-python \
+ python3-backcall \
+ python3-bandit \
+ python3-beautifulsoup4 \
+ python3-behave \
+ python3-betamax \
+ python3-bitarray \
+ python3-bitstring \
+ python3-bitstruct \
+ python3-blinker \
+ ${@bb.utils.contains("DISTRO_FEATURES", "systemd", "python3-blivet", "", d)} \
+ python3-booleanpy \
+ python3-cachecontrol \
+ python3-cached-property \
+ python3-cachetools \
+ python3-can \
+ python3-cantools \
+ python3-cassandra-driver \
+ python3-cbor2 \
+ python3-cerberus \
+ python3-chardet \
+ python3-charset-normalizer \
+ python3-cheetah \
+ python3-click \
+ python3-click-repl \
+ python3-click-spinner \
+ python3-cmd2 \
+ python3-colorama \
+ python3-coloredlogs \
+ python3-colorlog \
+ python3-colorzero \
+ python3-configargparse \
+ python3-configobj \
+ python3-configshell-fb \
+ python3-constantly \
+ python3-contextlib2 \
+ python3-coverage \
+ python3-cppy \
+ python3-crcmod \
+ python3-croniter \
+ python3-cson \
+ python3-custom-inherit \
+ ${@bb.utils.contains_any('FORTRAN', [',fortran',',f77'], 'python3-cvxopt', '', d)} \
+ python3-cycler \
+ python3-cytoolz \
+ python3-dateparser \
+ python3-dateutil \
+ python3-dbus-next \
+ python3-dbussy \
+ python3-decorator \
+ python3-decouple \
+ python3-defusedxml \
+ python3-dill \
+ python3-diskcache \
+ python3-distro \
+ python3-django \
+ python3-django-south \
+ python3-djangorestframework \
+ python3-dnspython \
+ python3-docopt \
+ python3-docutils \
+ python3-dominate \
+ python3-dynamic-dispatch \
+ python3-ecdsa \
+ python3-editables \
+ python3-editor \
+ python3-email-validator \
+ python3-engineio \
+ python3-et-xmlfile \
+ python3-eth-abi \
+ python3-eth-account \
+ python3-eth-hash \
+ python3-eth-keyfile \
+ python3-eth-keys \
+ python3-eth-rlp \
+ python3-eth-typing \
+ python3-eth-utils \
+ python3-evdev \
+ python3-execnet \
+ python3-fann2 \
+ python3-fasteners \
+ python3-fastjsonschema \
+ python3-fastnumbers \
+ python3-fields \
+ python3-flask \
+ python3-flask-babel \
+ python3-flask-bootstrap \
+ python3-flask-jsonpify \
+ python3-flask-jwt \
+ python3-flask-login \
+ python3-flask-mail \
+ python3-flask-migrate \
+ python3-flask-nav \
+ python3-flask-pymongo \
+ python3-flask-restful \
+ python3-flask-sijax \
+ python3-flask-socketio \
+ python3-flask-sqlalchemy \
+ python3-flask-uploads \
+ python3-flask-user \
+ python3-flask-versioned \
+ python3-flask-wtf \
+ python3-flask-xstatic \
+ python3-future \
+ python3-frozenlist \
+ python3-gast \
+ python3-gcovr \
+ python3-geojson \
+ python3-geomet \
+ python3-gevent \
+ python3-gmpy2 \
+ python3-gmqtt \
+ python3-gnupg \
+ python3-google-api-python-client \
+ python3-gpiod \
+ python3-gpsd-py3 \
+ python3-graphviz \
+ python3-greenlet \
+ python3-greenstalk \
+ python3-grpcio \
+ python3-grpcio-tools \
+ python3-gsocketpool \
+ python3-gunicorn \
+ python3-h11 \
+ python3-h2 \
+ python3-h5py \
+ python3-hatchling \
+ python3-haversine \
+ python3-hpack \
+ python3-html2text \
+ python3-html5lib \
+ python3-httplib2 \
+ python3-huey \
+ python3-humanfriendly \
+ python3-humanize \
+ python3-hyperframe \
+ python3-hyperlink \
+ python3-icu \
+ python3-idna \
+ python3-idna \
+ python3-idna-ssl \
+ python3-ifaddr \
+ python3-imageio \
+ python3-imgtool \
+ python3-incremental \
+ python3-inflection \
+ python3-inotify \
+ python3-intelhex \
+ python3-intervals \
+ python3-ipaddress \
+ python3-ipy \
+ python3-ipython \
+ python3-ipython-genutils \
+ python3-iso3166 \
+ python3-isodate \
+ python3-isort \
+ python3-itsdangerous \
+ python3-javaobj-py3 \
+ python3-jdatetime \
+ python3-jdcal \
+ python3-jedi \
+ python3-jmespath \
+ python3-joblib \
+ python3-jsmin \
+ python3-jsonpatch \
+ python3-jsonpath-rw \
+ python3-jsonpointer \
+ python3-jsonref \
+ python3-jsonschema \
+ python3-jstyleson \
+ python3-kconfiglib \
+ python3-keras-applications \
+ python3-keras-preprocessing \
+ ${@bb.utils.contains("DISTRO_FEATURES", "x11 opengl", "python3-kivy", "", d)} \
+ python3-kiwisolver \
+ python3-langtable \
+ python3-lazy-object-proxy \
+ python3-libconf \
+ python3-license-expression \
+ python3-ldap \
+ python3-lockfile \
+ python3-lorem \
+ python3-lrparsing \
+ python3-lru-dict \
+ python3-luma-core \
+ python3-luma-oled \
+ python3-lxml \
+ python3-lz4 \
+ python3-m2crypto \
+ python3-markupsafe \
+ python3-matplotlib \
+ python3-mccabe \
python3-meh \
- python3-blivet \
- python3-pywbem \
+ python3-meld3 \
+ python3-mock \
+ python3-monotonic \
+ python3-mpmath \
+ python3-msgpack \
+ python3-msk \
+ python3-msm \
+ python3-multidict \
+ python3-mypy \
+ python3-mypy-extensions \
+ python3-natsort \
+ python3-netaddr \
+ python3-netifaces \
+ python3-networkx \
+ python3-nmap \
+ python3-nocasedict \
+ python3-nocaselist \
+ python3-ntplib \
+ python3-oauthlib \
+ python3-obd \
+ python3-openpyxl \
+ python3-ordered-set \
+ python3-padaos \
+ python3-padatious \
+ python3-paho-mqtt \
+ python3-pako \
+ python3-pandas \
+ python3-parallax \
+ python3-paramiko \
+ python3-parse \
+ python3-parse-type \
+ python3-parsimonious \
+ python3-parso \
+ python3-passlib \
+ python3-pastedeploy \
+ python3-pathspec \
+ python3-pathtools3 \
+ python3-pep8 \
+ python3-periphery \
+ python3-petact \
+ python3-pexpect \
+ python3-pickleshare \
+ python3-pid \
+ python3-pika \
+ python3-pillow \
+ python3-pint \
+ python3-pkcs11 \
+ python3-pkgconfig \
+ python3-pocketsphinx \
+ python3-polyline \
+ python3-portalocker \
+ python3-posix-ipc \
+ python3-prctl \
+ python3-precise-runner \
+ python3-prettytable \
+ python3-priority \
+ python3-process-tests \
+ python3-progress \
+ python3-prompt-toolkit \
+ python3-protobuf \
+ python3-ptyprocess \
+ python3-pulsectl \
+ python3-py-cpuinfo \
+ python3-py-ubjson \
+ python3-pyalsaaudio \
+ python3-pyasn1-modules \
+ python3-pyatspi \
+ python3-pyaudio \
+ python3-pybind11 \
+ python3-pybind11-json \
+ python3-pybluez \
+ python3-pychromecast \
+ python3-pycocotools \
+ python3-pycodestyle \
+ python3-pyconnman \
+ python3-pycurl \
+ python3-pydbus \
+ python3-pydicti \
+ python3-pyephem \
+ python3-pyexpect \
+ python3-pyfanotify \
+ python3-pyfirmata \
+ python3-pyflakes \
+ python3-pyhamcrest \
+ python3-pyiface \
+ python3-pyjks \
+ python3-pyjwt \
+ python3-pykickstart \
+ python3-pykwalify \
+ python3-pylint \
+ python3-pylyrics \
+ python3-pymetno \
+ python3-pymisp \
+ python3-pymongo \
+ python3-pymysql \
+ python3-pynacl \
+ python3-pynetlinux \
python3-pyparted \
- ${@bb.utils.contains("DISTRO_FEATURES", "x11", "python3-blivetgui", "", d)} \
-"
-
-RDEPENDS_packagegroup-meta-python-connectivity = "\
- python-pyro4 \
- python-pytun \
- python-mprpc \
- python-thrift \
- python-txws \
- python-pyconnman \
- python-gsocketpool \
-"
-
-RDEPENDS_packagegroup-meta-python3-connectivity = "\
+ python3-pyperclip \
+ python3-pyperf \
+ python3-pyrad \
+ python3-pyro4 \
+ python3-pyroute2 \
+ python3-pyrsistent \
+ python3-pyscaffold \
+ python3-pyserial \
+ python3-pysonos \
+ ${@bb.utils.contains("DISTRO_FEATURES", "systemd", "python3-pystemd", "", d)} \
+ python3-pytest-asyncio \
+ python3-pytest-benchmark \
+ python3-pytest-cache \
+ python3-pytest-forked \
+ python3-pytest-helpers-namespace \
+ python3-pytest-html \
+ python3-pytest-lazy-fixtures \
+ python3-pytest-metadata \
+ python3-pytest-tempdir \
+ python3-pytest-timeout \
+ python3-pytest-xdist \
+ python3-pythonping \
+ python3-python-vlc \
+ python3-pytoml \
python3-pytun \
- python3-mprpc \
- python3-pyconnman \
- python3-gsocketpool \
+ python3-pyudev \
+ python3-pyusb \
+ python3-pywbem \
+ python3-pywbemtools \
+ python3-pyyaml \
+ python3-pyzmq \
+ python3-qrcode \
+ python3-raven \
+ python3-rdflib \
+ python3-redis \
+ python3-regex \
+ python3-requests-file \
+ python3-requests-ftp \
+ python3-requests-futures \
+ python3-requests-oauthlib \
+ python3-requests-toolbelt \
+ python3-rfc3339-validator \
+ python3-rfc3986-validator \
+ python3-rfc3987 \
+ python3-rlp \
+ python3-robotframework \
+ python3-robotframework-seriallibrary \
+ python3-rsa \
+ python3-ruamel-yaml \
+ python3-scrypt \
+ python3-sdnotify \
+ python3-semver \
+ python3-send2trash \
+ python3-sentry-sdk \
+ python3-serpent \
+ python3-service-identity \
+ python3-setuptools-declarative-requirements \
+ python3-sh \
+ python3-sijax \
+ python3-simpleeval \
+ python3-simplejson \
+ python3-slip-dbus \
+ python3-smbus \
+ python3-smbus2 \
+ python3-smpplib \
+ python3-snappy \
+ python3-socketio \
+ python3-soupsieve \
+ python3-speaklater \
+ python3-speedtest-cli \
+ python3-spidev \
+ python3-spidev \
+ python3-sqlalchemy \
+ python3-sqlparse \
+ python3-sqlsoup \
+ python3-stevedore \
+ python3-supervisor \
+ python3-sympy \
+ python3-tabulate \
+ python3-term \
+ python3-termcolor \
+ python3-textparser \
+ python3-texttable \
+ python3-thrift \
+ python3-tinyrecord \
+ python3-tornado \
+ python3-toolz \
+ python3-tqdm \
+ python3-trafaret \
+ python3-trafaret-config \
+ python3-traitlets \
+ python3-transitions \
+ python3-trustme \
+ python3-twine \
+ python3-twisted \
+ python3-twitter \
+ python3-twofish \
+ python3-txaio \
+ python3-txdbus \
+ python3-txws \
+ python3-typeguard \
+ python3-tzlocal \
+ python3-u-msgpack-python \
+ python3-ujson \
+ python3-unidiff \
+ python3-uritemplate \
+ python3-vcversioner \
+ python3-versioneer \
+ python3-versiontools \
+ python3-visitor \
+ python3-waitress \
+ python3-watchdog \
+ python3-watchdogdev \
+ python3-web3 \
+ python3-webcolors \
+ python3-webencodings \
+ python3-websocket-client \
+ python3-werkzeug \
+ python3-werkzeug \
+ python3-whoosh \
+ python3-wrapt \
+ python3-wtforms \
+ python3-xlrd \
+ python3-xlsxwriter \
+ python3-xmltodict \
+ python3-xmodem \
+ python3-xstatic \
+ python3-xstatic-font-awesome \
+ python3-xxhash \
+ python3-yamlloader \
+ python3-yappi \
+ python3-yarl \
+ python3-zopeinterface \
+ telepathy-python3 \
+ unattended-upgrades \
"
-RDEPENDS_packagegroup-meta-python-ptest = "\
- python-pygpgme \
- python-cryptography \
- "
-
-RDEPENDS_packagegroup-meta-python3-ptest = "\
- python3-cryptography \
- "
+RDEPENDS:packagegroup-meta-python3-ptest = "\
+ python3-ansicolors-ptest \
+ python3-appdirs-ptest \
+ python3-betamax-ptest \
+ python3-blinker-ptest \
+ python3-cachetools-ptest \
+ python3-cbor2-ptest \
+ python3-click-ptest \
+ python3-dnspython-ptest \
+ python3-dominate-ptest \
+ python3-geojson-ptest \
+ python3-gunicorn-ptest \
+ python3-hexbytes \
+ python3-html2text-ptest \
+ python3-inflection-ptest \
+ python3-intervals-ptest \
+ python3-ipy-ptest \
+ python3-iso3166-ptest \
+ python3-jdcal-ptest \
+ python3-jinja2-ptest \
+ python3-jsmin-ptest \
+ python3-jsonpointer-ptest \
+ python3-license-expression-ptest \
+ python3-markupsafe-ptest \
+ python3-msgpack-ptest \
+ python3-multidict-ptest \
+ python3-ordered-set-ptest \
+ python3-parse-ptest \
+ python3-parse-type-ptest \
+ python3-pint-ptest \
+ python3-polyline-ptest \
+ python3-precise-runner-ptest \
+ python3-prettytable-ptest \
+ python3-ptyprocess-ptest \
+ python3-pyasn1-modules-ptest \
+ python3-pyroute2-ptest \
+ python3-pyserial-ptest \
+ python3-pytoml-ptest \
+ python3-pyzmq-ptest \
+ python3-requests-file-ptest \
+ python3-requests-toolbelt-ptest \
+ python3-scrypt-ptest \
+ python3-semver-ptest \
+ python3-serpent-ptest \
+ python3-simpleeval-ptest \
+ python3-smpplib-ptest \
+ python3-soupsieve-ptest \
+ python3-sqlparse-ptest \
+ python3-typeguard-ptest \
+ python3-ujson-ptest \
+ python3-u-msgpack-python-ptest \
+ python3-unidiff-ptest \
+ python3-uritemplate-ptest \
+ python3-webcolors-ptest \
+ python3-whoosh-ptest \
+ python3-wpa-supplicant \
+ python3-xlrd-ptest \
+ python3-xmltodict-ptest \
+ python3-xxhash-ptest \
+ python3-yappi-ptest \
+ python3-yarl-ptest \
+ python3-pyasn1-ptest \
+"
EXCLUDE_FROM_WORLD = "1"
diff --git a/meta-python/recipes-devtools/gyp/gyp_git.bb b/meta-python/recipes-devtools/gyp/gyp_git.bb
index 2b3f3fb2bf..6ac4228a8b 100644
--- a/meta-python/recipes-devtools/gyp/gyp_git.bb
+++ b/meta-python/recipes-devtools/gyp/gyp_git.bb
@@ -4,11 +4,12 @@ LICENSE = "BSD-3-Clause"
LIC_FILES_CHKSUM = "file://LICENSE;md5=ab828cb8ce4c62ee82945a11247b6bbd"
SECTION = "devel"
-SRC_URI = "git://chromium.googlesource.com/external/gyp;protocol=https"
-SRCREV = "8bee09f4a57807136593ddc906b0b213c21f9014"
+SRC_URI = "git://chromium.googlesource.com/external/gyp;protocol=https;branch=master \
+ "
+SRCREV = "a03d7413becefc8d55c8aa3df58b55b9bd0e9052"
S = "${WORKDIR}/git"
-PV = "0.1+git${SRCPV}"
+PV = "0.1+git"
inherit setuptools3
diff --git a/meta-python/recipes-devtools/python-jsonref/files/migrate-to-pdm-backend.patch b/meta-python/recipes-devtools/python-jsonref/files/migrate-to-pdm-backend.patch
new file mode 100644
index 0000000000..709a38c4aa
--- /dev/null
+++ b/meta-python/recipes-devtools/python-jsonref/files/migrate-to-pdm-backend.patch
@@ -0,0 +1,28 @@
+From 1b594cf12e5a69aa25f49f532c1201a6b39e280d Mon Sep 17 00:00:00 2001
+From: Leon Anavi <leon.anavi@konsulko.com>
+Date: Tue, 7 Nov 2023 10:43:32 +0000
+Subject: [PATCH] Migrate to pdm-backend
+
+Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
+Upstream-Status: Pending
+---
+ pyproject.toml | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+diff --git a/pyproject.toml b/pyproject.toml
+index f549376..c608213 100644
+--- a/pyproject.toml
++++ b/pyproject.toml
+@@ -36,7 +36,5 @@ includes = [
+ profile = "black"
+
+ [build-system]
+-requires = [
+- "pdm-pep517>=1.0.0",
+-]
+-build-backend = "pdm.pep517.api"
++requires = ["pdm-backend"]
++build-backend = "pdm.backend"
+--
+2.39.2
+
diff --git a/meta-python/recipes-devtools/python-jsonref/python-jsonref.inc b/meta-python/recipes-devtools/python-jsonref/python-jsonref.inc
deleted file mode 100644
index 0e69e45345..0000000000
--- a/meta-python/recipes-devtools/python-jsonref/python-jsonref.inc
+++ /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 setuptools
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python-jsonref/python-jsonref_0.2.bb b/meta-python/recipes-devtools/python-jsonref/python-jsonref_0.2.bb
deleted file mode 100644
index d97893f5ab..0000000000
--- a/meta-python/recipes-devtools/python-jsonref/python-jsonref_0.2.bb
+++ /dev/null
@@ -1 +0,0 @@
-require python-jsonref.inc
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_0.3.0.bb b/meta-python/recipes-devtools/python/pamela_0.3.0.bb
deleted file mode 100644
index 8071fcb04f..0000000000
--- a/meta-python/recipes-devtools/python/pamela_0.3.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=bfb663f37eb99232bc8ccfa4ea8f1202"
-
-SRC_URI[md5sum] = "de6516118d51eb5fc97017f3b6d5c68b"
-SRC_URI[sha256sum] = "1e198446a6cdd87704aa0def7621d62e7c20b0e6068e2788b9a866a8355e5d6b"
-
-PYPI_PACKAGE = "pamela"
-
-inherit pypi setuptools
-
-RDEPENDS_${PN} = "libpam"
-
-inherit distro_features_check
-REQUIRED_DISTRO_FEATURES = "pam"
diff --git a/meta-python/recipes-devtools/python/pamela_1.1.0.bb b/meta-python/recipes-devtools/python/pamela_1.1.0.bb
new file mode 100644
index 0000000000..3573de551d
--- /dev/null
+++ b/meta-python/recipes-devtools/python/pamela_1.1.0.bb
@@ -0,0 +1,14 @@
+DESCRIPTION = "Pamela: yet another Python wrapper for PAM"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=6b706db92112b8384848de3e5c6adaa3"
+
+SRC_URI[sha256sum] = "d4b139fe600e192e176a2a368059207a6bffa0e7879879b13f4fcba0163481be"
+
+PYPI_PACKAGE = "pamela"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} = "libpam"
+
+inherit features_check
+REQUIRED_DISTRO_FEATURES = "pam"
diff --git a/meta-python/recipes-devtools/python/pyrtm_0.4.2.bb b/meta-python/recipes-devtools/python/pyrtm_0.4.2.bb
index 9d851abe33..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"
@@ -8,29 +7,29 @@ PYPI_PACKAGE_EXT = "tar.bz2"
SRC_URI[md5sum] = "7c87da94656b620dfe532ca63d642eb8"
SRC_URI[sha256sum] = "b2d701b25ad3f9a1542057f3eb492c5c1d7dbe2b8d1e8f763043dcc14ee1d933"
-inherit pypi setuptools
+inherit pypi setuptools3
PACKAGES =+ "${PN}-tests ${PN}-samples"
-FILES_${PN}-samples += " \
+FILES:${PN}-samples += " \
${PYTHON_SITEPACKAGES_DIR}/rtm/samples \
"
-FILES_${PN}-tests += " \
+FILES:${PN}-tests += " \
${PYTHON_SITEPACKAGES_DIR}/rtm/tests \
"
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-json \
- ${PYTHON_PN}-logging \
- ${PYTHON_PN}-netclient \
+RDEPENDS:${PN} += "\
+ python3-json \
+ python3-logging \
+ python3-netclient \
"
-RDEPENDS_${PN}-samples += " \
+RDEPENDS:${PN}-samples += " \
${PN} \
"
-RDEPENDS_${PN}-tests += " \
+RDEPENDS:${PN}-tests += " \
${PN} \
- ${PYTHON_PN}-unittest \
+ python3-unittest \
"
diff --git a/meta-python/recipes-devtools/python/python-aiohttp.inc b/meta-python/recipes-devtools/python/python-aiohttp.inc
deleted file mode 100644
index e711ad71da..0000000000
--- a/meta-python/recipes-devtools/python/python-aiohttp.inc
+++ /dev/null
@@ -1,21 +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=cf056e8e7a0a5477451af18b7b5aa98c"
-
-SRC_URI[md5sum] = "85fe5c9037256c58d4678148bd91b3f3"
-SRC_URI[sha256sum] = "9c4c83f4fa1938377da32bc2d59379025ceeee8e24b89f72fcbccd8ca22dc9bf"
-
-PYPI_PACKAGE = "aiohttp"
-inherit pypi
-RDEPENDS_${PN} = "\
- ${PYTHON_PN}-async-timeout \
- ${PYTHON_PN}-chardet \
- ${PYTHON_PN}-idna-ssl \
- ${PYTHON_PN}-multidict \
- ${PYTHON_PN}-yarl \
- ${PYTHON_PN}-typing \
- ${PYTHON_PN}-misc \
- ${PYTHON_PN}-attrs \
-"
diff --git a/meta-python/recipes-devtools/python/python-alembic.inc b/meta-python/recipes-devtools/python/python-alembic.inc
deleted file mode 100644
index fa178ce08e..0000000000
--- a/meta-python/recipes-devtools/python/python-alembic.inc
+++ /dev/null
@@ -1,15 +0,0 @@
-DESCRIPTION = "A database migration tool for SQLAlchemy"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=28aaf14a6592d14dbfb2f4abd597aa27"
-
-SRC_URI[md5sum] = "6fe272274fce2641b93998ef9b702b76"
-SRC_URI[sha256sum] = "9f907d7e8b286a1cfb22db9084f9ce4fde7ad7956bb496dc7c952e10ac90e36a"
-
-PYPI_PACKAGE = "alembic"
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-dateutil \
- ${PYTHON_PN}-editor \
- ${PYTHON_PN}-mako \
- ${PYTHON_PN}-sqlalchemy \
-"
diff --git a/meta-python/recipes-devtools/python/python-alembic_1.2.1.bb b/meta-python/recipes-devtools/python/python-alembic_1.2.1.bb
deleted file mode 100644
index efcb2b1deb..0000000000
--- a/meta-python/recipes-devtools/python/python-alembic_1.2.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-alembic.inc
diff --git a/meta-python/recipes-devtools/python/python-anyjson.inc b/meta-python/recipes-devtools/python/python-anyjson.inc
deleted file mode 100644
index a0d20ff4d0..0000000000
--- a/meta-python/recipes-devtools/python/python-anyjson.inc
+++ /dev/null
@@ -1,13 +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
-
-SRC_URI[md5sum] = "2ea28d6ec311aeeebaf993cb3008b27c"
-SRC_URI[sha256sum] = "37812d863c9ad3e35c0734c42e0bf0320ce8c3bed82cd20ad54cb34d158157ba"
-
-RDEPENDS_${PN} += "${PYTHON_PN}-simplejson"
diff --git a/meta-python/recipes-devtools/python/python-anyjson_0.3.3.bb b/meta-python/recipes-devtools/python/python-anyjson_0.3.3.bb
deleted file mode 100644
index 31b8749fe2..0000000000
--- a/meta-python/recipes-devtools/python/python-anyjson_0.3.3.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-anyjson.inc
diff --git a/meta-python/recipes-devtools/python/python-appdirs.inc b/meta-python/recipes-devtools/python/python-appdirs.inc
deleted file mode 100644
index c4826723e8..0000000000
--- a/meta-python/recipes-devtools/python/python-appdirs.inc
+++ /dev/null
@@ -1,8 +0,0 @@
-SUMMARY = "A small Python module for determining appropriate + platform-specific dirs, e.g. a user data dir."
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=31625363c45eb0c67c630a2f73e438e4"
-
-SRC_URI[md5sum] = "44c679904082a2133f5566c8a0d3ab42"
-SRC_URI[sha256sum] = "9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92"
-
-inherit pypi
diff --git a/meta-python/recipes-devtools/python/python-appdirs_1.4.3.bb b/meta-python/recipes-devtools/python/python-appdirs_1.4.3.bb
deleted file mode 100644
index e9ff9b3fc3..0000000000
--- a/meta-python/recipes-devtools/python/python-appdirs_1.4.3.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-appdirs.inc
diff --git a/meta-python/recipes-devtools/python/python-asn1crypto.inc b/meta-python/recipes-devtools/python/python-asn1crypto.inc
deleted file mode 100644
index b18dbaf335..0000000000
--- a/meta-python/recipes-devtools/python/python-asn1crypto.inc
+++ /dev/null
@@ -1,23 +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] = "cf33950b47b5148e29f1d62a6b6c009b"
-SRC_URI[sha256sum] = "0b199f211ae690df3db4fd6c1c4ff976497fb1da689193e368eedbadc53d9292"
-
-inherit pypi
-
-RDEPENDS_${PN}_class-target += " \
- ${PYTHON_PN}-codecs \
- ${PYTHON_PN}-crypt \
- ${PYTHON_PN}-ctypes \
- ${PYTHON_PN}-datetime \
- ${PYTHON_PN}-io \
- ${PYTHON_PN}-netclient \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-asn1crypto_1.0.1.bb b/meta-python/recipes-devtools/python/python-asn1crypto_1.0.1.bb
deleted file mode 100644
index 46aace286f..0000000000
--- a/meta-python/recipes-devtools/python/python-asn1crypto_1.0.1.bb
+++ /dev/null
@@ -1,7 +0,0 @@
-inherit setuptools
-require python-asn1crypto.inc
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-subprocess \
- ${PYTHON_PN}-textutils \
-"
diff --git a/meta-python/recipes-devtools/python/python-astroid.inc b/meta-python/recipes-devtools/python/python-astroid.inc
deleted file mode 100644
index fae0f13cb8..0000000000
--- a/meta-python/recipes-devtools/python/python-astroid.inc
+++ /dev/null
@@ -1,31 +0,0 @@
-SUMMARY = "An abstract syntax tree for Python with inference support."
-HOMEPAGE = "https://pypi.python.org/pypi/astroid"
-SECTION = "devel/python"
-LICENSE = "LGPL-2.1"
-LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe"
-
-SRC_URI[md5sum] = "2dd01ef0d5b5f0fc754c1ba40137b61c"
-SRC_URI[sha256sum] = "fc9b582dba0366e63540982c3944a9230cbc6f303641c51483fa547dcc22393a"
-
-inherit pypi
-
-PACKAGES =+ "${PN}-tests"
-
-FILES_${PN}-tests += " \
- ${PYTHON_SITEPACKAGES_DIR}/astroid/test* \
- ${PYTHON_SITEPACKAGES_DIR}/astroid/__pycache__/test* \
-"
-
-RDEPENDS_${PN}_class-target += "\
- ${PYTHON_PN}-distutils \
- ${PYTHON_PN}-lazy-object-proxy \
- ${PYTHON_PN}-logging \
- ${PYTHON_PN}-six \
- ${PYTHON_PN}-wrapt \
- ${PYTHON_PN}-setuptools \
-"
-
-RDEPENDS_${PN}-tests_class-target += "\
- ${PYTHON_PN}-unittest \
- ${PYTHON_PN}-xml \
-"
diff --git a/meta-python/recipes-devtools/python/python-astroid_1.6.5.bb b/meta-python/recipes-devtools/python/python-astroid_1.6.5.bb
deleted file mode 100644
index 687394da63..0000000000
--- a/meta-python/recipes-devtools/python/python-astroid_1.6.5.bb
+++ /dev/null
@@ -1,10 +0,0 @@
-inherit setuptools
-require python-astroid.inc
-
-RDEPENDS_${PN}_class-target += " \
- ${PYTHON_PN}-enum34 \
- ${PYTHON_PN}-backports-functools-lru-cache \
- ${PYTHON_PN}-re \
- ${PYTHON_PN}-singledispatch \
- ${PYTHON_PN}-subprocess \
-"
diff --git a/meta-python/recipes-devtools/python/python-atomicwrites.inc b/meta-python/recipes-devtools/python/python-atomicwrites.inc
deleted file mode 100644
index 773e9dd770..0000000000
--- a/meta-python/recipes-devtools/python/python-atomicwrites.inc
+++ /dev/null
@@ -1,7 +0,0 @@
-DESCRIPTION = "Powerful Python library for atomic file writes"
-HOMEPAGE = "https://github.com/untitaker/python-atomicwrites"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=91cc36cfafeefb7863673bcfcb1d4da4"
-
-SRC_URI[md5sum] = "ce11f780a4ce0fce8a55d64494a88178"
-SRC_URI[sha256sum] = "75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6"
diff --git a/meta-python/recipes-devtools/python/python-atomicwrites_1.3.0.bb b/meta-python/recipes-devtools/python/python-atomicwrites_1.3.0.bb
deleted file mode 100644
index c7b41d603c..0000000000
--- a/meta-python/recipes-devtools/python/python-atomicwrites_1.3.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-atomicwrites.inc
diff --git a/meta-python/recipes-devtools/python/python-attr.inc b/meta-python/recipes-devtools/python/python-attr.inc
deleted file mode 100644
index 1d93dd7156..0000000000
--- a/meta-python/recipes-devtools/python/python-attr.inc
+++ /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
diff --git a/meta-python/recipes-devtools/python/python-attr_0.3.1.bb b/meta-python/recipes-devtools/python/python-attr_0.3.1.bb
deleted file mode 100644
index 979d6cb687..0000000000
--- a/meta-python/recipes-devtools/python/python-attr_0.3.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-attr.inc
diff --git a/meta-python/recipes-devtools/python/python-attrs.inc b/meta-python/recipes-devtools/python/python-attrs.inc
deleted file mode 100644
index 13c9e5f25c..0000000000
--- a/meta-python/recipes-devtools/python/python-attrs.inc
+++ /dev/null
@@ -1,16 +0,0 @@
-DESCRIPTION = "Classes Without Boilerplate"
-HOMEPAGE = "http://www.attrs.org/"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=d4ab25949a73fe7d4fdee93bcbdbf8ff"
-
-SRC_URI[sha256sum] = "f913492e1663d3c36f502e5e9ba6cd13cf19d7fab50aa13239e420fef95e1396"
-SRC_URI[md5sum] = "d5a6ee80beaa072bd2b3bcb6fee0d508"
-
-inherit pypi
-
-RDEPENDS_${PN}_class-target += " \
- ${PYTHON_PN}-crypt \
- ${PYTHON_PN}-ctypes \
-"
-
-BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python-attrs_19.2.0.bb b/meta-python/recipes-devtools/python/python-attrs_19.2.0.bb
deleted file mode 100644
index e3bec0fdfd..0000000000
--- a/meta-python/recipes-devtools/python/python-attrs_19.2.0.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-inherit setuptools
-require python-attrs.inc
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-subprocess \
-"
diff --git a/meta-python/recipes-devtools/python/python-automat.inc b/meta-python/recipes-devtools/python/python-automat.inc
deleted file mode 100644
index f6cbb35c0f..0000000000
--- a/meta-python/recipes-devtools/python/python-automat.inc
+++ /dev/null
@@ -1,24 +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"
-
-FILESEXTRAPATHS_prepend := "${THISDIR}/python-automat:"
-
-SRC_URI[md5sum] = "b72d5b7a83c2b1bd6e9ec3614a69f9ea"
-SRC_URI[sha256sum] = "cbd78b83fa2d81fe2a4d23d258e1661dd7493c9a50ee2f1a5b2cac61c1793b0e"
-
-PYPI_PACKAGE = "Automat"
-
-inherit pypi
-
-SRC_URI_append = " \
- file://0001-setup.py-remove-the-dependency-on-m2r.patch \
-"
-
-DEPENDS += "${PYTHON_PN}-setuptools-scm-native"
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-attrs \
- ${PYTHON_PN}-six \
-"
diff --git a/meta-python/recipes-devtools/python/python-automat/0001-setup.py-remove-the-dependency-on-m2r.patch b/meta-python/recipes-devtools/python/python-automat/0001-setup.py-remove-the-dependency-on-m2r.patch
deleted file mode 100644
index c29b659bc3..0000000000
--- a/meta-python/recipes-devtools/python/python-automat/0001-setup.py-remove-the-dependency-on-m2r.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-From 33b70266930c9093712173c4e0c419815b55e313 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>
-
----
- setup.py | 10 ----------
- 1 file changed, 10 deletions(-)
-
-diff --git a/setup.py b/setup.py
-index d360c64..7b4180a 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>=16.1.0",
diff --git a/meta-python/recipes-devtools/python/python-automat_0.7.0.bb b/meta-python/recipes-devtools/python/python-automat_0.7.0.bb
deleted file mode 100644
index 8ac8c9c0ff..0000000000
--- a/meta-python/recipes-devtools/python/python-automat_0.7.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-automat.inc
diff --git a/meta-python/recipes-devtools/python/python-aws-iot-device-sdk-python_1.4.0.bb b/meta-python/recipes-devtools/python/python-aws-iot-device-sdk-python_1.4.0.bb
deleted file mode 100644
index 490e973917..0000000000
--- a/meta-python/recipes-devtools/python/python-aws-iot-device-sdk-python_1.4.0.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-inherit setuptools
-require python-aws-iot-device-sdk-python.inc
-
-RDEPENDS_${PN}-examples += "${PYTHON_PN}-argparse"
diff --git a/meta-python/recipes-devtools/python/python-babel.inc b/meta-python/recipes-devtools/python/python-babel.inc
deleted file mode 100644
index 4274672949..0000000000
--- a/meta-python/recipes-devtools/python/python-babel.inc
+++ /dev/null
@@ -1,25 +0,0 @@
-DESCRIPTION = "A collection of tools for internationalizing Python applications"
-HOMEPAGE = "http://babel.edgewall.org/"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=942469df9305abb1c59e95f778310384"
-
-SRC_URI[md5sum] = "83c158b7dae9135750a7cf204e6e2eea"
-SRC_URI[sha256sum] = "e86135ae101e31e2c8ec20a4e0c5220f4eed12487d5cf3f78be7e98d3a57fc28"
-
-PYPI_PACKAGE = "Babel"
-
-inherit pypi
-
-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 \
-"
diff --git a/meta-python/recipes-devtools/python/python-babel_2.7.0.bb b/meta-python/recipes-devtools/python/python-babel_2.7.0.bb
deleted file mode 100644
index f7c166ebab..0000000000
--- a/meta-python/recipes-devtools/python/python-babel_2.7.0.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-inherit setuptools
-require python-babel.inc
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-subprocess \
-"
diff --git a/meta-python/recipes-devtools/python/python-backports-abc_0.4.bb b/meta-python/recipes-devtools/python/python-backports-abc_0.4.bb
deleted file mode 100644
index 6a4d267bc7..0000000000
--- a/meta-python/recipes-devtools/python/python-backports-abc_0.4.bb
+++ /dev/null
@@ -1,18 +0,0 @@
-SUMMARY = "collections.abc from Python 3.4"
-DESCRIPTION = "A backport of recent additions to the 'collections.abc' module"
-
-LICENSE = "PSF"
-LIC_FILES_CHKSUM = "file://${WORKDIR}/LICENSE;md5=dd98d01d471fac8d8dbdd975229dba03"
-
-# pypi package doesn't have valid entry for license
-SRC_URI += "https://raw.githubusercontent.com/cython/backports_abc/master/LICENSE;name=license"
-
-SRC_URI[md5sum] = "0b65a216ce9dc9c1a7e20a729dd7c05b"
-SRC_URI[sha256sum] = "8b3e4092ba3d541c7a2f9b7d0d9c0275b21c6a01c53a61c731eba6686939d0a5"
-SRC_URI[license.md5sum] = "dd98d01d471fac8d8dbdd975229dba03"
-SRC_URI[license.sha256sum] = "0a4f3b38055f50f047a42521568fa6ddb9a5976c2884f6ae138796d0f71150ca"
-
-
-
-PYPI_PACKAGE = "backports_abc"
-inherit pypi setuptools
diff --git a/meta-python/recipes-devtools/python/python-backports-functools-lru-cache_1.5.bb b/meta-python/recipes-devtools/python/python-backports-functools-lru-cache_1.5.bb
deleted file mode 100644
index 825444ff3a..0000000000
--- a/meta-python/recipes-devtools/python/python-backports-functools-lru-cache_1.5.bb
+++ /dev/null
@@ -1,19 +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://setup.py;beginline=57;endline=57;md5=98fc3658e5970d26f6b2109808c766be"
-
-PYPI_PACKAGE = "backports.functools_lru_cache"
-
-SRC_URI[md5sum] = "20f53f54cd3f04b3346ce75a54959754"
-SRC_URI[sha256sum] = "9d98697f088eb1b0fa451391f91afb5e3ebde16bbdb272819fd091151fda4f1a"
-
-DEPENDS += "python-setuptools-scm-native"
-
-inherit setuptools pypi
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-pickle \
- ${PYTHON_PN}-threading \
- "
diff --git a/meta-python/recipes-devtools/python/python-backports-ssl_3.5.0.1.bb b/meta-python/recipes-devtools/python/python-backports-ssl_3.5.0.1.bb
deleted file mode 100644
index 45492daa6e..0000000000
--- a/meta-python/recipes-devtools/python/python-backports-ssl_3.5.0.1.bb
+++ /dev/null
@@ -1,18 +0,0 @@
-SUMMARY = "The ssl.match_hostname() function from Python 3.4"
-DESCRIPTION = "The Secure Sockets layer is only actually secure if you check the hostname in the \
-certificate returned by the server to which you are connecting, and verify that it matches to hostname \
-that you are trying to reach. But the matching logic, defined in RFC2818, can be a bit tricky to implement \
-on your own. So the ssl package in the Standard Library of Python 3.2 and greater now includes a \
-match_hostname() function for performing this check instead of requiring every application to \
-implement the check separately. This backport brings match_hostname() to users of earlier versions of Python"
-
-LICENSE = "GPLv2"
-LIC_FILES_CHKSUM = "file://PKG-INFO;md5=95a5ee8fd779fbeca8b4cbca64433c87"
-
-SRC_URI[md5sum] = "c03fc5e2c7b3da46b81acf5cbacfe1e6"
-SRC_URI[sha256sum] = "502ad98707319f4a51fa2ca1c677bd659008d27ded9f6380c79e8932e38dcdf2"
-
-PYPI_PACKAGE = "backports.ssl_match_hostname"
-inherit pypi setuptools
-
-RDEPENDS_${PN} += "${PYTHON_PN}-pkgutil"
diff --git a/meta-python/recipes-devtools/python/python-bcrypt.inc b/meta-python/recipes-devtools/python/python-bcrypt.inc
deleted file mode 100644
index 449096978f..0000000000
--- a/meta-python/recipes-devtools/python/python-bcrypt.inc
+++ /dev/null
@@ -1,17 +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] = "8408abc974446e64862a9742104e97b6"
-SRC_URI[sha256sum] = "67ed1a374c9155ec0840214ce804616de49c3df9c5bc66740687c1c9b1cd9e8d"
-
-inherit pypi
-
-RDEPENDS_${PN}_class-target += "\
- ${PYTHON_PN}-cffi \
- ${PYTHON_PN}-ctypes \
- ${PYTHON_PN}-shell \
- ${PYTHON_PN}-six \
-"
diff --git a/meta-python/recipes-devtools/python/python-bcrypt_3.1.4.bb b/meta-python/recipes-devtools/python/python-bcrypt_3.1.4.bb
deleted file mode 100644
index b136aa4895..0000000000
--- a/meta-python/recipes-devtools/python/python-bcrypt_3.1.4.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-inherit setuptools
-require python-bcrypt.inc
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-subprocess \
-"
diff --git a/meta-python/recipes-devtools/python/python-beautifulsoup4.inc b/meta-python/recipes-devtools/python/python-beautifulsoup4.inc
deleted file mode 100644
index acf52dd7d1..0000000000
--- a/meta-python/recipes-devtools/python/python-beautifulsoup4.inc
+++ /dev/null
@@ -1,17 +0,0 @@
-SUMMARY = "Screen-scraping library"
-HOMEPAGE = " https://www.crummy.com/software/BeautifulSoup/bs4"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://COPYING.txt;md5=f2d38d8a40bf73fd4b3d16ca2e5882d1"
-
-SRC_URI[md5sum] = "be03d778cf61cf6734a480e2010d6657"
-SRC_URI[sha256sum] = "6135db2ba678168c07950f9a16c4031822c6f4aec75a65e0a97bc5ca09789931"
-
-inherit pypi
-
-RDEPENDS_${PN}_class-target = "\
- ${PYTHON_PN}-core \
- ${PYTHON_PN}-html5lib \
- ${PYTHON_PN}-lxml \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-beautifulsoup4_4.8.1.bb b/meta-python/recipes-devtools/python/python-beautifulsoup4_4.8.1.bb
deleted file mode 100644
index 907285ac10..0000000000
--- a/meta-python/recipes-devtools/python/python-beautifulsoup4_4.8.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-beautifulsoup4.inc
diff --git a/meta-python/recipes-devtools/python/python-behave.inc b/meta-python/recipes-devtools/python/python-behave.inc
deleted file mode 100644
index ded75801dd..0000000000
--- a/meta-python/recipes-devtools/python/python-behave.inc
+++ /dev/null
@@ -1,15 +0,0 @@
-SUMMARY = "A behavior-driven development framework, Python style"
-HOMEPAGE = "https://github.com/behave/behave"
-LICENSE = "BSD-2-Clause"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=d950439e8ea6ed233e4288f5e1a49c06"
-
-SRC_URI[md5sum] = "3f05c859a1c45f5ed33e925817ad887d"
-SRC_URI[sha256sum] = "b9662327aa53294c1351b0a9c369093ccec1d21026f050c3bd9b3e5cccf81a86"
-
-inherit pypi
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-parse-type \
- ${PYTHON_PN}-setuptools \
- ${PYTHON_PN}-six \
- "
diff --git a/meta-python/recipes-devtools/python/python-behave_1.2.6.bb b/meta-python/recipes-devtools/python/python-behave_1.2.6.bb
deleted file mode 100644
index 66221682a0..0000000000
--- a/meta-python/recipes-devtools/python/python-behave_1.2.6.bb
+++ /dev/null
@@ -1,8 +0,0 @@
-inherit setuptools
-require python-behave.inc
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-argparse \
- ${PYTHON_PN}-enum34 \
- ${PYTHON_PN}-traceback2 \
- "
diff --git a/meta-python/recipes-devtools/python/python-bitarray.inc b/meta-python/recipes-devtools/python/python-bitarray.inc
deleted file mode 100644
index 480f048b75..0000000000
--- a/meta-python/recipes-devtools/python/python-bitarray.inc
+++ /dev/null
@@ -1,11 +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;md5=f4ce1ae80a385140f0ddb2bcef410b06"
-
-SRC_URI[md5sum] = "f3131ac2a277f3b70dbb6132ca8f8889"
-SRC_URI[sha256sum] = "050cd30b810ddb3aa941e7ddfbe0d8065e793012d0a88cb5739ec23624b9895e"
-
-inherit pypi
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-bitarray_0.8.3.bb b/meta-python/recipes-devtools/python/python-bitarray_0.8.3.bb
deleted file mode 100644
index f78c7abd23..0000000000
--- a/meta-python/recipes-devtools/python/python-bitarray_0.8.3.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-bitarray.inc
diff --git a/meta-python/recipes-devtools/python/python-blinker.inc b/meta-python/recipes-devtools/python/python-blinker.inc
deleted file mode 100644
index eaf3908370..0000000000
--- a/meta-python/recipes-devtools/python/python-blinker.inc
+++ /dev/null
@@ -1,7 +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"
-
diff --git a/meta-python/recipes-devtools/python/python-blinker_1.4.bb b/meta-python/recipes-devtools/python/python-blinker_1.4.bb
deleted file mode 100644
index bc4164e974..0000000000
--- a/meta-python/recipes-devtools/python/python-blinker_1.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-blinker.inc
diff --git a/meta-python/recipes-devtools/python/python-cachetools.inc b/meta-python/recipes-devtools/python/python-cachetools.inc
deleted file mode 100644
index 9c793808fd..0000000000
--- a/meta-python/recipes-devtools/python/python-cachetools.inc
+++ /dev/null
@@ -1,16 +0,0 @@
-SUMMARY = "Extensible memoizing collections and decorators"
-HOMEPAGE = "https://github.com/tkem/cachetools"
-DESCRIPTION = "This module provides various memoizing \
-collections and decorators, including variants of the \
-Python 3 Standard Library @lru_cache function decorator."
-SECTION = "devel/python"
-
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=27f7518eb6f7dc686d0f953b2f28dae5"
-
-inherit pypi
-
-SRC_URI[md5sum] = "91aa9b611b6345154df84e8e37746f41"
-SRC_URI[sha256sum] = "8ea2d3ce97850f31e4a08b0e2b5e6c34997d7216a9d2c98e0f3978630d4da69a"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-cachetools_3.1.1.bb b/meta-python/recipes-devtools/python/python-cachetools_3.1.1.bb
deleted file mode 100644
index 8c12ad042f..0000000000
--- a/meta-python/recipes-devtools/python/python-cachetools_3.1.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-cachetools.inc
diff --git a/meta-python/recipes-devtools/python/python-can.inc b/meta-python/recipes-devtools/python/python-can.inc
deleted file mode 100644
index 46f085933f..0000000000
--- a/meta-python/recipes-devtools/python/python-can.inc
+++ /dev/null
@@ -1,18 +0,0 @@
-SUMMARY = "Controller Area Network (CAN) interface module for Python"
-SECTION = "devel/python"
-LICENSE = "LGPLv3"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=38138baa100d7259934590850bc0406e"
-
-SRC_URI[md5sum] = "dcdd3f6b924e3f20acb1ccf4598236cf"
-SRC_URI[sha256sum] = "b5e93b2ee32bdd597d9d908afe5171c402a04c9678ba47b60f33506738b1375b"
-
-PYPI_PACKAGE="python-can"
-
-RDEPENDS_${PN}_class-target += "\
- ${PYTHON_PN}-ctypes \
- ${PYTHON_PN}-logging \
- ${PYTHON_PN}-misc \
- ${PYTHON_PN}-netserver \
- ${PYTHON_PN}-sqlite3 \
- ${PYTHON_PN}-wrapt \
-"
diff --git a/meta-python/recipes-devtools/python/python-can_2.2.1.bb b/meta-python/recipes-devtools/python/python-can_2.2.1.bb
deleted file mode 100644
index f0edb6408b..0000000000
--- a/meta-python/recipes-devtools/python/python-can_2.2.1.bb
+++ /dev/null
@@ -1,8 +0,0 @@
-require python-can.inc
-inherit pypi setuptools
-
-RDEPENDS_${PN}_class-target += "\
- ${PYTHON_PN}-argparse \
- ${PYTHON_PN}-subprocess \
- ${PYTHON_PN}-zlib \
-"
diff --git a/meta-python/recipes-devtools/python/python-certifi.inc b/meta-python/recipes-devtools/python/python-certifi.inc
deleted file mode 100644
index de02d9a4ab..0000000000
--- a/meta-python/recipes-devtools/python/python-certifi.inc
+++ /dev/null
@@ -1,13 +0,0 @@
-SUMMARY = "Python package for providing Mozilla's CA Bundle."
-DESCRIPTION = "This installable Python package contains a CA Bundle that you can reference in your \
-Python code. This is useful for verifying HTTP requests, for example. This is the same CA Bundle \
-which ships with the Requests codebase, and is derived from Mozilla Firefox's canonical set."
-HOMEPAGE = " http://certifi.io/"
-
-LICENSE = "ISC"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=f77f61d14ee6feac4228d3ebd26cc1f1"
-
-SRC_URI[md5sum] = "cadd4e373fc08f649fa39b82aed9ad96"
-SRC_URI[sha256sum] = "e4f3620cfea4f83eedc95b24abd9cd56f3c4b146dd0177e83a21b4eb49e21e50"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-certifi_2019.9.11.bb b/meta-python/recipes-devtools/python/python-certifi_2019.9.11.bb
deleted file mode 100644
index adfe6238ec..0000000000
--- a/meta-python/recipes-devtools/python/python-certifi_2019.9.11.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-certifi.inc
diff --git a/meta-python/recipes-devtools/python/python-cffi.inc b/meta-python/recipes-devtools/python/python-cffi.inc
deleted file mode 100644
index 07baa2daf7..0000000000
--- a/meta-python/recipes-devtools/python/python-cffi.inc
+++ /dev/null
@@ -1,17 +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[md5sum] = "2c90be6d3bfbf80ab732b28fd677051d"
-SRC_URI[sha256sum] = "8fe230f612c18af1df6f348d02d682fe2c28ca0a6c3856c99599cdacae7cf226"
-
-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/python-cffi_1.13.0.bb b/meta-python/recipes-devtools/python/python-cffi_1.13.0.bb
deleted file mode 100644
index bc667b8056..0000000000
--- a/meta-python/recipes-devtools/python/python-cffi_1.13.0.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-require python-cffi.inc
-inherit pypi setuptools
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-subprocess \
-"
diff --git a/meta-python/recipes-devtools/python/python-chardet.inc b/meta-python/recipes-devtools/python/python-chardet.inc
deleted file mode 100644
index 6305299780..0000000000
--- a/meta-python/recipes-devtools/python/python-chardet.inc
+++ /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"
-
-inherit pypi
-
-# setup.py of chardet needs this.
-DEPENDS += "${PYTHON_PN}-pytest-runner-native"
-
-SRC_URI[md5sum] = "7dd1ba7f9c77e32351b0a0cfacf4055c"
-SRC_URI[sha256sum] = "84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"
-
-BBCLASSEXTEND = "native nativesdk"
-
-PACKAGES =+ "${PN}-cli"
-RDEPENDS_${PN}-cli = "${PN} "
-FILES_${PN}-cli += " \
- ${PYTHON_SITEPACKAGES_DIR}/chardet/cli \
-"
-
-RDEPENDS_${PN}_class-target += " \
- ${PYTHON_PN}-logging \
-"
diff --git a/meta-python/recipes-devtools/python/python-chardet_3.0.4.bb b/meta-python/recipes-devtools/python/python-chardet_3.0.4.bb
deleted file mode 100644
index 3b6feeef11..0000000000
--- a/meta-python/recipes-devtools/python/python-chardet_3.0.4.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-inherit setuptools
-require python-chardet.inc
-
-RDEPENDS_${PN} += "${PYTHON_PN}-argparse"
diff --git a/meta-python/recipes-devtools/python/python-cheetah_2.4.4.bb b/meta-python/recipes-devtools/python/python-cheetah_2.4.4.bb
deleted file mode 100644
index 20fc2fdc3f..0000000000
--- a/meta-python/recipes-devtools/python/python-cheetah_2.4.4.bb
+++ /dev/null
@@ -1,16 +0,0 @@
-SUMMARY = "Python template engine and code generation tool"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=aff1107514aa6aae948f9fe71fdc393b"
-
-PR = "r3"
-
-PYPI_PACKAGE = "Cheetah"
-inherit pypi setuptools
-
-RDEPENDS_${PN} = "python-pickle python-pprint"
-RDEPENDS_${PN}_class-native = ""
-
-BBCLASSEXTEND = "native nativesdk"
-
-SRC_URI[md5sum] = "853917116e731afbc8c8a43c37e6ddba"
-SRC_URI[sha256sum] = "be308229f0c1e5e5af4f27d7ee06d90bb19e6af3059794e5fd536a6f29a9b550"
diff --git a/meta-python/recipes-devtools/python/python-click.inc b/meta-python/recipes-devtools/python/python-click.inc
deleted file mode 100644
index 60bc46f821..0000000000
--- a/meta-python/recipes-devtools/python/python-click.inc
+++ /dev/null
@@ -1,25 +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"
-LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=c13ed890b210a882c1778216694c98c7"
-
-SRC_URI[md5sum] = "7f53d50f7b7373ebc7963f9ff697450a"
-SRC_URI[sha256sum] = "5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7"
-
-UPSTREAM_CHECK_REGEX = "click/(?P<pver>\d+(\.\d+)+)/"
-
-CLEANBROKEN = "1"
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-io \
- ${PYTHON_PN}-threading \
- "
-
-BBCLASSEXTEND = "native nativesdk"
-
-PYPI_PACKAGE = "Click"
diff --git a/meta-python/recipes-devtools/python/python-click_7.0.bb b/meta-python/recipes-devtools/python/python-click_7.0.bb
deleted file mode 100644
index f63e27c843..0000000000
--- a/meta-python/recipes-devtools/python/python-click_7.0.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-inherit pypi setuptools
-require python-click.inc
-
-RDEPENDS_${PN} += "${PYTHON_PN}-contextlib"
diff --git a/meta-python/recipes-devtools/python/python-cmd2.inc b/meta-python/recipes-devtools/python/python-cmd2.inc
deleted file mode 100644
index 7782b14477..0000000000
--- a/meta-python/recipes-devtools/python/python-cmd2.inc
+++ /dev/null
@@ -1,13 +0,0 @@
-SUMMARY = "Extra features for standard library's cmd module"
-HOMEPAGE = "http://packages.python.org/cmd2/"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=01aeabea7ae1529a8e4b674b7107d6bc"
-
-SRC_URI[md5sum] = "f7a51dc68ad377ebc6a84408044dc1a2"
-SRC_URI[sha256sum] = "840cdbf50e83761fea69ca5beadcba7569ab03734e3ee42b0dbf7f6f90e1213d"
-
-inherit pypi
-
-DEPENDS += "${PYTHON_PN}-setuptools-scm-native"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-cmd2_0.9.18.bb b/meta-python/recipes-devtools/python/python-cmd2_0.9.18.bb
deleted file mode 100644
index 17b6ae2858..0000000000
--- a/meta-python/recipes-devtools/python/python-cmd2_0.9.18.bb
+++ /dev/null
@@ -1,14 +0,0 @@
-inherit setuptools
-require python-cmd2.inc
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-doctest \
- ${PYTHON_PN}-pyparsing \
- ${PYTHON_PN}-pyperclip \
- ${PYTHON_PN}-shell \
- ${PYTHON_PN}-six \
- ${PYTHON_PN}-stringold \
- ${PYTHON_PN}-subprocess \
- ${PYTHON_PN}-threading \
- ${PYTHON_PN}-textutils \
- "
diff --git a/meta-python/recipes-devtools/python/python-coloredlogs.inc b/meta-python/recipes-devtools/python/python-coloredlogs.inc
deleted file mode 100644
index f43bea1f74..0000000000
--- a/meta-python/recipes-devtools/python/python-coloredlogs.inc
+++ /dev/null
@@ -1,24 +0,0 @@
-DESCRIPTION = "Colored terminal output for Python's logging module"
-HOMEPAGE = "https://coloredlogs.readthedocs.io"
-SECTION = "devel/python"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=690da298a43805797a4fa7bbe180b3c6"
-
-SRC_URI[md5sum] = "0a186966a1955fff8cf9489373e691d9"
-SRC_URI[sha256sum] = "b869a2dda3fa88154b9dd850e27828d8755bfab5a838a1c97fbc850c6e377c36"
-
-inherit pypi
-
-do_compile_prepend() {
- sed -ie "s/find_pth_directory(),/'',/g" setup.py
-}
-
-do_install_append() {
- rm -rf ${D}${datadir}
-}
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-humanfriendly \
-"
-
-BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python-coloredlogs_10.0.bb b/meta-python/recipes-devtools/python/python-coloredlogs_10.0.bb
deleted file mode 100644
index 0fc1b258c0..0000000000
--- a/meta-python/recipes-devtools/python/python-coloredlogs_10.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-coloredlogs.inc
diff --git a/meta-python/recipes-devtools/python/python-configparser.inc b/meta-python/recipes-devtools/python/python-configparser.inc
deleted file mode 100644
index a1fb6cd29d..0000000000
--- a/meta-python/recipes-devtools/python/python-configparser.inc
+++ /dev/null
@@ -1,11 +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[md5sum] = "bc1558ed941cb1acb80ff650726d5af8"
-SRC_URI[sha256sum] = "bc37850f0cc42a1725a796ef7d92690651bf1af37d744cc63161dac62cabee17"
-
-inherit pypi
diff --git a/meta-python/recipes-devtools/python/python-configparser_3.8.1.bb b/meta-python/recipes-devtools/python/python-configparser_3.8.1.bb
deleted file mode 100644
index 69f045dbab..0000000000
--- a/meta-python/recipes-devtools/python/python-configparser_3.8.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-configparser.inc
diff --git a/meta-python/recipes-devtools/python/python-constantly.inc b/meta-python/recipes-devtools/python/python-constantly.inc
deleted file mode 100644
index 8153504929..0000000000
--- a/meta-python/recipes-devtools/python/python-constantly.inc
+++ /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
-
-RDEPENDS_${PN} += "${PYTHON_PN}-json"
diff --git a/meta-python/recipes-devtools/python/python-constantly_15.1.0.bb b/meta-python/recipes-devtools/python/python-constantly_15.1.0.bb
deleted file mode 100644
index 29b15eb605..0000000000
--- a/meta-python/recipes-devtools/python/python-constantly_15.1.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-constantly.inc
diff --git a/meta-python/recipes-devtools/python/python-crcmod.inc b/meta-python/recipes-devtools/python/python-crcmod.inc
deleted file mode 100644
index 85da7cb3c2..0000000000
--- a/meta-python/recipes-devtools/python/python-crcmod.inc
+++ /dev/null
@@ -1,14 +0,0 @@
-SUMMARY = "A Python module for generating objects that compute the Cyclic Redundancy Check."
-HOMEPAGE = "https://pypi.org/project/crcmod"
-LICENSE = "MIT"
-SECTION = "devel/python"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=f9a19291627cad2d1dfbfcf3c9fb85c2"
-
-SRC_URI[md5sum] = "2d5b92117d958dcead94f9e17f54cd32"
-SRC_URI[sha256sum] = "dc7051a0db5f2bd48665a990d3ec1cc305a466a77358ca4492826f41f283601e"
-
-inherit pypi
-
-RDEPENDS_${PN} += "${PYTHON_PN}-unittest"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-crcmod_1.7.bb b/meta-python/recipes-devtools/python/python-crcmod_1.7.bb
deleted file mode 100644
index 45b9a2ce66..0000000000
--- a/meta-python/recipes-devtools/python/python-crcmod_1.7.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-crcmod.inc
diff --git a/meta-python/recipes-devtools/python/python-cryptography-vectors.inc b/meta-python/recipes-devtools/python/python-cryptography-vectors.inc
deleted file mode 100644
index 887d2d3d3f..0000000000
--- a/meta-python/recipes-devtools/python/python-cryptography-vectors.inc
+++ /dev/null
@@ -1,18 +0,0 @@
-SUMMARY = "Test vectors for the cryptography package."
-HOMEPAGE = "https://cryptography.io/"
-SECTION = "devel/python"
-LICENSE = "Apache-2.0 | BSD"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=8c3617db4fb6fae01f1d253ab91511e4"
-
-DEPENDS += " \
- ${PYTHON_PN}-cryptography \
-"
-
-SRC_URI[md5sum] = "1a518a28ed9c924ca6c570aa8ea0c334"
-SRC_URI[sha256sum] = "f12dfb9bd669a68004074cb5b26df6e93ed1a95ebd1a999dff0a840212ff68bc"
-
-PYPI_PACKAGE = "cryptography_vectors"
-
-BBCLASSEXTEND = "native nativesdk"
-
-UPSTREAM_CHECK_REGEX = ""
diff --git a/meta-python/recipes-devtools/python/python-cryptography-vectors_2.7.bb b/meta-python/recipes-devtools/python/python-cryptography-vectors_2.7.bb
deleted file mode 100644
index 4975278a99..0000000000
--- a/meta-python/recipes-devtools/python/python-cryptography-vectors_2.7.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-cryptography-vectors.inc
diff --git a/meta-python/recipes-devtools/python/python-cryptography.inc b/meta-python/recipes-devtools/python/python-cryptography.inc
deleted file mode 100644
index 876fcc273d..0000000000
--- a/meta-python/recipes-devtools/python/python-cryptography.inc
+++ /dev/null
@@ -1,58 +0,0 @@
-SUMMARY = "Provides cryptographic recipes and primitives to python developers"
-HOMEPAGE = "https://cryptography.io/"
-LICENSE = "Apache-2.0 | BSD"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=097f805837700cfac572ac274cd38124"
-
-LDSHARED += "-pthread"
-
-DEPENDS += " \
- ${PYTHON_PN}-cffi \
- ${PYTHON_PN}-cffi-native \
- ${PYTHON_PN}-asn1crypto \
- ${PYTHON_PN}-six \
-"
-
-SRC_URI[md5sum] = "7dfe1035cae43569e571318f000462a4"
-SRC_URI[sha256sum] = "e6347742ac8f35ded4a46ff835c60e68c22a536a8ae5c4422966d06946b6d4c6"
-
-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/python-cryptography_2.7.bb b/meta-python/recipes-devtools/python/python-cryptography_2.7.bb
deleted file mode 100644
index 9c2f88418d..0000000000
--- a/meta-python/recipes-devtools/python/python-cryptography_2.7.bb
+++ /dev/null
@@ -1,22 +0,0 @@
-inherit pypi setuptools
-require python-cryptography.inc
-
-SRC_URI += " \
- file://run-ptest \
-"
-
-DEPENDS += " \
- ${PYTHON_PN}-enum34 \
-"
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-enum34 \
- ${PYTHON_PN}-ipaddress \
-"
-
-RDEPENDS_${PN}_class-target += " \
- ${PYTHON_PN}-enum34 \
- ${PYTHON_PN}-ipaddress \
- ${PYTHON_PN}-contextlib \
- ${PYTHON_PN}-subprocess \
-"
diff --git a/meta-python/recipes-devtools/python/python-cython.inc b/meta-python/recipes-devtools/python/python-cython.inc
deleted file mode 100644
index 426159465a..0000000000
--- a/meta-python/recipes-devtools/python/python-cython.inc
+++ /dev/null
@@ -1,40 +0,0 @@
-DESCRIPTION = "Cython is a language specially designed for writing Python extension modules. \
-It's designed to bridge the gap between the nice, high-level, easy-to-use world of Python \
-and the messy, low-level world of C."
-SECTION = "devel/python"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=e23fadd6ceef8c618fc1c65191d846fa"
-PYPI_PACKAGE = "Cython"
-BBCLASSEXTEND = "native nativesdk"
-
-SRC_URI[md5sum] = "f8109a2a86cded40b3896ee7a63bc5a5"
-SRC_URI[sha256sum] = "c29d069a4a30f472482343c866f7486731ad638ef9af92bfe5fca9c7323d638e"
-
-inherit pypi
-
-RDEPENDS_${PN}_class-target += "\
- ${PYTHON_PN}-misc \
- ${PYTHON_PN}-netserver \
- ${PYTHON_PN}-pkgutil \
- ${PYTHON_PN}-pyparsing \
- ${PYTHON_PN}-setuptools \
- ${PYTHON_PN}-shell \
- ${PYTHON_PN}-xml \
-"
-
-RDEPENDS_${PN}_class-nativesdk += "\
- nativesdk-${PYTHON_PN}-misc \
- nativesdk-${PYTHON_PN}-netserver \
- nativesdk-${PYTHON_PN}-pkgutil \
- nativesdk-${PYTHON_PN}-pyparsing \
- nativesdk-${PYTHON_PN}-setuptools \
- nativesdk-${PYTHON_PN}-shell \
- nativesdk-${PYTHON_PN}-xml \
-"
-
-do_install_append() {
- # Make sure we use /usr/bin/env python
- for PYTHSCRIPT in `grep -rIl '^#!.*python' ${D}`; do
- sed -i -e '1s|^#!.*|#!/usr/bin/env ${PYTHON_PN}|' $PYTHSCRIPT
- done
-}
diff --git a/meta-python/recipes-devtools/python/python-cython_0.29.13.bb b/meta-python/recipes-devtools/python/python-cython_0.29.13.bb
deleted file mode 100644
index d803a6ed4c..0000000000
--- a/meta-python/recipes-devtools/python/python-cython_0.29.13.bb
+++ /dev/null
@@ -1,10 +0,0 @@
-inherit setuptools
-require python-cython.inc
-
-UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/Cython/"
-UPSTREAM_CHECK_REGEX = "/Cython/(?P<pver>(\d+[\.\-_]*)+)"
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-distribute \
- ${PYTHON_PN}-subprocess \
-"
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-daemon_2.1.2.bb b/meta-python/recipes-devtools/python/python-daemon_2.1.2.bb
deleted file mode 100644
index 002da046c4..0000000000
--- a/meta-python/recipes-devtools/python/python-daemon_2.1.2.bb
+++ /dev/null
@@ -1,27 +0,0 @@
-DESCRIPTION = "Library to implement a well-behaved Unix daemon process"
-HOMEPAGE = "https://pagure.io/python-daemon/"
-SECTION = "devel/python"
-
-DEPENDS += "python-docutils-native"
-RDEPENDS_${PN} = "python-docutils \
- python-lockfile (>= 0.10) \
- python-resource \
-"
-
-LICENSE = "Apache-2.0 & GPLv3"
-LIC_FILES_CHKSUM = "file://README;md5=2695c853a2cafc33e68a1d972889ebd2"
-
-inherit pypi setuptools
-
-SRC_URI[md5sum] = "9c57343d81f2a96c51cffeab982b04d2"
-SRC_URI[sha256sum] = "261c859be5c12ae7d4286dc6951e87e9e1a70a882a8b41fd926efc1ec4214f73"
-
-# Fix for build error in Yocto:
-# i = p.rfind('/') + 1
-# AttributeError: 'NoneType' object has no attribute 'rfind'
-#S = "${WORKDIR}/python-daemon"
-SRC_URI_append = " \
- file://0001-Workaround-for-issue-2-1.patch \
-"
-
-PYPI_PACKAGE = "python-daemon"
diff --git a/meta-python/recipes-devtools/python/python-daemonize_2.4.7.bb b/meta-python/recipes-devtools/python/python-daemonize_2.4.7.bb
deleted file mode 100644
index 98f23aba10..0000000000
--- a/meta-python/recipes-devtools/python/python-daemonize_2.4.7.bb
+++ /dev/null
@@ -1,16 +0,0 @@
-SUMMARY = "Library to enable your code run as a daemon process on Unix-like systems"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=13e982bf1b7b164b9d6d1665dac83873"
-SRCNAME = "daemonize"
-
-inherit pypi setuptools
-
-RDEPENDS_${PN} = "\
- python-fcntl \
- python-unixadmin \
- python-logging \
- python-resource \
-"
-
-SRC_URI[md5sum] = "6759005b12dfeea0d4305f8536b4b0c2"
-SRC_URI[sha256sum] = "c0194e861826be456c7c69985825ac7b79632d8ac7ad4cde8e12fee7971468c8"
diff --git a/meta-python/recipes-devtools/python/python-dateutil.inc b/meta-python/recipes-devtools/python/python-dateutil.inc
deleted file mode 100644
index 8cc2373cd8..0000000000
--- a/meta-python/recipes-devtools/python/python-dateutil.inc
+++ /dev/null
@@ -1,25 +0,0 @@
-SUMMARY = "Extensions to the standard Python datetime module"
-DESCRIPTION = "The dateutil module provides powerful extensions to the datetime module available in the Python standard library."
-HOMEPAGE = "https://dateutil.readthedocs.org"
-LICENSE = "BSD-3-Clause & Apache-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=e3155c7bdc71f66e02678411d2abf996"
-
-SRC_URI[md5sum] = "354db28843d949f1bc3e49e8458e22df"
-SRC_URI[sha256sum] = "c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9e"
-
-PYPI_PACKAGE = "python-dateutil"
-inherit pypi
-
-PACKAGES =+ "${PN}-zoneinfo"
-FILES_${PN}-zoneinfo = "${libdir}/${PYTHON_DIR}/site-packages/dateutil/zoneinfo"
-
-DEPENDS += "${PYTHON_PN}-setuptools-scm-native"
-
-RDEPENDS_${PN}_class-target = "\
- ${PYTHON_PN}-datetime \
- ${PYTHON_PN}-numbers \
- ${PYTHON_PN}-six \
- ${PYTHON_PN}-stringold \
-"
-
-BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python-dateutil_2.8.0.bb b/meta-python/recipes-devtools/python/python-dateutil_2.8.0.bb
deleted file mode 100644
index 12ae4c3118..0000000000
--- a/meta-python/recipes-devtools/python/python-dateutil_2.8.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-dateutil.inc
diff --git a/meta-python/recipes-devtools/python/python-dbus_1.2.12.bb b/meta-python/recipes-devtools/python/python-dbus_1.2.12.bb
deleted file mode 100644
index f08fa20a13..0000000000
--- a/meta-python/recipes-devtools/python/python-dbus_1.2.12.bb
+++ /dev/null
@@ -1,32 +0,0 @@
-SUMMARY = "Python bindings for the DBus inter-process communication system"
-SECTION = "devel/python"
-HOMEPAGE = "http://www.freedesktop.org/Software/dbus"
-LICENSE = "MIT & AFL-2.1 | GPLv2"
-LIC_FILES_CHKSUM = "file://COPYING;md5=b03240518994df6d8c974675675e5ca4 \
- file://dbus-gmain/COPYING;md5=99fece6728a80737c8fd3e7c734c17c4 "
-DEPENDS = "expat dbus dbus-glib virtual/libintl python-pyrex-native"
-
-SRC_URI = "http://dbus.freedesktop.org/releases/dbus-python/dbus-python-${PV}.tar.gz \
-"
-
-SRC_URI[md5sum] = "428b7a9e7e2d154a7ceb3e13536283e4"
-SRC_URI[sha256sum] = "cdd4de2c4f5e58f287b12013ed7b41dee81d503c8d0d2397c5bd2fb01badf260"
-S = "${WORKDIR}/dbus-python-${PV}"
-
-inherit distutils-base autotools pkgconfig
-
-# documentation needs python-sphinx, which is not in oe-core or meta-python for now
-# change to use PACKAGECONFIG when python-sphinx is added to oe-core or meta-python
-EXTRA_OECONF += "--disable-documentation"
-
-export STAGING_LIBDIR
-export STAGING_INCDIR
-
-RDEPENDS_${PN} = "python-io python-logging python-stringold python-threading python-xml"
-
-FILES_${PN}-dev += "${libdir}/pkgconfig"
-
-do_install_append() {
- # Remove files that clash with python3-dbus; their content is same
- rm ${D}${includedir}/dbus-1.0/dbus/dbus-python.h ${D}${libdir}/pkgconfig/dbus-python.pc
-}
diff --git a/meta-python/recipes-devtools/python/python-dbusmock/0001-Add-functionality-to-add-own-objects-to-internal-obj.patch b/meta-python/recipes-devtools/python/python-dbusmock/0001-Add-functionality-to-add-own-objects-to-internal-obj.patch
deleted file mode 100644
index c4d817849f..0000000000
--- a/meta-python/recipes-devtools/python/python-dbusmock/0001-Add-functionality-to-add-own-objects-to-internal-obj.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-From c4436fd42f2936e5fb0f95434d06e45aa9959ca0 Mon Sep 17 00:00:00 2001
-From: Simon Busch <simon.busch@lge.com>
-Date: Wed, 9 Apr 2014 13:18:33 +0200
-Subject: [PATCH] Add functionality to add own objects to internal object
-
- list
-
-In some case the tests might want to create dynamically dbus objects which extended
-functionality from own class definitions within templates. In such cases we need to
-register those objects with the internal object manager of dbusmock.
-
-Signed-off-by: Simon Busch <simon.busch@lge.com>
-
----
- dbusmock/__init__.py | 4 ++--
- dbusmock/mockobject.py | 8 ++++++++
- 2 files changed, 10 insertions(+), 2 deletions(-)
-
-diff --git a/dbusmock/__init__.py b/dbusmock/__init__.py
-index 8a482ab..3d5d71a 100644
---- a/dbusmock/__init__.py
-+++ b/dbusmock/__init__.py
-@@ -14,8 +14,8 @@ __license__ = 'LGPL 3+'
- __version__ = '0.16.7'
-
- from dbusmock.mockobject import (DBusMockObject, MOCK_IFACE,
-- OBJECT_MANAGER_IFACE, get_object, get_objects)
-+ OBJECT_MANAGER_IFACE, get_object, get_objects, add_object)
- from dbusmock.testcase import DBusTestCase
-
- __all__ = ['DBusMockObject', 'MOCK_IFACE', 'OBJECT_MANAGER_IFACE',
-- 'DBusTestCase', 'get_object', 'get_objects']
-+ 'DBusTestCase', 'get_object', 'get_objects', 'add_object']
-diff --git a/dbusmock/mockobject.py b/dbusmock/mockobject.py
-index 586dbad..e4f130f 100644
---- a/dbusmock/mockobject.py
-+++ b/dbusmock/mockobject.py
-@@ -688,6 +688,14 @@ dbus.service._method_lookup = _dbusmock_method_lookup
- # Helper API for templates
- #
-
-+def add_object(path, obj):
-+ if path in objects:
-+ raise dbus.exceptions.DBusException(
-+ 'org.freedesktop.DBus.Mock.NameError',
-+ 'object %s already exists' % path)
-+
-+ objects[path] = obj
-+
-
- def get_objects():
- '''Return all existing object paths'''
diff --git a/meta-python/recipes-devtools/python/python-dbusmock/0002-Add-possibility-to-import-templates-from-packages.patch b/meta-python/recipes-devtools/python/python-dbusmock/0002-Add-possibility-to-import-templates-from-packages.patch
deleted file mode 100644
index 06ab1f05e2..0000000000
--- a/meta-python/recipes-devtools/python/python-dbusmock/0002-Add-possibility-to-import-templates-from-packages.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 03bd5cb77c54033857810bb17562859eefa41221 Mon Sep 17 00:00:00 2001
-From: Simon Busch <simon.busch@lge.com>
-Date: Wed, 9 Apr 2014 13:20:33 +0200
-Subject: [PATCH] Add possibility to import templates from packages
-
-Does not have any unit tests yet.
-
-Signed-off-by: Simon Busch <simon.busch@lge.com>
-
----
- dbusmock/mockobject.py | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/dbusmock/mockobject.py b/dbusmock/mockobject.py
-index e4f130f..389df70 100644
---- a/dbusmock/mockobject.py
-+++ b/dbusmock/mockobject.py
-@@ -46,6 +46,9 @@ def load_module(name):
- exec(f.read(), mod.__dict__, mod.__dict__)
- return mod
-
-+ if '.' in name:
-+ return importlib.import_module(name)
-+
- return importlib.import_module('dbusmock.templates.' + name)
-
-
diff --git a/meta-python/recipes-devtools/python/python-dbusmock_0.16.7.bb b/meta-python/recipes-devtools/python/python-dbusmock_0.16.7.bb
deleted file mode 100644
index ec8c54aacc..0000000000
--- a/meta-python/recipes-devtools/python/python-dbusmock_0.16.7.bb
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright (c) 2014 LG Electronics, Inc.
-
-SUMMARY = "With this program/Python library you can easily create mock objects on D-Bus"
-AUTHOR = "Martin Pitt <martin.pitt@ubuntu.com>"
-
-LICENSE = "GPL-3.0"
-LIC_FILES_CHKSUM = "file://COPYING;md5=e6a600fd5e1d9cbde2d983680233ad02"
-
-SRC_URI[md5sum] = "80f8caa838fad96483a8751e11d384f9"
-SRC_URI[sha256sum] = "2d2ea892fa4633c3ec6ac1e912120ec493047a5c6522849b7d1c95ad755bce75"
-
-SRC_URI += " \
- file://0001-Add-functionality-to-add-own-objects-to-internal-obj.patch \
- file://0002-Add-possibility-to-import-templates-from-packages.patch \
-"
-
-PYPI_PACKAGE = "python-dbusmock"
-
-inherit pypi setuptools
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-dbus \
- ${PYTHON_PN}-pygobject \
- ${PYTHON_PN}-xml \
- "
diff --git a/meta-python/recipes-devtools/python/python-decorator_4.4.0.bb b/meta-python/recipes-devtools/python/python-decorator_4.4.0.bb
deleted file mode 100644
index 2a2b455f56..0000000000
--- a/meta-python/recipes-devtools/python/python-decorator_4.4.0.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-inherit setuptools
-require python-decorator.inc
-
-RDEPENDS_${PN} += "${PYTHON_PN}-contextlib"
diff --git a/meta-python/recipes-devtools/python/python-django-south.inc b/meta-python/recipes-devtools/python/python-django-south.inc
index e4f03b937d..28eb84c563 100644
--- a/meta-python/recipes-devtools/python/python-django-south.inc
+++ b/meta-python/recipes-devtools/python/python-django-south.inc
@@ -12,6 +12,6 @@ inherit pypi
BBCLASSEXTEND = "native nativesdk"
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-django \
+RDEPENDS:${PN} += "\
+ python3-django \
"
diff --git a/meta-python/recipes-devtools/python/python-django-south_1.0.2.bb b/meta-python/recipes-devtools/python/python-django-south_1.0.2.bb
deleted file mode 100644
index 357b766a3d..0000000000
--- a/meta-python/recipes-devtools/python/python-django-south_1.0.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-django-south.inc
-inherit setuptools
diff --git a/meta-python/recipes-devtools/python/python-django.inc b/meta-python/recipes-devtools/python/python-django.inc
index ee3aee638f..d9ab3fd21f 100644
--- a/meta-python/recipes-devtools/python/python-django.inc
+++ b/meta-python/recipes-devtools/python/python-django.inc
@@ -3,32 +3,31 @@ HOMEPAGE = "http://www.djangoproject.com/"
LICENSE = "BSD-3-Clause"
LIC_FILES_CHKSUM = "file://LICENSE;md5=f09eb47206614a4954c51db8a94840fa"
-SRC_URI[md5sum] = "38e82b59a1c27bbf98ccf0564ead7426"
-SRC_URI[sha256sum] = "eb9271f0874f53106a2719c0c35ce67631f6cc27cf81a60c6f8c9817b35a3f6e"
-
PYPI_PACKAGE = "Django"
inherit pypi
-UPSTREAM_CHECK_REGEX = "(?P<pver>1(\.\d+)+)"
+UPSTREAM_CHECK_REGEX = "(?P<pver>\d+(\.\d+)+)/"
-FILES_${PN} += "${datadir}/django"
+FILES:${PN} += "${datadir}/django"
BBCLASSEXTEND = "native nativesdk"
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-compression \
- ${PYTHON_PN}-ctypes \
- ${PYTHON_PN}-datetime \
- ${PYTHON_PN}-email \
- ${PYTHON_PN}-html \
- ${PYTHON_PN}-json \
- ${PYTHON_PN}-logging \
- ${PYTHON_PN}-multiprocessing \
- ${PYTHON_PN}-netserver \
- ${PYTHON_PN}-numbers \
- ${PYTHON_PN}-pkgutil \
- ${PYTHON_PN}-pytz \
- ${PYTHON_PN}-threading \
- ${PYTHON_PN}-unixadmin \
- ${PYTHON_PN}-xml \
+RDEPENDS:${PN} += "\
+ python3-compression \
+ python3-ctypes \
+ python3-datetime \
+ python3-email \
+ python3-html \
+ python3-json \
+ python3-logging \
+ python3-multiprocessing \
+ python3-netserver \
+ python3-numbers \
+ python3-pkgutil \
+ python3-pytz \
+ python3-threading \
+ python3-unixadmin \
+ python3-xml \
"
+
+CVE_PRODUCT = "django"
diff --git a/meta-python/recipes-devtools/python/python-django_1.11.14.bb b/meta-python/recipes-devtools/python/python-django_1.11.14.bb
deleted file mode 100644
index d2347cc963..0000000000
--- a/meta-python/recipes-devtools/python/python-django_1.11.14.bb
+++ /dev/null
@@ -1,8 +0,0 @@
-require python-django.inc
-inherit setuptools
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-argparse \
- ${PYTHON_PN}-subprocess \
- ${PYTHON_PN}-zlib \
-"
diff --git a/meta-python/recipes-devtools/python/python-djangorestframework_3.9.0.bb b/meta-python/recipes-devtools/python/python-djangorestframework_3.9.0.bb
deleted file mode 100644
index 540d12dc23..0000000000
--- a/meta-python/recipes-devtools/python/python-djangorestframework_3.9.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-djangorestframework.inc
-inherit setuptools \ No newline at end of file
diff --git a/meta-python/recipes-devtools/python/python-dnspython.inc b/meta-python/recipes-devtools/python/python-dnspython.inc
deleted file mode 100644
index 6a04429b7b..0000000000
--- a/meta-python/recipes-devtools/python/python-dnspython.inc
+++ /dev/null
@@ -1,20 +0,0 @@
-DESCRIPTION = "DNS toolkit for Python"
-HOMEPAGE = "http://www.dnspython.org/"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=b9d855ee0d7bea17c8b0994d37985e1e"
-
-SRC_URI[md5sum] = "05d33ffb5d8f35ae0474bb952778a344"
-SRC_URI[sha256sum] = "40f563e1f7a7b80dc5a4e76ad75c23da53d62f1e15e6e517293b04e1f84ead7c"
-
-PYPI_PACKAGE_EXT = "zip"
-
-inherit pypi
-
-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/python-dnspython_1.15.0.bb b/meta-python/recipes-devtools/python/python-dnspython_1.15.0.bb
deleted file mode 100644
index 9dbcd0ffbd..0000000000
--- a/meta-python/recipes-devtools/python/python-dnspython_1.15.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-dnspython.inc
diff --git a/meta-python/recipes-devtools/python/python-docutils_0.14rc2.bb b/meta-python/recipes-devtools/python/python-docutils_0.14rc2.bb
deleted file mode 100644
index 68436a1a54..0000000000
--- a/meta-python/recipes-devtools/python/python-docutils_0.14rc2.bb
+++ /dev/null
@@ -1,18 +0,0 @@
-SUMMARY = "Text processing system for documentation"
-HOMEPAGE = "http://docutils.sourceforge.net"
-SECTION = "devel/python"
-LICENSE = "PSF & BSD-2-Clause & GPLv3"
-LIC_FILES_CHKSUM = "file://COPYING.txt;md5=35a23d42b615470583563132872c97d6"
-
-DEPENDS = "python"
-
-SRC_URI = "${SOURCEFORGE_MIRROR}/docutils/docutils-${PV}.tar.gz"
-SRC_URI[md5sum] = "2f4bee6451958252f7bec71f18b05be3"
-SRC_URI[sha256sum] = "3caee0bcb2a49fdf24fcfa70849a60abb7a181aa68b030f7cb7494096181830c"
-
-S = "${WORKDIR}/docutils-${PV}"
-
-inherit distutils
-
-BBCLASSEXTEND = "native"
-
diff --git a/meta-python/recipes-devtools/python/python-dominate.inc b/meta-python/recipes-devtools/python/python-dominate.inc
deleted file mode 100644
index ecf74a0bc5..0000000000
--- a/meta-python/recipes-devtools/python/python-dominate.inc
+++ /dev/null
@@ -1,11 +0,0 @@
-SUMMARY = "Dominate is a Python library for creating and manipulating HTML documents using an elegant DOM API."
-LICENSE = "LGPLv3"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=b52f2d57d10c4f7ee67a7eb9615d5d24"
-
-SRC_URI[md5sum] = "45bd97e6f7888aac24ae86013c57638e"
-SRC_URI[sha256sum] = "4b8ce6f33633c9dd9175b228d21c00c801b6bd0327747cd5e17fc2da934c3a69"
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-numbers \
- ${PYTHON_PN}-threading \
- "
diff --git a/meta-python/recipes-devtools/python/python-dominate_2.3.1.bb b/meta-python/recipes-devtools/python/python-dominate_2.3.1.bb
deleted file mode 100644
index c19445e728..0000000000
--- a/meta-python/recipes-devtools/python/python-dominate_2.3.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-dominate.inc
diff --git a/meta-python/recipes-devtools/python/python-editor.inc b/meta-python/recipes-devtools/python/python-editor.inc
deleted file mode 100644
index 734ce2bd7a..0000000000
--- a/meta-python/recipes-devtools/python/python-editor.inc
+++ /dev/null
@@ -1,9 +0,0 @@
-DESCRIPTION = "Programmatically open and editor, capture the result"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=d2794c0df5b907fdace235a619d80314"
-
-SRC_URI[md5sum] = "0e52648a4a6e7c89e3be44e9456530b4"
-SRC_URI[sha256sum] = "51fda6bcc5ddbbb7063b2af7509e43bd84bfc32a4ff71349ec7847713882327b"
-
-PYPI_PACKAGE = "python-editor"
-
diff --git a/meta-python/recipes-devtools/python/python-editor_1.0.4.bb b/meta-python/recipes-devtools/python/python-editor_1.0.4.bb
deleted file mode 100644
index f7a9a8c0d5..0000000000
--- a/meta-python/recipes-devtools/python/python-editor_1.0.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-editor.inc
diff --git a/meta-python/recipes-devtools/python/python-engineio.inc b/meta-python/recipes-devtools/python/python-engineio.inc
deleted file mode 100644
index f24da1284b..0000000000
--- a/meta-python/recipes-devtools/python/python-engineio.inc
+++ /dev/null
@@ -1,13 +0,0 @@
-SUMMARY = "Engine.IO server"
-HOMEPAGE = "https://github.com/miguelgrinberg/python-engineio/"
-SECTION = "devel/python"
-
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=42d0a9e728978f0eeb759c3be91536b8"
-
-inherit pypi
-
-PYPI_PACKAGE = "python-engineio"
-
-SRC_URI[md5sum] = "11a4f18f5b08a36d07d3c0ff85e7c047"
-SRC_URI[sha256sum] = "2a4c874aea686e79f8ea9efc30748110df581df6d577d18bb5eaa1a8f2199d12"
diff --git a/meta-python/recipes-devtools/python/python-engineio_3.9.3.bb b/meta-python/recipes-devtools/python/python-engineio_3.9.3.bb
deleted file mode 100644
index 7dd6ec0e0d..0000000000
--- a/meta-python/recipes-devtools/python/python-engineio_3.9.3.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-engineio.inc
diff --git a/meta-python/recipes-devtools/python/python-enum34_1.1.6.bb b/meta-python/recipes-devtools/python/python-enum34_1.1.6.bb
deleted file mode 100644
index d50b5c7c58..0000000000
--- a/meta-python/recipes-devtools/python/python-enum34_1.1.6.bb
+++ /dev/null
@@ -1,11 +0,0 @@
-SUMMARY = "backport of Python 3.4's enum package"
-HOMEPAGE = "https://bitbucket.org/stoneleaf/enum34"
-LICENSE = "BSD-3-Clause"
-LIC_FILES_CHKSUM = "file://enum/LICENSE;md5=0a97a53a514564c20efd7b2e8976c87e"
-
-SRC_URI[md5sum] = "5f13a0841a61f7fc295c514490d120d0"
-SRC_URI[sha256sum] = "8ad8c4783bf61ded74527bffb48ed9b54166685e4230386a9ed9b1279e2df5b1"
-
-inherit pypi setuptools
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-epydoc_3.0.1.bb b/meta-python/recipes-devtools/python/python-epydoc_3.0.1.bb
deleted file mode 100644
index dd9799faf1..0000000000
--- a/meta-python/recipes-devtools/python/python-epydoc_3.0.1.bb
+++ /dev/null
@@ -1,19 +0,0 @@
-DESCRIPTION = "Epydoc is a tool for generating API documentation for Python modules, based on their docstrings"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=011c0d78eb6054d731c879132d7313f0"
-HOMEPAGE = "http://epydoc.sourceforge.net/"
-
-SRC_URI[md5sum] = "cdd6f6c76dd8bab5e653a343a0544294"
-SRC_URI[sha256sum] = "d4e5c8d90937d01b05170f592c1fa9b29e9ed0498dfe7f0eb2a3af61725b6ad1"
-
-inherit pypi distutils
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-codecs \
- ${PYTHON_PN}-pickle \
- ${PYTHON_PN}-stringold \
- ${PYTHON_PN}-re \
- ${PYTHON_PN}-xml \
- "
-
-BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python-evdev.inc b/meta-python/recipes-devtools/python/python-evdev.inc
deleted file mode 100644
index 5a3884a6f9..0000000000
--- a/meta-python/recipes-devtools/python/python-evdev.inc
+++ /dev/null
@@ -1,21 +0,0 @@
-SUMMARY = "Python evdev lib"
-HOMEPAGE = "https://github.com/gvalkov/python-evdev"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=18debddbb3f52c661a129724a883a8e2"
-
-SRC_URI[md5sum] = "c7e855ae9f97f869a59e75b29f05ce74"
-SRC_URI[sha256sum] = "57edafc469a414f58b51af1bfb9ee2babb9f626dd2df530d71c1176871850aa1"
-
-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/python-evdev_0.7.0.bb b/meta-python/recipes-devtools/python/python-evdev_0.7.0.bb
deleted file mode 100644
index 63541363e3..0000000000
--- a/meta-python/recipes-devtools/python/python-evdev_0.7.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-evdev.inc
diff --git a/meta-python/recipes-devtools/python/python-fann2.inc b/meta-python/recipes-devtools/python/python-fann2.inc
deleted file mode 100644
index c415b35a92..0000000000
--- a/meta-python/recipes-devtools/python/python-fann2.inc
+++ /dev/null
@@ -1,9 +0,0 @@
-SUMMARY = "Python bindings for Fast Artificial Neural Networks 2.2.0 (FANN >= 2.2.0)"
-SECTION = "devel/python"
-LICENSE = "LGPLv2"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=c73b943dc75f6f65e007c56ac6515c8f"
-
-SRC_URI[md5sum] = "0b85b418018746d63ed66b55465697a9"
-SRC_URI[sha256sum] = "cdca0a65ad48e08320672affe38c3dd4ea15e27821e5e1db9fa2b34299bdd41e"
-
-DEPENDS += "swig-native libfann"
diff --git a/meta-python/recipes-devtools/python/python-feedformatter.inc b/meta-python/recipes-devtools/python/python-feedformatter.inc
deleted file mode 100644
index a333ef4eea..0000000000
--- a/meta-python/recipes-devtools/python/python-feedformatter.inc
+++ /dev/null
@@ -1,16 +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"
-LIC_FILES_CHKSUM = "file://COPYING;md5=258e3f39e2383fbd011035d04311008d"
-SRCREV = "7391193c83e10420b5a2d8ef846d23fc368c6d85"
-
-SRC_URI = "git://github.com/marianoguerra/feedformatter.git"
-
-S = "${WORKDIR}/git"
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-datetime \
- ${PYTHON_PN}-io \
- ${PYTHON_PN}-xml \
- "
diff --git a/meta-python/recipes-devtools/python/python-feedformatter_0.4.bb b/meta-python/recipes-devtools/python/python-feedformatter_0.4.bb
deleted file mode 100644
index 175f94478a..0000000000
--- a/meta-python/recipes-devtools/python/python-feedformatter_0.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-feedformatter.inc
diff --git a/meta-python/recipes-devtools/python/python-feedparser_5.2.1.bb b/meta-python/recipes-devtools/python/python-feedparser_5.2.1.bb
deleted file mode 100644
index b8ee700f04..0000000000
--- a/meta-python/recipes-devtools/python/python-feedparser_5.2.1.bb
+++ /dev/null
@@ -1,17 +0,0 @@
-SUMMARY = "Python Atom and RSS feed parser"
-LICENSE = "BSD-2-Clause"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=c21a7713ef6dc1b99644061c397e7c2a"
-
-SRC_URI[md5sum] = "d552f7a2a55e8e33b2a3fe1082505b42"
-SRC_URI[sha256sum] = "bd030652c2d08532c034c27fcd7c85868e7fa3cb2b17f230a44a6bbc92519bf9"
-
-inherit pypi setuptools
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-codecs \
- ${PYTHON_PN}-email \
- ${PYTHON_PN}-html \
- ${PYTHON_PN}-netserver \
- ${PYTHON_PN}-stringold \
- "
-
diff --git a/meta-python/recipes-devtools/python/python-flask-babel.inc b/meta-python/recipes-devtools/python/python-flask-babel.inc
deleted file mode 100644
index b60ee17d12..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-babel.inc
+++ /dev/null
@@ -1,16 +0,0 @@
-DESCRIPTION = "i18n and l10n support for Flask based on babel and pytz"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=51917f3e8e858f5ae295a7d0e2eb3cc9"
-
-SRC_URI[md5sum] = "07803453743f139309021572a799c6b3"
-SRC_URI[sha256sum] = "c0d75710bd4b0fe866f9f2347de6e19208712f9cec006436b4c1c15d4cb0c939"
-
-PYPI_PACKAGE = "Flask-Babel"
-
-inherit pypi
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-speaklater \
- ${PYTHON_PN}-babel \
- ${PYTHON_PN}-flask \
- "
diff --git a/meta-python/recipes-devtools/python/python-flask-babel_0.11.2.bb b/meta-python/recipes-devtools/python/python-flask-babel_0.11.2.bb
deleted file mode 100644
index 38e78c73f9..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-babel_0.11.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-flask-babel.inc
diff --git a/meta-python/recipes-devtools/python/python-flask-bcrypt_0.7.1.bb b/meta-python/recipes-devtools/python/python-flask-bcrypt_0.7.1.bb
deleted file mode 100644
index f035862de3..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-bcrypt_0.7.1.bb
+++ /dev/null
@@ -1,12 +0,0 @@
-DESCRIPTION = "Bcrypt hashing for Flask."
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=0ee2ee5bee7fe96597770e92db5719a8"
-
-SRC_URI[md5sum] = "d345c36ac6637d3ca9fa942e238d00ca"
-SRC_URI[sha256sum] = "d71c8585b2ee1c62024392ebdbc447438564e2c8c02b4e57b56a4cafd8d13c5f"
-
-PYPI_PACKAGE = "Flask-Bcrypt"
-
-inherit pypi setuptools
-
-RDEPENDS_${PN} += "${PYTHON_PN}-bcrypt ${PYTHON_PN}-flask"
diff --git a/meta-python/recipes-devtools/python/python-flask-bootstrap.inc b/meta-python/recipes-devtools/python/python-flask-bootstrap.inc
index 0723b97383..24c76ce942 100644
--- a/meta-python/recipes-devtools/python/python-flask-bootstrap.inc
+++ b/meta-python/recipes-devtools/python/python-flask-bootstrap.inc
@@ -1,5 +1,5 @@
DESCRIPTION = "An extension that includes Bootstrap in your project, without any boilerplate code."
-LICENSE = "BSD"
+LICENSE = "Apache-2.0 & MIT & BSD-3-Clause"
LIC_FILES_CHKSUM = "file://PKG-INFO;md5=a03749709f06118a17349deb5a210619"
SRC_URI[md5sum] = "e40d50f5c5b6438c1c6200a6f2871f81"
@@ -7,8 +7,8 @@ SRC_URI[sha256sum] = "cb08ed940183f6343a64e465e83b3a3f13c53e1baabb8d72b5da4545ef
PYPI_PACKAGE = "Flask-Bootstrap"
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-dominate \
- ${PYTHON_PN}-flask \
- ${PYTHON_PN}-visitor \
+RDEPENDS:${PN} += "\
+ python3-dominate \
+ python3-flask \
+ python3-visitor \
"
diff --git a/meta-python/recipes-devtools/python/python-flask-bootstrap_3.3.7.1.bb b/meta-python/recipes-devtools/python/python-flask-bootstrap_3.3.7.1.bb
deleted file mode 100644
index eeaade9a88..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-bootstrap_3.3.7.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-flask-bootstrap.inc
diff --git a/meta-python/recipes-devtools/python/python-flask-login_0.4.1.bb b/meta-python/recipes-devtools/python/python-flask-login_0.4.1.bb
deleted file mode 100644
index 510cedf220..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-login_0.4.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-flask-login.inc
diff --git a/meta-python/recipes-devtools/python/python-flask-mail.inc b/meta-python/recipes-devtools/python/python-flask-mail.inc
deleted file mode 100644
index bb08703483..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-mail.inc
+++ /dev/null
@@ -1,12 +0,0 @@
-SUMMARY = "Flask extension for sending email"
-DESCRIPTION = "A Flask extension for sending email"
-HOMEPAGE = " https://github.com/rduplain/flask-email"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=5b16dfa6d3f275ace5985bb92949f770"
-
-SRC_URI[md5sum] = "04b35a42a44ec7aa724ec8ce55e2e08e"
-SRC_URI[sha256sum] = "22e5eb9a940bf407bcf30410ecc3708f3c56cc44b29c34e1726fe85006935f41"
-
-PYPI_PACKAGE = "Flask-Mail"
-
-RDEPENDS_${PN} = "${PYTHON_PN}-flask"
diff --git a/meta-python/recipes-devtools/python/python-flask-mail_0.9.1.bb b/meta-python/recipes-devtools/python/python-flask-mail_0.9.1.bb
deleted file mode 100644
index 8324da867e..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-mail_0.9.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-flask-mail.inc
diff --git a/meta-python/recipes-devtools/python/python-flask-migrate.inc b/meta-python/recipes-devtools/python/python-flask-migrate.inc
deleted file mode 100644
index dfb20e9eee..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-migrate.inc
+++ /dev/null
@@ -1,14 +0,0 @@
-DESCRIPTION = "SQLAlchemy database migrations for Flask applications using Alembic"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=3b69377f79f3f48c661701236d5a6a85"
-
-SRC_URI[md5sum] = "aaeee55431d0287063657122ff41a0e6"
-SRC_URI[sha256sum] = "cd1b4e6cb829eeb41c02ad9202d83bef5f4b7a036dd9fad72ce96ad1e22efb07"
-
-PYPI_PACKAGE = "Flask-Migrate"
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-flask-sqlalchemy \
- ${PYTHON_PN}-alembic \
- ${PYTHON_PN}-flask \
- "
diff --git a/meta-python/recipes-devtools/python/python-flask-migrate_2.2.1.bb b/meta-python/recipes-devtools/python/python-flask-migrate_2.2.1.bb
deleted file mode 100644
index ece516f505..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-migrate_2.2.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-flask-migrate.inc
diff --git a/meta-python/recipes-devtools/python/python-flask-nav.inc b/meta-python/recipes-devtools/python/python-flask-nav.inc
deleted file mode 100644
index 932ccdf4a3..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-nav.inc
+++ /dev/null
@@ -1,13 +0,0 @@
-DESCRIPTION = "Easily create navigation for Flask applications."
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://PKG-INFO;md5=2729ee82259d601d90d28b0574d12416"
-
-SRC_URI[md5sum] = "4d51cfd06d58f8d0fe85775a6696c0e5"
-SRC_URI[sha256sum] = "44e40b755380a1e68ab521a2f9174de259a2c94ddcdaabf36b3aca2e110a33f4"
-
-PYPI_PACKAGE = "flask-nav"
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-blinker \
- ${PYTHON_PN}-flask \
- "
diff --git a/meta-python/recipes-devtools/python/python-flask-nav_0.6.bb b/meta-python/recipes-devtools/python/python-flask-nav_0.6.bb
deleted file mode 100644
index 30b5b3b3b7..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-nav_0.6.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-flask-nav.inc
diff --git a/meta-python/recipes-devtools/python/python-flask-navigation_0.2.0.bb b/meta-python/recipes-devtools/python/python-flask-navigation_0.2.0.bb
deleted file mode 100644
index b2dc96e3c0..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-navigation_0.2.0.bb
+++ /dev/null
@@ -1,15 +0,0 @@
-DESCRIPTION = "The navigation of Flask application."
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://PKG-INFO;md5=af2ec695dc1f3eb7bd74f79a68a0d789"
-
-SRC_URI[md5sum] = "d1075ee02a3f69da37e5cadad3395f31"
-SRC_URI[sha256sum] = "c42d30efa989ca877444a410e8a1cd2563546f9effe3d9fe388eedf7a6c69285"
-
-PYPI_PACKAGE = "Flask-Navigation"
-
-inherit pypi setuptools
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-blinker \
- ${PYTHON_PN}-flask \
- "
diff --git a/meta-python/recipes-devtools/python/python-flask-pymongo.inc b/meta-python/recipes-devtools/python/python-flask-pymongo.inc
deleted file mode 100644
index 39251525b6..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-pymongo.inc
+++ /dev/null
@@ -1,15 +0,0 @@
-SUMMARY = "PyMongo support for Flask applications"
-DESCRIPTION = "PyMongo support for Flask applications."
-HOMEPAGE = "https://github.com/mitsuhiko/flask/"
-SECTION = "devel/python"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://flask_pymongo/wrappers.py;beginline=1;endline=24;md5=424c4e1047d28e01b4e4634a069c019d"
-
-SRC_URI[md5sum] = "94df71e6800b1d7915cc91a74b70f959"
-SRC_URI[sha256sum] = "620eb02dc8808a5fcb90f26cab6cba9d6bf497b15032ae3ca99df80366e33314"
-
-PYPI_PACKAGE = "Flask-PyMongo"
-
-DEPENDS = "${PYTHON_PN}-vcversioner ${PYTHON_PN}-vcversioner-native"
-
-RDEPENDS_${PN} = "${PYTHON_PN}-pymongo ${PYTHON_PN}-flask"
diff --git a/meta-python/recipes-devtools/python/python-flask-pymongo_2.3.0.bb b/meta-python/recipes-devtools/python/python-flask-pymongo_2.3.0.bb
deleted file mode 100644
index d41d023480..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-pymongo_2.3.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-flask-pymongo.inc
diff --git a/meta-python/recipes-devtools/python/python-flask-restful_0.3.6.bb b/meta-python/recipes-devtools/python/python-flask-restful_0.3.6.bb
deleted file mode 100644
index 1968d1d9d2..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-restful_0.3.6.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-flask-restful.inc
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 fca777bc55..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-script.inc
+++ /dev/null
@@ -1,12 +0,0 @@
-DESCRIPTION = "Scripting support for flask"
-LICENSE = "BSD"
-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-script_2.0.6.bb b/meta-python/recipes-devtools/python/python-flask-script_2.0.6.bb
deleted file mode 100644
index b7d55af151..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-script_2.0.6.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-flask-script.inc
diff --git a/meta-python/recipes-devtools/python/python-flask-sijax.inc b/meta-python/recipes-devtools/python/python-flask-sijax.inc
index ff4e70a53c..239c843fce 100644
--- a/meta-python/recipes-devtools/python/python-flask-sijax.inc
+++ b/meta-python/recipes-devtools/python/python-flask-sijax.inc
@@ -5,4 +5,8 @@ LICENSE = "BSD-3-Clause"
LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=266adc7b911b7c84b837bf77196e1ba6"
PYPI_PACKAGE = "Flask-Sijax"
-RDEPENDS_${PN} = "${PYTHON_PN}-sijax" \ No newline at end of file
+RDEPENDS:${PN} += " \
+ python3-flask \
+ python3-sijax \
+ python3-werkzeug \
+"
diff --git a/meta-python/recipes-devtools/python/python-flask-sijax_0.4.1.bb b/meta-python/recipes-devtools/python/python-flask-sijax_0.4.1.bb
deleted file mode 100644
index 74738fc2f2..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-sijax_0.4.1.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-inherit pypi setuptools
-require python-flask-sijax.inc
-
-SRC_URI[sha256sum] = "fb2bf2d4f75408185102195055d75549fee8d9c9e954dca2427186925cdc429f" \ No newline at end of file
diff --git a/meta-python/recipes-devtools/python/python-flask-socketio_3.3.2.bb b/meta-python/recipes-devtools/python/python-flask-socketio_3.3.2.bb
deleted file mode 100644
index 3b9ad33bb0..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-socketio_3.3.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-flask-socketio.inc
diff --git a/meta-python/recipes-devtools/python/python-flask-sqlalchemy.inc b/meta-python/recipes-devtools/python/python-flask-sqlalchemy.inc
deleted file mode 100644
index e0efbc63ae..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-sqlalchemy.inc
+++ /dev/null
@@ -1,10 +0,0 @@
-DESCRIPTION = "Adds SQLAlchemy support to your Flask application."
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=5ed1b8cc741515a835a7f6bf2f62ef4a"
-
-SRC_URI[md5sum] = "373ce61dfd03b593ad2eaba68c9fee35"
-SRC_URI[sha256sum] = "5971b9852b5888655f11db634e87725a9031e170f37c0ce7851cf83497f56e53"
-
-PYPI_PACKAGE = "Flask-SQLAlchemy"
-
-RDEPENDS_${PN} = "${PYTHON_PN}-sqlalchemy ${PYTHON_PN}-flask"
diff --git a/meta-python/recipes-devtools/python/python-flask-sqlalchemy_2.3.2.bb b/meta-python/recipes-devtools/python/python-flask-sqlalchemy_2.3.2.bb
deleted file mode 100644
index 3dc355c5da..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-sqlalchemy_2.3.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-flask-sqlalchemy.inc
diff --git a/meta-python/recipes-devtools/python/python-flask-uploads.inc b/meta-python/recipes-devtools/python/python-flask-uploads.inc
deleted file mode 100644
index cd7ac1aeb6..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-uploads.inc
+++ /dev/null
@@ -1,12 +0,0 @@
-DESCRIPTION = "Flexible and efficient upload handling for Flask"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://PKG-INFO;md5=b712ac634b39469660c9bdfb8d03421c"
-
-SRC_URI[md5sum] = "e5eee34aa92b64a4d22847672b3858a1"
-SRC_URI[sha256sum] = "53ecbd6033667d50ae02b63adebbaa33c7fc56c09e5293025810cf9d841ecb02"
-
-PYPI_PACKAGE = "Flask-Uploads"
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-flask \
- "
diff --git a/meta-python/recipes-devtools/python/python-flask-uploads_0.2.1.bb b/meta-python/recipes-devtools/python/python-flask-uploads_0.2.1.bb
deleted file mode 100644
index d39b07f690..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-uploads_0.2.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-flask-uploads.inc
diff --git a/meta-python/recipes-devtools/python/python-flask-user.inc b/meta-python/recipes-devtools/python/python-flask-user.inc
deleted file mode 100644
index c2b71829c7..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-user.inc
+++ /dev/null
@@ -1,17 +0,0 @@
-SUMMARY = "Customizable user account management for Flask"
-DESCRIPTION = "Customizable User Account Management for Flask; Register \
-Confirm email, Login, Change username, Change password, Forgot Password \
-and more."
-HOMEPAGE = " https://github.com/lingthio/Flask-User"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=97de97cd9d6e23c88129d884588ce71a"
-
-SRC_URI[md5sum] = "f7965e66ca139c8436896da07e66c21f"
-SRC_URI[sha256sum] = "601abcc0343dfbae0c56273d98362d5cdc266ac84d20b3f65a212e4a2c83b302"
-
-PYPI_PACKAGE = "Flask-User"
-
-RDEPENDS_${PN} = "${PYTHON_PN}-flask \
- ${PYTHON_PN}-flask-login \
- ${PYTHON_PN}-flask-mail \
- ${PYTHON_PN}-babel"
diff --git a/meta-python/recipes-devtools/python/python-flask-user_0.6.19.bb b/meta-python/recipes-devtools/python/python-flask-user_0.6.19.bb
deleted file mode 100644
index 654d377528..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-user_0.6.19.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-flask-user.inc
diff --git a/meta-python/recipes-devtools/python/python-flask-wtf.inc b/meta-python/recipes-devtools/python/python-flask-wtf.inc
deleted file mode 100644
index 3c90656ad7..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-wtf.inc
+++ /dev/null
@@ -1,15 +0,0 @@
-DESCRIPTION = "Simple integration of Flask and WTForms."
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=3ca6bb31670492f791e6a9f2fb9f8a80"
-
-SRC_URI[md5sum] = "586f50f233926cade42e3d744aca3e8f"
-SRC_URI[sha256sum] = "5d14d55cfd35f613d99ee7cba0fc3fbbe63ba02f544d349158c14ca15561cc36"
-
-PYPI_PACKAGE = "Flask-WTF"
-
-RDEPENDS_${PN} = "\
- ${PYTHON_PN}-flask \
- ${PYTHON_PN}-itsdangerous \
- ${PYTHON_PN}-json \
- ${PYTHON_PN}-wtforms \
-"
diff --git a/meta-python/recipes-devtools/python/python-flask-wtf_0.14.2.bb b/meta-python/recipes-devtools/python/python-flask-wtf_0.14.2.bb
deleted file mode 100644
index dbf091bc0f..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-wtf_0.14.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-flask-wtf.inc
diff --git a/meta-python/recipes-devtools/python/python-flask-xstatic.inc b/meta-python/recipes-devtools/python/python-flask-xstatic.inc
index a1fe14ed46..8434d2610b 100644
--- a/meta-python/recipes-devtools/python/python-flask-xstatic.inc
+++ b/meta-python/recipes-devtools/python/python-flask-xstatic.inc
@@ -1,16 +1,16 @@
DESCRIPTION = "XStatic support for flask"
-LICENSE = "BSD"
+LICENSE = "BSD-2-Clause"
LIC_FILES_CHKSUM = "file://LICENSE;md5=659968f6ebd4b70b6c3190d20b4a924c"
SRC_URI[md5sum] = "2f56023e1444c8bd1fec41afe93de743"
SRC_URI[sha256sum] = "226ea8e97065a9488b59bfe5c94af4c6e2ea70a25052e301fb231a1381490133"
-FILESEXTRAPATHS_prepend := "${THISDIR}/python-flask-xstatic:"
+FILESEXTRAPATHS:prepend := "${THISDIR}/python-flask-xstatic:"
SRC_URI += "file://remove-pip-requires.patch"
PYPI_PACKAGE = "Flask-XStatic"
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-flask \
- ${PYTHON_PN}-xstatic \
+RDEPENDS:${PN} += "\
+ python3-flask \
+ python3-xstatic \
"
diff --git a/meta-python/recipes-devtools/python/python-flask-xstatic/remove-pip-requires.patch b/meta-python/recipes-devtools/python/python-flask-xstatic/remove-pip-requires.patch
index a2d620ad06..ba06d670e3 100644
--- a/meta-python/recipes-devtools/python/python-flask-xstatic/remove-pip-requires.patch
+++ b/meta-python/recipes-devtools/python/python-flask-xstatic/remove-pip-requires.patch
@@ -1,3 +1,5 @@
+Upstream-Status: Pending
+
--- Flask-XStatic-0.0.1/setup.py.orig 2015-01-30 08:01:56.000000000 -0800
+++ Flask-XStatic-0.0.1/setup.py 2017-04-17 21:40:32.570181626 -0700
@@ -1,4 +1,3 @@
diff --git a/meta-python/recipes-devtools/python/python-flask-xstatic_0.0.1.bb b/meta-python/recipes-devtools/python/python-flask-xstatic_0.0.1.bb
deleted file mode 100644
index dff14a8c05..0000000000
--- a/meta-python/recipes-devtools/python/python-flask-xstatic_0.0.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-flask-xstatic.inc
diff --git a/meta-python/recipes-devtools/python/python-flask.inc b/meta-python/recipes-devtools/python/python-flask.inc
deleted file mode 100644
index ffd783f3df..0000000000
--- a/meta-python/recipes-devtools/python/python-flask.inc
+++ /dev/null
@@ -1,16 +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"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=c011883ac26229b8ba3084f55c7664c6"
-
-SRC_URI[md5sum] = "824f0f20aae1f44c9c7dc4054adb7969"
-SRC_URI[sha256sum] = "2271c0070dbcb5275fad4a82e29f23ab92682dc45f9dfbc22c02ba9b9322ce48"
-
-CLEANBROKEN = "1"
-
-PYPI_PACKAGE = "Flask"
-
-RDEPENDS_${PN} = "${PYTHON_PN}-werkzeug ${PYTHON_PN}-jinja2 ${PYTHON_PN}-itsdangerous ${PYTHON_PN}-click"
diff --git a/meta-python/recipes-devtools/python/python-flask_1.0.2.bb b/meta-python/recipes-devtools/python/python-flask_1.0.2.bb
deleted file mode 100644
index a0a28ab8bd..0000000000
--- a/meta-python/recipes-devtools/python/python-flask_1.0.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-flask.inc
diff --git a/meta-python/recipes-devtools/python/python-funcsigs_1.0.2.bb b/meta-python/recipes-devtools/python/python-funcsigs_1.0.2.bb
deleted file mode 100644
index dad15ee0f3..0000000000
--- a/meta-python/recipes-devtools/python/python-funcsigs_1.0.2.bb
+++ /dev/null
@@ -1,18 +0,0 @@
-SUMMARY = "Python function signatures from PEP362 for Python 2.6, 2.7 and 3.2+"
-DESCRPTION = " \
-funcsigs is a backport of the `PEP 362`_ function signature features from \
-Python 3.3's `inspect`_ module. The backport is compatible with Python 2.6, \
-2.7 as well as 3.3 and up. 3.2 was supported by version 0.4, but with \
-setuptools and pip no longer supporting 3.2, we cannot make any statement \
-about 3.2 compatibility. \
-"
-
-HOMEPAGE = "http://funcsigs.readthedocs.org"
-SECTION = "devel/python"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=d6bc91dc8e5793892189fe7481a2d354"
-
-SRC_URI[md5sum] = "7e583285b1fb8a76305d6d68f4ccc14e"
-SRC_URI[sha256sum] = "a7bb0f2cf3a3fd1ab2732cb49eba4252c2af4240442415b4abce3b87022a8f50"
-
-inherit pypi setuptools
diff --git a/meta-python/recipes-devtools/python/python-functools32_3.2.3-2.bb b/meta-python/recipes-devtools/python/python-functools32_3.2.3-2.bb
deleted file mode 100644
index cb4bba4968..0000000000
--- a/meta-python/recipes-devtools/python/python-functools32_3.2.3-2.bb
+++ /dev/null
@@ -1,10 +0,0 @@
-SUMMARY = "Backport of the functools module from Python 3.2.3 for use on 2.7 and PyPy."
-LICENSE = "PSF"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=27cf2345969ed18e6730e90fb0063a10"
-
-SRC_URI[md5sum] = "09f24ffd9af9f6cd0f63cb9f4e23d4b2"
-SRC_URI[sha256sum] = "f6253dfbe0538ad2e387bd8fdfd9293c925d63553f5813c4e587745416501e6d"
-
-inherit pypi setuptools
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-future.inc b/meta-python/recipes-devtools/python/python-future.inc
deleted file mode 100644
index 2247561809..0000000000
--- a/meta-python/recipes-devtools/python/python-future.inc
+++ /dev/null
@@ -1,13 +0,0 @@
-DESCRIPTION = "Clean single-source support for Python 3 and 2"
-HOMEPAGE = "https://python-future.org"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=3f457538b297bd0ef86564b8ac216ad7"
-
-SRC_URI[md5sum] = "3e8e88a2bda48d54b1da7634d04760d7"
-SRC_URI[sha256sum] = "e39ced1ab767b5936646cedba8bcce582398233d6a627067d4c6a454c90cfedb"
-
-PYPI_PACKAGE_HASH = "99abde815842bc6e97d5a7806ad51236630da14ca2f3b1fce94c0bb94d3d"
-
-inherit pypi
-
-BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python-future_0.16.0.bb b/meta-python/recipes-devtools/python/python-future_0.16.0.bb
deleted file mode 100644
index d95e1ba774..0000000000
--- a/meta-python/recipes-devtools/python/python-future_0.16.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-future.inc
diff --git a/meta-python/recipes-devtools/python/python-gdata_2.0.18.bb b/meta-python/recipes-devtools/python/python-gdata_2.0.18.bb
deleted file mode 100644
index 897581f194..0000000000
--- a/meta-python/recipes-devtools/python/python-gdata_2.0.18.bb
+++ /dev/null
@@ -1,21 +0,0 @@
-SUMMARY = "Google Data APIs Python Client Library"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://README.txt;md5=4c8f0e6846e52a7fe4943acf462d808d"
-HOMEPAGE = "http://code.google.com/p/gdata-python-client/"
-
-SRC_URI[md5sum] = "13b6e6dd8f9e3e9a8e005e05a8329408"
-SRC_URI[sha256sum] = "56e7d22de819c22b13ceb0fe1869729b4287f89ebbd4bb55380d7bcf61a1fdb6"
-
-S = "${WORKDIR}/gdata.py-${PV}"
-
-inherit pypi distutils
-
-FILES_${PN} += "${datadir}"
-
-RDEPENDS_${PN} = " \
- ${PYTHON_PN}-distutils \
- ${PYTHON_PN}-json \
- ${PYTHON_PN}-netserver \
- ${PYTHON_PN}-stringold \
- ${PYTHON_PN}-xml \
-"
diff --git a/meta-python/recipes-devtools/python/python-gevent.inc b/meta-python/recipes-devtools/python/python-gevent.inc
deleted file mode 100644
index bc89d104af..0000000000
--- a/meta-python/recipes-devtools/python/python-gevent.inc
+++ /dev/null
@@ -1,35 +0,0 @@
-SUMMARY = "A coroutine-based Python networking library"
-DESCRIPTION = "gevent is a coroutine-based Python networking library that uses greenlet to provide \
-a high-level synchronous API on top of the libevent event loop."
-HOMEPAGE = "http://www.gevent.org"
-LICENSE = "MIT & Python-2.0 & BSD"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=4de99aac27b470c29c6c309e0c279b65 \
- file://NOTICE;md5=18108df3583462cafd457f024b9b09b5 \
- file://deps/libev/LICENSE;md5=d6ad416afd040c90698edcdf1cbee347 \
- "
-DEPENDS += "libevent"
-DEPENDS += "${PYTHON_PN}-greenlet"
-RDEPENDS_${PN} = "${PYTHON_PN}-greenlet \
- ${PYTHON_PN}-mime \
- ${PYTHON_PN}-pprint \
- "
-
-FILESEXTRAPATHS_prepend := "${THISDIR}/python-gevent:"
-
-SRC_URI_append = " \
- file://libev-conf.patch;patch=1;pnum=1 \
- file://0002-setup.py-do-not-query-for-include-dir.patch \
-"
-
-SRC_URI[md5sum] = "6b9dd98917061803d9158e5258b8f412"
-SRC_URI[sha256sum] = "1eb7fa3b9bd9174dfe9c3b59b7a09b768ecd496debfc4976a9530a3e15c990d1"
-
-# The python-gevent has no autoreconf ability
-# and the logic for detecting a cross compile is flawed
-# so always force a cross compile
-do_configure_append() {
- sed -i -e 's/^cross_compiling=no/cross_compiling=yes/' ${S}/deps/libev/configure
- sed -i -e 's/^cross_compiling=no/cross_compiling=yes/' ${S}/deps/c-ares/configure
-}
-
-inherit pypi
diff --git a/meta-python/recipes-devtools/python/python-gevent/0002-setup.py-do-not-query-for-include-dir.patch b/meta-python/recipes-devtools/python/python-gevent/0002-setup.py-do-not-query-for-include-dir.patch
deleted file mode 100644
index 7536b71a69..0000000000
--- a/meta-python/recipes-devtools/python/python-gevent/0002-setup.py-do-not-query-for-include-dir.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From a53ed6b2f967a5f95e69d51cad3f8c120d7df65b Mon Sep 17 00:00:00 2001
-From: Alexander Kanavin <alex.kanavin@gmail.com>
-Date: Thu, 7 Feb 2019 15:21:15 +0100
-Subject: [PATCH] setup.py: do not query for include dir
-
-As this will return the native python directory erroneously.
-
-Upstream-Status: Inappropriate [oe-core specific]
-Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com>
----
- setup.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/setup.py b/setup.py
-index 86d6c5a..5d22291 100755
---- a/setup.py
-+++ b/setup.py
-@@ -52,7 +52,7 @@ from _setupares import ARES
- # Get access to the greenlet header file.
- # The sysconfig dir is not enough if we're in a virtualenv
- # See https://github.com/pypa/pip/issues/4610
--include_dirs = [sysconfig.get_path("include")]
-+include_dirs = []
- venv_include_dir = os.path.join(sys.prefix, 'include', 'site',
- 'python' + sysconfig.get_python_version())
- venv_include_dir = os.path.abspath(venv_include_dir)
diff --git a/meta-python/recipes-devtools/python/python-gevent/libev-conf.patch b/meta-python/recipes-devtools/python/python-gevent/libev-conf.patch
deleted file mode 100644
index 79c1867ba7..0000000000
--- a/meta-python/recipes-devtools/python/python-gevent/libev-conf.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From 2294734ef9d5e2efb05820e9759a1635799bdea9 Mon Sep 17 00:00:00 2001
-From: Andrej Rode <andrej.rode@ettus.com>
-Date: Mon, 10 Apr 2017 19:25:18 -0700
-Subject: [PATCH] libev: make configure crosscompile compatible
-
-Signed-off-by: Andrej Rode <andrej.rode@ettus.com>
----
- deps/libev/configure | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/deps/libev/configure b/deps/libev/configure
-index 743817e..96c2366 100755
---- a/deps/libev/configure
-+++ b/deps/libev/configure
-@@ -2208,7 +2208,7 @@ fi
- ac_ext=c
- ac_cpp='$CPP $CPPFLAGS'
- ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
--ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-+ac_link='$CC -static -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
- ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
---
-2.10.2
-
diff --git a/meta-python/recipes-devtools/python/python-gevent_1.4.0.bb b/meta-python/recipes-devtools/python/python-gevent_1.4.0.bb
deleted file mode 100644
index f13bfd7b73..0000000000
--- a/meta-python/recipes-devtools/python/python-gevent_1.4.0.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-require python-gevent.inc
-inherit setuptools
-
-RDEPENDS_${PN} += "${PYTHON_PN}-re"
diff --git a/meta-python/recipes-devtools/python/python-greenlet.inc b/meta-python/recipes-devtools/python/python-greenlet.inc
deleted file mode 100644
index c7c656c84a..0000000000
--- a/meta-python/recipes-devtools/python/python-greenlet.inc
+++ /dev/null
@@ -1,9 +0,0 @@
-SUMMARY = "Python lightweight in-process concurrent programming"
-LICENSE = "MIT & PSF"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=03143d7a1a9f5d8a0fee825f24ca9c36 \
- file://LICENSE.PSF;md5=c106931d9429eda0492617f037b8f69a"
-
-SRC_URI[md5sum] = "10fa304f673fc18b28fa6d8c6658cb80"
-SRC_URI[sha256sum] = "9416443e219356e3c31f1f918a91badf2e37acf297e2fa13d24d1cc2380f8fbc"
-
-inherit pypi
diff --git a/meta-python/recipes-devtools/python/python-greenlet_0.4.15.bb b/meta-python/recipes-devtools/python/python-greenlet_0.4.15.bb
deleted file mode 100644
index c14976ed32..0000000000
--- a/meta-python/recipes-devtools/python/python-greenlet_0.4.15.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit distutils
-require python-greenlet.inc
diff --git a/meta-python/recipes-devtools/python/python-grpcio-tools.inc b/meta-python/recipes-devtools/python/python-grpcio-tools.inc
deleted file mode 100644
index 1a15c48de0..0000000000
--- a/meta-python/recipes-devtools/python/python-grpcio-tools.inc
+++ /dev/null
@@ -1,16 +0,0 @@
-DESCRIPTION = "Google gRPC tools"
-HOMEPAGE = "http://www.grpc.io/"
-SECTION = "devel/python"
-
-DEPENDS_append = "${PYTHON_PN}-grpcio"
-RDEPENDS_${PN} = "${PYTHON_PN}-grpcio"
-
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=7145f7cdd263359b62d342a02f005515"
-
-inherit pypi
-
-SRC_URI[md5sum] = "b2fabfb54c7824c1e49a02de2aa6628e"
-SRC_URI[sha256sum] = "4ce5aa660d7884f23aac1eafa93b97a4c3e2b512edff871e91fdb6ee86ebd5ea"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-grpcio-tools_1.14.1.bb b/meta-python/recipes-devtools/python/python-grpcio-tools_1.14.1.bb
deleted file mode 100644
index 5b19bebf1a..0000000000
--- a/meta-python/recipes-devtools/python/python-grpcio-tools_1.14.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-grpcio-tools.inc
diff --git a/meta-python/recipes-devtools/python/python-grpcio.inc b/meta-python/recipes-devtools/python/python-grpcio.inc
deleted file mode 100644
index c5762b26b2..0000000000
--- a/meta-python/recipes-devtools/python/python-grpcio.inc
+++ /dev/null
@@ -1,30 +0,0 @@
-DESCRIPTION = "Google gRPC"
-HOMEPAGE = "http://www.grpc.io/"
-SECTION = "devel/python"
-
-DEPENDS_append = "${PYTHON_PN}-protobuf"
-
-FILESEXTRAPATHS_prepend := "${THISDIR}/python-grpcio:"
-
-SRC_URI_append_class-target = " file://0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch \
- file://ppc-boringssl-support.patch \
- file://riscv64_support.patch \
- file://gettid.patch \
-"
-
-RDEPENDS_${PN} = "${PYTHON_PN}-protobuf \
- ${PYTHON_PN}-setuptools \
- ${PYTHON_PN}-six \
-"
-
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
-
-inherit pypi
-
-SRC_URI[md5sum] = "188565f150f34d1927b87e014f0f4b73"
-SRC_URI[sha256sum] = "2ddbca16c2e7b3f2ffc6e34c7cfa6886fb01de9f156ad3f77b72ad652d632097"
-
-CLEANBROKEN = "1"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-grpcio/0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch b/meta-python/recipes-devtools/python/python-grpcio/0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch
deleted file mode 100644
index f17f048de8..0000000000
--- a/meta-python/recipes-devtools/python/python-grpcio/0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From b02be74a2eff8abc612ef84f30e0fbce6a7f65f5 Mon Sep 17 00:00:00 2001
-From: Khem Raj <raj.khem@gmail.com>
-Date: Fri, 4 Aug 2017 09:04:07 -0700
-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
-
-error: invalid argument '-std=gnu99' not allowed with 'C++'
-
-gcc7 ( defaults are -std=gnu11 and -std=gnu++14 )
- as well clang default to these standards mode or newer
-anyway
-
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
----
- setup.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/setup.py
-+++ b/setup.py
-@@ -145,7 +145,7 @@ ENABLE_DOCUMENTATION_BUILD = os.environ.
- EXTRA_ENV_COMPILE_ARGS = os.environ.get('GRPC_PYTHON_CFLAGS', None)
- EXTRA_ENV_LINK_ARGS = os.environ.get('GRPC_PYTHON_LDFLAGS', None)
- if EXTRA_ENV_COMPILE_ARGS is None:
-- EXTRA_ENV_COMPILE_ARGS = ' -std=c++11'
-+ EXTRA_ENV_COMPILE_ARGS = ""
- if 'win32' in sys.platform and sys.version_info < (3, 5):
- EXTRA_ENV_COMPILE_ARGS += ' -D_hypot=hypot'
- # We use define flags here and don't directly add to DEFINE_MACROS below to
-@@ -157,7 +157,7 @@ if EXTRA_ENV_COMPILE_ARGS is None:
- else:
- EXTRA_ENV_COMPILE_ARGS += ' -D_ftime=_ftime64 -D_timeb=__timeb64'
- elif "linux" in sys.platform:
-- EXTRA_ENV_COMPILE_ARGS += ' -std=gnu99 -fvisibility=hidden -fno-wrapv -fno-exceptions'
-+ EXTRA_ENV_COMPILE_ARGS += ' -fvisibility=hidden -fno-wrapv -fno-exceptions'
- elif "darwin" in sys.platform:
- EXTRA_ENV_COMPILE_ARGS += ' -fvisibility=hidden -fno-wrapv -fno-exceptions'
- EXTRA_ENV_COMPILE_ARGS += ' -DPB_FIELD_32BIT'
diff --git a/meta-python/recipes-devtools/python/python-grpcio/gettid.patch b/meta-python/recipes-devtools/python/python-grpcio/gettid.patch
deleted file mode 100644
index fb15cf7f96..0000000000
--- a/meta-python/recipes-devtools/python/python-grpcio/gettid.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-use glibc provided gettid API for glibc 2.30+
-
-glibc 2.30 introduced this function see [1]
-so it's best to detect it
-and provide fallback only if it's not present
-
-[1] https://sourceware.org/bugzilla/show_bug.cgi?id=6399
-
-Upstream-Status: Pending
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
---- a/src/core/lib/gpr/log_linux.cc
-+++ b/src/core/lib/gpr/log_linux.cc
-@@ -40,7 +40,13 @@
- #include <time.h>
- #include <unistd.h>
-
-+#if defined(__GLIBC__)
-+#if !__GLIBC_PREREQ(2,29)
- static long gettid(void) { return syscall(__NR_gettid); }
-+#endif
-+#else
-+static long gettid(void) { return syscall(__NR_gettid); }
-+#endif
-
- void gpr_log(const char* file, int line, gpr_log_severity severity,
- const char* format, ...) {
diff --git a/meta-python/recipes-devtools/python/python-grpcio/ppc-boringssl-support.patch b/meta-python/recipes-devtools/python/python-grpcio/ppc-boringssl-support.patch
deleted file mode 100644
index 6435abbe6d..0000000000
--- a/meta-python/recipes-devtools/python/python-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/include/openssl/base.h
-+++ b/third_party/boringssl/include/openssl/base.h
-@@ -95,6 +95,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(__mips__) && !defined(__LP64__)
- #define OPENSSL_32_BIT
- #define OPENSSL_MIPS
diff --git a/meta-python/recipes-devtools/python/python-grpcio/riscv64_support.patch b/meta-python/recipes-devtools/python/python-grpcio/riscv64_support.patch
deleted file mode 100644
index fef7d9e757..0000000000
--- a/meta-python/recipes-devtools/python/python-grpcio/riscv64_support.patch
+++ /dev/null
@@ -1,16 +0,0 @@
-Add RISC-V 64bit support
-
-Upstream-Status: Pending
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
---- a/third_party/boringssl/include/openssl/base.h
-+++ b/third_party/boringssl/include/openssl/base.h
-@@ -104,6 +104,9 @@ extern "C" {
- #elif defined(__mips__) && defined(__LP64__)
- #define OPENSSL_64_BIT
- #define OPENSSL_MIPS64
-+#elif defined(__riscv) && defined(__riscv_xlen)
-+#define OPENSSL_64_BIT
-+#define OPENSSL_RISCV64
- #elif defined(__pnacl__)
- #define OPENSSL_32_BIT
- #define OPENSSL_PNACL
diff --git a/meta-python/recipes-devtools/python/python-grpcio_1.19.0.bb b/meta-python/recipes-devtools/python/python-grpcio_1.19.0.bb
deleted file mode 100644
index 820bea44b4..0000000000
--- a/meta-python/recipes-devtools/python/python-grpcio_1.19.0.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-inherit setuptools
-require python-grpcio.inc
-
-RDEPENDS_${PN} += " python-enum34 \
- python-futures \
-"
diff --git a/meta-python/recipes-devtools/python/python-html5lib.inc b/meta-python/recipes-devtools/python/python-html5lib.inc
deleted file mode 100644
index a8e0fb4085..0000000000
--- a/meta-python/recipes-devtools/python/python-html5lib.inc
+++ /dev/null
@@ -1,17 +0,0 @@
-SUMMARY = "HTML parser based on the WHATWG HTML specifcation"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=1ba5ada9e6fead1fdc32f43c9f10ba7c"
-
-SRC_URI[md5sum] = "942a0688d6bdf20d087c9805c40182ad"
-SRC_URI[sha256sum] = "66cb0dcfdbbc4f9c3ba1a63fdb511ffdbd4f513b2b6d81b80cd26ce6b3fb3736"
-
-inherit pypi
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-lxml \
- ${PYTHON_PN}-six \
- ${PYTHON_PN}-webencodings \
- ${PYTHON_PN}-xml \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-html5lib_1.0.1.bb b/meta-python/recipes-devtools/python/python-html5lib_1.0.1.bb
deleted file mode 100644
index f5941a2a11..0000000000
--- a/meta-python/recipes-devtools/python/python-html5lib_1.0.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-html5lib.inc
diff --git a/meta-python/recipes-devtools/python/python-humanfriendly.inc b/meta-python/recipes-devtools/python/python-humanfriendly.inc
deleted file mode 100644
index 94f7f8b813..0000000000
--- a/meta-python/recipes-devtools/python/python-humanfriendly.inc
+++ /dev/null
@@ -1,25 +0,0 @@
-DESCRIPTION = "Human friendly output for text interfaces using Python"
-HOMEPAGE = "https://humanfriendly.readthedocs.io/"
-SECTION = "devel/python"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=690da298a43805797a4fa7bbe180b3c6"
-
-PYPI_PACKAGE = "humanfriendly"
-
-SRC_URI[md5sum] = "9573f9f37a5454d8205cfd1b9b8db9d2"
-SRC_URI[sha256sum] = "33ee8ceb63f1db61cce8b5c800c531e1a61023ac5488ccde2ba574a85be00a85"
-
-inherit pypi
-
-RDEPENDS_${PN}_class-target += " \
- ${PYTHON_PN}-datetime \
- ${PYTHON_PN}-fcntl \
- ${PYTHON_PN}-io \
- ${PYTHON_PN}-logging \
- ${PYTHON_PN}-math \
- ${PYTHON_PN}-numbers \
- ${PYTHON_PN}-shell \
- ${PYTHON_PN}-stringold \
-"
-
-BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python-humanfriendly_4.18.bb b/meta-python/recipes-devtools/python/python-humanfriendly_4.18.bb
deleted file mode 100644
index 4e03a654c9..0000000000
--- a/meta-python/recipes-devtools/python/python-humanfriendly_4.18.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-humanfriendly.inc
diff --git a/meta-python/recipes-devtools/python/python-humanize.inc b/meta-python/recipes-devtools/python/python-humanize.inc
deleted file mode 100644
index 17a3449e73..0000000000
--- a/meta-python/recipes-devtools/python/python-humanize.inc
+++ /dev/null
@@ -1,14 +0,0 @@
-SUMMARY = "Python humanize utilities"
-HOMEPAGE = "http://github.com/jmoiron/humanize"
-
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENCE;md5=d2eff82fc25dd07c919a02465884f02e"
-
-SRC_URI[md5sum] = "e8473d9dc1b220911cac2edd53b1d973"
-SRC_URI[sha256sum] = "a43f57115831ac7c70de098e6ac46ac13be00d69abbf60bdcac251344785bb19"
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-datetime \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-humanize_0.5.1.bb b/meta-python/recipes-devtools/python/python-humanize_0.5.1.bb
deleted file mode 100644
index 57693093dd..0000000000
--- a/meta-python/recipes-devtools/python/python-humanize_0.5.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-humanize.inc
diff --git a/meta-python/recipes-devtools/python/python-hyperlink.inc b/meta-python/recipes-devtools/python/python-hyperlink.inc
deleted file mode 100644
index 653170ca6f..0000000000
--- a/meta-python/recipes-devtools/python/python-hyperlink.inc
+++ /dev/null
@@ -1,17 +0,0 @@
-DESCRIPTION = "A featureful, correct URL for Python"
-HOMEPAGE = "https://github.com/python-hyper/hyperlink"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=3893d4ed05dcc823f8ed685a9ea19bcb"
-
-SRC_URI[sha256sum] = "4288e34705da077fada1111a24a0aa08bb1e76699c9ce49876af722441845654"
-SRC_URI[md5sum] = "4772fb4d87c26a1ab22a6161424e3cba"
-
-inherit pypi
-
-RDEPENDS_${PN} += "${PYTHON_PN}-stringold ${PYTHON_PN}-netclient ${PYTHON_PN}-idna"
-
-PACKAGES =. "${PN}-test "
-
-FILES_${PN}-test += " \
- ${PYTHON_SITEPACKAGES_DIR}/hyperlinkt/test \
-"
diff --git a/meta-python/recipes-devtools/python/python-hyperlink_19.0.0.bb b/meta-python/recipes-devtools/python/python-hyperlink_19.0.0.bb
deleted file mode 100644
index 59a9a5c8dd..0000000000
--- a/meta-python/recipes-devtools/python/python-hyperlink_19.0.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-hyperlink.inc
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-idna.inc b/meta-python/recipes-devtools/python/python-idna.inc
deleted file mode 100644
index 13b0cdb624..0000000000
--- a/meta-python/recipes-devtools/python/python-idna.inc
+++ /dev/null
@@ -1,18 +0,0 @@
-SUMMARY = "Internationalised Domain Names in Applications"
-HOMEPAGE = "https://github.com/kjd/idna"
-LICENSE = "BSD-3-Clause & Python-2.0 & Unicode"
-LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=782775b32f96098512e283fb5d4546cd"
-
-SRC_URI[md5sum] = "2e9ae0b4a0b26d1747c6127cdb060bc1"
-SRC_URI[sha256sum] = "c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407"
-
-RDEPENDS_${PN}_class-target = "\
- ${PYTHON_PN}-codecs \
-"
-
-# Remove bundled egg-info
-do_compile_prepend() {
- rm -rf ${S}/idna.egg-info
-}
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-idna_2.8.bb b/meta-python/recipes-devtools/python/python-idna_2.8.bb
deleted file mode 100644
index 2dcf72a292..0000000000
--- a/meta-python/recipes-devtools/python/python-idna_2.8.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-idna.inc
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-imaging_1.1.7.bb b/meta-python/recipes-devtools/python/python-imaging_1.1.7.bb
deleted file mode 100644
index 60dd7d0a36..0000000000
--- a/meta-python/recipes-devtools/python/python-imaging_1.1.7.bb
+++ /dev/null
@@ -1,48 +0,0 @@
-SUMMARY = "Python Imaging Library (PIL)"
-SECTION = "devel/python"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://README;beginline=92;endline=120;md5=c4371af4579f1e489cf881c1443dd4ec"
-DEPENDS = "freetype jpeg tiff"
-SRCNAME = "Imaging"
-PR = "r5"
-
-SRC_URI = "http://effbot.org/downloads/Imaging-${PV}.tar.gz \
- file://0001-python-imaging-setup.py-force-paths-for-zlib-freetyp.patch \
- file://allow.to.disable.some.features.patch \
- file://fix-freetype-includes.patch \
- file://remove-host-libdir.patch \
- file://python-imaging-CVE-2016-2533.patch \
-"
-
-SRC_URI[md5sum] = "fc14a54e1ce02a0225be8854bfba478e"
-SRC_URI[sha256sum] = "895bc7c2498c8e1f9b99938f1a40dc86b3f149741f105cf7c7bd2e0725405211"
-S = "${WORKDIR}/${SRCNAME}-${PV}"
-
-# There isn't enable/disable option, and lcms is in meta-oe, at least make it explicit when enabled
-# setup.py already has FIXME: add mechanism to explicitly *disable* the use of a library
-PACKAGECONFIG ??= ""
-PACKAGECONFIG[lcms] = ",,lcms"
-
-inherit distutils
-
-do_compile() {
- export STAGING_LIBDIR=${STAGING_LIBDIR}
- export STAGING_INCDIR=${STAGING_INCDIR}
- export LCMS_ENABLED=${@bb.utils.contains('PACKAGECONFIG', 'lcms', 'True', 'False', d)}
- distutils_do_compile
-}
-
-do_install() {
- export STAGING_LIBDIR=${STAGING_LIBDIR}
- export STAGING_INCDIR=${STAGING_INCDIR}
- export LCMS_ENABLED=${@bb.utils.contains('PACKAGECONFIG', 'lcms', 'True', 'False', d)}
- distutils_do_install
- install -d ${D}${datadir}/doc/${BPN}/html/
- install -m 0644 ${S}/README ${D}${datadir}/doc/${BPN}/
- install -m 0644 ${S}/Docs/* ${D}${datadir}/doc/${BPN}/html/
-
- # get rid of #!/usr/local/bin/python
- sed -i -e 's:/usr/local/bin/:${bindir}/env :g' ${D}${bindir}/*
-}
-
-RDEPENDS_${PN} += "python-lang python-stringold"
diff --git a/meta-python/recipes-devtools/python/python-importlib-metadata.inc b/meta-python/recipes-devtools/python/python-importlib-metadata.inc
deleted file mode 100644
index 9eb5da9545..0000000000
--- a/meta-python/recipes-devtools/python/python-importlib-metadata.inc
+++ /dev/null
@@ -1,12 +0,0 @@
-DESCRIPTION = "Read metadata from Python packages"
-HOMEPAGE = "https://pypi.org/project/importlib-metadata/"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=e88ae122f3925d8bde8319060f2ddb8e"
-
-SRC_URI = "https://files.pythonhosted.org/packages/5d/44/636bcd15697791943e2dedda0dbe098d8530a38d113b202817133e0b06c0/importlib_metadata-0.23.tar.gz"
-S = "${WORKDIR}/importlib_metadata-${PV}"
-SRC_URI[md5sum] = "80d677d744995336c9c22d21a85ddeb8"
-SRC_URI[sha256sum] = "aa18d7378b00b40847790e7c27e11673d7fed219354109d0e7b9e5b25dc3ad26"
-
-DEPENDS += "${PYTHON_PN}-setuptools-scm-native"
-RDEPENDS_${PN} += "${PYTHON_PN}-zipp ${PYTHON_PN}-pathlib2"
diff --git a/meta-python/recipes-devtools/python/python-importlib-metadata_0.23.bb b/meta-python/recipes-devtools/python/python-importlib-metadata_0.23.bb
deleted file mode 100644
index 5c213004c8..0000000000
--- a/meta-python/recipes-devtools/python/python-importlib-metadata_0.23.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-importlib-metadata.inc
diff --git a/meta-python/recipes-devtools/python/python-incremental_17.5.0.bb b/meta-python/recipes-devtools/python/python-incremental_17.5.0.bb
deleted file mode 100644
index 139ac0c522..0000000000
--- a/meta-python/recipes-devtools/python/python-incremental_17.5.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-incremental.inc
diff --git a/meta-python/recipes-devtools/python/python-inflection.inc b/meta-python/recipes-devtools/python/python-inflection.inc
deleted file mode 100644
index 556b26820f..0000000000
--- a/meta-python/recipes-devtools/python/python-inflection.inc
+++ /dev/null
@@ -1,14 +0,0 @@
-SUMMARY = "A port of Ruby on Rails' inflection to Python."
-HOMEPAGE = "https://pypi.org/project/inflection"
-LICENSE = "MIT"
-SECTION = "devel/python"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=de7833d9c2ce0052a4073928c76a13d7"
-
-SRC_URI[md5sum] = "7941165e9f148e0520023941c0886b40"
-SRC_URI[sha256sum] = "18ea7fb7a7d152853386523def08736aa8c32636b047ade55f7578c4edeb16ca"
-
-inherit pypi
-
-RDEPENDS_${PN} += "${PYTHON_PN}-pytest"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-inflection_0.3.1.bb b/meta-python/recipes-devtools/python/python-inflection_0.3.1.bb
deleted file mode 100644
index 4a9d497912..0000000000
--- a/meta-python/recipes-devtools/python/python-inflection_0.3.1.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-inherit setuptools
-require python-inflection.inc
-
-RDEPENDS_${PN} += "${PYTHON_PN}-codecs"
diff --git a/meta-python/recipes-devtools/python/python-intervals.inc b/meta-python/recipes-devtools/python/python-intervals.inc
deleted file mode 100644
index a915e09f90..0000000000
--- a/meta-python/recipes-devtools/python/python-intervals.inc
+++ /dev/null
@@ -1,15 +0,0 @@
-DESCRIPTION = "Interval arithmetic for Python"
-HOMEPAGE = "https://github.com/AlexandreDecan/python-intervals"
-SECTION = "devel/python"
-
-LICENSE = "LGPLv3"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=05f1e16a8e59ce3e9a979e881816c2ab"
-
-PYPI_PACKAGE := "python-intervals"
-
-inherit pypi
-
-SRC_URI[md5sum] = "a35dd44269fdb134bf19cfd80cb2c120"
-SRC_URI[sha256sum] = "a8a15b7c2fadb8465310f44aa96e384828b35a29de38ac74738cd665924cb8ac"
-
-BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python-intervals_1.5.4.bb b/meta-python/recipes-devtools/python/python-intervals_1.5.4.bb
deleted file mode 100644
index 3c2a33bbc6..0000000000
--- a/meta-python/recipes-devtools/python/python-intervals_1.5.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-intervals.inc
diff --git a/meta-python/recipes-devtools/python/python-iso8601.inc b/meta-python/recipes-devtools/python/python-iso8601.inc
deleted file mode 100644
index 61e9abbac6..0000000000
--- a/meta-python/recipes-devtools/python/python-iso8601.inc
+++ /dev/null
@@ -1,13 +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[md5sum] = "4de940f691c5ea759fb254384c8ddcf6"
-SRC_URI[sha256sum] = "49c4b20e1f38aa5cf109ddcd39647ac419f928512c869dc01d5c7098eddede82"
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-datetime \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-iso8601_0.1.12.bb b/meta-python/recipes-devtools/python/python-iso8601_0.1.12.bb
deleted file mode 100644
index c543cf9f97..0000000000
--- a/meta-python/recipes-devtools/python/python-iso8601_0.1.12.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-iso8601.inc
diff --git a/meta-python/recipes-devtools/python/python-isodate.inc b/meta-python/recipes-devtools/python/python-isodate.inc
deleted file mode 100644
index 3cb6bb8167..0000000000
--- a/meta-python/recipes-devtools/python/python-isodate.inc
+++ /dev/null
@@ -1,14 +0,0 @@
-SUMMARY = "ISO 8601 date/time parser"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e910b35b0ef4e1f665b9a75d6afb7709"
-
-SRC_URI[md5sum] = "0e1203fce27ce65e2d01c5f21c4d428f"
-SRC_URI[sha256sum] = "2e364a3d5759479cdb2d37cce6b9376ea504db2ff90252a2e5b7cc89cc9ff2d8"
-
-inherit pypi
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-six \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-isodate_0.6.0.bb b/meta-python/recipes-devtools/python/python-isodate_0.6.0.bb
deleted file mode 100644
index d48e123461..0000000000
--- a/meta-python/recipes-devtools/python/python-isodate_0.6.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-isodate.inc
diff --git a/meta-python/recipes-devtools/python/python-isort.inc b/meta-python/recipes-devtools/python/python-isort.inc
deleted file mode 100644
index 359b180121..0000000000
--- a/meta-python/recipes-devtools/python/python-isort.inc
+++ /dev/null
@@ -1,17 +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=8;endline=8;md5=8227180126797a0148f94f483f3e1489"
-
-SRC_URI[md5sum] = "fb554e9c8f9aa76e333a03d470a5cf52"
-SRC_URI[sha256sum] = "b9c40e9750f3d77e6e4d441d8b0266cf555e7cdabdcff33c4fd06366ca761ef8"
-
-inherit pypi
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-datetime \
- ${PYTHON_PN}-shell \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-isort_4.3.4.bb b/meta-python/recipes-devtools/python/python-isort_4.3.4.bb
deleted file mode 100644
index fa46d89b5e..0000000000
--- a/meta-python/recipes-devtools/python/python-isort_4.3.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-isort.inc
diff --git a/meta-python/recipes-devtools/python/python-itsdangerous.inc b/meta-python/recipes-devtools/python/python-itsdangerous.inc
deleted file mode 100644
index 84f9e7742d..0000000000
--- a/meta-python/recipes-devtools/python/python-itsdangerous.inc
+++ /dev/null
@@ -1,14 +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;md5=b61841e2bf5f07884148e2a6f1bcab0c"
-
-SRC_URI[md5sum] = "a3d55aa79369aef5345c036a8a26307f"
-SRC_URI[sha256sum] = "cbb3fcf8d3e33df861709ecaf89d9e6629cff0a217bc2848f1b41cd30d360519"
-
-CLEANBROKEN = "1"
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-simplejson \
- ${PYTHON_PN}-netclient \
-"
diff --git a/meta-python/recipes-devtools/python/python-itsdangerous_0.24.bb b/meta-python/recipes-devtools/python/python-itsdangerous_0.24.bb
deleted file mode 100644
index 8c99cb4ca7..0000000000
--- a/meta-python/recipes-devtools/python/python-itsdangerous_0.24.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-inherit pypi setuptools
-require python-itsdangerous.inc
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-zlib \
-"
diff --git a/meta-python/recipes-devtools/python/python-javaobj-py3_0.2.4.bb b/meta-python/recipes-devtools/python/python-javaobj-py3_0.2.4.bb
deleted file mode 100644
index ed34740e80..0000000000
--- a/meta-python/recipes-devtools/python/python-javaobj-py3_0.2.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-javaobj-py3.inc
-inherit setuptools
diff --git a/meta-python/recipes-devtools/python/python-jinja2.inc b/meta-python/recipes-devtools/python/python-jinja2.inc
deleted file mode 100644
index 6a6aad9efa..0000000000
--- a/meta-python/recipes-devtools/python/python-jinja2.inc
+++ /dev/null
@@ -1,17 +0,0 @@
-DESCRIPTION = "Python Jinja2: A small but fast and easy to use stand-alone template engine written in pure python."
-LICENSE = "BSD-3-Clause"
-LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=5dc88300786f1c214c1e9827a5229462"
-
-PYPI_PACKAGE = "Jinja2"
-
-SRC_URI[md5sum] = "7883559bc5cc3e2781d94b4be61cfdcd"
-SRC_URI[sha256sum] = "9fe95f19286cfefaa917656583d020be14e7859c6b0252588391e47db34527de"
-
-RDEPENDS_${PN} += "${PYTHON_PN}-io ${PYTHON_PN}-pickle ${PYTHON_PN}-crypt \
- ${PYTHON_PN}-math ${PYTHON_PN}-netclient \
- ${PYTHON_PN}-pprint ${PYTHON_PN}-shell ${PYTHON_PN}-markupsafe \
- ${PYTHON_PN}-json ${PYTHON_PN}-threading ${PYTHON_PN}-numbers"
-
-CLEANBROKEN = "1"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-jinja2_2.10.3.bb b/meta-python/recipes-devtools/python/python-jinja2_2.10.3.bb
deleted file mode 100644
index 5233cf40c0..0000000000
--- a/meta-python/recipes-devtools/python/python-jinja2_2.10.3.bb
+++ /dev/null
@@ -1,8 +0,0 @@
-inherit pypi setuptools
-require python-jinja2.inc
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-lang \
- ${PYTHON_PN}-re \
- ${PYTHON_PN}-textutils \
-"
diff --git a/meta-python/recipes-devtools/python/python-jsonpatch.inc b/meta-python/recipes-devtools/python/python-jsonpatch.inc
deleted file mode 100644
index 8f64c2ab52..0000000000
--- a/meta-python/recipes-devtools/python/python-jsonpatch.inc
+++ /dev/null
@@ -1,12 +0,0 @@
-SUMMARY = "Appling JSON patches in Python 2.6+ and 3.x"
-HOMEPAGE = "https://github.com/stefankoegl/python-json-patch"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://COPYING;md5=32b15c843b7a329130f4e266a281ebb3"
-
-inherit pypi
-
-SRC_URI[md5sum] = "e86503f05fa192fa870d7004b8ce929a"
-SRC_URI[sha256sum] = "cbb72f8bf35260628aea6b508a107245f757d1ec839a19c34349985e2c05645a"
-
-RDEPENDS_${PN} += "${PYTHON_PN}-json ${PYTHON_PN}-jsonpointer ${PYTHON_PN}-netclient ${PYTHON_PN}-stringold"
-
diff --git a/meta-python/recipes-devtools/python/python-jsonpatch_1.24.bb b/meta-python/recipes-devtools/python/python-jsonpatch_1.24.bb
deleted file mode 100644
index 90cd318026..0000000000
--- a/meta-python/recipes-devtools/python/python-jsonpatch_1.24.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-inherit setuptools
-require python-jsonpatch.inc
-
-RDEPENDS_${PN} += "${PYTHON_PN}-re"
diff --git a/meta-python/recipes-devtools/python/python-jsonpointer.inc b/meta-python/recipes-devtools/python/python-jsonpointer.inc
deleted file mode 100644
index 4ed01ed6cd..0000000000
--- a/meta-python/recipes-devtools/python/python-jsonpointer.inc
+++ /dev/null
@@ -1,13 +0,0 @@
-SUMMARY = "Resolve JSON Pointers in Python"
-HOMEPAGE = "https://github.com/stefankoegl/python-json-pointer"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=32b15c843b7a329130f4e266a281ebb3"
-
-inherit pypi
-
-SRC_URI[md5sum] = "741b98d0e693b08b5e44e0a9da5a7bb7"
-SRC_URI[sha256sum] = "c192ba86648e05fdae4f08a17ec25180a9aef5008d973407b581798a83975362"
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-json \
-"
diff --git a/meta-python/recipes-devtools/python/python-jsonpointer_2.0.bb b/meta-python/recipes-devtools/python/python-jsonpointer_2.0.bb
deleted file mode 100644
index e13a776adb..0000000000
--- a/meta-python/recipes-devtools/python/python-jsonpointer_2.0.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-inherit setuptools
-require python-jsonpointer.inc
-
-RDEPENDS_${PN} += "${PYTHON_PN}-re"
diff --git a/meta-python/recipes-devtools/python/python-jsonschema.inc b/meta-python/recipes-devtools/python/python-jsonschema.inc
deleted file mode 100644
index d9ccf1cad4..0000000000
--- a/meta-python/recipes-devtools/python/python-jsonschema.inc
+++ /dev/null
@@ -1,27 +0,0 @@
-SUMMARY = "An implementation of JSON Schema validation for Python"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://COPYING;md5=7a60a81c146ec25599a3e1dabb8610a8"
-
-SRC_URI[md5sum] = "a802ab85600074a726ef6acc4e6a8148"
-SRC_URI[sha256sum] = "2fa0684276b6333ff3c0b1b27081f4b2305f0a36cf702a23db50edb141893c3f"
-
-DEPENDS += "${PYTHON_PN}-vcversioner-native ${PYTHON_PN}-setuptools-scm-native"
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-attrs \
- ${PYTHON_PN}-core \
- ${PYTHON_PN}-io \
- ${PYTHON_PN}-json \
- ${PYTHON_PN}-netclient \
- ${PYTHON_PN}-numbers \
- ${PYTHON_PN}-pkgutil \
- ${PYTHON_PN}-pprint \
- ${PYTHON_PN}-pyrsistent \
- ${PYTHON_PN}-rfc3987 \
- ${PYTHON_PN}-shell \
- ${PYTHON_PN}-strict-rfc3339 \
- ${PYTHON_PN}-unittest \
- ${PYTHON_PN}-setuptools-scm \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-jsonschema_3.1.1.bb b/meta-python/recipes-devtools/python/python-jsonschema_3.1.1.bb
deleted file mode 100644
index b677c646e7..0000000000
--- a/meta-python/recipes-devtools/python/python-jsonschema_3.1.1.bb
+++ /dev/null
@@ -1,12 +0,0 @@
-inherit pypi setuptools
-require python-jsonschema.inc
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-argparse \
- ${PYTHON_PN}-contextlib \
- ${PYTHON_PN}-functools32 \
- ${PYTHON_PN}-lang \
- ${PYTHON_PN}-re \
- ${PYTHON_PN}-subprocess \
- ${PYTHON_PN}-textutils \
-"
diff --git a/meta-python/recipes-devtools/python/python-kconfiglib-10.42.0.inc b/meta-python/recipes-devtools/python/python-kconfiglib-10.42.0.inc
deleted file mode 100644
index 72d6a65922..0000000000
--- a/meta-python/recipes-devtools/python/python-kconfiglib-10.42.0.inc
+++ /dev/null
@@ -1,8 +0,0 @@
-DESCRIPTION = "Kconfiglib is a Kconfig implementation in Python"
-LICENSE = "ISC"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=712177a72a3937909543eda3ad1bfb7c"
-
-SRC_URI[md5sum] = "2306279a050c6a888f34a5719047f217"
-SRC_URI[sha256sum] = "0070eb9061f924e1fa7bc2b1f0aeea1d38e1ddf9bbdbd4b5c346bcf1a0848674"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-lazy-object-proxy.inc b/meta-python/recipes-devtools/python/python-lazy-object-proxy.inc
deleted file mode 100644
index 83d2ea3cd3..0000000000
--- a/meta-python/recipes-devtools/python/python-lazy-object-proxy.inc
+++ /dev/null
@@ -1,10 +0,0 @@
-SUMMARY = "A fast and thorough lazy object proxy"
-HOMEPAGE = "https://python-lazy-object-proxy.readthedocs.io/"
-LICENSE = "BSD"
-SECTION = "devel/python"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=ec680df42d8ad56427a83308817658cc"
-
-SRC_URI[md5sum] = "e128152b76eb5b9ba759504936139fd0"
-SRC_URI[sha256sum] = "eb91be369f945f10d3a49f5f9be8b3d0b93a4c2be8f8a5b83b0571b8123e0a7a"
-
-inherit pypi
diff --git a/meta-python/recipes-devtools/python/python-lazy-object-proxy_1.3.1.bb b/meta-python/recipes-devtools/python/python-lazy-object-proxy_1.3.1.bb
deleted file mode 100644
index df4d60bffe..0000000000
--- a/meta-python/recipes-devtools/python/python-lazy-object-proxy_1.3.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-lazy-object-proxy.inc
diff --git a/meta-python/recipes-devtools/python/python-libusb1_3.1.0.bb b/meta-python/recipes-devtools/python/python-libusb1_3.1.0.bb
new file mode 100644
index 0000000000..a045dfa8bc
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python-libusb1_3.1.0.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Pure-python wrapper for libusb-1.0"
+HOMEPAGE = "http://github.com/vpelletier/python-libusb1"
+AUTHOR = "Vincent Pelletier <plr.vincent@gmail.com>"
+LICENSE = "GPL-2.0-only & LGPL-2.1-only"
+LIC_FILES_CHKSUM = " \
+ file://COPYING;md5=751419260aa954499f7abaabaa882bbe \
+ file://COPYING.LESSER;md5=4fbd65380cdd255951079008b364516c \
+"
+
+SRC_URI = "https://github.com/vpelletier/${BPN}/releases/download/${PV}/libusb1-${PV}.tar.gz"
+SRC_URI[md5sum] = "7b4f094786d1dfc8d011c7649d8ccb97"
+SRC_URI[sha256sum] = "4ee9b0a55f8bd0b3ea7017ae919a6c1f439af742c4a4b04543c5fd7af89b828c"
+
+S = "${WORKDIR}/libusb1-${PV}"
+
+RDEPENDS:${PN} = "libusb1"
+
+inherit setuptools3
diff --git a/meta-python/recipes-devtools/python/python-linecache2_1.0.0.bb b/meta-python/recipes-devtools/python/python-linecache2_1.0.0.bb
deleted file mode 100644
index 386da2daa5..0000000000
--- a/meta-python/recipes-devtools/python/python-linecache2_1.0.0.bb
+++ /dev/null
@@ -1,13 +0,0 @@
-SUMMARY = "A backport of linecache to older supported Pythons"
-HOMEPAGE = "https://github.com/testing-cabal/linecache2"
-LICENSE = "Python-2.0"
-LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=19;endline=19;md5=368ddc8588431c180ae7c33f4fb57519"
-
-DEPENDS = "${PYTHON_PN}-pbr-native"
-
-SRC_URI[md5sum] = "7b25d0289ec36bff1f9e63c4329ce65c"
-SRC_URI[sha256sum] = "4b26ff4e7110db76eeb6f5a7b64a82623839d595c2038eeda662f2a2db78e97c"
-
-inherit pypi setuptools
-
-CLEAN_BROKEN = "1"
diff --git a/meta-python/recipes-devtools/python/python-lockfile_0.12.2.bb b/meta-python/recipes-devtools/python/python-lockfile_0.12.2.bb
deleted file mode 100644
index 20ea018045..0000000000
--- a/meta-python/recipes-devtools/python/python-lockfile_0.12.2.bb
+++ /dev/null
@@ -1,19 +0,0 @@
-DESCRIPTION = "Platform-independent file locking module"
-HOMEPAGE = "http://launchpad.net/pylockfile"
-SECTION = "devel/python"
-
-RDEPENDS_${PN} = "python-threading"
-
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=2340dffbbfea534b58f1349984eeef72"
-
-inherit pypi setuptools
-
-SRC_URI[md5sum] = "a6a1a82957a23afdf44cfdd039b65ff9"
-SRC_URI[sha256sum] = "6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"
-
-# Satisfy setup.py 'setup_requires'
-DEPENDS += " \
- python-pbr-native \
- "
-
diff --git a/meta-python/recipes-devtools/python/python-lrparsing_1.0.16.bb b/meta-python/recipes-devtools/python/python-lrparsing_1.0.16.bb
deleted file mode 100644
index 2cfe3012e0..0000000000
--- a/meta-python/recipes-devtools/python/python-lrparsing_1.0.16.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-lrparsing.inc
diff --git a/meta-python/recipes-devtools/python/python-lxml.inc b/meta-python/recipes-devtools/python/python-lxml.inc
deleted file mode 100644
index a97167f0df..0000000000
--- a/meta-python/recipes-devtools/python/python-lxml.inc
+++ /dev/null
@@ -1,55 +0,0 @@
-SUMMARY = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API."
-DESCRIPTION = "lxml is a Pythonic, mature binding for the libxml2 and \
-libxslt libraries. It provides safe and convenient access to these \
-libraries using the ElementTree API. It extends the ElementTree API \
-significantly to offer support for XPath, RelaxNG, XML Schema, XSLT, \
-C14N and much more."
-HOMEPAGE = "http://codespeak.net/lxml"
-SECTION = "devel/python"
-LICENSE = "BSD & GPLv2 & MIT & PSF"
-LIC_FILES_CHKSUM = "file://LICENSES.txt;md5=e4c045ebad958ead4b48008f70838403 \
- file://doc/licenses/elementtree.txt;md5=eb34d036a6e3d56314ee49a6852ac891 \
- file://doc/licenses/BSD.txt;md5=700a1fc17f4797d4f2d34970c8ee694b \
- file://doc/licenses/GPL.txt;md5=94d55d512a9ba36caa9b7df079bae19f \
- file://src/lxml/isoschematron/resources/rng/iso-schematron.rng;beginline=2;endline=7;md5=fc85684a8dd5fa272c086bceb0d99e10 \
- file://src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_schematron_message.xsl;beginline=2;endline=24;md5=cc86b7b2bbc678e13f58ea403eb9929b \
- file://src/lxml/isoschematron/resources/xsl/RNG2Schtrn.xsl;beginline=2;endline=7;md5=5b03236d293dc3784205542b409d2f53 \
- "
-
-DEPENDS += "libxml2 libxslt"
-
-SRC_URI[md5sum] = "ce976a2d3c630d7fde86d3a4c3a1c606"
-SRC_URI[sha256sum] = "c81cb40bff373ab7a7446d6bbca0190bccc5be3448b47b51d729e37799bb5692"
-
-DISTUTILS_BUILD_ARGS += " \
- --with-xslt-config='pkg-config libxslt' \
- --with-xml2-config='pkg-config libxml-2.0' \
-"
-
-DISTUTILS_INSTALL_ARGS += " \
- --with-xslt-config='pkg-config libxslt' \
- --with-xml2-config='pkg-config libxml-2.0' \
-"
-
-inherit pypi
-
-# {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"
-
-do_configure_prepend() {
- sed -i -e 's/--version/--modversion/' ${B}/setupinfo.py
-}
-
-BBCLASSEXTEND = "native nativesdk"
-
-RDEPENDS_${PN} += "libxml2 libxslt ${PYTHON_PN}-compression"
-RDEPENDS_${PN}_class-native = "libxml2-native libxslt-native"
diff --git a/meta-python/recipes-devtools/python/python-lxml_4.4.1.bb b/meta-python/recipes-devtools/python/python-lxml_4.4.1.bb
deleted file mode 100644
index 81ccb12d87..0000000000
--- a/meta-python/recipes-devtools/python/python-lxml_4.4.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-lxml.inc
diff --git a/meta-python/recipes-devtools/python/python-m2crypto.inc b/meta-python/recipes-devtools/python/python-m2crypto.inc
deleted file mode 100644
index a36ab8a7fa..0000000000
--- a/meta-python/recipes-devtools/python/python-m2crypto.inc
+++ /dev/null
@@ -1,54 +0,0 @@
-SUMMARY = "A Python crypto and SSL toolkit"
-HOMEPAGE = "https://gitlab.com/m2crypto/m2crypto"
-
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENCE;md5=b0e1f0b7d0ce8a62c18b1287b991800e"
-
-FILESEXTRAPATHS_prepend := "${THISDIR}/python-m2crypto:"
-
-SRC_URI += "file://0001-setup.py-link-in-sysroot-not-in-host-directories.patch \
- file://cross-compile-platform.patch \
- file://m2crypto-0.26.4-gcc_macros.patch \
- "
-SRC_URI[md5sum] = "7fce3cbf85eb84a669682892b935746b"
-SRC_URI[sha256sum] = "a1b2751cdadc6afac3df8a5799676b7b7c67a6ad144bb62d38563062e7cd3fc6"
-
-PYPI_PACKAGE = "M2Crypto"
-inherit pypi siteinfo
-
-DEPENDS += "openssl swig-native"
-RDEPENDS_${PN} += "python-typing"
-
-DISTUTILS_BUILD_ARGS += "build_ext --openssl=${STAGING_EXECPREFIXDIR} -I${STAGING_INCDIR}"
-DISTUTILS_INSTALL_ARGS += "build_ext --openssl=${STAGING_EXECPREFIXDIR}"
-
-SWIG_FEATURES_x86 = "-D__i386__"
-SWIG_FEATURES_x32 = "-D__ILP32__"
-SWIG_FEATURES ?= "-D__${HOST_ARCH}__"
-export SWIG_FEATURES
-
-# Get around a problem with swig, but only if the
-# multilib header file exists.
-#
-do_configure_prepend() {
- ${CPP} -dM - < /dev/null | grep -v '__\(STDC\|REGISTER_PREFIX\|GNUC\|STDC_HOSTED\)__' \
- | sed 's/^\(#define \([^ ]*\) .*\)$/#undef \2\n\1/' > SWIG/gcc_macros.h
-
- if [ "${SITEINFO_BITS}" = "64" ];then
- bit="64"
- else
- bit="32"
- fi
-
- if [ -e ${STAGING_INCDIR}/openssl/opensslconf-${bit}.h ] ;then
- for i in SWIG/_ec.i SWIG/_evp.i; do
- sed -i -e "s/opensslconf.*\./opensslconf-${bit}\./" "$i"
- done
- elif [ -e ${STAGING_INCDIR}/openssl/opensslconf-n${bit}.h ] ;then
- for i in SWIG/_ec.i SWIG/_evp.i; do
- sed -i -e "s/opensslconf.*\./opensslconf-n${bit}\./" "$i"
- done
- fi
-}
-
-BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python-m2crypto/m2crypto-0.26.4-gcc_macros.patch b/meta-python/recipes-devtools/python/python-m2crypto/m2crypto-0.26.4-gcc_macros.patch
deleted file mode 100644
index 7f6dd29f8a..0000000000
--- a/meta-python/recipes-devtools/python/python-m2crypto/m2crypto-0.26.4-gcc_macros.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-Imported from Fedora
-
-Index: M2Crypto-0.30.1/SWIG/_m2crypto.i
-===================================================================
---- M2Crypto-0.30.1.orig/SWIG/_m2crypto.i
-+++ M2Crypto-0.30.1/SWIG/_m2crypto.i
-@@ -8,6 +8,11 @@
- *
- */
-
-+%import "gcc_macros.h"
-+
-+%ignore WCHAR_MAX;
-+%ignore WCHAR_MIN;
-+
- %module(threads=1) m2crypto
- /* We really don't need threadblock (PyGILState_Ensure() etc.) anywhere.
- Disable threadallow as well, only enable it for operations likely to
-@@ -15,11 +20,6 @@
- %nothreadblock;
- %nothreadallow;
-
--#if SWIG_VERSION >= 0x030000
--#define __WCHAR_MAX__ __WCHAR_MAX
--#define __WCHAR_MIN__ __WCHAR_MIN
--#endif
--
- %{
- #ifdef _WIN32
- #define _WINSOCKAPI_
-@@ -95,4 +95,3 @@ static PyObject *x509_store_verify_cb_fu
- %constant int encrypt = 1;
- %constant int decrypt = 0;
- #endif
--
diff --git a/meta-python/recipes-devtools/python/python-m2crypto_0.30.1.bb b/meta-python/recipes-devtools/python/python-m2crypto_0.30.1.bb
deleted file mode 100644
index c612fcdc58..0000000000
--- a/meta-python/recipes-devtools/python/python-m2crypto_0.30.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-m2crypto.inc
diff --git a/meta-python/recipes-devtools/python/python-mako.inc b/meta-python/recipes-devtools/python/python-mako.inc
deleted file mode 100644
index abcbb88418..0000000000
--- a/meta-python/recipes-devtools/python/python-mako.inc
+++ /dev/null
@@ -1,21 +0,0 @@
-SUMMARY = "A super-fast templating language that borrows the best ideas from the existing templating languages"
-HOMEPAGE = "http://www.makotemplates.org/"
-SECTION = "devel/python"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=df7e6c7c82990acf0228a55e00d29bc9"
-
-PYPI_PACKAGE = "Mako"
-
-inherit pypi
-
-SRC_URI[md5sum] = "6c3f2da0b74af529a4c4a537d0848bf2"
-SRC_URI[sha256sum] = "a36919599a9b7dc5d86a7a8988f23a9a3a3d083070023bab23d64f7f1d1e0a4b"
-
-RDEPENDS_${PN} = " \
- ${PYTHON_PN}-html \
- ${PYTHON_PN}-netclient \
- ${PYTHON_PN}-shell \
- ${PYTHON_PN}-threading \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-mako_1.1.0.bb b/meta-python/recipes-devtools/python/python-mako_1.1.0.bb
deleted file mode 100644
index 3372eeb28c..0000000000
--- a/meta-python/recipes-devtools/python/python-mako_1.1.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-mako.inc
diff --git a/meta-python/recipes-devtools/python/python-markupsafe.inc b/meta-python/recipes-devtools/python/python-markupsafe.inc
deleted file mode 100644
index 33d63b3e5d..0000000000
--- a/meta-python/recipes-devtools/python/python-markupsafe.inc
+++ /dev/null
@@ -1,14 +0,0 @@
-DESCRIPTION = "Implements a XML/HTML/XHTML Markup safe string for Python"
-HOMEPAGE = "http://github.com/mitsuhiko/markupsafe"
-LICENSE = "BSD-3-Clause"
-LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=ffeffa59c90c9c4a033c7574f8f3fb75"
-
-SRC_URI[md5sum] = "43fd756864fe42063068e092e220c57b"
-SRC_URI[sha256sum] = "29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"
-
-PYPI_PACKAGE = "MarkupSafe"
-inherit pypi
-
-RDEPENDS_${PN} += "${PYTHON_PN}-stringold"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-markupsafe_1.1.1.bb b/meta-python/recipes-devtools/python/python-markupsafe_1.1.1.bb
deleted file mode 100644
index 05bbe8a357..0000000000
--- a/meta-python/recipes-devtools/python/python-markupsafe_1.1.1.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-inherit setuptools
-require python-markupsafe.inc
-
-RDEPENDS_${PN} += "${PYTHON_PN}-re"
-
-BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python-matplotlib/fix_setupext.patch b/meta-python/recipes-devtools/python/python-matplotlib/fix_setupext.patch
deleted file mode 100644
index 21b9094a14..0000000000
--- a/meta-python/recipes-devtools/python/python-matplotlib/fix_setupext.patch
+++ /dev/null
@@ -1,110 +0,0 @@
-This fixes the numpy import problem in setupext.py using a hard-coded path.
-
-Index: matplotlib-2.0.2/setupext.py
-===================================================================
---- matplotlib-2.0.2.orig/setupext.py
-+++ matplotlib-2.0.2/setupext.py
-@@ -148,6 +148,7 @@ def has_include_file(include_dirs, filen
- Returns `True` if `filename` can be found in one of the
- directories in `include_dirs`.
- """
-+ return True
- if sys.platform == 'win32':
- include_dirs += os.environ.get('INCLUDE', '.').split(';')
- for dir in include_dirs:
-@@ -172,7 +173,7 @@ def get_base_dirs():
- Returns a list of standard base directories on this platform.
- """
- if options['basedirlist']:
-- return options['basedirlist']
-+ return [os.environ['STAGING_LIBDIR']]
-
- basedir_map = {
- 'win32': ['win32_static', ],
-@@ -260,14 +261,6 @@ def make_extension(name, files, *args, *
- `distutils.core.Extension` constructor.
- """
- ext = DelayedExtension(name, files, *args, **kwargs)
-- for dir in get_base_dirs():
-- include_dir = os.path.join(dir, 'include')
-- if os.path.exists(include_dir):
-- ext.include_dirs.append(include_dir)
-- for lib in ('lib', 'lib64'):
-- lib_dir = os.path.join(dir, lib)
-- if os.path.exists(lib_dir):
-- ext.library_dirs.append(lib_dir)
- ext.include_dirs.append('.')
-
- return ext
-@@ -314,6 +307,7 @@ class PkgConfig(object):
- " matplotlib may not be able to find some of its dependencies")
-
- def set_pkgconfig_path(self):
-+ return
- pkgconfig_path = sysconfig.get_config_var('LIBDIR')
- if pkgconfig_path is None:
- return
-@@ -875,14 +869,14 @@ class Numpy(SetupPackage):
- reload(numpy)
-
- ext = Extension('test', [])
-- ext.include_dirs.append(numpy.get_include())
-+ ext.include_dirs.append(os.path.join(os.environ['STAGING_LIBDIR'], 'python2.7/site-packages/numpy/core/include/'))
- if not has_include_file(
- ext.include_dirs, os.path.join("numpy", "arrayobject.h")):
- warnings.warn(
- "The C headers for numpy could not be found. "
- "You may need to install the development package")
-
-- return [numpy.get_include()]
-+ return [os.path.join(os.environ['STAGING_LIBDIR'], 'python2.7/site-packages/numpy/core/include/')]
-
- def check(self):
- min_version = extract_versions()['__version__numpy__']
-Index: matplotlib-2.0.2/setup.py
-===================================================================
---- matplotlib-2.0.2.orig/setup.py
-+++ matplotlib-2.0.2/setup.py
-@@ -66,28 +66,6 @@ mpl_packages = [
- setupext.Python(),
- setupext.Platform(),
- 'Required dependencies and extensions',
-- setupext.Numpy(),
-- setupext.Six(),
-- setupext.Dateutil(),
-- setupext.FuncTools32(),
-- setupext.Subprocess32(),
-- setupext.Pytz(),
-- setupext.Cycler(),
-- setupext.Tornado(),
-- setupext.Pyparsing(),
-- setupext.LibAgg(),
-- setupext.FreeType(),
-- setupext.FT2Font(),
-- setupext.Png(),
-- setupext.Qhull(),
-- setupext.Image(),
-- setupext.TTConv(),
-- setupext.Path(),
-- setupext.ContourLegacy(),
-- setupext.Contour(),
-- setupext.Delaunay(),
-- setupext.QhullWrap(),
-- setupext.Tri(),
- 'Optional subpackages',
- setupext.SampleData(),
- setupext.Toolkits(),
-@@ -100,13 +78,8 @@ mpl_packages = [
- setupext.BackendMacOSX(),
- setupext.BackendQt5(),
- setupext.BackendQt4(),
-- setupext.BackendGtk3Agg(),
- setupext.BackendGtk3Cairo(),
-- setupext.BackendGtkAgg(),
-- setupext.BackendTkAgg(),
-- setupext.BackendWxAgg(),
- setupext.BackendGtk(),
-- setupext.BackendAgg(),
- setupext.BackendCairo(),
- setupext.Windowing(),
- 'Optional LaTeX dependencies',
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-mccabe_0.4.0.bb b/meta-python/recipes-devtools/python/python-mccabe_0.4.0.bb
deleted file mode 100644
index 6b63cd7802..0000000000
--- a/meta-python/recipes-devtools/python/python-mccabe_0.4.0.bb
+++ /dev/null
@@ -1,20 +0,0 @@
-SUMMARY = "McCabe checker, plugin for flake8"
-HOMEPAGE = "https://github.com/dreamhost/cliff"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://README.rst;md5=f8b50fba1711ecac6bcdb6324f85a66d"
-
-SRC_URI += " \
- file://0001-python-mccabe-remove-unnecessary-setup_requires-pyte.patch \
-"
-
-SRC_URI[md5sum] = "8c425db05f310adcd4bb174b991f26f5"
-SRC_URI[sha256sum] = "9a2b12ebd876e77c72e41ebf401cc2e7c5b566649d50105ca49822688642207b"
-
-inherit pypi setuptools
-
-RDEPENDS_${PN} += " \
- python-prettytable \
- python-cmd2 \
- python-pyparsing"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-mock_3.0.5.bb b/meta-python/recipes-devtools/python/python-mock_3.0.5.bb
deleted file mode 100644
index db71066495..0000000000
--- a/meta-python/recipes-devtools/python/python-mock_3.0.5.bb
+++ /dev/null
@@ -1,22 +0,0 @@
-SUMMARY = "A Python Mocking and Patching Library for Testing"
-LICENSE = "BSD-2-Clause"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=de9dfbf780446b18aab11f00baaf5b7e"
-
-SRC_URI[md5sum] = "d834a46d9a129be3e76fdcc99751e82c"
-SRC_URI[sha256sum] = "83657d894c90d5681d62155c82bda9c1187827525880eda8ff5df4ec813437c3"
-
-inherit pypi setuptools
-
-DEPENDS += " \
- python-pbr-native"
-
-RDEPENDS_${PN} += " \
- python-prettytable \
- python-cmd2 \
- python-pyparsing \
- python-mccabe \
- python-pep8 \
- python-pyflakes \
- python-pbr \
- python-funcsigs \
-"
diff --git a/meta-python/recipes-devtools/python/python-monotonic_1.5.bb b/meta-python/recipes-devtools/python/python-monotonic_1.5.bb
deleted file mode 100644
index 01e7b1ca0a..0000000000
--- a/meta-python/recipes-devtools/python/python-monotonic_1.5.bb
+++ /dev/null
@@ -1,10 +0,0 @@
-SUMMARY = "An implementation of time.monotonic() for Python 2.0 through 3.2"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=d2794c0df5b907fdace235a619d80314"
-
-SRC_URI[md5sum] = "9f81cb0e5966479754453dea2b6822f4"
-SRC_URI[sha256sum] = "23953d55076df038541e648a53676fb24980f7a1be290cdda21300b3bc21dfb0"
-
-inherit pypi setuptools
-
-RDEPENDS_${PN} += "${PYTHON_PN}-ctypes ${PYTHON_PN}-io ${PYTHON_PN}-re ${PYTHON_PN}-threading"
diff --git a/meta-python/recipes-devtools/python/python-more-itertools.inc b/meta-python/recipes-devtools/python/python-more-itertools.inc
deleted file mode 100644
index 41c334e8d7..0000000000
--- a/meta-python/recipes-devtools/python/python-more-itertools.inc
+++ /dev/null
@@ -1,9 +0,0 @@
-DESCRIPTION = "More routines for operating on iterables, beyond itertools"
-HOMEPAGE = "https://github.com/erikrose/more-itertools"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=3396ea30f9d21389d7857719816f83b5"
-
-SRC_URI[md5sum] = "f647bfd27243a7bebe53b5ddb6a3b1c4"
-SRC_URI[sha256sum] = "409cd48d4db7052af495b09dec721011634af3753ae1ef92d2b32f73a745f832"
-
-inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python/python-more-itertools_7.2.0.bb b/meta-python/recipes-devtools/python/python-more-itertools_7.2.0.bb
deleted file mode 100644
index 0702aad4ef..0000000000
--- a/meta-python/recipes-devtools/python/python-more-itertools_7.2.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-more-itertools.inc
diff --git a/meta-python/recipes-devtools/python/python-msgpack.inc b/meta-python/recipes-devtools/python/python-msgpack.inc
deleted file mode 100644
index adf5c3e9f9..0000000000
--- a/meta-python/recipes-devtools/python/python-msgpack.inc
+++ /dev/null
@@ -1,13 +0,0 @@
-SUMMARY = "MessagePack (de)serializer"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://COPYING;md5=cd9523181d9d4fbf7ffca52eaa2a5751"
-
-PYPI_PACKAGE = "msgpack"
-inherit pypi
-
-SRC_URI[md5sum] = "ba46fdee995565f40e332bd7eea882f1"
-SRC_URI[sha256sum] = "ea3c2f859346fcd55fc46e96885301d9c2f7a36d453f5d8f2967840efa1e1830"
-
-RDEPENDS_${PN}_class-target += "\
- ${PYTHON_PN}-io \
-"
diff --git a/meta-python/recipes-devtools/python/python-msgpack_0.6.2.bb b/meta-python/recipes-devtools/python/python-msgpack_0.6.2.bb
deleted file mode 100644
index 2c2c8f2add..0000000000
--- a/meta-python/recipes-devtools/python/python-msgpack_0.6.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-msgpack.inc
-inherit setuptools
diff --git a/meta-python/recipes-devtools/python/python-ndg-httpsclient.inc b/meta-python/recipes-devtools/python/python-ndg-httpsclient.inc
deleted file mode 100644
index 91235b9614..0000000000
--- a/meta-python/recipes-devtools/python/python-ndg-httpsclient.inc
+++ /dev/null
@@ -1,25 +0,0 @@
-DESCRIPTION = "Provides enhanced HTTPS support for httplib and urllib2 using PyOpenSSL"
-HOMEPAGE = "http://python-requests.org"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://MANIFEST.in;md5=ce22c0cd986d2de3f7073cd6b5523ae0"
-
-SRC_URI[md5sum] = "b0fc8ea38f87d2c1ab1ed79a95c078f9"
-SRC_URI[sha256sum] = "d72faed0376ab039736c2ba12e30695e2788c4aa569c9c3e3d72131de2592210"
-
-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 = ""
diff --git a/meta-python/recipes-devtools/python/python-ndg-httpsclient_0.5.1.bb b/meta-python/recipes-devtools/python/python-ndg-httpsclient_0.5.1.bb
deleted file mode 100644
index 9cd881a3ef..0000000000
--- a/meta-python/recipes-devtools/python/python-ndg-httpsclient_0.5.1.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-require python-ndg-httpsclient.inc
-inherit pypi setuptools update-alternatives
-
-ALTERNATIVE_${PN} = "ndg_httpclient"
-ALTERNATIVE_LINK_NAME[ndg_httpclient] = "${bindir}/ndg_httpclient"
-ALTERNATIVE_PRIORITY = "20"
diff --git a/meta-python/recipes-devtools/python/python-netaddr.inc b/meta-python/recipes-devtools/python/python-netaddr.inc
deleted file mode 100644
index 5b6d4dffa1..0000000000
--- a/meta-python/recipes-devtools/python/python-netaddr.inc
+++ /dev/null
@@ -1,13 +0,0 @@
-SUMMARY = "A network address manipulation library for Python."
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=e6345d695ffe3776f68a56fe7962db44"
-
-SRC_URI[md5sum] = "51019ef59c93f3979bcb37d3b8527e07"
-SRC_URI[sha256sum] = "38aeec7cdd035081d3a4c306394b19d677623bf76fa0913f6695127c7753aefd"
-
-inherit pypi
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-pprint \
- ${PYTHON_PN}-xml \
-"
diff --git a/meta-python/recipes-devtools/python/python-netaddr_0.7.19.bb b/meta-python/recipes-devtools/python/python-netaddr_0.7.19.bb
deleted file mode 100644
index ca5a79a788..0000000000
--- a/meta-python/recipes-devtools/python/python-netaddr_0.7.19.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-require python-netaddr.inc
-inherit setuptools
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-textutils \
-"
diff --git a/meta-python/recipes-devtools/python/python-networkx.inc b/meta-python/recipes-devtools/python/python-networkx.inc
deleted file mode 100644
index a4c31b2b28..0000000000
--- a/meta-python/recipes-devtools/python/python-networkx.inc
+++ /dev/null
@@ -1,10 +0,0 @@
-DESCRIPTION = "Python package for creating and manipulating graphs and networks"
-LICENSE = "BSD-3-Clause"
-
-inherit pypi
-
-PYPI_PACKAGE_EXT = "zip"
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-decorator \
- "
diff --git a/meta-python/recipes-devtools/python/python-networkx_2.2.bb b/meta-python/recipes-devtools/python/python-networkx_2.2.bb
deleted file mode 100644
index 648f0312f6..0000000000
--- a/meta-python/recipes-devtools/python/python-networkx_2.2.bb
+++ /dev/null
@@ -1,8 +0,0 @@
-require python-networkx.inc
-
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=3376ff7c9c58048c62d91431f7f08cde"
-
-SRC_URI[md5sum] = "82608a3686fb3e61f20cf13bfd3c1b4a"
-SRC_URI[sha256sum] = "45e56f7ab6fe81652fb4bc9f44faddb0e9025f469f602df14e3b2551c2ea5c8b"
-
-inherit setuptools
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-numeric_24.2.bb b/meta-python/recipes-devtools/python/python-numeric_24.2.bb
deleted file mode 100644
index c91d77c81b..0000000000
--- a/meta-python/recipes-devtools/python/python-numeric_24.2.bb
+++ /dev/null
@@ -1,16 +0,0 @@
-SUMMARY = "A sophisticated Numeric Processing Package for Python"
-SECTION = "devel/python"
-LICENSE = "PSF & LLNL"
-LIC_FILES_CHKSUM = "file://Legal.htm;md5=e3ce75dedd4043918d15979ae43e312e"
-
-PR = "ml3"
-
-SRC_URI = "${SOURCEFORGE_MIRROR}/numpy/Numeric-${PV}.tar.gz \
- file://0001-it-tries-to-define-this-function-differently-than-it.patch \
-"
-S = "${WORKDIR}/Numeric-${PV}"
-
-inherit distutils
-
-SRC_URI[md5sum] = "2ae672656e06716a149acb048cca3093"
-SRC_URI[sha256sum] = "5f72e729eb6ff57442f2a38bfc9931738b59e5077928e2e70d22b4610ff15258"
diff --git a/meta-python/recipes-devtools/python/python-oauthlib.inc b/meta-python/recipes-devtools/python/python-oauthlib.inc
deleted file mode 100644
index c5de8a091a..0000000000
--- a/meta-python/recipes-devtools/python/python-oauthlib.inc
+++ /dev/null
@@ -1,25 +0,0 @@
-SUMMARY = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic"
-HOMEPAGE = "https://github.com/idan/oauthlib"
-
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=5ba9ce41463615e082609806255bce1b"
-
-SRC_URI = "https://pypi.python.org/packages/a5/8a/212e9b47fb54be109f3ff0684165bb38c51117f34e175c379fce5c7df754/oauthlib-${PV}.tar.gz"
-SRC_URI[md5sum] = "277a9a966cc8c72e492b4eeb41332445"
-SRC_URI[sha256sum] = "ce57b501e906ff4f614e71c36a3ab9eacbb96d35c24d1970d2539bbc3ec70ce1"
-
-S = "${WORKDIR}/oauthlib-${PV}"
-
-# The following configs & dependencies are from setuptools extras_require.
-# These dependencies are optional, hence can be controlled via PACKAGECONFIG.
-# The upstream names may not correspond exactly to bitbake package names.
-#
-# Uncomment this line to enable all the optional features.
-#PACKAGECONFIG ?= "test signedtoken signals rsa"
-PACKAGECONFIG[test] = ",,,${PYTHON_PN}-blinker ${PYTHON_PN}-cryptography ${PYTHON_PN}-nose ${PYTHON_PN}-pyjwt"
-PACKAGECONFIG[signedtoken] = ",,,${PYTHON_PN}-cryptography ${PYTHON_PN}-pyjwt"
-PACKAGECONFIG[signals] = ",,,${PYTHON_PN}-blinker"
-PACKAGECONFIG[rsa] = ",,,${PYTHON_PN}-cryptography"
-
-RDEPENDS_${PN} += "${PYTHON_PN}-core ${PYTHON_PN}-crypt ${PYTHON_PN}-datetime ${PYTHON_PN}-json ${PYTHON_PN}-logging ${PYTHON_PN}-math ${PYTHON_PN}-netclient ${PYTHON_PN}-unittest"
-
diff --git a/meta-python/recipes-devtools/python/python-obd.inc b/meta-python/recipes-devtools/python/python-obd.inc
deleted file mode 100644
index 51e663b516..0000000000
--- a/meta-python/recipes-devtools/python/python-obd.inc
+++ /dev/null
@@ -1,11 +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 pypi
-
-RDEPENDS_${PN} = "${PYTHON_PN}-pyserial ${PYTHON_PN}-pint"
diff --git a/meta-python/recipes-devtools/python/python-packaging.inc b/meta-python/recipes-devtools/python/python-packaging.inc
deleted file mode 100644
index c32caaa408..0000000000
--- a/meta-python/recipes-devtools/python/python-packaging.inc
+++ /dev/null
@@ -1,10 +0,0 @@
-DESCRIPTION = "Core utilities for Python packages"
-HOMEPAGE = "https://github.com/pypa/packaging"
-LICENSE = "Apache-2.0 & BSD"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=faadaedca9251a90b205c9167578ce91"
-
-SRC_URI[md5sum] = "867ce70984dc7b89bbbc3cac2a72b171"
-SRC_URI[sha256sum] = "28b924174df7a2fa32c1953825ff29c61e2f5e082343165438812f00d3a7fc47"
-
-DEPENDS += "${PYTHON_PN}-setuptools-scm-native"
-RDEPENDS_${PN} += "${PYTHON_PN}-six ${PYTHON_PN}-pyparsing"
diff --git a/meta-python/recipes-devtools/python/python-packaging_19.2.bb b/meta-python/recipes-devtools/python/python-packaging_19.2.bb
deleted file mode 100644
index 55d0746bb5..0000000000
--- a/meta-python/recipes-devtools/python/python-packaging_19.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-packaging.inc
diff --git a/meta-python/recipes-devtools/python/python-paho-mqtt.inc b/meta-python/recipes-devtools/python/python-paho-mqtt.inc
deleted file mode 100644
index 66943ed6ce..0000000000
--- a/meta-python/recipes-devtools/python/python-paho-mqtt.inc
+++ /dev/null
@@ -1,22 +0,0 @@
-SUMMARY = "MQTT version 3.1/3.1.1 client library"
-LICENSE = "EPL-1.0 | EDL-1.0"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=eb48c6ee2cb9f5b8b9fe75e6f817bdfc \
- file://epl-v10;md5=8d383c379e91d20ba18a52c3e7d3a979 \
- file://edl-v10;md5=c09f121939f063aeb5235972be8c722c \
-"
-SRCNAME = "paho-mqtt"
-
-inherit pypi
-
-SRC_URI[md5sum] = "e3ac29cd5dc247a01083a2a8f3fddd08"
-SRC_URI[sha256sum] = "e440a052b46d222e184be3be38676378722072fcd4dfd2c8f509fb861a7b0b79"
-
-DEPENDS += "${PYTHON_PN}-pytest-runner-native"
-
-RDEPENDS_${PN} = "\
- ${PYTHON_PN}-io \
- ${PYTHON_PN}-logging \
- ${PYTHON_PN}-math \
- ${PYTHON_PN}-netclient \
- ${PYTHON_PN}-threading \
-"
diff --git a/meta-python/recipes-devtools/python/python-paho-mqtt_1.4.0.bb b/meta-python/recipes-devtools/python/python-paho-mqtt_1.4.0.bb
deleted file mode 100644
index a1031176e4..0000000000
--- a/meta-python/recipes-devtools/python/python-paho-mqtt_1.4.0.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-inherit setuptools
-require python-paho-mqtt.inc
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-subprocess \
-"
diff --git a/meta-python/recipes-devtools/python/python-pam_1.8.2.bb b/meta-python/recipes-devtools/python/python-pam_1.8.2.bb
deleted file mode 100644
index 60a3b43de5..0000000000
--- a/meta-python/recipes-devtools/python/python-pam_1.8.2.bb
+++ /dev/null
@@ -1,15 +0,0 @@
-DESCRIPTION = "Python PAM module using ctypes, py3/py2."
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://PKG-INFO;md5=64326d42471b493c5c088305364ad5da"
-
-SRC_URI[md5sum] = "db71b6b999246fb05d78ecfbe166629d"
-SRC_URI[sha256sum] = "26efe4e79b869b10f97cd8c4a6bbb04a4e54d41186364e975b4108c9c071812c"
-
-PYPI_PACKAGE = "python-pam"
-
-inherit pypi setuptools
-
-RDEPENDS_${PN} = "libpam"
-
-inherit distro_features_check
-REQUIRED_DISTRO_FEATURES = "pam"
diff --git a/meta-python/recipes-devtools/python/python-pandas.inc b/meta-python/recipes-devtools/python/python-pandas.inc
deleted file mode 100644
index d6ca243175..0000000000
--- a/meta-python/recipes-devtools/python/python-pandas.inc
+++ /dev/null
@@ -1,23 +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=ee0470f2de336c370a71c2f8d5e81c11"
-
-SRC_URI[md5sum] = "7b597c7f989652e0c9af5f09a157e3ae"
-SRC_URI[sha256sum] = "5b24ca47acf69222e82530e89111dd9d14f9b970ab2cd3a1c2c78f0c4fbba4f4"
-
-inherit pypi
-
-DEPENDS += " \
- ${PYTHON_PN}-numpy-native ${PYTHON_PN}-cython-native \
-"
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-json \
- ${PYTHON_PN}-numpy \
- ${PYTHON_PN}-dateutil \
- ${PYTHON_PN}-pytz \
-"
diff --git a/meta-python/recipes-devtools/python/python-parse-type.inc b/meta-python/recipes-devtools/python/python-parse-type.inc
deleted file mode 100644
index 4549ec98b8..0000000000
--- a/meta-python/recipes-devtools/python/python-parse-type.inc
+++ /dev/null
@@ -1,12 +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=d07323820cca0f1d192cbbf8a0516f95"
-
-SRC_URI[md5sum] = "b5fa59e45965d1b2896023742df2e707"
-SRC_URI[sha256sum] = "f596bdc75d3dd93036fbfe3d04127da9f6df0c26c36e01e76da85adef4336b3c"
-
-PYPI_PACKAGE = "parse_type"
-inherit pypi
-
-RDEPENDS_${PN} += "${PYTHON_PN}-parse"
diff --git a/meta-python/recipes-devtools/python/python-parse-type_0.4.2.bb b/meta-python/recipes-devtools/python/python-parse-type_0.4.2.bb
deleted file mode 100644
index 8e10e801ca..0000000000
--- a/meta-python/recipes-devtools/python/python-parse-type_0.4.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-parse-type.inc
diff --git a/meta-python/recipes-devtools/python/python-parse.inc b/meta-python/recipes-devtools/python/python-parse.inc
deleted file mode 100644
index fa55a93c5d..0000000000
--- a/meta-python/recipes-devtools/python/python-parse.inc
+++ /dev/null
@@ -1,14 +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://parse.py;beginline=1273;endline=1291;md5=5147afdd9b3615290ad8733f0137a1a1"
-
-SRC_URI[md5sum] = "fa69ab2fe846f9b183411391f7c6897b"
-SRC_URI[sha256sum] = "c3cdf6206f22aeebfa00e5b954fcfea13d1b2dc271c75806b6025b94fb490939"
-
-inherit pypi
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-datetime \
- ${PYTHON_PN}-logging \
- "
diff --git a/meta-python/recipes-devtools/python/python-parse_1.8.4.bb b/meta-python/recipes-devtools/python/python-parse_1.8.4.bb
deleted file mode 100644
index d31ccc72a1..0000000000
--- a/meta-python/recipes-devtools/python/python-parse_1.8.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-parse.inc
diff --git a/meta-python/recipes-devtools/python/python-passlib_1.7.1.bb b/meta-python/recipes-devtools/python/python-passlib_1.7.1.bb
deleted file mode 100644
index 11c598a084..0000000000
--- a/meta-python/recipes-devtools/python/python-passlib_1.7.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-passlib.inc
diff --git a/meta-python/recipes-devtools/python/python-paste_3.2.2.bb b/meta-python/recipes-devtools/python/python-paste_3.2.2.bb
deleted file mode 100644
index 2778fc6b5f..0000000000
--- a/meta-python/recipes-devtools/python/python-paste_3.2.2.bb
+++ /dev/null
@@ -1,17 +0,0 @@
-SUMMARY = "Tools for using a Web Server Gateway Interface stack"
-HOMEPAGE = "http://pythonpaste.org/"
-LICENSE = "MIT"
-RDEPENDS_${PN} = "python-six"
-
-LIC_FILES_CHKSUM = "file://docs/license.txt;md5=1798f29d55080c60365e6283cb49779c"
-
-SRC_URI[md5sum] = "788fceb192bc338f1a3e2a8f78fd42b6"
-SRC_URI[sha256sum] = "0b1f4d86f8366f0d4093e5449813792c98e760edc6b7c918f0f29f9ef22ae996"
-
-PYPI_PACKAGE = "Paste"
-inherit pypi setuptools
-
-FILES_${PN} += "/usr/lib/*"
-
-DEPENDS += "${PYTHON_PN}-pytest-runner-native"
-
diff --git a/meta-python/recipes-devtools/python/python-pathlib2.inc b/meta-python/recipes-devtools/python/python-pathlib2.inc
deleted file mode 100644
index c25e5a0807..0000000000
--- a/meta-python/recipes-devtools/python/python-pathlib2.inc
+++ /dev/null
@@ -1,9 +0,0 @@
-DESCRIPTION = "Object-oriented filesystem paths"
-HOMEPAGE = "https://github.com/mcmtroffaes/pathlib2"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=042856c23a3e903b33bf361ea1cbe29a"
-
-SRC_URI[md5sum] = "96da6398b3ea944417b84ccb25b171aa"
-SRC_URI[sha256sum] = "446014523bb9be5c28128c4d2a10ad6bb60769e78bd85658fe44a450674e0ef8"
-
-RDEPENDS_${PN} += "${PYTHON_PN}-six"
diff --git a/meta-python/recipes-devtools/python/python-pathlib2_2.3.4.bb b/meta-python/recipes-devtools/python/python-pathlib2_2.3.4.bb
deleted file mode 100644
index e4bf789131..0000000000
--- a/meta-python/recipes-devtools/python/python-pathlib2_2.3.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-pathlib2.inc
diff --git a/meta-python/recipes-devtools/python/python-pbr_5.4.3.bb b/meta-python/recipes-devtools/python/python-pbr_5.4.3.bb
deleted file mode 100644
index b21722fda5..0000000000
--- a/meta-python/recipes-devtools/python/python-pbr_5.4.3.bb
+++ /dev/null
@@ -1,13 +0,0 @@
-inherit setuptools
-# The inc file is in oe-core
-require recipes-devtools/python/python-pbr.inc
-
-SRC_URI[md5sum] = "477d2aa285ad97250a172b199f4060b7"
-SRC_URI[sha256sum] = "2c8e420cd4ed4cec4e7999ee47409e876af575d4c35a45840d59e8b5f3155ab8"
-
-do_install_append() {
- if [ -f ${D}${bindir}/pbr ]; then
- mv ${D}${bindir}/pbr ${D}${bindir}/pbr-2
- fi
-}
-
diff --git a/meta-python/recipes-devtools/python/python-pep8_1.7.1.bb b/meta-python/recipes-devtools/python/python-pep8_1.7.1.bb
deleted file mode 100644
index 54ce9781af..0000000000
--- a/meta-python/recipes-devtools/python/python-pep8_1.7.1.bb
+++ /dev/null
@@ -1,16 +0,0 @@
-SUMMARY = "Python style guide checker"
-HOMEPAGE = "https://github.com/dreamhost/cliff"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://README.rst;md5=d8ebbbe831259ce010179d2f310b0f3e"
-
-SRC_URI[md5sum] = "603821d06db945c71d811b5a8d78423c"
-SRC_URI[sha256sum] = "fe249b52e20498e59e0b5c5256aa52ee99fc295b26ec9eaa85776ffdb9fe6374"
-
-inherit pypi setuptools
-
-RDEPENDS_${PN} += " \
- python-prettytable \
- python-cmd2 \
- python-pyparsing"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-periphery.inc b/meta-python/recipes-devtools/python/python-periphery.inc
deleted file mode 100644
index 539c3579ce..0000000000
--- a/meta-python/recipes-devtools/python/python-periphery.inc
+++ /dev/null
@@ -1,7 +0,0 @@
-DESCRIPTION = "A pure Python 2/3 library for peripheral I/O (GPIO, LED, PWM, SPI, I2C, MMIO, Serial) in Linux."
-HOMEPAGE = "http://pythonhosted.org/python-periphery/"
-LICENSE = "MIT"
-
-LIC_FILES_CHKSUM = "file://PKG-INFO;md5=063846af82b555d48822cf43dc6db6af"
-
-PYPI_PACKAGE = "python-periphery" \ No newline at end of file
diff --git a/meta-python/recipes-devtools/python/python-periphery_1.1.1.bb b/meta-python/recipes-devtools/python/python-periphery_1.1.1.bb
deleted file mode 100644
index 6ae7fed813..0000000000
--- a/meta-python/recipes-devtools/python/python-periphery_1.1.1.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-inherit pypi setuptools
-require python-periphery.inc
-
-SRC_URI[sha256sum] = "fe8f351934edce72cd919b4eb070878ebff551db5e21aea61e0f446101f0a79f" \ No newline at end of file
diff --git a/meta-python/recipes-devtools/python/python-pexpect.inc b/meta-python/recipes-devtools/python/python-pexpect.inc
deleted file mode 100644
index efeab8315a..0000000000
--- a/meta-python/recipes-devtools/python/python-pexpect.inc
+++ /dev/null
@@ -1,21 +0,0 @@
-SUMMARY = "A Pure Python Expect like Module for Python"
-HOMEPAGE = "http://pexpect.readthedocs.org/"
-SECTION = "devel/python"
-LICENSE = "ISC"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=1c7a725251880af8c6a148181665385b"
-
-SRC_URI[md5sum] = "d4f3372965a996238d57d19b95d2e03a"
-SRC_URI[sha256sum] = "2a8e88259839571d1251d278476f3eec5db26deb73a70be5ed5dc5435e418aba"
-
-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 \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-pexpect_4.6.0.bb b/meta-python/recipes-devtools/python/python-pexpect_4.6.0.bb
deleted file mode 100644
index 1c46b47a21..0000000000
--- a/meta-python/recipes-devtools/python/python-pexpect_4.6.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-pexpect.inc
-inherit pypi setuptools
diff --git a/meta-python/recipes-devtools/python/python-pika.inc b/meta-python/recipes-devtools/python/python-pika.inc
deleted file mode 100644
index 10be5bb62c..0000000000
--- a/meta-python/recipes-devtools/python/python-pika.inc
+++ /dev/null
@@ -1,22 +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"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=535836bf0a5de515a7bfee026075701d"
-
-SRC_URI[md5sum] = "6002400cdd33bf85ec8680ece72910d4"
-SRC_URI[sha256sum] = "9fa76ba4b65034b878b2b8de90ff8660a59d925b087c5bb88f8fdbb4b64a1dbf"
-
-inherit pypi
-
-PYPI_PACKAGE = "pika"
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-logging \
- ${PYTHON_PN}-tornado \
- ${PYTHON_PN}-twisted \
-"
diff --git a/meta-python/recipes-devtools/python/python-pika_1.1.0.bb b/meta-python/recipes-devtools/python/python-pika_1.1.0.bb
deleted file mode 100644
index f7e0198673..0000000000
--- a/meta-python/recipes-devtools/python/python-pika_1.1.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-pika.inc
diff --git a/meta-python/recipes-devtools/python/python-pint.inc b/meta-python/recipes-devtools/python/python-pint.inc
deleted file mode 100644
index 2bc8e4ab63..0000000000
--- a/meta-python/recipes-devtools/python/python-pint.inc
+++ /dev/null
@@ -1,15 +0,0 @@
-DESCRIPTION = "Interval arithmetic for Python"
-HOMEPAGE = "https://github.com/AlexandreDecan/python-intervals"
-SECTION = "devel/python"
-
-LICENSE = "BSD-3-Clause"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=bccf824202692270a1e0829a62e3f47b"
-
-PYPI_PACKAGE := "Pint"
-
-inherit pypi
-
-SRC_URI[md5sum] = "e1f80f3f8fc4e61f68ad3912db26b3a8"
-SRC_URI[sha256sum] = "afcf31443a478c32bbac4b00337ee9026a13d0e2ac83d30c79151462513bb0d4"
-
-BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python-pint_0.8.1.bb b/meta-python/recipes-devtools/python/python-pint_0.8.1.bb
deleted file mode 100644
index 480f088721..0000000000
--- a/meta-python/recipes-devtools/python/python-pint_0.8.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-pint.inc
diff --git a/meta-python/recipes-devtools/python/python-pip_19.3.bb b/meta-python/recipes-devtools/python/python-pip_19.3.bb
deleted file mode 100644
index 2b5ee9e7e0..0000000000
--- a/meta-python/recipes-devtools/python/python-pip_19.3.bb
+++ /dev/null
@@ -1,14 +0,0 @@
-SUMMARY = "PIP is a tool for installing and managing Python packages"
-HOMEPAGE = "https://pip.pypa.io/"
-LICENSE = "MIT & LGPL-2.1"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=8ba06d529c955048e5ddd7c45459eb2e"
-
-SRC_URI[md5sum] = "a57da8b758cbf1a155cde6a7a4428ba7"
-SRC_URI[sha256sum] = "324d234b8f6124846b4e390df255cacbe09ce22791c3b714aa1ea6e44a4f2861"
-
-inherit pypi setuptools
-
-# Since PIP is like CPAN for PERL we need to drag in all python modules to ensure everything works
-RDEPENDS_${PN}_class-target = "python-modules python-distribute python-misc"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-pluggy.inc b/meta-python/recipes-devtools/python/python-pluggy.inc
deleted file mode 100644
index 57660060c5..0000000000
--- a/meta-python/recipes-devtools/python/python-pluggy.inc
+++ /dev/null
@@ -1,11 +0,0 @@
-SUMMARY = "Plugin and hook calling mechanisms for python"
-HOMEPAGE = "https://github.com/pytest-dev/pluggy"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=1c8206d16fd5cc02fa9b0bb98955e5c2"
-
-SRC_URI[md5sum] = "4b8384b69cddbc2e104fdd3ff5631788"
-SRC_URI[sha256sum] = "fa5fa1622fa6dd5c030e9cad086fa19ef6a0cf6d7a2d12318e10cb49d6d68f34"
-
-DEPENDS += "${PYTHON_PN}-setuptools-scm-native"
-
-inherit pypi
diff --git a/meta-python/recipes-devtools/python/python-pluggy_0.13.0.bb b/meta-python/recipes-devtools/python/python-pluggy_0.13.0.bb
deleted file mode 100644
index edcd4f512f..0000000000
--- a/meta-python/recipes-devtools/python/python-pluggy_0.13.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-pluggy.inc
diff --git a/meta-python/recipes-devtools/python/python-ply.inc b/meta-python/recipes-devtools/python/python-ply.inc
deleted file mode 100644
index a744950b6e..0000000000
--- a/meta-python/recipes-devtools/python/python-ply.inc
+++ /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"
-LIC_FILES_CHKSUM = "file://README.md;beginline=5;endline=32;md5=f5ee5c355c0e6719c787a71b8f0fa96c"
-
-SRC_URI[md5sum] = "6465f602e656455affcd7c5734c638f8"
-SRC_URI[sha256sum] = "00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"
-
-inherit pypi
-
-RDEPENDS_${PN}_class-target += "\
- ${PYTHON_PN}-netclient \
- ${PYTHON_PN}-shell \
-"
-
-BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python-ply_3.11.bb b/meta-python/recipes-devtools/python/python-ply_3.11.bb
deleted file mode 100644
index 2b6165c5be..0000000000
--- a/meta-python/recipes-devtools/python/python-ply_3.11.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-ply.inc
-inherit setuptools
diff --git a/meta-python/recipes-devtools/python/python-pocketsphinx.inc b/meta-python/recipes-devtools/python/python-pocketsphinx.inc
deleted file mode 100644
index 4c848b6dd0..0000000000
--- a/meta-python/recipes-devtools/python/python-pocketsphinx.inc
+++ /dev/null
@@ -1,9 +0,0 @@
-SUMMARY = "This package provides a python interface to CMU Sphinxbase and Pocketsphinx libraries created with SWIG and Setuptools."
-SECTION = "devel/python"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=826ebda787eb48e78aec2624f9faba72"
-
-SRC_URI[md5sum] = "c0f2bfd54bc4c438c3bb64825f57d575"
-SRC_URI[sha256sum] = "2cc493ed48c1301e0d2e69b137dc646c2f8caca190ef4bce61836eac96d1796f"
-
-DEPENDS += "swig-native"
diff --git a/meta-python/recipes-devtools/python/python-pretend.inc b/meta-python/recipes-devtools/python/python-pretend.inc
deleted file mode 100644
index b342aef526..0000000000
--- a/meta-python/recipes-devtools/python/python-pretend.inc
+++ /dev/null
@@ -1,9 +0,0 @@
-SUMMARY = "A library for stubbing in Python"
-HOMEPAGE = "https://github.com/alex/pretend"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=411780c0b7fa756753e94affeee5bc99"
-
-SRC_URI[md5sum] = "ad53883ede48aeac7ae584f0de0240e8"
-SRC_URI[sha256sum] = "c90eb810cde8ebb06dafcb8796f9a95228ce796531bc806e794c2f4649aa1b10"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-pretend_1.0.9.bb b/meta-python/recipes-devtools/python/python-pretend_1.0.9.bb
deleted file mode 100644
index 73b8ed4d7c..0000000000
--- a/meta-python/recipes-devtools/python/python-pretend_1.0.9.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-pretend.inc
diff --git a/meta-python/recipes-devtools/python/python-prettytable.inc b/meta-python/recipes-devtools/python/python-prettytable.inc
deleted file mode 100644
index 6004ecd330..0000000000
--- a/meta-python/recipes-devtools/python/python-prettytable.inc
+++ /dev/null
@@ -1,25 +0,0 @@
-SUMMARY = "Python library for displaying tabular data in a ASCII table format"
-HOMEPAGE = "http://code.google.com/p/prettytable"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://COPYING;md5=3e73500ffa52de5071cff65990055282"
-
-SRC_URI[md5sum] = "0c1361104caff8b09f220748f9d69899"
-SRC_URI[sha256sum] = "a53da3b43d7a5c229b5e3ca2892ef982c46b7923b51e98f0db49956531211c4f"
-
-SRCNAME = "prettytable"
-
-SRC_URI = "https://pypi.python.org/packages/source/P/PrettyTable/${SRCNAME}-${PV}.zip"
-
-S = "${WORKDIR}/${SRCNAME}-${PV}"
-
-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"
diff --git a/meta-python/recipes-devtools/python/python-prettytable_0.7.2.bb b/meta-python/recipes-devtools/python/python-prettytable_0.7.2.bb
deleted file mode 100644
index 69ff25927b..0000000000
--- a/meta-python/recipes-devtools/python/python-prettytable_0.7.2.bb
+++ /dev/null
@@ -1,3 +0,0 @@
-inherit setuptools
-require python-prettytable.inc
-
diff --git a/meta-python/recipes-devtools/python/python-progress.inc b/meta-python/recipes-devtools/python/python-progress.inc
deleted file mode 100644
index 9f00615c46..0000000000
--- a/meta-python/recipes-devtools/python/python-progress.inc
+++ /dev/null
@@ -1,14 +0,0 @@
-SUMMARY = "Easy progress reporting for Python"
-HOMEPAGE = "http://github.com/verigak/progress/"
-LICENSE = "ISC"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=aef5566ac4fede9815eccf124c281317"
-
-SRC_URI[md5sum] = "057981e2f09029288f5255b1ea3ab64d"
-SRC_URI[sha256sum] = "5e2f9da88ed8236a76fffbee3ceefd259589cf42dfbc2cec2877102189fae58a"
-
-RDEPENDS_${PN}_class-target += " \
- ${PYTHON_PN}-datetime \
- ${PYTHON_PN}-math \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-progress_1.4.bb b/meta-python/recipes-devtools/python/python-progress_1.4.bb
deleted file mode 100644
index 80608627a6..0000000000
--- a/meta-python/recipes-devtools/python/python-progress_1.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-progress.inc
diff --git a/meta-python/recipes-devtools/python/python-prompt-toolkit.inc b/meta-python/recipes-devtools/python/python-prompt-toolkit.inc
deleted file mode 100644
index 1a4bd35c34..0000000000
--- a/meta-python/recipes-devtools/python/python-prompt-toolkit.inc
+++ /dev/null
@@ -1,18 +0,0 @@
-SUMMARY = "Library for building powerful interactive command lines in Python"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=b2cde7da89f0c1f3e49bf968d00d554f"
-
-SRC_URI[md5sum] = "8db8b8e40e91bc6dce133d8d5727a717"
-SRC_URI[sha256sum] = "ff58ce8bb82c11c43416dd3eec7701dcbe8c576e2d7649f1d2b9d21a2fd93808"
-
-PYPI_PACKAGE = "prompt_toolkit"
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-core \
- ${PYTHON_PN}-six \
- ${PYTHON_PN}-terminal \
- ${PYTHON_PN}-threading \
- ${PYTHON_PN}-wcwidth \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-prompt-toolkit_2.0.4.bb b/meta-python/recipes-devtools/python/python-prompt-toolkit_2.0.4.bb
deleted file mode 100644
index 527c905a83..0000000000
--- a/meta-python/recipes-devtools/python/python-prompt-toolkit_2.0.4.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-inherit pypi setuptools
-require python-prompt-toolkit.inc
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-subprocess \
-"
diff --git a/meta-python/recipes-devtools/python/python-protobuf.inc b/meta-python/recipes-devtools/python/python-protobuf.inc
deleted file mode 100644
index 406131108e..0000000000
--- a/meta-python/recipes-devtools/python/python-protobuf.inc
+++ /dev/null
@@ -1,32 +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
-
-SRC_URI[md5sum] = "d634666c898148e4565ac62f3ba4a2ca"
-SRC_URI[sha256sum] = "843f498e98ad1469ad54ecb4a7ccf48605a1c5d2bd26ae799c7a2cddab4a37ec"
-
-# 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+)+)/"
-
-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"
-
diff --git a/meta-python/recipes-devtools/python/python-protobuf_3.9.2.bb b/meta-python/recipes-devtools/python/python-protobuf_3.9.2.bb
deleted file mode 100644
index f04fc489f0..0000000000
--- a/meta-python/recipes-devtools/python/python-protobuf_3.9.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-protobuf.inc
diff --git a/meta-python/recipes-devtools/python/python-psutil.inc b/meta-python/recipes-devtools/python/python-psutil.inc
deleted file mode 100644
index 0908c1c92b..0000000000
--- a/meta-python/recipes-devtools/python/python-psutil.inc
+++ /dev/null
@@ -1,22 +0,0 @@
-SUMMARY = "A cross-platform process and system utilities module for Python"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=e35fd9f271d19d5f742f20a9d1f8bb8b"
-
-SRC_URI[md5sum] = "1bbc1788588cc3c2c461cd98a830ba72"
-SRC_URI[sha256sum] = "863a85c1c0a5103a12c05a35e59d336e1d665747e531256e061213e2e90f63f3"
-
-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 \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-psutil_5.6.3.bb b/meta-python/recipes-devtools/python/python-psutil_5.6.3.bb
deleted file mode 100644
index 9aabfb2069..0000000000
--- a/meta-python/recipes-devtools/python/python-psutil_5.6.3.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-inherit pypi setuptools
-require python-psutil.inc
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-subprocess \
-"
diff --git a/meta-python/recipes-devtools/python/python-ptyprocess.inc b/meta-python/recipes-devtools/python/python-ptyprocess.inc
deleted file mode 100644
index 49cc5a4321..0000000000
--- a/meta-python/recipes-devtools/python/python-ptyprocess.inc
+++ /dev/null
@@ -1,20 +0,0 @@
-SUMMARY = "Run a subprocess in a pseudo terminal"
-HOMEPAGE = "http://ptyprocess.readthedocs.io/en/latest/"
-SECTION = "devel/python"
-LICENSE = "ISC"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=cfdcd51fa7d5808da4e74346ee394490"
-
-SRCNAME = "ptyprocess"
-
-SRC_URI[md5sum] = "37402d69f3b50913d4d483587bffad8f"
-SRC_URI[sha256sum] = "923f299cc5ad920c68f2bc0bc98b75b9f838b93b599941a6b63ddbc2476394c0"
-
-UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/ptyprocess"
-
-S = "${WORKDIR}/${SRCNAME}-${PV}"
-
-RDEPENDS_${PN} = "\
- ${PYTHON_PN}-core \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-ptyprocess_0.6.0.bb b/meta-python/recipes-devtools/python/python-ptyprocess_0.6.0.bb
deleted file mode 100644
index 7ca4587714..0000000000
--- a/meta-python/recipes-devtools/python/python-ptyprocess_0.6.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-ptyprocess.inc
-inherit pypi setuptools
diff --git a/meta-python/recipes-devtools/python/python-py.inc b/meta-python/recipes-devtools/python/python-py.inc
deleted file mode 100644
index b6e0409bd9..0000000000
--- a/meta-python/recipes-devtools/python/python-py.inc
+++ /dev/null
@@ -1,10 +0,0 @@
-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[md5sum] = "d9e30436ce7e79f30847f9b30b62e149"
-SRC_URI[sha256sum] = "dc639b046a6e2cff5bbe40194ad65936d6ba360b52b3c3fe1d08a82dd50b5e53"
-
-DEPENDS += "${PYTHON_PN}-setuptools-scm-native"
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-py_1.8.0.bb b/meta-python/recipes-devtools/python/python-py_1.8.0.bb
deleted file mode 100644
index 5ad2c19766..0000000000
--- a/meta-python/recipes-devtools/python/python-py_1.8.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-py.inc
diff --git a/meta-python/recipes-devtools/python/python-pyalsaaudio.inc b/meta-python/recipes-devtools/python/python-pyalsaaudio.inc
deleted file mode 100644
index d150409a2a..0000000000
--- a/meta-python/recipes-devtools/python/python-pyalsaaudio.inc
+++ /dev/null
@@ -1,11 +0,0 @@
-SUMMARY = "Support for the Linux 2.6.x ALSA Sound System"
-SECTION = "devel/python"
-LICENSE = "PSF"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=1a3b161aa0fcec32a0c8907a2219ad9d"
-
-SRC_URI[md5sum] = "b46f69561bc85fc52e698b2440ca251e"
-SRC_URI[sha256sum] = "84e8f8da544d7f4bd96479ce4a237600077984d9be1d7f16c1d9a492ecf50085"
-
-DEPENDS += "alsa-lib"
-
-RDEPENDS_${PN} += "libasound"
diff --git a/meta-python/recipes-devtools/python/python-pyalsaaudio_0.8.4.bb b/meta-python/recipes-devtools/python/python-pyalsaaudio_0.8.4.bb
deleted file mode 100644
index e5153421b4..0000000000
--- a/meta-python/recipes-devtools/python/python-pyalsaaudio_0.8.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-pyalsaaudio.inc
-inherit pypi setuptools
diff --git a/meta-python/recipes-devtools/python/python-pyasn1-modules.inc b/meta-python/recipes-devtools/python/python-pyasn1-modules.inc
deleted file mode 100644
index fcb140ac3f..0000000000
--- a/meta-python/recipes-devtools/python/python-pyasn1-modules.inc
+++ /dev/null
@@ -1,16 +0,0 @@
-SUMMARY = "A collection of ASN.1-based protocols modules."
-DESCRIPTION = "A collection of ASN.1 modules expressed in form of pyasn1\
- classes. Includes protocols PDUs definition (SNMP, LDAP etc.) and various\
- 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"
-
-SRC_URI[md5sum] = "18c77d56abeef631d94f95ff2d652859"
-SRC_URI[sha256sum] = "0c35a52e00b672f832e5846826f1fb7507907f7d52fba6faa9e3c4cbe874fe4b"
-
-inherit pypi
-
-RDEPENDS_${PN} = "${PYTHON_PN}-pyasn1"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-pyasn1-modules_0.2.7.bb b/meta-python/recipes-devtools/python/python-pyasn1-modules_0.2.7.bb
deleted file mode 100644
index eb78884089..0000000000
--- a/meta-python/recipes-devtools/python/python-pyasn1-modules_0.2.7.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-pyasn1-modules.inc
-inherit setuptools
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 014fcf9a39..0000000000
--- a/meta-python/recipes-devtools/python/python-pyasn1.inc
+++ /dev/null
@@ -1,16 +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] = "50290e833395016c49903f4f9c7e47e5"
-SRC_URI[sha256sum] = "a9495356ca1d66ed197a0f72b41eb1823cf7ea8b5bd07191673e8147aecf8604"
-
-RDEPENDS_${PN}_class-target += " \
- ${PYTHON_PN}-codecs \
- ${PYTHON_PN}-logging \
- ${PYTHON_PN}-math \
- ${PYTHON_PN}-shell \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-pyasn1_0.4.7.bb b/meta-python/recipes-devtools/python/python-pyasn1_0.4.7.bb
deleted file mode 100644
index a13c74dda8..0000000000
--- a/meta-python/recipes-devtools/python/python-pyasn1_0.4.7.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-inherit pypi setuptools
-require python-pyasn1.inc
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-lang \
-"
diff --git a/meta-python/recipes-devtools/python/python-pyaudio.inc b/meta-python/recipes-devtools/python/python-pyaudio.inc
deleted file mode 100644
index 0d3ddb1a56..0000000000
--- a/meta-python/recipes-devtools/python/python-pyaudio.inc
+++ /dev/null
@@ -1,13 +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"
-
-DEPENDS += "portaudio-v19"
-
-RDEPENDS_${PN} += "portaudio-v19"
diff --git a/meta-python/recipes-devtools/python/python-pybind11.inc b/meta-python/recipes-devtools/python/python-pybind11.inc
deleted file mode 100644
index 1722875ab5..0000000000
--- a/meta-python/recipes-devtools/python/python-pybind11.inc
+++ /dev/null
@@ -1,7 +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=beb87117af69fd10fbf9fb14c22a2e62"
-
-SRC_URI[md5sum] = "5b9611041e4ea66b2b919239e3bacd65"
-SRC_URI[sha256sum] = "87ff3ae777d9326349af5272974581270b2a0909b2392dc0cc57eb28ce23bcc3"
diff --git a/meta-python/recipes-devtools/python/python-pybind11_2.2.3.bb b/meta-python/recipes-devtools/python/python-pybind11_2.2.3.bb
deleted file mode 100644
index e56743002e..0000000000
--- a/meta-python/recipes-devtools/python/python-pybind11_2.2.3.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-pybind11.inc
diff --git a/meta-python/recipes-devtools/python/python-pybluez.inc b/meta-python/recipes-devtools/python/python-pybluez.inc
deleted file mode 100644
index 399fe579f7..0000000000
--- a/meta-python/recipes-devtools/python/python-pybluez.inc
+++ /dev/null
@@ -1,21 +0,0 @@
-DESCRIPTION = "Bluetooth Python extension module"
-HOMEPAGE = "http://karulis.github.io/pybluez/"
-SECTION = "devel/python"
-
-DEPENDS = "bluez5"
-
-LICENSE = "GPL-2.0"
-LIC_FILES_CHKSUM = "file://COPYING;md5=8a71d0475d08eee76d8b6d0c6dbec543"
-
-inherit pypi
-
-SRC_URI = "https://pypi.python.org/packages/c1/98/3149481d508bee174335be6725880f00d297afebe75c15e917af8f6fe169/PyBluez-0.22.zip"
-SRC_URI[md5sum] = "49dab9d5a8f0b798c8125c7f649be3cd"
-SRC_URI[sha256sum] = "4ce006716a54d9d18e8186a3f1c8b12a8e6befecffe8fd5828a291fb694ce49d"
-
-S = "${WORKDIR}/PyBluez-${PV}"
-
-RDEPENDS_${PN} += "\
- bluez5 \
- ${PYTHON_PN}-fcntl \
-"
diff --git a/meta-python/recipes-devtools/python/python-pybluez_0.22.bb b/meta-python/recipes-devtools/python/python-pybluez_0.22.bb
deleted file mode 100644
index 3158f4b647..0000000000
--- a/meta-python/recipes-devtools/python/python-pybluez_0.22.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-pybluez.inc
-inherit setuptools
diff --git a/meta-python/recipes-devtools/python/python-pycodestyle.inc b/meta-python/recipes-devtools/python/python-pycodestyle.inc
deleted file mode 100644
index 96cdc5deeb..0000000000
--- a/meta-python/recipes-devtools/python/python-pycodestyle.inc
+++ /dev/null
@@ -1,12 +0,0 @@
-SUMMARY = "Python style guide checker (formly called pep8)"
-HOMEPAGE = "https://pypi.org/project/pycodestyle"
-LICENSE = "MIT"
-SECTION = "devel/python"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=01831ddbaf398471da3cc87f5037e822"
-
-SRC_URI[md5sum] = "40e7a76f364a18f531aaba11a4476e21"
-SRC_URI[sha256sum] = "e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c"
-
-inherit pypi
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-pycodestyle_2.5.0.bb b/meta-python/recipes-devtools/python/python-pycodestyle_2.5.0.bb
deleted file mode 100644
index ec6c12f2f1..0000000000
--- a/meta-python/recipes-devtools/python/python-pycodestyle_2.5.0.bb
+++ /dev/null
@@ -1,10 +0,0 @@
-inherit setuptools
-require python-pycodestyle.inc
-
-RDEPENDS_${PN} += "${PYTHON_PN}-lang"
-
-do_install_append () {
- if [ -f ${D}${bindir}/pycodestyle ]; then
- mv ${D}${bindir}/pycodestyle ${D}${bindir}/pycodestyle-2
- fi
-}
diff --git a/meta-python/recipes-devtools/python/python-pycparser.inc b/meta-python/recipes-devtools/python/python-pycparser.inc
deleted file mode 100644
index 47a0e0e973..0000000000
--- a/meta-python/recipes-devtools/python/python-pycparser.inc
+++ /dev/null
@@ -1,17 +0,0 @@
-SUMMARY = "Parser of the C language, written in pure Python"
-HOMEPAGE = "https://github.com/eliben/pycparser"
-LICENSE = "BSD-3-Clause"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=86f1cedb4e6410a88ce8e30b91079169"
-
-SRC_URI[md5sum] = "76396762adc3fa769c83d8e202d36b6f"
-SRC_URI[sha256sum] = "a988718abfad80b6b157acce7bf130a30876d27603738ac39f140993246b25b3"
-
-
-BBCLASSEXTEND = "native nativesdk"
-
-RDEPENDS_${PN}_class-target += "\
- ${PYTHON_PN}-ply \
- ${PYTHON_PN}-pprint \
- cpp \
- cpp-symlinks \
- "
diff --git a/meta-python/recipes-devtools/python/python-pycparser_2.19.bb b/meta-python/recipes-devtools/python/python-pycparser_2.19.bb
deleted file mode 100644
index 98742737fd..0000000000
--- a/meta-python/recipes-devtools/python/python-pycparser_2.19.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-inherit pypi setuptools
-require python-pycparser.inc
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-subprocess \
-"
diff --git a/meta-python/recipes-devtools/python/python-pycrypto.inc b/meta-python/recipes-devtools/python/python-pycrypto.inc
deleted file mode 100644
index 232cdb7116..0000000000
--- a/meta-python/recipes-devtools/python/python-pycrypto.inc
+++ /dev/null
@@ -1,21 +0,0 @@
-DESCRIPTION = "Cryptographic modules for Python."
-HOMEPAGE = "http://www.pycrypto.org/"
-LICENSE = "PSFv2"
-LIC_FILES_CHKSUM = "file://COPYRIGHT;md5=35f354d199e8cb7667b059a23578e63d"
-
-FILESEXTRAPATHS_prepend := "${THISDIR}/python-pycrypto:"
-
-DEPENDS += " gmp"
-
-inherit pypi autotools-brokensep
-
-SRC_URI += "file://cross-compiling.patch \
- file://CVE-2013-7459.patch \
- "
-
-SRC_URI[md5sum] = "55a61a054aa66812daf5161a0d5d7eda"
-SRC_URI[sha256sum] = "f2ce1e989b272cfcb677616763e0a2e7ec659effa67a88aa92b3a65528f60a3c"
-
-do_compile[noexec] = "1"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-pycrypto/CVE-2013-7459.patch b/meta-python/recipes-devtools/python/python-pycrypto/CVE-2013-7459.patch
deleted file mode 100644
index 9006c5c350..0000000000
--- a/meta-python/recipes-devtools/python/python-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/python-pycrypto/cross-compiling.patch b/meta-python/recipes-devtools/python/python-pycrypto/cross-compiling.patch
deleted file mode 100644
index 712f3e8dde..0000000000
--- a/meta-python/recipes-devtools/python/python-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/python-pycrypto_2.6.1.bb b/meta-python/recipes-devtools/python/python-pycrypto_2.6.1.bb
deleted file mode 100644
index e13db01b7f..0000000000
--- a/meta-python/recipes-devtools/python/python-pycrypto_2.6.1.bb
+++ /dev/null
@@ -1,9 +0,0 @@
-inherit distutils
-require python-pycrypto.inc
-
-# 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() {
- distutils_do_install
-}
diff --git a/meta-python/recipes-devtools/python/python-pycryptodome.inc b/meta-python/recipes-devtools/python/python-pycryptodome.inc
deleted file mode 100644
index c4969f9667..0000000000
--- a/meta-python/recipes-devtools/python/python-pycryptodome.inc
+++ /dev/null
@@ -1,29 +0,0 @@
-SUMMARY = "Cryptographic library for Python"
-DESCRIPTION = "PyCryptodome is a self-contained Python package of low-level\
- cryptographic primitives."
-HOMEPAGE = "http://www.pycryptodome.org"
-LICENSE = "PD & BSD-2-Clause"
-LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=775fe77831c03bf82f35abc0e230d4c1"
-
-SRC_URI[md5sum] = "a2587b6381b0ef4eb960cea1e7507d04"
-SRC_URI[sha256sum] = "c5dd29e9f1b733e74311bf95d0e544e91bd1d14bc0366e8f443562d8d9920b7d"
-
-inherit pypi
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-io \
- ${PYTHON_PN}-math \
-"
-
-RDEPENDS_${PN}-tests += " \
- ${PYTHON_PN}-unittest \
-"
-
-PACKAGES =+ "${PN}-tests"
-
-FILES_${PN}-tests += " \
- ${PYTHON_SITEPACKAGES_DIR}/Crypto/SelfTest/ \
- ${PYTHON_SITEPACKAGES_DIR}/Crypto/SelfTest/__pycache__/ \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-pycryptodome_3.4.11.bb b/meta-python/recipes-devtools/python/python-pycryptodome_3.4.11.bb
deleted file mode 100644
index c7701eb9f9..0000000000
--- a/meta-python/recipes-devtools/python/python-pycryptodome_3.4.11.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-pycryptodome.inc
-inherit setuptools
diff --git a/meta-python/recipes-devtools/python/python-pycurl.inc b/meta-python/recipes-devtools/python/python-pycurl.inc
deleted file mode 100644
index ac9a370c4c..0000000000
--- a/meta-python/recipes-devtools/python/python-pycurl.inc
+++ /dev/null
@@ -1,26 +0,0 @@
-SUMMARY = "A Python Interface To The cURL library"
-DESCRIPTION = "\
-PycURL is a Python interface to libcurl, the multiprotocol file \
-transfer library. Similarly to the urllib Python module, PycURL can \
-be used to fetch objects identified by a URL from a Python program \
-"
-SECTION = "devel/python"
-HOMEPAGE = "http://pycurl.io/"
-
-LICENSE = "LGPLv2 | MIT"
-LIC_FILES_CHKSUM = " \
- file://COPYING-LGPL;md5=4fbd65380cdd255951079008b364516c \
- file://COPYING-MIT;md5=2df767ed35d8ea83de4a93feb55e7815 \
-"
-
-SRC_URI[md5sum] = "f0ed4c805e8bec734990e2e0ee78568e"
-SRC_URI[sha256sum] = "6f08330c5cf79fa8ef68b9912b9901db7ffd34b63e225dce74db56bb21deda8e"
-
-inherit pypi
-
-PYPI_PACKAGE = "pycurl"
-
-DEPENDS = "\
- curl \
- ${PYTHON_PN}\
-"
diff --git a/meta-python/recipes-devtools/python/python-pycurl_7.43.0.3.bb b/meta-python/recipes-devtools/python/python-pycurl_7.43.0.3.bb
deleted file mode 100644
index 7ab259265e..0000000000
--- a/meta-python/recipes-devtools/python/python-pycurl_7.43.0.3.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-pycurl.inc
diff --git a/meta-python/recipes-devtools/python/python-pydbus.inc b/meta-python/recipes-devtools/python/python-pydbus.inc
deleted file mode 100644
index 0773b7ff88..0000000000
--- a/meta-python/recipes-devtools/python/python-pydbus.inc
+++ /dev/null
@@ -1,11 +0,0 @@
-DESCRIPTION = "Pythonic DBus library"
-HOMEPAGE = "https://pypi.python.org/pypi/pydbus/"
-LICENSE = "LGPLv2.1"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=a916467b91076e631dd8edb7424769c7"
-
-SRC_URI[md5sum] = "c6abd44862322679bd4e907bebc3e0d0"
-SRC_URI[sha256sum] = "4207162eff54223822c185da06c1ba8a34137a9602f3da5a528eedf3f78d0f2c"
-
-S = "${WORKDIR}/pydbus-${PV}"
-
-RDEPENDS_${PN} = "${PYTHON_PN}-pygobject"
diff --git a/meta-python/recipes-devtools/python/python-pydbus_0.6.0.bb b/meta-python/recipes-devtools/python/python-pydbus_0.6.0.bb
deleted file mode 100644
index 1722a80cd3..0000000000
--- a/meta-python/recipes-devtools/python/python-pydbus_0.6.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-pydbus.inc
-inherit pypi setuptools
diff --git a/meta-python/recipes-devtools/python/python-pyexpect.inc b/meta-python/recipes-devtools/python/python-pyexpect.inc
deleted file mode 100644
index d2d41d51d2..0000000000
--- a/meta-python/recipes-devtools/python/python-pyexpect.inc
+++ /dev/null
@@ -1,11 +0,0 @@
-SUMMARY = "Python expectaton library"
-DESCRIPTION = "Minimal but very flexible implementation of the expect pattern"
-SECTION = "devel/python"
-HOMEPAGE = " https://bitbucket.org/dwt/pyexpect"
-LICENSE = "ISC"
-LIC_FILES_CHKSUM = "file://README.md;md5=500b884e9dcd5f677a53cbbee8ace939"
-
-inherit pypi
-
-SRC_URI[md5sum] = "c71307d6c7096fdbde0813018dfa0092"
-SRC_URI[sha256sum] = "d656ef7e07a8aa539ce0a4883a683341037b6fc1c329bf55b63bffbf2cce9582"
diff --git a/meta-python/recipes-devtools/python/python-pyexpect_1.0.17.bb b/meta-python/recipes-devtools/python/python-pyexpect_1.0.17.bb
deleted file mode 100644
index d26beb7944..0000000000
--- a/meta-python/recipes-devtools/python/python-pyexpect_1.0.17.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-pyexpect.inc
diff --git a/meta-python/recipes-devtools/python/python-pyfirmata.inc b/meta-python/recipes-devtools/python/python-pyfirmata.inc
deleted file mode 100644
index 2365379aa2..0000000000
--- a/meta-python/recipes-devtools/python/python-pyfirmata.inc
+++ /dev/null
@@ -1,13 +0,0 @@
-SUMMARY = "A Python interface for the Firmata protocol"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=84ddcef430b7c44caa22b2ff4b37a3df"
-PYPI_PACKAGE = "pyFirmata"
-
-RDEPENDS_${PN} = "\
- ${PYTHON_PN}-pyserial \
-"
-
-SRC_URI[md5sum] = "ee4c23ca5c35d3091d550a63540811a3"
-SRC_URI[sha256sum] = "b54d49d66a9d93c1ef9c72ca01264414cb2de177baac116c12d5cce0c380160c"
-
-inherit pypi
diff --git a/meta-python/recipes-devtools/python/python-pyfirmata_1.0.3.bb b/meta-python/recipes-devtools/python/python-pyfirmata_1.0.3.bb
deleted file mode 100644
index d77e0f3853..0000000000
--- a/meta-python/recipes-devtools/python/python-pyfirmata_1.0.3.bb
+++ /dev/null
@@ -1,3 +0,0 @@
-inherit setuptools
-require python-pyfirmata.inc
-
diff --git a/meta-python/recipes-devtools/python/python-pyflakes_2.1.1.bb b/meta-python/recipes-devtools/python/python-pyflakes_2.1.1.bb
deleted file mode 100644
index 1c03f39908..0000000000
--- a/meta-python/recipes-devtools/python/python-pyflakes_2.1.1.bb
+++ /dev/null
@@ -1,16 +0,0 @@
-SUMMARY = "passive checker of Python programs"
-HOMEPAGE = "https://github.com/dreamhost/cliff"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://README.rst;md5=5127315117a8561a1504343d59620647"
-
-SRC_URI[md5sum] = "a0f71a15724e553c46e03ba5ed56703c"
-SRC_URI[sha256sum] = "d976835886f8c5b31d47970ed689944a0262b5f3afa00a5a7b4dc81e5449f8a2"
-
-inherit pypi setuptools
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-prettytable \
- ${PYTHON_PN}-cmd2 \
- ${PYTHON_PN}-pyparsing"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-pyflame.inc b/meta-python/recipes-devtools/python/python-pyflame.inc
deleted file mode 100644
index d8d8349df1..0000000000
--- a/meta-python/recipes-devtools/python/python-pyflame.inc
+++ /dev/null
@@ -1,18 +0,0 @@
-SUMMARY = "Pyflame: A Ptracing Profiler For Python"
-HOMEPAGE = "https://github.com/uber/pyflame"
-SECTION = "devel/python"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://${S}/LICENSE;md5=2ee41112a44fe7014dce33e26468ba93"
-DEPENDS = "python"
-
-SRC_URI = "git://github.com/uber/pyflame.git;protocol=https;nobranch=1"
-S = "${WORKDIR}/git"
-
-inherit pkgconfig autotools
-
-COMPATIBLE_HOST_libc-musl_class-target = "null"
-COMPATIBLE_HOST_mipsarch_class-target = "null"
-COMPATIBLE_HOST_aarch64_class-target = "null"
-COMPATIBLE_HOST_powerpc_class-target = "null"
-COMPATIBLE_HOST_riscv64_class-target = "null"
-COMPATIBLE_HOST_riscv32_class-target = "null"
diff --git a/meta-python/recipes-devtools/python/python-pyflame_1.6.7.bb b/meta-python/recipes-devtools/python/python-pyflame_1.6.7.bb
deleted file mode 100644
index cb08f30a67..0000000000
--- a/meta-python/recipes-devtools/python/python-pyflame_1.6.7.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-require python-pyflame.inc
-
-# v1.6.7
-SRCREV = "c151d2f34737f28a1f5266a003b2b0720bbd9f96"
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-pygpgme_0.3.bb b/meta-python/recipes-devtools/python/python-pygpgme_0.3.bb
deleted file mode 100644
index 14e967db88..0000000000
--- a/meta-python/recipes-devtools/python/python-pygpgme_0.3.bb
+++ /dev/null
@@ -1,26 +0,0 @@
-SUMMARY = "A Python module for working with OpenPGP messages"
-DESCRIPTION = "PyGPGME is a Python module that lets you sign, verify, \
- encrypt and decrypt messages using the OpenPGP format."
-HOMEPAGE = "https://launchpad.net/pygpgme"
-
-LICENSE = "LGPL-2.1"
-LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=6517bdc8f2416f27ab725d4702f7aac3"
-
-SRC_URI = "file://run-ptest \
- file://0001-reflect-2.1-reporting-for-key-imports.patch \
- file://0002-passphrase_cb-is-deprecated.patch \
- file://0003-handle-generic-error-when-no-passphrase-callback-pre.patch \
-"
-
-SRC_URI[md5sum] = "d38355af73f0352cde3d410b25f34fd0"
-SRC_URI[sha256sum] = "5fd887c407015296a8fd3f4b867fe0fcca3179de97ccde90449853a3dfb802e1"
-
-DEPENDS += "gpgme"
-RDEPENDS_${PN} += "gnupg"
-
-inherit pypi setuptools ptest
-
-do_install_ptest(){
- install ${S}/test_all.py ${D}${PTEST_PATH}
- cp -r ${S}/tests ${D}${PTEST_PATH}
-}
diff --git a/meta-python/recipes-devtools/python/python-pyhamcrest_1.9.0.bb b/meta-python/recipes-devtools/python/python-pyhamcrest_1.9.0.bb
deleted file mode 100644
index 02d4f54e15..0000000000
--- a/meta-python/recipes-devtools/python/python-pyhamcrest_1.9.0.bb
+++ /dev/null
@@ -1,10 +0,0 @@
-SUMMARY = "Hamcrest framework for matcher objects"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=f6df1318c6071dd1707f5e3b6c11f24f"
-
-PYPI_PACKAGE = "PyHamcrest"
-
-SRC_URI[md5sum] = "8b833a3fa30197455df79424f30c8c3f"
-SRC_URI[sha256sum] = "8ffaa0a53da57e89de14ced7185ac746227a8894dbd5a3c718bf05ddbd1d56cd"
-
-inherit pypi setuptools
diff --git a/meta-python/recipes-devtools/python/python-pyiface.inc b/meta-python/recipes-devtools/python/python-pyiface.inc
deleted file mode 100644
index 2e398fcef5..0000000000
--- a/meta-python/recipes-devtools/python/python-pyiface.inc
+++ /dev/null
@@ -1,11 +0,0 @@
-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+"
-
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=4fe869ee987a340198fb0d54c55c47f1"
-
-SRC_URI[md5sum] = "b066aa984656742738127c9c75436ab4"
-SRC_URI[sha256sum] = "e231e5735d329c5b2d4fc8854f069fdaa5436d3ef91ed64ee49e41e3f5e8a3f5"
-
-inherit pypi
diff --git a/meta-python/recipes-devtools/python/python-pyiface_0.0.11.bb b/meta-python/recipes-devtools/python/python-pyiface_0.0.11.bb
deleted file mode 100644
index 854cb30eee..0000000000
--- a/meta-python/recipes-devtools/python/python-pyiface_0.0.11.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-pyiface.inc \ No newline at end of file
diff --git a/meta-python/recipes-devtools/python/python-pyinotify.inc b/meta-python/recipes-devtools/python/python-pyinotify.inc
deleted file mode 100644
index 21abdb84f1..0000000000
--- a/meta-python/recipes-devtools/python/python-pyinotify.inc
+++ /dev/null
@@ -1,16 +0,0 @@
-DESCRIPTION = "Python pyinotify: Linux filesystem events monitoring"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://COPYING;md5=ab173cade7965b411528464589a08382"
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-threading \
- ${PYTHON_PN}-io \
- ${PYTHON_PN}-misc \
- ${PYTHON_PN}-shell \
- ${PYTHON_PN}-smtpd \
-"
-
-SRC_URI[md5sum] = "8e580fa1ff3971f94a6f81672b76c406"
-SRC_URI[sha256sum] = "9c998a5d7606ca835065cdabc013ae6c66eb9ea76a00a1e3bc6e0cfe2b4f71f4"
-
-inherit pypi
diff --git a/meta-python/recipes-devtools/python/python-pyinotify_0.9.6.bb b/meta-python/recipes-devtools/python/python-pyinotify_0.9.6.bb
deleted file mode 100644
index 0c9a2c72e1..0000000000
--- a/meta-python/recipes-devtools/python/python-pyinotify_0.9.6.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-inherit setuptools
-require python-pyinotify.inc
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-subprocess \
-"
diff --git a/meta-python/recipes-devtools/python/python-pyjks_17.1.1.bb b/meta-python/recipes-devtools/python/python-pyjks_17.1.1.bb
deleted file mode 100644
index ce99f28350..0000000000
--- a/meta-python/recipes-devtools/python/python-pyjks_17.1.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-pyjks.inc
-inherit setuptools
diff --git a/meta-python/recipes-devtools/python/python-pyjwt.inc b/meta-python/recipes-devtools/python/python-pyjwt.inc
deleted file mode 100644
index 00c38e317e..0000000000
--- a/meta-python/recipes-devtools/python/python-pyjwt.inc
+++ /dev/null
@@ -1,17 +0,0 @@
-SUMMARY = "JSON Web Token implementation in Python"
-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[md5sum] = "2731c6b66b67b95d1944f072f5fa35a9"
-SRC_URI[sha256sum] = "4ee413b357d53fd3fb44704577afac88e72e878716116270d722723d65b42176"
-
-PYPI_PACKAGE = "PyJWT"
-inherit pypi
-
-RDEPENDS_${PN} = "${PYTHON_PN}-cryptography"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-pyjwt_1.6.4.bb b/meta-python/recipes-devtools/python/python-pyjwt_1.6.4.bb
deleted file mode 100644
index f0a77b674b..0000000000
--- a/meta-python/recipes-devtools/python/python-pyjwt_1.6.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-pyjwt.inc
-inherit setuptools
diff --git a/meta-python/recipes-devtools/python/python-pylint.inc b/meta-python/recipes-devtools/python/python-pylint.inc
deleted file mode 100644
index ba85b98878..0000000000
--- a/meta-python/recipes-devtools/python/python-pylint.inc
+++ /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
-
-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/python-pylint_1.8.3.bb b/meta-python/recipes-devtools/python/python-pylint_1.8.3.bb
deleted file mode 100644
index 7b51d3fbd5..0000000000
--- a/meta-python/recipes-devtools/python/python-pylint_1.8.3.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-inherit setuptools python-dir
-require python-pylint.inc
-
-RDEPENDS_${PN} += "${PYTHON_PN}-backports-functools-lru-cache"
diff --git a/meta-python/recipes-devtools/python/python-pymisp.inc b/meta-python/recipes-devtools/python/python-pymisp.inc
deleted file mode 100644
index 468a80122b..0000000000
--- a/meta-python/recipes-devtools/python/python-pymisp.inc
+++ /dev/null
@@ -1,15 +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[md5sum] = "6d549b36cbfa8c1a3323c5d6e299789e"
-SRC_URI[sha256sum] = "f4ed2000cbe1a314f1f88fd8a8eba4ad05974b351b96f1235c6e532158a39fe0"
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-dateutil \
- ${PYTHON_PN}-json \
- ${PYTHON_PN}-jsonschema \
- ${PYTHON_PN}-requests \
- ${PYTHON_PN}-six \
-"
diff --git a/meta-python/recipes-devtools/python/python-pymisp_2.4.93.bb b/meta-python/recipes-devtools/python/python-pymisp_2.4.93.bb
deleted file mode 100644
index 1b1fbe956e..0000000000
--- a/meta-python/recipes-devtools/python/python-pymisp_2.4.93.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-pymisp.inc
diff --git a/meta-python/recipes-devtools/python/python-pymongo_3.9.0.bb b/meta-python/recipes-devtools/python/python-pymongo_3.9.0.bb
deleted file mode 100644
index b1778b2f13..0000000000
--- a/meta-python/recipes-devtools/python/python-pymongo_3.9.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-pymongo.inc
diff --git a/meta-python/recipes-devtools/python/python-pymysql_0.9.3.bb b/meta-python/recipes-devtools/python/python-pymysql_0.9.3.bb
deleted file mode 100644
index 27d097ee6b..0000000000
--- a/meta-python/recipes-devtools/python/python-pymysql_0.9.3.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-pymysql.inc
diff --git a/meta-python/recipes-devtools/python/python-pynetlinux.inc b/meta-python/recipes-devtools/python/python-pynetlinux.inc
deleted file mode 100644
index 6a39896279..0000000000
--- a/meta-python/recipes-devtools/python/python-pynetlinux.inc
+++ /dev/null
@@ -1,11 +0,0 @@
-SUMMARY = "Linux network configuration library for Python"
-DESCRIPTION = "This library contains Python bindings to ioctl calls"
-SECTION = "devel/python"
-HOMEPAGE = "http://github.com/rlisagor/pynetlinux"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=74e1861736ee959824fe7542323c12e9"
-
-inherit pypi
-
-SRC_URI[md5sum] = "3336e5d4a478acca4e35bf3125b4f883"
-SRC_URI[sha256sum] = "4ad08298c9f5ba15a11cddc639ba8778cabdfc402b51066d9e0a325e5a5b391c"
diff --git a/meta-python/recipes-devtools/python/python-pynetlinux_1.1.bb b/meta-python/recipes-devtools/python/python-pynetlinux_1.1.bb
deleted file mode 100644
index c45ad6ad66..0000000000
--- a/meta-python/recipes-devtools/python/python-pynetlinux_1.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-pynetlinux.inc
diff --git a/meta-python/recipes-devtools/python/python-pyopenssl.inc b/meta-python/recipes-devtools/python/python-pyopenssl.inc
deleted file mode 100644
index 00c103fcf2..0000000000
--- a/meta-python/recipes-devtools/python/python-pyopenssl.inc
+++ /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[md5sum] = "b9876625dc1d5a5a662d748689191537"
-SRC_URI[sha256sum] = "aeca66338f6de19d1aa46ed634c3b9ae519a64b458f8468aec688e7e3c20f200"
-
-PYPI_PACKAGE = "pyOpenSSL"
-
-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/python-pyopenssl_19.0.0.bb b/meta-python/recipes-devtools/python/python-pyopenssl_19.0.0.bb
deleted file mode 100644
index b7d5146130..0000000000
--- a/meta-python/recipes-devtools/python/python-pyopenssl_19.0.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-pyopenssl.inc
-inherit pypi setuptools
diff --git a/meta-python/recipes-devtools/python/python-pyparsing.inc b/meta-python/recipes-devtools/python/python-pyparsing.inc
deleted file mode 100644
index 556946e76c..0000000000
--- a/meta-python/recipes-devtools/python/python-pyparsing.inc
+++ /dev/null
@@ -1,21 +0,0 @@
-SUMMARY = "Python parsing module"
-HOMEPAGE = "http://pyparsing.wikispaces.com/"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=657a566233888513e1f07ba13e2f47f1"
-
-SRC_URI[md5sum] = "46d02cbe0461fe0571d51649e6006ef5"
-SRC_URI[sha256sum] = "6f98a7b9397e206d78cc01df10131398f1c8b8510a2f4d97d9abd82e1aacdd80"
-
-inherit pypi
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-datetime \
- ${PYTHON_PN}-debugger \
- ${PYTHON_PN}-json \
- ${PYTHON_PN}-netclient \
- ${PYTHON_PN}-pprint \
- ${PYTHON_PN}-stringold \
- ${PYTHON_PN}-threading \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-pyparsing_2.4.2.bb b/meta-python/recipes-devtools/python/python-pyparsing_2.4.2.bb
deleted file mode 100644
index 90217f3c3e..0000000000
--- a/meta-python/recipes-devtools/python/python-pyparsing_2.4.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-pyparsing.inc
diff --git a/meta-python/recipes-devtools/python/python-pyperclip.inc b/meta-python/recipes-devtools/python/python-pyperclip.inc
deleted file mode 100644
index 85a4312c25..0000000000
--- a/meta-python/recipes-devtools/python/python-pyperclip.inc
+++ /dev/null
@@ -1,14 +0,0 @@
-DESCRIPTION = "A cross-platform clipboard module for Python. (only handles plain text for now)"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://PKG-INFO;md5=a428356ada7737b416ec4b63dc65d581"
-
-SRC_URI[md5sum] = "6bbb8598579cc3ee50554b4c59d0cfae"
-SRC_URI[sha256sum] = "979325468ccf682104d5dcaf753f869868100631301d3e72f47babdea5700d1c"
-
-inherit pypi
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-ctypes \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-pyperclip_1.7.0.bb b/meta-python/recipes-devtools/python/python-pyperclip_1.7.0.bb
deleted file mode 100644
index 6c9fcbd84e..0000000000
--- a/meta-python/recipes-devtools/python/python-pyperclip_1.7.0.bb
+++ /dev/null
@@ -1,7 +0,0 @@
-inherit setuptools
-require python-pyperclip.inc
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-contextlib \
- ${PYTHON_PN}-subprocess \
-"
diff --git a/meta-python/recipes-devtools/python/python-pyperf_1.6.1.bb b/meta-python/recipes-devtools/python/python-pyperf_1.6.1.bb
deleted file mode 100644
index a9d5c74883..0000000000
--- a/meta-python/recipes-devtools/python/python-pyperf_1.6.1.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-inherit setuptools
-require python-pyperf.inc
-
-RDEPENDS_${PN} += "${PYTHON_PN}-statistics"
diff --git a/meta-python/recipes-devtools/python/python-pyrex-native_0.9.9.bb b/meta-python/recipes-devtools/python/python-pyrex-native_0.9.9.bb
deleted file mode 100644
index e8ef1aa12b..0000000000
--- a/meta-python/recipes-devtools/python/python-pyrex-native_0.9.9.bb
+++ /dev/null
@@ -1,5 +0,0 @@
-require python-pyrex_${PV}.bb
-inherit native pythonnative
-DEPENDS = "python-native"
-RDEPENDS_${PN} = ""
-PR = "r3"
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-pyrex_0.9.9.bb b/meta-python/recipes-devtools/python/python-pyrex_0.9.9.bb
deleted file mode 100644
index c4dd2e69b0..0000000000
--- a/meta-python/recipes-devtools/python/python-pyrex_0.9.9.bb
+++ /dev/null
@@ -1,22 +0,0 @@
-SUMMARY = "Language for writing Python extension modules"
-DESCRIPTION = "Pyrex is a language specially designed for writing Python extension modules. \
-It's designed to bridge the gap between the nice, high-level, easy-to-use world of Python \
-and the messy, low-level world of C."
-SECTION = "devel/python"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=771d472f53f933033f57eeee7808e5bd"
-SRCNAME = "Pyrex"
-PR = "r4"
-
-SRC_URI = "\
- http://www.cosc.canterbury.ac.nz/greg.ewing/python/${SRCNAME}/${SRCNAME}-${PV}.tar.gz \
- file://pyrex-fix-optimized-mode.patch \
-"
-
-SRC_URI[md5sum] = "515dee67d15d4393841e2d60e8341947"
-SRC_URI[sha256sum] = "5f87df06831d0b3412eb4bc9d3fc2ee7bfae1b913d7da8c23ab2bf5699fb6b50"
-S = "${WORKDIR}/${SRCNAME}-${PV}"
-
-inherit distutils
-
-FILES_${PN} += "${datadir}${base_libdir}/${PYTHON_DIR}/site-packages/Pyrex/Compiler/Lexicon.pickle"
diff --git a/meta-python/recipes-devtools/python/python-pyroute2.inc b/meta-python/recipes-devtools/python/python-pyroute2.inc
deleted file mode 100644
index ed1981e49a..0000000000
--- a/meta-python/recipes-devtools/python/python-pyroute2.inc
+++ /dev/null
@@ -1,25 +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[md5sum] = "2f6f951e94356ae9d224f417dc6ebed2"
-SRC_URI[sha256sum] = "42bf74495d95a0196a74dd171357f660175aba2bfc23f9b5f63e3830ccbef9ac"
-
-FILESEXTRAPATHS_prepend := "${THISDIR}/python-pyroute2:"
-
-inherit pypi
-
-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 \
-"
diff --git a/meta-python/recipes-devtools/python/python-pyroute2_0.5.2.bb b/meta-python/recipes-devtools/python/python-pyroute2_0.5.2.bb
deleted file mode 100644
index f25f1b4ab3..0000000000
--- a/meta-python/recipes-devtools/python/python-pyroute2_0.5.2.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-require python-pyroute2.inc
-inherit setuptools
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-subprocess \
-"
diff --git a/meta-python/recipes-devtools/python/python-pyrsistent.inc b/meta-python/recipes-devtools/python/python-pyrsistent.inc
deleted file mode 100644
index 2add037de8..0000000000
--- a/meta-python/recipes-devtools/python/python-pyrsistent.inc
+++ /dev/null
@@ -1,13 +0,0 @@
-SUMMARY = "Persistent/Immutable/Functional data structures for Python"
-HOMEPAGE = "https://github.com/tobgu/pyrsistent"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENCE.mit;md5=ca574f2891cf528b3e7a2ee570337e7c"
-
-SRC_URI[md5sum] = "0298efae86e009e24136d39dc8b2d33e"
-SRC_URI[sha256sum] = "34b47fa169d6006b32e99d4b3c4031f155e6e68ebcc107d6454852e8e0ee6533"
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-six \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-pyrsistent_0.15.4.bb b/meta-python/recipes-devtools/python/python-pyrsistent_0.15.4.bb
deleted file mode 100644
index 832eb80381..0000000000
--- a/meta-python/recipes-devtools/python/python-pyrsistent_0.15.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-pyrsistent.inc
diff --git a/meta-python/recipes-devtools/python/python-pyserial.inc b/meta-python/recipes-devtools/python/python-pyserial.inc
deleted file mode 100644
index 870f1d8a8a..0000000000
--- a/meta-python/recipes-devtools/python/python-pyserial.inc
+++ /dev/null
@@ -1,44 +0,0 @@
-SUMMARY = "Serial Port Support for Python"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=d476d94926db6e0008a5b3860d1f5c0d"
-
-SRC_URI[md5sum] = "ed6183b15519a0ae96675e9c3330c69b"
-SRC_URI[sha256sum] = "6e2d401fdee0eab996cf734e67773a0143b932772ca8b42451440cfed942c627"
-
-inherit pypi
-
-PACKAGES =+ "${PN}-java ${PN}-osx ${PN}-win32 ${PN}-tools"
-
-FILES_${PN}-java = " \
- ${PYTHON_SITEPACKAGES_DIR}/serial/*java* \
- ${PYTHON_SITEPACKAGES_DIR}/serial/__pycache__/*java* \
-"
-
-FILES_${PN}-osx = " \
- ${PYTHON_SITEPACKAGES_DIR}/serial/tools/*osx* \
- ${PYTHON_SITEPACKAGES_DIR}/serial/tools/__pycache__/*osx* \
-"
-
-FILES_${PN}-win32 = " \
- ${PYTHON_SITEPACKAGES_DIR}/serial/*serialcli* \
- ${PYTHON_SITEPACKAGES_DIR}/serial/__pycache__/*serialcli* \
- ${PYTHON_SITEPACKAGES_DIR}/serial/*win32* \
- ${PYTHON_SITEPACKAGES_DIR}/serial/__pycache__/*win32* \
- ${PYTHON_SITEPACKAGES_DIR}/serial/tools/miniterm* \
- ${PYTHON_SITEPACKAGES_DIR}/serial/tools/__pycache__/miniterm* \
- ${PYTHON_SITEPACKAGES_DIR}/serial/tools/*windows* \
- ${PYTHON_SITEPACKAGES_DIR}/serial/tools/__pycache__/*windows* \
-"
-
-RDEPENDS_${PN} = "\
- ${PYTHON_PN}-fcntl \
- ${PYTHON_PN}-io \
- ${PYTHON_PN}-logging \
- ${PYTHON_PN}-netclient \
- ${PYTHON_PN}-numbers \
- ${PYTHON_PN}-shell \
- ${PYTHON_PN}-stringold \
- ${PYTHON_PN}-threading \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-pyserial_3.4.bb b/meta-python/recipes-devtools/python/python-pyserial_3.4.bb
deleted file mode 100644
index fd852a2bf8..0000000000
--- a/meta-python/recipes-devtools/python/python-pyserial_3.4.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-inherit setuptools
-require python-pyserial.inc
-
-RDEPENDS_${PN} += "${PYTHON_PN}-argparse"
diff --git a/meta-python/recipes-devtools/python/python-pysmi_0.2.2.bb b/meta-python/recipes-devtools/python/python-pysmi_0.2.2.bb
deleted file mode 100644
index 24759b5d6d..0000000000
--- a/meta-python/recipes-devtools/python/python-pysmi_0.2.2.bb
+++ /dev/null
@@ -1,16 +0,0 @@
-SUMMARY = "SNMP SMI/MIB Parser"
-DESCRIPTION = "A pure-Python implementation of SNMP/SMI MIB \
- parsing and conversion library. Can produce PySNMP MIB modules. \
-"
-HOMEPAGE = "https://pypi.python.org/pypi/pysmi"
-SECTION = "devel/python"
-
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=d8b1bbadd635f187dee74d999a8c67b8"
-
-SRC_URI[md5sum] = "3b0f71e4e9f730d211f09d8ef5371140"
-SRC_URI[sha256sum] = "2a315cc3e556b3428372b69da663a24d2f0df9e9ab075b022cb133855f25aef7"
-
-inherit pypi setuptools
-
-RDEPENDS_${PN} = "python-ply"
diff --git a/meta-python/recipes-devtools/python/python-pysnmp_4.4.9.bb b/meta-python/recipes-devtools/python/python-pysnmp_4.4.9.bb
deleted file mode 100644
index 9ff4df2c93..0000000000
--- a/meta-python/recipes-devtools/python/python-pysnmp_4.4.9.bb
+++ /dev/null
@@ -1,26 +0,0 @@
-SUMMARY = "A pure-Python SNMPv1/v2c/v3 library"
-DESCRIPTION = "SNMP v1/v2c/v3 engine and apps written in pure-Python. \
- Supports Manager/Agent/Proxy roles, scriptable MIBs, asynchronous \
- operation (asyncio, twisted, asyncore) and multiple transports.\
-"
-HOMEPAGE = "https://pypi.python.org/pypi/pysnmp"
-SECTION = "devel/python"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=b15d29f500f748d1c2a15709769090a8"
-
-SRCNAME = "pysnmp"
-
-SRC_URI = "https://files.pythonhosted.org/packages/source/p/${SRCNAME}/${SRCNAME}-${PV}.tar.gz"
-
-SRC_URI[md5sum] = "6d1b514997326bed18f1ae1510f6b1c9"
-SRC_URI[sha256sum] = "d5d1e59780126e963dd92e25993b783295734e71bef181f602e51f7393260441"
-
-
-S = "${WORKDIR}/${SRCNAME}-${PV}"
-
-inherit setuptools
-
-RDEPENDS_${PN} += "python-pycrypto \
- python-pyasn1 \
- python-pysmi \
-"
diff --git a/meta-python/recipes-devtools/python/python-pysocks.inc b/meta-python/recipes-devtools/python/python-pysocks.inc
deleted file mode 100644
index ceadcb20d4..0000000000
--- a/meta-python/recipes-devtools/python/python-pysocks.inc
+++ /dev/null
@@ -1,18 +0,0 @@
-DESCRIPTION = "A Python SOCKS client module"
-HOMEPAGE = "http://python-requests.org"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=1d457bcffb9661b45f799d4efee72f16"
-
-SRC_URI[md5sum] = "89b1a6865c61bae67a32417517612ee6"
-SRC_URI[sha256sum] = "3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"
-
-PYPI_PACKAGE = "PySocks"
-
-RDEPENDS_${PN}_class-target += "\
- ${PYTHON_PN}-email \
- ${PYTHON_PN}-io \
- ${PYTHON_PN}-netclient \
- ${PYTHON_PN}-shell \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-pysocks_1.7.1.bb b/meta-python/recipes-devtools/python/python-pysocks_1.7.1.bb
deleted file mode 100644
index 8a24e4c49a..0000000000
--- a/meta-python/recipes-devtools/python/python-pysocks_1.7.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-pysocks.inc
diff --git a/meta-python/recipes-devtools/python/python-pysqlite.inc b/meta-python/recipes-devtools/python/python-pysqlite.inc
deleted file mode 100644
index 884556570d..0000000000
--- a/meta-python/recipes-devtools/python/python-pysqlite.inc
+++ /dev/null
@@ -1,18 +0,0 @@
-DESCRIPTION = "DB-API 2.0 interface for SQLite 3.x"
-HOMEPAGE = "http://github.com/ghaering/pysqlite"
-LICENSE = "Zlib"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=28ad4f115e06c88bd737372a453369d8"
-
-SRC_URI[md5sum] = "033f17b8644577715aee55e8832ac9fc"
-SRC_URI[sha256sum] = "17d3335863e8cf8392eea71add33dab3f96d060666fe68ab7382469d307f4490"
-
-inherit pypi
-
-DEPENDS += "${PYTHON_PN}-pip"
-
-RDEPENDS_${PN}_class-target += "\
- ${PYTHON_PN}-datetime \
- sqlite3 \
-"
-
-FILES_${PN}-doc += "${datadir}"
diff --git a/meta-python/recipes-devtools/python/python-pysqlite_2.8.3.bb b/meta-python/recipes-devtools/python/python-pysqlite_2.8.3.bb
deleted file mode 100644
index 95938f2b68..0000000000
--- a/meta-python/recipes-devtools/python/python-pysqlite_2.8.3.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-pysqlite.inc
diff --git a/meta-python/recipes-devtools/python/python-pystache.inc b/meta-python/recipes-devtools/python/python-pystache.inc
deleted file mode 100644
index 6dbc99f530..0000000000
--- a/meta-python/recipes-devtools/python/python-pystache.inc
+++ /dev/null
@@ -1,13 +0,0 @@
-SUMMARY = "Python implementation of Mustache"
-HOMEPAGE = "https://github.com/defunkt/pystache"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=eb4417802c56384aac71b34505528a60"
-
-SRC_URI[md5sum] = "485885e67a0f6411d5252e69b20a35ca"
-SRC_URI[sha256sum] = "f7bbc265fb957b4d6c7c042b336563179444ab313fb93a719759111eabd3b85a"
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-netserver \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-pystache_0.5.4.bb b/meta-python/recipes-devtools/python/python-pystache_0.5.4.bb
deleted file mode 100644
index a455012471..0000000000
--- a/meta-python/recipes-devtools/python/python-pystache_0.5.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-pystache.inc
diff --git a/meta-python/recipes-devtools/python/python-pytest-asyncio.inc b/meta-python/recipes-devtools/python/python-pytest-asyncio.inc
deleted file mode 100644
index 9132c7452c..0000000000
--- a/meta-python/recipes-devtools/python/python-pytest-asyncio.inc
+++ /dev/null
@@ -1,13 +0,0 @@
-DESCRIPTION = "pytest-asyncio is an Apache2 licensed library, written in Python, for testing asyncio code with pytest"
-HOMEPAGE = "https://github.com/pytest-dev/pytest-asyncio"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://README.rst;md5=ae62268d207c73b615fbefddaf91a881"
-
-SRC_URI[md5sum] = "247a7ec32f24a185341327c42a0f85bf"
-SRC_URI[sha256sum] = "9fac5100fd716cbecf6ef89233e8590a4ad61d729d1732e0a96b84182df1daaf"
-
-inherit pypi
-
-DEPENDS += "${PYTHON_PN}-pytest-native"
-
-BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python-pytest-helpers-namespace_2016.7.10.bb b/meta-python/recipes-devtools/python/python-pytest-helpers-namespace_2016.7.10.bb
deleted file mode 100644
index 2b6ee85503..0000000000
--- a/meta-python/recipes-devtools/python/python-pytest-helpers-namespace_2016.7.10.bb
+++ /dev/null
@@ -1,7 +0,0 @@
-require python-pytest-helpers-namespace.inc
-
-inherit setuptools
-
-RDEPENDS_${PN} += " \
- python-pytest \
- "
diff --git a/meta-python/recipes-devtools/python/python-pytest-runner.inc b/meta-python/recipes-devtools/python/python-pytest-runner.inc
deleted file mode 100644
index 113ab41f5f..0000000000
--- a/meta-python/recipes-devtools/python/python-pytest-runner.inc
+++ /dev/null
@@ -1,16 +0,0 @@
-SUMMARY = "Invoke py.test as distutils command with dependency resolution"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=a33f38bbf47d48c70fe0d40e5f77498e"
-
-SRC_URI[md5sum] = "a52d65bd3dbc88bed751cf934dc41db3"
-SRC_URI[sha256sum] = "25a013c8d84f0ca60bb01bd11913a3bcab420f601f0f236de4423074af656e7a"
-
-inherit pypi
-
-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/python-pytest-runner_5.1.bb b/meta-python/recipes-devtools/python/python-pytest-runner_5.1.bb
deleted file mode 100644
index 1765a732d0..0000000000
--- a/meta-python/recipes-devtools/python/python-pytest-runner_5.1.bb
+++ /dev/null
@@ -1,5 +0,0 @@
-inherit setuptools
-require python-pytest-runner.inc
-
-# Dependency only exists for python2
-RDEPENDS_${PN} += "python-argparse python-compiler"
diff --git a/meta-python/recipes-devtools/python/python-pytest-tempdir.inc b/meta-python/recipes-devtools/python/python-pytest-tempdir.inc
deleted file mode 100644
index 196f6d644a..0000000000
--- a/meta-python/recipes-devtools/python/python-pytest-tempdir.inc
+++ /dev/null
@@ -1,10 +0,0 @@
-DESCRIPTION = "Adds support for a predictable and repeatable temporary directory."
-HOMEPAGE = "https://github.com/saltstack/pytest-tempdir"
-SECTION = "devel/python"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://PKG-INFO;md5=8751a9cf4a70be4f02697a9b89e686ce"
-
-SRC_URI[md5sum] = "f87f2583f5f8aaca7203d57ada3948b5"
-SRC_URI[sha256sum] = "65ff815966ea6dfc07ca1b43747c9888a6d883971170e67b16290f9f50d434ea"
-
-inherit pypi
diff --git a/meta-python/recipes-devtools/python/python-pytest-tempdir_2016.8.20.bb b/meta-python/recipes-devtools/python/python-pytest-tempdir_2016.8.20.bb
deleted file mode 100644
index 8a9b83e3df..0000000000
--- a/meta-python/recipes-devtools/python/python-pytest-tempdir_2016.8.20.bb
+++ /dev/null
@@ -1,7 +0,0 @@
-require python-pytest-tempdir.inc
-
-inherit setuptools
-
-RDEPENDS_${PN} += " \
- python-pytest \
- "
diff --git a/meta-python/recipes-devtools/python/python-pytest.inc b/meta-python/recipes-devtools/python/python-pytest.inc
deleted file mode 100644
index fa264f7914..0000000000
--- a/meta-python/recipes-devtools/python/python-pytest.inc
+++ /dev/null
@@ -1,41 +0,0 @@
-SUMMARY = "Simple powerful teting with python"
-HOMEPAGE = "http://pytest.org"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=640061b8cee64b308a4d2f9f556c12f2"
-
-SRC_URI[md5sum] = "00561d0295aab167987f8a4f784964c4"
-SRC_URI[sha256sum] = "ca563435f4941d0cb34767301c27bc65c510cb82e90b9ecf9cb52dc2c63caaa0"
-
-SRC_URI_append = " file://0001-setup.py-remove-the-setup_requires-for-setuptools-scm.patch \
- "
-
-inherit update-alternatives
-
-RDEPENDS_${PN}_class-target += " \
- ${PYTHON_PN}-attrs \
- ${PYTHON_PN}-debugger \
- ${PYTHON_PN}-doctest \
- ${PYTHON_PN}-json \
- ${PYTHON_PN}-pluggy \
- ${PYTHON_PN}-py \
- ${PYTHON_PN}-setuptools \
- ${PYTHON_PN}-six \
- ${PYTHON_PN}-atomicwrites \
- ${PYTHON_PN}-importlib-metadata \
- ${PYTHON_PN}-pathlib2 \
- ${PYTHON_PN}-wcwidth \
- ${PYTHON_PN}-more-itertools \
- ${PYTHON_PN}-packaging \
-"
-
-FILESEXTRAPATHS_prepend := "${THISDIR}/python-pytest:"
-
-ALTERNATIVE_${PN} += "py.test pytest"
-
-NATIVE_LINK_NAME[pytest] = "${bindir}/pytest"
-ALTERNATIVE_TARGET[pytest] = "${bindir}/pytest"
-
-ALTERNATIVE_LINK_NAME[py.test] = "${bindir}/py.test"
-ALTERNATIVE_TARGET[py.test] = "${bindir}/py.test"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-pytest/0001-setup.py-remove-the-setup_requires-for-setuptools-scm.patch b/meta-python/recipes-devtools/python/python-pytest/0001-setup.py-remove-the-setup_requires-for-setuptools-scm.patch
deleted file mode 100644
index c29fb12de8..0000000000
--- a/meta-python/recipes-devtools/python/python-pytest/0001-setup.py-remove-the-setup_requires-for-setuptools-scm.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From ff784f4803ab33f5e3389e40d038d52d1e211843 Mon Sep 17 00:00:00 2001
-From: Yuan Chao <yuanc.fnst@cn.fujitsu.com>
-Date: Wed, 28 Aug 2019 16:12:27 +0900
-Subject: [PATCH] [PATCH] setup.py: remove the setup_requires for
- setuptools-scm
-
-The setup_requires argument forces the download of the egg file for setuptools-scm
-during the do_compile phase. This download is incompatible with the typical fetch
-and mirror structure. The only usage of scm is the generation of the _version.py
-file and in the release tarball it is already correctly created
-
-Upstream-Status: Inappropriate [oe specific]
-
-Signed-off-by: Derek Straka <derek@asterius.io>
-
-Signed-off-by: Yuan Chao <yuanc.fnst@cn.fujitsu.com>
----
- setup.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/setup.py b/setup.py
-index adbafb5..75fdd09 100644
---- a/setup.py
-+++ b/setup.py
-@@ -19,7 +19,7 @@ INSTALL_REQUIRES = [
- def main():
- setup(
- use_scm_version={"write_to": "src/_pytest/_version.py"},
-- setup_requires=["setuptools-scm", "setuptools>=40.0"],
-+ setup_requires=["setuptools>=40.0"],
- package_dir={"": "src"},
- extras_require={
- "testing": [
---
-2.17.1
-
diff --git a/meta-python/recipes-devtools/python/python-pytest_5.2.1.bb b/meta-python/recipes-devtools/python/python-pytest_5.2.1.bb
deleted file mode 100644
index 39e50aca97..0000000000
--- a/meta-python/recipes-devtools/python/python-pytest_5.2.1.bb
+++ /dev/null
@@ -1,9 +0,0 @@
-inherit pypi setuptools
-require python-pytest.inc
-
-RDEPENDS_${PN}_class-target += " \
- ${PYTHON_PN}-argparse \
- ${PYTHON_PN}-compiler \
- ${PYTHON_PN}-funcsigs \
-"
-ALTERNATIVE_PRIORITY = "10"
diff --git a/meta-python/recipes-devtools/python/python-pytz.inc b/meta-python/recipes-devtools/python/python-pytz.inc
deleted file mode 100644
index b4edea002b..0000000000
--- a/meta-python/recipes-devtools/python/python-pytz.inc
+++ /dev/null
@@ -1,20 +0,0 @@
-SUMMARY = "World timezone definitions, modern and historical"
-HOMEPAGE = "http://pythonhosted.org/pytz"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=4878a915709225bceab739bdc2a18e8d"
-
-inherit pypi
-
-SRC_URI[md5sum] = "c3d84a465fc56a4edd52cca8873ac0df"
-SRC_URI[sha256sum] = "b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be"
-
-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"
diff --git a/meta-python/recipes-devtools/python/python-pytz_2019.3.bb b/meta-python/recipes-devtools/python/python-pytz_2019.3.bb
deleted file mode 100755
index f2ffc596f8..0000000000
--- a/meta-python/recipes-devtools/python/python-pytz_2019.3.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-pytz.inc
diff --git a/meta-python/recipes-devtools/python/python-pyudev.inc b/meta-python/recipes-devtools/python/python-pyudev.inc
deleted file mode 100644
index 683a75cdd6..0000000000
--- a/meta-python/recipes-devtools/python/python-pyudev.inc
+++ /dev/null
@@ -1,19 +0,0 @@
-SUMMARY = "A libudev binding"
-LICENSE = "LGPLv2.1+"
-LIC_FILES_CHKSUM = "file://COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343"
-
-SRC_URI[md5sum] = "cf4d9db7d772622144ca1be6b5d9353b"
-SRC_URI[sha256sum] = "094b7a100150114748aaa3b70663485dd360457a709bfaaafe5a977371033f2b"
-
-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 \
- libudev \
-"
diff --git a/meta-python/recipes-devtools/python/python-pyudev_0.21.0.bb b/meta-python/recipes-devtools/python/python-pyudev_0.21.0.bb
deleted file mode 100644
index a3e15014a4..0000000000
--- a/meta-python/recipes-devtools/python/python-pyudev_0.21.0.bb
+++ /dev/null
@@ -1,9 +0,0 @@
-require python-pyudev.inc
-
-RDEPENDS_${PN} = "\
- ${PYTHON_PN}-contextlib \
- ${PYTHON_PN}-subprocess \
-"
-
-inherit pypi setuptools
-
diff --git a/meta-python/recipes-devtools/python/python-pyusb.inc b/meta-python/recipes-devtools/python/python-pyusb.inc
deleted file mode 100644
index baf2db5301..0000000000
--- a/meta-python/recipes-devtools/python/python-pyusb.inc
+++ /dev/null
@@ -1,12 +0,0 @@
-SUMMARY = "PyUSB provides USB access on the Python language"
-HOMEPAGE = "http://pyusb.sourceforge.net/"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=51691ed11cc2c7ae93e383f60ed49b0f"
-DEPENDS += "libusb1"
-
-SRC_URI[md5sum] = "862b56452c64948c787ad8ef9498590b"
-SRC_URI[sha256sum] = "4e9b72cc4a4205ca64fbf1f3fff39a335512166c151ad103e55c8223ac147362"
-
-inherit pypi
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-pyusb_1.0.2.bb b/meta-python/recipes-devtools/python/python-pyusb_1.0.2.bb
deleted file mode 100644
index 99a795b225..0000000000
--- a/meta-python/recipes-devtools/python/python-pyusb_1.0.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-pyusb.inc
diff --git a/meta-python/recipes-devtools/python/python-pyyaml.inc b/meta-python/recipes-devtools/python/python-pyyaml.inc
deleted file mode 100644
index e9ae85eb0b..0000000000
--- a/meta-python/recipes-devtools/python/python-pyyaml.inc
+++ /dev/null
@@ -1,18 +0,0 @@
-SUMMARY = "Python support for YAML"
-HOMEPAGE = "http://www.pyyaml.org"
-SECTION = "devel/python"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=a76b4c69bfcf82313bbdc0393b04438a"
-DEPENDS = "libyaml ${PYTHON_PN}-cython-native ${PYTHON_PN}"
-
-PYPI_PACKAGE = "PyYAML"
-inherit pypi
-
-SRC_URI[md5sum] = "20f87ab421b0271dbf371dc5c1cddb5c"
-SRC_URI[sha256sum] = "01adf0b6c6f61bd11af6e10ca52b7d4057dd0be0343eb9283c878cf3af56aee4"
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-datetime \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-pyyaml_5.1.2.bb b/meta-python/recipes-devtools/python/python-pyyaml_5.1.2.bb
deleted file mode 100644
index 5a4c92d88f..0000000000
--- a/meta-python/recipes-devtools/python/python-pyyaml_5.1.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-pyyaml.inc
-inherit setuptools
diff --git a/meta-python/recipes-devtools/python/python-pyzmq.inc b/meta-python/recipes-devtools/python/python-pyzmq.inc
deleted file mode 100644
index 2447c2f34b..0000000000
--- a/meta-python/recipes-devtools/python/python-pyzmq.inc
+++ /dev/null
@@ -1,27 +0,0 @@
-SUMMARY = "Pyzmq provides Zero message queue access for the Python language"
-HOMEPAGE = "http://zeromq.org/bindings:python"
-LICENSE = "BSD & LGPL-3.0"
-LIC_FILES_CHKSUM = "file://COPYING.BSD;md5=11c65680f637c3df7f58bbc8d133e96e \
- file://COPYING.LESSER;md5=12c592fa0bcfff3fb0977b066e9cb69e"
-DEPENDS = "zeromq"
-
-FILESEXTRAPATHS_prepend := "${THISDIR}/python-pyzmq:"
-
-SRC_URI += "file://club-rpath-out.patch"
-SRC_URI[md5sum] = "aecdfc328193fbd81f6dc23228319943"
-SRC_URI[sha256sum] = "2199f753a230e26aec5238b0518b036780708a4c887d4944519681a920b9dee4"
-
-inherit pypi pkgconfig
-
-RDEPENDS_${PN} += "${PYTHON_PN}-multiprocessing"
-
-FILES_${PN}-dbg =+ "${PYTHON_SITEPACKAGES_DIR}/zmq/backend/cython/.debug"
-
-do_compile_prepend() {
- echo [global] > ${S}/setup.cfg
- echo zmq_prefix = ${STAGING_DIR_HOST} >> ${S}/setup.cfg
- echo have_sys_un_h = True >> ${S}/setup.cfg
- echo skip_check_zmq = True >> ${S}/setup.cfg
- echo libzmq_extension = False >> ${S}/setup.cfg
- echo no_libzmq_extension = True >> ${S}/setup.cfg
-}
diff --git a/meta-python/recipes-devtools/python/python-pyzmq/club-rpath-out.patch b/meta-python/recipes-devtools/python/python-pyzmq/club-rpath-out.patch
deleted file mode 100644
index 936f165850..0000000000
--- a/meta-python/recipes-devtools/python/python-pyzmq/club-rpath-out.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/setup.py b/setup.py
-index d243eaa..98099bc 100755
---- a/setup.py
-+++ b/setup.py
-@@ -192,8 +192,6 @@ def _add_rpath(settings, path):
- """
- if sys.platform == 'darwin':
- settings['extra_link_args'].extend(['-Wl,-rpath','-Wl,%s' % path])
-- else:
-- settings['runtime_library_dirs'].append(path)
-
- def settings_from_prefix(prefix=None, bundle_libzmq_dylib=False):
- """load appropriate library/include settings from ZMQ prefix"""
diff --git a/meta-python/recipes-devtools/python/python-pyzmq_17.1.0.bb b/meta-python/recipes-devtools/python/python-pyzmq_17.1.0.bb
deleted file mode 100644
index b690106bbb..0000000000
--- a/meta-python/recipes-devtools/python/python-pyzmq_17.1.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-pyzmq.inc
-inherit setuptools
diff --git a/meta-python/recipes-devtools/python/python-raven.inc b/meta-python/recipes-devtools/python/python-raven.inc
deleted file mode 100644
index 1c65e11767..0000000000
--- a/meta-python/recipes-devtools/python/python-raven.inc
+++ /dev/null
@@ -1,13 +0,0 @@
-SUMMARY = "Raven is the legacy Python client for Sentry (getsentry.com)"
-DESCRIPTION = "\
-Raven is the official legacy Python client for Sentry, officially \
-supports Python 2.6–2.7 & 3.3–3.7, and runs on PyPy and Google App Engine."
-HOMEPAGE = "https://github.com/getsentry/raven-python"
-LICENSE = "BSD-3-Clause"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=b9a4414e08f0571d55184531cefc131b"
-
-SRC_URI[md5sum] = "3676f31dadfa61526444dd0245c78a38"
-SRC_URI[sha256sum] = "3fa6de6efa2493a7c827472e984ce9b020797d0da16f1db67197bcc23c8fae54"
-
-PYPI_PACKAGE = "raven"
-inherit pypi
diff --git a/meta-python/recipes-devtools/python/python-rdflib.inc b/meta-python/recipes-devtools/python/python-rdflib.inc
deleted file mode 100644
index 0eac197888..0000000000
--- a/meta-python/recipes-devtools/python/python-rdflib.inc
+++ /dev/null
@@ -1,15 +0,0 @@
-SUMMARY = "RDFLib is a pure Python package for working with RDF"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=68c1a3bb687bd63b8e5552f3ea249840"
-
-SRC_URI[md5sum] = "534fe35b13c5857d53fa1ac5a41eca67"
-SRC_URI[sha256sum] = "da1df14552555c5c7715d8ce71c08f404c988c58a1ecd38552d0da4fc261280d"
-
-inherit pypi
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-isodate \
- ${PYTHON_PN}-pyparsing \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-rdflib_4.2.2.bb b/meta-python/recipes-devtools/python/python-rdflib_4.2.2.bb
deleted file mode 100644
index 7ed0f5f9a0..0000000000
--- a/meta-python/recipes-devtools/python/python-rdflib_4.2.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-rdflib.inc
diff --git a/meta-python/recipes-devtools/python/python-redis.inc b/meta-python/recipes-devtools/python/python-redis.inc
deleted file mode 100644
index 1a65d73144..0000000000
--- a/meta-python/recipes-devtools/python/python-redis.inc
+++ /dev/null
@@ -1,12 +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] = "048348d8cfe0b5d0bba2f4d835005c3b"
-SRC_URI[sha256sum] = "a22ca993cea2962dbb588f9f30d0015ac4afcc45bee27d3978c0dbe9e97c6c0f"
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-datetime \
-"
diff --git a/meta-python/recipes-devtools/python/python-redis_2.10.6.bb b/meta-python/recipes-devtools/python/python-redis_2.10.6.bb
deleted file mode 100644
index 6c3ca8516c..0000000000
--- a/meta-python/recipes-devtools/python/python-redis_2.10.6.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-redis.inc
diff --git a/meta-python/recipes-devtools/python/python-requests-oauthlib.inc b/meta-python/recipes-devtools/python/python-requests-oauthlib.inc
deleted file mode 100644
index 4bc6a368c0..0000000000
--- a/meta-python/recipes-devtools/python/python-requests-oauthlib.inc
+++ /dev/null
@@ -1,7 +0,0 @@
-LICENSE = "ISC"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=22d117a849df10d047ed9b792838e863"
-
-SRC_URI[md5sum] = "4358a879a4377393bcfd37d0f9ae6d4d"
-SRC_URI[sha256sum] = "883ac416757eada6d3d07054ec7092ac21c7f35cb1d2cf82faf205637081f468"
-
-RDEPENDS_${PN} += "${PYTHON_PN}-requests"
diff --git a/meta-python/recipes-devtools/python/python-requests-oauthlib_0.8.0.bb b/meta-python/recipes-devtools/python/python-requests-oauthlib_0.8.0.bb
deleted file mode 100644
index 43189150ab..0000000000
--- a/meta-python/recipes-devtools/python/python-requests-oauthlib_0.8.0.bb
+++ /dev/null
@@ -1,3 +0,0 @@
-require python-requests-oauthlib.inc
-inherit pypi setuptools
-
diff --git a/meta-python/recipes-devtools/python/python-requests.inc b/meta-python/recipes-devtools/python/python-requests.inc
deleted file mode 100644
index 5fe5dc21f9..0000000000
--- a/meta-python/recipes-devtools/python/python-requests.inc
+++ /dev/null
@@ -1,28 +0,0 @@
-DESCRIPTION = "Python HTTP for Humans."
-HOMEPAGE = "http://python-requests.org"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=a8d5a1d1c2d53025e2282c511033f6f7"
-
-FILESEXTRAPATHS_prepend := "${THISDIR}/python-requests:"
-
-SRC_URI[md5sum] = "ee28bee2de76e9198fc41e48f3a7dd47"
-SRC_URI[sha256sum] = "11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4"
-
-inherit pypi
-
-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/python-requests_2.22.0.bb b/meta-python/recipes-devtools/python/python-requests_2.22.0.bb
deleted file mode 100644
index 0d7a29f745..0000000000
--- a/meta-python/recipes-devtools/python/python-requests_2.22.0.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-inherit setuptools
-require python-requests.inc
-
-RDEPENDS_${PN} += "${PYTHON_PN}-zlib"
diff --git a/meta-python/recipes-devtools/python/python-rfc3987.inc b/meta-python/recipes-devtools/python/python-rfc3987.inc
deleted file mode 100644
index 9cfa07da55..0000000000
--- a/meta-python/recipes-devtools/python/python-rfc3987.inc
+++ /dev/null
@@ -1,8 +0,0 @@
-SUMMARY = "Parsing and validation of URIs (RFC 3986) and IRIs (RFC 3987)"
-LICENSE = "GPLv3+"
-LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=9;md5=2b723edf67b2f3088bc5e339b1ceda2d"
-
-SRC_URI[md5sum] = "b6c4028acdc788a9ba697e1c1d6b896c"
-SRC_URI[sha256sum] = "d3c4d257a560d544e9826b38bc81db676890c79ab9d7ac92b39c7a253d5ca733"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-rfc3987_1.3.8.bb b/meta-python/recipes-devtools/python/python-rfc3987_1.3.8.bb
deleted file mode 100644
index dcda5aa46e..0000000000
--- a/meta-python/recipes-devtools/python/python-rfc3987_1.3.8.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-rfc3987.inc
diff --git a/meta-python/recipes-devtools/python/python-robotframework-seriallibrary.inc b/meta-python/recipes-devtools/python/python-robotframework-seriallibrary.inc
deleted file mode 100644
index bfcb023a2f..0000000000
--- a/meta-python/recipes-devtools/python/python-robotframework-seriallibrary.inc
+++ /dev/null
@@ -1,15 +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"
-
-SRC_URI = "https://files.pythonhosted.org/packages/ce/e1/1e337dc84a20b9d92d7b243d16bb9f6fc0084967eca7454228bb546efec7/robotframework-seriallibrary-0.3.1.tar.gz"
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-pyserial \
- ${PYTHON_PN}-robotframework \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-robotframework-seriallibrary_0.3.1.bb b/meta-python/recipes-devtools/python/python-robotframework-seriallibrary_0.3.1.bb
deleted file mode 100644
index 440f69cbf7..0000000000
--- a/meta-python/recipes-devtools/python/python-robotframework-seriallibrary_0.3.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-robotframework-seriallibrary.inc
diff --git a/meta-python/recipes-devtools/python/python-robotframework_3.0.4.bb b/meta-python/recipes-devtools/python/python-robotframework_3.0.4.bb
deleted file mode 100644
index ff7dedb559..0000000000
--- a/meta-python/recipes-devtools/python/python-robotframework_3.0.4.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-inherit setuptools
-require python-robotframework.inc
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-zlib \
-"
diff --git a/meta-python/recipes-devtools/python/python-scrypt.inc b/meta-python/recipes-devtools/python/python-scrypt.inc
deleted file mode 100644
index aff86a594f..0000000000
--- a/meta-python/recipes-devtools/python/python-scrypt.inc
+++ /dev/null
@@ -1,16 +0,0 @@
-DESCRIPTION = "Bindings for the scrypt key derivation function library"
-LICENSE = "BSD-2-Clause"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=168ff75417f75a83e63c8875292d44dc"
-HOMEPAGE="https://bitbucket.org/mhallin/py-scrypt/overview"
-
-FILESEXTRAPATHS_prepend := "${THISDIR}/python-scrypt:"
-
-SRC_URI += "file://0001-py-scrypt-remove-the-hard-coded-include-paths.patch"
-
-SRC_URI[md5sum] = "ae8e3263aa31b040c1f9c7f1e1843a56"
-SRC_URI[sha256sum] = "f8239b2d47fa1d40bc27efd231dc7083695d10c1c2ac51a99380360741e0362d"
-
-inherit pypi
-
-RDEPENDS_${PN}_class-target += "\
-"
diff --git a/meta-python/recipes-devtools/python/python-scrypt_0.8.6.bb b/meta-python/recipes-devtools/python/python-scrypt_0.8.6.bb
deleted file mode 100644
index 9fbd00e049..0000000000
--- a/meta-python/recipes-devtools/python/python-scrypt_0.8.6.bb
+++ /dev/null
@@ -1,3 +0,0 @@
-inherit setuptools python-dir
-require python-scrypt.inc
-
diff --git a/meta-python/recipes-devtools/python/python-sdnotify.inc b/meta-python/recipes-devtools/python/python-sdnotify.inc
deleted file mode 100644
index ea0e575c47..0000000000
--- a/meta-python/recipes-devtools/python/python-sdnotify.inc
+++ /dev/null
@@ -1,16 +0,0 @@
-HOMEPAGE = "https://github.com/bb4242/sdnotify"
-SUMMARY = "A pure Python implementation of systemd's service notification protocol (sd_notify)"
-
-DESCRIPTION = "\
- sdnotify is a pure Python implementation of the systemd sd_notify protocol. \
- This protocol can be used to inform systemd about service start-up completion, \
- watchdog events, and other service status changes. \
- Thus, this package can be used to write system services in Python that play nicely with systemd. \
- "
-
-SECTION = "devel/python"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=cc572ccc4b18a4b7d13be5d01bc8213e"
-
-SRC_URI[md5sum] = "749ddca1c70be1697fecc443fb1fdb16"
-SRC_URI[sha256sum] = "73977fc746b36cc41184dd43c3fe81323e7b8b06c2bb0826c4f59a20c56bb9f1"
diff --git a/meta-python/recipes-devtools/python/python-sdnotify_0.3.2.bb b/meta-python/recipes-devtools/python/python-sdnotify_0.3.2.bb
deleted file mode 100644
index 39ae3fb0bd..0000000000
--- a/meta-python/recipes-devtools/python/python-sdnotify_0.3.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools pypi
-require python-sdnotify.inc
diff --git a/meta-python/recipes-devtools/python/python-selectors34_1.2.bb b/meta-python/recipes-devtools/python/python-selectors34_1.2.bb
deleted file mode 100644
index 69545ebbbc..0000000000
--- a/meta-python/recipes-devtools/python/python-selectors34_1.2.bb
+++ /dev/null
@@ -1,12 +0,0 @@
-SUMMARY = "Backport of the selectors module from Python 3.4"
-LICENSE = "PSF"
-LIC_FILES_CHKSUM = "file://PKG-INFO;md5=2fae0222c31d6c10488d4ab93a863af7"
-
-SRC_URI[md5sum] = "bc855a1c8839a811476c019dc07d92dd"
-SRC_URI[sha256sum] = "09f5066337f8a76fb5233f267873f89a27a17c10bf79575954894bb71686451c"
-
-inherit pypi setuptools
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-six \
- "
diff --git a/meta-python/recipes-devtools/python/python-semver.inc b/meta-python/recipes-devtools/python/python-semver.inc
deleted file mode 100644
index 3c95c06eaf..0000000000
--- a/meta-python/recipes-devtools/python/python-semver.inc
+++ /dev/null
@@ -1,12 +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] = "dc579ba9d0bb2137bad5324d4bdb7e40"
-SRC_URI[sha256sum] = "5b09010a66d9a3837211bb7ae5a20d10ba88f8cb49e92cb139a69ef90d5060d8"
-
-inherit pypi
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-semver_2.8.1.bb b/meta-python/recipes-devtools/python/python-semver_2.8.1.bb
deleted file mode 100644
index 0572feb31b..0000000000
--- a/meta-python/recipes-devtools/python/python-semver_2.8.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-semver.inc
diff --git a/meta-python/recipes-devtools/python/python-sentry-sdk.inc b/meta-python/recipes-devtools/python/python-sentry-sdk.inc
deleted file mode 100644
index 0c123cef48..0000000000
--- a/meta-python/recipes-devtools/python/python-sentry-sdk.inc
+++ /dev/null
@@ -1,12 +0,0 @@
-SUMMARY = "The new Python SDK for Sentry.io"
-DESCRIPTION = "This is the next line of the Python SDK \
-for Sentry, intended to replace the raven package on PyPI."
-HOMEPAGE = "https://github.com/getsentry/sentry-python"
-LICENSE = "BSD-2-Clause"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=0c79f8d3c91fc847350efd28bfe0a341"
-
-SRC_URI[md5sum] = "fef016d075137c4fb8724559cad28b86"
-SRC_URI[sha256sum] = "5818289868755cfea74e61e532b4b0d11d523901041338d473277db91d4d8173"
-
-PYPI_PACKAGE = "sentry-sdk"
-inherit pypi
diff --git a/meta-python/recipes-devtools/python/python-serpent.inc b/meta-python/recipes-devtools/python/python-serpent.inc
deleted file mode 100644
index 2ba65706ba..0000000000
--- a/meta-python/recipes-devtools/python/python-serpent.inc
+++ /dev/null
@@ -1,13 +0,0 @@
-SUMMARY = "Serialization based on ast.literal_eval"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://PKG-INFO;md5=5a8193ba89f1083617f32d522f6485e9"
-
-SRC_URI[md5sum] = "0f9684622125a527fa4fbe2587738973"
-SRC_URI[sha256sum] = "264a028e059c1b557701ae7c567cdab330dbd228ff924489343efcb39bd828a0"
-
-inherit pypi
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-netclient \
- ${PYTHON_PN}-numbers \
- "
diff --git a/meta-python/recipes-devtools/python/python-serpent_1.25.bb b/meta-python/recipes-devtools/python/python-serpent_1.25.bb
deleted file mode 100644
index 0db3cf98aa..0000000000
--- a/meta-python/recipes-devtools/python/python-serpent_1.25.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-serpent.inc
diff --git a/meta-python/recipes-devtools/python/python-setuptools-scm.inc b/meta-python/recipes-devtools/python/python-setuptools-scm.inc
deleted file mode 100644
index 98883ec393..0000000000
--- a/meta-python/recipes-devtools/python/python-setuptools-scm.inc
+++ /dev/null
@@ -1,14 +0,0 @@
-SUMMARY = "the blessed package to manage your versions by scm tags"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=8227180126797a0148f94f483f3e1489"
-
-SRC_URI[md5sum] = "cfec5d2dbbd0a85c40066f79035b5878"
-SRC_URI[sha256sum] = "a767141fecdab1c0b3c8e4c788ac912d7c94a0d6c452d40777ba84f918316379"
-
-PYPI_PACKAGE = "setuptools_scm"
-inherit pypi
-
-RDEPENDS_${PN}_class-target = "${PYTHON_PN}-py ${PYTHON_PN}-setuptools ${PYTHON_PN}-debugger ${PYTHON_PN}-json"
-RDEPENDS_${PN}_class-native = "${PYTHON_PN}-setuptools-native"
-
-BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python-setuptools-scm_2.1.0.bb b/meta-python/recipes-devtools/python/python-setuptools-scm_2.1.0.bb
deleted file mode 100644
index 64b36e3a01..0000000000
--- a/meta-python/recipes-devtools/python/python-setuptools-scm_2.1.0.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-inherit setuptools
-require python-setuptools-scm.inc
-
-RDEPENDS_${PN} += "${PYTHON_PN}-argparse"
diff --git a/meta-python/recipes-devtools/python/python-sh.inc b/meta-python/recipes-devtools/python/python-sh.inc
deleted file mode 100644
index f2fd562bb5..0000000000
--- a/meta-python/recipes-devtools/python/python-sh.inc
+++ /dev/null
@@ -1,32 +0,0 @@
-SUMMARY = "Python subprocess replacement"
-HOMEPAGE = "https://github.com/amoffat/sh"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=5317094292296f03405f59ae5f6544b6"
-
-SRC_URI[md5sum] = "a8351aef25d25f707c17e0a7a6280251"
-SRC_URI[sha256sum] = "b52bf5833ed01c7b5c5fb73a7f71b3d98d48e9b9b8764236237bdc7ecae850fc"
-
-PYPI_PACKAGE = "sh"
-
-inherit pypi
-
-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}-tests \
- ${PYTHON_PN}-threading \
- ${PYTHON_PN}-unixadmin \
-"
-
-# WARNING: We were unable to map the following python package/module
-# dependencies to the bitbake packages which include them:
-# coverage - only used in test and there is a check to see if it is
-# available before importing.
-# queue - part of threading
-# signal - part of core in python3. not sure how it is imported in python2.
-# No complants in compiling.
diff --git a/meta-python/recipes-devtools/python/python-sh_1.12.14.bb b/meta-python/recipes-devtools/python/python-sh_1.12.14.bb
deleted file mode 100644
index 7cb5140d2d..0000000000
--- a/meta-python/recipes-devtools/python/python-sh_1.12.14.bb
+++ /dev/null
@@ -1,8 +0,0 @@
-require python-sh.inc
-inherit setuptools
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-contextlib \
- ${PYTHON_PN}-lang \
- ${PYTHON_PN}-textutils \
-"
diff --git a/meta-python/recipes-devtools/python/python-sijax.inc b/meta-python/recipes-devtools/python/python-sijax.inc
deleted file mode 100644
index 9e46893d85..0000000000
--- a/meta-python/recipes-devtools/python/python-sijax.inc
+++ /dev/null
@@ -1,8 +0,0 @@
-DESCRIPTION = "An easy to use AJAX library for Python based on jQuery.ajax"
-HOMEPAGE = "https://github.com/spantaleev/sijax-python"
-LICENSE = "BSD-3-Clause"
-
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=16e213d75641a392478df50cf0841903"
-
-PYPI_PACKAGE = "Sijax"
-inherit pypi \ No newline at end of file
diff --git a/meta-python/recipes-devtools/python/python-sijax_0.3.2.bb b/meta-python/recipes-devtools/python/python-sijax_0.3.2.bb
deleted file mode 100644
index 4226c42355..0000000000
--- a/meta-python/recipes-devtools/python/python-sijax_0.3.2.bb
+++ /dev/null
@@ -1,11 +0,0 @@
-DESCRIPTION = "An easy to use AJAX library for Python based on jQuery.ajax"
-HOMEPAGE = "https://github.com/spantaleev/sijax-python"
-LICENSE = "BSD-3-Clause"
-
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=16e213d75641a392478df50cf0841903"
-
-PYPI_PACKAGE = "Sijax"
-inherit setuptools
-require python-sijax.inc
-
-SRC_URI[sha256sum] = "11b062f4a8b2aad95c87e7c09e5daf5a6b0d0f08abf9efe5f91a0075c6be7c0d" \ No newline at end of file
diff --git a/meta-python/recipes-devtools/python/python-simplejson_3.16.0.bb b/meta-python/recipes-devtools/python/python-simplejson_3.16.0.bb
deleted file mode 100644
index 24ad9a9608..0000000000
--- a/meta-python/recipes-devtools/python/python-simplejson_3.16.0.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-inherit setuptools
-require python-simplejson.inc
-
-RDEPENDS_${PN} += "${PYTHON_PN}-re"
diff --git a/meta-python/recipes-devtools/python/python-singledispatch_3.4.0.3.bb b/meta-python/recipes-devtools/python/python-singledispatch_3.4.0.3.bb
deleted file mode 100644
index 44c9505b33..0000000000
--- a/meta-python/recipes-devtools/python/python-singledispatch_3.4.0.3.bb
+++ /dev/null
@@ -1,12 +0,0 @@
-SUMMARY = "functools.singledispatch from Python 3.4"
-DESCRIPTION = "PEP 443 proposed to expose a mechanism in the functools standard library module \
-in Python 3.4 that provides a simple form of generic programming known as single-dispatch \
-generic functions. This library is a backport of this functionality to Python 2.6 - 3.3"
-
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://README.rst;md5=ee3cd67264adc7eb07981f3644dc17dc"
-
-SRC_URI[md5sum] = "af2fc6a3d6cc5a02d0bf54d909785fcb"
-SRC_URI[sha256sum] = "5b06af87df13818d14f08a028e42f566640aef80805c3b50c5056b086e3c2b9c"
-
-inherit pypi setuptools
diff --git a/meta-python/recipes-devtools/python/python-slip-dbus.inc b/meta-python/recipes-devtools/python/python-slip-dbus.inc
deleted file mode 100644
index 0933b45593..0000000000
--- a/meta-python/recipes-devtools/python/python-slip-dbus.inc
+++ /dev/null
@@ -1,29 +0,0 @@
-SUMMARY = "Convenience functions for dbus services in Python 2.x"
-HOMEPAGE = "https://github.com/nphilipp/python-slip"
-DESCRIPTION = "\
-The Simple Library for Python 2.x packages contain miscellaneous code for \
-convenience, extension and workaround purposes. \
-\
-This package provides slip.dbus.service.Object, which is a dbus.service.Object \
-derivative that ends itself after a certain time without being used and/or if \
-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+"
-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[sha256sum] = "c726c086f0dd93a0ac7a0176f383a12af91b6657b78a301e3f5b25d9f8d4d10b"
-
-do_compile_prepend() {
- sed -e 's/@VERSION@/${PV}/g' setup.py.in > setup.py
-}
-
-# http://errors.yoctoproject.org/Errors/Details/184713/
-# python-native/python: can't open file 'setup.py': [Errno 2] No such file or directory
-CLEANBROKEN = "1"
diff --git a/meta-python/recipes-devtools/python/python-slip-dbus_0.6.5.bb b/meta-python/recipes-devtools/python/python-slip-dbus_0.6.5.bb
deleted file mode 100644
index 330fa1ba41..0000000000
--- a/meta-python/recipes-devtools/python/python-slip-dbus_0.6.5.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-slip-dbus.inc
diff --git a/meta-python/recipes-devtools/python/python-smbus.inc b/meta-python/recipes-devtools/python/python-smbus.inc
deleted file mode 100644
index f472a57f43..0000000000
--- a/meta-python/recipes-devtools/python/python-smbus.inc
+++ /dev/null
@@ -1,12 +0,0 @@
-SUMMARY = "Set of i2c tools for linux - Python module"
-LICENSE = "GPLv2"
-LIC_FILES_CHKSUM = "file://smbusmodule.c;beginline=1;endline=17;md5=fa24df321a520ff8e10f203425ab9fa8"
-PR = "r1"
-
-SRC_URI = "${KERNELORG_MIRROR}/software/utils/i2c-tools/i2c-tools-${PV}.tar.gz "
-SRC_URI[md5sum] = "d92a288d70f306d3895e3a7e9c14c9aa"
-SRC_URI[sha256sum] = "5b60daf6f011de0acb61de57dba62f2054bb39f19961d67e0c91610f071ca403"
-
-DEPENDS += "i2c-tools"
-
-S = "${WORKDIR}/i2c-tools-${PV}/py-smbus/"
diff --git a/meta-python/recipes-devtools/python/python-smbus_4.0.bb b/meta-python/recipes-devtools/python/python-smbus_4.0.bb
deleted file mode 100644
index 1b95778877..0000000000
--- a/meta-python/recipes-devtools/python/python-smbus_4.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit distutils
-require python-smbus.inc
diff --git a/meta-python/recipes-devtools/python/python-snakefood_1.4.bb b/meta-python/recipes-devtools/python/python-snakefood_1.4.bb
deleted file mode 100644
index e4a6d767dc..0000000000
--- a/meta-python/recipes-devtools/python/python-snakefood_1.4.bb
+++ /dev/null
@@ -1,51 +0,0 @@
-SUMMARY = "Dependency graphing for Python"
-DESCRIPTION = " Generate dependency graphs from Python code. This \
-dependency tracker package has a few distinguishing characteristics \
-\
- * It uses the AST to parse the Python files. This is very reliable, \
- it always runs.\
- * No module is loaded. Loading modules to figure out dependencies is \
- almost always problem, because a lot of codebases run initialization \
- code in the global namespace, which often requires additional setup. \
- Snakefood is guaranteed not to have this problem (it just runs, no \
- matter what).\
- * It works on a set of files, i.e. you do not have to specify a single \
- script, you can select a directory (package or else) or a set of files.\
- It finds all the Python files recursively automatically.\
- * Automatic/no configuration: your PYTHONPATH is automatically adjusted \
- to include the required package roots. It figures out the paths that \
- are required from the files/directories given as input. You should not \
- have to setup ANYTHING.\
- * It does not have to automatically 'follow' dependencies between modules,\
- i.e. by default it only considers the files and directories you specify \
- on the command-line and their immediate dependencies. It also has an \
- option to automatically include only the dependencies within the \
- packages of the files you specify.\
- * It follows the UNIX philosophy of small programs that do one thing well:\
- it consists of a few simple programs whose outputs you combine via \
- pipes. Graphing dependencies always requires the user to filter and \
- cluster the filenames, so this is appropriate. You can combine it with \
- your favourite tools, grep, sed, etc.\
-\
-A problem with dependency trackers that run code is that they are unreliable, \
-due to the dynamic nature of Python (the presence of imports within function \
-calls and __import__ hooks makes it almost impossible to always do the right \
-thing). This script aims at being right 99% of the time, and we think that \
-given the trade-offs, 99% is good enough for 99% of the uses.\
-"
-AUTHOR = "Martin Blais <blais@furius.ca>"
-HOMEPAGE = "http://furius.ca/snakefood"
-LICENSE = "GPL-2.0"
-LIC_FILES_CHKSUM = "file://COPYING;md5=94d55d512a9ba36caa9b7df079bae19f"
-
-SRC_URI[md5sum] = "56c88667a33d8909b0aabf2ab6903bdf"
-SRC_URI[sha256sum] = "295784668032254e7391ca99ba7060edd3ae4eca1a330ac11627b18ab5923b77"
-
-inherit pypi setuptools
-
-RDEPENDS_${PN} = " python-logging python-compiler python-shell"
-# the above modules do not have a -native counterpart
-RDEPENDS_${PN}_class-native = ""
-
-BBCLASSEXTEND = "native"
-
diff --git a/meta-python/recipes-devtools/python/python-snimpy_0.8.12.bb b/meta-python/recipes-devtools/python/python-snimpy_0.8.12.bb
deleted file mode 100644
index c5af48dd3c..0000000000
--- a/meta-python/recipes-devtools/python/python-snimpy_0.8.12.bb
+++ /dev/null
@@ -1,20 +0,0 @@
-SUMMARY = "Interactive SNMP tool"
-DESCRIPTION = "Snimpy is a Python-based tool providing a simple interface to build SNMP query"
-HOMEPAGE = "https://pypi.python.org/pypi/snimpy"
-SECTION = "devel/python"
-
-DEPENDS += "libsmi python-cffi-native python-vcversioner-native"
-
-LICENSE = "ISC"
-LIC_FILES_CHKSUM = "file://docs/license.rst;md5=7c53ab2d1240828625c3e093d049d4f4"
-
-SRC_URI[md5sum] = "6d016b6356db432e6a87ad708eb8fcb6"
-SRC_URI[sha256sum] = "04efcfba867ffb0e10cc8d7f93a553ceb6bdf2ee34e49762749028a2c76096c1"
-
-inherit pypi setuptools
-
-RDEPENDS_${PN} = "python-cffi \
- python-pycparser \
- python-pysnmp \
- python-setuptools \
-"
diff --git a/meta-python/recipes-devtools/python/python-socketio.inc b/meta-python/recipes-devtools/python/python-socketio.inc
deleted file mode 100644
index 7ee99f8d99..0000000000
--- a/meta-python/recipes-devtools/python/python-socketio.inc
+++ /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
-
-PYPI_PACKAGE = "python-socketio"
-
-SRC_URI[md5sum] = "86cd47dddea1785ce7a6c72f55c93fe7"
-SRC_URI[sha256sum] = "506b2cf7a520b40ea0b3f25e1272eff8de134dce6f471c1f6bc0de8c90fe8c57"
-
-PACKAGECONFIG ?= ""
-PACKAGECONFIG[asyncio_client] = ",,,${PYTHON_PN}-aiohttp ${PYTHON_PN}-websockets"
-PACKAGECONFIG[client] = ",,,${PYTHON_PN}-requests ${PYTHON_PN}-websocket-client"
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-engineio \
- ${PYTHON_PN}-logging \
- ${PYTHON_PN}-math \
- ${PYTHON_PN}-pickle \
- ${PYTHON_PN}-json \
- ${PYTHON_PN}-threading \
- ${PYTHON_PN}-six \
- ${PYTHON_PN}-attrs \
- "
diff --git a/meta-python/recipes-devtools/python/python-socketio_4.3.1.bb b/meta-python/recipes-devtools/python/python-socketio_4.3.1.bb
deleted file mode 100644
index e25a6b368b..0000000000
--- a/meta-python/recipes-devtools/python/python-socketio_4.3.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-socketio.inc
diff --git a/meta-python/recipes-devtools/python/python-sparts_0.7.3.bb b/meta-python/recipes-devtools/python/python-sparts_0.7.3.bb
deleted file mode 100644
index a1253112c8..0000000000
--- a/meta-python/recipes-devtools/python/python-sparts_0.7.3.bb
+++ /dev/null
@@ -1,22 +0,0 @@
-SUMMARY = "Library for rapid service prototyping with minimal boilerplate"
-LICENSE = "BSD-3-Clause"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=0c1554636a564da3baf037ac652fc831"
-
-SRC_URI[md5sum] = "6aa8815652c6f5e5e8e5b2ac1813dd87"
-SRC_URI[sha256sum] = "b25707c349079a7c888155e7fdfd8394df2da9aca9c8eee4e205528cb16b7662"
-
-inherit pypi setuptools
-
-RDEPENDS_${PN} = "\
- python-subprocess \
- python-six \
- python-argparse \
- python-re \
- python-shell \
- python-threading \
- python-logging \
- python-unixadmin \
- python-distutils \
- python-daemonize \
- python-futures \
-"
diff --git a/meta-python/recipes-devtools/python/python-speaklater.inc b/meta-python/recipes-devtools/python/python-speaklater.inc
deleted file mode 100644
index 94fa8a6c0f..0000000000
--- a/meta-python/recipes-devtools/python/python-speaklater.inc
+++ /dev/null
@@ -1,9 +0,0 @@
-DESCRIPTION = "Media asset management for Python, with glue code for various frameworks"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=b810770075a29bf44b96607440e7c801"
-
-SRC_URI[md5sum] = "e8d5dbe36e53d5a35cff227e795e8bbf"
-SRC_URI[sha256sum] = "59fea336d0eed38c1f0bf3181ee1222d0ef45f3a9dd34ebe65e6bfffdd6a65a9"
-
-PYPI_PACKAGE = "speaklater"
-
diff --git a/meta-python/recipes-devtools/python/python-speaklater_1.3.bb b/meta-python/recipes-devtools/python/python-speaklater_1.3.bb
deleted file mode 100644
index 56fd55577d..0000000000
--- a/meta-python/recipes-devtools/python/python-speaklater_1.3.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-speaklater.inc
diff --git a/meta-python/recipes-devtools/python/python-sqlalchemy.inc b/meta-python/recipes-devtools/python/python-sqlalchemy.inc
deleted file mode 100644
index 0c191ae7d5..0000000000
--- a/meta-python/recipes-devtools/python/python-sqlalchemy.inc
+++ /dev/null
@@ -1,20 +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=b1c412c9d8d1ce018f7a9374407c22bb"
-
-PYPI_PACKAGE = "SQLAlchemy"
-inherit pypi
-
-SRC_URI[md5sum] = "03db1c8f8ae911977c0bf3950a4c9c21"
-SRC_URI[sha256sum] = "6b55ec379c11ad696f9371ce8e0de93c7f21134323f56a56a1b0d8fbef17013c"
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-json \
- ${PYTHON_PN}-pickle \
- ${PYTHON_PN}-logging \
- ${PYTHON_PN}-netclient \
- ${PYTHON_PN}-numbers \
- ${PYTHON_PN}-threading \
-"
diff --git a/meta-python/recipes-devtools/python/python-sqlalchemy_1.1.17.bb b/meta-python/recipes-devtools/python/python-sqlalchemy_1.1.17.bb
deleted file mode 100644
index 53c8fecf70..0000000000
--- a/meta-python/recipes-devtools/python/python-sqlalchemy_1.1.17.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-sqlalchemy.inc
diff --git a/meta-python/recipes-devtools/python/python-statistics_1.0.3.5.bb b/meta-python/recipes-devtools/python/python-statistics_1.0.3.5.bb
deleted file mode 100644
index ee3b822a77..0000000000
--- a/meta-python/recipes-devtools/python/python-statistics_1.0.3.5.bb
+++ /dev/null
@@ -1,15 +0,0 @@
-SUMMARY = "A port of Python 3.4 statistics module to Python 2.x"
-DESCRIPTION = " \
-A port of Python 3.4 statistics module to Python 2.*, initially done \
-through the 3to2 tool. This module provides functions for calculating \
-mathematical statistics of numeric (Real-valued) data. \
-"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://statistics/__init__.py;beginline=6;endline=16;md5=b76960ee777a1529f60db47ada2a8e6e"
-
-SRC_URI[md5sum] = "d6d97f3a1a7b3192cff99e0f2b5956c3"
-SRC_URI[sha256sum] = "2dc379b80b07bf2ddd5488cad06b2b9531da4dd31edb04dc9ec0dc226486c138"
-
-inherit pypi setuptools
-
-PYPI_PACKAGE = "statistics"
diff --git a/meta-python/recipes-devtools/python/python-stevedore.inc b/meta-python/recipes-devtools/python/python-stevedore.inc
deleted file mode 100644
index 5aa9fb424c..0000000000
--- a/meta-python/recipes-devtools/python/python-stevedore.inc
+++ /dev/null
@@ -1,15 +0,0 @@
-DESCRIPTION = "Manage dynamic plugins for Python applications"
-HOMEPAGE = "https://github.com/dreamhost/stevedore"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
-
-SRC_URI[md5sum] = "42fa2bf0251c96b543765c5ce13f37c9"
-SRC_URI[sha256sum] = "e0739f9739a681c7a1fda76a102b65295e96a144ccdb552f2ae03c5f0abe8a14"
-
-inherit pypi
-
-DEPENDS += "${PYTHON_PN}-pbr-native"
-
-RDEPENDS_${PN} += "${PYTHON_PN}-pbr ${PYTHON_PN}-six"
-
-BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python-stevedore_1.31.0.bb b/meta-python/recipes-devtools/python/python-stevedore_1.31.0.bb
deleted file mode 100644
index 70a00c1315..0000000000
--- a/meta-python/recipes-devtools/python/python-stevedore_1.31.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-stevedore.inc
diff --git a/meta-python/recipes-devtools/python/python-strict-rfc3339.inc b/meta-python/recipes-devtools/python/python-strict-rfc3339.inc
deleted file mode 100644
index dca9ea93ea..0000000000
--- a/meta-python/recipes-devtools/python/python-strict-rfc3339.inc
+++ /dev/null
@@ -1,8 +0,0 @@
-SUMMARY = "Strict, simple, lightweight RFC3339 function.s"
-LICENSE = "GPLv3"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=8f0e2cd40e05189ec81232da84bd6e1a"
-
-SRC_URI[md5sum] = "4d9b635b4df885bc37bc1189d66c9abc"
-SRC_URI[sha256sum] = "5cad17bedfc3af57b399db0fed32771f18fc54bbd917e85546088607ac5e1277"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-strict-rfc3339_0.7.bb b/meta-python/recipes-devtools/python/python-strict-rfc3339_0.7.bb
deleted file mode 100644
index b01ea99a3f..0000000000
--- a/meta-python/recipes-devtools/python/python-strict-rfc3339_0.7.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-strict-rfc3339.inc
diff --git a/meta-python/recipes-devtools/python/python-subprocess32_3.2.7.bb b/meta-python/recipes-devtools/python/python-subprocess32_3.2.7.bb
deleted file mode 100644
index f43706923a..0000000000
--- a/meta-python/recipes-devtools/python/python-subprocess32_3.2.7.bb
+++ /dev/null
@@ -1,15 +0,0 @@
-SUMMARY = "A backport of the subprocess module from Python 3.2 for use on 2.x"
-DESCRIPTION = "This is a backport of the subprocess standard library module \
-from Python 3.2 - 3.5 for use on Python 2. It includes bugfixes and some new \
-features. On POSIX systems it is guaranteed to be reliable when used in \
-threaded applications. It includes timeout support from Python 3.3 and the \
-run() API from 3.5 but otherwise matches 3.2's API."
-LICENSE = "Python-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=d3e62baa8fb96b11a59d3f2cd335d5c0"
-
-SRC_URI[md5sum] = "824c801e479d3e916879aae3e9c15e16"
-SRC_URI[sha256sum] = "1e450a4a4c53bf197ad6402c564b9f7a53539385918ef8f12bdf430a61036590"
-
-inherit pypi setuptools
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-systemd.inc b/meta-python/recipes-devtools/python/python-systemd.inc
deleted file mode 100644
index 5be5de092a..0000000000
--- a/meta-python/recipes-devtools/python/python-systemd.inc
+++ /dev/null
@@ -1,18 +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"
-REQUIRED_DISTRO_FEATURES = "systemd"
-inherit pypi distro_features_check
-
-SRC_URI[md5sum] = "5071ea5bcb976186e92a3f5e75df221d"
-SRC_URI[sha256sum] = "fd0e44bf70eadae45aadc292cb0a7eb5b0b6372cd1b391228047d33895db83e7"
-
-# allow for common patches for python- and python3-systemd
-FILESEXTRAPATHS_prepend := "${THISDIR}/python-systemd:"
-
-SRC_URI_append_libc-musl = " file://0001-Provide-implementation-of-strndupa-for-musl.patch"
diff --git a/meta-python/recipes-devtools/python/python-systemd_234.bb b/meta-python/recipes-devtools/python/python-systemd_234.bb
deleted file mode 100644
index 80f2900776..0000000000
--- a/meta-python/recipes-devtools/python/python-systemd_234.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-systemd.inc
-inherit setuptools
diff --git a/meta-python/recipes-devtools/python/python-term.inc b/meta-python/recipes-devtools/python/python-term.inc
deleted file mode 100644
index 8a2df0e19f..0000000000
--- a/meta-python/recipes-devtools/python/python-term.inc
+++ /dev/null
@@ -1,9 +0,0 @@
-SUMMARY = "An enhanced version of the tty module"
-SECTION = "devel/python"
-LICENSE = "Python-2"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=d90e2d280a4836c607520383d1639be1"
-
-PYPI_PACKAGE_EXT = "zip"
-
-SRC_URI[md5sum] = "ab0c1bce381b1109fe4390c56aa06237"
-SRC_URI[sha256sum] = "3dcc8c212e04700784e5c1c5b601916ba0549ae6025b35b64fd62144899e7180"
diff --git a/meta-python/recipes-devtools/python/python-toml.inc b/meta-python/recipes-devtools/python/python-toml.inc
deleted file mode 100644
index a3b3dfc862..0000000000
--- a/meta-python/recipes-devtools/python/python-toml.inc
+++ /dev/null
@@ -1,10 +0,0 @@
-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=6d6012eea477117abf51c31262a152f8"
-
-SRC_URI[md5sum] = "63fffbe2d632865ec29cd69bfdf36682"
-SRC_URI[sha256sum] = "229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c"
-
-inherit pypi
diff --git a/meta-python/recipes-devtools/python/python-toml_0.10.0.bb b/meta-python/recipes-devtools/python/python-toml_0.10.0.bb
deleted file mode 100644
index 3c4acce678..0000000000
--- a/meta-python/recipes-devtools/python/python-toml_0.10.0.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-inherit setuptools
-require python-toml.inc
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-datetime \
-"
diff --git a/meta-python/recipes-devtools/python/python-tornado-redis_2.4.18.bb b/meta-python/recipes-devtools/python/python-tornado-redis_2.4.18.bb
deleted file mode 100644
index 46a20a5eda..0000000000
--- a/meta-python/recipes-devtools/python/python-tornado-redis_2.4.18.bb
+++ /dev/null
@@ -1,18 +0,0 @@
-SUMMARY = "Tornado-Redis is an asyncronous Redis client for the Tornado Web Server"
-DESCRIPTION = "Tornado-Redis is a Redis client that uses Tornado's native 'tornado-gen' interface. \
-It can be used alongside redis-py in Tornado applications: \
-tornado-redis to subscribe to Pub/Sub notifications and for blocking commands (such as BLPOP, BRPOP, BRPOPLPUSH); \
-redis-py for other commands."
-HOMEPAGE = "https://github.com/leporo/tornado-redis"
-
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=ca307e8f37b5fa7f8dbbec033f7db7de"
-
-SRC_URI[md5sum] = "1c7ec0f645d15400871141c1149e6934"
-SRC_URI[sha256sum] = "8fd3b324158291ad5fb7f5f8dc2e8763b2895556bd2a44f2dd721b703c669046"
-
-inherit pypi setuptools
-
-RDEPENDS_${PN} += "python-tornado"
-
-RDEPENDS_${PN}-test += "${PN} python-tornado"
diff --git a/meta-python/recipes-devtools/python/python-tornado_5.1.bb b/meta-python/recipes-devtools/python/python-tornado_5.1.bb
deleted file mode 100644
index 193a4db7d2..0000000000
--- a/meta-python/recipes-devtools/python/python-tornado_5.1.bb
+++ /dev/null
@@ -1,8 +0,0 @@
-inherit pypi setuptools
-require python-tornado.inc
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-backports-abc \
- ${PYTHON_PN}-backports-ssl \
- ${PYTHON_PN}-singledispatch \
- ${PYTHON_PN}-subprocess \
-"
diff --git a/meta-python/recipes-devtools/python/python-tqdm.inc b/meta-python/recipes-devtools/python/python-tqdm.inc
deleted file mode 100644
index 967a80c20e..0000000000
--- a/meta-python/recipes-devtools/python/python-tqdm.inc
+++ /dev/null
@@ -1,13 +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=054ef7105cba050017d1368262a1623c"
-
-inherit pypi
-
-SRC_URI[md5sum] = "807e8c13e16e3660ac88e05d711daeb0"
-SRC_URI[sha256sum] = "e22977e3ebe961f72362f6ddfb9197cc531c9737aaf5f607ef09740c849ecd05"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-tqdm_4.31.1.bb b/meta-python/recipes-devtools/python/python-tqdm_4.31.1.bb
deleted file mode 100644
index b3810097e6..0000000000
--- a/meta-python/recipes-devtools/python/python-tqdm_4.31.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-tqdm.inc
diff --git a/meta-python/recipes-devtools/python/python-traceback2_1.4.0.bb b/meta-python/recipes-devtools/python/python-traceback2_1.4.0.bb
deleted file mode 100644
index 696c875c68..0000000000
--- a/meta-python/recipes-devtools/python/python-traceback2_1.4.0.bb
+++ /dev/null
@@ -1,15 +0,0 @@
-SUMMARY = "A backport of traceback to older supported Pythons"
-HOMEPAGE = "https://github.com/testing-cabal/traceback2"
-LICENSE = "Python-2.0"
-LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=31;endline=31;md5=368ddc8588431c180ae7c33f4fb57519"
-
-DEPENDS = "${PYTHON_PN}-pbr-native"
-
-SRC_URI[md5sum] = "9e9723f4d70bfc6308fa992dd193c400"
-SRC_URI[sha256sum] = "05acc67a09980c2ecfedd3423f7ae0104839eccb55fc645773e1caa0951c3030"
-
-inherit pypi setuptools
-
-CLEANBROKEN = "1"
-
-RDEPENDS_${PN} = "${PYTHON_PN}-linecache2"
diff --git a/meta-python/recipes-devtools/python/python-twine.inc b/meta-python/recipes-devtools/python/python-twine.inc
deleted file mode 100644
index 2bc778da24..0000000000
--- a/meta-python/recipes-devtools/python/python-twine.inc
+++ /dev/null
@@ -1,11 +0,0 @@
-DESCRIPTION = "Six is a Python 2 and 3 compatibility library"
-HOMEPAGE = "https://github.com/benjaminp/six"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://README.rst;md5=3963bdcee7562bedae1effa09e7542b2"
-
-SRC_URI[md5sum] = "6fb4da0c7d81ddfd48f619b8caa1493c"
-SRC_URI[sha256sum] = "d6c29c933ecfc74e9b1d9fa13aa1f87c5d5770e119f5a4ce032092f0ff5b14dc"
-
-inherit pypi
-
-BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python-twisted.inc b/meta-python/recipes-devtools/python/python-twisted.inc
deleted file mode 100644
index d70104dc26..0000000000
--- a/meta-python/recipes-devtools/python/python-twisted.inc
+++ /dev/null
@@ -1,250 +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=1743f12d8b8f5aec625c0569a058f0a6"
-
-SRC_URI[sha256sum] = "d5db93026568f60cacdc0615fcd21d46f694a6bfad0ef3ff53cde2b4bb85a39d"
-SRC_URI[md5sum] = "5e9296a952430d288cdcdc6ad9eb5ee8"
-
-PYPI_PACKAGE = "Twisted"
-PYPI_PACKAGE_EXT = "tar.bz2"
-
-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}-core ${PYTHON_PN}-zopeinterface ${PYTHON_PN}-incremental ${PYTHON_PN}-constantly ${PYTHON_PN}-hyperlink ${PYTHON_PN}-automat"
-RDEPENDS_${PN}-test = "${PN}"
-RDEPENDS_${PN}-conch = "${PN}-core ${PN}-protocols"
-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/ \
-"
-
-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 \
-"
-
diff --git a/meta-python/recipes-devtools/python/python-twisted_19.7.0.bb b/meta-python/recipes-devtools/python/python-twisted_19.7.0.bb
deleted file mode 100644
index 5903db3e02..0000000000
--- a/meta-python/recipes-devtools/python/python-twisted_19.7.0.bb
+++ /dev/null
@@ -1,8 +0,0 @@
-inherit pypi setuptools
-require python-twisted.inc
-
-RDEPENDS_${PN}-core += "${PYTHON_PN}-contextlib"
-
-RDEPENDS_${PN} += " \
- ${PN}-news \
-"
diff --git a/meta-python/recipes-devtools/python/python-twitter.inc b/meta-python/recipes-devtools/python/python-twitter.inc
deleted file mode 100644
index f5657eeb2e..0000000000
--- a/meta-python/recipes-devtools/python/python-twitter.inc
+++ /dev/null
@@ -1,17 +0,0 @@
-SUMMARY = "Twitter for Python"
-DESCRIPTION = "Python module to support twitter API"
-
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://PKG-INFO;md5=0307fffd8c4d9946c029daa1426d26e7"
-
-SRC_URI[md5sum] = "c6dc2f315ded761aafc96bea3351c7f6"
-SRC_URI[sha256sum] = "fe85a79f58a01dd335968523b91c5fce760e7fe78bf25a6e71c72204fe499d0b"
-
-PYPI_PACKAGE = "tweepy"
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-pip \
- ${PYTHON_PN}-pysocks \
- ${PYTHON_PN}-requests \
- ${PYTHON_PN}-six \
- "
diff --git a/meta-python/recipes-devtools/python/python-twitter_3.7.0.bb b/meta-python/recipes-devtools/python/python-twitter_3.7.0.bb
deleted file mode 100644
index 6a28b08ae6..0000000000
--- a/meta-python/recipes-devtools/python/python-twitter_3.7.0.bb
+++ /dev/null
@@ -1,3 +0,0 @@
-require python-twitter.inc
-inherit pypi setuptools
-
diff --git a/meta-python/recipes-devtools/python/python-twofish.inc b/meta-python/recipes-devtools/python/python-twofish.inc
deleted file mode 100644
index 79ab285e55..0000000000
--- a/meta-python/recipes-devtools/python/python-twofish.inc
+++ /dev/null
@@ -1,13 +0,0 @@
-SUMMARY = "Bindings for the Twofish implementation by Niels Ferguson"
-DESCRIPTION = "Bindings for the Twofish implementation by Niels Ferguson\
- libtwofish-dev."
-HOMEPAGE = "http://github.com/keybase/python-twofish"
-LICENSE = "BSD-3-Clause"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=33a63abf6d7567b1689d8ce69f00e43b"
-
-SRC_URI[md5sum] = "d7d22f16dc4ffa0e3ae2200654033abe"
-SRC_URI[sha256sum] = "b09d8bb50d33b23ff34cafb1f9209f858f752935c6a5c901efb92a41acb830fa"
-
-inherit pypi
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-twofish_0.3.0.bb b/meta-python/recipes-devtools/python/python-twofish_0.3.0.bb
deleted file mode 100644
index 85b021594b..0000000000
--- a/meta-python/recipes-devtools/python/python-twofish_0.3.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-twofish.inc
-inherit setuptools
diff --git a/meta-python/recipes-devtools/python/python-typing.inc b/meta-python/recipes-devtools/python/python-typing.inc
deleted file mode 100644
index ab8ee81ec5..0000000000
--- a/meta-python/recipes-devtools/python/python-typing.inc
+++ /dev/null
@@ -1,9 +0,0 @@
-SUMMARY = "Simple Python module defined by PEP 484."
-HOMEPAGE = "https://github.com/python/typing"
-LICENSE = "PSF"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=64fc2b30b67d0a8423c250e0386ed72f"
-
-SRC_URI[md5sum] = "0a1ebd4af65b4769e33459004eb20345"
-SRC_URI[sha256sum] = "91dfe6f3f706ee8cc32d38edbbf304e9b7583fb37108fef38229617f8b3eba23"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-typing_3.7.4.1.bb b/meta-python/recipes-devtools/python/python-typing_3.7.4.1.bb
deleted file mode 100644
index 04ce063c98..0000000000
--- a/meta-python/recipes-devtools/python/python-typing_3.7.4.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-typing.inc
diff --git a/meta-python/recipes-devtools/python/python-tzlocal.inc b/meta-python/recipes-devtools/python/python-tzlocal.inc
deleted file mode 100644
index 42f93e6a5c..0000000000
--- a/meta-python/recipes-devtools/python/python-tzlocal.inc
+++ /dev/null
@@ -1,8 +0,0 @@
-SUMMARY = "Library to return tzinfo with the local timezone information"
-HOMEPAGE = "https://pypi.org/project/tzlocal/"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=57e0bd61643d81d05683cdce65b11d10"
-
-SRC_URI[md5sum] = "4553be891efa0812c4adfb0c6e818eec"
-SRC_URI[sha256sum] = "4ebeb848845ac898da6519b9b31879cf13b6626f7184c496037b818e238f2c4e"
-
diff --git a/meta-python/recipes-devtools/python/python-tzlocal_1.5.1.bb b/meta-python/recipes-devtools/python/python-tzlocal_1.5.1.bb
deleted file mode 100644
index b7980dd552..0000000000
--- a/meta-python/recipes-devtools/python/python-tzlocal_1.5.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-tzlocal.inc
diff --git a/meta-python/recipes-devtools/python/python-ujson.inc b/meta-python/recipes-devtools/python/python-ujson.inc
deleted file mode 100644
index c3d0bfeeda..0000000000
--- a/meta-python/recipes-devtools/python/python-ujson.inc
+++ /dev/null
@@ -1,15 +0,0 @@
-SUMMARY = "Ultra fast JSON encoder and decoder for Python"
-DESCRIPTION = "UltraJSON is an ultra fast JSON encoder and decoder written in pure C with bindings for Python 2.5+ and 3."
-
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=88df8e78b9edfd744953862179f2d14e"
-
-SRC_URI[md5sum] = "42f77b0cce686dfa4da2e68480b1dd24"
-SRC_URI[sha256sum] = "f66073e5506e91d204ab0c614a148d5aa938bdbf104751be66f8ad7a222f5f86"
-
-inherit pypi
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-datetime \
- ${PYTHON_PN}-numbers \
- "
diff --git a/meta-python/recipes-devtools/python/python-ujson_1.35.bb b/meta-python/recipes-devtools/python/python-ujson_1.35.bb
deleted file mode 100644
index b3c6ae66fc..0000000000
--- a/meta-python/recipes-devtools/python/python-ujson_1.35.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-ujson.inc
diff --git a/meta-python/recipes-devtools/python/python-unidiff.inc b/meta-python/recipes-devtools/python/python-unidiff.inc
deleted file mode 100644
index fc1206201b..0000000000
--- a/meta-python/recipes-devtools/python/python-unidiff.inc
+++ /dev/null
@@ -1,14 +0,0 @@
-SUMMARY = "Unified diff parsing/metadata extraction library"
-HOMEPAGE = "http://github.com/matiasb/python-unidiff"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=4c434b08ef42fea235bb019b5e5a97b3"
-
-SRC_URI[md5sum] = "47f669d7273541fec45e4cc0fba8d8e9"
-SRC_URI[sha256sum] = "9c9ab5fb96b6988b4cd5def6b275492442c04a570900d33aa6373105780025bc"
-
-inherit pypi
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-codecs \
- ${PYTHON_PN}-io \
-"
diff --git a/meta-python/recipes-devtools/python/python-unidiff_0.5.5.bb b/meta-python/recipes-devtools/python/python-unidiff_0.5.5.bb
deleted file mode 100644
index bdb3d27f9a..0000000000
--- a/meta-python/recipes-devtools/python/python-unidiff_0.5.5.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-unidiff.inc
-inherit setuptools
diff --git a/meta-python/recipes-devtools/python/python-urllib3.inc b/meta-python/recipes-devtools/python/python-urllib3.inc
deleted file mode 100644
index 398b5f2ac1..0000000000
--- a/meta-python/recipes-devtools/python/python-urllib3.inc
+++ /dev/null
@@ -1,21 +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=65715c2eb961313d71b297dd5a04f85e"
-
-SRC_URI[md5sum] = "a7504a9fcb7ed4ffa482fe098c80b6d4"
-SRC_URI[sha256sum] = "9a107b99a5393caf59c7aa3c1249c16e6879447533d0887f4336dde834c7be86"
-
-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/python-urllib3_1.25.6.bb b/meta-python/recipes-devtools/python/python-urllib3_1.25.6.bb
deleted file mode 100644
index 6c81f1db9b..0000000000
--- a/meta-python/recipes-devtools/python/python-urllib3_1.25.6.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-urllib3.inc
diff --git a/meta-python/recipes-devtools/python/python-vcversioner_2.16.0.0.bb b/meta-python/recipes-devtools/python/python-vcversioner_2.16.0.0.bb
deleted file mode 100644
index e6cc4accea..0000000000
--- a/meta-python/recipes-devtools/python/python-vcversioner_2.16.0.0.bb
+++ /dev/null
@@ -1,17 +0,0 @@
-SUMMARY = "Python vcversioner, automagically update the project's version"
-HOMEPAGE = "https://github.com/habnabit/vcversioner"
-
-LICENSE = "ISC"
-LIC_FILES_CHKSUM = "file://PKG-INFO;md5=827a7a91a8d20d3c666b665cd96db8e3"
-
-SRC_URI[md5sum] = "aab6ef5e0cf8614a1b1140ed5b7f107d"
-SRC_URI[sha256sum] = "dae60c17a479781f44a4010701833f1829140b1eeccd258762a74974aa06e19b"
-
-inherit pypi setuptools
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-subprocess \
- "
-RDEPENDS_${PN}_class-native = ""
-
-BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python-versiontools.inc b/meta-python/recipes-devtools/python/python-versiontools.inc
deleted file mode 100644
index b0e696f9c3..0000000000
--- a/meta-python/recipes-devtools/python/python-versiontools.inc
+++ /dev/null
@@ -1,10 +0,0 @@
-SUMMARY = "Smart replacement for plain tuple used in __version__"
-SECTION = "devel/python"
-HOMEPAGE = "https://launchpad.net/versiontools"
-LICENSE = "LGPLv3"
-LIC_FILES_CHKSUM = "file://setup.py;beginline=3;endline=20;md5=02193721a38fd8a05a4ddeb7df8e294d"
-
-inherit pypi
-
-SRC_URI[md5sum] = "602b7db8eea30dd29a1d451997adf251"
-SRC_URI[sha256sum] = "a969332887a18a9c98b0df0ea4d4ca75972f24ca94f06fb87d591377e83414f6"
diff --git a/meta-python/recipes-devtools/python/python-versiontools_1.9.1.bb b/meta-python/recipes-devtools/python/python-versiontools_1.9.1.bb
deleted file mode 100644
index 6bfe82e005..0000000000
--- a/meta-python/recipes-devtools/python/python-versiontools_1.9.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-versiontools.inc
diff --git a/meta-python/recipes-devtools/python/python-visitor.inc b/meta-python/recipes-devtools/python/python-visitor.inc
deleted file mode 100644
index 8c2288cf0a..0000000000
--- a/meta-python/recipes-devtools/python/python-visitor.inc
+++ /dev/null
@@ -1,6 +0,0 @@
-SUMMARY = "A tiny pythonic visitor implementation."
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=8227180126797a0148f94f483f3e1489"
-
-SRC_URI[md5sum] = "94a024ed0ec1b02b4497c15267d319ca"
-SRC_URI[sha256sum] = "2c737903b2b6864ebc6167eef7cf3b997126f1aa94bdf590f90f1436d23e480a"
diff --git a/meta-python/recipes-devtools/python/python-visitor_0.1.3.bb b/meta-python/recipes-devtools/python/python-visitor_0.1.3.bb
deleted file mode 100644
index eee25a543b..0000000000
--- a/meta-python/recipes-devtools/python/python-visitor_0.1.3.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-visitor.inc
diff --git a/meta-python/recipes-devtools/python/python-vobject_0.9.6.1.bb b/meta-python/recipes-devtools/python/python-vobject_0.9.6.1.bb
deleted file mode 100644
index d31f2f5ac9..0000000000
--- a/meta-python/recipes-devtools/python/python-vobject_0.9.6.1.bb
+++ /dev/null
@@ -1,15 +0,0 @@
-SUMMARY = "Python package for parsing and generating vCard and vCalendar files"
-HOMEPAGE = "http://vobject.skyhouseconsulting.com/"
-
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE-2.0.txt;md5=3b83ef96387f14655fc854ddc3c6bd57"
-
-SRC_URI[md5sum] = "06357e96a84d55de2a71b36d39f6853e"
-SRC_URI[sha256sum] = "96512aec74b90abb71f6b53898dd7fe47300cc940104c4f79148f0671f790101"
-
-inherit pypi setuptools
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-dateutil \
- ${PYTHON_PN}-numbers \
- "
diff --git a/meta-python/recipes-devtools/python/python-waitress_1.3.1.bb b/meta-python/recipes-devtools/python/python-waitress_1.3.1.bb
deleted file mode 100644
index 26a628ea02..0000000000
--- a/meta-python/recipes-devtools/python/python-waitress_1.3.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools pypi
-require python-waitress.inc
diff --git a/meta-python/recipes-devtools/python/python-wcwidth.inc b/meta-python/recipes-devtools/python/python-wcwidth.inc
deleted file mode 100644
index 1429450bb6..0000000000
--- a/meta-python/recipes-devtools/python/python-wcwidth.inc
+++ /dev/null
@@ -1,8 +0,0 @@
-SUMMARY = "Library for building powerful interactive command lines in Python"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=11fba47286258744a6bc6e43530c32a1"
-
-SRC_URI[md5sum] = "b3b6a0a08f0c8a34d1de8cf44150a4ad"
-SRC_URI[sha256sum] = "3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-wcwidth_0.1.7.bb b/meta-python/recipes-devtools/python/python-wcwidth_0.1.7.bb
deleted file mode 100644
index ef107c16a1..0000000000
--- a/meta-python/recipes-devtools/python/python-wcwidth_0.1.7.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-wcwidth.inc
diff --git a/meta-python/recipes-devtools/python/python-webcolors.inc b/meta-python/recipes-devtools/python/python-webcolors.inc
deleted file mode 100644
index a02bbbbedf..0000000000
--- a/meta-python/recipes-devtools/python/python-webcolors.inc
+++ /dev/null
@@ -1,12 +0,0 @@
-SUMMARY = "Simple Python module for working with HTML/CSS color definitions."
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=197add016087e6884a012b0f185d44ad"
-
-SRC_URI[md5sum] = "40890db38b2a856e526a568864025fe6"
-SRC_URI[sha256sum] = "030562f624467a9901f0b455fef05486a88cfb5daa1e356bd4aacea043850b59"
-
-RDEPENDS_${PN}_class-target = "\
- ${PYTHON_PN}-stringold \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-webcolors_1.8.1.bb b/meta-python/recipes-devtools/python/python-webcolors_1.8.1.bb
deleted file mode 100644
index a0b6708caf..0000000000
--- a/meta-python/recipes-devtools/python/python-webcolors_1.8.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-webcolors.inc
diff --git a/meta-python/recipes-devtools/python/python-webdav_0.1.2.bb b/meta-python/recipes-devtools/python/python-webdav_0.1.2.bb
deleted file mode 100644
index 7a6437dc53..0000000000
--- a/meta-python/recipes-devtools/python/python-webdav_0.1.2.bb
+++ /dev/null
@@ -1,19 +0,0 @@
-DESCRIPTION = "This project aims to provide an object-oriented Python WebDAV client-side library\
- based on Python`s standard httplib and Greg Stein`s davlib.\
- The client shall fully support RFCs 4918 (basic specification),\
- 3744 (access control), and 3253 (versioning)."
-SECTION = "devel/python"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://src/webdav/WebdavClient.py;endline=15;md5=a1520fad859feb7b0d7f05277bc6ce48"
-HOMEPAGE = "http://sourceforge.net/projects/pythonwebdavlib/"
-SRCNAME = "Python_WebDAV_Library"
-DEPENDS = "python"
-
-SRC_URI = "${SOURCEFORGE_MIRROR}/pythonwebdavlib/Python%20WebDAV%20Library%20-%20${PV}/${SRCNAME}-${PV}.zip"
-SRC_URI[md5sum] = "8e49e0ecc5b4327c4f752a544ee10e1a"
-SRC_URI[sha256sum] = "72c029ad1e25de950f59c2f1812d009d2c1691b70e4b5b09f1af9006e8fd5f23"
-
-S = "${WORKDIR}/${SRCNAME}-${PV}"
-
-inherit distutils
-
diff --git a/meta-python/recipes-devtools/python/python-webencodings.inc b/meta-python/recipes-devtools/python/python-webencodings.inc
deleted file mode 100644
index a2b8410cf0..0000000000
--- a/meta-python/recipes-devtools/python/python-webencodings.inc
+++ /dev/null
@@ -1,15 +0,0 @@
-SUMMARY = "Character encoding aliases for legacy web content"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e910b35b0ef4e1f665b9a75d6afb7709"
-
-SRC_URI[md5sum] = "32f6e261d52e57bf7e1c4d41546d15b8"
-SRC_URI[sha256sum] = "b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"
-
-inherit pypi
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-codecs \
- ${PYTHON_PN}-json \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-webencodings_0.5.1.bb b/meta-python/recipes-devtools/python/python-webencodings_0.5.1.bb
deleted file mode 100644
index 5de2ed1d7b..0000000000
--- a/meta-python/recipes-devtools/python/python-webencodings_0.5.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-webencodings.inc
diff --git a/meta-python/recipes-devtools/python/python-websocket-client.inc b/meta-python/recipes-devtools/python/python-websocket-client.inc
deleted file mode 100644
index c4214b2fde..0000000000
--- a/meta-python/recipes-devtools/python/python-websocket-client.inc
+++ /dev/null
@@ -1,18 +0,0 @@
-SUMMARY = "websocket client for python"
-DESCRIPTION = "\
-websocket-client module is WebSocket client for python. \
-This provide the low level APIs for WebSocket. All APIs \
-are the synchronous functions."
-HOMEPAGE = "https://github.com/websocket-client/websocket-client"
-LICENSE = "BSD-3-Clause"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=c4c4a98fbc4836b81c8c64d6ecb01fc1"
-
-SRC_URI[md5sum] = "89484bd5dac71123ae6a09b2f90fe62c"
-SRC_URI[sha256sum] = "1fd5520878b68b84b5748bb30e592b10d0a91529d5383f74f4964e72b297fd3a"
-
-PYPI_PACKAGE = "websocket_client"
-inherit pypi
-
-RDEPENDS_${PN} = "\
- ${PYTHON_PN}-six \
-"
diff --git a/meta-python/recipes-devtools/python/python-werkzeug.inc b/meta-python/recipes-devtools/python/python-werkzeug.inc
deleted file mode 100644
index c04a4e0c4f..0000000000
--- a/meta-python/recipes-devtools/python/python-werkzeug.inc
+++ /dev/null
@@ -1,47 +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"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=ed9a0b7c0254616d72dadb98b293ef1b"
-
-SRC_URI[md5sum] = "6d20b5be2d245be4ac7706cc390d130c"
-SRC_URI[sha256sum] = "c3fd7a7d41976d9f44db327260e263132466836cef6f91512889ed60ad26557c"
-
-PYPI_PACKAGE = "Werkzeug"
-
-CLEANBROKEN = "1"
-
-PACKAGES =+ "${PN}-tests"
-FILES_${PN}-tests+= " \
- ${PYTHON_SITEPACKAGES_DIR}/werkzeug/test* \
- ${PYTHON_SITEPACKAGES_DIR}/werkzeug/__pycache__/test* \
- ${PYTHON_SITEPACKAGES_DIR}/werkzeug/contrib/test* \
- ${PYTHON_SITEPACKAGES_DIR}/werkzeug/contrib/__pycache__/test* \
-"
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-datetime \
- ${PYTHON_PN}-difflib \
- ${PYTHON_PN}-email \
- ${PYTHON_PN}-html \
- ${PYTHON_PN}-io \
- ${PYTHON_PN}-json \
- ${PYTHON_PN}-netclient \
- ${PYTHON_PN}-netserver \
- ${PYTHON_PN}-numbers \
- ${PYTHON_PN}-pkgutil \
- ${PYTHON_PN}-pprint \
- ${PYTHON_PN}-threading \
- ${PYTHON_PN}-unixadmin \
-"
-
-RDEPENDS_${PN}-tests = " \
- ${PN} \
- ${PYTHON_PN}-unittest \
-"
diff --git a/meta-python/recipes-devtools/python/python-werkzeug_0.14.1.bb b/meta-python/recipes-devtools/python/python-werkzeug_0.14.1.bb
deleted file mode 100644
index db41161b35..0000000000
--- a/meta-python/recipes-devtools/python/python-werkzeug_0.14.1.bb
+++ /dev/null
@@ -1,7 +0,0 @@
-inherit pypi setuptools
-require python-werkzeug.inc
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-subprocess \
- ${PYTHON_PN}-zlib \
-"
diff --git a/meta-python/recipes-devtools/python/python-whoosh.inc b/meta-python/recipes-devtools/python/python-whoosh.inc
deleted file mode 100644
index a4ca5dcd48..0000000000
--- a/meta-python/recipes-devtools/python/python-whoosh.inc
+++ /dev/null
@@ -1,24 +0,0 @@
-SUMMARY = "Fast, pure-Python full text indexing, search, and spell checking library."
-DESCRIPTION = "\
-Whoosh is a fast, featureful full-text indexing and searching library \
-implemented in pure Python. Programmers can use it to easily add search \
-functionality to their applications and websites. Every part of how \
-Whoosh works can be extended or replaced to meet your needs exactly."
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=05303186defc6141143629961c7c8a60"
-
-SRC_URI[md5sum] = "893433e9c0525ac043df33e6e04caab2"
-SRC_URI[sha256sum] = "e0857375f63e9041e03fedd5b7541f97cf78917ac1b6b06c1fcc9b45375dda69"
-
-PYPI_PACKAGE = "Whoosh"
-PYPI_PACKAGE_EXT = "zip"
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-email \
- ${PYTHON_PN}-multiprocessing \
- ${PYTHON_PN}-netclient \
- ${PYTHON_PN}-numbers \
- ${PYTHON_PN}-pickle \
- ${PYTHON_PN}-shell \
- ${PYTHON_PN}-stringold \
-"
diff --git a/meta-python/recipes-devtools/python/python-whoosh_2.7.4.bb b/meta-python/recipes-devtools/python/python-whoosh_2.7.4.bb
deleted file mode 100644
index 3b4291f40d..0000000000
--- a/meta-python/recipes-devtools/python/python-whoosh_2.7.4.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-inherit pypi setuptools
-require python-whoosh.inc
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-subprocess \
-"
diff --git a/meta-python/recipes-devtools/python/python-wrapt.inc b/meta-python/recipes-devtools/python/python-wrapt.inc
deleted file mode 100644
index ed49811fef..0000000000
--- a/meta-python/recipes-devtools/python/python-wrapt.inc
+++ /dev/null
@@ -1,15 +0,0 @@
-SUMMARY = "A Python module for decorators, wrappers and monkey patching."
-HOMEPAGE = "http://wrapt.readthedocs.org/"
-LICENSE = "BSD"
-SECTION = "devel/python"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=fdfc019b57affbe1d7a32e3d34e83db4"
-
-SRC_URI[md5sum] = "cc15c001b129f81eb2f79b15eb99ffe5"
-SRC_URI[sha256sum] = "565a021fd19419476b9362b05eeaa094178de64f8361e44468f9e9d7843901e1"
-
-inherit pypi
-
-RDEPENDS_${PN}_class-target += "\
- ${PYTHON_PN}-stringold \
- ${PYTHON_PN}-threading \
-"
diff --git a/meta-python/recipes-devtools/python/python-wrapt_1.11.2.bb b/meta-python/recipes-devtools/python/python-wrapt_1.11.2.bb
deleted file mode 100644
index bb42476574..0000000000
--- a/meta-python/recipes-devtools/python/python-wrapt_1.11.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools
-require python-wrapt.inc
diff --git a/meta-python/recipes-devtools/python/python-wtforms.inc b/meta-python/recipes-devtools/python/python-wtforms.inc
deleted file mode 100644
index 868686bfec..0000000000
--- a/meta-python/recipes-devtools/python/python-wtforms.inc
+++ /dev/null
@@ -1,15 +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"
-LIC_FILES_CHKSUM = "file://PKG-INFO;md5=c4660c132770d5d0a5757541f6b79493"
-
-SRC_URI[md5sum] = "41c0008dbe7bd98892c58f7457a46a4a"
-SRC_URI[sha256sum] = "0cdbac3e7f6878086c334aa25dc5a33869a3954e9d1e015130d65a69309b3b61"
-
-PYPI_PACKAGE = "WTForms"
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-netserver \
- ${PYTHON_PN}-numbers \
- "
diff --git a/meta-python/recipes-devtools/python/python-wtforms_2.2.1.bb b/meta-python/recipes-devtools/python/python-wtforms_2.2.1.bb
deleted file mode 100644
index fdb015e8a5..0000000000
--- a/meta-python/recipes-devtools/python/python-wtforms_2.2.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-wtforms.inc
diff --git a/meta-python/recipes-devtools/python/python-xlrd.inc b/meta-python/recipes-devtools/python/python-xlrd.inc
deleted file mode 100644
index 893e82e05a..0000000000
--- a/meta-python/recipes-devtools/python/python-xlrd.inc
+++ /dev/null
@@ -1,14 +0,0 @@
-SUMMARY = "Library for developers to extract data from Microsoft Excel (tm) spreadsheet files"
-DESCRIPTION = "Extract data from Excel spreadsheets (.xls and .xlsx,\
- versions 2.0 onwards) on any platform. Pure Python (2.6, 2.7, 3.2+). \
-Strong support for Excel dates. Unicode-aware."
-HOMEPAGE = "http://www.python-excel.org/"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://PKG-INFO;md5=08bd814936237b6e1355e6370b24b2c1"
-
-SRC_URI[md5sum] = "b85c9916ac755cad489a9005f5a0d390"
-SRC_URI[sha256sum] = "8a21885513e6d915fe33a8ee5fdfa675433b61405ba13e2a69e62ee36828d7e2"
-
-RDEPENDS_${PN} += "${PYTHON_PN}-compression ${PYTHON_PN}-io ${PYTHON_PN}-pprint ${PYTHON_PN}-shell"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python-xlrd_1.1.0.bb b/meta-python/recipes-devtools/python/python-xlrd_1.1.0.bb
deleted file mode 100644
index 3a4d709eb4..0000000000
--- a/meta-python/recipes-devtools/python/python-xlrd_1.1.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-xlrd.inc
diff --git a/meta-python/recipes-devtools/python/python-xstatic-font-awesome.inc b/meta-python/recipes-devtools/python/python-xstatic-font-awesome.inc
deleted file mode 100644
index d13cb83f6e..0000000000
--- a/meta-python/recipes-devtools/python/python-xstatic-font-awesome.inc
+++ /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"
-
-inherit pypi
-
-SRC_URI[md5sum] = "141a0e9a7e21e82f922573a00ae0c166"
-SRC_URI[sha256sum] = "e01fb480caaa7c7963dcb3328a4700e631bef6070db0e8b685816d220e685f6c"
-
-DEPENDS += " \
- ${PYTHON_PN}-xstatic \
- ${PYTHON_PN}-pip \
- "
diff --git a/meta-python/recipes-devtools/python/python-xstatic-font-awesome_4.7.0.0.bb b/meta-python/recipes-devtools/python/python-xstatic-font-awesome_4.7.0.0.bb
deleted file mode 100644
index 41e85f4a9a..0000000000
--- a/meta-python/recipes-devtools/python/python-xstatic-font-awesome_4.7.0.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-xstatic-font-awesome.inc
diff --git a/meta-python/recipes-devtools/python/python-xstatic.inc b/meta-python/recipes-devtools/python/python-xstatic.inc
deleted file mode 100644
index f7c7db99af..0000000000
--- a/meta-python/recipes-devtools/python/python-xstatic.inc
+++ /dev/null
@@ -1,14 +0,0 @@
-DESCRIPTION = "XStatic base package with minimal support code"
-HOMEPAGE = "https://pypi.python.org/pypi/XStatic"
-SECTION = "devel/python"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://README.txt;md5=36a1e7eaa71e1bd07b8d2247839f228e"
-
-PYPI_PACKAGE = "XStatic"
-
-SRC_URI[md5sum] = "7064b5ea7fd1ee990e0ae0538301d9bc"
-SRC_URI[sha256sum] = "0ec93d7c66ebb9e0d31b664753437dc8634cb66e13310cb47c9eb1e0bc66d726"
-
-DEPENDS += " \
- ${PYTHON_PN}-pip \
- "
diff --git a/meta-python/recipes-devtools/python/python-xstatic_1.0.1.bb b/meta-python/recipes-devtools/python/python-xstatic_1.0.1.bb
deleted file mode 100644
index 8073037044..0000000000
--- a/meta-python/recipes-devtools/python/python-xstatic_1.0.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-xstatic.inc
diff --git a/meta-python/recipes-devtools/python/python-xxhash.inc b/meta-python/recipes-devtools/python/python-xxhash.inc
deleted file mode 100644
index 93b2a15a74..0000000000
--- a/meta-python/recipes-devtools/python/python-xxhash.inc
+++ /dev/null
@@ -1,7 +0,0 @@
-SUMMARY = "xxhash is a Python binding for the xxHash library by Yann Collet."
-SECTION = "devel/python"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=5a8d76283514a1b7e6a414aba38629b5"
-
-SRC_URI[md5sum] = "80461eff10ac62214fa788a6045aab43"
-SRC_URI[sha256sum] = "82cdc67b41da904aa2921107e9877814079d9b067a99f19852b5d85e8a40555d"
diff --git a/meta-python/recipes-devtools/python/python-yappi.inc b/meta-python/recipes-devtools/python/python-yappi.inc
deleted file mode 100644
index 651ce7731b..0000000000
--- a/meta-python/recipes-devtools/python/python-yappi.inc
+++ /dev/null
@@ -1,16 +0,0 @@
-SUMMARY = "Yet Another Python Profiler"
-HOMEPAGE = "http://yappi.googlecode.com/"
-
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://PKG-INFO;md5=6b131c3041637f6a5175a43112dde05c"
-
-SRC_URI[md5sum] = "dc56240575c99938a924eaeb7c0d8beb"
-SRC_URI[sha256sum] = "5f657129e1b9b952379ffbc009357d0dcdb58c50f3bfe88ffbb992e4b27b263c"
-
-inherit pypi setuptools
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-datetime \
- ${PYTHON_PN}-pickle \
- ${PYTHON_PN}-threading \
- "
diff --git a/meta-python/recipes-devtools/python/python-yappi_0.98.bb b/meta-python/recipes-devtools/python/python-yappi_0.98.bb
deleted file mode 100644
index a3bdde5c2d..0000000000
--- a/meta-python/recipes-devtools/python/python-yappi_0.98.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-yappi.inc
-inherit setuptools
diff --git a/meta-python/recipes-devtools/python/python-yarl.inc b/meta-python/recipes-devtools/python/python-yarl.inc
deleted file mode 100644
index 49b5a607b5..0000000000
--- a/meta-python/recipes-devtools/python/python-yarl.inc
+++ /dev/null
@@ -1,10 +0,0 @@
-SUMMARY = "The module provides handy URL class for url parsing and changing"
-HOMEPAGE = "https://github.com/aio-libs/yarl/"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=b334fc90d45983db318f54fd5bf6c90b"
-
-SRC_URI[md5sum] = "92889c31fce4c8f82b7ee9c2b2ed9cd1"
-SRC_URI[sha256sum] = "024ecdc12bc02b321bc66b41327f930d1c2c543fa9a561b39861da9388ba7aa9"
-
-PYPI_PACKAGE = "yarl"
-inherit pypi
diff --git a/meta-python/recipes-devtools/python/python-zipp.inc b/meta-python/recipes-devtools/python/python-zipp.inc
deleted file mode 100644
index ba18f72161..0000000000
--- a/meta-python/recipes-devtools/python/python-zipp.inc
+++ /dev/null
@@ -1,10 +0,0 @@
-DESCRIPTION = "Backport of pathlib-compatible object wrapper for zip files"
-HOMEPAGE = "https://github.com/jaraco/zipp"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=a33f38bbf47d48c70fe0d40e5f77498e"
-
-SRC_URI[md5sum] = "d4451a749d8a7c3c392a9edd1864a937"
-SRC_URI[sha256sum] = "3718b1cbcd963c7d4c5511a8240812904164b7f381b647143a89d3b98f9bcd8e"
-
-DEPENDS += "${PYTHON_PN}-setuptools-scm-native"
-RDEPENDS_${PN} += "${PYTHON_PN}-more-itertools"
diff --git a/meta-python/recipes-devtools/python/python-zipp_0.6.0.bb b/meta-python/recipes-devtools/python/python-zipp_0.6.0.bb
deleted file mode 100644
index 85949a2a6f..0000000000
--- a/meta-python/recipes-devtools/python/python-zipp_0.6.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-zipp.inc
diff --git a/meta-python/recipes-devtools/python/python-zopeinterface.inc b/meta-python/recipes-devtools/python/python-zopeinterface.inc
deleted file mode 100644
index 7213bc8acc..0000000000
--- a/meta-python/recipes-devtools/python/python-zopeinterface.inc
+++ /dev/null
@@ -1,22 +0,0 @@
-SUMMARY = "Interface definitions for Zope products"
-LICENSE = "ZPL-2.1"
-LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e54fd776274c1b7423ec128974bd9d46"
-
-SRC_URI[md5sum] = "a3b24f9d079bae5e13dd7a88aa512112"
-SRC_URI[sha256sum] = "1b3d0dcabc7c90b470e59e38a9acaa361be43b3a6ea644c0063951964717f0e5"
-
-PYPI_PACKAGE = "zope.interface"
-
-PACKAGES =. "${PN}-test "
-
-RPROVIDES_${PN} += "zope-interfaces"
-
-RDEPENDS_${PN}_class-target += "${PYTHON_PN}-datetime"
-
-FILES_${PN}-dbg += "${PYTHON_SITEPACKAGES_DIR}/*.egg/*/*/.debug"
-FILES_${PN}-dev += "${PYTHON_SITEPACKAGES_DIR}/zope/interface/*.c"
-FILES_${PN}-doc += "${PYTHON_SITEPACKAGES_DIR}/zope/interface/*.txt"
-FILES_${PN}-test += " \
- ${PYTHON_SITEPACKAGES_DIR}/zope/interface/tests \
- ${PYTHON_SITEPACKAGES_DIR}/zope/interface/common/tests \
-"
diff --git a/meta-python/recipes-devtools/python/python-zopeinterface_4.6.0.bb b/meta-python/recipes-devtools/python/python-zopeinterface_4.6.0.bb
deleted file mode 100644
index 1bdfd4d376..0000000000
--- a/meta-python/recipes-devtools/python/python-zopeinterface_4.6.0.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-inherit pypi setuptools
-require python-zopeinterface.inc
-
-RDEPENDS_${PN}-test += "python-unittest python-doctest"
diff --git a/meta-python/recipes-devtools/python/python3-a2wsgi/run-ptest b/meta-python/recipes-devtools/python/python3-a2wsgi/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-a2wsgi/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-a2wsgi_1.10.4.bb b/meta-python/recipes-devtools/python/python3-a2wsgi_1.10.4.bb
new file mode 100644
index 0000000000..e6b980266e
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-a2wsgi_1.10.4.bb
@@ -0,0 +1,33 @@
+SUMMARY = "Convert WSGI app to ASGI app or ASGI app to WSGI app."
+HOMEPAGE = "https://github.com/abersheeran/a2wsgi"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e10d05d29ec6d8be8bfc503683f1bc9a"
+
+inherit pypi python_setuptools_build_meta ptest
+
+SRC_URI[sha256sum] = "50e81ac55aa609fa2c666e42bacc25c424c8884ce6072f1a7e902114b7ee5d63"
+
+DEPENDS += " \
+ python3-pdm-native \
+ python3-pdm-backend-native \
+"
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-httpx \
+ python3-pytest \
+ python3-pytest-asyncio \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+RDEPENDS:${PN} += " \
+ python3-asyncio \
+"
diff --git a/meta-python/recipes-devtools/python/python3-absl_0.7.0.bb b/meta-python/recipes-devtools/python/python3-absl_2.1.0.bb
index c65a6d7da4..5bdb83175d 100644
--- a/meta-python/recipes-devtools/python/python3-absl_0.7.0.bb
+++ b/meta-python/recipes-devtools/python/python3-absl_2.1.0.bb
@@ -4,11 +4,10 @@ SECTION = "devel/python"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
-SRC_URI = "git://github.com/abseil/abseil-py.git"
-SRCREV ?= "e3ce504183c57fc4eca52fe84732c11cda99d131"
+SRC_URI[sha256sum] = "7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff"
-inherit setuptools3
+PYPI_PACKAGE = "absl-py"
-S = "${WORKDIR}/git"
+inherit pypi setuptools3
BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python3-aenum_3.1.15.bb b/meta-python/recipes-devtools/python/python3-aenum_3.1.15.bb
new file mode 100644
index 0000000000..3769be0d5d
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-aenum_3.1.15.bb
@@ -0,0 +1,14 @@
+SUMMARY = "Advanced Enumerations library"
+HOMEPAGE = "https://pypi.org/project/aenum/"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://aenum/LICENSE;md5=c6a85477543f8b8591b9c1f82abebbe9"
+
+SRC_URI[sha256sum] = "8cbd76cd18c4f870ff39b24284d3ea028fbe8731a58df3aa581e434c575b9559"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "\
+ python3-pprint \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-aiodns_3.2.0.bb b/meta-python/recipes-devtools/python/python3-aiodns_3.2.0.bb
new file mode 100644
index 0000000000..bf3f1312d2
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-aiodns_3.2.0.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Simple DNS resolver for asyncio"
+DESCRIPTION = "aiodns provides a simple way for doing asynchronous DNS resolutions using pycares."
+HOMEPAGE = "https://github.com/saghul/aiodns"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=a565d8b5d06b9620968a135a2657b093"
+
+SRC_URI[sha256sum] = "62869b23409349c21b072883ec8998316b234c9a9e36675756e8e317e8768f72"
+
+PYPI_PACKAGE = "aiodns"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-asyncio \
+ python3-pycares \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-aiofiles_0.4.0.bb b/meta-python/recipes-devtools/python/python3-aiofiles_0.4.0.bb
deleted file mode 100644
index b4d188b2ed..0000000000
--- a/meta-python/recipes-devtools/python/python3-aiofiles_0.4.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-aiofiles.inc
diff --git a/meta-python/recipes-devtools/python/python-aiofiles.inc b/meta-python/recipes-devtools/python/python3-aiofiles_23.2.1.bb
index 3ecb21c86d..73dc17423e 100644
--- a/meta-python/recipes-devtools/python/python-aiofiles.inc
+++ b/meta-python/recipes-devtools/python/python3-aiofiles_23.2.1.bb
@@ -4,11 +4,12 @@ HOMEPAGE = "https://github.com/aio-libs/aiohttp"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE;md5=d2794c0df5b907fdace235a619d80314"
-SRC_URI[md5sum] = "cb33cf96c371fbd56fc27ab0bd81bd61"
-SRC_URI[sha256sum] = "021ea0ba314a86027c166ecc4b4c07f2d40fc0f4b3a950d1868a0f2571c2bbee"
+SRC_URI[sha256sum] = "84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a"
PYPI_PACKAGE = "aiofiles"
-inherit pypi
-RDEPENDS_${PN} = "\
- ${PYTHON_PN}-asyncio \
+
+inherit pypi python_hatchling
+
+RDEPENDS:${PN} = "\
+ python3-asyncio \
"
diff --git a/meta-python/recipes-devtools/python/python3-aiohappyeyeballs_2.3.2.bb b/meta-python/recipes-devtools/python/python3-aiohappyeyeballs_2.3.2.bb
new file mode 100644
index 0000000000..edad28e772
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-aiohappyeyeballs_2.3.2.bb
@@ -0,0 +1,12 @@
+SUMMARY = "Happy Eyeballs"
+DESCRIPTION = "This library exists to allow connecting with Happy Eyeballs when you already have a list of addrinfo and not a DNS name."
+HOMEPAGE = "https://github.com/aio-libs/aiohappyeyeballs"
+LICENSE = "PSF-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=fcf6b249c2641540219a727f35d8d2c2"
+
+SRC_URI[sha256sum] = "77e15a733090547a1f5369a1287ddfc944bd30df0eb8993f585259c34b405f4e"
+
+inherit pypi python_poetry_core
+
+BBCLASSEXTEND = "native nativesdk"
+
diff --git a/meta-python/recipes-devtools/python/python3-aiohttp-jinja2_1.6.bb b/meta-python/recipes-devtools/python/python3-aiohttp-jinja2_1.6.bb
new file mode 100644
index 0000000000..df4a0adcaf
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-aiohttp-jinja2_1.6.bb
@@ -0,0 +1,13 @@
+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] = "a3a7ff5264e5bca52e8ae547bbfd0761b72495230d438d05b6c0915be619b0e2"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-jinja2 \
+ python3-aiohttp \
+"
diff --git a/meta-python/recipes-devtools/python/python3-aiohttp_3.5.4.bb b/meta-python/recipes-devtools/python/python3-aiohttp_3.5.4.bb
deleted file mode 100644
index cd0303f05b..0000000000
--- a/meta-python/recipes-devtools/python/python3-aiohttp_3.5.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-aiohttp.inc
diff --git a/meta-python/recipes-devtools/python/python3-aiohttp_3.9.4.bb b/meta-python/recipes-devtools/python/python3-aiohttp_3.9.4.bb
new file mode 100644
index 0000000000..1cfed0d7a4
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-aiohttp_3.9.4.bb
@@ -0,0 +1,22 @@
+SUMMARY = "Async http client/server framework"
+DESCRIPTION = "Asynchronous HTTP client/server framework for asyncio and Python"
+HOMEPAGE = "https://github.com/aio-libs/aiohttp"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=748073912af33aa59430d3702aa32d41"
+
+SRC_URI[sha256sum] = "6ff71ede6d9a5a58cfb7b6fffc83ab5d4a63138276c771ac91ceaaddf5459644"
+
+PYPI_PACKAGE = "aiohttp"
+inherit python_setuptools_build_meta pypi
+
+RDEPENDS:${PN} = "\
+ python3-aiohappyeyeballs \
+ python3-aiosignal \
+ python3-async-timeout \
+ python3-attrs \
+ python3-frozenlist \
+ python3-misc \
+ python3-multidict \
+ python3-yarl \
+ python3-aiodns \
+"
diff --git a/meta-python/recipes-devtools/python/python3-aiohue_4.7.1.bb b/meta-python/recipes-devtools/python/python3-aiohue_4.7.1.bb
new file mode 100644
index 0000000000..438c771dbc
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-aiohue_4.7.1.bb
@@ -0,0 +1,16 @@
+DESCRIPTION = "Asynchronous library to control Philips Hue"
+HOMEPAGE = "https://pypi.org/project/aiohue/"
+SECTION = "devel/python"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=dab31a1d28183826937f4b152143a33f"
+
+SRC_URI[sha256sum] = "29b5e5ae05938cac195b1969e70bd6ad4e4e2e105d0e565849803d2a99ff47d1"
+
+inherit pypi python_setuptools_build_meta
+
+RDEPENDS:${PN} += " \
+ python3-aiohttp \
+ python3-asyncio-throttle \
+ python3-profile \
+ python3-awesomeversion \
+"
diff --git a/meta-python/recipes-devtools/python/python3-aioredis_2.0.1.bb b/meta-python/recipes-devtools/python/python3-aioredis_2.0.1.bb
new file mode 100644
index 0000000000..d8a8f2d033
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-aioredis_2.0.1.bb
@@ -0,0 +1,16 @@
+SUMMARY = "The library is intended to provide simple and clear interface to Redis based on asyncio."
+HOMEPAGE = "https://github.com/aio-libs/aioredis-py"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=bf9085f32a671dfa86ee69fe0fff7b95"
+
+SRC_URI[sha256sum] = "eaa51aaf993f2d71f54b70527c440437ba65340588afeb786cd87c55c89cd98e"
+
+PYPI_PACKAGE = "aioredis"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-core (>=3.6) \
+ python3-async-timeout \
+ python3-typing-extensions \
+"
diff --git a/meta-python/recipes-devtools/python/python3-aioserial_1.3.1.bb b/meta-python/recipes-devtools/python/python3-aioserial_1.3.1.bb
new file mode 100755
index 0000000000..8279f27044
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-aioserial_1.3.1.bb
@@ -0,0 +1,17 @@
+DESCRIPTION = "An asynchronous serial port library for Python"
+HOMEPAGE = "https://github.com/changyuheng/aioserial.py"
+SECTION = "devel/python"
+
+LICENSE = "MPL-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=650b9179efef1ea560df5c08bc32b494"
+
+PYPI_PACKAGE = "aioserial"
+
+SRC_URI[sha256sum] = "702bf03b0eb84b8ef2d8dac5cb925e1e685dce98f77b125569bc6fd2b3b58228"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-asyncio \
+ python3-pyserial \
+"
diff --git a/meta-python/recipes-devtools/python/python3-aiosignal_1.3.1.bb b/meta-python/recipes-devtools/python/python3-aiosignal_1.3.1.bb
new file mode 100644
index 0000000000..fd4ec767c0
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-aiosignal_1.3.1.bb
@@ -0,0 +1,14 @@
+SUMMARY = "A list of registered asynchronous callbacks"
+HOMEPAGE = "https://github.com/aio-libs/aiosignal"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=cf056e8e7a0a5477451af18b7b5aa98c"
+
+SRC_URI[sha256sum] = "54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"
+
+inherit pypi setuptools3
+
+BBCLASSEXTEND = "native nativesdk"
+
+RDEPENDS:${PN} = "\
+ python3-frozenlist \
+"
diff --git a/meta-python/recipes-devtools/python/python3-alembic_1.13.1.bb b/meta-python/recipes-devtools/python/python3-alembic_1.13.1.bb
new file mode 100644
index 0000000000..c4853c4437
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-alembic_1.13.1.bb
@@ -0,0 +1,19 @@
+DESCRIPTION = "A database migration tool for SQLAlchemy"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e3023b042cb6002cb398344b51c67093"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "4932c8558bf68f2ee92b9bbcb8218671c627064d5b08939437af6d77dc05e595"
+
+PYPI_PACKAGE = "alembic"
+
+RDEPENDS:${PN} += "\
+ python3-dateutil \
+ python3-editor \
+ python3-mako \
+ python3-sqlalchemy \
+ python3-misc \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-alembic_1.2.1.bb b/meta-python/recipes-devtools/python/python3-alembic_1.2.1.bb
deleted file mode 100644
index e248fe7ce9..0000000000
--- a/meta-python/recipes-devtools/python/python3-alembic_1.2.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-alembic.inc
diff --git a/meta-python/recipes-devtools/python/python3-aniso8601_9.0.1.bb b/meta-python/recipes-devtools/python/python3-aniso8601_9.0.1.bb
new file mode 100644
index 0000000000..3d99e48c26
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-aniso8601_9.0.1.bb
@@ -0,0 +1,8 @@
+DESCRIPTION = "A library for parsing ISO 8601 strings."
+
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=6d91d56f51a54389d95526eefe039b1c"
+
+SRC_URI[sha256sum] = "72e3117667eedf66951bb2d93f4296a56b94b078a8a95905a052611fb3f1b973"
+
+inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-annotated-types_0.6.0.bb b/meta-python/recipes-devtools/python/python3-annotated-types_0.6.0.bb
new file mode 100644
index 0000000000..79cbb66bc0
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-annotated-types_0.6.0.bb
@@ -0,0 +1,14 @@
+SUMMARY = "Reusable constraint types to use with typing.Annotated"
+DESCRIPTION = ""
+HOMEPAGE = ""
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=c6afb13fdc220497ee5cded1e717ed67"
+
+SRC_URI[sha256sum] = "563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"
+
+S = "${WORKDIR}/annotated_types-${PV}"
+PYPI_PACKAGE = "annotated_types"
+
+inherit pypi python_hatchling
+
+RDEPENDS:${PN} = "python3-typing-extensions"
diff --git a/meta-python/recipes-devtools/python/python3-ansi2html_1.9.1.bb b/meta-python/recipes-devtools/python/python3-ansi2html_1.9.1.bb
new file mode 100644
index 0000000000..6af8989177
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-ansi2html_1.9.1.bb
@@ -0,0 +1,19 @@
+DESCRPTION = "ansi2html - Convert text with ANSI color codes to HTML or to LaTeX"
+HOMEPAGE = "https://github.com/ralphbean/ansi2html"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3000208d539ec061b899bce1d9ce9404"
+LICENSE = "GPL-3.0-only"
+
+PYPI_PACKAGE = "ansi2html"
+
+SRC_URI[sha256sum] = "5c6837a13ecc1903aab7a545353312049dfedfe5105362ad3a8d9d207871ec71"
+
+inherit pypi python_setuptools_build_meta
+
+DEPENDS += " \
+ python3-setuptools-scm-native \
+"
+
+RDEPENDS:${PN} = " \
+ python3-six \
+ python3-compression \
+"
diff --git a/meta-python/recipes-devtools/python/python3-ansicolors/run-ptest b/meta-python/recipes-devtools/python/python3-ansicolors/run-ptest
new file mode 100644
index 0000000000..922353a1f3
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-ansicolors/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+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
new file mode 100644
index 0000000000..b63cc32a23
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-ansicolors_1.1.8.bb
@@ -0,0 +1,25 @@
+DESCRIPTION = "Add ANSI colors and decorations to your strings"
+
+LICENSE = "ISC"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=aef5566ac4fede9815eccf124c281317"
+
+SRC_URI[sha256sum] = "99f94f5e3348a0bcd43c82e5fc4414013ccc19d70bd939ad71e0133ce9c372e0"
+
+PYPI_PACKAGE_EXT = "zip"
+
+inherit pypi setuptools3 ptest
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ cp -f ${S}/test/test.py ${D}${PTEST_PATH}/
+}
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-antlr4-runtime_4.13.1.bb b/meta-python/recipes-devtools/python/python3-antlr4-runtime_4.13.1.bb
new file mode 100644
index 0000000000..431d37c7d7
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-antlr4-runtime_4.13.1.bb
@@ -0,0 +1,11 @@
+SUMMARY = "ANTLR runtime for Python"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=4b18e4a9f93178eaa50a9a37f26da7f7"
+
+SRC_URI[sha256sum] = "3cd282f5ea7cfb841537fe01f143350fdb1c0b1ce7981443a2fa8513fddb6d1a"
+
+PYPI_PACKAGE = "antlr4-python3-runtime"
+
+inherit pypi python_setuptools_build_meta
+
+BBCLASSEXTEND = "nativesdk native"
diff --git a/meta-python/recipes-devtools/python/python3-anyio_4.3.0.bb b/meta-python/recipes-devtools/python/python3-anyio_4.3.0.bb
new file mode 100644
index 0000000000..2c7a9f8cab
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-anyio_4.3.0.bb
@@ -0,0 +1,27 @@
+SUMMARY = "High level compatibility layer for multiple asynchronous event loop implementations"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=c0a769411d2af7894099e8ff75058c9f"
+
+inherit pypi python_setuptools_build_meta
+
+SRC_URI[sha256sum] = "f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"
+
+DEPENDS += " \
+ python3-setuptools-scm-native \
+"
+
+# Don't provide "trio" PACKAGECONFIG as nothing provides "python3-trio" currently.
+# If somebody needs this please feel free to add python3-trio and enable the
+# packageconfig below:
+#PACKAGECONFIG ??= ""
+#PACKAGECONFIG[trio] = ",,,python3-trio"
+
+RDEPENDS:${PN} += "\
+ python3-idna \
+ python3-sniffio \
+ python3-core \
+ python3-numbers \
+ python3-io \
+ python3-asyncio \
+"
diff --git a/meta-python/recipes-devtools/python/python3-anyjson_0.3.3.bb b/meta-python/recipes-devtools/python/python3-anyjson_0.3.3.bb
deleted file mode 100644
index 199e225b23..0000000000
--- a/meta-python/recipes-devtools/python/python3-anyjson_0.3.3.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-anyjson.inc
diff --git a/meta-python/recipes-devtools/python/python3-apiflask_2.1.1.bb b/meta-python/recipes-devtools/python/python3-apiflask_2.1.1.bb
new file mode 100644
index 0000000000..94f2e37a89
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-apiflask_2.1.1.bb
@@ -0,0 +1,18 @@
+SUMMARY = "APIFlask is a lightweight Python web API framework based on Flask and marshmallow-code projects."
+HOMEPAGE = "https://github.com/apiflask/apiflask"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=5f89d1b0dec37448d4f4163dc3c40e64"
+
+inherit pypi setuptools3
+
+PYPI_PACKAGE = "APIFlask"
+
+SRC_URI[sha256sum] = "88db5a539cc155e35d9636d99b434d00ca6c0b23e7c87c8321ec9dc980535366"
+
+RDEPENDS:${PN} += "\
+ python3-flask \
+ python3-flask-marshmallow \
+ python3-webargs \
+ python3-flask-httpauth \
+ python3-apispec \
+ "
diff --git a/meta-python/recipes-devtools/python/python3-apispec_6.4.0.bb b/meta-python/recipes-devtools/python/python3-apispec_6.4.0.bb
new file mode 100644
index 0000000000..a48e1cfaee
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-apispec_6.4.0.bb
@@ -0,0 +1,10 @@
+SUMMARY = "A pluggable API specification generator. Currently supports the OpenAPI Specification (f.k.a. the Swagger specification)."
+HOMEPAGE = "https://github.com/marshmallow-code/apispec"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3d9c303644a2e62578f0347748a80358"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "42b8a6833cf154c9dbd22d006b56bf9c49c972d32d24fe716fd734e0f6b739b8"
+
+RDEPENDS:${PN} += "python3-packaging"
diff --git a/meta-python/recipes-devtools/python/python3-appdirs/run-ptest b/meta-python/recipes-devtools/python/python3-appdirs/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-appdirs/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-appdirs_1.4.3.bb b/meta-python/recipes-devtools/python/python3-appdirs_1.4.3.bb
deleted file mode 100644
index d24e1d8b6a..0000000000
--- a/meta-python/recipes-devtools/python/python3-appdirs_1.4.3.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-appdirs.inc
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
new file mode 100644
index 0000000000..ad07b3b082
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-appdirs_1.4.4.bb
@@ -0,0 +1,24 @@
+SUMMARY = "A small Python module for determining appropriate + platform-specific dirs, e.g. a user data dir."
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=31625363c45eb0c67c630a2f73e438e4"
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+SRC_URI[md5sum] = "d6bca12613174185dd9abc8a29f4f012"
+SRC_URI[sha256sum] = "7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"
+
+inherit pypi setuptools3 ptest
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/test
+ cp -rf ${S}/test/* ${D}${PTEST_PATH}/test/
+}
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-apply-defaults_0.1.6.bb b/meta-python/recipes-devtools/python/python3-apply-defaults_0.1.6.bb
new file mode 100644
index 0000000000..6bf61cfcd3
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-apply-defaults_0.1.6.bb
@@ -0,0 +1,14 @@
+SUMMARY = "Apply values to optional params"
+HOMEPAGE = "https://github.com/bcb/apply_defaults"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=c89120516900f96f4c60d35fdc4c3f15"
+
+PYPI_PACKAGE = "apply_defaults"
+
+SRC_URI[sha256sum] = "3773de3491b94c0fe44310f1a85888389cdc71e1544b343bce0d2bd6991acea5"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-core"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-argcomplete_3.2.3.bb b/meta-python/recipes-devtools/python/python3-argcomplete_3.2.3.bb
new file mode 100644
index 0000000000..8d8c8a4e2e
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-argcomplete_3.2.3.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Argcomplete provides easy, extensible command line tab completion of arguments for your Python script."
+HOMEPAGE = "https://github.com/kislyuk/argcomplete"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=2ee41112a44fe7014dce33e26468ba93"
+
+SRC_URI[sha256sum] = "bf7900329262e481be5a15f56f19736b376df6f82ed27576fa893652c5de6c23"
+
+PYPI_PACKAGE = "argcomplete"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "\
+ python3-core \
+ python3-io \
+"
+
+BBCLASSEXTEND = "native nativesdk"
+
diff --git a/meta-python/recipes-devtools/python/python3-argexec_1.0.3.bb b/meta-python/recipes-devtools/python/python3-argexec_1.0.3.bb
new file mode 100644
index 0000000000..017a7e954b
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-argexec_1.0.3.bb
@@ -0,0 +1,16 @@
+SUMMARY = "Expose your Python functions to the command line with one easy step!"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ea70b07c354e36056bd35e17c9c3face"
+
+inherit pypi setuptools3
+
+SRC_URI[md5sum] = "448635948823309312ea9f70b30b6c2d"
+SRC_URI[sha256sum] = "61f9ae9322e38ae64996848421afbdb018239a99c4e796fe064f172d6c98c3bf"
+
+DEPENDS += "python3-setuptools-scm-native"
+RDEPENDS:${PN} += "\
+ python3-dynamic-dispatch \
+ python3-typeguard \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-argh_0.31.2.bb b/meta-python/recipes-devtools/python/python3-argh_0.31.2.bb
new file mode 100644
index 0000000000..afcd7d9665
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-argh_0.31.2.bb
@@ -0,0 +1,26 @@
+SUMMARY = "An unobtrusive argparse wrapper with natural syntax"
+DESCRIPTION = "Building a command-line interface? Found yourself uttering \
+'argh!' while struggling with the API of argparse? Don't like the complexity \
+but need the power? \
+\
+Everything should be made as simple as possible, but no simpler. \
+\
+—Albert Einstein (probably) \
+\
+Argh is a smart wrapper for argparse. Argparse is a very powerful \
+tool; Argh just makes it easy to use."
+
+LICENSE = "LGPL-3.0-or-later"
+LIC_FILES_CHKSUM = "file://COPYING.LESSER;md5=3000208d539ec061b899bce1d9ce9404 \
+ "
+
+SRC_URI[sha256sum] = "db1c34885804f7d4646c385dc2fb19b45298561322f4c15eae1b133993f9e323"
+
+inherit pypi python_flit_core
+
+RDEPENDS:${PN} += " \
+ python3-argcomplete \
+ python3-logging \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-arpeggio_2.0.2.bb b/meta-python/recipes-devtools/python/python3-arpeggio_2.0.2.bb
new file mode 100644
index 0000000000..3130e2cb96
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-arpeggio_2.0.2.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Arpeggio is a recursive descent parser with memoization based on PEG grammars (aka Packrat parser)"
+HOMEPAGE = "https://pypi.org/project/Arpeggio/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=33b8d1ba459a2fa4d801acfd1d1b7ceb"
+
+SRC_URI[sha256sum] = "c790b2b06e226d2dd468e4fbfb5b7f506cec66416031fde1441cf1de2a0ba700"
+
+PYPI_PACKAGE = "Arpeggio"
+inherit pypi setuptools3
+
+# setup.py of Arpeggio needs this.
+DEPENDS += "\
+ 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-asciitree_0.3.3.bb b/meta-python/recipes-devtools/python/python3-asciitree_0.3.3.bb
new file mode 100644
index 0000000000..833732bd47
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-asciitree_0.3.3.bb
@@ -0,0 +1,9 @@
+SUMMARY = "Draws ASCII trees."
+HOMEPAGE = "http://github.com/mbr/asciitree"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=a985ccb0df374f2a8cab75010bf8db73"
+
+SRC_URI[md5sum] = "2570b31e563b69da1aff54509db8ac6a"
+SRC_URI[sha256sum] = "4aa4b9b649f85e3fcb343363d97564aa1fb62e249677f2e18a96765145cc0f6e"
+
+inherit pypi setuptools3
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.0.1.bb b/meta-python/recipes-devtools/python/python3-asn1crypto_1.0.1.bb
deleted file mode 100644
index cfbe57520c..0000000000
--- a/meta-python/recipes-devtools/python/python3-asn1crypto_1.0.1.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-inherit setuptools3
-require python-asn1crypto.inc
-
-RDEPENDS_${PN}_class-target += " \
- ${PYTHON_PN}-shell \
-"
diff --git a/meta-python/recipes-devtools/python/python3-aspectlib/run-ptest b/meta-python/recipes-devtools/python/python3-aspectlib/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-aspectlib/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-aspectlib_2.0.0.bb b/meta-python/recipes-devtools/python/python3-aspectlib_2.0.0.bb
new file mode 100644
index 0000000000..1341513289
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-aspectlib_2.0.0.bb
@@ -0,0 +1,35 @@
+# Copyright (C) 2021 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+SUMMARY = "An aspect-oriented programming, monkey-patch and decorators library."
+DESCRIPTION = " It is useful when changing behavior in existing code is desired. \
+It includes tools for debugging and testing: simple mock/record and a complete capture/replay framework."
+HOMEPAGE = "https://github.com/ionelmc/python-aspectlib"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=80721ace117fd1f814049ecb81c6be76"
+
+SRC_URI[sha256sum] = "a4b461b9da0b531aebcb93efcde3de808a72c60226dd8d902c467d13faf7ce92"
+
+inherit ptest pypi setuptools3
+
+SRC_URI += "file://run-ptest \
+ "
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+RDEPENDS:${PN}-ptest += "\
+ python3-process-tests \
+ python3-pytest \
+ python3-tornado \
+ python3-unittest-automake-output \
+"
+
+RDEPENDS:${PN} += " \
+ python3-fields \
+ python3-logging \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-astor/0001-rtrip.py-convert-to-python3.patch b/meta-python/recipes-devtools/python/python3-astor/0001-rtrip.py-convert-to-python3.patch
new file mode 100644
index 0000000000..009951864a
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-astor/0001-rtrip.py-convert-to-python3.patch
@@ -0,0 +1,36 @@
+From 1a477968593a14ee9c8597c1ed4e8b61a7731e15 Mon Sep 17 00:00:00 2001
+From: Mingli Yu <mingli.yu@windriver.com>
+Date: Wed, 23 Dec 2020 02:23:13 +0000
+Subject: [PATCH] rtrip.py: convert to python3
+
+As Python 2 reached end of life (EOL), so convert rtrip.py to python3.
+
+Upstream-Status: Submitted [https://github.com/berkerpeksag/astor/pull/192]
+
+Signed-off-by: Mingli Yu <mingli.yu@windriver.com>
+---
+ astor/rtrip.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/astor/rtrip.py b/astor/rtrip.py
+index 8b108e7..e2e30a6 100755
+--- a/astor/rtrip.py
++++ b/astor/rtrip.py
+@@ -1,4 +1,4 @@
+-#! /usr/bin/env python
++#! /usr/bin/env python3
+ # -*- coding: utf-8 -*-
+ """
+ Part of the astor library for Python AST manipulation.
+@@ -160,7 +160,7 @@ def usage(msg):
+
+ Usage:
+
+- python -m astor.rtrip [readonly] [<source>]
++ python3 -m astor.rtrip [readonly] [<source>]
+
+
+ This utility tests round-tripping of Python source to AST
+--
+2.26.2
+
diff --git a/meta-python/recipes-devtools/python/python3-astor_0.7.1.bb b/meta-python/recipes-devtools/python/python3-astor_0.8.1.bb
index c2dc9245c2..bc3315f751 100644
--- a/meta-python/recipes-devtools/python/python3-astor_0.7.1.bb
+++ b/meta-python/recipes-devtools/python/python3-astor_0.8.1.bb
@@ -4,8 +4,10 @@ SECTION = "devel/python"
LICENSE = "BSD-3-Clause"
LIC_FILES_CHKSUM = "file://LICENSE;md5=561205fdabc3ec52cae2d30815b8ade7"
-SRC_URI = "git://github.com/berkerpeksag/astor.git"
-SRCREV ?= "4ca3a26e52f08678854c2841cd0fdf223461e47d"
+SRC_URI = "git://github.com/berkerpeksag/astor.git;branch=master;protocol=https \
+ file://0001-rtrip.py-convert-to-python3.patch \
+"
+SRCREV ?= "c7553c79f9222e20783fe9bd8a553f932e918072"
inherit setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-astroid_1.6.5.bb b/meta-python/recipes-devtools/python/python3-astroid_1.6.5.bb
deleted file mode 100644
index 6e32c288f2..0000000000
--- a/meta-python/recipes-devtools/python/python3-astroid_1.6.5.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-astroid.inc
diff --git a/meta-python/recipes-devtools/python/python3-astroid_3.1.0.bb b/meta-python/recipes-devtools/python/python3-astroid_3.1.0.bb
new file mode 100644
index 0000000000..3c68f1e583
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-astroid_3.1.0.bb
@@ -0,0 +1,37 @@
+SUMMARY = "An abstract syntax tree for Python with inference support."
+HOMEPAGE = "https://pypi.python.org/pypi/astroid"
+SECTION = "devel/python"
+LICENSE = "LGPL-2.1-only"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=a70cf540abf41acb644ac3b621b2fad1"
+
+SRC_URI[sha256sum] = "ac248253bfa4bd924a0de213707e7ebeeb3138abeb48d798784ead1e56d419d4"
+
+inherit pypi python_setuptools_build_meta
+
+DEPENDS += "\
+ python3-pytest-runner-native \
+ python3-wheel-native \
+"
+
+PACKAGES =+ "${PN}-tests"
+
+FILES:${PN}-tests += " \
+ ${PYTHON_SITEPACKAGES_DIR}/astroid/test* \
+ ${PYTHON_SITEPACKAGES_DIR}/astroid/__pycache__/test* \
+"
+
+RDEPENDS:${PN}:class-target += "\
+ python3-lazy-object-proxy \
+ python3-logging \
+ python3-six \
+ python3-wrapt \
+ python3-setuptools \
+ python3-typing-extensions \
+"
+
+RDEPENDS:${PN}-tests:class-target += "\
+ python3-unittest \
+ python3-xml \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-asttokens_2.4.1.bb b/meta-python/recipes-devtools/python/python3-asttokens_2.4.1.bb
new file mode 100644
index 0000000000..dbb2fc0ebe
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-asttokens_2.4.1.bb
@@ -0,0 +1,18 @@
+SUMMARY = "The asttokens module annotates Python abstract syntax trees (ASTs)"
+HOMEPAGE = "https://github.com/gristlabs/asttokens"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e3fc50a88d0a364313df4b21ef20c29e"
+
+PYPI_PACKAGE = "asttokens"
+
+inherit pypi python_setuptools_build_meta
+
+SRC_URI[sha256sum] = "b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"
+
+DEPENDS += "python3-setuptools-scm-native"
+
+RDEPENDS:${PN} += " \
+ python3-six \
+"
+
+BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python3-async-timeout_3.0.1.bb b/meta-python/recipes-devtools/python/python3-async-timeout_3.0.1.bb
deleted file mode 100644
index 7e2ffdb05b..0000000000
--- a/meta-python/recipes-devtools/python/python3-async-timeout_3.0.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-async-timeout.inc
diff --git a/meta-python/recipes-devtools/python/python-async-timeout.inc b/meta-python/recipes-devtools/python/python3-async-timeout_4.0.3.bb
index e71a00262b..3d35780b65 100644
--- a/meta-python/recipes-devtools/python/python-async-timeout.inc
+++ b/meta-python/recipes-devtools/python/python3-async-timeout_4.0.3.bb
@@ -6,14 +6,13 @@ is not suitable. Also it's much faster than asyncio.wait_for() because \
timeout doesn't create a new task."
HOMEPAGE = "https://github.com/aio-libs/async-timeout"
LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=e3fc50a88d0a364313df4b21ef20c29e"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=4fa41f15bb5f23b6d3560c5845eb8d57"
-SRC_URI[md5sum] = "305c4fa529f2485c403d0dbe14390175"
-SRC_URI[sha256sum] = "0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f"
+SRC_URI[sha256sum] = "4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"
PYPI_PACKAGE = "async-timeout"
-inherit pypi
+inherit pypi python_setuptools_build_meta
-RDEPENDS_${PN} = "\
- ${PYTHON_PN}-asyncio \
+RDEPENDS:${PN} = "\
+ python3-asyncio \
"
diff --git a/meta-python/recipes-devtools/python/python3-asyncinotify_4.0.6.bb b/meta-python/recipes-devtools/python/python3-asyncinotify_4.0.6.bb
new file mode 100644
index 0000000000..34f7187d46
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-asyncinotify_4.0.6.bb
@@ -0,0 +1,15 @@
+SUMMARY = "A simple optionally-async python inotify library, focused on simplicity of use and operation, and leveraging modern Python features"
+HOMEPAGE = "https://gitlab.com/Taywee/asyncinotify"
+LICENSE = "MPL-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=f75d2927d3c1ed2414ef72048f5ad640"
+
+SRC_URI[sha256sum] = "c03fdb1a7dbb6bed8ede763e4e0ac224a2a3157bdc51e4ba3832588a3c29904d"
+
+inherit pypi python_setuptools_build_meta
+
+RDEPENDS:${PN} += " \
+ python3-asyncio \
+ python3-core \
+ python3-ctypes \
+ python3-io \
+"
diff --git a/meta-python/recipes-devtools/python/python3-asyncio-glib_0.1.bb b/meta-python/recipes-devtools/python/python3-asyncio-glib_0.1.bb
new file mode 100644
index 0000000000..01dfe51543
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-asyncio-glib_0.1.bb
@@ -0,0 +1,12 @@
+SUMMARY = "An implementation of the Python 3 asyncio event loop on top of GLib"
+LICENSE = "LGPL-2.1-only"
+LIC_FILES_CHKSUM = "file://COPYING.LGPL;md5=4fbd65380cdd255951079008b364516c"
+
+inherit setuptools3 pypi features_check
+
+REQUIRED_DISTRO_FEATURES = "gobject-introspection-data"
+
+SRC_URI[md5sum] = "60153055e76ceaacdfbaeafb03d61dd9"
+SRC_URI[sha256sum] = "fe3ceb2ba5f541330c07ca1bd7ae792468d625bad1acf5354a3a7a0b9fd87521"
+
+RDEPENDS:${PN} += "python3-asyncio python3-pygobject"
diff --git a/meta-python/recipes-devtools/python/python3-asyncio-throttle_1.0.2.bb b/meta-python/recipes-devtools/python/python3-asyncio-throttle_1.0.2.bb
new file mode 100644
index 0000000000..040e70940b
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-asyncio-throttle_1.0.2.bb
@@ -0,0 +1,11 @@
+DESCRIPTION = "Simple, easy-to-use throttler for asyncio."
+HOMEPAGE = "https://github.com/hallazzang/asyncio-throttle"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=c7906e56b70808e1ade6ca05e0bb48d5"
+
+SRC_URI[sha256sum] = "2675282e99d9129ecc446f917e174bc205c65e36c602aa18603b4948567fcbd4"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-asyncio"
diff --git a/meta-python/recipes-devtools/python/python3-atomicwrites_1.3.0.bb b/meta-python/recipes-devtools/python/python3-atomicwrites_1.3.0.bb
deleted file mode 100644
index 9f306e60d6..0000000000
--- a/meta-python/recipes-devtools/python/python3-atomicwrites_1.3.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-atomicwrites.inc
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 e80648c8c3..0000000000
--- a/meta-python/recipes-devtools/python/python3-attr_0.3.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-attr.inc
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-attrs_19.2.0.bb b/meta-python/recipes-devtools/python/python3-attrs_19.2.0.bb
deleted file mode 100644
index c34693f506..0000000000
--- a/meta-python/recipes-devtools/python/python3-attrs_19.2.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-attrs.inc
diff --git a/meta-python/recipes-devtools/python/python3-autobahn_23.6.2.bb b/meta-python/recipes-devtools/python/python3-autobahn_23.6.2.bb
new file mode 100644
index 0000000000..d9cc40b1b4
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-autobahn_23.6.2.bb
@@ -0,0 +1,21 @@
+DESCRIPTION = "WebSocket client & server library, WAMP real-time framework"
+HOMEPAGE = "http://crossbar.io/autobahn"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3e2c2c2cc2915edc5321b0e6b1d3f5f8"
+
+SRC_URI[sha256sum] = "ec9421c52a2103364d1ef0468036e6019ee84f71721e86b36fe19ad6966c1181"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-twisted \
+ python3-zopeinterface \
+ python3-py-ubjson \
+ python3-cbor2 \
+ python3-u-msgpack-python \
+ python3-lz4 \
+ python3-snappy \
+ python3-pyopenssl \
+ python3-txaio \
+ python3-six \
+"
diff --git a/meta-python/recipes-devtools/python/python3-autoflake_2.2.1.bb b/meta-python/recipes-devtools/python/python3-autoflake_2.2.1.bb
new file mode 100644
index 0000000000..7b74308666
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-autoflake_2.2.1.bb
@@ -0,0 +1,12 @@
+SUMMARY = "Removes unused imports and unused variables"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=88246be6a34c1496c253f58599f3db85"
+
+SRC_URI[sha256sum] = "62b7b6449a692c3c9b0c916919bbc21648da7281e8506bcf8d3f8280e431ebc1"
+
+inherit pypi python_hatchling
+
+RDEPENDS:${PN} += "python3-pyflakes"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-automat_0.7.0.bb b/meta-python/recipes-devtools/python/python3-automat_0.7.0.bb
deleted file mode 100644
index 2c747643ff..0000000000
--- a/meta-python/recipes-devtools/python/python3-automat_0.7.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-automat.inc
diff --git a/meta-python/recipes-devtools/python/python3-automat_22.10.0.bb b/meta-python/recipes-devtools/python/python3-automat_22.10.0.bb
new file mode 100644
index 0000000000..9e33fe7831
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-automat_22.10.0.bb
@@ -0,0 +1,16 @@
+DESCRIPTION = "Self-service finite-state machines for the programmer on the go"
+HOMEPAGE = "https://github.com/glyph/Automat"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=4ad213bcca81688e94593e5f60c87477"
+
+SRC_URI[sha256sum] = "e56beb84edad19dcc11d30e8d9b895f75deeb5ef5e96b84a467066b3b84bb04e"
+
+DEPENDS += "python3-setuptools-scm-native"
+
+PYPI_PACKAGE = "Automat"
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "\
+ python3-attrs \
+ python3-six \
+"
diff --git a/meta-python/recipes-devtools/python/python3-awesomeversion_24.2.0.bb b/meta-python/recipes-devtools/python/python3-awesomeversion_24.2.0.bb
new file mode 100644
index 0000000000..8b19605b1e
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-awesomeversion_24.2.0.bb
@@ -0,0 +1,11 @@
+DESCRIPTION = "One version package to rule them all, One version package to find them, One version package to bring them all, and in the darkness bind them."
+HOMEPAGE = "https://pypi.org/project/awesomeversion/"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENCE.md;md5=92622b5a8e216099be741d78328bae5d"
+
+SRC_URI[sha256sum] = "47a6dcbbe2921b725f75106a66ab30f26f1f33dbc5e07bc8e1e39d8eb921f53c"
+
+RDEPENDS:${PN} += "python3-profile python3-logging"
+
+inherit pypi python_poetry_core
diff --git a/meta-python/recipes-devtools/python/python3-aws-iot-device-sdk-python/0001-setup.py-Use-setuptools-instead-of-distutils.patch b/meta-python/recipes-devtools/python/python3-aws-iot-device-sdk-python/0001-setup.py-Use-setuptools-instead-of-distutils.patch
new file mode 100644
index 0000000000..9bc8b36f36
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-aws-iot-device-sdk-python/0001-setup.py-Use-setuptools-instead-of-distutils.patch
@@ -0,0 +1,29 @@
+From 36f8106535150b970c75e8b8456ebc5a7d1dbdb3 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Wed, 2 Mar 2022 11:11:01 -0800
+Subject: [PATCH] setup.py: Use setuptools instead of distutils
+
+distutils is deprecated and will be gone in 3.12+
+
+Upstream-Status: Submitted [https://github.com/aws/aws-iot-device-sdk-python/pull/305]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ setup.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/setup.py b/setup.py
+index 3846bae..d0c2b8d 100644
+--- a/setup.py
++++ b/setup.py
+@@ -3,7 +3,7 @@ sys.path.insert(0, 'AWSIoTPythonSDK')
+ import AWSIoTPythonSDK
+ currentVersion = AWSIoTPythonSDK.__version__
+
+-from distutils.core import setup
++from setuptools import setup
+ setup(
+ name = 'AWSIoTPythonSDK',
+ packages=['AWSIoTPythonSDK', 'AWSIoTPythonSDK.core',
+--
+2.35.1
+
diff --git a/meta-python/recipes-devtools/python/python3-aws-iot-device-sdk-python_1.4.0.bb b/meta-python/recipes-devtools/python/python3-aws-iot-device-sdk-python_1.4.0.bb
deleted file mode 100644
index c43649dbfe..0000000000
--- a/meta-python/recipes-devtools/python/python3-aws-iot-device-sdk-python_1.4.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-aws-iot-device-sdk-python.inc
diff --git a/meta-python/recipes-devtools/python/python-aws-iot-device-sdk-python.inc b/meta-python/recipes-devtools/python/python3-aws-iot-device-sdk-python_1.5.2.bb
index 7423fa76df..bdadf7c774 100644
--- a/meta-python/recipes-devtools/python/python-aws-iot-device-sdk-python.inc
+++ b/meta-python/recipes-devtools/python/python3-aws-iot-device-sdk-python_1.5.2.bb
@@ -1,20 +1,23 @@
DESCRIPTION = "SDK for connecting to AWS IoT using Python."
HOMEPAGE = "https://github.com/aws/aws-iot-device-sdk-python"
LICENSE = "Apache-2.0 & (EPL-1.0 | EDL-1.0)"
-LICENSE_${PN}-examples = "Apache-2.0"
+LICENSE:${PN}-examples = "Apache-2.0"
LIC_FILES_CHKSUM = "\
file://LICENSE.txt;md5=9ac49901b833e769c7d6f21e8dbd7b30 \
file://AWSIoTPythonSDK/core/protocol/paho/client.py;endline=14;md5=5a3c8a1a4bb71bd934f450ecff972ad9 \
"
+SRCREV = "0ea1a2d013529839fc1e7448d19dadff25d581b4"
+SRC_URI = "git://github.com/aws/aws-iot-device-sdk-python;branch=master;protocol=https \
+ file://0001-setup.py-Use-setuptools-instead-of-distutils.patch \
+ "
-SRC_URI[md5sum] = "50a5c46410c2b44b5c09f1ea5eb15a3b"
-SRC_URI[sha256sum] = "b3c8af3ce24eab861447a194f3c382509dd70e90452c86a5426f1e7272460177"
+S = "${WORKDIR}/git"
-inherit pypi
+inherit setuptools3
PYPI_PACKAGE = "AWSIoTPythonSDK"
-do_install_append() {
+do_install:append() {
install -d -m0755 ${D}${datadir}/${BPN}/examples
cp --preserve=mode,timestamps -R ${S}/samples/* ${D}${datadir}/${BPN}/examples
# this requires the full blown AWS Python SDK
@@ -23,19 +26,19 @@ do_install_append() {
PACKAGES =+ "${PN}-examples"
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-crypt \
- ${PYTHON_PN}-datetime \
- ${PYTHON_PN}-io \
- ${PYTHON_PN}-json \
- ${PYTHON_PN}-logging \
- ${PYTHON_PN}-math \
- ${PYTHON_PN}-netclient \
- ${PYTHON_PN}-numbers \
- ${PYTHON_PN}-threading \
+RDEPENDS:${PN} += " \
+ python3-crypt \
+ python3-datetime \
+ python3-io \
+ python3-json \
+ python3-logging \
+ python3-math \
+ python3-netclient \
+ python3-numbers \
+ python3-threading \
"
-RDEPENDS_${PN}-examples += "${PN}"
+RDEPENDS:${PN}-examples += "${PN}"
-FILES_${PN}-examples = "${datadir}/${BPN}/examples"
+FILES:${PN}-examples = "${datadir}/${BPN}/examples"
BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-babel_2.7.0.bb b/meta-python/recipes-devtools/python/python3-babel_2.7.0.bb
deleted file mode 100644
index 0715d59f42..0000000000
--- a/meta-python/recipes-devtools/python/python3-babel_2.7.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-babel.inc
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
new file mode 100644
index 0000000000..d1ac486c05
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-backcall_0.2.0.bb
@@ -0,0 +1,11 @@
+SUMMARY = "Specifications for callback functions passed in to an API"
+HOMEPAGE = "https://github.com/takluyver/backcall"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=40e56b724d016484a7f790ec826d3ffc"
+
+PYPI_PACKAGE = "backcall"
+
+SRC_URI[md5sum] = "1f4c9a370c78743406296f48e56e8821"
+SRC_URI[sha256sum] = "5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"
+
+inherit pypi python_flit_core
diff --git a/meta-python/recipes-devtools/python/python3-bandit_1.5.1.bb b/meta-python/recipes-devtools/python/python3-bandit_1.5.1.bb
deleted file mode 100644
index 3002d5aa5d..0000000000
--- a/meta-python/recipes-devtools/python/python3-bandit_1.5.1.bb
+++ /dev/null
@@ -1,14 +0,0 @@
-SUMMARY = "Security oriented static analyser for python code."
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=1dece7821bf3fd70fe1309eaa37d52a2"
-
-SRC_URI[md5sum] = "81ba3979ded1b421fa8d69e6faa06dcb"
-SRC_URI[sha256sum] = "9413facfe9de1e1bd291d525c784e1beb1a55c9916b51dae12979af63a69ba4c"
-
-DEPENDS = "python3-pbr-native python3-git python3-pbr python3-pyyaml python3-six python3-stevedore"
-
-inherit setuptools3 pypi
-
-RDEPENDS_${PN} += "python3-modules python3-git python3-pbr python3-pyyaml python3-six python3-stevedore"
-
-BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python3-bandit_1.7.8.bb b/meta-python/recipes-devtools/python/python3-bandit_1.7.8.bb
new file mode 100644
index 0000000000..8b0968857f
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-bandit_1.7.8.bb
@@ -0,0 +1,19 @@
+SUMMARY = "Security oriented static analyser for python code."
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=34400b68072d710fecd0a2940a0d1658"
+
+SRC_URI[sha256sum] = "36de50f720856ab24a24dbaa5fee2c66050ed97c1477e0a1159deab1775eab6b"
+
+DEPENDS = "python3-pbr-native python3-git python3-pbr python3-pyyaml python3-six python3-stevedore"
+
+inherit setuptools3 pypi
+
+RDEPENDS:${PN} += "\
+ python3-git \
+ python3-modules \
+ python3-pbr \
+ python3-pyyaml \
+ python3-rich \
+ python3-six \
+ python3-stevedore \
+ "
diff --git a/meta-python/recipes-devtools/python/python3-bcrypt_3.1.4.bb b/meta-python/recipes-devtools/python/python3-bcrypt_3.1.4.bb
deleted file mode 100644
index d2ec9e386c..0000000000
--- a/meta-python/recipes-devtools/python/python3-bcrypt_3.1.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-bcrypt.inc
diff --git a/meta-python/recipes-devtools/python/python3-beautifulsoup4_4.12.3.bb b/meta-python/recipes-devtools/python/python3-beautifulsoup4_4.12.3.bb
new file mode 100644
index 0000000000..14dedba922
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-beautifulsoup4_4.12.3.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Screen-scraping library"
+HOMEPAGE = " https://www.crummy.com/software/BeautifulSoup/bs4"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=96e0034f7c9443910c486773aa1ed9ac"
+
+SRC_URI[sha256sum] = "74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"
+
+inherit pypi python_hatchling
+
+RDEPENDS:${PN} = "\
+ python3-html5lib \
+ python3-lxml \
+ python3-soupsieve \
+ python3-html \
+ python3-logging \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-beautifulsoup4_4.8.1.bb b/meta-python/recipes-devtools/python/python3-beautifulsoup4_4.8.1.bb
deleted file mode 100644
index d98df11e3d..0000000000
--- a/meta-python/recipes-devtools/python/python3-beautifulsoup4_4.8.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-beautifulsoup4.inc
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 1c55871b10..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
@@ -1,2 +1,18 @@
+SUMMARY = "A behavior-driven development framework, Python style"
+HOMEPAGE = "https://github.com/behave/behave"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d950439e8ea6ed233e4288f5e1a49c06"
+
+PV .= "+git${SRCREV}"
+SRCREV = "9520119376046aeff73804b5f1ea05d87a63f370"
+SRC_URI += "git://github.com/behave/behave;branch=master;protocol=https"
+
+S = "${WORKDIR}/git"
+
inherit setuptools3
-require python-behave.inc
+
+RDEPENDS:${PN} += " \
+ python3-parse-type \
+ python3-setuptools \
+ python3-six \
+ "
diff --git a/meta-python/recipes-devtools/python/python3-betamax/0001-Drop-ptests-fixtures-and-recorde_modes.patch b/meta-python/recipes-devtools/python/python3-betamax/0001-Drop-ptests-fixtures-and-recorde_modes.patch
new file mode 100644
index 0000000000..52745a9373
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-betamax/0001-Drop-ptests-fixtures-and-recorde_modes.patch
@@ -0,0 +1,343 @@
+From e5aa66b1af2d49f159c4daefc598f96744ee988d Mon Sep 17 00:00:00 2001
+From: Zhixiong Chi <zhixiong.chi@windriver.com>
+Date: Thu, 29 Feb 2024 12:31:58 -0800
+Subject: [PATCH] [PATCH] Drop ptests fixtures and recorde_modes
+
+The usage of fixture in test_fixtures has been deprecated.
+See https://docs.pytest.org/en/stable/explanation/fixtures.html and
+https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
+for more information about fixtures.
+Meanwhile the test_record_modes relies on httpbin.org which has been sold and
+re-sold several times, and it adds X-Amzn-Trace-Id header that can possibly
+diff for each request.
+It leads to ptest failure, so drop it now until we find the solution.
+
+Upstream-Status: Inappropriate [OE-Specific]
+
+Signed-off-by: Zhixiong Chi <zhixiong.chi@windriver.com>
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ tests/integration/test_fixtures.py | 60 -----------
+ tests/integration/test_record_modes.py | 141 -------------------------
+ tests/unit/test_fixtures.py | 94 -----------------
+ 3 files changed, 295 deletions(-)
+ delete mode 100644 tests/integration/test_fixtures.py
+ delete mode 100644 tests/integration/test_record_modes.py
+ delete mode 100644 tests/unit/test_fixtures.py
+
+diff --git a/tests/integration/test_fixtures.py b/tests/integration/test_fixtures.py
+deleted file mode 100644
+index fc3d1e7..0000000
+--- a/tests/integration/test_fixtures.py
++++ /dev/null
+@@ -1,60 +0,0 @@
+-import os.path
+-
+-import pytest
+-
+-
+-@pytest.mark.usefixtures('betamax_session')
+-class TestPyTestFixtures:
+- @pytest.fixture(autouse=True)
+- def setup(self, request):
+- """After test hook to assert everything."""
+- def finalizer():
+- test_dir = os.path.abspath('.')
+- cassette_name = ('tests.integration.test_fixtures.' # Module name
+- 'TestPyTestFixtures.' # Class name
+- 'test_pytest_fixture' # Test function name
+- '.json')
+- file_name = os.path.join(test_dir, 'tests', 'cassettes',
+- cassette_name)
+- assert os.path.exists(file_name) is True
+-
+- request.addfinalizer(finalizer)
+-
+- def test_pytest_fixture(self, betamax_session):
+- """Exercise the fixture itself."""
+- resp = betamax_session.get('https://httpbin.org/get')
+- assert resp.ok
+-
+-
+-@pytest.mark.usefixtures('betamax_parametrized_session')
+-class TestPyTestParametrizedFixtures:
+- @pytest.fixture(autouse=True)
+- def setup(self, request):
+- """After test hook to assert everything."""
+- def finalizer():
+- test_dir = os.path.abspath('.')
+- cassette_name = ('tests.integration.test_fixtures.' # Module name
+- 'TestPyTestParametrizedFixtures.' # Class name
+- 'test_pytest_fixture' # Test function name
+- '[https---httpbin.org-get]' # Parameter
+- '.json')
+- file_name = os.path.join(test_dir, 'tests', 'cassettes',
+- cassette_name)
+- assert os.path.exists(file_name) is True
+-
+- request.addfinalizer(finalizer)
+-
+- @pytest.mark.parametrize('url', ('https://httpbin.org/get',))
+- def test_pytest_fixture(self, betamax_parametrized_session, url):
+- """Exercise the fixture itself."""
+- resp = betamax_parametrized_session.get(url)
+- assert resp.ok
+-
+-
+-@pytest.mark.parametrize('problematic_arg', [r'aaa\bbb', 'ccc:ddd', 'eee*fff'])
+-def test_pytest_parametrize_with_filesystem_problematic_chars(
+- betamax_parametrized_session, problematic_arg):
+- """
+- Exercice parametrized args containing characters which might cause
+- problems when getting translated into file names. """
+- assert True
+diff --git a/tests/integration/test_record_modes.py b/tests/integration/test_record_modes.py
+deleted file mode 100644
+index 988b851..0000000
+--- a/tests/integration/test_record_modes.py
++++ /dev/null
+@@ -1,141 +0,0 @@
+-import re
+-
+-from betamax import Betamax, BetamaxError
+-
+-from tests.integration.helper import IntegrationHelper
+-
+-
+-class TestRecordOnce(IntegrationHelper):
+- def test_records_new_interaction(self):
+- s = self.session
+- with Betamax(s).use_cassette('test_record_once') as betamax:
+- self.cassette_path = betamax.current_cassette.cassette_path
+- assert betamax.current_cassette.is_empty() is True
+- r = s.get('http://httpbin.org/get')
+- assert r.status_code == 200
+- assert betamax.current_cassette.is_empty() is True
+- assert betamax.current_cassette.interactions != []
+-
+- def test_replays_response_from_cassette(self):
+- s = self.session
+- with Betamax(s).use_cassette('test_replays_response') as betamax:
+- self.cassette_path = betamax.current_cassette.cassette_path
+- assert betamax.current_cassette.is_empty() is True
+- r0 = s.get('http://httpbin.org/get')
+- assert r0.status_code == 200
+- assert betamax.current_cassette.interactions != []
+- assert len(betamax.current_cassette.interactions) == 1
+- r1 = s.get('http://httpbin.org/get')
+- assert len(betamax.current_cassette.interactions) == 2
+- assert r1.status_code == 200
+- r0_headers = r0.headers.copy()
+- r0_headers.pop('Date')
+- r0_headers.pop('Age', None)
+- r0_headers.pop('X-Processed-Time', None)
+- r1_headers = r1.headers.copy()
+- r1_headers.pop('Date')
+- r1_headers.pop('Age', None)
+- r1_headers.pop('X-Processed-Time', None)
+- # NOTE(sigmavirus24): This fails if the second request is
+- # technically a second later. Ignoring the Date headers allows
+- # this test to succeed.
+- # NOTE(hroncok): httpbin.org added X-Processed-Time header that
+- # can possibly differ (and often does)
+- r0_content = r0.content.decode(encoding='utf-8', errors='strict')
+- r1_content = r1.content.decode(encoding='utf-8', errors='strict')
+- r0_content = re.sub('"X-Amzn-Trace-Id": "[^"]+"', '"X-Amzn-Trace-Id": ""', r0_content)
+- r1_content = re.sub('"X-Amzn-Trace-Id": "[^"]+"', '"X-Amzn-Trace-Id": ""', r1_content)
+- # NOTE(jhatler): httpbin.org added "X-Amzn-Trace-Id" to their
+- # response, which is a unique ID that will differ between requests.
+- # We remove it from the response body before comparing.
+- assert r0_headers == r1_headers
+- assert r0_content == r1_content
+-
+-
+-class TestRecordNone(IntegrationHelper):
+- def test_raises_exception_when_no_interactions_present(self):
+- s = self.session
+- with Betamax(s) as betamax:
+- betamax.use_cassette('test', record='none')
+- self.cassette_created = False
+- assert betamax.current_cassette is not None
+- self.assertRaises(BetamaxError, s.get, 'http://httpbin.org/get')
+-
+- def test_record_none_does_not_create_cassettes(self):
+- s = self.session
+- with Betamax(s) as betamax:
+- self.assertRaises(ValueError, betamax.use_cassette,
+- 'test_record_none', record='none')
+- self.cassette_created = False
+-
+-
+-class TestRecordNewEpisodes(IntegrationHelper):
+- def setUp(self):
+- super(TestRecordNewEpisodes, self).setUp()
+- with Betamax(self.session).use_cassette('test_record_new'):
+- self.session.get('http://httpbin.org/get')
+- self.session.get('http://httpbin.org/redirect/2')
+-
+- def test_records_new_events_with_existing_cassette(self):
+- s = self.session
+- opts = {'record': 'new_episodes'}
+- with Betamax(s).use_cassette('test_record_new', **opts) as betamax:
+- cassette = betamax.current_cassette
+- self.cassette_path = cassette.cassette_path
+- assert cassette.interactions != []
+- assert len(cassette.interactions) == 4
+- assert cassette.is_empty() is False
+- s.get('https://httpbin.org/get')
+- assert len(cassette.interactions) == 5
+-
+- with Betamax(s).use_cassette('test_record_new') as betamax:
+- cassette = betamax.current_cassette
+- assert len(cassette.interactions) == 5
+- r = s.get('https://httpbin.org/get')
+- assert r.status_code == 200
+-
+-
+-class TestRecordNewEpisodesCreatesCassettes(IntegrationHelper):
+- def test_creates_new_cassettes(self):
+- recorder = Betamax(self.session)
+- opts = {'record': 'new_episodes'}
+- cassette_name = 'test_record_new_makes_new_cassettes'
+- with recorder.use_cassette(cassette_name, **opts) as betamax:
+- self.cassette_path = betamax.current_cassette.cassette_path
+- self.session.get('https://httpbin.org/get')
+-
+-
+-class TestRecordAll(IntegrationHelper):
+- def setUp(self):
+- super(TestRecordAll, self).setUp()
+- with Betamax(self.session).use_cassette('test_record_all'):
+- self.session.get('http://httpbin.org/get')
+- self.session.get('http://httpbin.org/redirect/2')
+- self.session.get('http://httpbin.org/get')
+-
+- def test_records_new_interactions(self):
+- s = self.session
+- opts = {'record': 'all'}
+- with Betamax(s).use_cassette('test_record_all', **opts) as betamax:
+- cassette = betamax.current_cassette
+- self.cassette_path = cassette.cassette_path
+- assert cassette.interactions != []
+- assert len(cassette.interactions) == 5
+- assert cassette.is_empty() is False
+- s.post('http://httpbin.org/post', data={'foo': 'bar'})
+- assert len(cassette.interactions) == 6
+-
+- with Betamax(s).use_cassette('test_record_all') as betamax:
+- assert len(betamax.current_cassette.interactions) == 6
+-
+- def test_replaces_old_interactions(self):
+- s = self.session
+- opts = {'record': 'all'}
+- with Betamax(s).use_cassette('test_record_all', **opts) as betamax:
+- cassette = betamax.current_cassette
+- self.cassette_path = cassette.cassette_path
+- assert cassette.interactions != []
+- assert len(cassette.interactions) == 5
+- assert cassette.is_empty() is False
+- s.get('http://httpbin.org/get')
+- assert len(cassette.interactions) == 5
+diff --git a/tests/unit/test_fixtures.py b/tests/unit/test_fixtures.py
+deleted file mode 100644
+index 41f33eb..0000000
+--- a/tests/unit/test_fixtures.py
++++ /dev/null
+@@ -1,94 +0,0 @@
+-try:
+- import unittest.mock as mock
+-except ImportError:
+- import mock
+-
+-import pytest
+-import unittest
+-
+-import requests
+-
+-import betamax
+-from betamax.fixtures import pytest as pytest_fixture
+-from betamax.fixtures import unittest as unittest_fixture
+-
+-
+-class TestPyTestFixture(unittest.TestCase):
+- def setUp(self):
+- self.mocked_betamax = mock.MagicMock()
+- self.patched_betamax = mock.patch.object(
+- betamax.recorder, 'Betamax', return_value=self.mocked_betamax)
+- self.patched_betamax.start()
+-
+- def tearDown(self):
+- self.patched_betamax.stop()
+-
+- def test_adds_stop_as_a_finalizer(self):
+- # Mock a pytest request object
+- request = mock.MagicMock()
+- request.cls = request.module = None
+- request.node.name = request.function.__name__ = 'test'
+-
+- pytest_fixture._betamax_recorder(request)
+- assert request.addfinalizer.called is True
+- request.addfinalizer.assert_called_once_with(self.mocked_betamax.stop)
+-
+- def test_auto_starts_the_recorder(self):
+- # Mock a pytest request object
+- request = mock.MagicMock()
+- request.cls = request.module = None
+- request.node.name = request.function.__name__ = 'test'
+-
+- pytest_fixture._betamax_recorder(request)
+- self.mocked_betamax.start.assert_called_once_with()
+-
+-
+-class FakeBetamaxTestCase(unittest_fixture.BetamaxTestCase):
+- def test_fake(self):
+- pass
+-
+-
+-class TestUnittestFixture(unittest.TestCase):
+- def setUp(self):
+- self.mocked_betamax = mock.MagicMock()
+- self.patched_betamax = mock.patch.object(
+- betamax.recorder, 'Betamax', return_value=self.mocked_betamax)
+- self.betamax = self.patched_betamax.start()
+- self.fixture = FakeBetamaxTestCase(methodName='test_fake')
+-
+- def tearDown(self):
+- self.patched_betamax.stop()
+-
+- def test_setUp(self):
+- self.fixture.setUp()
+-
+- self.mocked_betamax.use_cassette.assert_called_once_with(
+- 'FakeBetamaxTestCase.test_fake'
+- )
+- self.mocked_betamax.start.assert_called_once_with()
+-
+- def test_setUp_rejects_arbitrary_session_classes(self):
+- self.fixture.SESSION_CLASS = object
+-
+- with pytest.raises(AssertionError):
+- self.fixture.setUp()
+-
+- def test_setUp_accepts_session_subclasses(self):
+- class TestSession(requests.Session):
+- pass
+-
+- self.fixture.SESSION_CLASS = TestSession
+-
+- self.fixture.setUp()
+-
+- assert self.betamax.called is True
+- call_kwargs = self.betamax.call_args[-1]
+- assert isinstance(call_kwargs['session'], TestSession)
+-
+- def test_tearDown_calls_stop(self):
+- recorder = mock.Mock()
+- self.fixture.recorder = recorder
+-
+- self.fixture.tearDown()
+-
+- recorder.stop.assert_called_once_with()
+--
+2.44.0
+
diff --git a/meta-python/recipes-devtools/python/python3-betamax/run-ptest b/meta-python/recipes-devtools/python/python3-betamax/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-betamax/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-betamax_0.9.0.bb b/meta-python/recipes-devtools/python/python3-betamax_0.9.0.bb
new file mode 100644
index 0000000000..a0454686ee
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-betamax_0.9.0.bb
@@ -0,0 +1,27 @@
+DESCRIPTION = "VCR imitation for python requests"
+HOMEPAGE = "https://github.com/betamaxpy/betamax"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=61c15f0c146c5fb1a8ce8ba2f310d73c"
+
+SRC_URI += " \
+ file://run-ptest \
+ file://0001-Drop-ptests-fixtures-and-recorde_modes.patch \
+"
+SRC_URI[sha256sum] = "82316e1679bc6879e3c83318d016b54b7c9225ff08c4462de4813e22038d5f94"
+
+inherit pypi setuptools3 ptest
+
+RDEPENDS:${PN} += " \
+ python3-requests \
+ python3-unittest \
+"
+
+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-bidict_0.23.0.bb b/meta-python/recipes-devtools/python/python3-bidict_0.23.0.bb
new file mode 100644
index 0000000000..5667e4927f
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-bidict_0.23.0.bb
@@ -0,0 +1,11 @@
+SUMMARY = "The bidirectional mapping library for Python."
+DESCRIPTION = "The bidirectional mapping library for Python."
+HOMEPAGE = "https://bidict.readthedocs.io/"
+LICENSE = "MPL-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e907308cc9356afa99ac0eec6b20211b"
+
+SRC_URI[sha256sum] = "3959ca59d4d6997702d642bf1e5fd93cba299863723fc289545198f70c468578"
+
+inherit pypi python_setuptools_build_meta
+
+DEPENDS += "python3-setuptools-scm-native"
diff --git a/meta-python/recipes-devtools/python/python3-binwalk_2.3.4.bb b/meta-python/recipes-devtools/python/python3-binwalk_2.3.4.bb
new file mode 100644
index 0000000000..45b1ff5145
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-binwalk_2.3.4.bb
@@ -0,0 +1,25 @@
+SUMMARY = "Firmware analysis tool"
+DESCRIPTION = "This package contains Python Binwalk tool. Binwalk is a fast, \
+easy to use tool for analyzing, reverse engineering, and extracting firmware \
+images."
+HOMEPAGE = "https://github.com/ReFirmLabs/binwalk"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=65bbee055d3ea3bfc475f07aecf4de64"
+
+SRC_URI = "git://github.com/ReFirmLabs/binwalk;protocol=https;branch=master"
+
+SRCREV = "cddfede795971045d99422bd7a9676c8803ec5ee"
+
+S = "${WORKDIR}/git"
+
+UPSTREAM_CHECK_GITTAGREGEX = "v(?P<pver>\d+(\.\d+)+)"
+
+inherit setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-compression \
+ python3-logging \
+ python3-netserver \
+ python3-setuptools \
+ python3-stringold \
+"
diff --git a/meta-python/recipes-devtools/python/python3-bitarray_0.8.3.bb b/meta-python/recipes-devtools/python/python3-bitarray_0.8.3.bb
deleted file mode 100644
index 7ee444dc9e..0000000000
--- a/meta-python/recipes-devtools/python/python3-bitarray_0.8.3.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-bitarray.inc
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_4.1.4.bb b/meta-python/recipes-devtools/python/python3-bitstring_4.1.4.bb
new file mode 100644
index 0000000000..0777b6cffb
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-bitstring_4.1.4.bb
@@ -0,0 +1,19 @@
+SUMMARY = "Simple construction, analysis and modification of binary data."
+HOMEPAGE = "https://github.com/scott-griffiths/bitstring"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=661f450e2c0aef39b4b15597333444a7"
+
+SRC_URI[sha256sum] = "94f3f1c45383ebe8fd4a359424ffeb75c2f290760ae8fcac421b44f89ac85213"
+
+PYPI_PACKAGE = "bitstring"
+
+inherit pypi python_poetry_core
+
+RDEPENDS:${PN} = "\
+ python3-core \
+ python3-io \
+ python3-mmap \
+ python3-numbers \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-bitstruct_8.19.0.bb b/meta-python/recipes-devtools/python/python3-bitstruct_8.19.0.bb
new file mode 100644
index 0000000000..6401322e2c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-bitstruct_8.19.0.bb
@@ -0,0 +1,13 @@
+DESCRIPTION = "This module performs conversions between Python values and C bit field structs represented as Python byte strings."
+HOMEPAGE = "https://github.com/eerimoq/bitstruct"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d9aa4ec07de78abae21c490c9ffe61bd"
+
+SRC_URI[sha256sum] = "d75ba9dded85c17e885a209a00eb8e248ee40762149f2f2a79360ca857467dac"
+
+PYPI_PACKAGE = "bitstruct"
+
+inherit pypi setuptools3
+
+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.21.1.bb b/meta-python/recipes-devtools/python/python3-bleak_0.21.1.bb
new file mode 100644
index 0000000000..96f3fcbcfe
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-bleak_0.21.1.bb
@@ -0,0 +1,33 @@
+SUMMARY = "Bleak is a GATT client software, capable of connecting to BLE devices acting as GATT servers."
+HOMEPAGE = "https://github.com/hbldh/bleak"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=bcbc2069a86cba1b5e47253679f66ed7"
+
+SRCREV = "054b092e19c7a45d5ea07d8948022f54117fe5e8"
+PYPI_SRC_URI = "git://github.com/hbldh/bleak.git;protocol=https;branch=develop"
+
+inherit pypi python_poetry_core ptest
+
+S = "${WORKDIR}/git"
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-pytest-asyncio \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+RDEPENDS:${PN} += " \
+ python3-core (>3.7) \
+ python3-async-timeout \
+ python3-dbus-fast \
+ python3-xml \
+"
diff --git a/meta-python/recipes-devtools/python/python3-blinker/run-ptest b/meta-python/recipes-devtools/python/python3-blinker/run-ptest
new file mode 100644
index 0000000000..69cd362f69
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-blinker/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+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 924b3cf51d..0000000000
--- a/meta-python/recipes-devtools/python/python3-blinker_1.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-blinker.inc
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-brotli_1.1.0.bb b/meta-python/recipes-devtools/python/python3-brotli_1.1.0.bb
new file mode 100644
index 0000000000..678f12b730
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-brotli_1.1.0.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Brotli compression format"
+HOMEPAGE = "https://pypi.org/project/Brotli/"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=941ee9cd1609382f946352712a319b4b"
+
+PYPI_PACKAGE = "Brotli"
+
+SRC_URI[sha256sum] = "81de08ac11bcb85841e440c13611c00b67d3bf82698314928d0b676362546724"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} = "\
+ python3-cffi \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-cachecontrol_0.14.0.bb b/meta-python/recipes-devtools/python/python3-cachecontrol_0.14.0.bb
new file mode 100644
index 0000000000..1e374529cc
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-cachecontrol_0.14.0.bb
@@ -0,0 +1,28 @@
+SUMMARY = "httplib2 caching for requests"
+HOMEPAGE = "https://pypi.org/project/CacheControl/"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=12;endline=12;md5=e2fd6ddcf506e08972d5ba4b93c0022e"
+
+SRC_URI[sha256sum] = "7db1195b41c81f8274a7bbd97c956f44e8348265a1bc7641c37dfebc39f0c938"
+
+inherit pypi python_poetry_core
+
+UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/CacheControl/"
+UPSTREAM_CHECK_REGEX = "/CacheControl/(?P<pver>(\d+[\.\-_]*)+)"
+
+RDEPENDS:${PN} += "\
+ python3-crypt \
+ python3-datetime \
+ python3-email \
+ python3-lockfile \
+ python3-json \
+ python3-logging \
+ python3-msgpack \
+ python3-netclient \
+ python3-pickle \
+ python3-requests \
+ python3-urllib3 \
+ python3-mmap \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-cached-property_1.5.2.bb b/meta-python/recipes-devtools/python/python3-cached-property_1.5.2.bb
new file mode 100644
index 0000000000..059c34a29d
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-cached-property_1.5.2.bb
@@ -0,0 +1,12 @@
+SUMMARY = "A decorator for caching properties in classes."
+DESCRIPTION = "Makes caching of time or computational expensive properties quick and easy."
+HOMEPAGE = "https://pypi.org/project/cached-property/"
+SECTION = "devel/python"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=db7ff60c4e14f58534201242803d8abc"
+
+SRC_URI[sha256sum] = "9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"
+
+inherit pypi setuptools3
+
+BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python3-cachetools/run-ptest b/meta-python/recipes-devtools/python/python3-cachetools/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-cachetools/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-cachetools_3.1.1.bb b/meta-python/recipes-devtools/python/python3-cachetools_3.1.1.bb
deleted file mode 100644
index 76b2f6785c..0000000000
--- a/meta-python/recipes-devtools/python/python3-cachetools_3.1.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-cachetools.inc
diff --git a/meta-python/recipes-devtools/python/python3-cachetools_5.3.3.bb b/meta-python/recipes-devtools/python/python3-cachetools_5.3.3.bb
new file mode 100644
index 0000000000..3ef75d4703
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-cachetools_5.3.3.bb
@@ -0,0 +1,33 @@
+SUMMARY = "Extensible memoizing collections and decorators"
+HOMEPAGE = "https://github.com/tkem/cachetools"
+DESCRIPTION = "This module provides various memoizing \
+collections and decorators, including variants of the \
+Python 3 Standard Library @lru_cache function decorator."
+SECTION = "devel/python"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=539275e657c6b7af026bb908356f7541"
+
+inherit pypi python_setuptools_build_meta ptest
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN} += " \
+ python3-math \
+"
+
+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/
+}
+
+SRC_URI[sha256sum] = "ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-can_2.2.1.bb b/meta-python/recipes-devtools/python/python3-can_2.2.1.bb
deleted file mode 100644
index aaa9e811ce..0000000000
--- a/meta-python/recipes-devtools/python/python3-can_2.2.1.bb
+++ /dev/null
@@ -1,7 +0,0 @@
-require python-can.inc
-inherit pypi setuptools3
-
-RDEPENDS_${PN}_class-target += "\
- ${PYTHON_PN}-codecs \
- ${PYTHON_PN}-compression \
-"
diff --git a/meta-python/recipes-devtools/python/python3-can_4.2.2.bb b/meta-python/recipes-devtools/python/python3-can_4.2.2.bb
new file mode 100644
index 0000000000..9ca926d66c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-can_4.2.2.bb
@@ -0,0 +1,29 @@
+SUMMARY = "Controller Area Network (CAN) interface module for Python"
+SECTION = "devel/python"
+LICENSE = "LGPL-3.0-only"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=e6a600fd5e1d9cbde2d983680233ad02"
+
+SRC_URI[sha256sum] = "6ad50f4613289f3c4d276b6d2ac8901d776dcb929994cce93f55a69e858c595f"
+
+PYPI_PACKAGE="python-can"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-aenum \
+ python3-asyncio \
+ python3-codecs \
+ python3-compression \
+ python3-ctypes \
+ python3-fcntl \
+ python3-json \
+ python3-logging \
+ python3-misc \
+ python3-netserver \
+ python3-packaging \
+ python3-pkg-resources \
+ python3-setuptools \
+ python3-sqlite3 \
+ python3-typing-extensions \
+ python3-wrapt \
+"
diff --git a/meta-python/recipes-devtools/python/python3-cantools_39.4.4.bb b/meta-python/recipes-devtools/python/python3-cantools_39.4.4.bb
new file mode 100644
index 0000000000..ebae6b63e6
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-cantools_39.4.4.bb
@@ -0,0 +1,24 @@
+DESCRIPTION = "CAN BUS tools in Python 3."
+HOMEPAGE = "https://github.com/eerimoq/cantools"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d9aa4ec07de78abae21c490c9ffe61bd"
+
+SRC_URI[sha256sum] = "6e8e918b6671a62a9f3990546ece5623e1deb71defb1cef85a9955ac301da99e"
+
+PYPI_PACKAGE = "cantools"
+
+inherit pypi python_poetry_core
+
+DEPENDS += "python3-setuptools-scm-native"
+
+RDEPENDS:${PN} += "\
+ python3-can \
+ python3-bitstruct \
+ python3-core \
+ python3-textparser \
+ python3-typing-extensions \
+ python3-diskcache \
+ python3-asyncio \
+"
+
+CLEANBROKEN = "1"
diff --git a/meta-python/recipes-devtools/python/python3-cassandra-driver_3.14.0.bb b/meta-python/recipes-devtools/python/python3-cassandra-driver_3.14.0.bb
deleted file mode 100644
index 34f149d3f5..0000000000
--- a/meta-python/recipes-devtools/python/python3-cassandra-driver_3.14.0.bb
+++ /dev/null
@@ -1,8 +0,0 @@
-inherit setuptools3
-require python-cassandra-driver.inc
-
-# Requires concurrent which is currently in -misc
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-misc \
- ${PYTHON_PN}-numbers \
-"
diff --git a/meta-python/recipes-devtools/python/python-cassandra-driver.inc b/meta-python/recipes-devtools/python/python3-cassandra-driver_3.29.1.bb
index 53ebfec337..3003e84acf 100644
--- a/meta-python/recipes-devtools/python/python-cassandra-driver.inc
+++ b/meta-python/recipes-devtools/python/python3-cassandra-driver_3.29.1.bb
@@ -8,26 +8,21 @@ LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE;md5=2ee41112a44fe7014dce33e26468ba93"
SRCNAME = "cassandra-driver"
-SRC_URI[md5sum] = "c5bed026bf48c821424c1f6296193908"
-SRC_URI[sha256sum] = "b65218e2582277f5b77d1436e420db8616f63e3437a9e839cdcd7172d760e861"
+SRC_URI[sha256sum] = "38e9c2a2f2a9664bb03f1f852d5fccaeff2163942b5db35dffcf8bf32a51cfe5"
-DISTUTILS_BUILD_ARGS += " \
- --no-libev \
-"
-DISTUTILS_INSTALL_ARGS += " \
- --no-libev \
-"
-
-inherit pypi
+inherit pypi setuptools3
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-cython \
- ${PYTHON_PN}-multiprocessing \
- ${PYTHON_PN}-six \
- ${PYTHON_PN}-json \
+RDEPENDS:${PN} += "\
+ python3-cython \
+ python3-geomet \
+ python3-json \
+ python3-misc \
+ python3-multiprocessing \
+ python3-numbers \
+ python3-six \
libevent \
"
DEPENDS += "\
- ${PYTHON_PN}-cython \
+ python3-cython \
"
diff --git a/meta-python/recipes-devtools/python/python3-casttube_0.2.1.bb b/meta-python/recipes-devtools/python/python3-casttube_0.2.1.bb
new file mode 100644
index 0000000000..af3daf016e
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-casttube_0.2.1.bb
@@ -0,0 +1,16 @@
+SUMMARY = "YouTube Chromecast API"
+HOMEPAGE = "https://github.com/ur1katz/casttube"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d3aafde5479a4102b867156e2527a34e"
+
+SRC_URI[sha256sum] = "54d2af8c7949aa9c5db87fb11ef0a478a5d3e7ac6d2d2ac8dd1711e3a516fc82"
+
+inherit pypi setuptools3
+
+FILES:${PN} += "\
+ /usr/LICENSE \
+"
+
+RDEPENDS:${PN} = "\
+ python3-requests \
+"
diff --git a/meta-python/recipes-devtools/python/python3-cbor2/run-ptest b/meta-python/recipes-devtools/python/python3-cbor2/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-cbor2/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-cbor2_5.6.3.bb b/meta-python/recipes-devtools/python/python3-cbor2_5.6.3.bb
new file mode 100644
index 0000000000..c9c98b6fb5
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-cbor2_5.6.3.bb
@@ -0,0 +1,33 @@
+DESCRIPTION = "An implementation of RFC 7049 - Concise Binary Object Representation (CBOR)."
+DEPENDS +="python3-setuptools-scm-native"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+SRC_URI[sha256sum] = "e6f0ae2751c2d333a960e0807c0611494eb1245631a167965acbc100509455d3"
+
+inherit pypi python_setuptools_build_meta ptest
+
+DEPENDS += "python3-setuptools-scm-native"
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-hypothesis \
+ python3-pytest \
+ python3-unittest-automake-output \
+ python3-unixadmin \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+RDEPENDS:${PN} += " \
+ python3-datetime \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-cchardet_2.1.7.bb b/meta-python/recipes-devtools/python/python3-cchardet_2.1.7.bb
new file mode 100644
index 0000000000..3d9194c219
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-cchardet_2.1.7.bb
@@ -0,0 +1,12 @@
+SUMMARY = "Universal character encoding detector"
+HOMEPAGE = "https://github.com/PyYoshi/cChardet"
+LICENSE = "MPL-1.1"
+LIC_FILES_CHKSUM = "file://COPYING;md5=6ecda54f6f525388d71d6b3cd92f7474"
+
+SRC_URI[sha256sum] = "c428b6336545053c2589f6caf24ea32276c6664cb86db817e03a94c60afa0eaf"
+
+inherit pypi setuptools3
+
+BBCLASSEXTEND = "native nativesdk"
+
+DEPENDS += "python3-cython-native"
diff --git a/meta-python/recipes-devtools/python/python3-cerberus_1.3.5.bb b/meta-python/recipes-devtools/python/python3-cerberus_1.3.5.bb
new file mode 100644
index 0000000000..eb3453aeef
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-cerberus_1.3.5.bb
@@ -0,0 +1,11 @@
+SUMMARY = "Lightweight, extensible schema and data validation tool for Python dictionaries."
+HOMEPAGE = "http://docs.python-cerberus.org/"
+SECTION = "devel/python"
+LICENSE = "ISC"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=48f8e9432d0dac5e0e7a18211a0bacdb"
+
+# The PyPI package uses a capital letter so we have to specify this explicitly
+PYPI_PACKAGE = "Cerberus"
+inherit pypi python_poetry_core
+
+SRC_URI[sha256sum] = "81011e10266ef71b6ec6d50e60171258a5b134d69f8fb387d16e4936d0d47642"
diff --git a/meta-python/recipes-devtools/python/python3-certifi_2019.9.11.bb b/meta-python/recipes-devtools/python/python3-certifi_2019.9.11.bb
deleted file mode 100644
index 70f674b22c..0000000000
--- a/meta-python/recipes-devtools/python/python3-certifi_2019.9.11.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-certifi.inc
diff --git a/meta-python/recipes-devtools/python/python3-cffi_1.13.0.bb b/meta-python/recipes-devtools/python/python3-cffi_1.13.0.bb
deleted file mode 100644
index e888084347..0000000000
--- a/meta-python/recipes-devtools/python/python3-cffi_1.13.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-cffi.inc
diff --git a/meta-python/recipes-devtools/python/python3-chardet_3.0.4.bb b/meta-python/recipes-devtools/python/python3-chardet_3.0.4.bb
deleted file mode 100644
index 38d8122ce9..0000000000
--- a/meta-python/recipes-devtools/python/python3-chardet_3.0.4.bb
+++ /dev/null
@@ -1,7 +0,0 @@
-inherit setuptools3
-require python-chardet.inc
-
-do_install_append () {
- # rename scripts that would conflict with the Python 2 build of chardet
- mv ${D}${bindir}/chardetect ${D}${bindir}/chardetect3
-}
diff --git a/meta-python/recipes-devtools/python/python3-charset-normalizer_3.3.2.bb b/meta-python/recipes-devtools/python/python3-charset-normalizer_3.3.2.bb
new file mode 100644
index 0000000000..ca9a88ccfb
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-charset-normalizer_3.3.2.bb
@@ -0,0 +1,17 @@
+SUMMARY = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
+HOMEPAGE = "https://github.com/ousret/charset_normalizer"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=0974a390827087287db39928f7c524b5"
+
+SRC_URI[sha256sum] = "f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-core \
+ python3-logging \
+ python3-codecs \
+ python3-json \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-cheetah_3.2.3.bb b/meta-python/recipes-devtools/python/python3-cheetah_3.2.6.post1.bb
index 52e8576eec..448772960b 100644
--- a/meta-python/recipes-devtools/python/python3-cheetah_3.2.3.bb
+++ b/meta-python/recipes-devtools/python/python3-cheetah_3.2.6.post1.bb
@@ -1,15 +1,14 @@
SUMMARY = "Python template engine and code generation tool"
+HOMEPAGE = "https://cheetahtemplate.org/"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=15e13a4ed0e5880e3e55ec88b0921181"
PYPI_PACKAGE = "Cheetah3"
inherit pypi setuptools3
-RDEPENDS_${PN} = "python3-pickle python3-pprint"
-RDEPENDS_${PN}_class-native = ""
+RDEPENDS:${PN} = "python3-pickle python3-pprint"
+RDEPENDS:${PN}:class-native = ""
BBCLASSEXTEND = "native nativesdk"
-SRC_URI[md5sum] = "5629445e7fef9659da2b49e36aacdbff"
-SRC_URI[sha256sum] = "7c450bce04a82d34cf6d48992c736c2048246cbc00f7b4903a39cf9a8ea3990c"
-
+SRC_URI[sha256sum] = "58b5d84e5fbff6cf8e117414b3ea49ef51654c02ee887d155113c5b91d761967"
diff --git a/meta-python/recipes-devtools/python/python3-classes_0.4.1.bb b/meta-python/recipes-devtools/python/python3-classes_0.4.1.bb
new file mode 100644
index 0000000000..d9240e1383
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-classes_0.4.1.bb
@@ -0,0 +1,10 @@
+SUMMARY = "Smart, pythonic, ad-hoc, typed polymorphism for Python."
+
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=155fbcc756c8ae5265d252d23e20908f"
+
+SRC_URI[sha256sum] = "4de4fdd6c5c38607bbd8ad76703d7cc4dbe007cfa78e8ef1f62fc6ac55303e23"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-typing-extensions"
diff --git a/meta-python/recipes-devtools/python/python3-click-repl_0.3.0.bb b/meta-python/recipes-devtools/python/python3-click-repl_0.3.0.bb
new file mode 100644
index 0000000000..b773ed6b8b
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-click-repl_0.3.0.bb
@@ -0,0 +1,10 @@
+SUMMARY = "REPL plugin for Click"
+HOMEPAGE = "https://github.com/untitaker/click-repl"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=580facc4832cac548fad94845542da44"
+
+SRC_URI[sha256sum] = "17849c23dba3d667247dc4defe1757fff98694e90fe37474f3feebb69ced26a9"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} = "python3-click python3-prompt-toolkit"
diff --git a/meta-python/recipes-devtools/python/python3-click-spinner/0001-Update-Versioneer-to-0.22.patch b/meta-python/recipes-devtools/python/python3-click-spinner/0001-Update-Versioneer-to-0.22.patch
new file mode 100644
index 0000000000..4edb5da9ef
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-click-spinner/0001-Update-Versioneer-to-0.22.patch
@@ -0,0 +1,2489 @@
+From 739f9da6bf0d2d9f0de624aee2ec71c65f62c275 Mon Sep 17 00:00:00 2001
+From: Hugo van Kemenade <hugovk@users.noreply.github.com>
+Date: Tue, 10 May 2022 18:17:50 +0300
+Subject: [PATCH] Update Versioneer to 0.22
+
+Upstream-Status: Backport [https://github.com/click-contrib/click-spinner/commit/5622ab0a0b4296dc8f10863f268ed98dccf4b642]
+
+Signed-off-by: Ny Antra Ranaivoarison <nyantra.ranaivoarison@smile.fr>
+---
+ click_spinner/__init__.py | 5 +-
+ click_spinner/_version.py | 665 +++++++++++++++++++++-
+ versioneer.py | 1128 ++++++++++++++++++++++++-------------
+ 3 files changed, 1400 insertions(+), 398 deletions(-)
+
+diff --git a/click_spinner/__init__.py b/click_spinner/__init__.py
+index aeec089..8e9f4f9 100644
+--- a/click_spinner/__init__.py
++++ b/click_spinner/__init__.py
+@@ -77,6 +77,5 @@ def spinner(beep=False, disable=False, force=False, stream=sys.stdout):
+ return Spinner(beep, disable, force, stream)
+
+
+-from ._version import get_versions
+-__version__ = get_versions()['version']
+-del get_versions
++from . import _version
++__version__ = _version.get_versions()['version']
+diff --git a/click_spinner/_version.py b/click_spinner/_version.py
+index 5ae340e..d44565d 100644
+--- a/click_spinner/_version.py
++++ b/click_spinner/_version.py
+@@ -1,21 +1,658 @@
+
+-# This file was generated by 'versioneer.py' (0.16) from
+-# revision-control system data, or from the parent directory name of an
+-# unpacked source archive. Distribution tarballs contain a pre-generated copy
+-# of this file.
++# This file helps to compute a version number in source trees obtained from
++# git-archive tarball (such as those provided by githubs download-from-tag
++# feature). Distribution tarballs (built by setup.py sdist) and build
++# directories (produced by setup.py build) will contain a much shorter file
++# that just contains the computed version number.
+
+-import json
++# This file is released into the public domain. Generated by
++# versioneer-0.22 (https://github.com/python-versioneer/python-versioneer)
++
++"""Git implementation of _version.py."""
++
++import errno
++import os
++import re
++import subprocess
+ import sys
++from typing import Callable, Dict
++import functools
++
++
++def get_keywords():
++ """Get the keywords needed to look up the version information."""
++ # these strings will be replaced by git during git-archive.
++ # setup.py/versioneer.py will grep for the variable names, so they must
++ # each be defined on a line of their own. _version.py will just call
++ # get_keywords().
++ git_refnames = "$Format:%d$"
++ git_full = "$Format:%H$"
++ git_date = "$Format:%ci$"
++ keywords = {"refnames": git_refnames, "full": git_full, "date": git_date}
++ return keywords
++
++
++class VersioneerConfig:
++ """Container for Versioneer configuration parameters."""
++
++
++def get_config():
++ """Create, populate and return the VersioneerConfig() object."""
++ # these strings are filled in when 'setup.py versioneer' creates
++ # _version.py
++ cfg = VersioneerConfig()
++ cfg.VCS = "git"
++ cfg.style = "pep440"
++ cfg.tag_prefix = "v"
++ cfg.parentdir_prefix = "click-spinner-"
++ cfg.versionfile_source = "click_spinner/_version.py"
++ cfg.verbose = False
++ return cfg
++
++
++class NotThisMethod(Exception):
++ """Exception raised if a method is not valid for the current scenario."""
++
++
++LONG_VERSION_PY: Dict[str, str] = {}
++HANDLERS: Dict[str, Dict[str, Callable]] = {}
++
++
++def register_vcs_handler(vcs, method): # decorator
++ """Create decorator to mark a method as the handler of a VCS."""
++ def decorate(f):
++ """Store f in HANDLERS[vcs][method]."""
++ if vcs not in HANDLERS:
++ HANDLERS[vcs] = {}
++ HANDLERS[vcs][method] = f
++ return f
++ return decorate
++
++
++def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False,
++ env=None):
++ """Call the given command(s)."""
++ assert isinstance(commands, list)
++ process = None
++
++ popen_kwargs = {}
++ if sys.platform == "win32":
++ # This hides the console window if pythonw.exe is used
++ startupinfo = subprocess.STARTUPINFO()
++ startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
++ popen_kwargs["startupinfo"] = startupinfo
++
++ for command in commands:
++ try:
++ dispcmd = str([command] + args)
++ # remember shell=False, so use git.cmd on windows, not just git
++ process = subprocess.Popen([command] + args, cwd=cwd, env=env,
++ stdout=subprocess.PIPE,
++ stderr=(subprocess.PIPE if hide_stderr
++ else None), **popen_kwargs)
++ break
++ except OSError:
++ e = sys.exc_info()[1]
++ if e.errno == errno.ENOENT:
++ continue
++ if verbose:
++ print("unable to run %s" % dispcmd)
++ print(e)
++ return None, None
++ else:
++ if verbose:
++ print("unable to find command, tried %s" % (commands,))
++ return None, None
++ stdout = process.communicate()[0].strip().decode()
++ if process.returncode != 0:
++ if verbose:
++ print("unable to run %s (error)" % dispcmd)
++ print("stdout was %s" % stdout)
++ return None, process.returncode
++ return stdout, process.returncode
++
++
++def versions_from_parentdir(parentdir_prefix, root, verbose):
++ """Try to determine the version from the parent directory name.
++
++ Source tarballs conventionally unpack into a directory that includes both
++ the project name and a version string. We will also support searching up
++ two directory levels for an appropriately named parent directory
++ """
++ rootdirs = []
++
++ for _ in range(3):
++ dirname = os.path.basename(root)
++ if dirname.startswith(parentdir_prefix):
++ return {"version": dirname[len(parentdir_prefix):],
++ "full-revisionid": None,
++ "dirty": False, "error": None, "date": None}
++ rootdirs.append(root)
++ root = os.path.dirname(root) # up a level
++
++ if verbose:
++ print("Tried directories %s but none started with prefix %s" %
++ (str(rootdirs), parentdir_prefix))
++ raise NotThisMethod("rootdir doesn't start with parentdir_prefix")
++
++
++@register_vcs_handler("git", "get_keywords")
++def git_get_keywords(versionfile_abs):
++ """Extract version information from the given file."""
++ # the code embedded in _version.py can just fetch the value of these
++ # keywords. When used from setup.py, we don't want to import _version.py,
++ # so we do it with a regexp instead. This function is not used from
++ # _version.py.
++ keywords = {}
++ try:
++ with open(versionfile_abs, "r") as fobj:
++ for line in fobj:
++ if line.strip().startswith("git_refnames ="):
++ mo = re.search(r'=\s*"(.*)"', line)
++ if mo:
++ keywords["refnames"] = mo.group(1)
++ if line.strip().startswith("git_full ="):
++ mo = re.search(r'=\s*"(.*)"', line)
++ if mo:
++ keywords["full"] = mo.group(1)
++ if line.strip().startswith("git_date ="):
++ mo = re.search(r'=\s*"(.*)"', line)
++ if mo:
++ keywords["date"] = mo.group(1)
++ except OSError:
++ pass
++ return keywords
++
++
++@register_vcs_handler("git", "keywords")
++def git_versions_from_keywords(keywords, tag_prefix, verbose):
++ """Get version information from git keywords."""
++ if "refnames" not in keywords:
++ raise NotThisMethod("Short version file found")
++ date = keywords.get("date")
++ if date is not None:
++ # Use only the last line. Previous lines may contain GPG signature
++ # information.
++ date = date.splitlines()[-1]
++
++ # git-2.2.0 added "%cI", which expands to an ISO-8601 -compliant
++ # datestamp. However we prefer "%ci" (which expands to an "ISO-8601
++ # -like" string, which we must then edit to make compliant), because
++ # it's been around since git-1.5.3, and it's too difficult to
++ # discover which version we're using, or to work around using an
++ # older one.
++ date = date.strip().replace(" ", "T", 1).replace(" ", "", 1)
++ refnames = keywords["refnames"].strip()
++ if refnames.startswith("$Format"):
++ if verbose:
++ print("keywords are unexpanded, not using")
++ raise NotThisMethod("unexpanded keywords, not a git-archive tarball")
++ refs = {r.strip() for r in refnames.strip("()").split(",")}
++ # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of
++ # just "foo-1.0". If we see a "tag: " prefix, prefer those.
++ TAG = "tag: "
++ tags = {r[len(TAG):] for r in refs if r.startswith(TAG)}
++ if not tags:
++ # Either we're using git < 1.8.3, or there really are no tags. We use
++ # a heuristic: assume all version tags have a digit. The old git %d
++ # expansion behaves like git log --decorate=short and strips out the
++ # refs/heads/ and refs/tags/ prefixes that would let us distinguish
++ # between branches and tags. By ignoring refnames without digits, we
++ # filter out many common branch names like "release" and
++ # "stabilization", as well as "HEAD" and "master".
++ tags = {r for r in refs if re.search(r'\d', r)}
++ if verbose:
++ print("discarding '%s', no digits" % ",".join(refs - tags))
++ if verbose:
++ print("likely tags: %s" % ",".join(sorted(tags)))
++ for ref in sorted(tags):
++ # sorting will prefer e.g. "2.0" over "2.0rc1"
++ if ref.startswith(tag_prefix):
++ r = ref[len(tag_prefix):]
++ # Filter out refs that exactly match prefix or that don't start
++ # with a number once the prefix is stripped (mostly a concern
++ # when prefix is '')
++ if not re.match(r'\d', r):
++ continue
++ if verbose:
++ print("picking %s" % r)
++ return {"version": r,
++ "full-revisionid": keywords["full"].strip(),
++ "dirty": False, "error": None,
++ "date": date}
++ # no suitable tags, so version is "0+unknown", but full hex is still there
++ if verbose:
++ print("no suitable tags, using unknown + full revision id")
++ return {"version": "0+unknown",
++ "full-revisionid": keywords["full"].strip(),
++ "dirty": False, "error": "no suitable tags", "date": None}
++
++
++@register_vcs_handler("git", "pieces_from_vcs")
++def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command):
++ """Get version from 'git describe' in the root of the source tree.
++
++ This only gets called if the git-archive 'subst' keywords were *not*
++ expanded, and _version.py hasn't already been rewritten with a short
++ version string, meaning we're inside a checked out source tree.
++ """
++ GITS = ["git"]
++ if sys.platform == "win32":
++ GITS = ["git.cmd", "git.exe"]
++
++ # GIT_DIR can interfere with correct operation of Versioneer.
++ # It may be intended to be passed to the Versioneer-versioned project,
++ # but that should not change where we get our version from.
++ env = os.environ.copy()
++ env.pop("GIT_DIR", None)
++ runner = functools.partial(runner, env=env)
++
++ _, rc = runner(GITS, ["rev-parse", "--git-dir"], cwd=root,
++ hide_stderr=True)
++ if rc != 0:
++ if verbose:
++ print("Directory %s not under git control" % root)
++ raise NotThisMethod("'git rev-parse --git-dir' returned error")
++
++ MATCH_ARGS = ["--match", "%s*" % tag_prefix] if tag_prefix else []
++
++ # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty]
++ # if there isn't one, this yields HEX[-dirty] (no NUM)
++ describe_out, rc = runner(GITS, ["describe", "--tags", "--dirty",
++ "--always", "--long", *MATCH_ARGS],
++ cwd=root)
++ # --long was added in git-1.5.5
++ if describe_out is None:
++ raise NotThisMethod("'git describe' failed")
++ describe_out = describe_out.strip()
++ full_out, rc = runner(GITS, ["rev-parse", "HEAD"], cwd=root)
++ if full_out is None:
++ raise NotThisMethod("'git rev-parse' failed")
++ full_out = full_out.strip()
++
++ pieces = {}
++ pieces["long"] = full_out
++ pieces["short"] = full_out[:7] # maybe improved later
++ pieces["error"] = None
++
++ branch_name, rc = runner(GITS, ["rev-parse", "--abbrev-ref", "HEAD"],
++ cwd=root)
++ # --abbrev-ref was added in git-1.6.3
++ if rc != 0 or branch_name is None:
++ raise NotThisMethod("'git rev-parse --abbrev-ref' returned error")
++ branch_name = branch_name.strip()
++
++ if branch_name == "HEAD":
++ # If we aren't exactly on a branch, pick a branch which represents
++ # the current commit. If all else fails, we are on a branchless
++ # commit.
++ branches, rc = runner(GITS, ["branch", "--contains"], cwd=root)
++ # --contains was added in git-1.5.4
++ if rc != 0 or branches is None:
++ raise NotThisMethod("'git branch --contains' returned error")
++ branches = branches.split("\n")
++
++ # Remove the first line if we're running detached
++ if "(" in branches[0]:
++ branches.pop(0)
++
++ # Strip off the leading "* " from the list of branches.
++ branches = [branch[2:] for branch in branches]
++ if "master" in branches:
++ branch_name = "master"
++ elif not branches:
++ branch_name = None
++ else:
++ # Pick the first branch that is returned. Good or bad.
++ branch_name = branches[0]
++
++ pieces["branch"] = branch_name
++
++ # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty]
++ # TAG might have hyphens.
++ git_describe = describe_out
++
++ # look for -dirty suffix
++ dirty = git_describe.endswith("-dirty")
++ pieces["dirty"] = dirty
++ if dirty:
++ git_describe = git_describe[:git_describe.rindex("-dirty")]
++
++ # now we have TAG-NUM-gHEX or HEX
++
++ if "-" in git_describe:
++ # TAG-NUM-gHEX
++ mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe)
++ if not mo:
++ # unparsable. Maybe git-describe is misbehaving?
++ pieces["error"] = ("unable to parse git-describe output: '%s'"
++ % describe_out)
++ return pieces
++
++ # tag
++ full_tag = mo.group(1)
++ if not full_tag.startswith(tag_prefix):
++ if verbose:
++ fmt = "tag '%s' doesn't start with prefix '%s'"
++ print(fmt % (full_tag, tag_prefix))
++ pieces["error"] = ("tag '%s' doesn't start with prefix '%s'"
++ % (full_tag, tag_prefix))
++ return pieces
++ pieces["closest-tag"] = full_tag[len(tag_prefix):]
++
++ # distance: number of commits since tag
++ pieces["distance"] = int(mo.group(2))
++
++ # commit: short hex revision ID
++ pieces["short"] = mo.group(3)
++
++ else:
++ # HEX: no tags
++ pieces["closest-tag"] = None
++ count_out, rc = runner(GITS, ["rev-list", "HEAD", "--count"], cwd=root)
++ pieces["distance"] = int(count_out) # total number of commits
+
+-version_json = '''
+-{
+- "dirty": false,
+- "error": null,
+- "full-revisionid": "7cadb31e3e257c64a47a67255547f0a746e1a465",
+- "version": "0.1.10"
+-}
+-''' # END VERSION_JSON
++ # commit date: see ISO-8601 comment in git_versions_from_keywords()
++ date = runner(GITS, ["show", "-s", "--format=%ci", "HEAD"], cwd=root)[0].strip()
++ # Use only the last line. Previous lines may contain GPG signature
++ # information.
++ date = date.splitlines()[-1]
++ pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1)
++
++ return pieces
++
++
++def plus_or_dot(pieces):
++ """Return a + if we don't already have one, else return a ."""
++ if "+" in pieces.get("closest-tag", ""):
++ return "."
++ return "+"
++
++
++def render_pep440(pieces):
++ """Build up version string, with post-release "local version identifier".
++
++ Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you
++ get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty
++
++ Exceptions:
++ 1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty]
++ """
++ if pieces["closest-tag"]:
++ rendered = pieces["closest-tag"]
++ if pieces["distance"] or pieces["dirty"]:
++ rendered += plus_or_dot(pieces)
++ rendered += "%d.g%s" % (pieces["distance"], pieces["short"])
++ if pieces["dirty"]:
++ rendered += ".dirty"
++ else:
++ # exception #1
++ rendered = "0+untagged.%d.g%s" % (pieces["distance"],
++ pieces["short"])
++ if pieces["dirty"]:
++ rendered += ".dirty"
++ return rendered
++
++
++def render_pep440_branch(pieces):
++ """TAG[[.dev0]+DISTANCE.gHEX[.dirty]] .
++
++ The ".dev0" means not master branch. Note that .dev0 sorts backwards
++ (a feature branch will appear "older" than the master branch).
++
++ Exceptions:
++ 1: no tags. 0[.dev0]+untagged.DISTANCE.gHEX[.dirty]
++ """
++ if pieces["closest-tag"]:
++ rendered = pieces["closest-tag"]
++ if pieces["distance"] or pieces["dirty"]:
++ if pieces["branch"] != "master":
++ rendered += ".dev0"
++ rendered += plus_or_dot(pieces)
++ rendered += "%d.g%s" % (pieces["distance"], pieces["short"])
++ if pieces["dirty"]:
++ rendered += ".dirty"
++ else:
++ # exception #1
++ rendered = "0"
++ if pieces["branch"] != "master":
++ rendered += ".dev0"
++ rendered += "+untagged.%d.g%s" % (pieces["distance"],
++ pieces["short"])
++ if pieces["dirty"]:
++ rendered += ".dirty"
++ return rendered
++
++
++def pep440_split_post(ver):
++ """Split pep440 version string at the post-release segment.
++
++ Returns the release segments before the post-release and the
++ post-release version number (or -1 if no post-release segment is present).
++ """
++ vc = str.split(ver, ".post")
++ return vc[0], int(vc[1] or 0) if len(vc) == 2 else None
++
++
++def render_pep440_pre(pieces):
++ """TAG[.postN.devDISTANCE] -- No -dirty.
++
++ Exceptions:
++ 1: no tags. 0.post0.devDISTANCE
++ """
++ if pieces["closest-tag"]:
++ if pieces["distance"]:
++ # update the post release segment
++ tag_version, post_version = pep440_split_post(pieces["closest-tag"])
++ rendered = tag_version
++ if post_version is not None:
++ rendered += ".post%d.dev%d" % (post_version+1, pieces["distance"])
++ else:
++ rendered += ".post0.dev%d" % (pieces["distance"])
++ else:
++ # no commits, use the tag as the version
++ rendered = pieces["closest-tag"]
++ else:
++ # exception #1
++ rendered = "0.post0.dev%d" % pieces["distance"]
++ return rendered
++
++
++def render_pep440_post(pieces):
++ """TAG[.postDISTANCE[.dev0]+gHEX] .
++
++ The ".dev0" means dirty. Note that .dev0 sorts backwards
++ (a dirty tree will appear "older" than the corresponding clean one),
++ but you shouldn't be releasing software with -dirty anyways.
++
++ Exceptions:
++ 1: no tags. 0.postDISTANCE[.dev0]
++ """
++ if pieces["closest-tag"]:
++ rendered = pieces["closest-tag"]
++ if pieces["distance"] or pieces["dirty"]:
++ rendered += ".post%d" % pieces["distance"]
++ if pieces["dirty"]:
++ rendered += ".dev0"
++ rendered += plus_or_dot(pieces)
++ rendered += "g%s" % pieces["short"]
++ else:
++ # exception #1
++ rendered = "0.post%d" % pieces["distance"]
++ if pieces["dirty"]:
++ rendered += ".dev0"
++ rendered += "+g%s" % pieces["short"]
++ return rendered
++
++
++def render_pep440_post_branch(pieces):
++ """TAG[.postDISTANCE[.dev0]+gHEX[.dirty]] .
++
++ The ".dev0" means not master branch.
++
++ Exceptions:
++ 1: no tags. 0.postDISTANCE[.dev0]+gHEX[.dirty]
++ """
++ if pieces["closest-tag"]:
++ rendered = pieces["closest-tag"]
++ if pieces["distance"] or pieces["dirty"]:
++ rendered += ".post%d" % pieces["distance"]
++ if pieces["branch"] != "master":
++ rendered += ".dev0"
++ rendered += plus_or_dot(pieces)
++ rendered += "g%s" % pieces["short"]
++ if pieces["dirty"]:
++ rendered += ".dirty"
++ else:
++ # exception #1
++ rendered = "0.post%d" % pieces["distance"]
++ if pieces["branch"] != "master":
++ rendered += ".dev0"
++ rendered += "+g%s" % pieces["short"]
++ if pieces["dirty"]:
++ rendered += ".dirty"
++ return rendered
++
++
++def render_pep440_old(pieces):
++ """TAG[.postDISTANCE[.dev0]] .
++
++ The ".dev0" means dirty.
++
++ Exceptions:
++ 1: no tags. 0.postDISTANCE[.dev0]
++ """
++ if pieces["closest-tag"]:
++ rendered = pieces["closest-tag"]
++ if pieces["distance"] or pieces["dirty"]:
++ rendered += ".post%d" % pieces["distance"]
++ if pieces["dirty"]:
++ rendered += ".dev0"
++ else:
++ # exception #1
++ rendered = "0.post%d" % pieces["distance"]
++ if pieces["dirty"]:
++ rendered += ".dev0"
++ return rendered
++
++
++def render_git_describe(pieces):
++ """TAG[-DISTANCE-gHEX][-dirty].
++
++ Like 'git describe --tags --dirty --always'.
++
++ Exceptions:
++ 1: no tags. HEX[-dirty] (note: no 'g' prefix)
++ """
++ if pieces["closest-tag"]:
++ rendered = pieces["closest-tag"]
++ if pieces["distance"]:
++ rendered += "-%d-g%s" % (pieces["distance"], pieces["short"])
++ else:
++ # exception #1
++ rendered = pieces["short"]
++ if pieces["dirty"]:
++ rendered += "-dirty"
++ return rendered
++
++
++def render_git_describe_long(pieces):
++ """TAG-DISTANCE-gHEX[-dirty].
++
++ Like 'git describe --tags --dirty --always -long'.
++ The distance/hash is unconditional.
++
++ Exceptions:
++ 1: no tags. HEX[-dirty] (note: no 'g' prefix)
++ """
++ if pieces["closest-tag"]:
++ rendered = pieces["closest-tag"]
++ rendered += "-%d-g%s" % (pieces["distance"], pieces["short"])
++ else:
++ # exception #1
++ rendered = pieces["short"]
++ if pieces["dirty"]:
++ rendered += "-dirty"
++ return rendered
++
++
++def render(pieces, style):
++ """Render the given version pieces into the requested style."""
++ if pieces["error"]:
++ return {"version": "unknown",
++ "full-revisionid": pieces.get("long"),
++ "dirty": None,
++ "error": pieces["error"],
++ "date": None}
++
++ if not style or style == "default":
++ style = "pep440" # the default
++
++ if style == "pep440":
++ rendered = render_pep440(pieces)
++ elif style == "pep440-branch":
++ rendered = render_pep440_branch(pieces)
++ elif style == "pep440-pre":
++ rendered = render_pep440_pre(pieces)
++ elif style == "pep440-post":
++ rendered = render_pep440_post(pieces)
++ elif style == "pep440-post-branch":
++ rendered = render_pep440_post_branch(pieces)
++ elif style == "pep440-old":
++ rendered = render_pep440_old(pieces)
++ elif style == "git-describe":
++ rendered = render_git_describe(pieces)
++ elif style == "git-describe-long":
++ rendered = render_git_describe_long(pieces)
++ else:
++ raise ValueError("unknown style '%s'" % style)
++
++ return {"version": rendered, "full-revisionid": pieces["long"],
++ "dirty": pieces["dirty"], "error": None,
++ "date": pieces.get("date")}
+
+
+ def get_versions():
+- return json.loads(version_json)
++ """Get version information or return default if unable to do so."""
++ # I am in _version.py, which lives at ROOT/VERSIONFILE_SOURCE. If we have
++ # __file__, we can work backwards from there to the root. Some
++ # py2exe/bbfreeze/non-CPython implementations don't do __file__, in which
++ # case we can only use expanded keywords.
++
++ cfg = get_config()
++ verbose = cfg.verbose
++
++ try:
++ return git_versions_from_keywords(get_keywords(), cfg.tag_prefix,
++ verbose)
++ except NotThisMethod:
++ pass
++
++ try:
++ root = os.path.realpath(__file__)
++ # versionfile_source is the relative path from the top of the source
++ # tree (where the .git directory might live) to this file. Invert
++ # this to find the root from __file__.
++ for _ in cfg.versionfile_source.split('/'):
++ root = os.path.dirname(root)
++ except NameError:
++ return {"version": "0+unknown", "full-revisionid": None,
++ "dirty": None,
++ "error": "unable to find root of source tree",
++ "date": None}
++
++ try:
++ pieces = git_pieces_from_vcs(cfg.tag_prefix, root, verbose)
++ return render(pieces, cfg.style)
++ except NotThisMethod:
++ pass
++
++ try:
++ if cfg.parentdir_prefix:
++ return versions_from_parentdir(cfg.parentdir_prefix, root, verbose)
++ except NotThisMethod:
++ pass
++
++ return {"version": "0+unknown", "full-revisionid": None,
++ "dirty": None,
++ "error": "unable to compute version", "date": None}
+diff --git a/versioneer.py b/versioneer.py
+index 7ed2a21..a142bf5 100644
+--- a/versioneer.py
++++ b/versioneer.py
+@@ -1,5 +1,5 @@
+
+-# Version: 0.16
++# Version: 0.22
+
+ """The Versioneer - like a rocketeer, but for versions.
+
+@@ -7,18 +7,14 @@ The Versioneer
+ ==============
+
+ * like a rocketeer, but for versions!
+-* https://github.com/warner/python-versioneer
++* https://github.com/python-versioneer/python-versioneer
+ * Brian Warner
+ * License: Public Domain
+-* Compatible With: python2.6, 2.7, 3.3, 3.4, 3.5, and pypy
+-* [![Latest Version]
+-(https://pypip.in/version/versioneer/badge.svg?style=flat)
+-](https://pypi.python.org/pypi/versioneer/)
+-* [![Build Status]
+-(https://travis-ci.org/warner/python-versioneer.png?branch=master)
+-](https://travis-ci.org/warner/python-versioneer)
+-
+-This is a tool for managing a recorded version number in distutils-based
++* Compatible with: Python 3.6, 3.7, 3.8, 3.9, 3.10 and pypy3
++* [![Latest Version][pypi-image]][pypi-url]
++* [![Build Status][travis-image]][travis-url]
++
++This is a tool for managing a recorded version number in distutils/setuptools-based
+ python projects. The goal is to remove the tedious and error-prone "update
+ the embedded version string" step from your release process. Making a new
+ release should be as easy as recording a new tag in your version-control
+@@ -27,9 +23,10 @@ system, and maybe making new tarballs.
+
+ ## Quick Install
+
+-* `pip install versioneer` to somewhere to your $PATH
+-* add a `[versioneer]` section to your setup.cfg (see below)
++* `pip install versioneer` to somewhere in your $PATH
++* add a `[versioneer]` section to your setup.cfg (see [Install](INSTALL.md))
+ * run `versioneer install` in your source tree, commit the results
++* Verify version information with `python setup.py version`
+
+ ## Version Identifiers
+
+@@ -61,7 +58,7 @@ version 1.3). Many VCS systems can report a description that captures this,
+ for example `git describe --tags --dirty --always` reports things like
+ "0.7-1-g574ab98-dirty" to indicate that the checkout is one revision past the
+ 0.7 tag, has a unique revision id of "574ab98", and is "dirty" (it has
+-uncommitted changes.
++uncommitted changes).
+
+ The version identifier is used for multiple purposes:
+
+@@ -88,127 +85,7 @@ the generated version data.
+
+ ## Installation
+
+-First, decide on values for the following configuration variables:
+-
+-* `VCS`: the version control system you use. Currently accepts "git".
+-
+-* `style`: the style of version string to be produced. See "Styles" below for
+- details. Defaults to "pep440", which looks like
+- `TAG[+DISTANCE.gSHORTHASH[.dirty]]`.
+-
+-* `versionfile_source`:
+-
+- A project-relative pathname into which the generated version strings should
+- be written. This is usually a `_version.py` next to your project's main
+- `__init__.py` file, so it can be imported at runtime. If your project uses
+- `src/myproject/__init__.py`, this should be `src/myproject/_version.py`.
+- This file should be checked in to your VCS as usual: the copy created below
+- by `setup.py setup_versioneer` will include code that parses expanded VCS
+- keywords in generated tarballs. The 'build' and 'sdist' commands will
+- replace it with a copy that has just the calculated version string.
+-
+- This must be set even if your project does not have any modules (and will
+- therefore never import `_version.py`), since "setup.py sdist" -based trees
+- still need somewhere to record the pre-calculated version strings. Anywhere
+- in the source tree should do. If there is a `__init__.py` next to your
+- `_version.py`, the `setup.py setup_versioneer` command (described below)
+- will append some `__version__`-setting assignments, if they aren't already
+- present.
+-
+-* `versionfile_build`:
+-
+- Like `versionfile_source`, but relative to the build directory instead of
+- the source directory. These will differ when your setup.py uses
+- 'package_dir='. If you have `package_dir={'myproject': 'src/myproject'}`,
+- then you will probably have `versionfile_build='myproject/_version.py'` and
+- `versionfile_source='src/myproject/_version.py'`.
+-
+- If this is set to None, then `setup.py build` will not attempt to rewrite
+- any `_version.py` in the built tree. If your project does not have any
+- libraries (e.g. if it only builds a script), then you should use
+- `versionfile_build = None`. To actually use the computed version string,
+- your `setup.py` will need to override `distutils.command.build_scripts`
+- with a subclass that explicitly inserts a copy of
+- `versioneer.get_version()` into your script file. See
+- `test/demoapp-script-only/setup.py` for an example.
+-
+-* `tag_prefix`:
+-
+- a string, like 'PROJECTNAME-', which appears at the start of all VCS tags.
+- If your tags look like 'myproject-1.2.0', then you should use
+- tag_prefix='myproject-'. If you use unprefixed tags like '1.2.0', this
+- should be an empty string, using either `tag_prefix=` or `tag_prefix=''`.
+-
+-* `parentdir_prefix`:
+-
+- a optional string, frequently the same as tag_prefix, which appears at the
+- start of all unpacked tarball filenames. If your tarball unpacks into
+- 'myproject-1.2.0', this should be 'myproject-'. To disable this feature,
+- just omit the field from your `setup.cfg`.
+-
+-This tool provides one script, named `versioneer`. That script has one mode,
+-"install", which writes a copy of `versioneer.py` into the current directory
+-and runs `versioneer.py setup` to finish the installation.
+-
+-To versioneer-enable your project:
+-
+-* 1: Modify your `setup.cfg`, adding a section named `[versioneer]` and
+- populating it with the configuration values you decided earlier (note that
+- the option names are not case-sensitive):
+-
+- ````
+- [versioneer]
+- VCS = git
+- style = pep440
+- versionfile_source = src/myproject/_version.py
+- versionfile_build = myproject/_version.py
+- tag_prefix =
+- parentdir_prefix = myproject-
+- ````
+-
+-* 2: Run `versioneer install`. This will do the following:
+-
+- * copy `versioneer.py` into the top of your source tree
+- * create `_version.py` in the right place (`versionfile_source`)
+- * modify your `__init__.py` (if one exists next to `_version.py`) to define
+- `__version__` (by calling a function from `_version.py`)
+- * modify your `MANIFEST.in` to include both `versioneer.py` and the
+- generated `_version.py` in sdist tarballs
+-
+- `versioneer install` will complain about any problems it finds with your
+- `setup.py` or `setup.cfg`. Run it multiple times until you have fixed all
+- the problems.
+-
+-* 3: add a `import versioneer` to your setup.py, and add the following
+- arguments to the setup() call:
+-
+- version=versioneer.get_version(),
+- cmdclass=versioneer.get_cmdclass(),
+-
+-* 4: commit these changes to your VCS. To make sure you won't forget,
+- `versioneer install` will mark everything it touched for addition using
+- `git add`. Don't forget to add `setup.py` and `setup.cfg` too.
+-
+-## Post-Installation Usage
+-
+-Once established, all uses of your tree from a VCS checkout should get the
+-current version string. All generated tarballs should include an embedded
+-version string (so users who unpack them will not need a VCS tool installed).
+-
+-If you distribute your project through PyPI, then the release process should
+-boil down to two steps:
+-
+-* 1: git tag 1.0
+-* 2: python setup.py register sdist upload
+-
+-If you distribute it through github (i.e. users use github to generate
+-tarballs with `git archive`), the process is:
+-
+-* 1: git tag 1.0
+-* 2: git push; git push --tags
+-
+-Versioneer will report "0+untagged.NUMCOMMITS.gHASH" until your tree has at
+-least one tag in its history.
++See [INSTALL.md](./INSTALL.md) for detailed installation instructions.
+
+ ## Version-String Flavors
+
+@@ -229,6 +106,10 @@ information:
+ * `['full-revisionid']`: detailed revision identifier. For Git, this is the
+ full SHA1 commit id, e.g. "1076c978a8d3cfc70f408fe5974aa6c092c949ac".
+
++* `['date']`: Date and time of the latest `HEAD` commit. For Git, it is the
++ commit date in ISO 8601 format. This will be None if the date is not
++ available.
++
+ * `['dirty']`: a boolean, True if the tree has uncommitted changes. Note that
+ this is only accurate if run in a VCS checkout, otherwise it is likely to
+ be False or None
+@@ -267,8 +148,8 @@ that this commit is two revisions ("+2") beyond the "0.11" tag. For released
+ software (exactly equal to a known tag), the identifier will only contain the
+ stripped tag, e.g. "0.11".
+
+-Other styles are available. See details.md in the Versioneer source tree for
+-descriptions.
++Other styles are available. See [details.md](details.md) in the Versioneer
++source tree for descriptions.
+
+ ## Debugging
+
+@@ -278,51 +159,83 @@ version`, which will run the version-lookup code in a verbose mode, and will
+ display the full contents of `get_versions()` (including the `error` string,
+ which may help identify what went wrong).
+
+-## Updating Versioneer
++## Known Limitations
+
+-To upgrade your project to a new release of Versioneer, do the following:
++Some situations are known to cause problems for Versioneer. This details the
++most significant ones. More can be found on Github
++[issues page](https://github.com/python-versioneer/python-versioneer/issues).
+
+-* install the new Versioneer (`pip install -U versioneer` or equivalent)
+-* edit `setup.cfg`, if necessary, to include any new configuration settings
+- indicated by the release notes
+-* re-run `versioneer install` in your source tree, to replace
+- `SRC/_version.py`
+-* commit any changed files
++### Subprojects
++
++Versioneer has limited support for source trees in which `setup.py` is not in
++the root directory (e.g. `setup.py` and `.git/` are *not* siblings). The are
++two common reasons why `setup.py` might not be in the root:
++
++* Source trees which contain multiple subprojects, such as
++ [Buildbot](https://github.com/buildbot/buildbot), which contains both
++ "master" and "slave" subprojects, each with their own `setup.py`,
++ `setup.cfg`, and `tox.ini`. Projects like these produce multiple PyPI
++ distributions (and upload multiple independently-installable tarballs).
++* Source trees whose main purpose is to contain a C library, but which also
++ provide bindings to Python (and perhaps other languages) in subdirectories.
++
++Versioneer will look for `.git` in parent directories, and most operations
++should get the right version string. However `pip` and `setuptools` have bugs
++and implementation details which frequently cause `pip install .` from a
++subproject directory to fail to find a correct version string (so it usually
++defaults to `0+unknown`).
+
+-### Upgrading to 0.16
++`pip install --editable .` should work correctly. `setup.py install` might
++work too.
+
+-Nothing special.
++Pip-8.1.1 is known to have this problem, but hopefully it will get fixed in
++some later version.
+
+-### Upgrading to 0.15
++[Bug #38](https://github.com/python-versioneer/python-versioneer/issues/38) is tracking
++this issue. The discussion in
++[PR #61](https://github.com/python-versioneer/python-versioneer/pull/61) describes the
++issue from the Versioneer side in more detail.
++[pip PR#3176](https://github.com/pypa/pip/pull/3176) and
++[pip PR#3615](https://github.com/pypa/pip/pull/3615) contain work to improve
++pip to let Versioneer work correctly.
+
+-Starting with this version, Versioneer is configured with a `[versioneer]`
+-section in your `setup.cfg` file. Earlier versions required the `setup.py` to
+-set attributes on the `versioneer` module immediately after import. The new
+-version will refuse to run (raising an exception during import) until you
+-have provided the necessary `setup.cfg` section.
++Versioneer-0.16 and earlier only looked for a `.git` directory next to the
++`setup.cfg`, so subprojects were completely unsupported with those releases.
+
+-In addition, the Versioneer package provides an executable named
+-`versioneer`, and the installation process is driven by running `versioneer
+-install`. In 0.14 and earlier, the executable was named
+-`versioneer-installer` and was run without an argument.
++### Editable installs with setuptools <= 18.5
+
+-### Upgrading to 0.14
++`setup.py develop` and `pip install --editable .` allow you to install a
++project into a virtualenv once, then continue editing the source code (and
++test) without re-installing after every change.
+
+-0.14 changes the format of the version string. 0.13 and earlier used
+-hyphen-separated strings like "0.11-2-g1076c97-dirty". 0.14 and beyond use a
+-plus-separated "local version" section strings, with dot-separated
+-components, like "0.11+2.g1076c97". PEP440-strict tools did not like the old
+-format, but should be ok with the new one.
++"Entry-point scripts" (`setup(entry_points={"console_scripts": ..})`) are a
++convenient way to specify executable scripts that should be installed along
++with the python package.
+
+-### Upgrading from 0.11 to 0.12
++These both work as expected when using modern setuptools. When using
++setuptools-18.5 or earlier, however, certain operations will cause
++`pkg_resources.DistributionNotFound` errors when running the entrypoint
++script, which must be resolved by re-installing the package. This happens
++when the install happens with one version, then the egg_info data is
++regenerated while a different version is checked out. Many setup.py commands
++cause egg_info to be rebuilt (including `sdist`, `wheel`, and installing into
++a different virtualenv), so this can be surprising.
+
+-Nothing special.
++[Bug #83](https://github.com/python-versioneer/python-versioneer/issues/83) describes
++this one, but upgrading to a newer version of setuptools should probably
++resolve it.
+
+-### Upgrading from 0.10 to 0.11
+
+-You must add a `versioneer.VCS = "git"` to your `setup.py` before re-running
+-`setup.py setup_versioneer`. This will enable the use of additional
+-version-control systems (SVN, etc) in the future.
++## Updating Versioneer
++
++To upgrade your project to a new release of Versioneer, do the following:
++
++* install the new Versioneer (`pip install -U versioneer` or equivalent)
++* edit `setup.cfg`, if necessary, to include any new configuration settings
++ indicated by the release notes. See [UPGRADING](./UPGRADING.md) for details.
++* re-run `versioneer install` in your source tree, to replace
++ `SRC/_version.py`
++* commit any changed files
+
+ ## Future Directions
+
+@@ -337,6 +250,14 @@ installation by editing setup.py . Alternatively, it might go the other
+ direction and include code from all supported VCS systems, reducing the
+ number of intermediate scripts.
+
++## Similar projects
++
++* [setuptools_scm](https://github.com/pypa/setuptools_scm/) - a non-vendored build-time
++ dependency
++* [minver](https://github.com/jbweston/miniver) - a lightweight reimplementation of
++ versioneer
++* [versioningit](https://github.com/jwodder/versioningit) - a PEP 518-based setuptools
++ plugin
+
+ ## License
+
+@@ -346,19 +267,28 @@ Specifically, both are released under the Creative Commons "Public Domain
+ Dedication" license (CC0-1.0), as described in
+ https://creativecommons.org/publicdomain/zero/1.0/ .
+
++[pypi-image]: https://img.shields.io/pypi/v/versioneer.svg
++[pypi-url]: https://pypi.python.org/pypi/versioneer/
++[travis-image]:
++https://img.shields.io/travis/com/python-versioneer/python-versioneer.svg
++[travis-url]: https://travis-ci.com/github/python-versioneer/python-versioneer
++
+ """
++# pylint:disable=invalid-name,import-outside-toplevel,missing-function-docstring
++# pylint:disable=missing-class-docstring,too-many-branches,too-many-statements
++# pylint:disable=raise-missing-from,too-many-lines,too-many-locals,import-error
++# pylint:disable=too-few-public-methods,redefined-outer-name,consider-using-with
++# pylint:disable=attribute-defined-outside-init,too-many-arguments
+
+-from __future__ import print_function
+-try:
+- import configparser
+-except ImportError:
+- import ConfigParser as configparser
++import configparser
+ import errno
+ import json
+ import os
+ import re
+ import subprocess
+ import sys
++from typing import Callable, Dict
++import functools
+
+
+ class VersioneerConfig:
+@@ -393,10 +323,12 @@ def get_root():
+ # module-import table will cache the first one. So we can't use
+ # os.path.dirname(__file__), as that will find whichever
+ # versioneer.py was first imported, even in later projects.
+- me = os.path.realpath(os.path.abspath(__file__))
+- if os.path.splitext(me)[0] != os.path.splitext(versioneer_py)[0]:
++ my_path = os.path.realpath(os.path.abspath(__file__))
++ me_dir = os.path.normcase(os.path.splitext(my_path)[0])
++ vsr_dir = os.path.normcase(os.path.splitext(versioneer_py)[0])
++ if me_dir != vsr_dir:
+ print("Warning: build in %s is using versioneer.py from %s"
+- % (os.path.dirname(me), versioneer_py))
++ % (os.path.dirname(my_path), versioneer_py))
+ except NameError:
+ pass
+ return root
+@@ -404,85 +336,94 @@ def get_root():
+
+ def get_config_from_root(root):
+ """Read the project setup.cfg file to determine Versioneer config."""
+- # This might raise EnvironmentError (if setup.cfg is missing), or
++ # This might raise OSError (if setup.cfg is missing), or
+ # configparser.NoSectionError (if it lacks a [versioneer] section), or
+ # configparser.NoOptionError (if it lacks "VCS="). See the docstring at
+ # the top of versioneer.py for instructions on writing your setup.cfg .
+ setup_cfg = os.path.join(root, "setup.cfg")
+- parser = configparser.SafeConfigParser()
+- with open(setup_cfg, "r") as f:
+- parser.readfp(f)
++ parser = configparser.ConfigParser()
++ with open(setup_cfg, "r") as cfg_file:
++ parser.read_file(cfg_file)
+ VCS = parser.get("versioneer", "VCS") # mandatory
+
+- def get(parser, name):
+- if parser.has_option("versioneer", name):
+- return parser.get("versioneer", name)
+- return None
++ # Dict-like interface for non-mandatory entries
++ section = parser["versioneer"]
++
+ cfg = VersioneerConfig()
+ cfg.VCS = VCS
+- cfg.style = get(parser, "style") or ""
+- cfg.versionfile_source = get(parser, "versionfile_source")
+- cfg.versionfile_build = get(parser, "versionfile_build")
+- cfg.tag_prefix = get(parser, "tag_prefix")
++ cfg.style = section.get("style", "")
++ cfg.versionfile_source = section.get("versionfile_source")
++ cfg.versionfile_build = section.get("versionfile_build")
++ cfg.tag_prefix = section.get("tag_prefix")
+ if cfg.tag_prefix in ("''", '""'):
+ cfg.tag_prefix = ""
+- cfg.parentdir_prefix = get(parser, "parentdir_prefix")
+- cfg.verbose = get(parser, "verbose")
++ cfg.parentdir_prefix = section.get("parentdir_prefix")
++ cfg.verbose = section.get("verbose")
+ return cfg
+
+
+ class NotThisMethod(Exception):
+ """Exception raised if a method is not valid for the current scenario."""
+
++
+ # these dictionaries contain VCS-specific tools
+-LONG_VERSION_PY = {}
+-HANDLERS = {}
++LONG_VERSION_PY: Dict[str, str] = {}
++HANDLERS: Dict[str, Dict[str, Callable]] = {}
+
+
+ def register_vcs_handler(vcs, method): # decorator
+- """Decorator to mark a method as the handler for a particular VCS."""
++ """Create decorator to mark a method as the handler of a VCS."""
+ def decorate(f):
+ """Store f in HANDLERS[vcs][method]."""
+- if vcs not in HANDLERS:
+- HANDLERS[vcs] = {}
+- HANDLERS[vcs][method] = f
++ HANDLERS.setdefault(vcs, {})[method] = f
+ return f
+ return decorate
+
+
+-def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False):
++def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False,
++ env=None):
+ """Call the given command(s)."""
+ assert isinstance(commands, list)
+- p = None
+- for c in commands:
++ process = None
++
++ popen_kwargs = {}
++ if sys.platform == "win32":
++ # This hides the console window if pythonw.exe is used
++ startupinfo = subprocess.STARTUPINFO()
++ startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
++ popen_kwargs["startupinfo"] = startupinfo
++
++ for command in commands:
+ try:
+- dispcmd = str([c] + args)
++ dispcmd = str([command] + args)
+ # remember shell=False, so use git.cmd on windows, not just git
+- p = subprocess.Popen([c] + args, cwd=cwd, stdout=subprocess.PIPE,
+- stderr=(subprocess.PIPE if hide_stderr
+- else None))
++ process = subprocess.Popen([command] + args, cwd=cwd, env=env,
++ stdout=subprocess.PIPE,
++ stderr=(subprocess.PIPE if hide_stderr
++ else None), **popen_kwargs)
+ break
+- except EnvironmentError:
++ except OSError:
+ e = sys.exc_info()[1]
+ if e.errno == errno.ENOENT:
+ continue
+ if verbose:
+ print("unable to run %s" % dispcmd)
+ print(e)
+- return None
++ return None, None
+ else:
+ if verbose:
+ print("unable to find command, tried %s" % (commands,))
+- return None
+- stdout = p.communicate()[0].strip()
+- if sys.version_info[0] >= 3:
+- stdout = stdout.decode()
+- if p.returncode != 0:
++ return None, None
++ stdout = process.communicate()[0].strip().decode()
++ if process.returncode != 0:
+ if verbose:
+ print("unable to run %s (error)" % dispcmd)
+- return None
+- return stdout
+-LONG_VERSION_PY['git'] = '''
++ print("stdout was %s" % stdout)
++ return None, process.returncode
++ return stdout, process.returncode
++
++
++LONG_VERSION_PY['git'] = r'''
+ # This file helps to compute a version number in source trees obtained from
+ # git-archive tarball (such as those provided by githubs download-from-tag
+ # feature). Distribution tarballs (built by setup.py sdist) and build
+@@ -490,7 +431,7 @@ LONG_VERSION_PY['git'] = '''
+ # that just contains the computed version number.
+
+ # This file is released into the public domain. Generated by
+-# versioneer-0.16 (https://github.com/warner/python-versioneer)
++# versioneer-0.22 (https://github.com/python-versioneer/python-versioneer)
+
+ """Git implementation of _version.py."""
+
+@@ -499,6 +440,8 @@ import os
+ import re
+ import subprocess
+ import sys
++from typing import Callable, Dict
++import functools
+
+
+ def get_keywords():
+@@ -509,7 +452,8 @@ def get_keywords():
+ # get_keywords().
+ git_refnames = "%(DOLLAR)sFormat:%%d%(DOLLAR)s"
+ git_full = "%(DOLLAR)sFormat:%%H%(DOLLAR)s"
+- keywords = {"refnames": git_refnames, "full": git_full}
++ git_date = "%(DOLLAR)sFormat:%%ci%(DOLLAR)s"
++ keywords = {"refnames": git_refnames, "full": git_full, "date": git_date}
+ return keywords
+
+
+@@ -535,12 +479,12 @@ class NotThisMethod(Exception):
+ """Exception raised if a method is not valid for the current scenario."""
+
+
+-LONG_VERSION_PY = {}
+-HANDLERS = {}
++LONG_VERSION_PY: Dict[str, str] = {}
++HANDLERS: Dict[str, Dict[str, Callable]] = {}
+
+
+ def register_vcs_handler(vcs, method): # decorator
+- """Decorator to mark a method as the handler for a particular VCS."""
++ """Create decorator to mark a method as the handler of a VCS."""
+ def decorate(f):
+ """Store f in HANDLERS[vcs][method]."""
+ if vcs not in HANDLERS:
+@@ -550,55 +494,71 @@ def register_vcs_handler(vcs, method): # decorator
+ return decorate
+
+
+-def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False):
++def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False,
++ env=None):
+ """Call the given command(s)."""
+ assert isinstance(commands, list)
+- p = None
+- for c in commands:
++ process = None
++
++ popen_kwargs = {}
++ if sys.platform == "win32":
++ # This hides the console window if pythonw.exe is used
++ startupinfo = subprocess.STARTUPINFO()
++ startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
++ popen_kwargs["startupinfo"] = startupinfo
++
++ for command in commands:
+ try:
+- dispcmd = str([c] + args)
++ dispcmd = str([command] + args)
+ # remember shell=False, so use git.cmd on windows, not just git
+- p = subprocess.Popen([c] + args, cwd=cwd, stdout=subprocess.PIPE,
+- stderr=(subprocess.PIPE if hide_stderr
+- else None))
++ process = subprocess.Popen([command] + args, cwd=cwd, env=env,
++ stdout=subprocess.PIPE,
++ stderr=(subprocess.PIPE if hide_stderr
++ else None), **popen_kwargs)
+ break
+- except EnvironmentError:
++ except OSError:
+ e = sys.exc_info()[1]
+ if e.errno == errno.ENOENT:
+ continue
+ if verbose:
+ print("unable to run %%s" %% dispcmd)
+ print(e)
+- return None
++ return None, None
+ else:
+ if verbose:
+ print("unable to find command, tried %%s" %% (commands,))
+- return None
+- stdout = p.communicate()[0].strip()
+- if sys.version_info[0] >= 3:
+- stdout = stdout.decode()
+- if p.returncode != 0:
++ return None, None
++ stdout = process.communicate()[0].strip().decode()
++ if process.returncode != 0:
+ if verbose:
+ print("unable to run %%s (error)" %% dispcmd)
+- return None
+- return stdout
++ print("stdout was %%s" %% stdout)
++ return None, process.returncode
++ return stdout, process.returncode
+
+
+ def versions_from_parentdir(parentdir_prefix, root, verbose):
+ """Try to determine the version from the parent directory name.
+
+- Source tarballs conventionally unpack into a directory that includes
+- both the project name and a version string.
++ Source tarballs conventionally unpack into a directory that includes both
++ the project name and a version string. We will also support searching up
++ two directory levels for an appropriately named parent directory
+ """
+- dirname = os.path.basename(root)
+- if not dirname.startswith(parentdir_prefix):
+- if verbose:
+- print("guessing rootdir is '%%s', but '%%s' doesn't start with "
+- "prefix '%%s'" %% (root, dirname, parentdir_prefix))
+- raise NotThisMethod("rootdir doesn't start with parentdir_prefix")
+- return {"version": dirname[len(parentdir_prefix):],
+- "full-revisionid": None,
+- "dirty": False, "error": None}
++ rootdirs = []
++
++ for _ in range(3):
++ dirname = os.path.basename(root)
++ if dirname.startswith(parentdir_prefix):
++ return {"version": dirname[len(parentdir_prefix):],
++ "full-revisionid": None,
++ "dirty": False, "error": None, "date": None}
++ rootdirs.append(root)
++ root = os.path.dirname(root) # up a level
++
++ if verbose:
++ print("Tried directories %%s but none started with prefix %%s" %%
++ (str(rootdirs), parentdir_prefix))
++ raise NotThisMethod("rootdir doesn't start with parentdir_prefix")
+
+
+ @register_vcs_handler("git", "get_keywords")
+@@ -610,18 +570,21 @@ def git_get_keywords(versionfile_abs):
+ # _version.py.
+ keywords = {}
+ try:
+- f = open(versionfile_abs, "r")
+- for line in f.readlines():
+- if line.strip().startswith("git_refnames ="):
+- mo = re.search(r'=\s*"(.*)"', line)
+- if mo:
+- keywords["refnames"] = mo.group(1)
+- if line.strip().startswith("git_full ="):
+- mo = re.search(r'=\s*"(.*)"', line)
+- if mo:
+- keywords["full"] = mo.group(1)
+- f.close()
+- except EnvironmentError:
++ with open(versionfile_abs, "r") as fobj:
++ for line in fobj:
++ if line.strip().startswith("git_refnames ="):
++ mo = re.search(r'=\s*"(.*)"', line)
++ if mo:
++ keywords["refnames"] = mo.group(1)
++ if line.strip().startswith("git_full ="):
++ mo = re.search(r'=\s*"(.*)"', line)
++ if mo:
++ keywords["full"] = mo.group(1)
++ if line.strip().startswith("git_date ="):
++ mo = re.search(r'=\s*"(.*)"', line)
++ if mo:
++ keywords["date"] = mo.group(1)
++ except OSError:
+ pass
+ return keywords
+
+@@ -629,18 +592,31 @@ def git_get_keywords(versionfile_abs):
+ @register_vcs_handler("git", "keywords")
+ def git_versions_from_keywords(keywords, tag_prefix, verbose):
+ """Get version information from git keywords."""
+- if not keywords:
+- raise NotThisMethod("no keywords at all, weird")
++ if "refnames" not in keywords:
++ raise NotThisMethod("Short version file found")
++ date = keywords.get("date")
++ if date is not None:
++ # Use only the last line. Previous lines may contain GPG signature
++ # information.
++ date = date.splitlines()[-1]
++
++ # git-2.2.0 added "%%cI", which expands to an ISO-8601 -compliant
++ # datestamp. However we prefer "%%ci" (which expands to an "ISO-8601
++ # -like" string, which we must then edit to make compliant), because
++ # it's been around since git-1.5.3, and it's too difficult to
++ # discover which version we're using, or to work around using an
++ # older one.
++ date = date.strip().replace(" ", "T", 1).replace(" ", "", 1)
+ refnames = keywords["refnames"].strip()
+ if refnames.startswith("$Format"):
+ if verbose:
+ print("keywords are unexpanded, not using")
+ raise NotThisMethod("unexpanded keywords, not a git-archive tarball")
+- refs = set([r.strip() for r in refnames.strip("()").split(",")])
++ refs = {r.strip() for r in refnames.strip("()").split(",")}
+ # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of
+ # just "foo-1.0". If we see a "tag: " prefix, prefer those.
+ TAG = "tag: "
+- tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)])
++ tags = {r[len(TAG):] for r in refs if r.startswith(TAG)}
+ if not tags:
+ # Either we're using git < 1.8.3, or there really are no tags. We use
+ # a heuristic: assume all version tags have a digit. The old git %%d
+@@ -649,56 +625,72 @@ def git_versions_from_keywords(keywords, tag_prefix, verbose):
+ # between branches and tags. By ignoring refnames without digits, we
+ # filter out many common branch names like "release" and
+ # "stabilization", as well as "HEAD" and "master".
+- tags = set([r for r in refs if re.search(r'\d', r)])
++ tags = {r for r in refs if re.search(r'\d', r)}
+ if verbose:
+- print("discarding '%%s', no digits" %% ",".join(refs-tags))
++ print("discarding '%%s', no digits" %% ",".join(refs - tags))
+ if verbose:
+ print("likely tags: %%s" %% ",".join(sorted(tags)))
+ for ref in sorted(tags):
+ # sorting will prefer e.g. "2.0" over "2.0rc1"
+ if ref.startswith(tag_prefix):
+ r = ref[len(tag_prefix):]
++ # Filter out refs that exactly match prefix or that don't start
++ # with a number once the prefix is stripped (mostly a concern
++ # when prefix is '')
++ if not re.match(r'\d', r):
++ continue
+ if verbose:
+ print("picking %%s" %% r)
+ return {"version": r,
+ "full-revisionid": keywords["full"].strip(),
+- "dirty": False, "error": None
+- }
++ "dirty": False, "error": None,
++ "date": date}
+ # no suitable tags, so version is "0+unknown", but full hex is still there
+ if verbose:
+ print("no suitable tags, using unknown + full revision id")
+ return {"version": "0+unknown",
+ "full-revisionid": keywords["full"].strip(),
+- "dirty": False, "error": "no suitable tags"}
++ "dirty": False, "error": "no suitable tags", "date": None}
+
+
+ @register_vcs_handler("git", "pieces_from_vcs")
+-def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command):
++def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command):
+ """Get version from 'git describe' in the root of the source tree.
+
+ This only gets called if the git-archive 'subst' keywords were *not*
+ expanded, and _version.py hasn't already been rewritten with a short
+ version string, meaning we're inside a checked out source tree.
+ """
+- if not os.path.exists(os.path.join(root, ".git")):
+- if verbose:
+- print("no .git in %%s" %% root)
+- raise NotThisMethod("no .git directory")
+-
+ GITS = ["git"]
+ if sys.platform == "win32":
+ GITS = ["git.cmd", "git.exe"]
++
++ # GIT_DIR can interfere with correct operation of Versioneer.
++ # It may be intended to be passed to the Versioneer-versioned project,
++ # but that should not change where we get our version from.
++ env = os.environ.copy()
++ env.pop("GIT_DIR", None)
++ runner = functools.partial(runner, env=env)
++
++ _, rc = runner(GITS, ["rev-parse", "--git-dir"], cwd=root,
++ hide_stderr=True)
++ if rc != 0:
++ if verbose:
++ print("Directory %%s not under git control" %% root)
++ raise NotThisMethod("'git rev-parse --git-dir' returned error")
++
++ MATCH_ARGS = ["--match", "%%s*" %% tag_prefix] if tag_prefix else []
++
+ # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty]
+ # if there isn't one, this yields HEX[-dirty] (no NUM)
+- describe_out = run_command(GITS, ["describe", "--tags", "--dirty",
+- "--always", "--long",
+- "--match", "%%s*" %% tag_prefix],
+- cwd=root)
++ describe_out, rc = runner(GITS, ["describe", "--tags", "--dirty",
++ "--always", "--long", *MATCH_ARGS],
++ cwd=root)
+ # --long was added in git-1.5.5
+ if describe_out is None:
+ raise NotThisMethod("'git describe' failed")
+ describe_out = describe_out.strip()
+- full_out = run_command(GITS, ["rev-parse", "HEAD"], cwd=root)
++ full_out, rc = runner(GITS, ["rev-parse", "HEAD"], cwd=root)
+ if full_out is None:
+ raise NotThisMethod("'git rev-parse' failed")
+ full_out = full_out.strip()
+@@ -708,6 +700,39 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command):
+ pieces["short"] = full_out[:7] # maybe improved later
+ pieces["error"] = None
+
++ branch_name, rc = runner(GITS, ["rev-parse", "--abbrev-ref", "HEAD"],
++ cwd=root)
++ # --abbrev-ref was added in git-1.6.3
++ if rc != 0 or branch_name is None:
++ raise NotThisMethod("'git rev-parse --abbrev-ref' returned error")
++ branch_name = branch_name.strip()
++
++ if branch_name == "HEAD":
++ # If we aren't exactly on a branch, pick a branch which represents
++ # the current commit. If all else fails, we are on a branchless
++ # commit.
++ branches, rc = runner(GITS, ["branch", "--contains"], cwd=root)
++ # --contains was added in git-1.5.4
++ if rc != 0 or branches is None:
++ raise NotThisMethod("'git branch --contains' returned error")
++ branches = branches.split("\n")
++
++ # Remove the first line if we're running detached
++ if "(" in branches[0]:
++ branches.pop(0)
++
++ # Strip off the leading "* " from the list of branches.
++ branches = [branch[2:] for branch in branches]
++ if "master" in branches:
++ branch_name = "master"
++ elif not branches:
++ branch_name = None
++ else:
++ # Pick the first branch that is returned. Good or bad.
++ branch_name = branches[0]
++
++ pieces["branch"] = branch_name
++
+ # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty]
+ # TAG might have hyphens.
+ git_describe = describe_out
+@@ -724,7 +749,7 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command):
+ # TAG-NUM-gHEX
+ mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe)
+ if not mo:
+- # unparseable. Maybe git-describe is misbehaving?
++ # unparsable. Maybe git-describe is misbehaving?
+ pieces["error"] = ("unable to parse git-describe output: '%%s'"
+ %% describe_out)
+ return pieces
+@@ -749,10 +774,16 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command):
+ else:
+ # HEX: no tags
+ pieces["closest-tag"] = None
+- count_out = run_command(GITS, ["rev-list", "HEAD", "--count"],
+- cwd=root)
++ count_out, rc = runner(GITS, ["rev-list", "HEAD", "--count"], cwd=root)
+ pieces["distance"] = int(count_out) # total number of commits
+
++ # commit date: see ISO-8601 comment in git_versions_from_keywords()
++ date = runner(GITS, ["show", "-s", "--format=%%ci", "HEAD"], cwd=root)[0].strip()
++ # Use only the last line. Previous lines may contain GPG signature
++ # information.
++ date = date.splitlines()[-1]
++ pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1)
++
+ return pieces
+
+
+@@ -788,19 +819,67 @@ def render_pep440(pieces):
+ return rendered
+
+
+-def render_pep440_pre(pieces):
+- """TAG[.post.devDISTANCE] -- No -dirty.
++def render_pep440_branch(pieces):
++ """TAG[[.dev0]+DISTANCE.gHEX[.dirty]] .
++
++ The ".dev0" means not master branch. Note that .dev0 sorts backwards
++ (a feature branch will appear "older" than the master branch).
+
+ Exceptions:
+- 1: no tags. 0.post.devDISTANCE
++ 1: no tags. 0[.dev0]+untagged.DISTANCE.gHEX[.dirty]
+ """
+ if pieces["closest-tag"]:
+ rendered = pieces["closest-tag"]
++ if pieces["distance"] or pieces["dirty"]:
++ if pieces["branch"] != "master":
++ rendered += ".dev0"
++ rendered += plus_or_dot(pieces)
++ rendered += "%%d.g%%s" %% (pieces["distance"], pieces["short"])
++ if pieces["dirty"]:
++ rendered += ".dirty"
++ else:
++ # exception #1
++ rendered = "0"
++ if pieces["branch"] != "master":
++ rendered += ".dev0"
++ rendered += "+untagged.%%d.g%%s" %% (pieces["distance"],
++ pieces["short"])
++ if pieces["dirty"]:
++ rendered += ".dirty"
++ return rendered
++
++
++def pep440_split_post(ver):
++ """Split pep440 version string at the post-release segment.
++
++ Returns the release segments before the post-release and the
++ post-release version number (or -1 if no post-release segment is present).
++ """
++ vc = str.split(ver, ".post")
++ return vc[0], int(vc[1] or 0) if len(vc) == 2 else None
++
++
++def render_pep440_pre(pieces):
++ """TAG[.postN.devDISTANCE] -- No -dirty.
++
++ Exceptions:
++ 1: no tags. 0.post0.devDISTANCE
++ """
++ if pieces["closest-tag"]:
+ if pieces["distance"]:
+- rendered += ".post.dev%%d" %% pieces["distance"]
++ # update the post release segment
++ tag_version, post_version = pep440_split_post(pieces["closest-tag"])
++ rendered = tag_version
++ if post_version is not None:
++ rendered += ".post%%d.dev%%d" %% (post_version+1, pieces["distance"])
++ else:
++ rendered += ".post0.dev%%d" %% (pieces["distance"])
++ else:
++ # no commits, use the tag as the version
++ rendered = pieces["closest-tag"]
+ else:
+ # exception #1
+- rendered = "0.post.dev%%d" %% pieces["distance"]
++ rendered = "0.post0.dev%%d" %% pieces["distance"]
+ return rendered
+
+
+@@ -831,12 +910,41 @@ def render_pep440_post(pieces):
+ return rendered
+
+
++def render_pep440_post_branch(pieces):
++ """TAG[.postDISTANCE[.dev0]+gHEX[.dirty]] .
++
++ The ".dev0" means not master branch.
++
++ Exceptions:
++ 1: no tags. 0.postDISTANCE[.dev0]+gHEX[.dirty]
++ """
++ if pieces["closest-tag"]:
++ rendered = pieces["closest-tag"]
++ if pieces["distance"] or pieces["dirty"]:
++ rendered += ".post%%d" %% pieces["distance"]
++ if pieces["branch"] != "master":
++ rendered += ".dev0"
++ rendered += plus_or_dot(pieces)
++ rendered += "g%%s" %% pieces["short"]
++ if pieces["dirty"]:
++ rendered += ".dirty"
++ else:
++ # exception #1
++ rendered = "0.post%%d" %% pieces["distance"]
++ if pieces["branch"] != "master":
++ rendered += ".dev0"
++ rendered += "+g%%s" %% pieces["short"]
++ if pieces["dirty"]:
++ rendered += ".dirty"
++ return rendered
++
++
+ def render_pep440_old(pieces):
+ """TAG[.postDISTANCE[.dev0]] .
+
+ The ".dev0" means dirty.
+
+- Eexceptions:
++ Exceptions:
+ 1: no tags. 0.postDISTANCE[.dev0]
+ """
+ if pieces["closest-tag"]:
+@@ -899,17 +1007,22 @@ def render(pieces, style):
+ return {"version": "unknown",
+ "full-revisionid": pieces.get("long"),
+ "dirty": None,
+- "error": pieces["error"]}
++ "error": pieces["error"],
++ "date": None}
+
+ if not style or style == "default":
+ style = "pep440" # the default
+
+ if style == "pep440":
+ rendered = render_pep440(pieces)
++ elif style == "pep440-branch":
++ rendered = render_pep440_branch(pieces)
+ elif style == "pep440-pre":
+ rendered = render_pep440_pre(pieces)
+ elif style == "pep440-post":
+ rendered = render_pep440_post(pieces)
++ elif style == "pep440-post-branch":
++ rendered = render_pep440_post_branch(pieces)
+ elif style == "pep440-old":
+ rendered = render_pep440_old(pieces)
+ elif style == "git-describe":
+@@ -920,7 +1033,8 @@ def render(pieces, style):
+ raise ValueError("unknown style '%%s'" %% style)
+
+ return {"version": rendered, "full-revisionid": pieces["long"],
+- "dirty": pieces["dirty"], "error": None}
++ "dirty": pieces["dirty"], "error": None,
++ "date": pieces.get("date")}
+
+
+ def get_versions():
+@@ -944,12 +1058,13 @@ def get_versions():
+ # versionfile_source is the relative path from the top of the source
+ # tree (where the .git directory might live) to this file. Invert
+ # this to find the root from __file__.
+- for i in cfg.versionfile_source.split('/'):
++ for _ in cfg.versionfile_source.split('/'):
+ root = os.path.dirname(root)
+ except NameError:
+ return {"version": "0+unknown", "full-revisionid": None,
+ "dirty": None,
+- "error": "unable to find root of source tree"}
++ "error": "unable to find root of source tree",
++ "date": None}
+
+ try:
+ pieces = git_pieces_from_vcs(cfg.tag_prefix, root, verbose)
+@@ -965,7 +1080,7 @@ def get_versions():
+
+ return {"version": "0+unknown", "full-revisionid": None,
+ "dirty": None,
+- "error": "unable to compute version"}
++ "error": "unable to compute version", "date": None}
+ '''
+
+
+@@ -978,18 +1093,21 @@ def git_get_keywords(versionfile_abs):
+ # _version.py.
+ keywords = {}
+ try:
+- f = open(versionfile_abs, "r")
+- for line in f.readlines():
+- if line.strip().startswith("git_refnames ="):
+- mo = re.search(r'=\s*"(.*)"', line)
+- if mo:
+- keywords["refnames"] = mo.group(1)
+- if line.strip().startswith("git_full ="):
+- mo = re.search(r'=\s*"(.*)"', line)
+- if mo:
+- keywords["full"] = mo.group(1)
+- f.close()
+- except EnvironmentError:
++ with open(versionfile_abs, "r") as fobj:
++ for line in fobj:
++ if line.strip().startswith("git_refnames ="):
++ mo = re.search(r'=\s*"(.*)"', line)
++ if mo:
++ keywords["refnames"] = mo.group(1)
++ if line.strip().startswith("git_full ="):
++ mo = re.search(r'=\s*"(.*)"', line)
++ if mo:
++ keywords["full"] = mo.group(1)
++ if line.strip().startswith("git_date ="):
++ mo = re.search(r'=\s*"(.*)"', line)
++ if mo:
++ keywords["date"] = mo.group(1)
++ except OSError:
+ pass
+ return keywords
+
+@@ -997,18 +1115,31 @@ def git_get_keywords(versionfile_abs):
+ @register_vcs_handler("git", "keywords")
+ def git_versions_from_keywords(keywords, tag_prefix, verbose):
+ """Get version information from git keywords."""
+- if not keywords:
+- raise NotThisMethod("no keywords at all, weird")
++ if "refnames" not in keywords:
++ raise NotThisMethod("Short version file found")
++ date = keywords.get("date")
++ if date is not None:
++ # Use only the last line. Previous lines may contain GPG signature
++ # information.
++ date = date.splitlines()[-1]
++
++ # git-2.2.0 added "%cI", which expands to an ISO-8601 -compliant
++ # datestamp. However we prefer "%ci" (which expands to an "ISO-8601
++ # -like" string, which we must then edit to make compliant), because
++ # it's been around since git-1.5.3, and it's too difficult to
++ # discover which version we're using, or to work around using an
++ # older one.
++ date = date.strip().replace(" ", "T", 1).replace(" ", "", 1)
+ refnames = keywords["refnames"].strip()
+ if refnames.startswith("$Format"):
+ if verbose:
+ print("keywords are unexpanded, not using")
+ raise NotThisMethod("unexpanded keywords, not a git-archive tarball")
+- refs = set([r.strip() for r in refnames.strip("()").split(",")])
++ refs = {r.strip() for r in refnames.strip("()").split(",")}
+ # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of
+ # just "foo-1.0". If we see a "tag: " prefix, prefer those.
+ TAG = "tag: "
+- tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)])
++ tags = {r[len(TAG):] for r in refs if r.startswith(TAG)}
+ if not tags:
+ # Either we're using git < 1.8.3, or there really are no tags. We use
+ # a heuristic: assume all version tags have a digit. The old git %d
+@@ -1017,56 +1148,72 @@ def git_versions_from_keywords(keywords, tag_prefix, verbose):
+ # between branches and tags. By ignoring refnames without digits, we
+ # filter out many common branch names like "release" and
+ # "stabilization", as well as "HEAD" and "master".
+- tags = set([r for r in refs if re.search(r'\d', r)])
++ tags = {r for r in refs if re.search(r'\d', r)}
+ if verbose:
+- print("discarding '%s', no digits" % ",".join(refs-tags))
++ print("discarding '%s', no digits" % ",".join(refs - tags))
+ if verbose:
+ print("likely tags: %s" % ",".join(sorted(tags)))
+ for ref in sorted(tags):
+ # sorting will prefer e.g. "2.0" over "2.0rc1"
+ if ref.startswith(tag_prefix):
+ r = ref[len(tag_prefix):]
++ # Filter out refs that exactly match prefix or that don't start
++ # with a number once the prefix is stripped (mostly a concern
++ # when prefix is '')
++ if not re.match(r'\d', r):
++ continue
+ if verbose:
+ print("picking %s" % r)
+ return {"version": r,
+ "full-revisionid": keywords["full"].strip(),
+- "dirty": False, "error": None
+- }
++ "dirty": False, "error": None,
++ "date": date}
+ # no suitable tags, so version is "0+unknown", but full hex is still there
+ if verbose:
+ print("no suitable tags, using unknown + full revision id")
+ return {"version": "0+unknown",
+ "full-revisionid": keywords["full"].strip(),
+- "dirty": False, "error": "no suitable tags"}
++ "dirty": False, "error": "no suitable tags", "date": None}
+
+
+ @register_vcs_handler("git", "pieces_from_vcs")
+-def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command):
++def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command):
+ """Get version from 'git describe' in the root of the source tree.
+
+ This only gets called if the git-archive 'subst' keywords were *not*
+ expanded, and _version.py hasn't already been rewritten with a short
+ version string, meaning we're inside a checked out source tree.
+ """
+- if not os.path.exists(os.path.join(root, ".git")):
+- if verbose:
+- print("no .git in %s" % root)
+- raise NotThisMethod("no .git directory")
+-
+ GITS = ["git"]
+ if sys.platform == "win32":
+ GITS = ["git.cmd", "git.exe"]
++
++ # GIT_DIR can interfere with correct operation of Versioneer.
++ # It may be intended to be passed to the Versioneer-versioned project,
++ # but that should not change where we get our version from.
++ env = os.environ.copy()
++ env.pop("GIT_DIR", None)
++ runner = functools.partial(runner, env=env)
++
++ _, rc = runner(GITS, ["rev-parse", "--git-dir"], cwd=root,
++ hide_stderr=True)
++ if rc != 0:
++ if verbose:
++ print("Directory %s not under git control" % root)
++ raise NotThisMethod("'git rev-parse --git-dir' returned error")
++
++ MATCH_ARGS = ["--match", "%s*" % tag_prefix] if tag_prefix else []
++
+ # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty]
+ # if there isn't one, this yields HEX[-dirty] (no NUM)
+- describe_out = run_command(GITS, ["describe", "--tags", "--dirty",
+- "--always", "--long",
+- "--match", "%s*" % tag_prefix],
+- cwd=root)
++ describe_out, rc = runner(GITS, ["describe", "--tags", "--dirty",
++ "--always", "--long", *MATCH_ARGS],
++ cwd=root)
+ # --long was added in git-1.5.5
+ if describe_out is None:
+ raise NotThisMethod("'git describe' failed")
+ describe_out = describe_out.strip()
+- full_out = run_command(GITS, ["rev-parse", "HEAD"], cwd=root)
++ full_out, rc = runner(GITS, ["rev-parse", "HEAD"], cwd=root)
+ if full_out is None:
+ raise NotThisMethod("'git rev-parse' failed")
+ full_out = full_out.strip()
+@@ -1076,6 +1223,39 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command):
+ pieces["short"] = full_out[:7] # maybe improved later
+ pieces["error"] = None
+
++ branch_name, rc = runner(GITS, ["rev-parse", "--abbrev-ref", "HEAD"],
++ cwd=root)
++ # --abbrev-ref was added in git-1.6.3
++ if rc != 0 or branch_name is None:
++ raise NotThisMethod("'git rev-parse --abbrev-ref' returned error")
++ branch_name = branch_name.strip()
++
++ if branch_name == "HEAD":
++ # If we aren't exactly on a branch, pick a branch which represents
++ # the current commit. If all else fails, we are on a branchless
++ # commit.
++ branches, rc = runner(GITS, ["branch", "--contains"], cwd=root)
++ # --contains was added in git-1.5.4
++ if rc != 0 or branches is None:
++ raise NotThisMethod("'git branch --contains' returned error")
++ branches = branches.split("\n")
++
++ # Remove the first line if we're running detached
++ if "(" in branches[0]:
++ branches.pop(0)
++
++ # Strip off the leading "* " from the list of branches.
++ branches = [branch[2:] for branch in branches]
++ if "master" in branches:
++ branch_name = "master"
++ elif not branches:
++ branch_name = None
++ else:
++ # Pick the first branch that is returned. Good or bad.
++ branch_name = branches[0]
++
++ pieces["branch"] = branch_name
++
+ # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty]
+ # TAG might have hyphens.
+ git_describe = describe_out
+@@ -1092,7 +1272,7 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command):
+ # TAG-NUM-gHEX
+ mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe)
+ if not mo:
+- # unparseable. Maybe git-describe is misbehaving?
++ # unparsable. Maybe git-describe is misbehaving?
+ pieces["error"] = ("unable to parse git-describe output: '%s'"
+ % describe_out)
+ return pieces
+@@ -1117,10 +1297,16 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command):
+ else:
+ # HEX: no tags
+ pieces["closest-tag"] = None
+- count_out = run_command(GITS, ["rev-list", "HEAD", "--count"],
+- cwd=root)
++ count_out, rc = runner(GITS, ["rev-list", "HEAD", "--count"], cwd=root)
+ pieces["distance"] = int(count_out) # total number of commits
+
++ # commit date: see ISO-8601 comment in git_versions_from_keywords()
++ date = runner(GITS, ["show", "-s", "--format=%ci", "HEAD"], cwd=root)[0].strip()
++ # Use only the last line. Previous lines may contain GPG signature
++ # information.
++ date = date.splitlines()[-1]
++ pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1)
++
+ return pieces
+
+
+@@ -1128,7 +1314,7 @@ def do_vcs_install(manifest_in, versionfile_source, ipy):
+ """Git-specific installation logic for Versioneer.
+
+ For Git, this means creating/changing .gitattributes to mark _version.py
+- for export-time keyword substitution.
++ for export-subst keyword substitution.
+ """
+ GITS = ["git"]
+ if sys.platform == "win32":
+@@ -1137,27 +1323,26 @@ def do_vcs_install(manifest_in, versionfile_source, ipy):
+ if ipy:
+ files.append(ipy)
+ try:
+- me = __file__
+- if me.endswith(".pyc") or me.endswith(".pyo"):
+- me = os.path.splitext(me)[0] + ".py"
+- versioneer_file = os.path.relpath(me)
++ my_path = __file__
++ if my_path.endswith(".pyc") or my_path.endswith(".pyo"):
++ my_path = os.path.splitext(my_path)[0] + ".py"
++ versioneer_file = os.path.relpath(my_path)
+ except NameError:
+ versioneer_file = "versioneer.py"
+ files.append(versioneer_file)
+ present = False
+ try:
+- f = open(".gitattributes", "r")
+- for line in f.readlines():
+- if line.strip().startswith(versionfile_source):
+- if "export-subst" in line.strip().split()[1:]:
+- present = True
+- f.close()
+- except EnvironmentError:
++ with open(".gitattributes", "r") as fobj:
++ for line in fobj:
++ if line.strip().startswith(versionfile_source):
++ if "export-subst" in line.strip().split()[1:]:
++ present = True
++ break
++ except OSError:
+ pass
+ if not present:
+- f = open(".gitattributes", "a+")
+- f.write("%s export-subst\n" % versionfile_source)
+- f.close()
++ with open(".gitattributes", "a+") as fobj:
++ fobj.write(f"{versionfile_source} export-subst\n")
+ files.append(".gitattributes")
+ run_command(GITS, ["add", "--"] + files)
+
+@@ -1165,27 +1350,34 @@ def do_vcs_install(manifest_in, versionfile_source, ipy):
+ def versions_from_parentdir(parentdir_prefix, root, verbose):
+ """Try to determine the version from the parent directory name.
+
+- Source tarballs conventionally unpack into a directory that includes
+- both the project name and a version string.
++ Source tarballs conventionally unpack into a directory that includes both
++ the project name and a version string. We will also support searching up
++ two directory levels for an appropriately named parent directory
+ """
+- dirname = os.path.basename(root)
+- if not dirname.startswith(parentdir_prefix):
+- if verbose:
+- print("guessing rootdir is '%s', but '%s' doesn't start with "
+- "prefix '%s'" % (root, dirname, parentdir_prefix))
+- raise NotThisMethod("rootdir doesn't start with parentdir_prefix")
+- return {"version": dirname[len(parentdir_prefix):],
+- "full-revisionid": None,
+- "dirty": False, "error": None}
++ rootdirs = []
++
++ for _ in range(3):
++ dirname = os.path.basename(root)
++ if dirname.startswith(parentdir_prefix):
++ return {"version": dirname[len(parentdir_prefix):],
++ "full-revisionid": None,
++ "dirty": False, "error": None, "date": None}
++ rootdirs.append(root)
++ root = os.path.dirname(root) # up a level
++
++ if verbose:
++ print("Tried directories %s but none started with prefix %s" %
++ (str(rootdirs), parentdir_prefix))
++ raise NotThisMethod("rootdir doesn't start with parentdir_prefix")
++
+
+ SHORT_VERSION_PY = """
+-# This file was generated by 'versioneer.py' (0.16) from
++# This file was generated by 'versioneer.py' (0.22) from
+ # revision-control system data, or from the parent directory name of an
+ # unpacked source archive. Distribution tarballs contain a pre-generated copy
+ # of this file.
+
+ import json
+-import sys
+
+ version_json = '''
+ %s
+@@ -1202,10 +1394,13 @@ def versions_from_file(filename):
+ try:
+ with open(filename) as f:
+ contents = f.read()
+- except EnvironmentError:
++ except OSError:
+ raise NotThisMethod("unable to read _version.py")
+ mo = re.search(r"version_json = '''\n(.*)''' # END VERSION_JSON",
+ contents, re.M | re.S)
++ if not mo:
++ mo = re.search(r"version_json = '''\r\n(.*)''' # END VERSION_JSON",
++ contents, re.M | re.S)
+ if not mo:
+ raise NotThisMethod("no version_json in _version.py")
+ return json.loads(mo.group(1))
+@@ -1254,19 +1449,67 @@ def render_pep440(pieces):
+ return rendered
+
+
+-def render_pep440_pre(pieces):
+- """TAG[.post.devDISTANCE] -- No -dirty.
++def render_pep440_branch(pieces):
++ """TAG[[.dev0]+DISTANCE.gHEX[.dirty]] .
++
++ The ".dev0" means not master branch. Note that .dev0 sorts backwards
++ (a feature branch will appear "older" than the master branch).
+
+ Exceptions:
+- 1: no tags. 0.post.devDISTANCE
++ 1: no tags. 0[.dev0]+untagged.DISTANCE.gHEX[.dirty]
+ """
+ if pieces["closest-tag"]:
+ rendered = pieces["closest-tag"]
++ if pieces["distance"] or pieces["dirty"]:
++ if pieces["branch"] != "master":
++ rendered += ".dev0"
++ rendered += plus_or_dot(pieces)
++ rendered += "%d.g%s" % (pieces["distance"], pieces["short"])
++ if pieces["dirty"]:
++ rendered += ".dirty"
++ else:
++ # exception #1
++ rendered = "0"
++ if pieces["branch"] != "master":
++ rendered += ".dev0"
++ rendered += "+untagged.%d.g%s" % (pieces["distance"],
++ pieces["short"])
++ if pieces["dirty"]:
++ rendered += ".dirty"
++ return rendered
++
++
++def pep440_split_post(ver):
++ """Split pep440 version string at the post-release segment.
++
++ Returns the release segments before the post-release and the
++ post-release version number (or -1 if no post-release segment is present).
++ """
++ vc = str.split(ver, ".post")
++ return vc[0], int(vc[1] or 0) if len(vc) == 2 else None
++
++
++def render_pep440_pre(pieces):
++ """TAG[.postN.devDISTANCE] -- No -dirty.
++
++ Exceptions:
++ 1: no tags. 0.post0.devDISTANCE
++ """
++ if pieces["closest-tag"]:
+ if pieces["distance"]:
+- rendered += ".post.dev%d" % pieces["distance"]
++ # update the post release segment
++ tag_version, post_version = pep440_split_post(pieces["closest-tag"])
++ rendered = tag_version
++ if post_version is not None:
++ rendered += ".post%d.dev%d" % (post_version+1, pieces["distance"])
++ else:
++ rendered += ".post0.dev%d" % (pieces["distance"])
++ else:
++ # no commits, use the tag as the version
++ rendered = pieces["closest-tag"]
+ else:
+ # exception #1
+- rendered = "0.post.dev%d" % pieces["distance"]
++ rendered = "0.post0.dev%d" % pieces["distance"]
+ return rendered
+
+
+@@ -1297,12 +1540,41 @@ def render_pep440_post(pieces):
+ return rendered
+
+
++def render_pep440_post_branch(pieces):
++ """TAG[.postDISTANCE[.dev0]+gHEX[.dirty]] .
++
++ The ".dev0" means not master branch.
++
++ Exceptions:
++ 1: no tags. 0.postDISTANCE[.dev0]+gHEX[.dirty]
++ """
++ if pieces["closest-tag"]:
++ rendered = pieces["closest-tag"]
++ if pieces["distance"] or pieces["dirty"]:
++ rendered += ".post%d" % pieces["distance"]
++ if pieces["branch"] != "master":
++ rendered += ".dev0"
++ rendered += plus_or_dot(pieces)
++ rendered += "g%s" % pieces["short"]
++ if pieces["dirty"]:
++ rendered += ".dirty"
++ else:
++ # exception #1
++ rendered = "0.post%d" % pieces["distance"]
++ if pieces["branch"] != "master":
++ rendered += ".dev0"
++ rendered += "+g%s" % pieces["short"]
++ if pieces["dirty"]:
++ rendered += ".dirty"
++ return rendered
++
++
+ def render_pep440_old(pieces):
+ """TAG[.postDISTANCE[.dev0]] .
+
+ The ".dev0" means dirty.
+
+- Eexceptions:
++ Exceptions:
+ 1: no tags. 0.postDISTANCE[.dev0]
+ """
+ if pieces["closest-tag"]:
+@@ -1365,17 +1637,22 @@ def render(pieces, style):
+ return {"version": "unknown",
+ "full-revisionid": pieces.get("long"),
+ "dirty": None,
+- "error": pieces["error"]}
++ "error": pieces["error"],
++ "date": None}
+
+ if not style or style == "default":
+ style = "pep440" # the default
+
+ if style == "pep440":
+ rendered = render_pep440(pieces)
++ elif style == "pep440-branch":
++ rendered = render_pep440_branch(pieces)
+ elif style == "pep440-pre":
+ rendered = render_pep440_pre(pieces)
+ elif style == "pep440-post":
+ rendered = render_pep440_post(pieces)
++ elif style == "pep440-post-branch":
++ rendered = render_pep440_post_branch(pieces)
+ elif style == "pep440-old":
+ rendered = render_pep440_old(pieces)
+ elif style == "git-describe":
+@@ -1386,7 +1663,8 @@ def render(pieces, style):
+ raise ValueError("unknown style '%s'" % style)
+
+ return {"version": rendered, "full-revisionid": pieces["long"],
+- "dirty": pieces["dirty"], "error": None}
++ "dirty": pieces["dirty"], "error": None,
++ "date": pieces.get("date")}
+
+
+ class VersioneerBadRootError(Exception):
+@@ -1465,7 +1743,8 @@ def get_versions(verbose=False):
+ print("unable to compute version")
+
+ return {"version": "0+unknown", "full-revisionid": None,
+- "dirty": None, "error": "unable to compute version"}
++ "dirty": None, "error": "unable to compute version",
++ "date": None}
+
+
+ def get_version():
+@@ -1473,8 +1752,12 @@ def get_version():
+ return get_versions()["version"]
+
+
+-def get_cmdclass():
+- """Get the custom setuptools/distutils subclasses used by Versioneer."""
++def get_cmdclass(cmdclass=None):
++ """Get the custom setuptools/distutils subclasses used by Versioneer.
++
++ If the package uses a different cmdclass (e.g. one from numpy), it
++ should be provide as an argument.
++ """
+ if "versioneer" in sys.modules:
+ del sys.modules["versioneer"]
+ # this fixes the "python setup.py develop" case (also 'install' and
+@@ -1488,12 +1771,15 @@ def get_cmdclass():
+ # parent is protected against the child's "import versioneer". By
+ # removing ourselves from sys.modules here, before the child build
+ # happens, we protect the child from the parent's versioneer too.
+- # Also see https://github.com/warner/python-versioneer/issues/52
++ # Also see https://github.com/python-versioneer/python-versioneer/issues/52
+
+- cmds = {}
++ cmds = {} if cmdclass is None else cmdclass.copy()
+
+ # we add "version" to both distutils and setuptools
+- from distutils.core import Command
++ try:
++ from setuptools import Command
++ except ImportError:
++ from distutils.core import Command
+
+ class cmd_version(Command):
+ description = "report generated version string"
+@@ -1511,6 +1797,7 @@ def get_cmdclass():
+ print("Version: %s" % vers["version"])
+ print(" full-revisionid: %s" % vers.get("full-revisionid"))
+ print(" dirty: %s" % vers.get("dirty"))
++ print(" date: %s" % vers.get("date"))
+ if vers["error"]:
+ print(" error: %s" % vers["error"])
+ cmds["version"] = cmd_version
+@@ -1524,9 +1811,16 @@ def get_cmdclass():
+ # setuptools/bdist_egg -> distutils/install_lib -> build_py
+ # setuptools/install -> bdist_egg ->..
+ # setuptools/develop -> ?
++ # pip install:
++ # copies source tree to a tempdir before running egg_info/etc
++ # if .git isn't copied too, 'git describe' will fail
++ # then does setup.py bdist_wheel, or sometimes setup.py install
++ # setup.py egg_info -> ?
+
+ # we override different "build_py" commands for both environments
+- if "setuptools" in sys.modules:
++ if 'build_py' in cmds:
++ _build_py = cmds['build_py']
++ elif "setuptools" in sys.modules:
+ from setuptools.command.build_py import build_py as _build_py
+ else:
+ from distutils.command.build_py import build_py as _build_py
+@@ -1546,8 +1840,41 @@ def get_cmdclass():
+ write_to_version_file(target_versionfile, versions)
+ cmds["build_py"] = cmd_build_py
+
++ if 'build_ext' in cmds:
++ _build_ext = cmds['build_ext']
++ elif "setuptools" in sys.modules:
++ from setuptools.command.build_ext import build_ext as _build_ext
++ else:
++ from distutils.command.build_ext import build_ext as _build_ext
++
++ class cmd_build_ext(_build_ext):
++ def run(self):
++ root = get_root()
++ cfg = get_config_from_root(root)
++ versions = get_versions()
++ _build_ext.run(self)
++ if self.inplace:
++ # build_ext --inplace will only build extensions in
++ # build/lib<..> dir with no _version.py to write to.
++ # As in place builds will already have a _version.py
++ # in the module dir, we do not need to write one.
++ return
++ # now locate _version.py in the new build/ directory and replace
++ # it with an updated value
++ target_versionfile = os.path.join(self.build_lib,
++ cfg.versionfile_build)
++ print("UPDATING %s" % target_versionfile)
++ write_to_version_file(target_versionfile, versions)
++ cmds["build_ext"] = cmd_build_ext
++
+ if "cx_Freeze" in sys.modules: # cx_freeze enabled?
+ from cx_Freeze.dist import build_exe as _build_exe
++ # nczeczulin reports that py2exe won't like the pep440-style string
++ # as FILEVERSION, but it can be used for PRODUCTVERSION, e.g.
++ # setup(console=[{
++ # "version": versioneer.get_version().split("+", 1)[0], # FILEVERSION
++ # "product_version": versioneer.get_version(),
++ # ...
+
+ class cmd_build_exe(_build_exe):
+ def run(self):
+@@ -1572,8 +1899,35 @@ def get_cmdclass():
+ cmds["build_exe"] = cmd_build_exe
+ del cmds["build_py"]
+
++ if 'py2exe' in sys.modules: # py2exe enabled?
++ from py2exe.distutils_buildexe import py2exe as _py2exe
++
++ class cmd_py2exe(_py2exe):
++ def run(self):
++ root = get_root()
++ cfg = get_config_from_root(root)
++ versions = get_versions()
++ target_versionfile = cfg.versionfile_source
++ print("UPDATING %s" % target_versionfile)
++ write_to_version_file(target_versionfile, versions)
++
++ _py2exe.run(self)
++ os.unlink(target_versionfile)
++ with open(cfg.versionfile_source, "w") as f:
++ LONG = LONG_VERSION_PY[cfg.VCS]
++ f.write(LONG %
++ {"DOLLAR": "$",
++ "STYLE": cfg.style,
++ "TAG_PREFIX": cfg.tag_prefix,
++ "PARENTDIR_PREFIX": cfg.parentdir_prefix,
++ "VERSIONFILE_SOURCE": cfg.versionfile_source,
++ })
++ cmds["py2exe"] = cmd_py2exe
++
+ # we override different "sdist" commands for both environments
+- if "setuptools" in sys.modules:
++ if 'sdist' in cmds:
++ _sdist = cmds['sdist']
++ elif "setuptools" in sys.modules:
+ from setuptools.command.sdist import sdist as _sdist
+ else:
+ from distutils.command.sdist import sdist as _sdist
+@@ -1640,21 +1994,26 @@ SAMPLE_CONFIG = """
+
+ """
+
+-INIT_PY_SNIPPET = """
++OLD_SNIPPET = """
+ from ._version import get_versions
+ __version__ = get_versions()['version']
+ del get_versions
+ """
+
++INIT_PY_SNIPPET = """
++from . import {0}
++__version__ = {0}.get_versions()['version']
++"""
++
+
+ def do_setup():
+- """Main VCS-independent setup function for installing Versioneer."""
++ """Do main VCS-independent setup function for installing Versioneer."""
+ root = get_root()
+ try:
+ cfg = get_config_from_root(root)
+- except (EnvironmentError, configparser.NoSectionError,
++ except (OSError, configparser.NoSectionError,
+ configparser.NoOptionError) as e:
+- if isinstance(e, (EnvironmentError, configparser.NoSectionError)):
++ if isinstance(e, (OSError, configparser.NoSectionError)):
+ print("Adding sample versioneer config to setup.cfg",
+ file=sys.stderr)
+ with open(os.path.join(root, "setup.cfg"), "a") as f:
+@@ -1678,12 +2037,18 @@ def do_setup():
+ try:
+ with open(ipy, "r") as f:
+ old = f.read()
+- except EnvironmentError:
++ except OSError:
+ old = ""
+- if INIT_PY_SNIPPET not in old:
++ module = os.path.splitext(os.path.basename(cfg.versionfile_source))[0]
++ snippet = INIT_PY_SNIPPET.format(module)
++ if OLD_SNIPPET in old:
++ print(" replacing boilerplate in %s" % ipy)
++ with open(ipy, "w") as f:
++ f.write(old.replace(OLD_SNIPPET, snippet))
++ elif snippet not in old:
+ print(" appending to %s" % ipy)
+ with open(ipy, "a") as f:
+- f.write(INIT_PY_SNIPPET)
++ f.write(snippet)
+ else:
+ print(" %s unmodified" % ipy)
+ else:
+@@ -1702,7 +2067,7 @@ def do_setup():
+ if line.startswith("include "):
+ for include in line.split()[1:]:
+ simple_includes.add(include)
+- except EnvironmentError:
++ except OSError:
+ pass
+ # That doesn't cover everything MANIFEST.in can do
+ # (http://docs.python.org/2/distutils/sourcedist.html#commands), so
+@@ -1723,7 +2088,7 @@ def do_setup():
+ print(" versionfile_source already in MANIFEST.in")
+
+ # Make VCS-specific changes. For git, this means creating/changing
+- # .gitattributes to mark _version.py for export-time keyword
++ # .gitattributes to mark _version.py for export-subst keyword
+ # substitution.
+ do_vcs_install(manifest_in, cfg.versionfile_source, ipy)
+ return 0
+@@ -1765,6 +2130,7 @@ def scan_setup_py():
+ errors += 1
+ return errors
+
++
+ if __name__ == "__main__":
+ cmd = sys.argv[1]
+ if cmd == "setup":
diff --git a/meta-python/recipes-devtools/python/python3-click-spinner_0.1.10.bb b/meta-python/recipes-devtools/python/python3-click-spinner_0.1.10.bb
new file mode 100644
index 0000000000..b3e1328c75
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-click-spinner_0.1.10.bb
@@ -0,0 +1,12 @@
+SUMMARY = "Spinner for Click"
+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_7.0.bb b/meta-python/recipes-devtools/python/python3-click_7.0.bb
deleted file mode 100644
index 1920644042..0000000000
--- a/meta-python/recipes-devtools/python/python3-click_7.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-click.inc
diff --git a/meta-python/recipes-devtools/python/python3-cloudpickle_3.0.0.bb b/meta-python/recipes-devtools/python/python3-cloudpickle_3.0.0.bb
new file mode 100644
index 0000000000..25c379590f
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-cloudpickle_3.0.0.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Pickler class to extend the standard pickle.Pickler functionality"
+DESCRIPTION = "cloudpickle makes it possible to serialize Python constructs \
+not supported by the default pickle module from the Python standard library.\
+\
+cloudpickle is especially useful for cluster computing where Python code is \
+shipped over the network to execute on remote hosts, possibly close to the \
+data."
+HOMEPAGE = "https://github.com/cloudpipe/cloudpickle"
+
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://${WORKDIR}/LICENSE.cloudpickle;md5=b4d59aa5e2cc777722aac17841237931"
+
+inherit pypi python_flit_core
+
+SRC_URI += "https://raw.githubusercontent.com/cloudpipe/cloudpickle/v${PV}/LICENSE;downloadfilename=LICENSE.cloudpickle;name=license"
+
+SRC_URI[sha256sum] = "996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882"
+SRC_URI[license.sha256sum] = "3029ea34173e9fdc233ad315dc6b100bd1ea71f529b1c1af97664a272fdc55f5"
diff --git a/meta-python/recipes-devtools/python/python3-cmake/CMakeLists.txt b/meta-python/recipes-devtools/python/python3-cmake/CMakeLists.txt
new file mode 100644
index 0000000000..8ba81970ff
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-cmake/CMakeLists.txt
@@ -0,0 +1,11 @@
+cmake_minimum_required(VERSION 3.6)
+
+#
+# For more details, see docs/building.rst
+#
+
+project(CMakePythonDistributions NONE)
+
+install(CODE "
+ message(STATUS \"Install CMake project\")
+")
diff --git a/meta-python/recipes-devtools/python/python3-cmake/run-cmake-from-path.patch b/meta-python/recipes-devtools/python/python3-cmake/run-cmake-from-path.patch
new file mode 100644
index 0000000000..d4d2903d5e
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-cmake/run-cmake-from-path.patch
@@ -0,0 +1,13 @@
+Upstream-Status: Pending
+
+--- cmake-3.25.2/src/cmake/__init__.py.old 2023-03-10 09:40:43.582315753 +0100
++++ cmake-3.25.2/src/cmake/__init__.py 2023-03-10 09:41:38.030874047 +0100
+@@ -36,7 +36,7 @@
+
+
+ def _program(name, args):
+- return subprocess.call([os.path.join(CMAKE_BIN_DIR, name)] + args, close_fds=False)
++ return subprocess.call([name] + args, close_fds=False)
+
+
+ def cmake():
diff --git a/meta-python/recipes-devtools/python/python3-cmake_3.28.3.bb b/meta-python/recipes-devtools/python/python3-cmake_3.28.3.bb
new file mode 100644
index 0000000000..6b31d0b4f5
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-cmake_3.28.3.bb
@@ -0,0 +1,37 @@
+SUMMARY = "CMake is an open-source, cross-platform family of tools designed to build, test and package software"
+LICENSE = "BSD-3-Clause & Apache-2.0"
+LIC_FILES_CHKSUM = " \
+ file://LICENSE_BSD_3;md5=9134cb61aebbdd79dd826ccb9ae6afcd \
+ file://LICENSE_Apache_20;md5=19cbd64715b51267a47bf3750cc6a8a5 \
+"
+
+DEPENDS = "ninja-native cmake-native python3-scikit-build-native"
+
+PYPI_PACKAGE = "cmake"
+PYPI_ARCHIVE_NAME_PREFIX = "pypi-"
+
+inherit pypi python_setuptools_build_meta
+SRC_URI[sha256sum] = "a8092815c739da7d6775c26ec30c2645f0fca9527a29e36a682faec7d39cde89"
+
+SRC_URI += " \
+ file://CMakeLists.txt \
+ file://run-cmake-from-path.patch \
+"
+
+addtask do_patchbuild after do_patch before do_configure
+
+do_patchbuild () {
+ rm -f ${S}/CMakeLists.txt
+ cp ${WORKDIR}/CMakeLists.txt ${S}/
+}
+
+do_install:append () {
+ rm -rf ${D}${bindir}
+}
+
+RDEPENDS:${PN} = " \
+ cmake \
+ python3-scikit-build \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-cmd2_0.9.18.bb b/meta-python/recipes-devtools/python/python3-cmd2_0.9.18.bb
deleted file mode 100644
index f5c5c7e1a3..0000000000
--- a/meta-python/recipes-devtools/python/python3-cmd2_0.9.18.bb
+++ /dev/null
@@ -1,9 +0,0 @@
-inherit setuptools3
-require python-cmd2.inc
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-pyperclip \
- ${PYTHON_PN}-colorama \
- ${PYTHON_PN}-attrs \
- ${PYTHON_PN}-wcwidth \
- "
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.1.bb b/meta-python/recipes-devtools/python/python3-colorama_0.4.1.bb
deleted file mode 100644
index 9cfca094e0..0000000000
--- a/meta-python/recipes-devtools/python/python3-colorama_0.4.1.bb
+++ /dev/null
@@ -1,10 +0,0 @@
-SUMMARY = "Cross-platform colored terminal text."
-HOMEPAGE = "https://github.com/tartley/colorama"
-LICENSE = "BSD-2-Clause"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=b4936429a56a652b84c5c01280dcaa26"
-
-inherit pypi setuptools3
-
-SRC_URI[md5sum] = "f927529cd1735f6f50ee2c61628e9c1f"
-SRC_URI[sha256sum] = "05eed71e2e327246ad6b38c540c4a3117230b19679b875190486ddd2d721422d"
-
diff --git a/meta-python/recipes-devtools/python/python3-colorama_0.4.6.bb b/meta-python/recipes-devtools/python/python3-colorama_0.4.6.bb
new file mode 100644
index 0000000000..0f364c424d
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-colorama_0.4.6.bb
@@ -0,0 +1,14 @@
+SUMMARY = "Cross-platform colored terminal text."
+HOMEPAGE = "https://github.com/tartley/colorama"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=b4936429a56a652b84c5c01280dcaa26"
+
+inherit pypi python_setuptools_build_meta
+
+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_10.0.bb b/meta-python/recipes-devtools/python/python3-coloredlogs_10.0.bb
deleted file mode 100644
index 3872399665..0000000000
--- a/meta-python/recipes-devtools/python/python3-coloredlogs_10.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-coloredlogs.inc
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
new file mode 100644
index 0000000000..31f75eef62
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-coloredlogs_15.0.1.bb
@@ -0,0 +1,19 @@
+DESCRIPTION = "Colored terminal output for Python's logging module"
+HOMEPAGE = "https://coloredlogs.readthedocs.io"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=764e737b117a38d773609885e8d04f0b"
+
+SRC_URI[sha256sum] = "7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0"
+
+inherit pypi setuptools3
+
+do_install:append() {
+ rm -rf ${D}${datadir}
+}
+
+RDEPENDS:${PN} += "\
+ python3-humanfriendly \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-colorlog_6.8.2.bb b/meta-python/recipes-devtools/python/python3-colorlog_6.8.2.bb
new file mode 100644
index 0000000000..c26f4bb70e
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-colorlog_6.8.2.bb
@@ -0,0 +1,12 @@
+DESCRIPTION = "A colored formatter for the python logging module"
+HOMEPAGE = "https://github.com/borntyping/python-colorlog"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=5c3c6ebdec7792ae12df8d1c0a46b26a"
+
+inherit pypi setuptools3
+
+PYPI_PACKAGE = "colorlog"
+
+SRC_URI[sha256sum] = "3e3e079a41feb5a1b64f978b5ea4f46040a94f11f0e8bbb8261e3dbbeca64d44"
+
+RDEPENDS:${PN} += "python3-logging"
diff --git a/meta-python/recipes-devtools/python/python3-colorzero_2.0.bb b/meta-python/recipes-devtools/python/python3-colorzero_2.0.bb
new file mode 100644
index 0000000000..fc1615e670
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-colorzero_2.0.bb
@@ -0,0 +1,19 @@
+SUMMARY = "colorzero is a color manipulation library for Python"
+DESCRIPTION = "colorzero is a color manipulation library for Python \
+(yes, another one) which aims to be reasonably simple to use and \
+"pythonic" in nature."
+HOMEPAGE = " https://github.com/waveform80/colorzero "
+
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=ae6c62710c0646f3c60d1ad812ea9bf9"
+
+RDEPENDS:${PN} += " \
+ python3-image \
+ python3-numbers \
+"
+
+SRC_URI[sha256sum] = "e7d5a5c26cd0dc37b164ebefc609f388de24f8593b659191e12d85f8f9d5eb58"
+
+inherit pypi setuptools3
+
+PYPI_PACKAGE = "colorzero"
diff --git a/meta-python/recipes-devtools/python/python3-configargparse_1.7.bb b/meta-python/recipes-devtools/python/python3-configargparse_1.7.bb
new file mode 100644
index 0000000000..1c49d891d2
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-configargparse_1.7.bb
@@ -0,0 +1,21 @@
+SUMMARY = "A drop-in replacement for argparse that allows options to also be set via config files and/or environment variables."
+HOMEPAGE = "https://github.com/bw2/ConfigArgParse"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=da746463714cc35999ed9a42339f2943"
+
+SRC_URI[sha256sum] = "e7067471884de5478c58a511e529f0f9bd1c66bfef1dea90935438d6c23306d1"
+
+PYPI_PACKAGE = "ConfigArgParse"
+
+inherit pypi setuptools3
+
+PACKAGECONFIG ?= "yaml"
+PACKAGECONFIG[yaml] = ",,,python3-pyyaml"
+
+RDEPENDS:${PN} += "\
+ python3-core \
+ python3-shell \
+ python3-json \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-configobj_5.0.8.bb b/meta-python/recipes-devtools/python/python3-configobj_5.0.8.bb
new file mode 100644
index 0000000000..8dc706fdfd
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-configobj_5.0.8.bb
@@ -0,0 +1,14 @@
+SUMMARY = "Config file reading, writing and validation."
+SECTION = "devel/python"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3d6f99b84d9a94610c62e48fa2e59e72"
+
+PYPI_PACKAGE = "configobj"
+SRC_URI[sha256sum] = "6f704434a07dc4f4dc7c9a745172c1cad449feb548febd9f7fe362629c627a97"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-pprint \
+ python3-six \
+"
diff --git a/meta-python/recipes-devtools/python/python3-configparser_3.8.1.bb b/meta-python/recipes-devtools/python/python3-configparser_3.8.1.bb
deleted file mode 100644
index 770cba5962..0000000000
--- a/meta-python/recipes-devtools/python/python3-configparser_3.8.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-configparser.inc
diff --git a/meta-python/recipes-devtools/python/python3-configshell-fb_1.1.30.bb b/meta-python/recipes-devtools/python/python3-configshell-fb_1.1.30.bb
new file mode 100644
index 0000000000..aa14c99e8b
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-configshell-fb_1.1.30.bb
@@ -0,0 +1,18 @@
+SUMMARY = "A Python library for building configuration shells"
+DESCRIPTION = "configshell-fb is a Python library that provides a framework for \
+building simple but nice CLI-based applications. This runs with Python 2 and \
+2to3 is run by setup.py to run on Python 3."
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://COPYING;md5=1dece7821bf3fd70fe1309eaa37d52a2"
+
+SRC_URI[sha256sum] = "41f6b7eaa7c9ff422acdc910762fd39ef3333a365918463fef8b398d857170fe"
+
+inherit pypi python_poetry_core
+
+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 3f667540d9..0000000000
--- a/meta-python/recipes-devtools/python/python3-constantly_15.1.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-constantly.inc
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_21.6.0.bb b/meta-python/recipes-devtools/python/python3-contextlib2_21.6.0.bb
new file mode 100644
index 0000000000..5a54c696f4
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-contextlib2_21.6.0.bb
@@ -0,0 +1,11 @@
+DESCRIPTION = "Backports and enhancements for the contextlib module"
+HOMEPAGE = "http://contextlib2.readthedocs.org/"
+SECTION = "devel/python"
+LICENSE = "PSF-2.0 & Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=d2b6be100f1002194122ec9bfee7b8b4"
+
+SRC_URI[sha256sum] = "ab1e2bfe1d01d968e1b7e8d9023bc51ef3509bba217bb730cee3827e1ee82869"
+
+inherit pypi setuptools3
+
+BBCLASSEXTEND = "native nativesdk"
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_4.4.2.bb b/meta-python/recipes-devtools/python/python3-coverage_4.4.2.bb
deleted file mode 100644
index c983e0b5dc..0000000000
--- a/meta-python/recipes-devtools/python/python3-coverage_4.4.2.bb
+++ /dev/null
@@ -1,10 +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[md5sum] = "29a9fe85377e0f7327cf5db1e335483f"
-SRC_URI[sha256sum] = "309d91bd7a35063ec7a0e4d75645488bfab3f0b66373e7722f23da7f5b0f34cc"
-
-inherit pypi setuptools3
-
diff --git a/meta-python/recipes-devtools/python/python3-coverage_7.4.1.bb b/meta-python/recipes-devtools/python/python3-coverage_7.4.1.bb
new file mode 100644
index 0000000000..b3da5d5716
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-coverage_7.4.1.bb
@@ -0,0 +1,22 @@
+SUMMARY = "Code coverage measurement for Python"
+HOMEPAGE = "https://coverage.readthedocs.io"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=2ee41112a44fe7014dce33e26468ba93"
+
+SRC_URI[sha256sum] = "1ed4b95480952b1a26d863e546fa5094564aa0065e1e5f0d4d0041f293251d04"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-crypt \
+ python3-io \
+ python3-json \
+ python3-multiprocessing \
+ python3-pprint \
+ python3-shell \
+ python3-sqlite3 \
+ python3-tomllib \
+ python3-xml \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-cppy/0001-Fix-build-error-as-following.patch b/meta-python/recipes-devtools/python/python3-cppy/0001-Fix-build-error-as-following.patch
new file mode 100644
index 0000000000..5a613c827a
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-cppy/0001-Fix-build-error-as-following.patch
@@ -0,0 +1,28 @@
+From a6ba15048bbb660abfa094b581862b4936ac4005 Mon Sep 17 00:00:00 2001
+From: Lei Maohui <leimaohui@fujitsu.com>
+Date: Mon, 18 Apr 2022 12:19:35 +0900
+Subject: [PATCH] Fix build error as following:
+
+flit_core.config.ConfigError: description must be specified under [project] or listed as a dynamic field.
+
+Upstream-Status: Pending
+Signed-off-by: Lei Maohui <leimaohui@fujitsu.com>
+---
+ pyproject.toml | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/pyproject.toml b/pyproject.toml
+index 2d2ac74..66fcee0 100644
+--- a/pyproject.toml
++++ b/pyproject.toml
+@@ -8,6 +8,7 @@
+
+ [project]
+ name = "cppy"
++description = "A small C++ header library"
+ readme = "README.rst"
+ requires-python = ">=3.7"
+ license = {file = "LICENSE"}
+--
+2.25.1
+
diff --git a/meta-python/recipes-devtools/python/python3-cppy_1.2.1.bb b/meta-python/recipes-devtools/python/python3-cppy_1.2.1.bb
new file mode 100644
index 0000000000..7817401fa4
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-cppy_1.2.1.bb
@@ -0,0 +1,17 @@
+SUMMARY = "C++ headers for C extension development"
+HOMEPAGE = "https://cppy.readthedocs.io/en/latest/"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=0bfb3e39b13587f0028f17baf0e42371"
+
+SRC_URI[sha256sum] = "83b43bf17b1085ac15c5debdb42154f138b928234b21447358981f69d0d6fe1b"
+
+RDEPENDS:${PN} += "python3-setuptools"
+
+inherit pypi python_setuptools_build_meta
+
+SRC_URI += " file://0001-Fix-build-error-as-following.patch \
+ "
+
+DEPENDS += "python3-setuptools-scm-native"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-crc32c_2.3.bb b/meta-python/recipes-devtools/python/python3-crc32c_2.3.bb
new file mode 100644
index 0000000000..da756ea074
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-crc32c_2.3.bb
@@ -0,0 +1,22 @@
+SUMMARY = "A python package implementing the crc32c algorithmin hardware and software"
+HOMEPAGE = "https://github.com/ICRAR/crc32c"
+
+LICENSE = "BSD-2-Clause & BSD-3-Clause & CRC32C-ADLER & LGPL-2.0-or-later"
+LIC_FILES_CHKSUM = " \
+ file://LICENSE;md5=4fbd65380cdd255951079008b364516c \
+ file://LICENSE.google-crc32c;md5=e9ed01b5e5ac9eae23fc2bb33701220c \
+ file://LICENSE.slice-by-8;md5=6b3bc7709d6b2db6646ec2467310ff6b \
+ file://crc32c_adler.c;beginline=9;endline=24;md5=9c8bd2afd2d340fd37c038759cd4eff8 \
+"
+
+SRC_URI[sha256sum] = "17ce6c596ad0d53df52dcd72defb66984aeabd98fbefea7ba848a6b6bdece36a"
+
+inherit pypi setuptools3
+
+do_compile:prepend() {
+ if ! grep 'platform =' setup.cfg; then
+ printf "[build_ext]\nplatform = ${TARGET_ARCH}" >> setup.cfg
+ fi
+}
+
+RDEPENDS:${PN} += "python3-core"
diff --git a/meta-python/recipes-devtools/python/python3-crcmod/0001-setup.py-use-setuptools-instead-of-distutils.patch b/meta-python/recipes-devtools/python/python3-crcmod/0001-setup.py-use-setuptools-instead-of-distutils.patch
new file mode 100644
index 0000000000..9bcb871135
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-crcmod/0001-setup.py-use-setuptools-instead-of-distutils.patch
@@ -0,0 +1,22 @@
+From 3dc1e9584ed2ac81e7526b8dbf76b4a06ea8ac76 Mon Sep 17 00:00:00 2001
+From: Justin Bronder <jsbronder@cold-front.org>
+Date: Tue, 1 Mar 2022 10:34:42 -0500
+Subject: [PATCH] setup.py use setuptools instead of distutils
+
+Upstream-Status: Pending
+Signed-off-by: Justin Bronder <jsbronder@cold-front.org>
+---
+ setup.py | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/setup.py b/setup.py
+index e3a524b..2f2bcfc 100644
+--- a/setup.py
++++ b/setup.py
+@@ -1,5 +1,4 @@
+-from distutils.core import setup
+-from distutils.extension import Extension
++from setuptools import Extension, setup
+ import sys,os
+
+ if sys.version_info[0] == 2:
diff --git a/meta-python/recipes-devtools/python/python3-crcmod_1.7.bb b/meta-python/recipes-devtools/python/python3-crcmod_1.7.bb
index 6996b13d0d..11d36b53ec 100644
--- a/meta-python/recipes-devtools/python/python3-crcmod_1.7.bb
+++ b/meta-python/recipes-devtools/python/python3-crcmod_1.7.bb
@@ -1,2 +1,14 @@
-inherit setuptools3
-require python-crcmod.inc
+SUMMARY = "A Python module for generating objects that compute the Cyclic Redundancy Check."
+HOMEPAGE = "https://pypi.org/project/crcmod"
+LICENSE = "MIT"
+SECTION = "devel/python"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=f9a19291627cad2d1dfbfcf3c9fb85c2"
+
+SRC_URI += "file://0001-setup.py-use-setuptools-instead-of-distutils.patch"
+SRC_URI[sha256sum] = "dc7051a0db5f2bd48665a990d3ec1cc305a466a77358ca4492826f41f283601e"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-unittest"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-croniter_2.0.3.bb b/meta-python/recipes-devtools/python/python3-croniter_2.0.3.bb
new file mode 100644
index 0000000000..ad80574a95
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-croniter_2.0.3.bb
@@ -0,0 +1,16 @@
+DESCRIPTION = "croniter provides iteration for datetime object with cron like format"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=b8ee59850b882cbf623188489ea748e2"
+
+PYPI_PACKAGE = "croniter"
+
+SRC_URI[sha256sum] = "28763ad39c404e159140874f08010cfd8a18f4c2a7cea1ce73e9506a4380cfc1"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-dateutil \
+ python3-natsort \
+ python3-pytz \
+"
diff --git a/meta-python/recipes-devtools/python/python3-cryptography-vectors_2.7.bb b/meta-python/recipes-devtools/python/python3-cryptography-vectors_2.7.bb
deleted file mode 100644
index 58994ffffa..0000000000
--- a/meta-python/recipes-devtools/python/python3-cryptography-vectors_2.7.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-cryptography-vectors.inc
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_2.7.bb b/meta-python/recipes-devtools/python/python3-cryptography_2.7.bb
deleted file mode 100644
index 195923343b..0000000000
--- a/meta-python/recipes-devtools/python/python3-cryptography_2.7.bb
+++ /dev/null
@@ -1,8 +0,0 @@
-inherit pypi setuptools3
-require python-cryptography.inc
-
-LDSHARED += "-pthread"
-
-SRC_URI += " \
- file://run-ptest \
-"
diff --git a/meta-python/recipes-devtools/python/python3-custom-inherit_2.4.1.bb b/meta-python/recipes-devtools/python/python3-custom-inherit_2.4.1.bb
new file mode 100644
index 0000000000..e7409f77e6
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-custom-inherit_2.4.1.bb
@@ -0,0 +1,16 @@
+SUMMARY = "A Python package that provides customized docstring inheritance schemes between derived classes and their parents."
+HOMEPAGE = "https://github.com/rsokl/custom_inherit"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.md;md5=f910a85a4c3da51edf780f17a7608434"
+
+PYPI_PACKAGE = "custom_inherit"
+
+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.3.2.bb b/meta-python/recipes-devtools/python/python3-cvxopt_1.3.2.bb
new file mode 100644
index 0000000000..d7d4b22fbd
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-cvxopt_1.3.2.bb
@@ -0,0 +1,21 @@
+SUMMARY = "Convex optimization package"
+HOMEPAGE = "http://cvxopt.org"
+LICENSE = "GPL-3.0-only"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=66ec4f8e53d3e733a8c26d5ca3830fba"
+
+SRC_URI = "git://github.com/cvxopt/cvxopt;protocol=https;branch=master"
+
+SRCREV = "3b718ee560b3b97d6255c55f0ed7f64cb4b72082"
+
+S = "${WORKDIR}/git"
+
+RDEPENDS:${PN} += "lapack suitesparse"
+DEPENDS += "lapack suitesparse"
+
+inherit setuptools3
+
+export CVXOPT_BLAS_LIB_DIR = "${STAGING_LIBDIR}"
+export CVXOPT_SUITESPARSE_LIB_DIR = "${STAGING_LIBDIR}"
+export CVXOPT_SUITESPARSE_INC_DIR = "${STAGING_INCDIR}"
+
+EXCLUDE_FROM_WORLD = "1"
diff --git a/meta-python/recipes-devtools/python/python3-cycler_0.12.1.bb b/meta-python/recipes-devtools/python/python3-cycler_0.12.1.bb
new file mode 100644
index 0000000000..574083b61f
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-cycler_0.12.1.bb
@@ -0,0 +1,15 @@
+SUMMARY = "Composable style cycles"
+HOMEPAGE = "http://github.com/matplotlib/cycler"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=7713fe42cd766b15c710e19392bfa811"
+
+SRC_URI[sha256sum] = "88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"
+
+inherit pypi python_setuptools_build_meta
+
+RDEPENDS:${PN} += "\
+ python3-core \
+ python3-six \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-cython_0.29.13.bb b/meta-python/recipes-devtools/python/python3-cython_0.29.13.bb
deleted file mode 100644
index 2ce6bdbd68..0000000000
--- a/meta-python/recipes-devtools/python/python3-cython_0.29.13.bb
+++ /dev/null
@@ -1,18 +0,0 @@
-inherit setuptools3
-require python-cython.inc
-
-RDEPENDS_${PN} += "\
- python3-setuptools \
-"
-
-# running build_ext a second time during install fails, because Python
-# would then attempt to import cythonized modules built for the target
-# architecture.
-DISTUTILS_INSTALL_ARGS += "--skip-build"
-
-do_install_append() {
- # rename scripts that would conflict with the Python 2 build of Cython
- mv ${D}${bindir}/cython ${D}${bindir}/cython3
- mv ${D}${bindir}/cythonize ${D}${bindir}/cythonize3
- mv ${D}${bindir}/cygdb ${D}${bindir}/cygdb3
-}
diff --git a/meta-python/recipes-devtools/python/python3-cytoolz_0.12.3.bb b/meta-python/recipes-devtools/python/python3-cytoolz_0.12.3.bb
new file mode 100644
index 0000000000..f9c9704d7f
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-cytoolz_0.12.3.bb
@@ -0,0 +1,13 @@
+SUMMARY = "Cython implementation of the toolz package, which provides high \
+performance utility functions for iterables, functions, and dictionaries."
+HOMEPAGE = "https://github.com/pytoolz/cytoolz"
+SECTION = "devel/python"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=d422ebce3e9c6447563bd410e9b22f2e"
+
+SRC_URI[sha256sum] = "4503dc59f4ced53a54643272c61dc305d1dbbfbd7d6bdf296948de9f34c3a282"
+
+inherit pypi setuptools3
+
+DEPENDS += "python3-cython-native"
+RDEPENDS:${PN} += "python3-toolz"
diff --git a/meta-python/recipes-devtools/python/python3-daemon_3.0.1.bb b/meta-python/recipes-devtools/python/python3-daemon_3.0.1.bb
new file mode 100644
index 0000000000..715d3bf120
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-daemon_3.0.1.bb
@@ -0,0 +1,18 @@
+DESCRIPTION = "Library to implement a well-behaved Unix daemon process"
+HOMEPAGE = "https://pagure.io/python-daemon/"
+SECTION = "devel/python"
+
+DEPENDS += "python3-docutils-native"
+RDEPENDS:${PN} = "python3-docutils \
+ python3-lockfile (>= 0.10) \
+ python3-resource \
+"
+
+LICENSE = "Apache-2.0 & GPL-3.0-only"
+LIC_FILES_CHKSUM = "file://README;md5=a3a94c615dc969a70525f1eebbacf235"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "6c57452372f7eaff40934a1c03ad1826bf5e793558e87fef49131e6464b4dae5"
+
+PYPI_PACKAGE = "python-daemon"
diff --git a/meta-python/recipes-devtools/python/python3-dateparser_1.2.0.bb b/meta-python/recipes-devtools/python/python3-dateparser_1.2.0.bb
new file mode 100644
index 0000000000..a08564b3f5
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-dateparser_1.2.0.bb
@@ -0,0 +1,23 @@
+DESCRIPTION = "Provides modules to easily parse localized dates in almost any string formats commonly found on web pages"
+HOMEPAGE = "https://github.com/scrapinghub/dateparser"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3d3ed25571191e7aa3f55d0a6efe0051"
+
+SRC_URI[sha256sum] = "7975b43a4222283e0ae15be7b4999d08c9a70e2d378ac87385b1ccf2cffbbb30"
+
+PYPI_PACKAGE = "dateparser"
+
+inherit pypi setuptools3
+
+CLEANBROKEN = "1"
+
+RDEPENDS:${PN} += " \
+ python3-dateutil \
+ python3-logging \
+ python3-pytz \
+ python3-regex \
+ python3-ruamel-yaml \
+ python3-tzlocal \
+"
+
+# Ommitted python3-convertdate, python3-jdatetime python3-umalqurra
diff --git a/meta-python/recipes-devtools/python/python3-dateutil_2.8.0.bb b/meta-python/recipes-devtools/python/python3-dateutil_2.8.0.bb
deleted file mode 100644
index 1d2baf55c9..0000000000
--- a/meta-python/recipes-devtools/python/python3-dateutil_2.8.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-dateutil.inc
diff --git a/meta-python/recipes-devtools/python/python3-dateutil_2.9.0.bb b/meta-python/recipes-devtools/python/python3-dateutil_2.9.0.bb
new file mode 100644
index 0000000000..1f7a4a03fd
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-dateutil_2.9.0.bb
@@ -0,0 +1,24 @@
+SUMMARY = "Extensions to the standard Python datetime module"
+DESCRIPTION = "The dateutil module provides powerful extensions to the datetime module available in the Python standard library."
+HOMEPAGE = "https://dateutil.readthedocs.org"
+LICENSE = "BSD-3-Clause & Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e3155c7bdc71f66e02678411d2abf996"
+
+SRC_URI[sha256sum] = "78e73e19c63f5b20ffa567001531680d939dc042bf7850431877645523c66709"
+
+PYPI_PACKAGE = "python-dateutil"
+inherit pypi python_setuptools_build_meta
+
+PACKAGES =+ "${PN}-zoneinfo"
+FILES:${PN}-zoneinfo = "${PYTHON_SITEPACKAGES_DIR}/dateutil/zoneinfo"
+
+DEPENDS += "python3-setuptools-scm-native"
+
+RDEPENDS:${PN} = "\
+ python3-datetime \
+ python3-numbers \
+ python3-six \
+ python3-stringold \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-dbus-fast_2.21.1.bb b/meta-python/recipes-devtools/python/python3-dbus-fast_2.21.1.bb
new file mode 100644
index 0000000000..9e2566175d
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-dbus-fast_2.21.1.bb
@@ -0,0 +1,15 @@
+SUMMARY = "A faster version of dbus-next originally from the great DBus next library."
+HOMEPAGE = "https://github.com/bluetooth-devices/dbus-fast"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=729e372b5ea0168438e4fd4a00a04947"
+
+SRC_URI[sha256sum] = "87b852d2005f1d59399ca51c5f3538f28a4742d739d7abe82b7ae8d01d8a5d02"
+
+PYPI_PACKAGE = "dbus_fast"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-core (>=3.7) \
+ python3-async-timeout \
+"
diff --git a/meta-python/recipes-devtools/python/python3-dbus-next_0.2.3.bb b/meta-python/recipes-devtools/python/python3-dbus-next_0.2.3.bb
new file mode 100644
index 0000000000..9f6aa7ed7f
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-dbus-next_0.2.3.bb
@@ -0,0 +1,17 @@
+SUMMARY = "A zero-dependency DBus library for Python with asyncio support"
+HOMEPAGE = "https://github.com/acrisci/python-dbus-next"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=94e750c96e56788499b56c81de91431c"
+
+SRC_URI[sha256sum] = "f4eae26909332ada528c0a3549dda8d4f088f9b365153952a408e28023a626a5"
+
+PYPI_PACKAGE = "dbus_next"
+
+inherit pypi setuptools3
+
+BBCLASSEXTEND = "native nativesdk"
+
+RDEPENDS:${PN} += " \
+ python3-asyncio \
+ python3-xml \
+"
diff --git a/meta-python/recipes-devtools/python/python3-dbussy/setuptools.patch b/meta-python/recipes-devtools/python/python3-dbussy/setuptools.patch
new file mode 100644
index 0000000000..3506f76d02
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-dbussy/setuptools.patch
@@ -0,0 +1,56 @@
+Port setup.py to setuptools.
+
+Upstream-Status: Submitted [https://github.com/ldo/dbussy/pull/53]
+Signed-off-by: Ross Burton <ross.burton@arm.com>
+
+diff --git a/setup.py b/setup.py
+index 4b9411e..da7ee7e 100644
+--- a/setup.py
++++ b/setup.py
+@@ -8,33 +8,9 @@
+ # Written by Lawrence D'Oliveiro <ldo@geek-central.gen.nz>.
+ #-
+
+-import sys
+-import distutils.core
+-from distutils.command.build import \
+- build as std_build
++import setuptools
+
+-class my_build(std_build) :
+- "customization of build to perform additional validation."
+-
+- def run(self) :
+- try :
+- exec \
+- (
+- "async def dummy() :\n"
+- " pass\n"
+- "#end dummy\n"
+- )
+- except SyntaxError :
+- sys.stderr.write("This module requires Python 3.5 or later.\n")
+- sys.exit(-1)
+- #end try
+- super().run()
+- #end run
+-
+-#end my_build
+-
+-distutils.core.setup \
+- (
++setuptools.setup(
+ name = "DBussy",
+ version = "1.3",
+ description = "language bindings for libdbus, for Python 3.5 or later",
+@@ -43,9 +19,5 @@ distutils.core.setup \
+ author_email = "ldo@geek-central.gen.nz",
+ url = "https://github.com/ldo/dbussy",
+ license = "LGPL v2.1+",
+ py_modules = ["dbussy", "ravel"],
+- cmdclass =
+- {
+- "build" : my_build,
+- },
+- )
++)
diff --git a/meta-python/recipes-devtools/python/python3-dbussy_1.3.bb b/meta-python/recipes-devtools/python/python3-dbussy_1.3.bb
new file mode 100644
index 0000000000..59da4545aa
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-dbussy_1.3.bb
@@ -0,0 +1,22 @@
+SUMMARY = "language bindings for libdbus, for Python 3.5 or later"
+HOMEPAGE = "https://github.com/ldo/dbussy"
+LICENSE = "LGPL-2.1-only"
+LIC_FILES_CHKSUM = "file://COPYING;md5=a916467b91076e631dd8edb7424769c7"
+
+SRC_URI = "git://github.com/ldo/dbussy.git;branch=master;protocol=https \
+ file://setuptools.patch"
+
+SRCREV = "37ede4242b48def73ada46c2747a4c5cae6abf45"
+
+S = "${WORKDIR}/git"
+
+inherit setuptools3
+
+RDEPENDS:${PN} += "\
+ python3-asyncio \
+ python3-core \
+ python3-ctypes \
+ python3-xml \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-decorator_4.4.0.bb b/meta-python/recipes-devtools/python/python3-decorator_4.4.0.bb
deleted file mode 100644
index 844cbdc9a9..0000000000
--- a/meta-python/recipes-devtools/python/python3-decorator_4.4.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-decorator.inc
diff --git a/meta-python/recipes-devtools/python/python-decorator.inc b/meta-python/recipes-devtools/python/python3-decorator_5.1.1.bb
index 96cf8b475c..f330376243 100644
--- a/meta-python/recipes-devtools/python/python-decorator.inc
+++ b/meta-python/recipes-devtools/python/python3-decorator_5.1.1.bb
@@ -6,14 +6,15 @@ various non-trivial examples. Of course, as all techniques, decorators \
can be abused and you should not try to solve every problem with a \
decorator, just because you can."
-LICENSE = "BSD"
+LICENSE = "BSD-2-Clause"
LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=be2fd2007972bf96c08af3293d728b22"
-SRC_URI[md5sum] = "a565a98581c0d110bc247323e89df9b1"
-SRC_URI[sha256sum] = "86156361c50488b84a3f148056ea716ca587df2f0de1d34750d35c21312725de"
+SRC_URI[sha256sum] = "637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"
-inherit pypi
+inherit pypi setuptools3
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-stringold \
+RDEPENDS:${PN} += "\
+ python3-stringold \
"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-decouple_3.8.bb b/meta-python/recipes-devtools/python/python3-decouple_3.8.bb
new file mode 100644
index 0000000000..20d614a423
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-decouple_3.8.bb
@@ -0,0 +1,16 @@
+SUMMARY = "Strict separation of settings from code."
+HOMEPAGE = "https://github.com/henriquebastos/python-decouple/"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=a46375b26bb7d7603565d829a2a51782"
+
+SRC_URI[sha256sum] = "ba6e2657d4f376ecc46f77a3a615e058d93ba5e465c01bbe57289bfb7cce680f"
+
+PYPI_PACKAGE = "python-decouple"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-shell \
+ python3-stringold \
+"
diff --git a/meta-python/recipes-devtools/python/python3-defusedxml_0.6.0.bb b/meta-python/recipes-devtools/python/python3-defusedxml_0.7.1.bb
index d041d0e6c9..8ec6680d8f 100644
--- a/meta-python/recipes-devtools/python/python3-defusedxml_0.6.0.bb
+++ b/meta-python/recipes-devtools/python/python3-defusedxml_0.7.1.bb
@@ -2,10 +2,13 @@ SUMMARY = "XML bomb protection for Python stdlib modules"
DESCRIPTION = "Python package with modified subclasses of all stdlib XML \
parsers that prevent any potentially malicious operation."
-LICENSE = "PSF"
+LICENSE = "PSF-2.0"
LIC_FILES_CHKSUM = "file://LICENSE;md5=056fea6a4b395a24d0d278bf5c80249e"
-SRC_URI[md5sum] = "a59741f675c4cba649de40a99f732897"
-SRC_URI[sha256sum] = "f684034d135af4c6cbb949b8a4d2ed61634515257a67299e5f940fbaa34377f5"
+SRC_URI[sha256sum] = "1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"
inherit pypi setuptools3
+
+BBCLASSEXTEND = "native"
+
+RDEPENDS:${PN} += "python3-xml"
diff --git a/meta-python/recipes-devtools/python/python3-deprecated_1.2.14.bb b/meta-python/recipes-devtools/python/python3-deprecated_1.2.14.bb
new file mode 100644
index 0000000000..49d5f01c8f
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-deprecated_1.2.14.bb
@@ -0,0 +1,13 @@
+SUMMARY = "Python @deprecated decorator to deprecate old python classes, functions or methods."
+HOMEPAGE = "https://deprecated.readthedocs.io/en/latest/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=44288e26f4896bdab14072d4fa35ff01"
+
+PYPI_PACKAGE = "Deprecated"
+SRC_URI[sha256sum] = "e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-wrapt \
+"
diff --git a/meta-python/recipes-devtools/python/python3-dill_0.3.8.bb b/meta-python/recipes-devtools/python/python3-dill_0.3.8.bb
new file mode 100644
index 0000000000..04e7f4bfb8
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-dill_0.3.8.bb
@@ -0,0 +1,19 @@
+SUMMARY = "Serialize all of python"
+HOMEPAGE = "https://pypi.org/project/dill/"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=a41509b57cc475ed93f8cb1dbbfaeec1"
+
+SRC_URI[sha256sum] = "3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"
+
+inherit pypi setuptools3
+
+PYPI_PACKAGE_EXT = "tar.gz"
+
+RDEPENDS:${PN} += "\
+ python3-multiprocessing \
+ python3-logging \
+ python3-profile \
+ python3-core \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-dirty-equals_0.7.1.bb b/meta-python/recipes-devtools/python/python3-dirty-equals_0.7.1.bb
new file mode 100644
index 0000000000..ea9303b17e
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-dirty-equals_0.7.1.bb
@@ -0,0 +1,21 @@
+SUMMARY = "Doing dirty (but extremely useful) things with equals."
+DESCRIPTION = "dirty-equals is a python library that (mis)uses the \
+__eq__ method to make python code (generally unit tests) more \
+declarative and therefore easier to read and write.\
+\
+dirty-equals can be used in whatever context you like, but it comes \
+into its own when writing unit tests for applications where you're \
+commonly checking the response to API calls and the contents of a database."
+HOMEPAGE = "https://github.com/samuelcolvin/dirty-equals"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ab599c188b4a314d2856b3a55030c75c"
+
+SRC_URI[sha256sum] = "a580513f3285e93656a770a04e428f8bfc513848877bf278282dbfbb907fdbb4"
+
+S = "${WORKDIR}/dirty_equals-${PV}"
+
+inherit pypi python_hatchling
+
+PYPI_PACKAGE = "dirty_equals"
+
+RDEPENDS:${PN} += "python3-pytz"
diff --git a/meta-python/recipes-devtools/python/python3-diskcache_5.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.9.0.bb b/meta-python/recipes-devtools/python/python3-distro_1.9.0.bb
new file mode 100644
index 0000000000..08a9526783
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-distro_1.9.0.bb
@@ -0,0 +1,19 @@
+SUMMARY = "Distro is an OS platform information API"
+SECTION = "devel/python"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d2794c0df5b907fdace235a619d80314"
+
+PYPI_PACKAGE = "distro"
+
+SRC_URI[sha256sum] = "2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"
+
+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_1.11.14.bb b/meta-python/recipes-devtools/python/python3-django_1.11.14.bb
deleted file mode 100644
index e1e38c3225..0000000000
--- a/meta-python/recipes-devtools/python/python3-django_1.11.14.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-django.inc
-inherit setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-django_4.2.11.bb b/meta-python/recipes-devtools/python/python3-django_4.2.11.bb
new file mode 100644
index 0000000000..0642b7e7c3
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-django_4.2.11.bb
@@ -0,0 +1,14 @@
+require python-django.inc
+inherit setuptools3
+
+SRC_URI[sha256sum] = "6e6ff3db2d8dd0c986b4eec8554c8e4f919b5c1ff62a5b4390c17aff2ed6e5c4"
+
+RDEPENDS:${PN} += "\
+ python3-sqlparse \
+ python3-asgiref \
+"
+
+# Set DEFAULT_PREFERENCE so that the LTS version of django is built by
+# default. To build the 4.x branch,
+# PREFERRED_VERSION_python3-django = "4.2.11" can be added to local.conf
+DEFAULT_PREFERENCE = "-1"
diff --git a/meta-python/recipes-devtools/python/python3-django_5.0.4.bb b/meta-python/recipes-devtools/python/python3-django_5.0.4.bb
new file mode 100644
index 0000000000..3139ed4682
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-django_5.0.4.bb
@@ -0,0 +1,9 @@
+require python-django.inc
+inherit setuptools3
+
+SRC_URI[sha256sum] = "4bd01a8c830bb77a8a3b0e7d8b25b887e536ad17a81ba2dce5476135c73312bd"
+
+RDEPENDS:${PN} += "\
+ python3-sqlparse \
+ python3-asgiref \
+"
diff --git a/meta-python/recipes-devtools/python/python-djangorestframework.inc b/meta-python/recipes-devtools/python/python3-djangorestframework_3.15.1.bb
index 8551a8341d..9515aa2296 100644
--- a/meta-python/recipes-devtools/python/python-djangorestframework.inc
+++ b/meta-python/recipes-devtools/python/python3-djangorestframework_3.15.1.bb
@@ -5,12 +5,12 @@ HOMEPAGE = "https://pypi.python.org/pypi/djangorestframework"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE.md;md5=7879a5a716147a784f7e524c9cf103c1"
-SRC_URI[md5sum] = "0d481bf8dbb87bb927b46798edc1a9bd"
-SRC_URI[sha256sum] = "607865b0bb1598b153793892101d881466bd5a991de12bd6229abb18b1c86136"
+SRC_URI[sha256sum] = "f88fad74183dfc7144b2756d0d2ac716ea5b4c7c9840995ac3bfd8ec034333c1"
+
PYPI_PACKAGE = "djangorestframework"
-inherit pypi
+inherit pypi setuptools3
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-django \
-" \ No newline at end of file
+RDEPENDS:${PN} += "\
+ python3-django \
+"
diff --git a/meta-python/recipes-devtools/python/python3-djangorestframework_3.9.0.bb b/meta-python/recipes-devtools/python/python3-djangorestframework_3.9.0.bb
deleted file mode 100644
index 9ed6d17266..0000000000
--- a/meta-python/recipes-devtools/python/python3-djangorestframework_3.9.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-djangorestframework.inc
-inherit setuptools3 \ No newline at end of file
diff --git a/meta-python/recipes-devtools/python/python3-dnspython/run-ptest b/meta-python/recipes-devtools/python/python3-dnspython/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-dnspython/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-dnspython_1.15.0.bb b/meta-python/recipes-devtools/python/python3-dnspython_1.15.0.bb
deleted file mode 100644
index ce4dfdc74a..0000000000
--- a/meta-python/recipes-devtools/python/python3-dnspython_1.15.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-dnspython.inc
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-docopt_0.6.2.bb b/meta-python/recipes-devtools/python/python3-docopt_0.6.2.bb
new file mode 100644
index 0000000000..a2432068cc
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-docopt_0.6.2.bb
@@ -0,0 +1,11 @@
+SUMMARY = "Pythonic argument parser, that will make you smile"
+HOMEPAGE = "http://docopt.org/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE-MIT;md5=09b77fb74986791a3d4a0e746a37d88f"
+
+inherit setuptools3 pypi
+
+SRC_URI[md5sum] = "4bc74561b37fad5d3e7d037f82a4c3b1"
+SRC_URI[sha256sum] = "49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-dominate/run-ptest b/meta-python/recipes-devtools/python/python3-dominate/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-dominate/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-dominate_2.3.1.bb b/meta-python/recipes-devtools/python/python3-dominate_2.3.1.bb
deleted file mode 100644
index 5304ccc183..0000000000
--- a/meta-python/recipes-devtools/python/python3-dominate_2.3.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-dominate.inc
diff --git a/meta-python/recipes-devtools/python/python3-dominate_2.9.1.bb b/meta-python/recipes-devtools/python/python3-dominate_2.9.1.bb
new file mode 100644
index 0000000000..054d5236e5
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-dominate_2.9.1.bb
@@ -0,0 +1,26 @@
+SUMMARY = "Dominate is a Python library for creating and manipulating HTML documents using an elegant DOM API."
+LICENSE = "LGPL-3.0-only"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=b52f2d57d10c4f7ee67a7eb9615d5d24"
+
+SRC_URI[sha256sum] = "558284687d9b8aae1904e3d6051ad132dd4a8c0cf551b37ea4e7e42a31d19dc4"
+
+inherit pypi ptest python_setuptools_build_meta
+
+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-numbers \
+ python3-threading \
+ "
diff --git a/meta-python/recipes-devtools/python/python3-dt-schema_git.bb b/meta-python/recipes-devtools/python/python3-dt-schema_git.bb
deleted file mode 100644
index 06a9012ca4..0000000000
--- a/meta-python/recipes-devtools/python/python3-dt-schema_git.bb
+++ /dev/null
@@ -1,15 +0,0 @@
-SUMMARY = "Tooling for devicetree validation using YAML and jsonschema"
-AUTHOR = "Rob Herring"
-
-LICENSE = "BSD-2-Clause"
-LIC_FILES_CHKSUM = "file://setup.py;beginline=2;endline=3;md5=c795d4924c5f739424fa8d9b569c6659"
-
-inherit setuptools3
-
-SRC_URI = "git://github.com/robherring/dt-schema.git"
-SRCREV = "5009e47c1c76e48871f5988e08dad61f3c91196b"
-PV = "0.1+git${SRCPV}"
-
-S = "${WORKDIR}/git"
-
-RDEPENDS_${PN} = "python3-jsonschema python3-ruamel-yaml"
diff --git a/meta-python/recipes-devtools/python/python3-dynamic-dispatch_1.0.3.bb b/meta-python/recipes-devtools/python/python3-dynamic-dispatch_1.0.3.bb
new file mode 100644
index 0000000000..eeb013d4fe
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-dynamic-dispatch_1.0.3.bb
@@ -0,0 +1,20 @@
+SUMMARY = "dynamic dispatch decorator for classes and functions"
+HOMEPAGE = "https://github.com/XevoInc/dynamic_dispatch"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ea70b07c354e36056bd35e17c9c3face"
+
+inherit pypi setuptools3
+
+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 \
+"
+
+BBCLASSEXTEND = "native nativesdk"
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.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 8ad2b869d9..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
@@ -1,2 +1,17 @@
+DESCRIPTION = "Programmatically open and editor, capture the result"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d2794c0df5b907fdace235a619d80314"
+
+SRC_URI[md5sum] = "0e52648a4a6e7c89e3be44e9456530b4"
+SRC_URI[sha256sum] = "51fda6bcc5ddbbb7063b2af7509e43bd84bfc32a4ff71349ec7847713882327b"
+
+PYPI_PACKAGE = "python-editor"
+
inherit pypi setuptools3
-require python-editor.inc
+
+BBCLASSEXTEND = "native nativesdk"
+
+RDEPENDS:${PN} += " \
+ python3-io \
+ python3-setuptools \
+"
diff --git a/meta-python/recipes-devtools/python/python3-elementpath_4.4.0.bb b/meta-python/recipes-devtools/python/python3-elementpath_4.4.0.bb
new file mode 100644
index 0000000000..e095cb8a32
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-elementpath_4.4.0.bb
@@ -0,0 +1,19 @@
+DESCRIPTION = "Provide XPath 1.0 and 2.0 selectors for Python's ElementTree XML data structures, both for the standard ElementTree library and for the lxml.etree library."
+HOMEPAGE = "https://github.com/sissaschool/elementpath"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=5dbb7fb7d72da3921202dd7b995d3ecf"
+
+SRC_URI[sha256sum] = "dfc4b8ca3d87966dcb0df40b5b6d04a98f053683271930fad9e7fa000924dfb2"
+
+PYPI_PACKAGE = "elementpath"
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-xml \
+ python3-core \
+ python3-numbers \
+ python3-datetime \
+ python3-stringold \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-email-validator_2.1.0.bb b/meta-python/recipes-devtools/python/python3-email-validator_2.1.0.bb
new file mode 100644
index 0000000000..7daf548cb1
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-email-validator_2.1.0.bb
@@ -0,0 +1,12 @@
+SUMMARY = "A robust email address syntax and deliverability validation library."
+SECTION = "devel/python"
+LICENSE = "CC0-1.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=65d3616852dbf7b1a6d4b53b00626032"
+
+SRC_URI[sha256sum] = "5f511cca8856bb03251d6292ba59e7f98978aae13fa5823ddd8bf885c56a6260"
+
+PYPI_PACKAGE = "email_validator"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-dnspython python3-idna"
diff --git a/meta-python/recipes-devtools/python/python3-engineio_3.9.3.bb b/meta-python/recipes-devtools/python/python3-engineio_3.9.3.bb
deleted file mode 100644
index 028d1104ab..0000000000
--- a/meta-python/recipes-devtools/python/python3-engineio_3.9.3.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-engineio.inc
diff --git a/meta-python/recipes-devtools/python/python3-engineio_4.9.0.bb b/meta-python/recipes-devtools/python/python3-engineio_4.9.0.bb
new file mode 100644
index 0000000000..790d1b44cf
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-engineio_4.9.0.bb
@@ -0,0 +1,20 @@
+SUMMARY = "Engine.IO server"
+HOMEPAGE = "https://github.com/miguelgrinberg/python-engineio/"
+SECTION = "devel/python"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=42d0a9e728978f0eeb759c3be91536b8"
+
+inherit pypi python_setuptools_build_meta
+
+PYPI_PACKAGE = "python-engineio"
+
+RDEPENDS:${PN} += " \
+ python3-netclient \
+ python3-json \
+ python3-logging \
+ python3-compression \
+ python3-asyncio \
+"
+
+SRC_URI[sha256sum] = "e87459c15638e567711fd156e6f9c4a402668871bed79523f0ecfec744729ec7"
diff --git a/meta-python/recipes-devtools/python/python3-et-xmlfile_1.1.0.bb b/meta-python/recipes-devtools/python/python3-et-xmlfile_1.1.0.bb
new file mode 100644
index 0000000000..50ae7fa5e4
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-et-xmlfile_1.1.0.bb
@@ -0,0 +1,23 @@
+SUMMARY = "et_xmlfile is a low memory library for creating large XML files"
+DESCRIPTION = "It is based upon the xmlfile module from lxml with the aim of allowing code \
+to be developed that will work with both libraries. It was developed initially for \
+the openpyxl project but is now a standalone module."
+
+HOMEPAGE = "https://foss.heptapod.net/openpyxl/et_xmlfile"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=8227180126797a0148f94f483f3e1489"
+
+SRC_URI[sha256sum] = "8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"
+
+RDEPENDS:${PN} += " \
+ python3-compression \
+ python3-io \
+ python3-pprint \
+ python3-shell \
+ python3-xml \
+"
+
+inherit setuptools3 pypi
+
+PYPI_PACKAGE = "et_xmlfile"
diff --git a/meta-python/recipes-devtools/python/python3-eth-abi_5.1.0.bb b/meta-python/recipes-devtools/python/python3-eth-abi_5.1.0.bb
new file mode 100644
index 0000000000..e8bfb437fb
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-eth-abi_5.1.0.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Python utilities for working with Ethereum ABI definitions, especially encoding and decoding."
+HOMEPAGE = "https://github.com/ethereum/eth-abi"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=731f4de9c79bfeba6d8d55f83d0d2423"
+
+SRC_URI[sha256sum] = "33ddd756206e90f7ddff1330cc8cac4aa411a824fe779314a0a52abea2c8fc14"
+
+PYPI_PACKAGE = "eth_abi"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-eth-typing \
+ python3-eth-utils \
+ python3-parsimonious \
+ python3-setuptools \
+"
diff --git a/meta-python/recipes-devtools/python/python3-eth-account_0.12.1.bb b/meta-python/recipes-devtools/python/python3-eth-account_0.12.1.bb
new file mode 100644
index 0000000000..867aaaf025
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-eth-account_0.12.1.bb
@@ -0,0 +1,20 @@
+SUMMARY = "Assign Ethereum transactions and messages with local private keys."
+HOMEPAGE = "https://github.com/ethereum/eth-account"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=16ffc86adf4293d4cfb204e77d62cfe6"
+
+SRC_URI[sha256sum] = "0374c5886f35780e1f23e50ce6b0482f3387646eceda544e97d69f17f6c216ee"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-bitarray \
+ python3-eth-abi \
+ python3-eth-keyfile \
+ python3-eth-keys \
+ python3-eth-rlp \
+ python3-eth-utils \
+ python3-hexbytes \
+ python3-rlp \
+"
diff --git a/meta-python/recipes-devtools/python/python3-eth-hash_0.6.0.bb b/meta-python/recipes-devtools/python/python3-eth-hash_0.6.0.bb
new file mode 100644
index 0000000000..8464dbe403
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-eth-hash_0.6.0.bb
@@ -0,0 +1,14 @@
+SUMMARY = "The Ethereum hashing function, keccak256, sometimes (erroneously) called sha3."
+HOMEPAGE = "https://github.com/ethereum/eth-hash"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3d7bdfe69b1ffbde073ca6e96f5c53f7"
+
+SRC_URI[sha256sum] = "ae72889e60db6acbb3872c288cfa02ed157f4c27630fcd7f9c8442302c31e478"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} = "\
+ python3-logging \
+ python3-pycryptodome \
+"
diff --git a/meta-python/recipes-devtools/python/python3-eth-keyfile_0.7.0.bb b/meta-python/recipes-devtools/python/python3-eth-keyfile_0.7.0.bb
new file mode 100644
index 0000000000..2afc288bce
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-eth-keyfile_0.7.0.bb
@@ -0,0 +1,15 @@
+SUMMARY = "A library for handling the encrypted keyfiles used to store ethereum private keys."
+HOMEPAGE = "https://github.com/ethereum/eth-keyfile"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=6749008d847c14b9718949c2e24d5c0a"
+
+SRC_URI[sha256sum] = "6bdb8110c3a50439deb68a04c93c9d5ddd5402353bfae1bf4cfca1d6dff14fcf"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-eth-keys \
+ python3-pycryptodome \
+ python3-setuptools \
+"
diff --git a/meta-python/recipes-devtools/python/python3-eth-keys_0.5.0.bb b/meta-python/recipes-devtools/python/python3-eth-keys_0.5.0.bb
new file mode 100644
index 0000000000..aabfff1b1d
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-eth-keys_0.5.0.bb
@@ -0,0 +1,11 @@
+SUMMARY = "A common API for Ethereum key operations with pluggable backends."
+HOMEPAGE = "https://github.com/ethereum/eth-keys"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=6749008d847c14b9718949c2e24d5c0a"
+
+SRC_URI[sha256sum] = "a0abccb83f3d84322591a2c047a1e3aa52ea86b185fa3e82ce311d120ca2791e"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-eth-utils"
diff --git a/meta-python/recipes-devtools/python/python3-eth-rlp_2.1.0.bb b/meta-python/recipes-devtools/python/python3-eth-rlp_2.1.0.bb
new file mode 100644
index 0000000000..4bdc0c8873
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-eth-rlp_2.1.0.bb
@@ -0,0 +1,16 @@
+SUMMARY = "RLP definitions for common Ethereum objects in Python"
+HOMEPAGE = "https://github.com/ethereum/eth-rlp"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3d7bdfe69b1ffbde073ca6e96f5c53f7"
+
+SRC_URI[sha256sum] = "d5b408a8cd20ed496e8e66d0559560d29bc21cee482f893936a1f05d0dddc4a0"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} = " \
+ python3-eth-utils \
+ python3-hexbytes \
+ python3-rlp \
+ python3-typing-extensions \
+"
diff --git a/meta-python/recipes-devtools/python/python3-eth-typing_4.1.0.bb b/meta-python/recipes-devtools/python/python3-eth-typing_4.1.0.bb
new file mode 100644
index 0000000000..4491de979c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-eth-typing_4.1.0.bb
@@ -0,0 +1,9 @@
+SUMMARY = "Common type annotations for ethereum python packages."
+HOMEPAGE = "https://github.com/ethereum/eth-typing"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3d7bdfe69b1ffbde073ca6e96f5c53f7"
+
+SRC_URI[sha256sum] = "ed52b0c6b049240fd810bc87c8857c7ea39370f060f70b9ca3876285269f2938"
+
+inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-eth-utils_3.0.0.bb b/meta-python/recipes-devtools/python/python3-eth-utils_3.0.0.bb
new file mode 100644
index 0000000000..faca03865b
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-eth-utils_3.0.0.bb
@@ -0,0 +1,16 @@
+SUMMARY = "Common utility functions for codebases which interact with ethereum."
+HOMEPAGE = "https://github.com/ethereum/eth-utils"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=6749008d847c14b9718949c2e24d5c0a"
+
+SRC_URI[sha256sum] = "8721869568448349bceae63c277b75758d11e0dc190e7ef31e161b89619458f1"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-eth-hash \
+ python3-eth-typing \
+ python3-setuptools \
+ python3-toolz \
+"
diff --git a/meta-python/recipes-devtools/python/python3-evdev_0.7.0.bb b/meta-python/recipes-devtools/python/python3-evdev_0.7.0.bb
deleted file mode 100644
index 3a92b6ec96..0000000000
--- a/meta-python/recipes-devtools/python/python3-evdev_0.7.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-evdev.inc
diff --git a/meta-python/recipes-devtools/python/python3-evdev_1.6.1.bb b/meta-python/recipes-devtools/python/python3-evdev_1.6.1.bb
new file mode 100644
index 0000000000..be6f9611e7
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-evdev_1.6.1.bb
@@ -0,0 +1,22 @@
+SUMMARY = "Python evdev lib"
+HOMEPAGE = "https://github.com/gvalkov/python-evdev"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=0ff275b442f45fc06287544cf713016f"
+
+SRC_URI[sha256sum] = "299db8628cc73b237fc1cc57d3c2948faa0756e2a58b6194b5bf81dc2081f1e3"
+
+inherit pypi setuptools3
+
+do_compile:prepend() {
+ rm -rf ${S}/evdev/ecodes.c
+}
+
+SETUPTOOLS_BUILD_ARGS = "build_ecodes --evdev-headers ${STAGING_DIR_TARGET}/usr/include/linux/input.h:${STAGING_DIR_TARGET}/usr/include/linux/input-event-codes.h"
+
+RDEPENDS:${PN} += "\
+ python3-ctypes \
+ python3-fcntl \
+ python3-io \
+ python3-shell \
+ python3-stringold \
+ "
diff --git a/meta-python/recipes-devtools/python/python3-eventlet_0.36.1.bb b/meta-python/recipes-devtools/python/python3-eventlet_0.36.1.bb
new file mode 100644
index 0000000000..f70099ab94
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-eventlet_0.36.1.bb
@@ -0,0 +1,15 @@
+DESCRIPTION = "Highly concurrent networking library"
+HOMEPAGE = "http://pypi.python.org/pypi/eventlet"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=56472ad6de4caf50e05332a34b66e778"
+
+SRC_URI[sha256sum] = "d227fe76a63d9e6a6cef53beb8ad0b2dc40a5e7737c801f4b474cfae1db07bc5"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-dnspython \
+ python3-six \
+ python3-greenlet \
+"
diff --git a/meta-python/recipes-devtools/python/python3-execnet/run-ptest b/meta-python/recipes-devtools/python/python3-execnet/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-execnet/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-execnet_2.1.1.bb b/meta-python/recipes-devtools/python/python3-execnet_2.1.1.bb
new file mode 100644
index 0000000000..94c1a228e3
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-execnet_2.1.1.bb
@@ -0,0 +1,32 @@
+# Copyright (C) 2021 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+SUMMARY = "execnet: rapid multi-Python deployment"
+HOMEPAGE = "https://execnet.readthedocs.io/en/latest/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=772fcdaca14b378878d05c7d857e6c3e"
+
+DEPENDS += "\
+ python3-pip-native \
+ python3-hatch-vcs-native \
+"
+
+SRC_URI += "file://run-ptest \
+ "
+SRC_URI[sha256sum] = "5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"
+
+inherit ptest pypi python_hatchling
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/testing/* ${D}${PTEST_PATH}/tests/
+}
+
+RDEPENDS:${PN}-ptest += "\
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+RDEPENDS:${PN} += "python3-core python3-crypt python3-ctypes python3-fcntl python3-io python3-shell python3-threading"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-executing_2.0.1.bb b/meta-python/recipes-devtools/python/python3-executing_2.0.1.bb
new file mode 100644
index 0000000000..3ee1e66f97
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-executing_2.0.1.bb
@@ -0,0 +1,9 @@
+SUMMARY = "Get the currently executing AST node of a frame, and other information"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=a3d6c15f7859ae235a78f2758e5a48cf"
+
+DEPENDS = "python3-setuptools-scm-native"
+
+inherit pypi python_setuptools_build_meta
+
+SRC_URI[sha256sum] = "35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"
diff --git a/meta-python/recipes-devtools/python/python3-expandvars_0.12.0.bb b/meta-python/recipes-devtools/python/python3-expandvars_0.12.0.bb
new file mode 100644
index 0000000000..6183c310ed
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-expandvars_0.12.0.bb
@@ -0,0 +1,10 @@
+SUMMARY = "Expand system variables Unix style"
+HOMEPAGE = "https://github.com/sayanarijit/expandvars"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=8b2e744064bd184728ac09dbfb52aaf4"
+
+SRC_URI[sha256sum] = "7d1adfa55728cf4b5d812ece3d087703faea953e0c0a1a78415de9df5024d844"
+
+inherit pypi python_hatchling python_setuptools_build_meta
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-fann2_1.1.2.bb b/meta-python/recipes-devtools/python/python3-fann2_1.1.2.bb
index a04c961f4a..2fbc277139 100644
--- a/meta-python/recipes-devtools/python/python3-fann2_1.1.2.bb
+++ b/meta-python/recipes-devtools/python/python3-fann2_1.1.2.bb
@@ -1,4 +1,13 @@
-require python-fann2.inc
-inherit pypi setuptools3
+SUMMARY = "Python bindings for Fast Artificial Neural Networks 2.2.0 (FANN >= 2.2.0)"
+SECTION = "devel/python"
+LICENSE = "LGPL-2.0-only"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=c73b943dc75f6f65e007c56ac6515c8f"
+
+SRC_URI[md5sum] = "0b85b418018746d63ed66b55465697a9"
+SRC_URI[sha256sum] = "cdca0a65ad48e08320672affe38c3dd4ea15e27821e5e1db9fa2b34299bdd41e"
SRC_URI += " file://0001-setup.py-Don-t-hardcode-swig-and-fann2-binary-locati.patch"
+
+inherit pypi setuptools3
+
+DEPENDS += "swig-native libfann"
diff --git a/meta-python/recipes-devtools/python/python3-fasteners_0.15.bb b/meta-python/recipes-devtools/python/python3-fasteners_0.19.bb
index 8786a14842..22e58c5668 100644
--- a/meta-python/recipes-devtools/python/python3-fasteners_0.15.bb
+++ b/meta-python/recipes-devtools/python/python3-fasteners_0.19.bb
@@ -3,7 +3,11 @@ HOMEPAGE = "https://github.com/harlowja/fasteners"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE;md5=4476c4be31402271e101d9a4a3430d52"
-SRC_URI[md5sum] = "440f8ab461c8fed941355860d8669556"
-SRC_URI[sha256sum] = "3a176da6b70df9bb88498e1a18a9e4a8579ed5b9141207762368a1017bf8f5ef"
+SRC_URI[sha256sum] = "b4f37c3ac52d8a445af3a66bce57b33b5e90b97c696b7b984f530cf8f0ded09c"
-inherit pypi setuptools3
+inherit pypi python_setuptools_build_meta
+
+RDEPENDS:${PN} += "\
+ python3-logging \
+ python3-fcntl \
+"
diff --git a/meta-python/recipes-devtools/python/python3-fastjsonschema/run-ptest b/meta-python/recipes-devtools/python/python3-fastjsonschema/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-fastjsonschema/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-fastjsonschema_2.18.0.bb b/meta-python/recipes-devtools/python/python3-fastjsonschema_2.18.0.bb
new file mode 100644
index 0000000000..b2e969c5c1
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-fastjsonschema_2.18.0.bb
@@ -0,0 +1,41 @@
+# Copyright (C) 2021 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+SUMMARY = "Fastest Python implementation of JSON schema"
+HOMEPAGE = "https://github.com/seznam/python-fastjsonschema"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=18950e8362b69c0c617b42b8bd8e7532"
+
+SRCREV = "756540088687cda351390f687b92e602feaa7dc6"
+PYPI_SRC_URI = "git://github.com/horejsek/python-fastjsonschema;protocol=https;branch=master"
+
+SRC_URI += "file://run-ptest"
+
+inherit ptest pypi setuptools3
+
+S = "${WORKDIR}/git"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+RDEPENDS:${PN}-ptest += "\
+ python3-colorama \
+ python3-jsonschema \
+ python3-pylint \
+ python3-pytest \
+ python3-pytest-benchmark \
+ python3-pytest-cache \
+ python3-statistics \
+ python3-unittest-automake-output \
+"
+RDEPENDS:${PN} += "\
+ python3-core \
+ python3-urllib3 \
+ python3-numbers \
+ python3-pickle \
+ python3-json \
+ "
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-fastnumbers_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 95a5405f38..0000000000
--- a/meta-python/recipes-devtools/python/python3-feedformatter_0.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-feedformatter.inc
diff --git a/meta-python/recipes-devtools/python/python3-fields_5.0.0.bb b/meta-python/recipes-devtools/python/python3-fields_5.0.0.bb
new file mode 100644
index 0000000000..c1dfe0a377
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-fields_5.0.0.bb
@@ -0,0 +1,15 @@
+# Copyright (C) 2021 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+SUMMARY = "Container class boilerplate killer."
+HOMEPAGE = "https://github.com/ionelmc/python-fields"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e32c6705498713d9c904a9f565953a2c"
+
+SRC_URI[sha256sum] = "31d4aa03d8d44e35df13c431de35136997f047a924a597d84f7bc209e1be5727"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-core"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-file-magic_0.4.1.bb b/meta-python/recipes-devtools/python/python3-file-magic_0.4.1.bb
new file mode 100644
index 0000000000..5289ad3745
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-file-magic_0.4.1.bb
@@ -0,0 +1,21 @@
+SUMMARY = "Python front end for libmagic"
+DESCRIPTION = "This library is a Python ctypes interface to libmagic."
+HOMEPAGE = "https://darwinsys.com/file/"
+LICENSE = "BSD-2-Clause"
+SECTION = "devel/python"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=0e949c0b3fb4fd86232f00c6ee0bdef3"
+
+SRC_URI[sha256sum] = "a91d1483117f7ed48cd0238ad9be36b04824d57e9c38ea7523113989e81b9c53"
+
+PYPI_PACKAGE="file-magic"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ file \
+ python3-core \
+ python3-ctypes \
+ python3-threading \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-filelock_3.13.4.bb b/meta-python/recipes-devtools/python/python3-filelock_3.13.4.bb
new file mode 100644
index 0000000000..4d6d19551a
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-filelock_3.13.4.bb
@@ -0,0 +1,16 @@
+# SPDX-License-Identifier: MIT
+# Copyright (C) 2023 iris-GmbH infrared & intelligent sensors
+
+SUMMARY = "A single module, which implements a platform independent file lock in Python, which provides a simple way of inter-process communication"
+HOMEPAGE = "https://py-filelock.readthedocs.io/"
+LICENSE = "Unlicense"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=911690f51af322440237a253d695d19f"
+
+SRC_URI[sha256sum] = "d13f466618bfde72bd2c18255e269f72542c6e70e7bac83a0232d6b1cc5c8cf4"
+
+BBCLASSEXTEND = "native nativesdk"
+inherit pypi python_hatchling
+
+DEPENDS += "\
+ python3-hatch-vcs-native \
+"
diff --git a/meta-python/recipes-devtools/python/python3-flask-babel_0.11.2.bb b/meta-python/recipes-devtools/python/python3-flask-babel_0.11.2.bb
deleted file mode 100644
index 104e7c28f1..0000000000
--- a/meta-python/recipes-devtools/python/python3-flask-babel_0.11.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-flask-babel.inc
diff --git a/meta-python/recipes-devtools/python/python3-flask-babel_4.0.0.bb b/meta-python/recipes-devtools/python/python3-flask-babel_4.0.0.bb
new file mode 100644
index 0000000000..b445ec0e1c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-flask-babel_4.0.0.bb
@@ -0,0 +1,15 @@
+DESCRIPTION = "i18n and l10n support for Flask based on babel and pytz"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=51917f3e8e858f5ae295a7d0e2eb3cc9"
+
+SRC_URI[sha256sum] = "dbeab4027a3f4a87678a11686496e98e1492eb793cbdd77ab50f4e9a2602a593"
+
+PYPI_PACKAGE = "flask_babel"
+
+inherit pypi python_poetry_core
+
+RDEPENDS:${PN} += "\
+ python3-speaklater \
+ python3-babel \
+ python3-flask \
+ "
diff --git a/meta-python/recipes-devtools/python/python3-flask-cors_4.0.0.bb b/meta-python/recipes-devtools/python/python3-flask-cors_4.0.0.bb
new file mode 100644
index 0000000000..1d0d86b4e7
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-flask-cors_4.0.0.bb
@@ -0,0 +1,16 @@
+HOMEPAGE = "https://pypi.python.org/pypi/Flask-Cors/"
+SUMMARY = "A Flask extension adding a decorator for CORS support"
+DESCRIPTION = "\
+ A Flask extension for handling Cross Origin Resource Sharing (CORS), making cross-origin AJAX possible \
+ "
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=118fecaa576ab51c1520f95e98db61ce"
+
+PYPI_PACKAGE = "Flask-Cors"
+
+SRC_URI[sha256sum] = "f268522fcb2f73e2ecdde1ef45e2fd5c71cc48fe03cffb4b441c6d1b40684eb0"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-flask"
diff --git a/meta-python/recipes-devtools/python/python3-flask-httpauth_4.8.0.bb b/meta-python/recipes-devtools/python/python3-flask-httpauth_4.8.0.bb
new file mode 100644
index 0000000000..51b907e6db
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-flask-httpauth_4.8.0.bb
@@ -0,0 +1,14 @@
+SUMMARY = "Simple extension that provides Basic and Digest HTTP authentication for Flask routes."
+HOMEPAGE = "https://github.com/miguelgrinberg/flask-httpauth"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3b69377f79f3f48c661701236d5a6a85"
+
+inherit pypi python_setuptools_build_meta
+
+PYPI_PACKAGE = "Flask-HTTPAuth"
+
+SRC_URI[sha256sum] = "66568a05bc73942c65f1e2201ae746295816dc009edd84b482c44c758d75097a"
+
+RDEPENDS:${PN} += "\
+ python3-flask \
+ "
diff --git a/meta-python/recipes-devtools/python/python3-flask-jsonpify_1.5.0.bb b/meta-python/recipes-devtools/python/python3-flask-jsonpify_1.5.0.bb
new file mode 100644
index 0000000000..76c6fb7731
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-flask-jsonpify_1.5.0.bb
@@ -0,0 +1,14 @@
+DESCRIPTION = "A Flask extension adding a decorator for JSONP support"
+HOMEPAGE = "https://github.com/CoryDolphin/flask-jsonpify"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://README.rst;md5=bd59445a234a0c8250b39178d42e3148"
+
+PYPI_PACKAGE = "Flask-Jsonpify"
+
+SRC_URI[md5sum] = "8a10e37942c43d93d107644a3fe77d98"
+SRC_URI[sha256sum] = "8ac4c732aa5b11d9f6c2de58065d3b669f139518ca8f529bce943817e2fedbfb"
+
+inherit pypi setuptools3
+
+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
new file mode 100644
index 0000000000..35bcbc00ae
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-flask-jwt_0.3.2.bb
@@ -0,0 +1,14 @@
+DESCRIPTION = "JWT token authentication for Flask apps"
+HOMEPAGE = "https://github.com/mattupstate/flask-jwt"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ff00db41c47ec84b4567a8b3c246a959"
+
+PYPI_PACKAGE = "Flask-JWT"
+
+SRC_URI[md5sum] = "878ad79a12afa70ad38a12d5ffd2dc1e"
+SRC_URI[sha256sum] = "49c0672fbde0f1cd3374bd834918d28956e3c521c7e00089cdc5380d323bd0ad"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-pyjwt python3-flask"
diff --git a/meta-python/recipes-devtools/python/python3-flask-login_0.4.1.bb b/meta-python/recipes-devtools/python/python3-flask-login_0.4.1.bb
deleted file mode 100644
index 2d23fe1674..0000000000
--- a/meta-python/recipes-devtools/python/python3-flask-login_0.4.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-flask-login.inc
diff --git a/meta-python/recipes-devtools/python/python-flask-login.inc b/meta-python/recipes-devtools/python/python3-flask-login_0.6.3.bb
index 59eb64f778..d990d4e80b 100644
--- a/meta-python/recipes-devtools/python/python-flask-login.inc
+++ b/meta-python/recipes-devtools/python/python3-flask-login_0.6.3.bb
@@ -6,9 +6,10 @@ HOMEPAGE = " https://github.com/maxcountryman/flask-login"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=8aa87a1cd9fa41d969ad32cfdac2c596"
-SRC_URI[md5sum] = "25b34c74bd509792f291c16e184225df"
-SRC_URI[sha256sum] = "c815c1ac7b3e35e2081685e389a665f2c74d7e077cb93cecabaea352da4752ec"
+SRC_URI[sha256sum] = "5e23d14a607ef12806c699590b89d0f0e0d67baeec599d75947bf9c147330333"
PYPI_PACKAGE = "Flask-Login"
-RDEPENDS_${PN}_class-target = "${PYTHON_PN}-flask"
+inherit pypi setuptools3
+
+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 0b963be56f..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
@@ -1,2 +1,17 @@
+SUMMARY = "Flask extension for sending email"
+DESCRIPTION = "A Flask extension for sending email"
+HOMEPAGE = " https://github.com/rduplain/flask-email"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=5b16dfa6d3f275ace5985bb92949f770"
+
+SRC_URI[md5sum] = "04b35a42a44ec7aa724ec8ce55e2e08e"
+SRC_URI[sha256sum] = "22e5eb9a940bf407bcf30410ecc3708f3c56cc44b29c34e1726fe85006935f41"
+
+PYPI_PACKAGE = "Flask-Mail"
+
inherit pypi setuptools3
-require python-flask-mail.inc
+
+RDEPENDS:${PN} = " \
+ python3-blinker \
+ python3-flask \
+"
diff --git a/meta-python/recipes-devtools/python/python3-flask-marshmallow_1.2.1.bb b/meta-python/recipes-devtools/python/python3-flask-marshmallow_1.2.1.bb
new file mode 100644
index 0000000000..8408ebd7b0
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-flask-marshmallow_1.2.1.bb
@@ -0,0 +1,15 @@
+SUMMARY = "Flask + marshmallow for beautiful APIs"
+HOMEPAGE = "https://github.com/marshmallow-code/flask-marshmallow"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=27586b20700d7544c06933afe56f7df4"
+
+inherit pypi python_setuptools_build_meta
+
+PYPI_PACKAGE = "flask_marshmallow"
+
+SRC_URI[sha256sum] = "00ee96399ed664963afff3b5d6ee518640b0f91dbc2aace2b5abcf32f40ef23a"
+
+RDEPENDS:${PN} += "\
+ python3-flask \
+ python3-marshmallow \
+ "
diff --git a/meta-python/recipes-devtools/python/python3-flask-migrate_2.2.1.bb b/meta-python/recipes-devtools/python/python3-flask-migrate_2.2.1.bb
deleted file mode 100644
index c98cbfddb0..0000000000
--- a/meta-python/recipes-devtools/python/python3-flask-migrate_2.2.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-flask-migrate.inc
diff --git a/meta-python/recipes-devtools/python/python3-flask-migrate_4.0.7.bb b/meta-python/recipes-devtools/python/python3-flask-migrate_4.0.7.bb
new file mode 100644
index 0000000000..bfd854ac05
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-flask-migrate_4.0.7.bb
@@ -0,0 +1,15 @@
+DESCRIPTION = "SQLAlchemy database migrations for Flask applications using Alembic"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3b69377f79f3f48c661701236d5a6a85"
+
+SRC_URI[sha256sum] = "dff7dd25113c210b069af280ea713b883f3840c1e3455274745d7355778c8622"
+
+PYPI_PACKAGE = "Flask-Migrate"
+
+inherit pypi python_setuptools_build_meta
+
+RDEPENDS:${PN} += "\
+ python3-flask-sqlalchemy \
+ python3-alembic \
+ python3-flask \
+ "
diff --git a/meta-python/recipes-devtools/python/python3-flask-nav_0.6.bb b/meta-python/recipes-devtools/python/python3-flask-nav_0.6.bb
index d25115251d..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
@@ -1,2 +1,15 @@
+DESCRIPTION = "Easily create navigation for Flask applications."
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=2729ee82259d601d90d28b0574d12416"
+
+SRC_URI[md5sum] = "4d51cfd06d58f8d0fe85775a6696c0e5"
+SRC_URI[sha256sum] = "44e40b755380a1e68ab521a2f9174de259a2c94ddcdaabf36b3aca2e110a33f4"
+
+PYPI_PACKAGE = "flask-nav"
+
inherit pypi setuptools3
-require python-flask-nav.inc
+
+RDEPENDS:${PN} += "\
+ python3-blinker \
+ python3-flask \
+ "
diff --git a/meta-python/recipes-devtools/python/python3-flask-pymongo_2.3.0.bb b/meta-python/recipes-devtools/python/python3-flask-pymongo_2.3.0.bb
index 2102554b66..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
@@ -1,2 +1,17 @@
+SUMMARY = "PyMongo support for Flask applications"
+DESCRIPTION = "PyMongo support for Flask applications."
+HOMEPAGE = "https://github.com/mitsuhiko/flask/"
+SECTION = "devel/python"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://flask_pymongo/wrappers.py;beginline=1;endline=24;md5=424c4e1047d28e01b4e4634a069c019d"
+
+SRC_URI[md5sum] = "94df71e6800b1d7915cc91a74b70f959"
+SRC_URI[sha256sum] = "620eb02dc8808a5fcb90f26cab6cba9d6bf497b15032ae3ca99df80366e33314"
+
+PYPI_PACKAGE = "Flask-PyMongo"
+
inherit pypi setuptools3
-require python-flask-pymongo.inc
+
+DEPENDS = "python3-vcversioner python3-vcversioner-native"
+
+RDEPENDS:${PN} = "python3-pymongo python3-flask"
diff --git a/meta-python/recipes-devtools/python/python-flask-restful.inc b/meta-python/recipes-devtools/python/python3-flask-restful_0.3.10.bb
index 0485f85aac..8ea455c633 100644
--- a/meta-python/recipes-devtools/python/python-flask-restful.inc
+++ b/meta-python/recipes-devtools/python/python3-flask-restful_0.3.10.bb
@@ -6,11 +6,10 @@ HOMEPAGE = "https://github.com/flask-restful/flask-restful"
LICENSE = "BSD-3-Clause"
LIC_FILES_CHKSUM = "file://LICENSE;md5=685bb55ed99a366bb431995f5eef2783"
-SRC_URI[md5sum] = "8243ca101185b130d8fa529cbdbdbddd"
-SRC_URI[sha256sum] = "5795519501347e108c436b693ff9a4d7b373a3ac9069627d64e4001c05dd3407"
+SRC_URI[sha256sum] = "fe4af2ef0027df8f9b4f797aba20c5566801b6ade995ac63b588abf1a59cec37"
-inherit pypi
+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-restful_0.3.6.bb b/meta-python/recipes-devtools/python/python3-flask-restful_0.3.6.bb
deleted file mode 100644
index 6bff59a565..0000000000
--- a/meta-python/recipes-devtools/python/python3-flask-restful_0.3.6.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-flask-restful.inc
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_3.3.2.bb b/meta-python/recipes-devtools/python/python3-flask-socketio_3.3.2.bb
deleted file mode 100644
index ffc4aa7fd9..0000000000
--- a/meta-python/recipes-devtools/python/python3-flask-socketio_3.3.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-flask-socketio.inc
diff --git a/meta-python/recipes-devtools/python/python-flask-socketio.inc b/meta-python/recipes-devtools/python/python3-flask-socketio_5.3.6.bb
index 251d13eded..6b76e03f8d 100644
--- a/meta-python/recipes-devtools/python/python-flask-socketio.inc
+++ b/meta-python/recipes-devtools/python/python3-flask-socketio_5.3.6.bb
@@ -5,14 +5,13 @@ SECTION = "devel/python"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=38cc21254909604298ce763a6e4440a0"
-inherit pypi
+inherit pypi python_setuptools_build_meta
PYPI_PACKAGE = "Flask-SocketIO"
-SRC_URI[md5sum] = "298965a43f6534e8a5b24d1ba1fc4186"
-SRC_URI[sha256sum] = "8d8f9f104db5ddff1b06ba322d8e158881d590144199c993fe26cf53218c7edd"
+SRC_URI[sha256sum] = "bb8f9f9123ef47632f5ce57a33514b0c0023ec3696b2384457f0fcaa5b70501c"
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-flask \
- ${PYTHON_PN}-socketio \
+RDEPENDS:${PN} += "\
+ python3-flask \
+ python3-socketio \
"
diff --git a/meta-python/recipes-devtools/python/python3-flask-sqlalchemy_2.3.2.bb b/meta-python/recipes-devtools/python/python3-flask-sqlalchemy_2.3.2.bb
deleted file mode 100644
index 07f45bcfff..0000000000
--- a/meta-python/recipes-devtools/python/python3-flask-sqlalchemy_2.3.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-flask-sqlalchemy.inc
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 758c2acf71..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
@@ -1,2 +1,14 @@
+DESCRIPTION = "Flexible and efficient upload handling for Flask"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=b712ac634b39469660c9bdfb8d03421c"
+
+SRC_URI[md5sum] = "e5eee34aa92b64a4d22847672b3858a1"
+SRC_URI[sha256sum] = "53ecbd6033667d50ae02b63adebbaa33c7fc56c09e5293025810cf9d841ecb02"
+
+PYPI_PACKAGE = "Flask-Uploads"
+
inherit pypi setuptools3
-require python-flask-uploads.inc
+
+RDEPENDS:${PN} += "\
+ python3-flask \
+ "
diff --git a/meta-python/recipes-devtools/python/python3-flask-user_0.6.19.bb b/meta-python/recipes-devtools/python/python3-flask-user_0.6.19.bb
index 251017f81e..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
@@ -1,2 +1,24 @@
+SUMMARY = "Customizable user account management for Flask"
+DESCRIPTION = "Customizable User Account Management for Flask; Register \
+Confirm email, Login, Change username, Change password, Forgot Password \
+and more."
+HOMEPAGE = " https://github.com/lingthio/Flask-User"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=97de97cd9d6e23c88129d884588ce71a"
+
+SRC_URI[md5sum] = "f7965e66ca139c8436896da07e66c21f"
+SRC_URI[sha256sum] = "601abcc0343dfbae0c56273d98362d5cdc266ac84d20b3f65a212e4a2c83b302"
+
+PYPI_PACKAGE = "Flask-User"
+
inherit pypi setuptools3
-require python-flask-user.inc
+
+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-versioned_0.9.4-20101221.bb b/meta-python/recipes-devtools/python/python3-flask-versioned_0.9.4-20101221.bb
new file mode 100644
index 0000000000..7aaf439b83
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-flask-versioned_0.9.4-20101221.bb
@@ -0,0 +1,9 @@
+SUMMARY = "Add version info to file paths."
+SECTION = "devel/python"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://flaskext/versioned/__init__.py;md5=dcb7d97884bf08c256ff5795766bcd24"
+
+PYPI_PACKAGE = "Flask-Versioned"
+SRC_URI[sha256sum] = "516694dc860a1bc4f22ab60b324a85083c0150522be109282a3bed681057fd34"
+
+inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-flask-wtf_0.14.2.bb b/meta-python/recipes-devtools/python/python3-flask-wtf_0.14.2.bb
deleted file mode 100644
index 52362a8659..0000000000
--- a/meta-python/recipes-devtools/python/python3-flask-wtf_0.14.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-flask-wtf.inc
diff --git a/meta-python/recipes-devtools/python/python3-flask-wtf_1.2.1.bb b/meta-python/recipes-devtools/python/python3-flask-wtf_1.2.1.bb
new file mode 100644
index 0000000000..509be463f8
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-flask-wtf_1.2.1.bb
@@ -0,0 +1,18 @@
+DESCRIPTION = "Simple integration of Flask and WTForms."
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=d98d089889e14b227732d45dac3aacc4"
+
+SRC_URI[sha256sum] = "8bb269eb9bb46b87e7c8233d7e7debdf1f8b74bf90cc1789988c29b37a97b695"
+
+PYPI_PACKAGE = "flask_wtf"
+UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/Flask-WTF"
+UPSTREAM_CHECK_REGEX = "/Flask-WTF/(?P<pver>(\d+[\.\-_]*)+)"
+
+inherit pypi python_hatchling
+
+RDEPENDS:${PN} = "\
+ python3-flask \
+ python3-itsdangerous \
+ python3-json \
+ python3-wtforms \
+"
diff --git a/meta-python/recipes-devtools/python/python3-flask_1.0.2.bb b/meta-python/recipes-devtools/python/python3-flask_1.0.2.bb
deleted file mode 100644
index cd439900c9..0000000000
--- a/meta-python/recipes-devtools/python/python3-flask_1.0.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-flask.inc
diff --git a/meta-python/recipes-devtools/python/python3-flask_3.0.2.bb b/meta-python/recipes-devtools/python/python3-flask_3.0.2.bb
new file mode 100644
index 0000000000..300ca99ddc
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-flask_3.0.2.bb
@@ -0,0 +1,25 @@
+SUMMARY = "A microframework based on Werkzeug, Jinja2 and good intentions"
+DESCRIPTION = "\
+Flask is a microframework for Python based on Werkzeug, Jinja 2 and good \
+intentions. And before you ask: It’s BSD licensed!"
+HOMEPAGE = "https://github.com/mitsuhiko/flask/"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=ffeffa59c90c9c4a033c7574f8f3fb75"
+
+SRC_URI[sha256sum] = "822c03f4b799204250a7ee84b1eddc40665395333973dfb9deebfe425fefcb7d"
+
+UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/Flask"
+UPSTREAM_CHECK_REGEX = "/Flask/(?P<pver>(\d+[\.\-_]*)+)"
+
+inherit pypi python_setuptools_build_meta
+
+CLEANBROKEN = "1"
+
+RDEPENDS:${PN} = " \
+ python3-blinker \
+ python3-click \
+ python3-itsdangerous \
+ python3-jinja2 \
+ python3-profile \
+ python3-werkzeug \
+"
diff --git a/meta-python/recipes-devtools/python/python3-flexcache/run-ptest b/meta-python/recipes-devtools/python/python3-flexcache/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-flexcache/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-flexcache_0.3.bb b/meta-python/recipes-devtools/python/python3-flexcache_0.3.bb
new file mode 100644
index 0000000000..1bee774022
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-flexcache_0.3.bb
@@ -0,0 +1,31 @@
+SUMMARY = "Saves and loads to the cache a transformed versions of a source object."
+HOMEPAGE = "https://github.com/hgrecco/flexcache"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=32f547dac365c355d2cdbcd7ebea9144"
+DEPENDS += "python3-setuptools-scm-native"
+SRC_URI[sha256sum] = "18743bd5a0621bfe2cf8d519e4c3bfdf57a269c15d1ced3fb4b64e0ff4600656"
+
+inherit pypi python_setuptools_build_meta ptest
+PYPI_PACKAGE = "flexcache"
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/testsuite
+ cp -rf ${S}/flexcache/testsuite/* ${D}${PTEST_PATH}/testsuite/
+}
+
+RDEPENDS:${PN} += " \
+ python3-compression \
+ python3-email \
+ python3-json \
+ python3-pickle \
+ python3-typing-extensions \
+"
diff --git a/meta-python/recipes-devtools/python/python3-flexparser/run-ptest b/meta-python/recipes-devtools/python/python3-flexparser/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-flexparser/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-flexparser_0.3.bb b/meta-python/recipes-devtools/python/python3-flexparser_0.3.bb
new file mode 100644
index 0000000000..e45175f5a5
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-flexparser_0.3.bb
@@ -0,0 +1,31 @@
+SUMMARY = "Parsing made fun ... using typing."
+HOMEPAGE = "https://github.com/hgrecco/flexparser"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=32f547dac365c355d2cdbcd7ebea9144"
+
+DEPENDS += "python3-setuptools-scm-native"
+SRC_URI[sha256sum] = "692e7524d9e14b2b1231b772b091d7d6296951deb383f5a67bfbd0ecb0b9fa9a"
+
+inherit pypi python_setuptools_build_meta ptest
+
+PYPI_PACKAGE = "flexparser"
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/testsuite
+ cp -rf ${S}/flexparser/testsuite/* ${D}${PTEST_PATH}/testsuite/
+}
+
+RDEPENDS:${PN} += " \
+ python3-compression \
+ python3-email \
+ python3-logging \
+"
diff --git a/meta-python/recipes-devtools/python/python3-freezegun/run-ptest b/meta-python/recipes-devtools/python/python3-freezegun/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-freezegun/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-freezegun_1.4.0.bb b/meta-python/recipes-devtools/python/python3-freezegun_1.4.0.bb
new file mode 100644
index 0000000000..15c0bf06ba
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-freezegun_1.4.0.bb
@@ -0,0 +1,29 @@
+SUMMARY = "FreezeGun is a library that allows your Python tests to travel through time by mocking the datetime module."
+HOMEPAGE = "https://github.com/spulec/freezegun"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=acf1d209bb6eddae4cbe6ffd6a0144fe"
+
+SRC_URI[sha256sum] = "10939b0ba0ff5adaecf3b06a5c2f73071d9678e507c5eaedb23c761d56ac774b"
+
+inherit pypi python_setuptools_build_meta ptest
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-sqlite3 \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+RDEPENDS:${PN} = "\
+ python3-asyncio \
+ python3-dateutil \
+ python3-unittest \
+"
diff --git a/meta-python/recipes-devtools/python/python3-frozenlist_1.4.1.bb b/meta-python/recipes-devtools/python/python3-frozenlist_1.4.1.bb
new file mode 100644
index 0000000000..4288f2922e
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-frozenlist_1.4.1.bb
@@ -0,0 +1,15 @@
+SUMMARY = "A list-like structure which implements collections.abc.MutableSequence, and which can be made immutable."
+HOMEPAGE = "https://github.com/aio-libs/frozenlist"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=cf056e8e7a0a5477451af18b7b5aa98c"
+
+SRC_URI[sha256sum] = "c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"
+
+inherit pypi python_setuptools_build_meta
+
+DEPENDS += " \
+ python3-expandvars-native \
+ python3-cython-native \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-future_0.16.0.bb b/meta-python/recipes-devtools/python/python3-future_0.16.0.bb
deleted file mode 100644
index f059186bf8..0000000000
--- a/meta-python/recipes-devtools/python/python3-future_0.16.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-future.inc
diff --git a/meta-python/recipes-devtools/python/python3-future_0.18.3.bb b/meta-python/recipes-devtools/python/python3-future_0.18.3.bb
new file mode 100644
index 0000000000..e4a4b5c197
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-future_0.18.3.bb
@@ -0,0 +1,12 @@
+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"
+
+SRC_URI[sha256sum] = "34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307"
+
+PYPI_PACKAGE_HASH = "99abde815842bc6e97d5a7806ad51236630da14ca2f3b1fce94c0bb94d3d"
+
+inherit pypi setuptools3
+
+BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python3-gast_0.2.2.bb b/meta-python/recipes-devtools/python/python3-gast_0.5.4.bb
index 6e08a19949..9c750ea3b0 100644
--- a/meta-python/recipes-devtools/python/python3-gast_0.2.2.bb
+++ b/meta-python/recipes-devtools/python/python3-gast_0.5.4.bb
@@ -4,11 +4,8 @@ SECTION = "devel/python"
LICENSE = "BSD-3-Clause"
LIC_FILES_CHKSUM = "file://LICENSE;md5=a3ad9b6802e713fc5e307e1230f1ea90"
-SRC_URI = "git://github.com/serge-sans-paille/gast.git"
-SRCREV ?= "ed82e2a507505c6b18eb665d3738b6c0602da5e7"
+SRC_URI[sha256sum] = "9c270fe5f4b130969b54174de7db4e764b09b4f7f67ccfc32480e29f78348d97"
-inherit setuptools3
-
-S = "${WORKDIR}/git"
+inherit pypi setuptools3
BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python3-gcovr_7.2.bb b/meta-python/recipes-devtools/python/python3-gcovr_7.2.bb
new file mode 100644
index 0000000000..8a61a2de05
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-gcovr_7.2.bb
@@ -0,0 +1,16 @@
+DESCRIPTION = "generate GCC code coverage reports"
+HOMEPAGE = "https://gcovr.com"
+SECTION = "devel/python"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=c5a58ca91c1758a53f896ba89d8aaac2"
+
+SRC_URI = "git://github.com/gcovr/gcovr.git;branch=main;protocol=https"
+SRCREV = "c4b74b0859611283be646d590c7915e787911b6f"
+
+S = "${WORKDIR}/git"
+
+inherit setuptools3
+
+RDEPENDS:${PN} += "python3-jinja2 python3-lxml python3-setuptools python3-pygments python3-multiprocessing"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-geojson/run-ptest b/meta-python/recipes-devtools/python/python3-geojson/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-geojson/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-geojson_3.1.0.bb b/meta-python/recipes-devtools/python/python3-geojson_3.1.0.bb
new file mode 100644
index 0000000000..742f921e59
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-geojson_3.1.0.bb
@@ -0,0 +1,26 @@
+SUMMARY = "Python bindings and utilities for GeoJSON"
+HOMEPAGE = "https://pypi.org/project/geojson/"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=f77f2ed49768c8d4c79ba874c0f94d8a"
+
+SRC_URI[sha256sum] = "58a7fa40727ea058efc28b0e9ff0099eadf6d0965e04690830208d3ef571adac"
+
+inherit pypi setuptools3 ptest
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+RDEPENDS:${PN} += "python3-simplejson python3-math"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-geomet_1.1.0.bb b/meta-python/recipes-devtools/python/python3-geomet_1.1.0.bb
new file mode 100644
index 0000000000..ceba10b65b
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-geomet_1.1.0.bb
@@ -0,0 +1,24 @@
+SUMMARY = "Convert GeoJSON to WKT/WKB (Well-Known Text/Binary), and vice versa."
+DESCRIPTION = "Convert GeoJSON to WKT/WKB (Well-Known Text/Binary), and vice versa."
+HOMEPAGE = "https://github.com/geomet/geomet"
+SECTION = "devel/python"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d2794c0df5b907fdace235a619d80314"
+SRCNAME = "geomet"
+
+SRC_URI[sha256sum] = "cb52411978ee01ff104ab48f108d7333b14423ae7a15a65fee25b7d29bda2e1b"
+
+S = "${WORKDIR}/git"
+SRC_URI = "git://github.com/geomet/geomet.git;protocol=https;branch=master"
+SRCREV = "6ac73c312b52aca328db2e61d90c5e363b62639f"
+
+inherit setuptools3
+
+RDEPENDS:${PN} += "\
+ python3-click \
+ python3-core \
+ python3-io \
+ python3-json \
+ python3-logging \
+ python3-six \
+"
diff --git a/meta-python/recipes-devtools/python/python3-gevent/0001-_setuputils.py-Do-not-add-sys_inc_dir.patch b/meta-python/recipes-devtools/python/python3-gevent/0001-_setuputils.py-Do-not-add-sys_inc_dir.patch
new file mode 100644
index 0000000000..49903d6ce8
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-gevent/0001-_setuputils.py-Do-not-add-sys_inc_dir.patch
@@ -0,0 +1,38 @@
+From 9eb453283a7ac8a9b1dd3eac86d936c7a430476b Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Tue, 11 Oct 2022 17:37:01 -0700
+Subject: [PATCH] _setuputils.py: Do not add sys_inc_dir
+
+sys_inc_dir computes to ignore sysroot and ends with paths into host
+system include area, which is then flagged by OE gcc since it finds
+the host include path poisoning. Since we are adding the syroot anyway
+we really do not need setuptools to deduce it for us.
+
+Upstream-Status: Inappropriate [ Cross-compile specific ]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+
+---
+ _setuputils.py | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/_setuputils.py b/_setuputils.py
+index 4c25e00..23fdfe1 100644
+--- a/_setuputils.py
++++ b/_setuputils.py
+@@ -164,7 +164,6 @@ def get_include_dirs(*extra_paths):
+ # Neither sysconfig dir is not enough if we're in a virtualenv; the greenlet.h
+ # header goes into a site/ subdir. See https://github.com/pypa/pip/issues/4610
+ dist_inc_dir = os.path.abspath(dist_sysconfig.get_python_inc()) # 1
+- sys_inc_dir = os.path.abspath(sysconfig.get_path("include")) # 2
+ venv_include_dir = os.path.join(
+ sys.prefix, 'include', 'site',
+ 'python' + sysconfig.get_python_version()
+@@ -178,7 +177,7 @@ def get_include_dirs(*extra_paths):
+
+ return [
+ p
+- for p in (dist_inc_dir, sys_inc_dir, dep_inc_dir) + extra_paths
++ for p in (dist_inc_dir, dep_inc_dir) + extra_paths
+ if os.path.exists(p)
+ ]
+
diff --git a/meta-python/recipes-devtools/python/python3-gevent_1.4.0.bb b/meta-python/recipes-devtools/python/python3-gevent_1.4.0.bb
deleted file mode 100644
index df688e4240..0000000000
--- a/meta-python/recipes-devtools/python/python3-gevent_1.4.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-gevent.inc
-inherit setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-gevent_24.2.1.bb b/meta-python/recipes-devtools/python/python3-gevent_24.2.1.bb
new file mode 100644
index 0000000000..fbdbf8ccc7
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-gevent_24.2.1.bb
@@ -0,0 +1,37 @@
+SUMMARY = "A coroutine-based Python networking library"
+DESCRIPTION = "gevent is a coroutine-based Python networking library that uses greenlet to provide \
+a high-level synchronous API on top of the libevent event loop."
+HOMEPAGE = "http://www.gevent.org"
+LICENSE = "MIT & Python-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=4de99aac27b470c29c6c309e0c279b65"
+DEPENDS += "python3-greenlet libev libuv c-ares python3-cython-native"
+
+RDEPENDS:${PN} = "python3-greenlet \
+ python3-mime \
+ python3-pprint \
+ python3-zopeevent \
+ python3-zopeinterface \
+ "
+
+SRC_URI += "file://0001-_setuputils.py-Do-not-add-sys_inc_dir.patch"
+
+SRC_URI[sha256sum] = "432fc76f680acf7cf188c2ee0f5d3ab73b63c1f03114c7cd8a34cebbe5aa2056"
+
+inherit pypi setuptools3
+
+# Don't embed libraries, link to the system provided libs instead
+export GEVENTSETUP_EMBED_CARES = "0"
+export GEVENTSETUP_EMBED_LIBEV = "0"
+export GEVENTSETUP_EMBED_LIBUV = "0"
+
+do_configure:append() {
+ # Delete the embedded copies of libraries so we can't accidentally link to them
+ rm -rf ${S}/deps
+
+ # Delete the generated cython files, as they are all out of date with python 3.11
+ rm -rf ${S}/src/gevent/*.c
+}
+
+do_compile:append() {
+ sed -i -e 's#${WORKDIR}##g' ${S}/src/gevent/*.c ${S}/src/gevent/libev/*.c ${S}/src/gevent/resolver/*.c
+}
diff --git a/meta-python/recipes-devtools/python/python3-git-pw_2.6.0.bb b/meta-python/recipes-devtools/python/python3-git-pw_2.6.0.bb
new file mode 100644
index 0000000000..c0b6a60814
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-git-pw_2.6.0.bb
@@ -0,0 +1,20 @@
+SUMMARY = "A tool for integrating Git with Patchwork"
+HOMEPAGE = "https://github.com/getpatchwork/git-pw"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=26e1a171d943c64f00c51f90c256b9d4"
+
+SRC_URI[sha256sum] = "e118e31bbe259ed9ae540d627cc563a6ece553d02aed11b1a92bbac408a0da0e"
+
+inherit pypi python_setuptools_build_meta
+
+DEPENDS += " \
+ python3-pbr-native \
+"
+
+RDEPENDS:${PN} += " \
+ python3-arrow \
+ python3-click \
+ python3-pyyaml \
+ python3-requests \
+ python3-tabulate \
+"
diff --git a/meta-python/recipes-devtools/python/python3-gmpy2/0001-src-fix-python-3.12-builds.patch b/meta-python/recipes-devtools/python/python3-gmpy2/0001-src-fix-python-3.12-builds.patch
new file mode 100644
index 0000000000..1171322e26
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-gmpy2/0001-src-fix-python-3.12-builds.patch
@@ -0,0 +1,263 @@
+From 43f132103cedfd92b85173bcdacfbabd5916d9fc Mon Sep 17 00:00:00 2001
+From: Alexander Kanavin <alex@linutronix.de>
+Date: Wed, 27 Dec 2023 14:52:16 +0100
+Subject: [PATCH] src: fix python 3.12 builds
+
+This is a backport for 3.1.x versions provided separately in https://github.com/aleaxit/gmpy/issues/446
+
+Upstream-Status: Inappropriate [can be dropped when 2.2.x is released]
+
+Signed-off-by: Alexander Kanavin <alex@linutronix.de>
+---
+ src/gmpy2_convert.h | 21 +++++++
+ src/gmpy2_convert_gmp.c | 129 +++++++++++++-------------------------
+ src/gmpy2_convert_utils.c | 2 +-
+ 3 files changed, 65 insertions(+), 87 deletions(-)
+
+diff --git a/src/gmpy2_convert.h b/src/gmpy2_convert.h
+index f887d47..3e8cb2b 100644
+--- a/src/gmpy2_convert.h
++++ b/src/gmpy2_convert.h
+@@ -142,6 +142,27 @@ extern "C" {
+ #define IS_TYPE_COMPLEX_ONLY(x) ((x > OBJ_TYPE_REAL) && \
+ (x < OBJ_TYPE_COMPLEX))
+
++/* Compatibility macros (to work with PyLongObject internals).
++ */
++
++#if PY_VERSION_HEX >= 0x030C0000
++# define TAG_FROM_SIGN_AND_SIZE(is_neg, size) ((is_neg?2:(size==0)) | (((size_t)size) << 3))
++# define _PyLong_SetSignAndDigitCount(obj, is_neg, size) (obj->long_value.lv_tag = TAG_FROM_SIGN_AND_SIZE(is_neg, size))
++#elif PY_VERSION_HEX >= 0x030900A4
++# define _PyLong_SetSignAndDigitCount(obj, is_neg, size) (Py_SET_SIZE(obj, (is_neg?-1:1)*size))
++#else
++# define _PyLong_SetSignAndDigitCount(obj, is_neg, size) (Py_SIZE(obj) = (is_neg?-1:1)*size)
++#endif
++
++#if PY_VERSION_HEX >= 0x030C0000
++# define GET_OB_DIGIT(obj) obj->long_value.ob_digit
++# define _PyLong_IsNegative(obj) ((obj->long_value.lv_tag & 3) == 2)
++# define _PyLong_DigitCount(obj) (obj->long_value.lv_tag >> 3)
++#else
++# define GET_OB_DIGIT(obj) obj->ob_digit
++# define _PyLong_IsNegative(obj) (Py_SIZE(obj) < 0)
++# define _PyLong_DigitCount(obj) (_PyLong_IsNegative(obj)? -Py_SIZE(obj):Py_SIZE(obj))
++#endif
+
+ /* Since the macros are used in gmpy2's codebase, these functions are skipped
+ * until they are needed for the C API in the future.
+diff --git a/src/gmpy2_convert_gmp.c b/src/gmpy2_convert_gmp.c
+index cf0891e..8b8df81 100644
+--- a/src/gmpy2_convert_gmp.c
++++ b/src/gmpy2_convert_gmp.c
+@@ -59,33 +59,24 @@ GMPy_MPZ_From_PyIntOrLong(PyObject *obj, CTXT_Object *context)
+ }
+ #endif
+
+- switch (Py_SIZE(templong)) {
+- case -1:
+- mpz_set_si(result->z, -(sdigit)templong->ob_digit[0]);
++ len = _PyLong_DigitCount(templong);
++ negative = _PyLong_IsNegative(templong);
++
++ switch (len) {
++ case 1:
++ mpz_set_si(result->z, (sdigit)GET_OB_DIGIT(templong)[0]);
+ break;
+ case 0:
+ mpz_set_si(result->z, 0);
+ break;
+- case 1:
+- mpz_set_si(result->z, templong->ob_digit[0]);
+- break;
+ default:
+- mpz_set_si(result->z, 0);
+-
+- if (Py_SIZE(templong) < 0) {
+- len = - Py_SIZE(templong);
+- negative = 1;
+- } else {
+- len = Py_SIZE(templong);
+- negative = 0;
+- }
+-
+- mpz_import(result->z, len, -1, sizeof(templong->ob_digit[0]), 0,
+- sizeof(templong->ob_digit[0])*8 - PyLong_SHIFT, templong->ob_digit);
++ mpz_import(result->z, len, -1, sizeof(GET_OB_DIGIT(templong)[0]), 0,
++ sizeof(GET_OB_DIGIT(templong)[0])*8 - PyLong_SHIFT,
++ GET_OB_DIGIT(templong));
++ }
+
+- if (negative) {
+- mpz_neg(result->z, result->z);
+- }
++ if (negative) {
++ mpz_neg(result->z, result->z);
+ }
+ return result;
+ }
+@@ -105,33 +96,24 @@ mpz_set_PyIntOrLong(mpz_t z, PyObject *obj)
+ }
+ #endif
+
+- switch (Py_SIZE(templong)) {
+- case -1:
+- mpz_set_si(z, -(sdigit)templong->ob_digit[0]);
++ len = _PyLong_DigitCount(templong);
++ negative = _PyLong_IsNegative(templong);
++
++ switch (len) {
++ case 1:
++ mpz_set_si(z, (sdigit)GET_OB_DIGIT(templong)[0]);
+ break;
+ case 0:
+ mpz_set_si(z, 0);
+ break;
+- case 1:
+- mpz_set_si(z, templong->ob_digit[0]);
+- break;
+ default:
+- mpz_set_si(z, 0);
+-
+- if (Py_SIZE(templong) < 0) {
+- len = - Py_SIZE(templong);
+- negative = 1;
+- } else {
+- len = Py_SIZE(templong);
+- negative = 0;
+- }
+-
+- mpz_import(z, len, -1, sizeof(templong->ob_digit[0]), 0,
+- sizeof(templong->ob_digit[0])*8 - PyLong_SHIFT, templong->ob_digit);
++ mpz_import(z, len, -1, sizeof(GET_OB_DIGIT(templong)[0]), 0,
++ sizeof(GET_OB_DIGIT(templong)[0])*8 - PyLong_SHIFT,
++ GET_OB_DIGIT(templong));
++ }
+
+- if (negative) {
+- mpz_neg(z, z);
+- }
++ if (negative) {
++ mpz_neg(z, z);
+ }
+ return;
+ }
+@@ -186,12 +168,7 @@ GMPy_PyLong_From_MPZ(MPZ_Object *obj, CTXT_Object *context)
+
+ /* Assume gmp uses limbs as least as large as the builtin longs do */
+
+- if (mpz_sgn(obj->z) < 0) {
+- negative = 1;
+- } else {
+- negative = 0;
+- }
+-
++ negative = mpz_sgn(obj->z) < 0;
+ size = (mpz_sizeinbase(obj->z, 2) + PyLong_SHIFT - 1) / PyLong_SHIFT;
+
+ if (!(result = _PyLong_New(size))) {
+@@ -200,31 +177,20 @@ GMPy_PyLong_From_MPZ(MPZ_Object *obj, CTXT_Object *context)
+ /* LCOV_EXCL_STOP */
+ }
+
+- mpz_export(result->ob_digit, &count, -1, sizeof(result->ob_digit[0]), 0,
+- sizeof(result->ob_digit[0])*8 - PyLong_SHIFT, obj->z);
++ mpz_export(GET_OB_DIGIT(result), &count, -1, sizeof(GET_OB_DIGIT(result)[0]), 0,
++ sizeof(GET_OB_DIGIT(result)[0])*8 - PyLong_SHIFT, obj->z);
+
+ if (count == 0) {
+- result->ob_digit[0] = 0;
++ GET_OB_DIGIT(result)[0] = 0;
+ }
+
+ /* long_normalize() is file-static so we must reimplement it */
+ /* longobjp = long_normalize(longobjp); */
+- while ((size>0) && (result->ob_digit[size-1] == 0)) {
++ while ((size>0) && (GET_OB_DIGIT(result)[size-1] == 0)) {
+ size--;
+ }
+-#if PY_VERSION_HEX >= 0x030900A4
+- Py_SET_SIZE(result, size);
+-#else
+- Py_SIZE(result) = size;
+-#endif
+
+- if (negative) {
+-#if PY_VERSION_HEX >= 0x030900A4
+- Py_SET_SIZE(result, - Py_SIZE(result));
+-#else
+- Py_SIZE(result) = - Py_SIZE(result);
+-#endif
+- }
++ _PyLong_SetSignAndDigitCount(result, negative, size);
+ return (PyObject*)result;
+ }
+
+@@ -476,33 +442,24 @@ GMPy_XMPZ_From_PyIntOrLong(PyObject *obj, CTXT_Object *context)
+ }
+ #endif
+
+- switch (Py_SIZE(templong)) {
+- case -1:
+- mpz_set_si(result->z, -(sdigit)templong->ob_digit[0]);
++ len = _PyLong_DigitCount(templong);
++ negative = _PyLong_IsNegative(templong);
++
++ switch (len) {
++ case 1:
++ mpz_set_si(result->z, (sdigit)GET_OB_DIGIT(templong)[0]);
+ break;
+ case 0:
+ mpz_set_si(result->z, 0);
+ break;
+- case 1:
+- mpz_set_si(result->z, templong->ob_digit[0]);
+- break;
+ default:
+- mpz_set_si(result->z, 0);
+-
+- if (Py_SIZE(templong) < 0) {
+- len = - Py_SIZE(templong);
+- negative = 1;
+- } else {
+- len = Py_SIZE(templong);
+- negative = 0;
+- }
+-
+- mpz_import(result->z, len, -1, sizeof(templong->ob_digit[0]), 0,
+- sizeof(templong->ob_digit[0])*8 - PyLong_SHIFT, templong->ob_digit);
++ mpz_import(result->z, len, -1, sizeof(GET_OB_DIGIT(templong)[0]), 0,
++ sizeof(GET_OB_DIGIT(templong)[0])*8 - PyLong_SHIFT,
++ GET_OB_DIGIT(templong));
++ }
+
+- if (negative) {
+- mpz_neg(result->z, result->z);
+- }
++ if (negative) {
++ mpz_neg(result->z, result->z);
+ }
+ return result;
+ }
+@@ -639,7 +596,7 @@ GMPy_MPQ_From_PyStr(PyObject *s, int base, CTXT_Object *context)
+ }
+
+ cp = PyBytes_AsString(ascii_str);
+-
++
+ {
+ char *whereslash = strchr((char*)cp, '/');
+ char *wheredot = strchr((char*)cp, '.');
+diff --git a/src/gmpy2_convert_utils.c b/src/gmpy2_convert_utils.c
+index d676eaf..8908d17 100644
+--- a/src/gmpy2_convert_utils.c
++++ b/src/gmpy2_convert_utils.c
+@@ -123,7 +123,7 @@ static unsigned long
+ GMPy_Integer_AsUnsignedLongWithType_v2(PyObject *x, int xtype)
+ {
+ if IS_TYPE_PyInteger(xtype) {
+- if (Py_SIZE(x) < 0) {
++ if (_PyLong_IsNegative(((PyLongObject*)x))) {
+ VALUE_ERROR("n must be > 0");
+ return (unsigned long)-1;
+ }
diff --git a/meta-python/recipes-devtools/python/python3-gmpy2_2.1.5.bb b/meta-python/recipes-devtools/python/python3-gmpy2_2.1.5.bb
new file mode 100644
index 0000000000..d9e9bd50e5
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-gmpy2_2.1.5.bb
@@ -0,0 +1,15 @@
+SUMMARY = "GMP/MPIR, MPFR, and MPC interface to Python 2.6+ and 3.x"
+SECTION = "devel/python"
+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] = "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.14.bb b/meta-python/recipes-devtools/python/python3-gmqtt_0.6.14.bb
new file mode 100644
index 0000000000..5d8a3ba51c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-gmqtt_0.6.14.bb
@@ -0,0 +1,19 @@
+SUMMARY = "Client for MQTT protocol"
+HOMEPAGE = "https://github.com/wialon/gmqtt"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=903f1792621a3b35ee546da75d139177"
+
+SRC_URI[sha256sum] = "45b0f7794247455b9163155eeedf41c86e303c72b79056bf65d33038b17443a3"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "\
+ python3-asyncio \
+ python3-core \
+ python3-datetime \
+ python3-json \
+ python3-logging \
+ python3-netclient \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-gnupg_0.5.2.bb b/meta-python/recipes-devtools/python/python3-gnupg_0.5.2.bb
new file mode 100644
index 0000000000..b69e2c465e
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-gnupg_0.5.2.bb
@@ -0,0 +1,14 @@
+SUMMARY = "A wrapper for the Gnu Privacy Guard (GPG or GnuPG)"
+SECTION = "devel/python"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=5dabe659eadd6d97325b1582e41cfc11"
+
+PYPI_PACKAGE = "python-gnupg"
+SRC_URI[sha256sum] = "01d8013931c9fa3f45824bbea7054c03d6e11f258a72e7e086e168dbcb91854c"
+
+inherit pypi python_setuptools_build_meta
+
+RDEPENDS:${PN} += " \
+ gnupg-gpg \
+ python3-logging \
+"
diff --git a/meta-python/recipes-devtools/python/python3-google-api-core_2.18.0.bb b/meta-python/recipes-devtools/python/python3-google-api-core_2.18.0.bb
new file mode 100644
index 0000000000..b4cbafa85d
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-google-api-core_2.18.0.bb
@@ -0,0 +1,25 @@
+DESCRIPTION = "Google API client core library"
+HOMEPAGE = "https://github.com/googleapis/python-api-core"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "62d97417bfc674d6cef251e5c4d639a9655e00c45528c4364fbfebb478ce72a9"
+
+RDEPENDS:${PN} += "\
+ python3-asyncio \
+ python3-datetime \
+ python3-logging \
+ python3-math \
+"
+
+RDEPENDS:${PN} += "\
+ python3-googleapis-common-protos \
+ python3-google-auth \
+ python3-grpcio \
+ python3-protobuf \
+ python3-pytz \
+ python3-requests \
+ python3-six \
+"
diff --git a/meta-python/recipes-devtools/python/python3-google-api-python-client_1.7.11.bb b/meta-python/recipes-devtools/python/python3-google-api-python-client_1.7.11.bb
deleted file mode 100644
index 25e3b9c3f8..0000000000
--- a/meta-python/recipes-devtools/python/python3-google-api-python-client_1.7.11.bb
+++ /dev/null
@@ -1,9 +0,0 @@
-SUMMARY = "The Google API Client for Python is a client library for accessing the Plus, Moderator, and many other Google APIs."
-HOMEPAGE = "https://github.com/googleapis/google-api-python-client"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=94023d14f6b58272fd885e4e3f2f08b3"
-
-SRC_URI[md5sum] = "6e28e8caf2e4d55ed5b7c48a538a61c9"
-SRC_URI[sha256sum] = "a8a88174f66d92aed7ebbd73744c2c319b4b1ce828e565f9ec721352d2e2fb8c"
-
-inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-google-api-python-client_2.125.0.bb b/meta-python/recipes-devtools/python/python3-google-api-python-client_2.125.0.bb
new file mode 100644
index 0000000000..8abe4699e8
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-google-api-python-client_2.125.0.bb
@@ -0,0 +1,20 @@
+SUMMARY = "The Google API Client for Python is a client library for accessing the Plus, \
+Moderator, and many other Google APIs."
+HOMEPAGE = "https://github.com/googleapis/google-api-python-client"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327"
+
+SRC_URI[sha256sum] = "51a0385cff65ec135106e8be60ee7112557396dde5f44113ae23912baddda143"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "\
+ python3-logging \
+ python3-six \
+ python3-json \
+ python3-core \
+ python3-netclient \
+ python3-httplib2 \
+ python3-uritemplate \
+ python3-google-api-core \
+"
diff --git a/meta-python/recipes-devtools/python/python3-google-auth-oauthlib/run-ptest b/meta-python/recipes-devtools/python/python3-google-auth-oauthlib/run-ptest
new file mode 100644
index 0000000000..f1c8729f0e
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-google-auth-oauthlib/run-ptest
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+pytest --automake
+
diff --git a/meta-python/recipes-devtools/python/python3-google-auth-oauthlib_1.2.0.bb b/meta-python/recipes-devtools/python/python3-google-auth-oauthlib_1.2.0.bb
new file mode 100644
index 0000000000..70e843a094
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-google-auth-oauthlib_1.2.0.bb
@@ -0,0 +1,31 @@
+SUMMARY = "Google Authentication Library"
+DESCRIPTION = "This library provides oauthlib integration with google-auth"
+HOMEPAGE = "https://github.com/googleapis/google-auth-library-python-oauthlib"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
+
+SRC_URI[sha256sum] = "292d2d3783349f2b0734a0a0207b1e1e322ac193c2c09d8f7c613fb7cc501ea8"
+
+inherit pypi setuptools3 ptest
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-click \
+ python3-mock \
+ python3-pytest \
+ python3-unittest-automake-output \
+ python3-unixadmin \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+RDEPENDS:${PN} += " \
+ python3-google-auth \
+ python3-requests-oauthlib \
+"
diff --git a/meta-python/recipes-devtools/python/python3-google-auth/run-ptest b/meta-python/recipes-devtools/python/python3-google-auth/run-ptest
new file mode 100644
index 0000000000..f1c8729f0e
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-google-auth/run-ptest
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+pytest --automake
+
diff --git a/meta-python/recipes-devtools/python/python3-google-auth_2.29.0.bb b/meta-python/recipes-devtools/python/python3-google-auth_2.29.0.bb
new file mode 100644
index 0000000000..e8d438df02
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-google-auth_2.29.0.bb
@@ -0,0 +1,41 @@
+DESCRIPTION = "Google Authentication Library"
+HOMEPAGE = "https://github.com/googleapis/google-auth-library-python"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327"
+
+inherit pypi setuptools3 ptest
+
+SRC_URI[sha256sum] = "672dff332d073227550ffc7457868ac4218d6c500b155fe6cc17d2b13602c360"
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-cryptography \
+ python3-flask \
+ python3-freezegun \
+ python3-grpcio \
+ python3-mock \
+ python3-oauth2client \
+ python3-pyopenssl \
+ python3-pytest \
+ python3-pytest-localserver \
+ python3-pyu2f \
+ python3-requests \
+ python3-responses \
+ python3-unittest-automake-output \
+ python3-unixadmin \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+RDEPENDS:${PN} += "\
+ python3-cachetools \
+ python3-json \
+ python3-pyasn1-modules \
+ python3-rsa \
+"
diff --git a/meta-python/recipes-devtools/python/python3-googleapis-common-protos_1.63.0.bb b/meta-python/recipes-devtools/python/python3-googleapis-common-protos_1.63.0.bb
new file mode 100644
index 0000000000..aee2337267
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-googleapis-common-protos_1.63.0.bb
@@ -0,0 +1,13 @@
+DESCRIPTION = "Common protobufs used in Google APIs"
+HOMEPAGE = "https://github.com/googleapis/python-api-common-protos"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "17ad01b11d5f1d0171c06d3ba5c04c54474e883b66b949722b4938ee2694ef4e"
+
+RDEPENDS:${PN} += "\
+ python3-grpcio \
+ python3-protobuf \
+"
diff --git a/meta-python/recipes-devtools/python/python3-gpiod/run-ptest b/meta-python/recipes-devtools/python/python3-gpiod/run-ptest
new file mode 100644
index 0000000000..bf1244b07c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-gpiod/run-ptest
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+cd $(dirname "$(readlink -f "$0")")
+
+# python3-gpiod uses gpio-sim - a configfs-based testing module. We need to
+# make sure configfs is mounted before running any tests.
+modprobe configfs
+mountpoint /sys/kernel/config > /dev/null || mount -t configfs configfs /sys/kernel/config
+
+python3 -m gpiod-test -v > ./python3-gpiod.out 2>&1
+if [ $? -ne 0 ]; then
+ echo "FAIL: python3-gpiod"
+else
+ echo "PASS: python3-gpiod"
+fi
diff --git a/meta-python/recipes-devtools/python/python3-gpiod_2.1.3.bb b/meta-python/recipes-devtools/python/python3-gpiod_2.1.3.bb
new file mode 100644
index 0000000000..d8c8628daa
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-gpiod_2.1.3.bb
@@ -0,0 +1,46 @@
+SUMMARY = "Python bindings for libgpiod."
+
+LICENSE = "GPL-2.0-or-later & LGPL-2.1-or-later & CC-BY-SA-4.0"
+# The actual license files live in the upstream libgpiod from which the pypi
+# package is spun out.
+LIC_FILES_CHKSUM = "file://setup.py;beginline=237;endline=237;md5=f5ddb56912b7f20bf94aa4d1bdcd3533"
+
+SRC_URI += "file://run-ptest"
+
+SRC_URI[sha256sum] = "a33193d6cab79d252329f71666a35a3668e04f1f82bf9b93ee2c9ae852398b20"
+
+inherit setuptools3-base python_pep517 ptest pypi
+
+DEPENDS += " \
+ libgpiod \
+ python3-setuptools-native \
+"
+RDEPENDS:${PN} += " \
+ libgpiod (>= 2.1) \
+ python3-datetime \
+ python3-profile \
+"
+RDEPENDS:${PN}-ptest += " \
+ libgpiod-ptest \
+ python3-setuptools \
+"
+RRECOMMENDS:${PN}-ptest += "kernel-module-configfs"
+
+export LINK_SYSTEM_LIBGPIOD = "1"
+
+do_compile_ptest() {
+ setup_target_config
+ nativepython3 build_tests.py
+}
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/gpiod-test/gpiosim
+ install -d ${D}${PTEST_PATH}/gpiod-test/procname
+ install -m 0644 ${S}/tests/*.py ${D}${PTEST_PATH}/gpiod-test/
+ install -m 0644 ${B}/tests/gpiosim/_ext* ${D}${PTEST_PATH}/gpiod-test/gpiosim
+ install -m 0644 ${S}/tests/gpiosim/*.py ${D}${PTEST_PATH}/gpiod-test/gpiosim
+ install -m 0644 ${B}/tests/procname/_ext* ${D}${PTEST_PATH}/gpiod-test/procname
+ install -m 0644 ${S}/tests/procname/*.py ${D}${PTEST_PATH}/gpiod-test/procname
+}
+
+INSANE_SKIP:${PN}-ptest += "buildpaths"
diff --git a/meta-python/recipes-devtools/python/python3-gpsd-py3_0.3.0.bb b/meta-python/recipes-devtools/python/python3-gpsd-py3_0.3.0.bb
new file mode 100644
index 0000000000..50c1ebd153
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-gpsd-py3_0.3.0.bb
@@ -0,0 +1,16 @@
+DESCRIPTION = "This is a library for polling gpsd in Python3"
+HOMEPAGE = "https://github.com/MartijnBraam/gpsd-py3"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://setup.py;beginline=10;endline=10;md5=c2d9994c57f0444e39f1dab19af50254"
+SRC_URI[md5sum] = "041ce56e8879e2104b4d54c8119cd529"
+SRC_URI[sha256sum] = "2908d3bd78dfb6720ecfe22f97e139b5a4a198f38df3a77215cf644a33513192"
+
+PYPI_PACKAGE = "gpsd-py3"
+
+inherit pypi setuptools3
+
+CLEANBROKEN = "1"
+
+RDEPENDS:${PN} += " \
+ python3 \
+"
diff --git a/meta-python/recipes-devtools/python/python3-graphviz_0.20.3.bb b/meta-python/recipes-devtools/python/python3-graphviz_0.20.3.bb
new file mode 100644
index 0000000000..0fd81b0ee6
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-graphviz_0.20.3.bb
@@ -0,0 +1,16 @@
+DESCRIPTION = "Graphviz protocol implementation"
+HOMEPAGE = "https://graphviz.readthedocs.io/en/stable/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=bcdc1cf20245c598f9a563b550605785"
+
+SRC_URI[sha256sum] = "09d6bc81e6a9fa392e7ba52135a9d49f1ed62526f96499325930e87ca1b5925d"
+
+inherit pypi setuptools3
+
+PYPI_PACKAGE_EXT = "zip"
+
+RDEPENDS:${PN} += " \
+ python3-logging \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-greenlet_0.4.15.bb b/meta-python/recipes-devtools/python/python3-greenlet_0.4.15.bb
deleted file mode 100644
index 1aedf7fa8d..0000000000
--- a/meta-python/recipes-devtools/python/python3-greenlet_0.4.15.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit distutils3
-require python-greenlet.inc
diff --git a/meta-python/recipes-devtools/python/python3-greenlet_3.0.3.bb b/meta-python/recipes-devtools/python/python3-greenlet_3.0.3.bb
new file mode 100644
index 0000000000..abd6c49caf
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-greenlet_3.0.3.bb
@@ -0,0 +1,9 @@
+SUMMARY = "Python lightweight in-process concurrent programming"
+HOMEPAGE = "https://greenlet.readthedocs.io/en/latest/"
+LICENSE = "MIT & PSF-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e95668d68e4329085c7ab3535e6a7aee \
+ file://LICENSE.PSF;md5=c106931d9429eda0492617f037b8f69a"
+
+SRC_URI[sha256sum] = "43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"
+
+inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-greenstalk_2.0.2.bb b/meta-python/recipes-devtools/python/python3-greenstalk_2.0.2.bb
new file mode 100644
index 0000000000..33eb62d5d9
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-greenstalk_2.0.2.bb
@@ -0,0 +1,10 @@
+SUMMARY = "A Python 3 client for the beanstalkd work queue"
+HOMEPAGE = "https://github.com/mayhewj/greenstalk"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=8f98432ba1fce3933c556430fd47298f"
+
+SRC_URI[sha256sum] = "3ebde5fc9ecf986f96f6779fd6d15a53f33d432c52a2e28012e100a99ee154a4"
+
+RDEPENDS:${PN} += "python3-io python3-core"
+
+inherit pypi python_setuptools_build_meta
diff --git a/meta-python/recipes-devtools/python/python3-grpcio-tools/0001-protobuf-Disable-musttail-attribute-on-mips.patch b/meta-python/recipes-devtools/python/python3-grpcio-tools/0001-protobuf-Disable-musttail-attribute-on-mips.patch
new file mode 100644
index 0000000000..67505d0ce1
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-grpcio-tools/0001-protobuf-Disable-musttail-attribute-on-mips.patch
@@ -0,0 +1,24 @@
+From 64d737318656286f69ddc5ad654072785ddcbbed Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Fri, 16 Sep 2022 19:09:15 -0700
+Subject: [PATCH] protobuf: Disable musttail attribute on mips
+
+See https://github.com/llvm/llvm-project/issues/57795
+
+Upstream-Status: Pending
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+Signed-off-by: Wang Mingyu <wangmy@fujitsu.com>
+---
+ third_party/protobuf/src/google/protobuf/port_def.inc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/third_party/protobuf/src/google/protobuf/port_def.inc
++++ b/third_party/protobuf/src/google/protobuf/port_def.inc
+@@ -298,6 +298,7 @@
+ #error PROTOBUF_TAILCALL was previously defined
+ #endif
+ #if ABSL_HAVE_CPP_ATTRIBUTE(clang::musttail) && !defined(__arm__) && \
++ !defined(__mips__) && \
+ !defined(_ARCH_PPC) && !defined(__wasm__) && \
+ !(defined(_MSC_VER) && defined(_M_IX86)) && !defined(__i386__)
+ // Compilation fails on ARM32: b/195943306
diff --git a/meta-python/recipes-devtools/python/python3-grpcio-tools/0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch b/meta-python/recipes-devtools/python/python3-grpcio-tools/0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch
new file mode 100644
index 0000000000..07276c17f6
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-grpcio-tools/0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch
@@ -0,0 +1,59 @@
+From 9b2f1d400db8b8d0045f5a58a748a2dc52b5c9ef Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Wed, 17 Feb 2021 13:38:55 -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>
+---
+ setup.py | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+diff --git a/setup.py b/setup.py
+index cc53e79..be3bc78 100644
+--- a/setup.py
++++ b/setup.py
+@@ -88,9 +88,11 @@
+ b"#include <atomic>\n"
+ + b"int main() { return std::atomic<int64_t>{}; }"
+ )
+- cxx = os.environ.get("CXX", "c++")
+- cpp_test = subprocess.Popen(
+- [cxx, "-x", "c++", "-std=c++14", "-"],
++ cxx, cxx_args = os.environ.get('CXX').split(' ', 1) or 'c++'
++ if not cxx_args:
++ cxx_args = "-g"
++
++ cpp_test = subprocess.Popen([cxx, cxx_args, '-x', 'c++', '-std=c++14', '-'],
+ stdin=PIPE,
+ stdout=PIPE,
+ stderr=PIPE,
+@@ -101,7 +103,7 @@
+ # Double-check to see if -latomic actually can solve the problem.
+ # https://github.com/grpc/grpc/issues/22491
+ cpp_test = subprocess.Popen(
+- [cxx, "-x", "c++", "-std=c++14", "-", "-latomic"],
++ [cxx, cxx_args, '-x', 'c++', '-std=c++14', '-', '-latomic'],
+ stdin=PIPE,
+ stdout=PIPE,
+ stderr=PIPE,
+--
+2.25.1
+
diff --git a/meta-python/recipes-devtools/python/python3-grpcio-tools_1.14.1.bb b/meta-python/recipes-devtools/python/python3-grpcio-tools_1.14.1.bb
deleted file mode 100644
index 2da1a4df03..0000000000
--- a/meta-python/recipes-devtools/python/python3-grpcio-tools_1.14.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-grpcio-tools.inc
diff --git a/meta-python/recipes-devtools/python/python3-grpcio-tools_1.62.1.bb b/meta-python/recipes-devtools/python/python3-grpcio-tools_1.62.1.bb
new file mode 100644
index 0000000000..ffa2f843c7
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-grpcio-tools_1.62.1.bb
@@ -0,0 +1,19 @@
+DESCRIPTION = "Google gRPC tools"
+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 += "file://0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch \
+ file://0001-protobuf-Disable-musttail-attribute-on-mips.patch \
+ "
+SRC_URI[sha256sum] = "a4991e5ee8a97ab791296d3bf7e8700b1445635cc1828cc98df945ca1802d7f2"
+
+RDEPENDS:${PN} = "python3-grpcio"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-grpcio/0001-Include-missing-cstdint-header.patch b/meta-python/recipes-devtools/python/python3-grpcio/0001-Include-missing-cstdint-header.patch
new file mode 100644
index 0000000000..5cd94dee9c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-grpcio/0001-Include-missing-cstdint-header.patch
@@ -0,0 +1,30 @@
+From 252aa78526287fe033c5656cd166e551fa5daa88 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Mon, 30 Jan 2023 10:31:10 -0800
+Subject: [PATCH] Include missing <cstdint> header
+
+gcc 13 moved some includes around and as a result <cstdint> is
+no longer transitively included [1]. Explicitly include it for
+int32_t.
+
+[1] https://gcc.gnu.org/gcc-13/porting_to.html#header-dep-changes
+
+Upstream-Status: Submitted [https://code-review.googlesource.com/c/re2/+/60970]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+
+---
+ third_party/re2/util/pcre.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/third_party/re2/util/pcre.h b/third_party/re2/util/pcre.h
+index 896b0bd..271a005 100644
+--- a/third_party/re2/util/pcre.h
++++ b/third_party/re2/util/pcre.h
+@@ -163,6 +163,7 @@
+
+ #include "util/util.h"
+ #include "re2/stringpiece.h"
++#include <cstdint>
+
+ #ifdef USEPCRE
+ #include <pcre.h>
diff --git a/meta-python/recipes-devtools/python/python3-grpcio/0001-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_1.19.0.bb b/meta-python/recipes-devtools/python/python3-grpcio_1.19.0.bb
deleted file mode 100644
index d4720b4b80..0000000000
--- a/meta-python/recipes-devtools/python/python3-grpcio_1.19.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-grpcio.inc
diff --git a/meta-python/recipes-devtools/python/python3-grpcio_1.62.1.bb b/meta-python/recipes-devtools/python/python3-grpcio_1.62.1.bb
new file mode 100644
index 0000000000..8405ebed02
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-grpcio_1.62.1.bb
@@ -0,0 +1,45 @@
+DESCRIPTION = "Google gRPC"
+HOMEPAGE = "http://www.grpc.io/"
+SECTION = "devel/python"
+LICENSE = "Apache-2.0 & BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=731e401b36f8077ae0c134b59be5c906"
+
+DEPENDS += "python3-protobuf"
+
+SRC_URI += "file://0001-Include-missing-cstdint-header.patch \
+ file://abseil-ppc-fixes.patch \
+ file://0001-zlib-Include-unistd.h-for-open-close-C-APIs.patch \
+ "
+SRC_URI[sha256sum] = "6c455e008fa86d9e9a9d85bb76da4277c0d7d9668a3bfa70dbe86e9f3c759947"
+
+RDEPENDS:${PN} = "python3-protobuf"
+
+inherit setuptools3
+inherit pypi
+
+CFLAGS:append:libc-musl = " -D_LARGEFILE64_SOURCE"
+
+export GRPC_PYTHON_DISABLE_LIBC_COMPATIBILITY = "1"
+
+BORING_SSL_PLATFORM:arm = "linux-arm"
+BORING_SSL_PLATFORM:x86-64 = "linux-x86_64"
+BORING_SSL_PLATFORM:aarch64 = "linux-aarch64"
+BORING_SSL_PLATFORM ?= "unsupported"
+export GRPC_BORING_SSL_PLATFORM = "${BORING_SSL_PLATFORM}"
+export GRPC_BUILD_OVERRIDE_BORING_SSL_ASM_PLATFORM = "${BORING_SSL_PLATFORM}"
+
+BORING_SSL:arm = "1"
+BORING_SSL:x86-64 = "1"
+BORING_SSL:aarch64 = "1"
+BORING_SSL ?= "0"
+export GRPC_BUILD_WITH_BORING_SSL_ASM = "${BORING_SSL}"
+
+GRPC_CFLAGS ?= ""
+GRPC_CFLAGS:append:toolchain-clang = " -fvisibility=hidden -fno-wrapv -fno-exceptions"
+export GRPC_PYTHON_CFLAGS = "${GRPC_CFLAGS}"
+
+CLEANBROKEN = "1"
+
+BBCLASSEXTEND = "native nativesdk"
+
+CCACHE_DISABLE = "1"
diff --git a/meta-python/recipes-devtools/python/python3-gunicorn/run-ptest b/meta-python/recipes-devtools/python/python3-gunicorn/run-ptest
new file mode 100644
index 0000000000..5ca7e26e8a
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-gunicorn/run-ptest
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+# there needs to be something in /etc/resolv.conf for the gunicorn
+# ptests to work, so make sure there's at least one nameserver line
+echo "nameserver 8.8.8.8" >> /etc/resolv.conf
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-gunicorn_21.2.0.bb b/meta-python/recipes-devtools/python/python3-gunicorn_21.2.0.bb
new file mode 100644
index 0000000000..9fd601c999
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-gunicorn_21.2.0.bb
@@ -0,0 +1,26 @@
+SUMMARY = "WSGI HTTP Server for UNIX"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=302423eeae97079c633da81b6a5fe35e"
+
+SRC_URI[sha256sum] = "88ec8bff1d634f98e61b9f65bc4bf3cd918a90806c6f5c48bc5603849ec81033"
+
+inherit pypi setuptools3 ptest
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-eventlet \
+ python3-gevent \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+RDEPENDS:${PN} += "python3-setuptools python3-fcntl"
diff --git a/meta-python/recipes-devtools/python/python3-h11_0.14.0.bb b/meta-python/recipes-devtools/python/python3-h11_0.14.0.bb
new file mode 100644
index 0000000000..2bddefa3f0
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-h11_0.14.0.bb
@@ -0,0 +1,10 @@
+SUMMARY = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
+HOMEPAGE = "https://github.com/python-hyper/h11"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=f5501d19c3116f4aaeef89369f458693"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"
+
+RDEPENDS:${PN} += "python3-profile"
diff --git a/meta-python/recipes-devtools/python/python3-h5py/0001-Fix-Cython-3-compatibility.patch b/meta-python/recipes-devtools/python/python3-h5py/0001-Fix-Cython-3-compatibility.patch
new file mode 100644
index 0000000000..aba62ddf14
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-h5py/0001-Fix-Cython-3-compatibility.patch
@@ -0,0 +1,796 @@
+From 1e02dbe5533d679b9ef064078a303607a7d0542a Mon Sep 17 00:00:00 2001
+From: Alexander Kanavin <alex@linutronix.de>
+Date: Fri, 29 Dec 2023 14:33:38 +0100
+Subject: [PATCH] Fix Cython 3 compatibility
+
+Upstream-Status: Backport [https://github.com/h5py/h5py/pull/2345/commits]
+Signed-off-by: Alexander Kanavin <alex@linutronix.de>
+---
+ benchmarks/benchmark_slicing.py | 12 ++++----
+ docs/conf.py | 2 +-
+ docs/high/dataset.rst | 4 +--
+ docs/high/file.rst | 6 ++--
+ docs/requirements-rtd.txt | 5 ++--
+ docs/vds.rst | 2 +-
+ docs/whatsnew/3.0.rst | 2 +-
+ docs/whatsnew/3.7.rst | 4 +--
+ h5py/_errors.pxd | 10 +++----
+ h5py/_errors.pyx | 4 +--
+ h5py/_hl/base.py | 4 +--
+ h5py/_hl/dataset.py | 8 ++---
+ h5py/_hl/dims.py | 3 +-
+ h5py/_hl/files.py | 2 +-
+ h5py/_locks.pxi | 6 ++--
+ h5py/_proxy.pyx | 4 +--
+ h5py/_selector.pyx | 2 +-
+ h5py/api_compat.h | 13 ++++----
+ h5py/api_types_hdf5.pxd | 48 +++++++++++++++---------------
+ h5py/h5fd.pyx | 38 ++++++++++++++++-------
+ h5py/h5p.pyx | 4 +--
+ h5py/h5t.pyx | 2 +-
+ h5py/tests/test_attrs_data.py | 2 +-
+ h5py/tests/test_big_endian_file.py | 4 +--
+ h5py/tests/test_dataset.py | 4 +--
+ h5py/tests/test_file.py | 6 ++--
+ h5py/tests/test_file_alignment.py | 4 +--
+ h5py/tests/test_group.py | 4 +--
+ h5py/tests/test_selections.py | 2 +-
+ pylintrc | 2 +-
+ pyproject.toml | 2 +-
+ setup_configure.py | 2 +-
+ tox.ini | 2 +-
+ 33 files changed, 116 insertions(+), 103 deletions(-)
+
+diff --git a/benchmarks/benchmark_slicing.py b/benchmarks/benchmark_slicing.py
+index e9a34dad..b833f012 100644
+--- a/benchmarks/benchmark_slicing.py
++++ b/benchmarks/benchmark_slicing.py
+@@ -7,7 +7,7 @@ import logging
+ logger = logging.getLogger(__name__)
+ import h5py
+
+-#Needed for mutithreading:
++#Needed for multithreading:
+ from queue import Queue
+ from threading import Thread, Event
+ import multiprocessing
+@@ -173,8 +173,8 @@ class SlicingBenchmark:
+
+ if __name__ == "__main__":
+ logging.basicConfig(level=logging.INFO)
+- benckmark = SlicingBenchmark()
+- benckmark.setup()
+- benckmark.time_sequential_reads()
+- benckmark.time_threaded_reads()
+- benckmark.teardown()
++ benchmark = SlicingBenchmark()
++ benchmark.setup()
++ benchmark.time_sequential_reads()
++ benchmark.time_threaded_reads()
++ benchmark.teardown()
+diff --git a/docs/conf.py b/docs/conf.py
+index 93b23939..a0f6c1ac 100644
+--- a/docs/conf.py
++++ b/docs/conf.py
+@@ -109,7 +109,7 @@ pygments_style = 'sphinx'
+
+ # The theme to use for HTML and HTML Help pages. See the documentation for
+ # a list of builtin themes.
+-html_theme = 'default'
++html_theme = 'sphinx_rtd_theme'
+
+ # Theme options are theme-specific and customize the look and feel of a theme
+ # further. For a list of options available for each theme, see the
+diff --git a/docs/high/dataset.rst b/docs/high/dataset.rst
+index 0f27284f..cb75fffe 100644
+--- a/docs/high/dataset.rst
++++ b/docs/high/dataset.rst
+@@ -58,7 +58,7 @@ the requested ``dtype``.
+ Reading & writing data
+ ----------------------
+
+-HDF5 datasets re-use the NumPy slicing syntax to read and write to the file.
++HDF5 datasets reuse the NumPy slicing syntax to read and write to the file.
+ Slice specifications are translated directly to HDF5 "hyperslab"
+ selections, and are a fast and efficient way to access data in the file. The
+ following slicing arguments are recognized:
+@@ -464,7 +464,7 @@ Reference
+ >>> dset = f["MyDS"]
+ >>> f.close()
+ >>> if dset:
+- ... print("datset accessible")
++ ... print("dataset accessible")
+ ... else:
+ ... print("dataset inaccessible")
+ dataset inaccessible
+diff --git a/docs/high/file.rst b/docs/high/file.rst
+index 484498ce..e757fe1a 100644
+--- a/docs/high/file.rst
++++ b/docs/high/file.rst
+@@ -392,7 +392,7 @@ Data alignment
+ When creating datasets within files, it may be advantageous to align the offset
+ within the file itself. This can help optimize read and write times if the data
+ become aligned with the underlying hardware, or may help with parallelism with
+-MPI. Unfortunately, aligning small variables to large blocks can leave alot of
++MPI. Unfortunately, aligning small variables to large blocks can leave a lot of
+ empty space in a file. To this effect, application developers are left with two
+ options to tune the alignment of data within their file. The two variables
+ ``alignment_threshold`` and ``alignment_interval`` in the :class:`File`
+@@ -415,7 +415,7 @@ number of regions. Setting a small value can reduce the overall file size,
+ especially in combination with the ``libver`` option. This controls how the
+ overall data and metadata are laid out within the file.
+
+-For more information, see the offical HDF5 documentation `H5P_SET_META_BLOCK_SIZE
++For more information, see the official HDF5 documentation `H5P_SET_META_BLOCK_SIZE
+ <https://portal.hdfgroup.org/display/HDF5/H5P_SET_META_BLOCK_SIZE>`_.
+
+ Reference
+@@ -497,7 +497,7 @@ Reference
+ Only available with HDF5 >= 1.12.1 or 1.10.x >= 1.10.7.
+ :param alignment_threshold: Together with ``alignment_interval``, this
+ property ensures that any file object greater than or equal
+- in size to the alignement threshold (in bytes) will be
++ in size to the alignment threshold (in bytes) will be
+ aligned on an address which is a multiple of alignment interval.
+ :param alignment_interval: This property should be used in conjunction with
+ ``alignment_threshold``. See the description above. For more
+diff --git a/docs/requirements-rtd.txt b/docs/requirements-rtd.txt
+index e67a3eee..52096927 100644
+--- a/docs/requirements-rtd.txt
++++ b/docs/requirements-rtd.txt
+@@ -1,3 +1,2 @@
+-sphinx==4.3.0
+-sphinx_rtd_theme==1.0.0
+-readthedocs-sphinx-search==0.1.1
++sphinx==7.2.6
++sphinx_rtd_theme==1.3.0
+diff --git a/docs/vds.rst b/docs/vds.rst
+index a9a7c7f6..bd47ad1c 100644
+--- a/docs/vds.rst
++++ b/docs/vds.rst
+@@ -124,7 +124,7 @@ Reference
+ slice it to indicate which regions should be used in the virtual dataset.
+
+ When `creating a virtual dataset <creating_vds_>`_, paths to sources present
+- in the same file are changed to a ".", refering to the current file (see
++ in the same file are changed to a ".", referring to the current file (see
+ `H5Pset_virtual <https://portal.hdfgroup.org/display/HDF5/H5P_SET_VIRTUAL>`_).
+ This will keep such sources valid in case the file is renamed.
+
+diff --git a/docs/whatsnew/3.0.rst b/docs/whatsnew/3.0.rst
+index db30ad66..ff3c2bef 100644
+--- a/docs/whatsnew/3.0.rst
++++ b/docs/whatsnew/3.0.rst
+@@ -44,7 +44,7 @@ New features
+ See also the deprecation related to the ``external`` argument.
+ * Support for setting file space strategy at file creation. Includes option to
+ persist empty space tracking between sessions. See :class:`.File` for details.
+-* More efficient writing when assiging a scalar to a chunked dataset, when the
++* More efficient writing when assigning a scalar to a chunked dataset, when the
+ number of elements to write is no more than the size of one chunk.
+ * Introduced support for the split :ref:`file driver <file_driver>`
+ (:pr:`1468`).
+diff --git a/docs/whatsnew/3.7.rst b/docs/whatsnew/3.7.rst
+index 27790254..2e822d68 100644
+--- a/docs/whatsnew/3.7.rst
++++ b/docs/whatsnew/3.7.rst
+@@ -19,7 +19,7 @@ New features
+ include it. Alternatively, you can :ref:`build h5py from source <source_install>`
+ against an HDF5 build with the direct driver enabled.
+ * The :class:`.File` constructor contains two new parameters ``alignment_threshold``,
+- and ``alignment_interval`` controling the data alignment within the HDF5
++ and ``alignment_interval`` controlling the data alignment within the HDF5
+ file (:pr:`2040`).
+ * :meth:`~.Group.create_dataset` and :meth:`~.Group.require_dataset` now accept
+ parameters ``efile_prefix`` and ``virtual_prefix`` to set a filesystem path
+@@ -40,7 +40,7 @@ Bug fixes
+ attributes with ``track_order=True``.
+ * Fix for building with mpi4py on Python 3.10 (:pr:`2101`).
+ * Fixed fancy indexing with a boolean array for a single dimension (:pr:`2079`).
+-* Avoid returning unitialised memory when reading from a chunked dataset with
++* Avoid returning uninitialised memory when reading from a chunked dataset with
+ missing chunks and no fill value (:pr:`2076`).
+ * Enable setting of fillvalue for datasets with variable length string dtype
+ (:pr:`2044`).
+diff --git a/h5py/_errors.pxd b/h5py/_errors.pxd
+index df9c1bbe..3cba6307 100644
+--- a/h5py/_errors.pxd
++++ b/h5py/_errors.pxd
+@@ -23,7 +23,7 @@ cdef extern from "hdf5.h":
+ H5E_ARGS, # invalid arguments to routine
+ H5E_RESOURCE, # resource unavailable
+ H5E_INTERNAL, # Internal error (too specific to document)
+- H5E_FILE, # file Accessability
++ H5E_FILE, # file Accessibility
+ H5E_IO, # Low-level I/O
+ H5E_FUNC, # function Entry/Exit
+ H5E_ATOM, # object Atom
+@@ -121,7 +121,7 @@ cdef extern from "hdf5.h":
+ # No error
+ H5E_NONE_MINOR # No error
+
+- # File accessability errors
++ # File accessibility errors
+ H5E_FILEEXISTS # File already exists
+ H5E_FILEOPEN # File already open
+ H5E_CANTCREATE # Unable to create file
+@@ -207,7 +207,7 @@ cdef extern from "hdf5.h":
+ H5E_ARGS, # invalid arguments to routine
+ H5E_RESOURCE, # resource unavailable
+ H5E_INTERNAL, # Internal error (too specific to document)
+- H5E_FILE, # file Accessability
++ H5E_FILE, # file Accessibility
+ H5E_IO, # Low-level I/O
+ H5E_FUNC, # function Entry/Exit
+ H5E_ID, # object ID
+@@ -305,7 +305,7 @@ cdef extern from "hdf5.h":
+ # No error
+ H5E_NONE_MINOR # No error
+
+- # File accessability errors
++ # File accessibility errors
+ H5E_FILEEXISTS # File already exists
+ H5E_FILEOPEN # File already open
+ H5E_CANTCREATE # Unable to create file
+@@ -425,4 +425,4 @@ ctypedef struct err_cookie:
+ cdef err_cookie set_error_handler(err_cookie handler)
+
+ # Set the default error handler set by silence_errors/unsilence_errors
+-cdef void set_default_error_handler() nogil
++cdef void set_default_error_handler() noexcept nogil
+diff --git a/h5py/_errors.pyx b/h5py/_errors.pyx
+index c3bd184e..2a7524b2 100644
+--- a/h5py/_errors.pyx
++++ b/h5py/_errors.pyx
+@@ -94,7 +94,7 @@ cdef struct err_data_t:
+ H5E_error_t err
+ int n
+
+-cdef herr_t walk_cb(unsigned int n, const H5E_error_t *desc, void *e) nogil noexcept:
++cdef herr_t walk_cb(unsigned int n, const H5E_error_t *desc, void *e) noexcept nogil:
+
+ cdef err_data_t *ee = <err_data_t*>e
+
+@@ -168,7 +168,7 @@ cdef err_cookie _error_handler # Store error handler used by h5py
+ _error_handler.func = NULL
+ _error_handler.data = NULL
+
+-cdef void set_default_error_handler() nogil:
++cdef void set_default_error_handler() noexcept nogil:
+ """Set h5py's current default error handler"""
+ H5Eset_auto(<hid_t>H5E_DEFAULT, _error_handler.func, _error_handler.data)
+
+diff --git a/h5py/_hl/base.py b/h5py/_hl/base.py
+index cad37053..9d261c90 100644
+--- a/h5py/_hl/base.py
++++ b/h5py/_hl/base.py
+@@ -20,7 +20,7 @@ import posixpath
+ import numpy as np
+
+ # The high-level interface is serialized; every public API function & method
+-# is wrapped in a lock. We re-use the low-level lock because (1) it's fast,
++# is wrapped in a lock. We reuse the low-level lock because (1) it's fast,
+ # and (2) it eliminates the possibility of deadlocks due to out-of-order
+ # lock acquisition.
+ from .._objects import phil, with_phil
+@@ -524,7 +524,7 @@ def product(nums):
+ # Daniel Greenfeld, BSD license), where it is attributed to bottle (Copyright
+ # (c) 2009-2022, Marcel Hellkamp, MIT license).
+
+-class cached_property(object):
++class cached_property:
+ def __init__(self, func):
+ self.__doc__ = getattr(func, "__doc__")
+ self.func = func
+diff --git a/h5py/_hl/dataset.py b/h5py/_hl/dataset.py
+index b69aba48..77b202d2 100644
+--- a/h5py/_hl/dataset.py
++++ b/h5py/_hl/dataset.py
+@@ -334,10 +334,10 @@ class ChunkIterator:
+ self._layout = dset.chunks
+ if source_sel is None:
+ # select over entire dataset
+- slices = []
+- for dim in range(rank):
+- slices.append(slice(0, self._shape[dim]))
+- self._sel = tuple(slices)
++ self._sel = tuple(
++ slice(0, self._shape[dim])
++ for dim in range(rank)
++ )
+ else:
+ if isinstance(source_sel, slice):
+ self._sel = (source_sel,)
+diff --git a/h5py/_hl/dims.py b/h5py/_hl/dims.py
+index d3c9206b..0cf4c9f3 100644
+--- a/h5py/_hl/dims.py
++++ b/h5py/_hl/dims.py
+@@ -53,8 +53,7 @@ class DimensionProxy(base.CommonStateObject):
+
+ @with_phil
+ def __iter__(self):
+- for k in self.keys():
+- yield k
++ yield from self.keys()
+
+ @with_phil
+ def __len__(self):
+diff --git a/h5py/_hl/files.py b/h5py/_hl/files.py
+index aa4fb78d..bfcf3098 100644
+--- a/h5py/_hl/files.py
++++ b/h5py/_hl/files.py
+@@ -480,7 +480,7 @@ class File(Group):
+
+ alignment_threshold
+ Together with ``alignment_interval``, this property ensures that
+- any file object greater than or equal in size to the alignement
++ any file object greater than or equal in size to the alignment
+ threshold (in bytes) will be aligned on an address which is a
+ multiple of alignment interval.
+
+diff --git a/h5py/_locks.pxi b/h5py/_locks.pxi
+index bc8b2dd9..1ec4e2fc 100644
+--- a/h5py/_locks.pxi
++++ b/h5py/_locks.pxi
+@@ -63,7 +63,7 @@ cdef class FastRLock:
+ return self._owner == pythread.PyThread_get_thread_ident()
+
+
+-cdef inline bint lock_lock(FastRLock lock, long current_thread, bint blocking) nogil:
++cdef inline bint lock_lock(FastRLock lock, long current_thread, bint blocking) noexcept nogil:
+ # Note that this function *must* hold the GIL when being called.
+ # We just use 'nogil' in the signature to make sure that no Python
+ # code execution slips in that might free the GIL
+@@ -83,7 +83,7 @@ cdef inline bint lock_lock(FastRLock lock, long current_thread, bint blocking) n
+ lock, current_thread,
+ pythread.WAIT_LOCK if blocking else pythread.NOWAIT_LOCK)
+
+-cdef bint _acquire_lock(FastRLock lock, long current_thread, int wait) nogil:
++cdef bint _acquire_lock(FastRLock lock, long current_thread, int wait) noexcept nogil:
+ # Note that this function *must* hold the GIL when being called.
+ # We just use 'nogil' in the signature to make sure that no Python
+ # code execution slips in that might free the GIL
+@@ -111,7 +111,7 @@ cdef bint _acquire_lock(FastRLock lock, long current_thread, int wait) nogil:
+ lock._count = 1
+ return 1
+
+-cdef inline void unlock_lock(FastRLock lock) nogil:
++cdef inline void unlock_lock(FastRLock lock) noexcept nogil:
+ # Note that this function *must* hold the GIL when being called.
+ # We just use 'nogil' in the signature to make sure that no Python
+ # code execution slips in that might free the GIL
+diff --git a/h5py/_proxy.pyx b/h5py/_proxy.pyx
+index 46b4fe0d..e40504f5 100644
+--- a/h5py/_proxy.pyx
++++ b/h5py/_proxy.pyx
+@@ -241,7 +241,7 @@ ctypedef struct h5py_scatter_t:
+ void* buf
+
+ cdef herr_t h5py_scatter_cb(void* elem, hid_t type_id, unsigned ndim,
+- const hsize_t *point, void *operator_data) nogil except -1:
++ const hsize_t *point, void *operator_data) except -1 nogil:
+ cdef h5py_scatter_t* info = <h5py_scatter_t*>operator_data
+
+ memcpy(elem, (<char*>info[0].buf)+((info[0].i)*(info[0].elsize)),
+@@ -252,7 +252,7 @@ cdef herr_t h5py_scatter_cb(void* elem, hid_t type_id, unsigned ndim,
+ return 0
+
+ cdef herr_t h5py_gather_cb(void* elem, hid_t type_id, unsigned ndim,
+- const hsize_t *point, void *operator_data) nogil except -1:
++ const hsize_t *point, void *operator_data) except -1 nogil:
+ cdef h5py_scatter_t* info = <h5py_scatter_t*>operator_data
+
+ memcpy((<char*>info[0].buf)+((info[0].i)*(info[0].elsize)), elem,
+diff --git a/h5py/_selector.pyx b/h5py/_selector.pyx
+index 8b858c82..69970176 100644
+--- a/h5py/_selector.pyx
++++ b/h5py/_selector.pyx
+@@ -341,7 +341,7 @@ cdef class Reader:
+
+ arr = PyArray_ZEROS(arr_rank, arr_shape, self.np_typenum, 0)
+ if not self.native_byteorder:
+- arr = arr.newbyteorder()
++ arr = arr.view(arr.dtype.newbyteorder())
+ finally:
+ efree(arr_shape)
+
+diff --git a/h5py/api_compat.h b/h5py/api_compat.h
+index 52917f4d..a359e827 100644
+--- a/h5py/api_compat.h
++++ b/h5py/api_compat.h
+@@ -24,7 +24,6 @@ typedef void *PyMPI_MPI_Message;
+ #include <stddef.h>
+ #include "Python.h"
+ #include "numpy/arrayobject.h"
+-#include "hdf5.h"
+
+ /* The HOFFSET macro can't be used from Cython. */
+
+@@ -35,14 +34,14 @@ typedef void *PyMPI_MPI_Message;
+ #define h5py_size_n256 (sizeof(npy_complex256))
+ #endif
+
+-#define h5py_offset_n64_real (HOFFSET(npy_complex64, real))
+-#define h5py_offset_n64_imag (HOFFSET(npy_complex64, imag))
+-#define h5py_offset_n128_real (HOFFSET(npy_complex128, real))
+-#define h5py_offset_n128_imag (HOFFSET(npy_complex128, imag))
++#define h5py_offset_n64_real (0)
++#define h5py_offset_n64_imag (sizeof(float))
++#define h5py_offset_n128_real (0)
++#define h5py_offset_n128_imag (sizeof(double))
+
+ #ifdef NPY_COMPLEX256
+-#define h5py_offset_n256_real (HOFFSET(npy_complex256, real))
+-#define h5py_offset_n256_imag (HOFFSET(npy_complex256, imag))
++#define h5py_offset_n256_real (0)
++#define h5py_offset_n256_imag (sizeof(long double))
+ #endif
+
+ #endif
+diff --git a/h5py/api_types_hdf5.pxd b/h5py/api_types_hdf5.pxd
+index a198f105..099e0f58 100644
+--- a/h5py/api_types_hdf5.pxd
++++ b/h5py/api_types_hdf5.pxd
+@@ -257,27 +257,27 @@ cdef extern from "hdf5.h":
+ herr_t (*sb_encode)(H5FD_t *file, char *name, unsigned char *p)
+ herr_t (*sb_decode)(H5FD_t *f, const char *name, const unsigned char *p)
+ size_t fapl_size
+- void * (*fapl_get)(H5FD_t *file)
+- void * (*fapl_copy)(const void *fapl)
+- herr_t (*fapl_free)(void *fapl)
++ void * (*fapl_get)(H5FD_t *file) except *
++ void * (*fapl_copy)(const void *fapl) except *
++ herr_t (*fapl_free)(void *fapl) except -1
+ size_t dxpl_size
+ void * (*dxpl_copy)(const void *dxpl)
+ herr_t (*dxpl_free)(void *dxpl)
+- H5FD_t *(*open)(const char *name, unsigned flags, hid_t fapl, haddr_t maxaddr)
+- herr_t (*close)(H5FD_t *file)
++ H5FD_t *(*open)(const char *name, unsigned flags, hid_t fapl, haddr_t maxaddr) except *
++ herr_t (*close)(H5FD_t *file) except -1
+ int (*cmp)(const H5FD_t *f1, const H5FD_t *f2)
+ herr_t (*query)(const H5FD_t *f1, unsigned long *flags)
+ herr_t (*get_type_map)(const H5FD_t *file, H5FD_mem_t *type_map)
+ haddr_t (*alloc)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size)
+ herr_t (*free)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, hsize_t size)
+- haddr_t (*get_eoa)(const H5FD_t *file, H5FD_mem_t type)
+- herr_t (*set_eoa)(H5FD_t *file, H5FD_mem_t type, haddr_t addr)
+- haddr_t (*get_eof)(const H5FD_t *file, H5FD_mem_t type)
++ haddr_t (*get_eoa)(const H5FD_t *file, H5FD_mem_t type) noexcept
++ herr_t (*set_eoa)(H5FD_t *file, H5FD_mem_t type, haddr_t addr) noexcept
++ haddr_t (*get_eof)(const H5FD_t *file, H5FD_mem_t type) except -1
+ herr_t (*get_handle)(H5FD_t *file, hid_t fapl, void**file_handle)
+- herr_t (*read)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, void *buffer)
+- herr_t (*write)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, const void *buffer)
+- herr_t (*flush)(H5FD_t *file, hid_t dxpl_id, hbool_t closing)
+- herr_t (*truncate)(H5FD_t *file, hid_t dxpl_id, hbool_t closing)
++ herr_t (*read)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, void *buffer) except *
++ herr_t (*write)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, const void *buffer) except *
++ herr_t (*flush)(H5FD_t *file, hid_t dxpl_id, hbool_t closing) except -1
++ herr_t (*truncate)(H5FD_t *file, hid_t dxpl_id, hbool_t closing) except -1
+ herr_t (*lock)(H5FD_t *file, hbool_t rw)
+ herr_t (*unlock)(H5FD_t *file)
+ H5FD_mem_t fl_map[<int>H5FD_MEM_NTYPES]
+@@ -295,27 +295,27 @@ cdef extern from "hdf5.h":
+ herr_t (*sb_encode)(H5FD_t *file, char *name, unsigned char *p)
+ herr_t (*sb_decode)(H5FD_t *f, const char *name, const unsigned char *p)
+ size_t fapl_size
+- void * (*fapl_get)(H5FD_t *file)
+- void * (*fapl_copy)(const void *fapl)
+- herr_t (*fapl_free)(void *fapl)
++ void * (*fapl_get)(H5FD_t *file) except *
++ void * (*fapl_copy)(const void *fapl) except *
++ herr_t (*fapl_free)(void *fapl) except -1
+ size_t dxpl_size
+ void * (*dxpl_copy)(const void *dxpl)
+ herr_t (*dxpl_free)(void *dxpl)
+- H5FD_t *(*open)(const char *name, unsigned flags, hid_t fapl, haddr_t maxaddr)
+- herr_t (*close)(H5FD_t *file)
++ H5FD_t *(*open)(const char *name, unsigned flags, hid_t fapl, haddr_t maxaddr) except *
++ herr_t (*close)(H5FD_t *file) except -1
+ int (*cmp)(const H5FD_t *f1, const H5FD_t *f2)
+ herr_t (*query)(const H5FD_t *f1, unsigned long *flags)
+ herr_t (*get_type_map)(const H5FD_t *file, H5FD_mem_t *type_map)
+ haddr_t (*alloc)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size)
+ herr_t (*free)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, hsize_t size)
+- haddr_t (*get_eoa)(const H5FD_t *file, H5FD_mem_t type)
+- herr_t (*set_eoa)(H5FD_t *file, H5FD_mem_t type, haddr_t addr)
+- haddr_t (*get_eof)(const H5FD_t *file, H5FD_mem_t type)
++ haddr_t (*get_eoa)(const H5FD_t *file, H5FD_mem_t type) noexcept
++ herr_t (*set_eoa)(H5FD_t *file, H5FD_mem_t type, haddr_t addr) noexcept
++ haddr_t (*get_eof)(const H5FD_t *file, H5FD_mem_t type) except -1
+ herr_t (*get_handle)(H5FD_t *file, hid_t fapl, void**file_handle)
+- herr_t (*read)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, void *buffer)
+- herr_t (*write)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, const void *buffer)
+- herr_t (*flush)(H5FD_t *file, hid_t dxpl_id, hbool_t closing)
+- herr_t (*truncate)(H5FD_t *file, hid_t dxpl_id, hbool_t closing)
++ herr_t (*read)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, void *buffer) except *
++ herr_t (*write)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, const void *buffer) except *
++ herr_t (*flush)(H5FD_t *file, hid_t dxpl_id, hbool_t closing) except -1
++ herr_t (*truncate)(H5FD_t *file, hid_t dxpl_id, hbool_t closing) except -1
+ herr_t (*lock)(H5FD_t *file, hbool_t rw)
+ herr_t (*unlock)(H5FD_t *file)
+ H5FD_mem_t fl_map[<int>H5FD_MEM_NTYPES]
+diff --git a/h5py/h5fd.pyx b/h5py/h5fd.pyx
+index e9746057..d39cf68f 100644
+--- a/h5py/h5fd.pyx
++++ b/h5py/h5fd.pyx
+@@ -144,10 +144,10 @@ cdef herr_t H5FD_fileobj_close(H5FD_fileobj_t *f) except -1 with gil:
+ stdlib_free(f)
+ return 0
+
+-cdef haddr_t H5FD_fileobj_get_eoa(const H5FD_fileobj_t *f, H5FD_mem_t type):
++cdef haddr_t H5FD_fileobj_get_eoa(const H5FD_fileobj_t *f, H5FD_mem_t type) noexcept nogil:
+ return f.eoa
+
+-cdef herr_t H5FD_fileobj_set_eoa(H5FD_fileobj_t *f, H5FD_mem_t type, haddr_t addr):
++cdef herr_t H5FD_fileobj_set_eoa(H5FD_fileobj_t *f, H5FD_mem_t type, haddr_t addr) noexcept nogil:
+ f.eoa = addr
+ return 0
+
+@@ -191,22 +191,38 @@ cdef herr_t H5FD_fileobj_flush(H5FD_fileobj_t *f, hid_t dxpl, hbool_t closing) e
+ cdef H5FD_class_t info
+ memset(&info, 0, sizeof(info))
+
++# Cython doesn't support "except X" in casting definition currently
++ctypedef herr_t (*file_free_func_ptr)(void *) except -1
++
++ctypedef herr_t (*file_close_func_ptr)(H5FD_t *) except -1
++ctypedef haddr_t (*file_get_eoa_func_ptr)(const H5FD_t *, H5FD_mem_t) noexcept
++ctypedef herr_t (*file_set_eof_func_ptr)(H5FD_t *, H5FD_mem_t, haddr_t) noexcept
++ctypedef haddr_t (*file_get_eof_func_ptr)(const H5FD_t *, H5FD_mem_t) except -1
++ctypedef herr_t (*file_read_func_ptr)(H5FD_t *, H5FD_mem_t, hid_t, haddr_t, size_t, void*) except -1
++ctypedef herr_t (*file_write_func_ptr)(H5FD_t *, H5FD_mem_t, hid_t, haddr_t, size_t, const void*) except -1
++ctypedef herr_t (*file_truncate_func_ptr)(H5FD_t *, hid_t, hbool_t) except -1
++ctypedef herr_t (*file_flush_func_ptr)(H5FD_t *, hid_t, hbool_t) except -1
++
++
+ info.name = 'fileobj'
+ info.maxaddr = libc.stdint.SIZE_MAX - 1
+ info.fc_degree = H5F_CLOSE_WEAK
+ info.fapl_size = sizeof(PyObject *)
+ info.fapl_get = <void *(*)(H5FD_t *)>H5FD_fileobj_fapl_get
+ info.fapl_copy = <void *(*)(const void *)>H5FD_fileobj_fapl_copy
+-info.fapl_free = <herr_t (*)(void *)>H5FD_fileobj_fapl_free
++
++info.fapl_free = <file_free_func_ptr>H5FD_fileobj_fapl_free
++
+ info.open = <H5FD_t *(*)(const char *name, unsigned flags, hid_t fapl, haddr_t maxaddr)>H5FD_fileobj_open
+-info.close = <herr_t (*)(H5FD_t *)>H5FD_fileobj_close
+-info.get_eoa = <haddr_t (*)(const H5FD_t *, H5FD_mem_t)>H5FD_fileobj_get_eoa
+-info.set_eoa = <herr_t (*)(H5FD_t *, H5FD_mem_t, haddr_t)>H5FD_fileobj_set_eoa
+-info.get_eof = <haddr_t (*)(const H5FD_t *, H5FD_mem_t)>H5FD_fileobj_get_eof
+-info.read = <herr_t (*)(H5FD_t *, H5FD_mem_t, hid_t, haddr_t, size_t, void *)>H5FD_fileobj_read
+-info.write = <herr_t (*)(H5FD_t *, H5FD_mem_t, hid_t, haddr_t, size_t, const void *)>H5FD_fileobj_write
+-info.truncate = <herr_t (*)(H5FD_t *, hid_t, hbool_t)>H5FD_fileobj_truncate
+-info.flush = <herr_t (*)(H5FD_t *, hid_t, hbool_t)>H5FD_fileobj_flush
++
++info.close = <file_close_func_ptr>H5FD_fileobj_close
++info.get_eoa = <file_get_eoa_func_ptr>H5FD_fileobj_get_eoa
++info.set_eoa = <file_set_eof_func_ptr>H5FD_fileobj_set_eoa
++info.get_eof = <file_get_eof_func_ptr>H5FD_fileobj_get_eof
++info.read = <file_read_func_ptr>H5FD_fileobj_read
++info.write = <file_write_func_ptr>H5FD_fileobj_write
++info.truncate = <file_truncate_func_ptr>H5FD_fileobj_truncate
++info.flush = <file_flush_func_ptr>H5FD_fileobj_flush
+ # H5FD_FLMAP_DICHOTOMY
+ info.fl_map = [H5FD_MEM_SUPER, # default
+ H5FD_MEM_SUPER, # super
+diff --git a/h5py/h5p.pyx b/h5py/h5p.pyx
+index 779ea1b5..dc8bf65a 100644
+--- a/h5py/h5p.pyx
++++ b/h5py/h5p.pyx
+@@ -1177,7 +1177,7 @@ cdef class PropFAID(PropInstanceID):
+ size_t block_size IN: File system block size
+ size_t cbuf_size IN: Copy buffer size
+
+- Properites with value of 0 indicate that the HDF5 library should
++ Properties with value of 0 indicate that the HDF5 library should
+ choose the value.
+ """
+ H5Pset_fapl_direct(self.id, alignment, block_size, cbuf_size)
+@@ -1761,7 +1761,7 @@ cdef class PropOCID(PropCreateID):
+
+ max_compact -- maximum number of attributes to be stored in compact storage(default:8)
+ must be greater than or equal to min_dense
+- min_dense -- minmum number of attributes to be stored in dense storage(default:6)
++ min_dense -- minimum number of attributes to be stored in dense storage(default:6)
+
+ """
+ H5Pset_attr_phase_change(self.id, max_compact, min_dense)
+diff --git a/h5py/h5t.pyx b/h5py/h5t.pyx
+index e7aae14f..b9d7e74d 100644
+--- a/h5py/h5t.pyx
++++ b/h5py/h5t.pyx
+@@ -1938,7 +1938,7 @@ def check_dtype(**kwds):
+
+ vlen = dtype
+ If the dtype represents an HDF5 vlen, returns the Python base class.
+- Currently only builting string vlens (str) are supported. Returns
++ Currently only built-in string vlens (str) are supported. Returns
+ None if the dtype does not represent an HDF5 vlen.
+
+ enum = dtype
+diff --git a/h5py/tests/test_attrs_data.py b/h5py/tests/test_attrs_data.py
+index 56481ca0..5083a1aa 100644
+--- a/h5py/tests/test_attrs_data.py
++++ b/h5py/tests/test_attrs_data.py
+@@ -262,7 +262,7 @@ class TestEmpty(BaseAttrs):
+ self.assertTrue(is_empty_dataspace(h5a.open(self.f.id, b'y')))
+
+ def test_modify(self):
+- with self.assertRaises(IOError):
++ with self.assertRaises(OSError):
+ self.f.attrs.modify('x', 1)
+
+ def test_values(self):
+diff --git a/h5py/tests/test_big_endian_file.py b/h5py/tests/test_big_endian_file.py
+index 4d81de01..170b5bcc 100644
+--- a/h5py/tests/test_big_endian_file.py
++++ b/h5py/tests/test_big_endian_file.py
+@@ -24,14 +24,14 @@ def test_vlen_big_endian():
+ assert dset[4] == 1.2
+ assert dset.dtype == "<f8"
+
+- # Same float values with big endianess
++ # Same float values with big endianness
+ assert f["DSBEfloat"][0] == 3.14
+ assert f["DSBEfloat"].dtype == ">f8"
+
+ assert f["DSLEint"][0] == 1
+ assert f["DSLEint"].dtype == "<u8"
+
+- # Same int values with big endianess
++ # Same int values with big endianness
+ assert f["DSBEint"][0] == 1
+ assert f["DSBEint"].dtype == ">i8"
+
+diff --git a/h5py/tests/test_dataset.py b/h5py/tests/test_dataset.py
+index e104dd53..0ffa5c80 100644
+--- a/h5py/tests/test_dataset.py
++++ b/h5py/tests/test_dataset.py
+@@ -1939,9 +1939,9 @@ class TestCommutative(BaseDataset):
+ dset = self.f.create_dataset("test", shape, dtype=float,
+ data=np.random.rand(*shape))
+
+- # grab a value from the elements, ie dset[0]
++ # grab a value from the elements, ie dset[0, 0]
+ # check that mask arrays are commutative wrt ==, !=
+- val = np.float64(dset[0])
++ val = np.float64(dset[0, 0])
+
+ assert np.all((val == dset) == (dset == val))
+ assert np.all((val != dset) == (dset != val))
+diff --git a/h5py/tests/test_file.py b/h5py/tests/test_file.py
+index b47d408e..1aa38731 100644
+--- a/h5py/tests/test_file.py
++++ b/h5py/tests/test_file.py
+@@ -326,7 +326,7 @@ class TestDrivers(TestCase):
+ # could be an integer multiple of 512
+ #
+ # To allow HDF5 to do the heavy lifting for different platform,
+- # We didn't provide any argumnets to the first call
++ # We didn't provide any arguments to the first call
+ # and obtained HDF5's default values there.
+
+ # Testing creation with a few different property lists
+@@ -639,9 +639,9 @@ class TestUnicode(TestCase):
+ Modes 'r' and 'r+' do not create files even when given unicode names
+ """
+ fname = self.mktemp(prefix=chr(0x201a))
+- with self.assertRaises(IOError):
++ with self.assertRaises(OSError):
+ File(fname, 'r')
+- with self.assertRaises(IOError):
++ with self.assertRaises(OSError):
+ File(fname, 'r+')
+
+
+diff --git a/h5py/tests/test_file_alignment.py b/h5py/tests/test_file_alignment.py
+index c280bb76..da13ee04 100644
+--- a/h5py/tests/test_file_alignment.py
++++ b/h5py/tests/test_file_alignment.py
+@@ -50,7 +50,7 @@ class TestFileAlignment(TestCase):
+ alignment_interval = 4096
+
+ for shape in [
+- (1033,), # A prime number above the thresold
++ (1033,), # A prime number above the threshold
+ (1000,), # Exactly equal to the threshold
+ (1001,), # one above the threshold
+ ]:
+@@ -75,7 +75,7 @@ class TestFileAlignment(TestCase):
+ alignment_interval = 1024
+
+ for shape in [
+- (881,), # A prime number below the thresold
++ (881,), # A prime number below the threshold
+ (999,), # Exactly one below the threshold
+ ]:
+ fname = self.mktemp()
+diff --git a/h5py/tests/test_group.py b/h5py/tests/test_group.py
+index 328c352a..4af1fb1f 100644
+--- a/h5py/tests/test_group.py
++++ b/h5py/tests/test_group.py
+@@ -771,7 +771,7 @@ class TestExternalLinks(TestCase):
+ with self.assertRaises(KeyError):
+ self.f['ext']
+
+- # I would prefer IOError but there's no way to fix this as the exception
++ # I would prefer OSError but there's no way to fix this as the exception
+ # class is determined by HDF5.
+ def test_exc_missingfile(self):
+ """ KeyError raised when attempting to open missing file """
+@@ -844,7 +844,7 @@ class TestExtLinkBugs(TestCase):
+ try:
+ if x:
+ x.close()
+- except IOError:
++ except OSError:
+ pass
+ return w
+ orig_name = self.mktemp()
+diff --git a/h5py/tests/test_selections.py b/h5py/tests/test_selections.py
+index 0b1722d7..01f6dcb7 100644
+--- a/h5py/tests/test_selections.py
++++ b/h5py/tests/test_selections.py
+@@ -65,7 +65,7 @@ class TestTypeGeneration(BaseSelection):
+ self.assertEqual(out, np.dtype('i'))
+ self.assertEqual(format, np.dtype( [('a','i')] ))
+
+- # Field does not apear in named typed
++ # Field does not appear in named typed
+ with self.assertRaises(ValueError):
+ out, format = sel2.read_dtypes(dt, ('j', 'k'))
+
+diff --git a/pylintrc b/pylintrc
+index 045df2f7..2401d3b0 100644
+--- a/pylintrc
++++ b/pylintrc
+@@ -44,7 +44,7 @@ confidence=
+ # can either give multiple identifiers separated by comma (,) or put this
+ # option multiple times (only on the command line, not in the configuration
+ # file where it should appear only once).You can also use "--disable=all" to
+-# disable everything first and then reenable specific checks. For example, if
++# disable everything first and then re-enable specific checks. For example, if
+ # you want to run only the similarities checker, you can use "--disable=all
+ # --enable=similarities". If you want to run only the classes checker, but have
+ # no Warning level messages displayed, use"--disable=all --enable=classes
+diff --git a/pyproject.toml b/pyproject.toml
+index ee573d2f..717200ef 100644
+--- a/pyproject.toml
++++ b/pyproject.toml
+@@ -1,6 +1,6 @@
+ [build-system]
+ requires = [
+- "Cython >=0.29.31,<1",
++ "Cython >=0.29.31,<4",
+ "oldest-supported-numpy",
+ "pkgconfig",
+ "setuptools >=61",
+diff --git a/setup_configure.py b/setup_configure.py
+index 0fba53ba..c3b86a64 100644
+--- a/setup_configure.py
++++ b/setup_configure.py
+@@ -165,7 +165,7 @@ class BuildConfig:
+ try:
+ if pkgconfig.exists(pc_name):
+ pc = pkgconfig.parse(pc_name)
+- except EnvironmentError:
++ except OSError:
+ if os.name != 'nt':
+ print(
+ "Building h5py requires pkg-config unless the HDF5 path "
+diff --git a/tox.ini b/tox.ini
+index 0efb88a6..86a176dd 100644
+--- a/tox.ini
++++ b/tox.ini
+@@ -65,7 +65,7 @@ skip_install=True
+ package_env = DUMMY NON-EXISTENT ENV NAME
+ changedir=docs
+ deps=
+- sphinx
++ -r docs/requirements-rtd.txt
+ commands=
+ sphinx-build -W -b html -d {envtmpdir}/doctrees . {envtmpdir}/html
+
diff --git a/meta-python/recipes-devtools/python/python3-h5py/0001-cross-compiling-support.patch b/meta-python/recipes-devtools/python/python3-h5py/0001-cross-compiling-support.patch
deleted file mode 100644
index ff50c85a06..0000000000
--- a/meta-python/recipes-devtools/python/python3-h5py/0001-cross-compiling-support.patch
+++ /dev/null
@@ -1,46 +0,0 @@
-From 7e3b1745c1fef34683a0610381dd3308ad4d1ba9 Mon Sep 17 00:00:00 2001
-From: Hongxu Jia <hongxu.jia@windriver.com>
-Date: Tue, 29 Jan 2019 17:08:32 +0800
-Subject: [PATCH] cross compiling support
-
-Remove useless dirs
-
-Upstream-Status: Inappropriate [oe specific]
-
-Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
----
- setup_build.py | 4 ----
- setup_configure.py | 2 +-
- 2 files changed, 1 insertion(+), 5 deletions(-)
-
-diff --git a/setup_build.py b/setup_build.py
-index 85b321a..2c78e92 100644
---- a/setup_build.py
-+++ b/setup_build.py
-@@ -53,10 +53,6 @@ if sys.platform.startswith('win'):
- ('_HDF5USEDLL_', None),
- ('H5_BUILT_AS_DYNAMIC_LIB', None)
- ])
--else:
-- FALLBACK_PATHS['include_dirs'].extend(['/opt/local/include', '/usr/local/include'])
-- FALLBACK_PATHS['library_dirs'].extend(['/opt/local/lib', '/usr/local/lib'])
--
-
- class h5py_build_ext(build_ext):
-
-diff --git a/setup_configure.py b/setup_configure.py
-index a2de76a..197f2da 100644
---- a/setup_configure.py
-+++ b/setup_configure.py
-@@ -208,7 +208,7 @@ def autodetect_version(hdf5_dir=None):
- else:
- regexp = re.compile(r'^libhdf5.so')
-
-- libdirs = ['/usr/local/lib', '/opt/local/lib']
-+ libdirs = []
- try:
- if pkgconfig.exists("hdf5"):
- libdirs.extend(pkgconfig.parse("hdf5")['library_dirs'])
---
-2.7.4
-
diff --git a/meta-python/recipes-devtools/python/python3-h5py/0001-setup_build.py-avoid-absolute-path.patch b/meta-python/recipes-devtools/python/python3-h5py/0001-setup_build.py-avoid-absolute-path.patch
new file mode 100644
index 0000000000..0b8555734a
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-h5py/0001-setup_build.py-avoid-absolute-path.patch
@@ -0,0 +1,29 @@
+From 6f8cee826ef9309c174aa97cb6af2ba532ed9dba Mon Sep 17 00:00:00 2001
+From: Mingli Yu <mingli.yu@windriver.com>
+Date: Thu, 28 Jan 2021 18:44:10 -0800
+Subject: [PATCH] setup_build.py: avoid absolute path
+
+Prevent absolute path from ending up in the egg-info SOURCES.txt.
+
+Upstream-Status: Submitted [https://github.com/h5py/h5py/pull/1803]
+
+Signed-off-by: Mingli Yu <mingli.yu@windriver.com>
+Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
+
+---
+ setup_build.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/setup_build.py b/setup_build.py
+index 78c6677..64db7f7 100644
+--- a/setup_build.py
++++ b/setup_build.py
+@@ -21,7 +21,7 @@ from setup_configure import BuildConfig
+
+
+ def localpath(*args):
+- return op.abspath(op.join(op.dirname(__file__), *args))
++ return op.join(*args)
+
+
+ MODULES = ['defs', '_errors', '_objects', '_proxy', 'h5fd', 'h5z',
diff --git a/meta-python/recipes-devtools/python/python3-h5py_2.9.0.bb b/meta-python/recipes-devtools/python/python3-h5py_2.9.0.bb
deleted file mode 100644
index bca7757ad8..0000000000
--- a/meta-python/recipes-devtools/python/python3-h5py_2.9.0.bb
+++ /dev/null
@@ -1,30 +0,0 @@
-SUMMARY = "Provides both a high- and low-level interface to the HDF5 library from Python. "
-HOMEPAGE = "https://www.h5py.org/"
-SECTION = "devel/python"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://setup.py;beginline=107;endline=107;md5=795ecad0d261c998cc526c84a822dff6"
-
-SRC_URI = "git://github.com/h5py/h5py.git \
- file://0001-cross-compiling-support.patch \
- "
-SRCREV ?= "8d96a14c3508de1bde77aec5db302e478dc5dbc4"
-
-inherit setuptools3
-
-S = "${WORKDIR}/git"
-
-BBCLASSEXTEND = "native"
-
-DEPENDS = "python3-pkgconfig-native \
- python3-cython-native \
- python3-numpy-native \
- python3-six-native \
- python3 \
- hdf5 \
- "
-
-RDEPENDS_${PN} = "python3-numpy \
- python3-six \
- "
-
-export HDF5_VERSION="1.8.19"
diff --git a/meta-python/recipes-devtools/python/python3-h5py_3.10.0.bb b/meta-python/recipes-devtools/python/python3-h5py_3.10.0.bb
new file mode 100644
index 0000000000..8a9158525e
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-h5py_3.10.0.bb
@@ -0,0 +1,40 @@
+SUMMARY = "Provides both a high- and low-level interface to the HDF5 library from Python."
+HOMEPAGE = "https://www.h5py.org/"
+SECTION = "devel/python"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=113251d71fb0384712c719b567261c5c"
+
+SRC_URI[sha256sum] = "d93adc48ceeb33347eb24a634fb787efc7ae4644e6ea4ba733d099605045c049"
+
+SRC_URI += "file://0001-setup_build.py-avoid-absolute-path.patch \
+ file://0001-Fix-Cython-3-compatibility.patch"
+
+inherit pkgconfig pypi setuptools3
+
+BBCLASSEXTEND = "native"
+
+DEPENDS = "python3-pkgconfig-native \
+ python3-cython-native \
+ python3-numpy-native \
+ python3-six-native \
+ hdf5-native \
+ python3 \
+ hdf5 \
+ "
+
+PACKAGESPLITFUNCS =+ "fix_cythonized_sources"
+
+fix_cythonized_sources() {
+ for f in `grep -l -r -e '\/* Generated by Cython.*/$' ${PKGD}${TARGET_DBGSRC_DIR}`; do
+ if [ -e $f ]; then
+ sed -i -e 's#${RECIPE_SYSROOT_NATIVE}##g' $f
+ fi
+ done
+}
+
+RDEPENDS:${PN} = "python3-numpy \
+ python3-six \
+ python3-json \
+ "
+
+export HDF5_VERSION="1.14.0"
diff --git a/meta-python/recipes-devtools/python/python3-haversine_2.8.1.bb b/meta-python/recipes-devtools/python/python3-haversine_2.8.1.bb
new file mode 100644
index 0000000000..e45ae79860
--- /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://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
+
+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.0.0.bb b/meta-python/recipes-devtools/python/python3-hexbytes_1.0.0.bb
new file mode 100644
index 0000000000..951998b5a1
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-hexbytes_1.0.0.bb
@@ -0,0 +1,9 @@
+SUMMARY = "Python bytes subclass that decodes hex, with a readable console output."
+HOMEPAGE = "https://github.com/ethereum/hexbytes"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=16ffc86adf4293d4cfb204e77d62cfe6"
+
+SRC_URI[sha256sum] = "18e6e3279a13878b93fb85da77822dc506b7048065a588e74141c2468a65ad8c"
+
+inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-html2text/run-ptest b/meta-python/recipes-devtools/python/python3-html2text/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-html2text/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-html2text_2020.1.16.bb b/meta-python/recipes-devtools/python/python3-html2text_2020.1.16.bb
new file mode 100644
index 0000000000..d96f61bdc7
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-html2text_2020.1.16.bb
@@ -0,0 +1,28 @@
+SUMMARY = "Convert HTML to Markdown-formatted text"
+HOMEPAGE = "https://github.com/Alir3z4/html2text"
+
+LICENSE = "GPL-3.0-only"
+LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504"
+
+SRC_URI[md5sum] = "c77b580c94d1a9e0145f23cc4472993d"
+SRC_URI[sha256sum] = "e296318e16b059ddb97f7a8a1d6a5c1d7af4544049a01e261731d2d5cc277bbb"
+
+inherit pypi setuptools3 ptest
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+RDEPENDS:${PN} += "python3-cgitb"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/test
+ cp -rf ${S}/test/* ${D}${PTEST_PATH}/test/
+}
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-html5lib_1.0.1.bb b/meta-python/recipes-devtools/python/python3-html5lib_1.0.1.bb
deleted file mode 100644
index 6bd8b49f55..0000000000
--- a/meta-python/recipes-devtools/python/python3-html5lib_1.0.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-html5lib.inc
diff --git a/meta-python/recipes-devtools/python/python3-html5lib_1.1.bb b/meta-python/recipes-devtools/python/python3-html5lib_1.1.bb
new file mode 100644
index 0000000000..d6272a07c3
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-html5lib_1.1.bb
@@ -0,0 +1,17 @@
+SUMMARY = "HTML parser based on the WHATWG HTML specifcation"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=1ba5ada9e6fead1fdc32f43c9f10ba7c"
+
+SRC_URI[md5sum] = "6748742e2ec4cb99287a6bc82bcfe2b0"
+SRC_URI[sha256sum] = "b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "\
+ python3-lxml \
+ python3-six \
+ python3-webencodings \
+ python3-xml \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-httpcore_1.0.3.bb b/meta-python/recipes-devtools/python/python3-httpcore_1.0.3.bb
new file mode 100644
index 0000000000..203bfd48a1
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-httpcore_1.0.3.bb
@@ -0,0 +1,26 @@
+SUMMARY = "A minimal low-level HTTP client."
+SECTION = "devel/python"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.md;md5=1c1f23b073da202e1f4f9e426490210c"
+
+inherit pypi python_hatchling
+
+SRC_URI[sha256sum] = "5c0f9546ad17dac4d0772b0808856eb616eb8b48ce94f49ed819fd6982a8a544"
+
+DEPENDS += "\
+ python3-hatch-fancy-pypi-readme-native \
+"
+
+PACKAGECONFIG ??= ""
+PACKAGECONFIG[http2] = ",,,python3-h2"
+PACKAGECONFIG[socks] = ",,,python3-socksio"
+PACKAGECONFIG[asyncio] = ",,,python3-anyio"
+# Don't provide "trio" PACKAGECONFIG as nothing provides "python3-trio" currently.
+# If somebody needs this please feel free to add python3-trio and enable the
+# packageconfig below:
+#PACKAGECONFIG[trio] = ",,,python3-trio"
+
+RDEPENDS:${PN} += "\
+ python3-certifi \
+ python3-h11 \
+"
diff --git a/meta-python/recipes-devtools/python/python3-httplib2_0.22.0.bb b/meta-python/recipes-devtools/python/python3-httplib2_0.22.0.bb
new file mode 100644
index 0000000000..9318ad9182
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-httplib2_0.22.0.bb
@@ -0,0 +1,15 @@
+SUMMARY = "A comprehensive HTTP client library, httplib2 supports many features left out of other HTTP libraries."
+HOMEPAGE = "https://github.com/httplib2/httplib2"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=56e5e931172b6164b62dc7c4aba6c8cf"
+
+SRC_URI[sha256sum] = "d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81"
+
+inherit pypi python_setuptools_build_meta
+
+RDEPENDS:${PN} += "\
+ python3-compression \
+ python3-netclient \
+ python3-pyparsing \
+"
diff --git a/meta-python/recipes-devtools/python/python3-httptools/run-ptest b/meta-python/recipes-devtools/python/python3-httptools/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-httptools/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-httptools_0.6.1.bb b/meta-python/recipes-devtools/python/python3-httptools_0.6.1.bb
new file mode 100644
index 0000000000..4192697df2
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-httptools_0.6.1.bb
@@ -0,0 +1,22 @@
+SUMMARY = "A collection of framework independent HTTP protocol utils."
+HOMEPAGE = "https://github.com/MagicStack/httptools"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=0a2d82955bf3facdf04cb882655e840e"
+
+inherit pypi setuptools3 ptest
+
+SRC_URI[sha256sum] = "c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a"
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
diff --git a/meta-python/recipes-devtools/python/python3-httpx_0.27.0.bb b/meta-python/recipes-devtools/python/python3-httpx_0.27.0.bb
new file mode 100644
index 0000000000..e4d3cbeee8
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-httpx_0.27.0.bb
@@ -0,0 +1,48 @@
+SUMMARY = "A next generation HTTP client for Python."
+SECTION = "devel/python"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.md;md5=c624803bdf6fc1c4ce39f5ae11d7bd05"
+
+inherit pypi python_hatchling
+
+SRC_URI[sha256sum] = "a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"
+
+DEPENDS += "\
+ python3-hatch-fancy-pypi-readme-native \
+"
+
+PACKAGECONFIG ??= ""
+PACKAGECONFIG[brotli] = ",,,python3-brotli"
+PACKAGECONFIG[http2] = ",,,python3-h2"
+PACKAGECONFIG[socks] = ",,,python3-socksio"
+
+RDEPENDS:${PN} += "\
+ python3-anyio \
+ python3-certifi \
+ python3-httpcore \
+ python3-idna \
+ python3-sniffio \
+ python3-json \
+ python3-core \
+ python3-netclient \
+ python3-compression \
+"
+
+PACKAGES += "\
+ ${PN}-cli \
+"
+
+RDEPENDS:${PN}-cli += "\
+ ${PN} \
+ python3-click \
+ python3-pygments \
+ python3-rich \
+"
+
+FILES:${PN} = "\
+ ${libdir}/${PYTHON_DIR} \
+"
+
+FILES:${PN}-cli = "\
+ ${bindir}/httpx \
+"
diff --git a/meta-python/recipes-devtools/python/python3-huey_2.5.0.bb b/meta-python/recipes-devtools/python/python3-huey_2.5.0.bb
new file mode 100644
index 0000000000..c6e5606090
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-huey_2.5.0.bb
@@ -0,0 +1,18 @@
+SUMMARY = "a little task queue for python"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=5cac039fcc82f01141cc170b48f315d4"
+
+PYPI_PACKAGE = "huey"
+
+SRC_URI[sha256sum] = "2ffb52fb5c46a1b0d53c79d59df3622312b27e2ab68d81a580985a8ea4ca3480"
+
+RDEPENDS:${PN} += " \
+ python3-datetime \
+ python3-logging \
+ python3-multiprocessing \
+ python3-json \
+"
+
+inherit pypi setuptools3
+
diff --git a/meta-python/recipes-devtools/python/python3-humanfriendly_10.0.bb b/meta-python/recipes-devtools/python/python3-humanfriendly_10.0.bb
new file mode 100644
index 0000000000..b32fe2e1d0
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-humanfriendly_10.0.bb
@@ -0,0 +1,24 @@
+DESCRIPTION = "Human friendly output for text interfaces using Python"
+HOMEPAGE = "https://humanfriendly.readthedocs.io/"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=5d178009f806c2bdd498a19be0013a7a"
+
+PYPI_PACKAGE = "humanfriendly"
+
+SRC_URI[sha256sum] = "6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN}:class-target += " \
+ python3-datetime \
+ python3-fcntl \
+ python3-io \
+ python3-logging \
+ python3-math \
+ python3-numbers \
+ python3-shell \
+ python3-stringold \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-humanfriendly_4.18.bb b/meta-python/recipes-devtools/python/python3-humanfriendly_4.18.bb
deleted file mode 100644
index 2ca5fe36f4..0000000000
--- a/meta-python/recipes-devtools/python/python3-humanfriendly_4.18.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-humanfriendly.inc
diff --git a/meta-python/recipes-devtools/python/python3-humanize_0.5.1.bb b/meta-python/recipes-devtools/python/python3-humanize_0.5.1.bb
deleted file mode 100644
index 04464ac59e..0000000000
--- a/meta-python/recipes-devtools/python/python3-humanize_0.5.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-humanize.inc
diff --git a/meta-python/recipes-devtools/python/python3-humanize_4.9.0.bb b/meta-python/recipes-devtools/python/python3-humanize_4.9.0.bb
new file mode 100644
index 0000000000..da1eea4cf7
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-humanize_4.9.0.bb
@@ -0,0 +1,22 @@
+SUMMARY = "Python humanize utilities"
+HOMEPAGE = "http://github.com/jmoiron/humanize"
+SECTION = "devel/python"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENCE;md5=4ecc42519e84f6f3e23529464df7bd1d"
+
+SRC_URI[sha256sum] = "582a265c931c683a7e9b8ed9559089dea7edcf6cc95be39a3cbc2c5d5ac2bcfa"
+
+inherit pypi python_hatchling
+
+DEPENDS += "\
+ python3-setuptools-scm-native \
+ python3-hatch-vcs-native \
+"
+
+RDEPENDS:${PN} += "\
+ python3-datetime \
+ python3-setuptools \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-hyperlink_19.0.0.bb b/meta-python/recipes-devtools/python/python3-hyperlink_19.0.0.bb
deleted file mode 100644
index 70813bf34c..0000000000
--- a/meta-python/recipes-devtools/python/python3-hyperlink_19.0.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-hyperlink.inc
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
new file mode 100644
index 0000000000..a3fae39c7f
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-hyperlink_21.0.0.bb
@@ -0,0 +1,16 @@
+DESCRIPTION = "A featureful, correct URL for Python"
+HOMEPAGE = "https://github.com/python-hyper/hyperlink"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=6dc5b4bd3d02faedf08461621aa2aeca"
+
+SRC_URI[sha256sum] = "427af957daa58bc909471c6c40f74c5450fa123dd093fc53efd2e91d2705a56b"
+
+inherit pypi python_setuptools_build_meta
+
+RDEPENDS:${PN} += "python3-stringold python3-netclient python3-idna"
+
+PACKAGES =. "${PN}-test "
+
+FILES:${PN}-test += " \
+ ${PYTHON_SITEPACKAGES_DIR}/hyperlinkt/test \
+"
diff --git a/meta-python/recipes-devtools/python/python3-icecream_2.1.3.bb b/meta-python/recipes-devtools/python/python3-icecream_2.1.3.bb
new file mode 100644
index 0000000000..ec3a4b90f1
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-icecream_2.1.3.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Never use print() to debug again; inspect variables, expressions, and program execution with a single, simple function call."
+HOMEPAGE = "https://github.com/gruns/icecream"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=eca5ce1610d64ed40920efdce85ff8d1"
+
+SRC_URI[sha256sum] = "0aa4a7c3374ec36153a1d08f81e3080e83d8ac1eefd97d2f4fe9544e8f9b49de"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-asttokens \
+ python3-colorama \
+ python3-executing \
+ python3-numbers \
+ python3-pygments \
+ python3-pprint \
+"
diff --git a/meta-python/recipes-devtools/python/python3-icu/0001-Fix-host-contamination-of-include-files.patch b/meta-python/recipes-devtools/python/python3-icu/0001-Fix-host-contamination-of-include-files.patch
new file mode 100644
index 0000000000..7bb5ee58cc
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-icu/0001-Fix-host-contamination-of-include-files.patch
@@ -0,0 +1,41 @@
+From a82fea9663f0c70cf57cd06650f400e878afc5e4 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Fri, 16 Apr 2021 10:48:36 -0700
+Subject: [PATCH] Fix host contamination of include files
+
+python3-icu-2.5-r0 do_package_qa: QA Issue: python3-icu: The compile log indicates that host include and/or library paths were used.
+
+Also, don't use icu-config
+
+Upstream-Status: Inappropriate [OE specific]
+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 176c9ab..0a10268 100644
+--- a/setup.py
++++ b/setup.py
+@@ -68,7 +68,7 @@ elif platform.startswith('freebsd'):
+
+ CONFIGURE_WITH_ICU_CONFIG = {
+ 'darwin': False,
+- 'linux': True,
++ 'linux': False,
+ 'freebsd': False, # not tested
+ 'win32': False, # no icu-config
+ 'sunos5': False, # not tested
+@@ -277,7 +277,6 @@ setup(name="PyICU",
+ ext_modules=[Extension('icu._icu_',
+ [filename for filename in sorted(os.listdir(os.curdir))
+ if filename.endswith('.cpp')],
+- include_dirs=_includes,
+ extra_compile_args=_cflags,
+ extra_link_args=_lflags,
+ libraries=_libraries)],
+--
+2.34.1
+
diff --git a/meta-python/recipes-devtools/python/python3-icu_2.12.bb b/meta-python/recipes-devtools/python/python3-icu_2.12.bb
new file mode 100644
index 0000000000..6394db4e9e
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-icu_2.12.bb
@@ -0,0 +1,15 @@
+SUMMARY = "Python extension wrapping the ICU C++ API"
+HOMEPAGE = "https://gitlab.pyicu.org/main/pyicu"
+BUGTRACKER = "https://gitlab.pyicu.org/main/pyicu/-/issues"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=0724597863f1581ab01429e0423e779f"
+
+DEPENDS += "icu"
+
+PYPI_PACKAGE = "PyICU"
+SRC_URI[sha256sum] = "bd7ab5efa93ad692e6daa29cd249364e521218329221726a113ca3cb281c8611"
+
+SRC_URI += "file://0001-Fix-host-contamination-of-include-files.patch"
+
+inherit pkgconfig pypi python_setuptools_build_meta
diff --git a/meta-python/recipes-devtools/python/python3-idna-ssl_1.1.0.bb b/meta-python/recipes-devtools/python/python3-idna-ssl_1.1.0.bb
index 3643fcfd30..503b79d667 100644
--- a/meta-python/recipes-devtools/python/python3-idna-ssl_1.1.0.bb
+++ b/meta-python/recipes-devtools/python/python3-idna-ssl_1.1.0.bb
@@ -1,2 +1,17 @@
-inherit setuptools3
-require python-idna-ssl.inc
+SUMMARY = "Patch ssl.match_hostname for Unicode(idna) domains support"
+HOMEPAGE = "https://github.com/aio-libs/idna-ssl"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=a61b9c5aec8796b64a6bf15d42605073"
+
+SRC_URI[sha256sum] = "a933e3bb13da54383f9e8f35dc4f9cb9eb9b3b78c6b36f311254d6d0d92c6c7c"
+
+PYPI_PACKAGE = "idna-ssl"
+inherit pypi setuptools3
+
+UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/idna_ssl/"
+UPSTREAM_CHECK_REGEX = "/idna_ssl/(?P<pver>(\d+[\.\-_]*)+)"
+
+RDEPENDS:${PN} += " \
+ python3-idna \
+ python3-io \
+"
diff --git a/meta-python/recipes-devtools/python/python3-idna_2.8.bb b/meta-python/recipes-devtools/python/python3-idna_2.8.bb
deleted file mode 100644
index a08ca714ac..0000000000
--- a/meta-python/recipes-devtools/python/python3-idna_2.8.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-idna.inc
diff --git a/meta-python/recipes-devtools/python/python3-ifaddr_0.2.0.bb b/meta-python/recipes-devtools/python/python3-ifaddr_0.2.0.bb
new file mode 100644
index 0000000000..371bbf2ab5
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-ifaddr_0.2.0.bb
@@ -0,0 +1,14 @@
+DESCRIPTION = "Cross-platform network interface and IP address enumeration \
+library"
+HOMEPAGE = "https://pypi.org/project/ifaddr/"
+LICENSE = "MIT"
+
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=8debe8d42320ec0ff24665319b625a5e"
+
+SRC_URI[sha256sum] = "cc0cbfcaabf765d44595825fb96a99bb12c79716b73b44330ea38ee2b0c4aed4"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-ctypes \
+"
diff --git a/meta-python/recipes-devtools/python/python3-imageio_2.34.0.bb b/meta-python/recipes-devtools/python/python3-imageio_2.34.0.bb
new file mode 100644
index 0000000000..e38d694408
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-imageio_2.34.0.bb
@@ -0,0 +1,12 @@
+SUMMARY = "Python library that provides an easy interface to read and \
+write a wide range of image data, including animated images, video, \
+volumetric data, and scientific formats."
+SECTION = "devel/python"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=24cb9a367a9e641b459a01c4d15256ba"
+
+SRC_URI[sha256sum] = "ae9732e10acf807a22c389aef193f42215718e16bd06eed0c5bb57e1034a4d53"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} = "python3-numpy python3-pillow"
diff --git a/meta-python/recipes-devtools/python/python3-imgtool_2.0.0.bb b/meta-python/recipes-devtools/python/python3-imgtool_2.0.0.bb
new file mode 100644
index 0000000000..a25e6a61a8
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-imgtool_2.0.0.bb
@@ -0,0 +1,12 @@
+SUMMARY = "MCUboot's image signing and key management tool"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://imgtool/main.py;beginline=3;endline=18;md5=0645fb61e2f961a110302fbfdb227446"
+
+SRC_URI[sha256sum] = "7a541255e69eec1f12aa38dce1f1d4fe20d8212677c68a9b6ec634ca91a06612"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} = "python3-cbor2 python3-click python3-cryptography python3-intelhex"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-importlib-metadata_0.23.bb b/meta-python/recipes-devtools/python/python3-importlib-metadata_0.23.bb
deleted file mode 100644
index d71c45b5f1..0000000000
--- a/meta-python/recipes-devtools/python/python3-importlib-metadata_0.23.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-importlib-metadata.inc
diff --git a/meta-python/recipes-devtools/python/python3-incremental_17.5.0.bb b/meta-python/recipes-devtools/python/python3-incremental_17.5.0.bb
deleted file mode 100644
index 0f04df4a67..0000000000
--- a/meta-python/recipes-devtools/python/python3-incremental_17.5.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-incremental.inc
diff --git a/meta-python/recipes-devtools/python/python-incremental.inc b/meta-python/recipes-devtools/python/python3-incremental_22.10.0.bb
index ef5e903fbf..3d93cc05e9 100644
--- a/meta-python/recipes-devtools/python/python-incremental.inc
+++ b/meta-python/recipes-devtools/python/python3-incremental_22.10.0.bb
@@ -3,18 +3,17 @@ HOMEPAGE = "https://github.com/twisted/incremental"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=6ca9b07f08e2c72d48c74d363d1e0e15"
-SRC_URI[md5sum] = "602746e0d438e075a5a9e0678140bba2"
-SRC_URI[sha256sum] = "7b751696aaf36eebfab537e458929e194460051ccad279c72b755a167eebd4b3"
+SRC_URI[sha256sum] = "912feeb5e0f7e0188e6f42241d2f450002e11bbc0937c65865045854c24c0bd0"
-inherit pypi
+inherit pypi setuptools3
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-twisted \
- ${PYTHON_PN}-click \
+RDEPENDS:${PN} += " \
+ python3-twisted \
+ python3-click \
"
# -native is needed to build python[3]-twisted, however, we need to take steps to
# prevent a circular dependency. The build apparently does not use the part of
# python-incremental which uses python-twisted, so this hack is OK.
-RDEPENDS_${PYTHON_PN}-incremental-native_remove = "${PYTHON_PN}-twisted-native"
+RDEPENDS:python3-incremental-native:remove = "python3-twisted-native"
BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python3-inflate64_1.0.0.bb b/meta-python/recipes-devtools/python/python3-inflate64_1.0.0.bb
new file mode 100644
index 0000000000..2ccc98e36b
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-inflate64_1.0.0.bb
@@ -0,0 +1,16 @@
+SUMMARY = "deflate64 compression/decompression library"
+HOMEPAGE = "https://codeberg.org/miurahr/inflate64"
+LICENSE = "LGPL-2.1-or-later"
+SECTION = "devel/python"
+LIC_FILES_CHKSUM = "file://COPYING;md5=4fbd65380cdd255951079008b364516c"
+
+inherit setuptools3 pypi
+
+SRC_URI[sha256sum] = "3278827b803cf006a1df251f3e13374c7d26db779e5a33329cc11789b804bc2d"
+
+PYPI_PACKAGE = "inflate64"
+
+RDEPENDS:${PN} += "\
+ python3-core \
+ python3-importlib-metadata \
+"
diff --git a/meta-python/recipes-devtools/python/python3-inflection/run-ptest b/meta-python/recipes-devtools/python/python3-inflection/run-ptest
new file mode 100644
index 0000000000..f1c8729f0e
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-inflection/run-ptest
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+pytest --automake
+
diff --git a/meta-python/recipes-devtools/python/python3-inflection_0.3.1.bb b/meta-python/recipes-devtools/python/python3-inflection_0.3.1.bb
deleted file mode 100644
index cc36a02a77..0000000000
--- a/meta-python/recipes-devtools/python/python3-inflection_0.3.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-inflection.inc
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
new file mode 100644
index 0000000000..5c6f4e2356
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-inflection_0.5.1.bb
@@ -0,0 +1,28 @@
+SUMMARY = "A port of Ruby on Rails' inflection to Python."
+HOMEPAGE = "https://pypi.org/project/inflection"
+LICENSE = "MIT"
+SECTION = "devel/python"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=2fb6fa1a6f1792d78de19ad1bb653c31"
+
+SRC_URI[md5sum] = "c3287d4f0e3bdf625a52d655cc514403"
+SRC_URI[sha256sum] = "1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417"
+
+inherit pypi setuptools3 ptest
+
+SRC_URI +=" \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest +=" \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ cp -f ${S}/test_inflection.py ${D}${PTEST_PATH}/
+}
+
+
+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-intelhex_2.3.0.bb b/meta-python/recipes-devtools/python/python3-intelhex_2.3.0.bb
new file mode 100644
index 0000000000..befcb34780
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-intelhex_2.3.0.bb
@@ -0,0 +1,10 @@
+SUMMARY = "Python library for Intel HEX files manipulations"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=4eba844696655c3eae07aca8e3a94772"
+
+SRC_URI[sha256sum] = "892b7361a719f4945237da8ccf754e9513db32f5628852785aea108dcd250093"
+
+inherit pypi setuptools3
+
+BBCLASSEXTEND = "native nativesdk"
+
diff --git a/meta-python/recipes-devtools/python/python3-intervals/run-ptest b/meta-python/recipes-devtools/python/python3-intervals/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-intervals/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-intervals_1.10.0.bb b/meta-python/recipes-devtools/python/python3-intervals_1.10.0.bb
new file mode 100644
index 0000000000..3c5be47806
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-intervals_1.10.0.bb
@@ -0,0 +1,28 @@
+DESCRIPTION = "Interval arithmetic for Python"
+HOMEPAGE = "https://github.com/AlexandreDecan/python-intervals"
+SECTION = "devel/python"
+
+LICENSE = "LGPL-3.0-only"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=05f1e16a8e59ce3e9a979e881816c2ab"
+
+PYPI_PACKAGE := "python-intervals"
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+inherit pypi setuptools3 ptest
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ cp -f ${S}/test_intervals.py ${D}${PTEST_PATH}
+ cp -f ${S}/README.md ${D}${PTEST_PATH}
+}
+
+SRC_URI[sha256sum] = "0d26746eaed0be78a61dd289bb7a10721b08770bb3e807614835f490d514f2a5"
+
+BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python3-intervals_1.5.4.bb b/meta-python/recipes-devtools/python/python3-intervals_1.5.4.bb
deleted file mode 100644
index 8cbe1090f3..0000000000
--- a/meta-python/recipes-devtools/python/python3-intervals_1.5.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-intervals.inc
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/python-ipaddress_1.0.22.bb b/meta-python/recipes-devtools/python/python3-ipaddress_1.0.23.bb
index 66de8b6379..796213fc67 100644
--- a/meta-python/recipes-devtools/python/python-ipaddress_1.0.22.bb
+++ b/meta-python/recipes-devtools/python/python3-ipaddress_1.0.23.bb
@@ -3,11 +3,9 @@ HOMEPAGE = "https://github.com/phihag/ipaddress"
LICENSE = "Python-2.0"
LIC_FILES_CHKSUM = "file://LICENSE;md5=7f538584cc3407bf76042def7168548a"
-DEPENDS += "python-pip"
+SRC_URI[md5sum] = "aaee67a8026782af1831148beb0d9060"
+SRC_URI[sha256sum] = "b7f8e0369580bb4a24d5ba1d7cc29660a4a6987763faf1d8a8046830e020e7e2"
-SRC_URI[md5sum] = "74c1ce3109f30eaa1ab3dd342e7b76d4"
-SRC_URI[sha256sum] = "b146c751ea45cad6188dd6cf2d9b757f6f4f8d6ffb96a023e6f2e26eea02a72c"
-
-inherit pypi setuptools
+inherit pypi setuptools3
BBCLASSEXTEND = "native nativesdk"
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
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-ipy/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+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
new file mode 100644
index 0000000000..36d0b9ae27
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-ipy_1.01.bb
@@ -0,0 +1,33 @@
+SUMMARY = "IPy - class and tools for handling of IPv4 and IPv6 addresses and networks"
+DESCRIPTION = "IPy is a Python module for handling IPv4 and IPv6 Addresses and Networks \
+in a fashion similar to perl's Net::IP and friends. The IP class allows \
+a comfortable parsing and handling for most notations in use for IPv4 \
+and IPv6 Addresses and Networks."
+SECTION = "devel/python"
+HOMEPAGE = "https://github.com/autocracy/python-ipy"
+
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://COPYING;md5=848d24919845901b4f48bae5f13252e6"
+
+SRC_URI[md5sum] = "d6cf83e7f418ebbd23324ba1c658b907"
+SRC_URI[sha256sum] = "edeca741dea2d54aca568fa23740288c3fe86c0f3ea700344571e9ef14a7cc1a"
+
+inherit pypi setuptools3_legacy ptest
+
+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}/test/* ${D}${PTEST_PATH}/test
+}
+
+PYPI_PACKAGE = "IPy"
+
+BBCLASSEXTEND = "native"
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
new file mode 100644
index 0000000000..3261d80474
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-ipython-genutils_0.2.0.bb
@@ -0,0 +1,14 @@
+SUMMARY = "Vestigial utilities from IPython"
+HOMEPAGE = "http://ipython.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"
+
+inherit setuptools3 pypi
diff --git a/meta-python/recipes-devtools/python/python3-ipython_8.23.0.bb b/meta-python/recipes-devtools/python/python3-ipython_8.23.0.bb
new file mode 100644
index 0000000000..ebfd147229
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-ipython_8.23.0.bb
@@ -0,0 +1,28 @@
+SUMMARY = "IPython: Productive Interactive Computing"
+HOMEPAGE = "https://ipython.org"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://COPYING.rst;md5=59b20262b8663cdd094005bddf47af5f"
+
+PYPI_PACKAGE = "ipython"
+
+SRC_URI[sha256sum] = "7468edaf4f6de3e1b912e57f66c241e6fd3c7099f2ec2136e239e142e800274d"
+
+RDEPENDS:${PN} = "\
+ python3-setuptools \
+ python3-jedi \
+ python3-decorator \
+ python3-pickleshare \
+ python3-traitlets \
+ python3-prompt-toolkit \
+ python3-pygments \
+ python3-backcall \
+ python3-pydoc \
+ python3-debugger \
+ python3-pexpect \
+ python3-unixadmin \
+ python3-misc \
+ python3-sqlite3 \
+ python3-stack-data \
+"
+
+inherit setuptools3 pypi
diff --git a/meta-python/recipes-devtools/python/python3-iso3166/run-ptest b/meta-python/recipes-devtools/python/python3-iso3166/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-iso3166/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-iso3166_2.1.1.bb b/meta-python/recipes-devtools/python/python3-iso3166_2.1.1.bb
new file mode 100644
index 0000000000..3aa084d10a
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-iso3166_2.1.1.bb
@@ -0,0 +1,26 @@
+SUMMARY = "Self-contained ISO 3166-1 country definitions"
+HOMEPAGE = "https://pypi.org/project/iso3166/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=5e2f4edc7e7408a82e4a1d05f229b695"
+
+SRC_URI[sha256sum] = "fcd551b8dda66b44e9f9e6d6bbbee3a1145a22447c0a556e5d0fb1ad1e491719"
+
+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-numbers"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-iso8601_0.1.12.bb b/meta-python/recipes-devtools/python/python3-iso8601_0.1.12.bb
deleted file mode 100644
index 4a332b53bd..0000000000
--- a/meta-python/recipes-devtools/python/python3-iso8601_0.1.12.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-iso8601.inc
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 0e79ae995c..0000000000
--- a/meta-python/recipes-devtools/python/python3-isodate_0.6.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-isodate.inc
diff --git a/meta-python/recipes-devtools/python/python3-isort_4.3.4.bb b/meta-python/recipes-devtools/python/python3-isort_4.3.4.bb
deleted file mode 100644
index 755b3e2f23..0000000000
--- a/meta-python/recipes-devtools/python/python3-isort_4.3.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-isort.inc
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_0.24.bb b/meta-python/recipes-devtools/python/python3-itsdangerous_0.24.bb
deleted file mode 100644
index a71c20f0e0..0000000000
--- a/meta-python/recipes-devtools/python/python3-itsdangerous_0.24.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-inherit pypi setuptools3
-require python-itsdangerous.inc
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-compression \
-"
diff --git a/meta-python/recipes-devtools/python/python3-itsdangerous_2.1.2.bb b/meta-python/recipes-devtools/python/python3-itsdangerous_2.1.2.bb
new file mode 100644
index 0000000000..5af1d594b3
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-itsdangerous_2.1.2.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Various helpers to pass trusted data to untrusted environments and back."
+HOMEPAGE = "http://github.com/mitsuhiko/itsdangerous"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=4cda9a0ebd516714f360b0e9418cfb37"
+
+SRC_URI[sha256sum] = "5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"
+
+inherit pypi setuptools3
+
+CLEANBROKEN = "1"
+
+RDEPENDS:${PN} += " \
+ python3-simplejson \
+ python3-netclient \
+ python3-compression \
+ python3-json \
+"
diff --git a/meta-python/recipes-devtools/python/python3-janus_1.0.0.bb b/meta-python/recipes-devtools/python/python3-janus_1.0.0.bb
new file mode 100644
index 0000000000..c709bcfbff
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-janus_1.0.0.bb
@@ -0,0 +1,15 @@
+SUMMARY = "Mixed sync-async queue to interoperate between asyncio tasks and classic threads"
+SECTION = "devel/python"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=23878c357ebb4c8ce1109be365043349"
+
+SRC_URI[sha256sum] = "df976f2cdcfb034b147a2d51edfc34ff6bfb12d4e2643d3ad0e10de058cb1612"
+
+inherit pypi python_setuptools_build_meta
+
+RDEPENDS:${PN} += "\
+ python3-asyncio \
+ python3-threading \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-javaobj-py3_0.2.4.bb b/meta-python/recipes-devtools/python/python3-javaobj-py3_0.2.4.bb
deleted file mode 100644
index 0ec23ba991..0000000000
--- a/meta-python/recipes-devtools/python/python3-javaobj-py3_0.2.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-javaobj-py3.inc
-inherit setuptools3
diff --git a/meta-python/recipes-devtools/python/python-javaobj-py3.inc b/meta-python/recipes-devtools/python/python3-javaobj-py3_0.4.4.bb
index a0e802ca7b..d71101ee2c 100644
--- a/meta-python/recipes-devtools/python/python-javaobj-py3.inc
+++ b/meta-python/recipes-devtools/python/python3-javaobj-py3_0.4.4.bb
@@ -5,11 +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://javaobj.py;beginline=21;endline=33;md5=8b504419ce78f8133b21b4d4a89ef7e9"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d273d63619c9aeaf15cdaf76422c4f87"
-SRC_URI[md5sum] = "f669bb8099380e3dd84db3d542aa5b68"
-SRC_URI[sha256sum] = "b8b0d310fd97e1c7914d7911ee9d3f4b3d84d2a674aa95a4b0da3d8f155fc1bb"
+SRC_URI[sha256sum] = "e4e3257ef2cf81a3339787a4d5cf924e54c91f095a723f6d2584dae61d4396ed"
-inherit pypi
+inherit pypi setuptools3
BBCLASSEXTEND = "native nativesdk"
+
+RDEPENDS:${PN} += " \
+ python3-compression \
+ python3-logging \
+"
diff --git a/meta-python/recipes-devtools/python/python3-jdatetime_5.0.0.bb b/meta-python/recipes-devtools/python/python3-jdatetime_5.0.0.bb
new file mode 100644
index 0000000000..f1dd368ea0
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-jdatetime_5.0.0.bb
@@ -0,0 +1,17 @@
+DESCRIPTION = "Jalali implementation of Python's datetime module"
+HOMEPAGE = "https://github.com/slashmili/python-jalali"
+LICENSE = "Python-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=c80be45b33471b4a23cf53d06a8172be"
+
+SRC_URI[sha256sum] = "2cc603d913c0d8e328928454d3d295261cb037e9950227f67c9629ab4710fdf9"
+
+PYPI_PACKAGE = "jdatetime"
+
+inherit pypi setuptools3
+
+CLEANBROKEN = "1"
+
+RDEPENDS:${PN} += " \
+ python3-modules \
+"
+
diff --git a/meta-python/recipes-devtools/python/python3-jdcal/run-ptest b/meta-python/recipes-devtools/python/python3-jdcal/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-jdcal/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+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
new file mode 100644
index 0000000000..afabe14a8a
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-jdcal_1.4.1.bb
@@ -0,0 +1,28 @@
+SUMMARY = "This module contains functions for converting between Julian dates and calendar dates"
+DESCRIPTION = "A function for converting Gregorian calendar dates to Julian dates, \
+and another function for converting Julian calendar dates to Julian dates are defined. \
+Two functions for the reverse calculations are also defined."
+
+HOMEPAGE = "https://github.com/phn/jdcal"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=bd236e1f590973467a427bb354be0f46"
+
+inherit pypi setuptools3 ptest
+
+SRC_URI[md5sum] = "e05bdb60fa80f25bc60e73e0c6b7c5dc"
+SRC_URI[sha256sum] = "472872e096eb8df219c23f2689fc336668bdb43d194094b5cc1707e1640acfc8"
+
+RDEPENDS:${PN} += "python3-compression python3-io python3-pprint python3-shell"
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ cp -f ${S}/test_jdcal.py ${D}${PTEST_PATH}/
+}
diff --git a/meta-python/recipes-devtools/python/python3-jedi_0.19.1.bb b/meta-python/recipes-devtools/python/python3-jedi_0.19.1.bb
new file mode 100644
index 0000000000..56395c3b5d
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-jedi_0.19.1.bb
@@ -0,0 +1,19 @@
+SUMMARY = "An autocompletion tool for Python that can be used for text editors."
+HOMEPAGE = "https://github.com/davidhalter/jedi"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=5ed06eebfcb244cd66ebf6cef9c23ab4"
+
+PYPI_PACKAGE = "jedi"
+
+SRC_URI[sha256sum] = "cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"
+
+RDEPENDS:${PN} = " \
+ python3-parso \
+ python3-core \
+ python3-compression \
+ python3-pydoc \
+ python3-compile \
+ python3-json \
+"
+
+inherit setuptools3 pypi
diff --git a/meta-python/recipes-devtools/python/python3-jinja2_2.10.3.bb b/meta-python/recipes-devtools/python/python3-jinja2_2.10.3.bb
deleted file mode 100644
index 284f5f588c..0000000000
--- a/meta-python/recipes-devtools/python/python3-jinja2_2.10.3.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-inherit pypi setuptools3
-require python-jinja2.inc
-
-RDEPENDS_${PN} += "${PYTHON_PN}-asyncio"
diff --git a/meta-python/recipes-devtools/python/python3-jmespath_1.0.1.bb b/meta-python/recipes-devtools/python/python3-jmespath_1.0.1.bb
new file mode 100644
index 0000000000..73f5f4d025
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-jmespath_1.0.1.bb
@@ -0,0 +1,11 @@
+SUMMARY = "JMESPath (pronounced 'james path') allows you to declaratively specify how to extract elements from a JSON document."
+HOMEPAGE = "https://pypi.org/project/jmespath/"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=2683790f5fabb41a3f75b70558799eb4"
+
+SRC_URI[sha256sum] = "90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-math python3-json python3-numbers"
diff --git a/meta-python/recipes-devtools/python/python3-joblib_1.4.0.bb b/meta-python/recipes-devtools/python/python3-joblib_1.4.0.bb
new file mode 100644
index 0000000000..868e3f2114
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-joblib_1.4.0.bb
@@ -0,0 +1,15 @@
+SUMMARY = "Joblib is a set of tools to provide lightweight pipelining in Python."
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=2e481820abf0a70a18011a30153df066"
+
+inherit setuptools3 pypi
+
+SRC_URI[sha256sum] = "1eb0dc091919cd384490de890cb5dfd538410a6d4b3b54eef09fb8c50b409b1c"
+
+RDEPENDS:${PN} += " \
+ python3-asyncio \
+ python3-json \
+ python3-multiprocessing \
+ python3-pprint \
+ python3-pydoc \
+"
diff --git a/meta-python/recipes-devtools/python/python3-jsbeautifier_1.15.1.bb b/meta-python/recipes-devtools/python/python3-jsbeautifier_1.15.1.bb
new file mode 100644
index 0000000000..5a0e5a8499
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-jsbeautifier_1.15.1.bb
@@ -0,0 +1,19 @@
+SUMMARY = "JavaScript unobfuscator and beautifier."
+HOMEPAGE = "https://beautifier.io/"
+LICENSE = "MIT"
+SECTION = "devel/python"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=8227180126797a0148f94f483f3e1489"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "ebd733b560704c602d744eafc839db60a1ee9326e30a2a80c4adb8718adc1b24"
+
+PYPI_PACKAGE="jsbeautifier"
+
+RDEPENDS:${PN} += "\
+ python3-core \
+ python3-stringold \
+ python3-shell \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-jsmin/7a75d76c2d6bfb917f30ced8f5c0a9a4157f7819.patch b/meta-python/recipes-devtools/python/python3-jsmin/7a75d76c2d6bfb917f30ced8f5c0a9a4157f7819.patch
new file mode 100644
index 0000000000..2646e2f5a0
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-jsmin/7a75d76c2d6bfb917f30ced8f5c0a9a4157f7819.patch
@@ -0,0 +1,82 @@
+From 7a75d76c2d6bfb917f30ced8f5c0a9a4157f7819 Mon Sep 17 00:00:00 2001
+From: aekoroglu <ali.erdinc.koroglu@intel.com>
+Date: Fri, 24 Jun 2022 14:12:59 +0300
+Subject: [PATCH] DeprecationWarning invalid escape sequence fix
+
+Upstream-Status: Submitted [https://github.com/tikitu/jsmin/pull/38]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ jsmin/test.py | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+diff --git a/jsmin/test.py b/jsmin/test.py
+index 173ac65..afea4e7 100644
+--- a/jsmin/test.py
++++ b/jsmin/test.py
+@@ -337,8 +337,8 @@ def testImplicitSemicolon3(self):
+ self.assertMinified("return//comment...\r\na", "return\na")
+
+ def testSingleComment2(self):
+- self.assertMinified('x.replace(/\//, "_")// slash to underscore',
+- 'x.replace(/\//,"_")')
++ self.assertMinified('x.replace(/\\//, "_")// slash to underscore',
++ 'x.replace(/\\//,"_")')
+
+ def testSlashesNearComments(self):
+ original = '''
+@@ -383,8 +383,8 @@ def test_space_in_regex(self):
+ self.assertMinified(original, original)
+
+ def test_brackets_around_slashed_regex(self):
+- original = 'function a() { /\//.test("a") }'
+- expected = 'function a(){/\//.test("a")}'
++ original = 'function a() { /\\//.test("a") }'
++ expected = 'function a(){/\\//.test("a")}'
+ self.assertMinified(original, expected)
+
+ def test_angular_1(self):
+@@ -455,12 +455,12 @@ def testBackticksTagged(self):
+ def test_issue_bitbucket_16(self):
+ original = """
+ f = function() {
+- return /DataTree\/(.*)\//.exec(this._url)[1];
++ return /DataTree\\/(.*)\\//.exec(this._url)[1];
+ }
+ """
+ self.assertMinified(
+ original,
+- 'f=function(){return /DataTree\/(.*)\//.exec(this._url)[1];}')
++ 'f=function(){return /DataTree\\/(.*)\\//.exec(this._url)[1];}')
+
+ def test_issue_bitbucket_17(self):
+ original = "// hi\n/^(get|post|head|put)$/i.test('POST')"
+@@ -470,7 +470,7 @@ def test_issue_bitbucket_17(self):
+ def test_issue_6(self):
+ original = '''
+ respond.regex = {
+- comments: /\/\*[^*]*\*+([^/][^*]*\*+)*\//gi,
++ comments: /\\/\\*[^*]*\\*+([^/][^*]*\\*+)*\\//gi,
+ urls: 'whatever'
+ };
+ '''
+@@ -548,16 +548,16 @@ def test_issue_9_multi_comments(self):
+
+ def test_issue_12_re_nl_if(self):
+ original = '''
+- var re = /\d{4}/
++ var re = /\\d{4}/
+ if (1) { console.log(2); }'''
+ self.assertMinified(
+- original, 'var re=/\d{4}/\nif(1){console.log(2);}')
++ original, 'var re=/\\d{4}/\nif(1){console.log(2);}')
+
+ def test_issue_12_re_nl_other(self):
+ original = '''
+- var re = /\d{4}/
++ var re = /\\d{4}/
+ g = 10'''
+- self.assertMinified(original , 'var re=/\d{4}/\ng=10')
++ self.assertMinified(original , 'var re=/\\d{4}/\ng=10')
+
+ def test_preserve_copyright(self):
+ original = '''
diff --git a/meta-python/recipes-devtools/python/python3-jsmin/run-ptest b/meta-python/recipes-devtools/python/python3-jsmin/run-ptest
new file mode 100644
index 0000000000..586608d7b2
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-jsmin/run-ptest
@@ -0,0 +1,2 @@
+#!/bin/sh
+pytest -vv test.py | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}'
diff --git a/meta-python/recipes-devtools/python/python3-jsmin_3.0.1.bb b/meta-python/recipes-devtools/python/python3-jsmin_3.0.1.bb
new file mode 100644
index 0000000000..c3129e7b53
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-jsmin_3.0.1.bb
@@ -0,0 +1,23 @@
+DESCRIPTION = "JavaScript minifier."
+HOMEPAGE = "https://github.com/tikitu/jsmin/"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=3a3301ce2ad647e172f4a1016c67324d"
+
+inherit setuptools3 pypi ptest
+SRC_URI[sha256sum] = "c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5cc2bfc"
+
+BBCLASSEXTEND = "native nativesdk"
+
+SRC_URI += " \
+ file://7a75d76c2d6bfb917f30ced8f5c0a9a4157f7819.patch \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+"
+
+do_install_ptest() {
+ cp -f ${S}/jsmin/test.py ${D}${PTEST_PATH}/
+}
diff --git a/meta-python/recipes-devtools/python/python3-jsonpatch_1.24.bb b/meta-python/recipes-devtools/python/python3-jsonpatch_1.24.bb
deleted file mode 100644
index 73efceeed3..0000000000
--- a/meta-python/recipes-devtools/python/python3-jsonpatch_1.24.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-jsonpatch.inc
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
new file mode 100644
index 0000000000..4cc39a286a
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-jsonpath-rw_1.4.0.bb
@@ -0,0 +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 = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://README.rst;beginline=198;endline=215;md5=2866908485c18dc999b6c8dc608563ec"
+
+SRC_URI[sha256sum] = "05c471281c45ae113f6103d1268ec7a4831a2e96aa80de45edc89b11fac4fbec"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-decorator \
+ python3-logging \
+ python3-ply \
+ python3-six \
+"
diff --git a/meta-python/recipes-devtools/python/python3-jsonpointer_2.0.bb b/meta-python/recipes-devtools/python/python3-jsonpointer_2.0.bb
deleted file mode 100644
index 8d0a09b432..0000000000
--- a/meta-python/recipes-devtools/python/python3-jsonpointer_2.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-jsonpointer.inc
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-jsonschema_3.1.1.bb b/meta-python/recipes-devtools/python/python3-jsonschema_3.1.1.bb
deleted file mode 100644
index 9269907476..0000000000
--- a/meta-python/recipes-devtools/python/python3-jsonschema_3.1.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-jsonschema.inc
diff --git a/meta-python/recipes-devtools/python/python3-jstyleson/LICENSE b/meta-python/recipes-devtools/python/python3-jstyleson/LICENSE
new file mode 100644
index 0000000000..807babd62b
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-jstyleson/LICENSE
@@ -0,0 +1,8 @@
+The MIT License (MIT)
+Copyright (c) 2016 linjackson
+
+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-jstyleson_0.0.2.bb b/meta-python/recipes-devtools/python/python3-jstyleson_0.0.2.bb
new file mode 100644
index 0000000000..237713bf12
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-jstyleson_0.0.2.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Library to parse JSON with js-style comments."
+HOMEPAGE = "https://github.com/linjackson78/jstyleson"
+
+SRC_URI += " file://LICENSE "
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${WORKDIR}/LICENSE;md5=d97b96c7337934ee448ffd4392f32079"
+
+PYPI_PACKAGE_EXT = "tar.gz"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "680003f3b15a2959e4e6a351f3b858e3c07dd3e073a0d54954e34d8ea5e1308e"
+
+BBCLASSEXTEND = "native nativesdk"
+
+RDEPENDS:${PN} += "python3-json"
diff --git a/meta-python/recipes-devtools/python/python3-kconfiglib_10.42.0.bb b/meta-python/recipes-devtools/python/python3-kconfiglib_10.42.0.bb
deleted file mode 100644
index 10b039a75d..0000000000
--- a/meta-python/recipes-devtools/python/python3-kconfiglib_10.42.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-kconfiglib-${PV}.inc
-inherit pypi setuptools3
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
new file mode 100644
index 0000000000..b9c1c4e384
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-kconfiglib_14.1.0.bb
@@ -0,0 +1,16 @@
+DESCRIPTION = "Kconfiglib is a Kconfig implementation in Python"
+LICENSE = "ISC"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=712177a72a3937909543eda3ad1bfb7c"
+
+SRC_URI[md5sum] = "4ad68618824d4bad1d1de1d7eb838bba"
+SRC_URI[sha256sum] = "bed2cc2216f538eca4255a83a4588d8823563cdd50114f86cf1a2674e602c93c"
+
+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.6.bb b/meta-python/recipes-devtools/python/python3-keras-applications_1.0.8.bb
index d38b992d05..ba1819979b 100644
--- a/meta-python/recipes-devtools/python/python3-keras-applications_1.0.6.bb
+++ b/meta-python/recipes-devtools/python/python3-keras-applications_1.0.8.bb
@@ -4,9 +4,8 @@ SECTION = "devel/python"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=366e2fd3c9714f162d3663b6f97cfe41"
-SRC_URI = "git://github.com/keras-team/keras-applications.git"
-SRCREV ?= "61de21815728aa66377ebb2a7b4c2f5492a34dd2"
-
+SRC_URI = "git://github.com/keras-team/keras-applications.git;branch=master;protocol=https"
+SRCREV ?= "3b180cb10eda683dda7913ecee2e6487288d292d"
inherit setuptools3
@@ -14,6 +13,6 @@ S = "${WORKDIR}/git"
BBCLASSEXTEND = "native"
-RDEPENDS_${PN} = "python3-numpy \
+RDEPENDS:${PN} = "python3-numpy \
python3-h5py \
"
diff --git a/meta-python/recipes-devtools/python/python3-keras-preprocessing_1.0.5.bb b/meta-python/recipes-devtools/python/python3-keras-preprocessing_1.0.5.bb
deleted file mode 100644
index 58b8c62433..0000000000
--- a/meta-python/recipes-devtools/python/python3-keras-preprocessing_1.0.5.bb
+++ /dev/null
@@ -1,15 +0,0 @@
-SUMMARY = "Easy data preprocessing and data augmentation for deep learning models"
-HOMEPAGE = "https://github.com/keras-team/keras-preprocessing"
-SECTION = "devel/python"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=1744b320500cc2e3112964d00cce7aa4"
-
-SRC_URI = "git://github.com/keras-team/keras-preprocessing.git"
-SRCREV ?= "362fe9f8daf556151328eb5d02bd5ae638c653b8"
-
-inherit setuptools3
-
-S = "${WORKDIR}/git"
-
-BBCLASSEXTEND = "native"
-
diff --git a/meta-python/recipes-devtools/python/python3-keras-preprocessing_1.1.2.bb b/meta-python/recipes-devtools/python/python3-keras-preprocessing_1.1.2.bb
new file mode 100644
index 0000000000..749b6c8c9b
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-keras-preprocessing_1.1.2.bb
@@ -0,0 +1,16 @@
+SUMMARY = "Easy data preprocessing and data augmentation for deep learning models"
+HOMEPAGE = "https://github.com/keras-team/keras-preprocessing"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=1744b320500cc2e3112964d00cce7aa4"
+
+inherit pypi setuptools3
+
+SRC_URI[md5sum] = "d2a0e10437cfa5c2d09458a84fb58d05"
+SRC_URI[sha256sum] = "add82567c50c8bc648c14195bf544a5ce7c1f76761536956c3d2978970179ef3"
+
+PYPI_PACKAGE = "Keras_Preprocessing"
+PYPI_SRC_URI = "https://files.pythonhosted.org/packages/5e/f1/b44337faca48874333769a29398fe4666686733c8880aa160b9fd5dfe600/Keras_Preprocessing-${PV}.tar.gz"
+
+BBCLASSEXTEND = "native"
+
diff --git a/meta-python/recipes-devtools/python/python3-kivy/0001-add-support-for-glesv2.patch b/meta-python/recipes-devtools/python/python3-kivy/0001-add-support-for-glesv2.patch
new file mode 100644
index 0000000000..e38b31d34d
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-kivy/0001-add-support-for-glesv2.patch
@@ -0,0 +1,51 @@
+From 98224fec48d6e0f32b28d81220bf1ee1637ce045 Mon Sep 17 00:00:00 2001
+From: William Huang <whuang8933@gmail.com>
+Date: Thu, 2 Sep 2021 07:25:07 -0400
+Subject: [PATCH] recipes-devtools: python: add support for Kivy
+
+Upstream-Status: Pending
+
+---
+ setup.py | 16 +++++++++++++---
+ 1 file changed, 13 insertions(+), 3 deletions(-)
+
+diff --git a/setup.py b/setup.py
+index 35e34afdd..0ba3aca72 100644
+--- a/setup.py
++++ b/setup.py
+@@ -730,7 +730,18 @@ def determine_gl_flags():
+ c_options['use_x11'] = True
+ c_options['use_egl'] = True
+ else:
+- flags['libraries'] = ['GL']
++ if cross_sysroot:
++ flags['include_dirs'] = [cross_sysroot + '/usr/include']
++ flags['library_dirs'] = [cross_sysroot + '/usr/lib']
++
++ if c_options['use_opengl_es2']:
++ print("using GLESv2 libraries")
++ flags['libraries'] = ['GLESv2']
++ else:
++ flags['libraries'] = ['GL']
++
++
++ print("cross_sysroot: " + str(cross_sysroot))
+ return flags, base_flags
+
+
+@@ -774,14 +785,13 @@ def determine_sdl2():
+ sdl_inc = join(include, 'SDL2')
+ if isdir(sdl_inc):
+ sdl2_paths.append(sdl_inc)
+- sdl2_paths.extend(['/usr/local/include/SDL2', '/usr/include/SDL2'])
+
+ flags['include_dirs'] = sdl2_paths
+ flags['extra_link_args'] = []
+ flags['extra_compile_args'] = []
+ flags['library_dirs'] = (
+ sdl2_paths if sdl2_paths else
+- ['/usr/local/lib/'])
++ [''])
+
+ if kivy_sdl2_path:
+ # If we have a custom path, we need to add the rpath to the linker
diff --git a/meta-python/recipes-devtools/python/python3-kivy_2.3.0.bb b/meta-python/recipes-devtools/python/python3-kivy_2.3.0.bb
new file mode 100644
index 0000000000..991aa0f7d8
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-kivy_2.3.0.bb
@@ -0,0 +1,72 @@
+SUMMARY = "Open source Python library for rapid development of applications \
+ that make use of innovative user interfaces, such as multi-touch apps."
+HOMEPAGE = "https://kivy.org/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=6d3bc49400e35d5a2279d14c40dcfb09"
+
+inherit setuptools3 pkgconfig features_check
+
+# Kivy's setup files only look for GLES libraries for Android, iOS, RPi,
+# and mali-based OS's. We need to patch the setup file to tell Kivy setup
+# that our machine has GLES libaries installed as well
+# Also, if using SDL2 as backend, SDL2 needs to be configured with gles
+SRC_URI = "git://github.com/kivy/kivy.git;protocol=https;branch=stable \
+ file://0001-add-support-for-glesv2.patch \
+ "
+
+SRCREV = "9ef218027178115a66b417ae34b21f488bdd3617"
+
+S = "${WORKDIR}/git"
+
+PACKAGES += "${PN}-examples"
+FILES:${PN}-examples = "/usr/share/kivy-examples"
+
+USE_WAYLAND = "${@bb.utils.contains('DISTRO_FEATURES', 'wayland', '1', '0', d)}"
+export USE_WAYLAND
+
+# if using Wayland, let's use pure Wayland (and not XWayland)
+# so do not build using X11 flag when we detect Wayland
+USE_X11 = " \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'wayland', '0', \
+ bb.utils.contains('DISTRO_FEATURES', 'x11', '1', \
+ '0', d), d)}"
+export USE_X11
+
+# Use OpenGL ES 2.0 library
+KIVY_GRAPHICS = "gles"
+export KIVY_GRAPHICS
+
+KIVY_CROSS_SYSROOT="${RECIPE_SYSROOT}"
+export KIVY_CROSS_SYSROOT
+
+REQUIRED_DISTRO_FEATURES += "opengl gobject-introspection-data"
+
+ANY_OF_DISTRO_FEATURES = "x11 wayland"
+
+DEPENDS += " \
+ gstreamer1.0 \
+ gstreamer1.0-python \
+ libsdl2 \
+ libsdl2-ttf \
+ libsdl2-image \
+ libsdl2-mixer \
+ pango \
+ python3 \
+ python3-cython-native \
+"
+
+RDEPENDS:${PN} = " \
+ gstreamer1.0 \
+ gstreamer1.0-python \
+ libsdl2 \
+ libsdl2-ttf \
+ libsdl2-image \
+ libsdl2-mixer \
+ pango \
+ python3 \
+ python3-docutils \
+ python3-fcntl \
+ python3-image \
+ python3-pillow \
+ python3-pygments \
+"
diff --git a/meta-python/recipes-devtools/python/python3-kiwisolver_1.4.5.bb b/meta-python/recipes-devtools/python/python3-kiwisolver_1.4.5.bb
new file mode 100644
index 0000000000..a1949b1138
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-kiwisolver_1.4.5.bb
@@ -0,0 +1,19 @@
+SUMMARY = "A fast implementation of the Cassowary constraint solver"
+HOMEPAGE = "https://github.com/nucleic/kiwi"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=f137eeae9cf8004d06830f6ab25b2d52"
+
+SRC_URI[sha256sum] = "e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"
+
+inherit pypi python_setuptools_build_meta
+
+DEPENDS += "\
+ python3-cppy-native \
+"
+
+RDEPENDS:${PN} += "\
+ python3-core \
+ python3-setuptools \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-langtable_0.0.38.bb b/meta-python/recipes-devtools/python/python3-langtable_0.0.38.bb
deleted file mode 100644
index eb42fe978c..0000000000
--- a/meta-python/recipes-devtools/python/python3-langtable_0.0.38.bb
+++ /dev/null
@@ -1,29 +0,0 @@
-DESCRIPTION = "langtable is used to guess reasonable defaults for locale,\
-keyboard, territory"
-HOMEPAGE = "https://github.com/mike-fabian/langtable/"
-LICENSE = "GPLv3+"
-SECTION = "devel/python"
-
-LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504"
-
-S = "${WORKDIR}/git"
-B = "${S}"
-
-SRCREV = "35687ca957b746f153a6872139462b1443f8cad1"
-PV = "0.0.38+git${SRCPV}"
-SRC_URI = "git://github.com/mike-fabian/langtable.git;branch=master \
-"
-
-inherit setuptools3 python3native
-
-DISTUTILS_INSTALL_ARGS += " \
- --install-data=${datadir}/langtable"
-
-FILES_${PN} += "${datadir}/*"
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-compression \
- ${PYTHON_PN}-doctest \
- ${PYTHON_PN}-logging \
- ${PYTHON_PN}-xml \
-"
diff --git a/meta-python/recipes-devtools/python/python3-langtable_0.0.65.bb b/meta-python/recipes-devtools/python/python3-langtable_0.0.65.bb
new file mode 100644
index 0000000000..fa9edc67d4
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-langtable_0.0.65.bb
@@ -0,0 +1,23 @@
+DESCRIPTION = "langtable is used to guess reasonable defaults for locale,\
+keyboard, territory"
+HOMEPAGE = "https://github.com/mike-fabian/langtable/"
+LICENSE = "GPL-3.0-or-later"
+SECTION = "devel/python"
+
+LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504"
+
+SRC_URI[sha256sum] = "791ec5403859704e1dee4d2a056a30ec21d1e7bc040658ce62c40e0427ba4333"
+
+inherit pypi setuptools3 python3native
+
+DISTUTILS_INSTALL_ARGS += " \
+ --install-data=${datadir}/langtable"
+
+FILES:${PN} += "${datadir}/*"
+
+RDEPENDS:${PN} += " \
+ python3-compression \
+ python3-doctest \
+ python3-logging \
+ python3-xml \
+"
diff --git a/meta-python/recipes-devtools/python/python3-lazy-object-proxy_1.10.0.bb b/meta-python/recipes-devtools/python/python3-lazy-object-proxy_1.10.0.bb
new file mode 100644
index 0000000000..263c46869f
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-lazy-object-proxy_1.10.0.bb
@@ -0,0 +1,11 @@
+SUMMARY = "A fast and thorough lazy object proxy"
+HOMEPAGE = "https://python-lazy-object-proxy.readthedocs.io/"
+LICENSE = "BSD-2-Clause"
+SECTION = "devel/python"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d606e94f56c21c8e0cdde0b622dcdf57"
+
+DEPENDS += "python3-setuptools-scm-native python3-pip-native"
+
+SRC_URI[sha256sum] = "78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69"
+
+inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-lazy-object-proxy_1.3.1.bb b/meta-python/recipes-devtools/python/python3-lazy-object-proxy_1.3.1.bb
deleted file mode 100644
index 150e12fd46..0000000000
--- a/meta-python/recipes-devtools/python/python3-lazy-object-proxy_1.3.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-lazy-object-proxy.inc
diff --git a/meta-python/recipes-devtools/python/python3-lazy_1.6.bb b/meta-python/recipes-devtools/python/python3-lazy_1.6.bb
new file mode 100644
index 0000000000..97517f89a6
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-lazy_1.6.bb
@@ -0,0 +1,8 @@
+SUMMARY = "Lazy attributes are computed attributes that are evaluated only once, the first time they are used."
+
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=7df3865e8640604acfa474235d2db76b"
+
+SRC_URI[sha256sum] = "7127324ec709e8324f08cb4611c1abe01776bda53bb9ce68dc5dfa46ca0ed3e9"
+
+inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-libconf_2.0.1.bb b/meta-python/recipes-devtools/python/python3-libconf_2.0.1.bb
new file mode 100644
index 0000000000..80bc59d97b
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-libconf_2.0.1.bb
@@ -0,0 +1,13 @@
+SUMMARY = "A pure-Python libconfig reader/writer with permissive license"
+SECTION = "devel/python"
+HOMEPAGE = "https://github.com/Grk0/python-libconf"
+LICENSE = "MIT"
+
+LIC_FILES_CHKSUM = "file://LICENSE;md5=05f696c084eaaf5d75bc150f70975758"
+
+SRC_URI[md5sum] = "e212611cbf6a696e05742a983b3a0c57"
+SRC_URI[sha256sum] = "2f907258953ba60a95a82d5633726b47c81f2d5cf8d8801b092579016d757f4a"
+
+inherit pypi setuptools3
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-libevdev_0.11.bb b/meta-python/recipes-devtools/python/python3-libevdev_0.11.bb
new file mode 100644
index 0000000000..27e336710c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-libevdev_0.11.bb
@@ -0,0 +1,18 @@
+DESCRIPTION = "python-libevdev is a Python wrapper around the libevdev C library."
+HOMEPAGE = "https://gitlab.freedesktop.org/libevdev/python-libevdev"
+SECTION = "devel/python"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
+
+SRC_URI[md5sum] = "34b48098c1fba26de79a0d67a17a588a"
+SRC_URI[sha256sum] = "e9ca006a4df2488a60bd9a740011ee948d81904be2364f017e560169508f560f"
+
+inherit pypi setuptools3
+
+PYPI_PACKAGE = "libevdev"
+
+RDEPENDS:${PN} += " \
+ libevdev \
+ python3-ctypes \
+"
diff --git a/meta-python/recipes-devtools/python/python3-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
new file mode 100644
index 0000000000..af738e08ec
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-lockfile_0.12.2.bb
@@ -0,0 +1,20 @@
+# This recipe is originally from meta-openstack:
+# https://git.yoctoproject.org/cgit/cgit.cgi/meta-cloud-services/tree/meta-openstack/recipes-devtools/python/python-lockfile_0.12.2.bb
+
+SUMMARY = "Platform-independent file locking module"
+HOMEPAGE = "https://pypi.org/project/lockfile/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=2340dffbbfea534b58f1349984eeef72"
+
+SRC_URI[md5sum] = "a6a1a82957a23afdf44cfdd039b65ff9"
+SRC_URI[sha256sum] = "6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"
+
+inherit pypi setuptools3
+
+DEPENDS += "python3-distutils-extra-native python3-pbr-native"
+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
new file mode 100644
index 0000000000..97b3e72364
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-lorem_0.1.1.bb
@@ -0,0 +1,29 @@
+DESCRIPTION = "Generator for random text that looks like Latin"
+HOMEPAGE = "https://github.com/sfischer13/python-lorem"
+LICENSE = "MIT"
+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 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.16.bb b/meta-python/recipes-devtools/python/python3-lrparsing_1.0.16.bb
deleted file mode 100644
index 21a80cde1a..0000000000
--- a/meta-python/recipes-devtools/python/python3-lrparsing_1.0.16.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-lrparsing.inc
diff --git a/meta-python/recipes-devtools/python/python-lrparsing.inc b/meta-python/recipes-devtools/python/python3-lrparsing_1.0.17.bb
index d125151cd9..8cd60d3a0f 100644
--- a/meta-python/recipes-devtools/python/python-lrparsing.inc
+++ b/meta-python/recipes-devtools/python/python3-lrparsing_1.0.17.bb
@@ -1,15 +1,22 @@
SUMMARY = "Python LR parsing library"
SECTION = "devel/python"
-LICENSE = "AGPL-3.0"
+LICENSE = "AGPL-3.0-only"
LIC_FILES_CHKSUM = "file://agpl-3.0.txt;md5=73f1eb20517c55bf9493b7dd6e480788"
HOMEPAGE = "http://lrparsing.sourceforge.net/"
BUGTRACKER = "https://sourceforge.net/p/lrparsing/tickets/"
UPSTREAM_CHECK_URI = "https://sourceforge.net/projects/lrparsing/files/"
UPSTREAM_CHECK_REGEX = "lrparsing-(?P<pver>\d+(\.\d+)+)"
-SRC_URI = "${SOURCEFORGE_MIRROR}/lrparsing/lrparsing-${PV}.tar.gz"
-SRC_URI[md5sum] = "34357d69bce87654d792cd8f02d148b2"
-SRC_URI[sha256sum] = "b45afda44001dc5ba632934f74c043d40cce653f1a7526cfbcb68f6be055b8d7"
+SRC_URI = "${SOURCEFORGE_MIRROR}/lrparsing/lrparsing-${PV}.tar.gz \
+ file://0001-setup.py-use-setuptools-instead-of-distutils.patch \
+ "
+SRC_URI[sha256sum] = "7c060d9f03cf582fdbc0ae0fef0ea2ff6fd56251047ba7e425af97e23f46f582"
+
+RDEPENDS:${PN} = " \
+ python3-crypt \
+"
+
+inherit setuptools3
S = "${WORKDIR}/lrparsing-${PV}"
diff --git a/meta-python/recipes-devtools/python/python3-lru-dict_1.3.0.bb b/meta-python/recipes-devtools/python/python3-lru-dict_1.3.0.bb
new file mode 100644
index 0000000000..e9535fa6f1
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-lru-dict_1.3.0.bb
@@ -0,0 +1,11 @@
+SUMMARY = "A fixed size dict like container which evicts Least Recently Used (LRU) items once size limit is exceeded."
+HOMEPAGE = "https://github.com/amitdev/lru-dict"
+SECTION = "devel/python"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=9d10a486ee04034fdef5162fd791f153"
+
+SRC_URI[sha256sum] = "54fd1966d6bd1fcde781596cb86068214edeebff1db13a2cea11079e3fd07b6b"
+
+inherit pypi setuptools3
+
+SRC_URI += "${PYPI_SRC_URI}"
diff --git a/meta-python/recipes-devtools/python/python3-luma-core_2.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.13.0.bb b/meta-python/recipes-devtools/python/python3-luma-oled_3.13.0.bb
new file mode 100644
index 0000000000..95f066affe
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-luma-oled_3.13.0.bb
@@ -0,0 +1,19 @@
+SUMMARY = "A small library to drive an OLED device"
+DESCRIPTION = "\
+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=5ec447eb69733e20a55838de7e8cb991"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "7e2a0d6a4c968c64980255d681ec27914d9abd5a66a9019b289bf3ad050c2125"
+
+CLEANBROKEN = "1"
+
+PYPI_PACKAGE = "luma.oled"
+
+RDEPENDS:${PN} += " \
+ python3-luma-core \
+"
diff --git a/meta-python/recipes-devtools/python/python3-lxml_4.4.1.bb b/meta-python/recipes-devtools/python/python3-lxml_4.4.1.bb
deleted file mode 100644
index b95d7bae71..0000000000
--- a/meta-python/recipes-devtools/python/python3-lxml_4.4.1.bb
+++ /dev/null
@@ -1,3 +0,0 @@
-inherit setuptools3
-require python-lxml.inc
-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_4.3.3.bb b/meta-python/recipes-devtools/python/python3-lz4_4.3.3.bb
new file mode 100644
index 0000000000..746926da4e
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-lz4_4.3.3.bb
@@ -0,0 +1,34 @@
+DESCRIPTION = "python bindings for the lz4 compression library by Yann Collet"
+
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=6231efa4dd4811e62407314d90a57573"
+
+DEPENDS += " \
+ lz4 \
+ python3-setuptools-scm-native \
+ python3-pkgconfig-native \
+"
+
+SRC_URI += "file://run-ptest"
+
+SRC_URI[sha256sum] = "01fe674ef2889dbb9899d8a67361e0c4a2c833af5aeb37dd505727cf5d2a131e"
+
+inherit pkgconfig pypi python_setuptools_build_meta ptest
+
+RDEPENDS:${PN}-ptest += "\
+ python3-coverage \
+ python3-pytest \
+ python3-pytest-cov \
+ python3-pytest-runner \
+ python3-multiprocessing \
+ python3-psutil \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ cp -rf ${S}/tests/ ${D}${PTEST_PATH}/
+ # The stream API is experimental and not enabled yet, so don't ship the test suite
+ rm -rf ${D}${PTEST_PATH}/tests/stream
+}
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-m2crypto/0001-setup.py-address-openssl-3.x-build-issue.patch b/meta-python/recipes-devtools/python/python3-m2crypto/0001-setup.py-address-openssl-3.x-build-issue.patch
new file mode 100644
index 0000000000..c67e50803b
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-m2crypto/0001-setup.py-address-openssl-3.x-build-issue.patch
@@ -0,0 +1,28 @@
+From 0d824e5c2ab13e761ffaeabdccf9513d5b8f280d Mon Sep 17 00:00:00 2001
+From: Alexander Kanavin <alex@linutronix.de>
+Date: Fri, 8 Oct 2021 11:18:35 +0200
+Subject: [PATCH] setup.py: address openssl 3.x build issue
+
+swig throws:
+| /home/alex/development/poky/build-metaoe/tmp/work/x86_64-linux/python3-m2crypto-native/0.38.0-r0/recipe-sysroot-native/usr/include/openssl/macros.h:155: Error: CPP #error ""OPENSSL_API_COMPAT expresses an impossible API compatibility level"". Use the -cpperraswarn option to continue swig processing.
+
+I'm not sure why; upstream should take a look.
+
+Upstream-Status: Inappropriate [workaround]
+Signed-off-by: Alexander Kanavin <alex@linutronix.de>
+---
+ setup.py | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/setup.py b/setup.py
+index 2c65404..74704bc 100644
+--- a/setup.py
++++ b/setup.py
+@@ -192,6 +192,7 @@ class _M2CryptoBuildExt(build_ext.build_ext):
+
+ self.swig_opts.append('-includeall')
+ self.swig_opts.append('-modern')
++ self.swig_opts.append('-cpperraswarn')
+ self.swig_opts.append('-builtin')
+
+ # These two lines are a workaround for
diff --git a/meta-python/recipes-devtools/python/python-m2crypto/0001-setup.py-link-in-sysroot-not-in-host-directories.patch b/meta-python/recipes-devtools/python/python3-m2crypto/0001-setup.py-link-in-sysroot-not-in-host-directories.patch
index b339d93f75..0baadfcaa5 100644
--- a/meta-python/recipes-devtools/python/python-m2crypto/0001-setup.py-link-in-sysroot-not-in-host-directories.patch
+++ b/meta-python/recipes-devtools/python/python3-m2crypto/0001-setup.py-link-in-sysroot-not-in-host-directories.patch
@@ -5,24 +5,22 @@ Subject: [PATCH] setup.py: link in sysroot, not in host directories
Signed-off-by: Koen Kooi <koen@dominion.thruhere.net>
-Upstream-status: Unknown
+Upstream-Status: Pending [Unknown]
---
setup.py | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
-Index: M2Crypto-0.30.1/setup.py
-===================================================================
---- M2Crypto-0.30.1.orig/setup.py
-+++ M2Crypto-0.30.1/setup.py
-@@ -130,6 +130,7 @@ class _M2CryptoBuildExt(build_ext.build_
+--- a/setup.py
++++ b/setup.py
+@@ -135,6 +135,7 @@ class _M2CryptoBuildExt(build_ext.build_
self.set_undefined_options('build', ('bundledlls', 'bundledlls'))
self.libraries = ['ssl', 'crypto']
+ self.openssl = os.environ.get( "STAGING_DIR" )
if sys.platform == 'win32':
self.libraries = ['ssleay32', 'libeay32']
- if self.openssl and openssl_version(self.openssl, 0x10100000, True):
-@@ -150,8 +151,8 @@ class _M2CryptoBuildExt(build_ext.build_
+ if self.openssl and openssl_version(self.openssl,
+@@ -159,8 +160,8 @@ class _M2CryptoBuildExt(build_ext.build_
if self.openssl is not None:
log.debug('self.openssl = %s', self.openssl)
diff --git a/meta-python/recipes-devtools/python/python3-m2crypto/avoid-host-contamination.patch b/meta-python/recipes-devtools/python/python3-m2crypto/avoid-host-contamination.patch
new file mode 100644
index 0000000000..3cd6f7c276
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-m2crypto/avoid-host-contamination.patch
@@ -0,0 +1,23 @@
+Filter out '/usr/include' for swig to avoid host contamination issue.
+
+Upstream-Status: Inappropriate [cross compile specific]
+
+Signed-off-by: Kai Kang <kai.kang@windriver.com>
+---
+ setup.py | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/setup.py b/setup.py
+index 5a12981..389d49f 100644
+--- a/setup.py
++++ b/setup.py
+@@ -153,7 +153,8 @@ class _M2CryptoBuildExt(build_ext.build_ext):
+ self.swig_opts.append('-py3')
+
+ # swig seems to need the default header file directories
+- self.swig_opts.extend(['-I%s' % i for i in _get_additional_includes()])
++ self.swig_opts.extend(['-I%s' % i for i in _get_additional_includes()
++ if i != '/usr/include'])
+
+ log.debug('self.include_dirs = %s', self.include_dirs)
+ log.debug('self.library_dirs = %s', self.library_dirs)
diff --git a/meta-python/recipes-devtools/python/python-m2crypto/cross-compile-platform.patch b/meta-python/recipes-devtools/python/python3-m2crypto/cross-compile-platform.patch
index 4b64f4613c..77ef7e557e 100644
--- a/meta-python/recipes-devtools/python/python-m2crypto/cross-compile-platform.patch
+++ b/meta-python/recipes-devtools/python/python3-m2crypto/cross-compile-platform.patch
@@ -4,11 +4,9 @@ since it pokes at the system for getting architecture values
Upstream-Status: Inappropriate
Signed-off-by: Khem Raj <raj.khem@gmail.com>
-Index: M2Crypto-0.30.1/setup.py
-===================================================================
---- M2Crypto-0.30.1.orig/setup.py
-+++ M2Crypto-0.30.1/setup.py
-@@ -160,22 +160,6 @@ class _M2CryptoBuildExt(build_ext.build_
+--- a/setup.py
++++ b/setup.py
+@@ -169,24 +169,6 @@ class _M2CryptoBuildExt(build_ext.build_
log.debug('self.include_dirs = %s', self.include_dirs)
log.debug('self.library_dirs = %s', self.library_dirs)
@@ -27,6 +25,8 @@ Index: M2Crypto-0.30.1/setup.py
- self.swig_opts.append('-D%s' % arch)
- if mach in ('ppc64le', 'ppc64el'):
- self.swig_opts.append('-D_CALL_ELF=2')
+- if mach in ('arm64_be'):
+- self.swig_opts.append('-D__AARCH64EB__')
-
self.swig_opts.extend(['-I%s' % i for i in self.include_dirs])
diff --git a/meta-python/recipes-devtools/python/python3-m2crypto_0.30.1.bb b/meta-python/recipes-devtools/python/python3-m2crypto_0.30.1.bb
deleted file mode 100644
index 4d63d4bd3a..0000000000
--- a/meta-python/recipes-devtools/python/python3-m2crypto_0.30.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-m2crypto.inc
diff --git a/meta-python/recipes-devtools/python/python3-m2crypto_0.40.1.bb b/meta-python/recipes-devtools/python/python3-m2crypto_0.40.1.bb
new file mode 100644
index 0000000000..1d8c22d196
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-m2crypto_0.40.1.bb
@@ -0,0 +1,51 @@
+SUMMARY = "A Python crypto and SSL toolkit"
+HOMEPAGE = "https://gitlab.com/m2crypto/m2crypto"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENCE;md5=b0e1f0b7d0ce8a62c18b1287b991800e"
+
+FILESEXTRAPATHS:prepend := "${THISDIR}/python-m2crypto:"
+
+SRC_URI += "file://0001-setup.py-link-in-sysroot-not-in-host-directories.patch \
+ file://cross-compile-platform.patch \
+ file://avoid-host-contamination.patch \
+ file://0001-setup.py-address-openssl-3.x-build-issue.patch \
+ "
+SRC_URI[sha256sum] = "bbfd113ec55708c05816252a4f09e4237df4f3bbfc8171cbbc33057d257bbb30"
+
+PYPI_PACKAGE = "M2Crypto"
+inherit pypi siteinfo setuptools3
+
+DEPENDS += "openssl swig-native"
+RDEPENDS:${PN} += "\
+ python3-datetime \
+ python3-setuptools \
+ python3-logging \
+ python3-netclient \
+ python3-netserver \
+ python3-numbers \
+ python3-xmlrpc \
+"
+
+DISTUTILS_BUILD_ARGS += "build_ext --openssl=${STAGING_EXECPREFIXDIR} -I${STAGING_INCDIR}"
+DISTUTILS_INSTALL_ARGS += "build_ext --openssl=${STAGING_EXECPREFIXDIR}"
+
+SWIG_FEATURES ?= "-D__${HOST_ARCH}__ ${@['-D__ILP32__','-D__LP64__'][d.getVar('SITEINFO_BITS') != '32']} -DOPENSSL_NO_FILENAMES"
+
+SWIG_FEATURES:append:riscv64 = " -D__SIZEOF_POINTER__=${SITEINFO_BITS}/8 -D__riscv_xlen=${SITEINFO_BITS}"
+SWIG_FEATURES:append:riscv32 = " -D__SIZEOF_POINTER__=${SITEINFO_BITS}/8 -D__riscv_xlen=${SITEINFO_BITS}"
+SWIG_FEATURES:append:mipsarch = " -D_MIPS_SZPTR=${SITEINFO_BITS}"
+SWIG_FEATURES:append:powerpc64le = " -D__powerpc64__"
+SWIG_FEATURES:append:x86 = " -D__i386__"
+SWIG_FEATURES:append:x32 = " -D__ILP32__"
+
+export SWIG_FEATURES
+
+export STAGING_DIR
+
+do_install:append() {
+ rm -f ${D}${PYTHON_SITEPACKAGES_DIR}/M2Crypto/SSL/__pycache__/*.cpython-*.pyc
+ rm -f ${D}${PYTHON_SITEPACKAGES_DIR}/M2Crypto/__pycache__/*.cpython-*.pyc
+}
+
+BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python3-markdown_3.0.1.bb b/meta-python/recipes-devtools/python/python3-markdown_3.0.1.bb
deleted file mode 100644
index b6d2f18c81..0000000000
--- a/meta-python/recipes-devtools/python/python3-markdown_3.0.1.bb
+++ /dev/null
@@ -1,12 +0,0 @@
-SUMMARY = "A Python implementation of John Gruber's Markdown."
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE.md;md5=745aaad0c69c60039e638bff9ffc59ed"
-
-inherit pypi setuptools3
-
-PYPI_PACKAGE = "Markdown"
-PYPI_SRC_URI = "https://files.pythonhosted.org/packages/3c/52/7bae9e99a7a4be6af4a713fe9b692777e6468d28991c54c273dfb6ec9fb2/Markdown-${PV}.tar.gz"
-SRC_URI[md5sum] = "72219f46ca440b657bf227500731bdf1"
-SRC_URI[sha256sum] = "d02e0f9b04c500cde6637c11ad7c72671f359b87b9fe924b2383649d8841db7c"
-
-BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python3-markupsafe_1.1.1.bb b/meta-python/recipes-devtools/python/python3-markupsafe_1.1.1.bb
deleted file mode 100644
index 765e3c906b..0000000000
--- a/meta-python/recipes-devtools/python/python3-markupsafe_1.1.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-markupsafe.inc
diff --git a/meta-python/recipes-devtools/python/python3-marshmallow/run-ptest b/meta-python/recipes-devtools/python/python3-marshmallow/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-marshmallow/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-marshmallow_3.21.1.bb b/meta-python/recipes-devtools/python/python3-marshmallow_3.21.1.bb
new file mode 100644
index 0000000000..bf1d8dd290
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-marshmallow_3.21.1.bb
@@ -0,0 +1,38 @@
+SUMMARY = "Simplified object serialization in python"
+DESCRIPTION = "Marshmallow is an ORM/ODM/framework-agnostic library for converting complex datatypes, such as objects, to and from native Python datatypes."
+HOMEPAGE = "https://github.com/marshmallow-code/marshmallow"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "\
+ file://LICENSE;md5=27586b20700d7544c06933afe56f7df4 \
+ file://docs/license.rst;md5=13da439ad060419fb7cf364523017cfb"
+
+SRC_URI[sha256sum] = "4e65e9e0d80fc9e609574b9983cf32579f305c718afb30d7233ab818571768c3"
+
+inherit python_flit_core pypi ptest
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-pytz \
+ python3-simplejson \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ rm -rf ${S}/tests/mypy_test_cases
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+RDEPENDS:${PN} += " \
+ python3-compression \
+ python3-datetime \
+ python3-email \
+ python3-json \
+ python3-numbers \
+ python3-pprint \
+ python3-packaging \
+"
diff --git a/meta-python/recipes-devtools/python/python3-matplotlib-inline_0.1.6.bb b/meta-python/recipes-devtools/python/python3-matplotlib-inline_0.1.6.bb
new file mode 100644
index 0000000000..13210b9060
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-matplotlib-inline_0.1.6.bb
@@ -0,0 +1,8 @@
+SUMMARY = "Inline Matplotlib backend for Jupyter"
+HOMEPAGE = "https://pypi.org/project/matplotlib-inline/"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d4692a0eb42ca54892399db2cb35e61e"
+
+SRC_URI[sha256sum] = "f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"
+
+inherit pypi
diff --git a/meta-python/recipes-devtools/python/python3-matplotlib/matplotlib-disable-download.patch b/meta-python/recipes-devtools/python/python3-matplotlib/matplotlib-disable-download.patch
new file mode 100644
index 0000000000..aea8f62ea7
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-matplotlib/matplotlib-disable-download.patch
@@ -0,0 +1,75 @@
+Disable automatic downloading of components!
+
+Upstream-Status: Inappropriate [disable feature]
+
+Signed-off-by: Mark Hatle <mark.hatle@xilinx.com>
+
+Update patch to fit on 3.7.2.
+
+Signed-off-by: Trevor Gamblin <tgamblin@baylibre.com>
+
+diff --git a/setup.py b/setup.py
+index 0bea13fa6f..f39d8fc871 100644
+--- a/setup.py
++++ b/setup.py
+@@ -327,13 +327,7 @@ setup( # Finally, pass this all along to setuptools to do the heavy lifting.
+ "pillow>=6.2.0",
+ "pyparsing>=2.3.1,<3.1",
+ "python-dateutil>=2.7",
+- ] + (
+- # Installing from a git checkout that is not producing a wheel.
+- ["setuptools_scm>=7"] if (
+- Path(__file__).with_name(".git").exists() and
+- os.environ.get("CIBUILDWHEEL", "0") != "1"
+- ) else []
+- ),
++ ],
+ extras_require={
+ ':python_version<"3.10"': [
+ "importlib-resources>=3.2.0",
+diff --git a/setupext.py b/setupext.py
+index a898d642d6..474172ff8f 100644
+--- a/setupext.py
++++ b/setupext.py
+@@ -66,40 +66,7 @@ def get_from_cache_or_download(url, sha):
+ BytesIO
+ The file loaded into memory.
+ """
+- cache_dir = _get_xdg_cache_dir()
+-
+- if cache_dir is not None: # Try to read from cache.
+- try:
+- data = (cache_dir / sha).read_bytes()
+- except IOError:
+- pass
+- else:
+- if _get_hash(data) == sha:
+- return BytesIO(data)
+-
+- # jQueryUI's website blocks direct downloads from urllib.request's
+- # default User-Agent, but not (for example) wget; so I don't feel too
+- # bad passing in an empty User-Agent.
+- with urllib.request.urlopen(
+- urllib.request.Request(url, headers={"User-Agent": ""}),
+- context=_get_ssl_context()) as req:
+- data = req.read()
+-
+- file_sha = _get_hash(data)
+- if file_sha != sha:
+- raise Exception(
+- f"The downloaded file does not match the expected sha. {url} was "
+- f"expected to have {sha} but it had {file_sha}")
+-
+- if cache_dir is not None: # Try to cache the downloaded file.
+- try:
+- cache_dir.mkdir(parents=True, exist_ok=True)
+- with open(cache_dir / sha, "xb") as fout:
+- fout.write(data)
+- except IOError:
+- pass
+-
+- return BytesIO(data)
++ raise IOError(f"Automatic downloading is disabled.")
+
+
+ def get_and_extract_tarball(urls, sha, dirname):
diff --git a/meta-python/recipes-devtools/python/python3-matplotlib_3.1.1.bb b/meta-python/recipes-devtools/python/python3-matplotlib_3.1.1.bb
deleted file mode 100644
index 9b86ccc831..0000000000
--- a/meta-python/recipes-devtools/python/python3-matplotlib_3.1.1.bb
+++ /dev/null
@@ -1,17 +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"
-LICENSE = "BSD-2-Clause"
-LIC_FILES_CHKSUM = "file://LICENSE/LICENSE;md5=afec61498aa5f0c45936687da9a53d74"
-
-DEPENDS = "python3-numpy-native python3-numpy freetype libpng python3-dateutil python3-pytz"
-RDEPENDS_${PN} = "python3-numpy freetype libpng python3-dateutil python3-pytz"
-
-SRC_URI[md5sum] = "f894af5564a588e880644123237251b7"
-SRC_URI[sha256sum] = "1febd22afe1489b13c6749ea059d392c03261b2950d1d45c17e3aed812080c93"
-
-PYPI_PACKAGE = "matplotlib"
-inherit pypi setuptools3
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.7.0.bb b/meta-python/recipes-devtools/python/python3-mccabe_0.7.0.bb
new file mode 100644
index 0000000000..5304917842
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-mccabe_0.7.0.bb
@@ -0,0 +1,13 @@
+DESCRIPTION = "McCabe checker, plugin for flake8"
+HOMEPAGE = "https://github.com/PyCQA/mccabe"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=a489dc62bacbdad3335c0f160a974f0f"
+
+SRC_URI[sha256sum] = "348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"
+
+inherit pypi setuptools3
+
+DEPENDS += "python3-pytest-runner-native"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-meld3_1.0.2.bb b/meta-python/recipes-devtools/python/python3-meld3_1.0.2.bb
deleted file mode 100644
index f695916291..0000000000
--- a/meta-python/recipes-devtools/python/python3-meld3_1.0.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-meld3.inc
diff --git a/meta-python/recipes-devtools/python/python-meld3.inc b/meta-python/recipes-devtools/python/python3-meld3_2.0.1.bb
index d4e274e608..7ebf9f1411 100644
--- a/meta-python/recipes-devtools/python/python-meld3.inc
+++ b/meta-python/recipes-devtools/python/python3-meld3_2.0.1.bb
@@ -5,11 +5,15 @@ template markup and dynamic rendering logic separate from one \
another. See http://www.entrian.com/PyMeld for a treatise on the \
benefits of this pattern."
HOMEPAGE = "https://github.com/supervisor/meld3"
-LICENSE = "BSD"
+LICENSE = "BSD-4-Clause"
LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=9e7581cef5645475fcefebdc15ed7abf"
-SRC_URI[md5sum] = "3ccc78cd79cffd63a751ad7684c02c91"
-SRC_URI[sha256sum] = "f7b754a0fde7a4429b2ebe49409db240b5699385a572501bb0d5627d299f9558"
+SRC_URI[md5sum] = "1add16caefc9e6b82ef4f40532cb4918"
+SRC_URI[sha256sum] = "3ea266994f1aa83507679a67b493b852c232a7905e29440a6b868558cad5e775"
-PYPI_PACKAGE = "meld3"
-inherit pypi
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-cgitb \
+ python3-xml \
+"
diff --git a/meta-python/recipes-devtools/python/python3-mock_5.1.0.bb b/meta-python/recipes-devtools/python/python3-mock_5.1.0.bb
new file mode 100644
index 0000000000..d9ecb9d4c8
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-mock_5.1.0.bb
@@ -0,0 +1,19 @@
+DESCRIPTION = "A Python Mocking and Patching Library for Testing"
+HOMEPAGE = "https://pypi.python.org/pypi/mock"
+SECTION = "devel/python"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=de9dfbf780446b18aab11f00baaf5b7e"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-cmd2 \
+ python3-mccabe \
+ python3-pep8 \
+ python3-prettytable \
+ python3-pyflakes \
+ python3-pyparsing \
+ python3-unittest \
+"
+
+SRC_URI[sha256sum] = "5e96aad5ccda4718e0a229ed94b2024df75cc2d55575ba5762d31f5767b8767d"
diff --git a/meta-python/recipes-devtools/python/python3-monotonic_1.5.bb b/meta-python/recipes-devtools/python/python3-monotonic_1.6.bb
index 94b90524b0..aacc32a6d6 100644
--- a/meta-python/recipes-devtools/python/python3-monotonic_1.5.bb
+++ b/meta-python/recipes-devtools/python/python3-monotonic_1.6.bb
@@ -1,9 +1,13 @@
SUMMARY = "This module provides a monotonic() function which returns the value (in fractional seconds) of a clock which never goes backwards."
HOMEPAGE = "https://github.com/atdt/monotonic"
+SECTION = "devel/python"
+
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE;md5=d2794c0df5b907fdace235a619d80314"
-SRC_URI[md5sum] = "9f81cb0e5966479754453dea2b6822f4"
-SRC_URI[sha256sum] = "23953d55076df038541e648a53676fb24980f7a1be290cdda21300b3bc21dfb0"
+SRCREV = "80681f6604e136e513550342f977edb98f5fc5ad"
+SRC_URI = "git://github.com/atdt/monotonic.git;branch=master;protocol=https"
+
+S = "${WORKDIR}/git"
-inherit pypi setuptools3
+inherit setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-more-itertools_7.2.0.bb b/meta-python/recipes-devtools/python/python3-more-itertools_7.2.0.bb
deleted file mode 100644
index 28ddf88fb8..0000000000
--- a/meta-python/recipes-devtools/python/python3-more-itertools_7.2.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-more-itertools.inc
diff --git a/meta-python/recipes-devtools/python/python3-moteus/0001-lib-python-remove-self-import-from-setup.py.patch b/meta-python/recipes-devtools/python/python3-moteus/0001-lib-python-remove-self-import-from-setup.py.patch
new file mode 100644
index 0000000000..10acd7b8c1
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-moteus/0001-lib-python-remove-self-import-from-setup.py.patch
@@ -0,0 +1,32 @@
+From 7490ac4629c7fe0dc329647e6e000d4bc13c610d Mon Sep 17 00:00:00 2001
+From: Richard Leitner <dev@g0hl1n.net>
+Date: Wed, 24 Jan 2024 00:49:45 +0100
+Subject: [PATCH] lib: python: remove self-import from setup.py
+
+Importing moteus itself within the setup.py creates some kind of a
+chicken-and-egg problem. Furthermore it isn't used anywhere within
+setup.py. Therefore remove the corresponding import.
+
+Signed-off-by: Richard Leitner <dev@g0hl1n.net>
+
+Upstream-Status: Backport [https://github.com/mjbots/moteus/commit/7490ac4629c7fe0dc329647e6e000d4bc13c610d]
+---
+ setup.py | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/setup.py b/setup.py
+index 2731685..6c6064d 100644
+--- a/setup.py
++++ b/setup.py
+@@ -17,8 +17,6 @@
+ import setuptools
+ import pathlib
+
+-import moteus
+-
+ here = pathlib.Path(__file__).parent.resolve()
+
+ # Get the long description from the README file
+--
+2.40.1
+
diff --git a/meta-python/recipes-devtools/python/python3-moteus_0.3.67.bb b/meta-python/recipes-devtools/python/python3-moteus_0.3.67.bb
new file mode 100644
index 0000000000..3c93ee44ff
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-moteus_0.3.67.bb
@@ -0,0 +1,19 @@
+SUMMARY = "moteus brushless controller library and tools"
+HOMEPAGE = "https://github.com/mjbots/moteus"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://setup.py;beginline=3;endline=9;md5=24025d3c660abfc62a83f0e709a45e76"
+
+inherit pypi setuptools3
+
+SRC_URI += "file://0001-lib-python-remove-self-import-from-setup.py.patch"
+
+SRC_URI[sha256sum] = "a2122f20f59b8962057cf8d3fb583e0aa19006eaf2cde49e30027a4d1b8bf925"
+
+S = "${WORKDIR}/moteus-${PV}"
+
+RDEPENDS:${PN} += "\
+ python3-can \
+ python3-importlib-metadata \
+ python3-pyelftools \
+ python3-pyserial \
+"
diff --git a/meta-python/recipes-devtools/python/python3-mpmath_1.3.0.bb b/meta-python/recipes-devtools/python/python3-mpmath_1.3.0.bb
new file mode 100644
index 0000000000..236fbd85bc
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-mpmath_1.3.0.bb
@@ -0,0 +1,19 @@
+# This recipe is adapted from one in meta-jupyter:
+# https://github.com/Xilinx/meta-jupyter/blob/master/recipes-python/python3-mpmath_0.19.bb
+
+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=bde3c575382996b75d85702949512751"
+
+SRC_URI[sha256sum] = "7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"
+
+inherit pypi setuptools3
+
+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
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-msgpack/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-msgpack_0.6.2.bb b/meta-python/recipes-devtools/python/python3-msgpack_0.6.2.bb
deleted file mode 100644
index 096d7ddcb8..0000000000
--- a/meta-python/recipes-devtools/python/python3-msgpack_0.6.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-msgpack.inc
-inherit setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-msgpack_1.0.7.bb b/meta-python/recipes-devtools/python/python3-msgpack_1.0.7.bb
new file mode 100644
index 0000000000..5180301f7b
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-msgpack_1.0.7.bb
@@ -0,0 +1,27 @@
+SUMMARY = "MessagePack (de)serializer"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://COPYING;md5=cd9523181d9d4fbf7ffca52eaa2a5751"
+
+inherit pypi setuptools3 ptest
+
+SRC_URI[sha256sum] = "572efc93db7a4d27e404501975ca6d2d9775705c2d922390d878fcf768d92c87"
+
+RDEPENDS:${PN}:class-target += "\
+ python3-io \
+"
+
+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}/test/* ${D}${PTEST_PATH}/test/
+}
diff --git a/meta-python/recipes-devtools/python/python3-msk_0.3.13.bb b/meta-python/recipes-devtools/python/python3-msk_0.3.13.bb
deleted file mode 100644
index 3f2aaf48d6..0000000000
--- a/meta-python/recipes-devtools/python/python3-msk_0.3.13.bb
+++ /dev/null
@@ -1,11 +0,0 @@
-SUMMARY = "A tool to help with creating, uploading, and upgrading Mycroft skills on the skills repo."
-HOMEPAGE = "https://github.com/MycroftAI/mycroft-skills-kit"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://README.md;md5=2f90e43663eddf1c33087419fbb35e28"
-
-SRC_URI[md5sum] = "11d9fc865ef627efe68f25fc113974e8"
-SRC_URI[sha256sum] = "55be86ff2cd0087016759f2b15b40861cda2a8d8a8d0c669fdacdf32a77a10da"
-
-inherit pypi setuptools3
-
-RDEPENDS_${PN} += "python3-git"
diff --git a/meta-python/recipes-devtools/python/python3-msk_0.4.0.bb b/meta-python/recipes-devtools/python/python3-msk_0.4.0.bb
new file mode 100644
index 0000000000..8fa2c62cc4
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-msk_0.4.0.bb
@@ -0,0 +1,10 @@
+SUMMARY = "A tool to help with creating, uploading, and upgrading Mycroft skills on the skills repo."
+HOMEPAGE = "https://github.com/MycroftAI/mycroft-skills-kit"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://README.md;md5=f518abfcfc3935b1f0ec8f2332cb30d3"
+
+SRC_URI[sha256sum] = "f698f193112a8628e776e67b89a95c3f78095857c045dd9cde4cf915a5fbdd80"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-git"
diff --git a/meta-python/recipes-devtools/python/python3-msm_0.8.8.bb b/meta-python/recipes-devtools/python/python3-msm_0.8.8.bb
new file mode 100644
index 0000000000..966ff86dee
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-msm_0.8.8.bb
@@ -0,0 +1,28 @@
+SUMMARY = "Mycroft Skill Manager, in python!"
+HOMEPAGE = "https://github.com/MycroftAI/mycroft-skills-manager"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e23fadd6ceef8c618fc1c65191d846fa"
+
+SRC_URI[md5sum] = "cf1fc0d1d86af68003cae53c71ec6288"
+SRC_URI[sha256sum] = "a502aee54917cd394217b31c977a1ba3d9541a0120e0a045c49fd77b328e4a29"
+
+inherit pypi setuptools3
+
+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() {
+ # Stop this from being installed
+ rm -rf ${D}/usr/share
+}
diff --git a/meta-python/recipes-devtools/python/python3-multidict/run-ptest b/meta-python/recipes-devtools/python/python3-multidict/run-ptest
new file mode 100644
index 0000000000..d74acaf564
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-multidict/run-ptest
@@ -0,0 +1,2 @@
+#!/bin/sh
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-multidict_4.5.2.bb b/meta-python/recipes-devtools/python/python3-multidict_4.5.2.bb
deleted file mode 100644
index 57167f219d..0000000000
--- a/meta-python/recipes-devtools/python/python3-multidict_4.5.2.bb
+++ /dev/null
@@ -1,9 +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=e74c98abe0de8f798ca609137f9cef4a"
-
-inherit pypi setuptools3
-
-SRC_URI[md5sum] = "5e9d8f7e1ada9a22932aed6a72f88e43"
-SRC_URI[sha256sum] = "024b8129695a952ebd93373e45b5d341dbb87c17ce49637b34000093f243dd4f"
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..b12e180d02
--- /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 setuptools3 ptest
+
+PV .= "+git"
+
+SRCREV = "a9b281b2ef4ab25d95d6b268aa88c428e75c3696"
+PYPI_SRC_URI = "git://github.com/aio-libs/multidict;branch=master;protocol=https"
+S = "${WORKDIR}/git"
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ 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_1.0.0.bb b/meta-python/recipes-devtools/python/python3-mypy-extensions_1.0.0.bb
new file mode 100644
index 0000000000..4c431431c2
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-mypy-extensions_1.0.0.bb
@@ -0,0 +1,12 @@
+SUMMARY = "Experimental type system extensions for programs checked with the mypy typechecker"
+HOMEPAGE = "https://github.com/python/mypy_extensions"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=0fe3219e2470a78c0d1837019b8b426e"
+
+PYPI_PACKAGE = "mypy_extensions"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"
+
+BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python3-mypy_1.9.0.bb b/meta-python/recipes-devtools/python/python3-mypy_1.9.0.bb
new file mode 100644
index 0000000000..e51264f8a9
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-mypy_1.9.0.bb
@@ -0,0 +1,23 @@
+SUMMARY = "Optional static typing for Python 3 and 2 (PEP 484)"
+HOMEPAGE = "https://github.com/python/mypy"
+LICENSE = "MIT & Python-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=8d62fd8f8648cb018e52857347e340b9"
+
+inherit pypi python_setuptools_build_meta
+
+SRC_URI[sha256sum] = "3cc5da0127e6a478cddd906068496a97a7618a21ce9b54bde5bf7e539c7af974"
+
+BBCLASSEXTEND = "native"
+
+DEPENDS += " \
+ python3-mypy-extensions-native \
+ python3-types-psutil-native \
+ python3-types-setuptools-native \
+ python3-typing-extensions-native \
+"
+
+RDEPENDS:${PN} += " \
+ python3-modules \
+ python3-mypy-extensions \
+ python3-typing-extensions \
+"
diff --git a/meta-python/recipes-devtools/python/python3-natsort_8.4.0.bb b/meta-python/recipes-devtools/python/python3-natsort_8.4.0.bb
new file mode 100644
index 0000000000..206e322fbd
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-natsort_8.4.0.bb
@@ -0,0 +1,11 @@
+SUMMARY = "Simple yet flexible natural sorting in Python."
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d32431d1b650010945da4e078011c8fa"
+
+PYPI_PACKAGE = "natsort"
+SRC_URI[sha256sum] = "45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} = "python3-fastnumbers python3-icu"
diff --git a/meta-python/recipes-devtools/python/python3-ndg-httpsclient_0.5.1.bb b/meta-python/recipes-devtools/python/python3-ndg-httpsclient_0.5.1.bb
deleted file mode 100644
index 65a8c816f4..0000000000
--- a/meta-python/recipes-devtools/python/python3-ndg-httpsclient_0.5.1.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-inherit pypi setuptools3 update-alternatives
-require python-ndg-httpsclient.inc
-
-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.7.19.bb b/meta-python/recipes-devtools/python/python3-netaddr_0.7.19.bb
deleted file mode 100644
index 30416a4ffe..0000000000
--- a/meta-python/recipes-devtools/python/python3-netaddr_0.7.19.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-netaddr.inc
-inherit setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-netaddr_1.2.1.bb b/meta-python/recipes-devtools/python/python3-netaddr_1.2.1.bb
new file mode 100644
index 0000000000..bedf0dab01
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-netaddr_1.2.1.bb
@@ -0,0 +1,25 @@
+SUMMARY = "A network address manipulation library for Python."
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=8afa43eca873b71d5d85dd0be1f707fa"
+
+SRC_URI[sha256sum] = "6eb8fedf0412c6d294d06885c110de945cf4d22d2b510d0404f4e06950857987"
+
+inherit pypi python_setuptools_build_meta ptest
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/netaddr/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+do_install_ptest:append:libc-musl () {
+ sed -i -e "/--automake/ s/$/ -k 'not test_strategy_ipv6'/" ${D}${PTEST_PATH}/run-ptest
+}
diff --git a/meta-python/recipes-devtools/python/python3-netifaces/0001-netifaces-initialize-msghdr-in-a-portable-way.patch b/meta-python/recipes-devtools/python/python3-netifaces/0001-netifaces-initialize-msghdr-in-a-portable-way.patch
new file mode 100644
index 0000000000..7ff86cc8be
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-netifaces/0001-netifaces-initialize-msghdr-in-a-portable-way.patch
@@ -0,0 +1,49 @@
+From cbcd19f38ae4b31c57c57ce3619b8d2674defb68 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Sun, 28 Aug 2022 08:11:27 -0700
+Subject: [PATCH] netifaces: initialize msghdr in a portable way
+
+musl has padding bytes inside the msghdr struct which means initializing
+full structure will cause wrong assignments, doing partial assignment is
+more portable and assign the elements after that
+
+Fixes
+netifaces.c:1808:9: error: incompatible pointer to integer conversion initializing 'int' with an expression of type 'void *' [-Wint-conversion]
+ NULL,
+ ^~~~
+
+Upstream-Status: Inappropriate [Upstream Repo is read-only]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ netifaces.c | 15 ++++++---------
+ 1 file changed, 6 insertions(+), 9 deletions(-)
+
+diff --git a/netifaces.c b/netifaces.c
+index 839c42c..7da78e7 100644
+--- a/netifaces.c
++++ b/netifaces.c
+@@ -1800,15 +1800,12 @@ gateways (PyObject *self)
+ do {
+ struct sockaddr_nl sanl_from;
+ struct iovec iov = { msgbuf, bufsize };
+- struct msghdr msghdr = {
+- &sanl_from,
+- sizeof(sanl_from),
+- &iov,
+- 1,
+- NULL,
+- 0,
+- 0
+- };
++ struct msghdr msghdr = { 0 };
++
++ msghdr.msg_name = &sanl_from;
++ msghdr.msg_namelen = sizeof(sanl_from);
++ msghdr.msg_iov = &iov;
++ msghdr.msg_iovlen = 1;
+ int nllen;
+
+ ret = recvmsg (s, &msghdr, 0);
+--
+2.37.2
+
diff --git a/meta-python/recipes-devtools/python/python3-netifaces_0.11.0.bb b/meta-python/recipes-devtools/python/python3-netifaces_0.11.0.bb
new file mode 100644
index 0000000000..f211c69543
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-netifaces_0.11.0.bb
@@ -0,0 +1,11 @@
+DESCRIPTION = "Portable network interface information for Python"
+SECTION = "devel/python"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=a53cbc7cb75660694e138ba973c148df"
+
+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.3.bb b/meta-python/recipes-devtools/python/python3-networkx_2.3.bb
deleted file mode 100644
index 8feb6daa32..0000000000
--- a/meta-python/recipes-devtools/python/python3-networkx_2.3.bb
+++ /dev/null
@@ -1,8 +0,0 @@
-require python-networkx.inc
-
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=b68290ee1026b204170a23bbdb27a4fd"
-
-SRC_URI[md5sum] = "320d3f6c7872732baa63cedafddadea9"
-SRC_URI[sha256sum] = "8311ddef63cf5c5c5e7c1d0212dd141d9a1fe3f474915281b73597ed5f1d4e3d"
-
-inherit setuptools3
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.6.0.bb b/meta-python/recipes-devtools/python/python3-nmap_1.6.0.bb
new file mode 100644
index 0000000000..5fe9ab4e39
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-nmap_1.6.0.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 = "MIT"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
+
+DEPENDS += "python3-wheel-native"
+
+PYPI_PACKAGE = "python3-nmap"
+
+SRC_URI[sha256sum] = "892b5091cde429fabfb8ba63382b2db8fd795193ba147558d0a7d5534c956255"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "nmap \
+ python3-requests \
+ python3-simplejson \
+"
diff --git a/meta-python/recipes-devtools/python/python3-nocasedict_2.0.1.bb b/meta-python/recipes-devtools/python/python3-nocasedict_2.0.1.bb
new file mode 100644
index 0000000000..5a29858177
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-nocasedict_2.0.1.bb
@@ -0,0 +1,12 @@
+SUMMARY = "A case-insensitive ordered dictionary for Python"
+HOMEPAGE = "https://github.com/pywbem/nocasedict"
+LICENSE = "LGPL-2.1-only"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=1803fa9c2c3ce8cb06b4861d75310742"
+
+SRC_URI[sha256sum] = "960cb699f1209da80ac39e3ab50aa7342fe8ca9f70606c23447a510550435e50"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-six \
+"
diff --git a/meta-python/recipes-devtools/python/python3-nocaselist_2.0.0.bb b/meta-python/recipes-devtools/python/python3-nocaselist_2.0.0.bb
new file mode 100644
index 0000000000..2ad42247d9
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-nocaselist_2.0.0.bb
@@ -0,0 +1,12 @@
+SUMMARY = "A case-insensitive list for Python"
+HOMEPAGE = "https://nocaselist.readthedocs.io/en/latest/"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327"
+
+SRC_URI[sha256sum] = "456aa000c6777c5d21b029c52e532f94328d4fb4f15ad2a4dd3dd62db30b3892"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-six \
+"
diff --git a/meta-python/recipes-devtools/python/python3-ntplib_0.3.3.bb b/meta-python/recipes-devtools/python/python3-ntplib_0.3.3.bb
deleted file mode 100644
index 93df83ad3c..0000000000
--- a/meta-python/recipes-devtools/python/python3-ntplib_0.3.3.bb
+++ /dev/null
@@ -1,14 +0,0 @@
-DESCRIPTION = "This module offers a simple interface to query NTP servers from Python."
-SECTION = "devel/python"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://ntplib.py;beginline=1;endline=23;md5=afa07338a9595257e94c205c3e72224d"
-
-SRCNAME = "ntplib"
-SRC_URI[md5sum] = "c7cc8e9b09f40c84819859d70b7784ca"
-SRC_URI[sha256sum] = "c4621b64d50be9461d9bd9a71ba0b4af06fbbf818bbd483752d95c1a4e273ede"
-
-S = "${WORKDIR}/${SRCNAME}-${PV}"
-
-inherit setuptools3 python3native pypi
-
-RDEPENDS_${PN} += "${PYTHON_PN}-datetime"
diff --git a/meta-python/recipes-devtools/python/python3-ntplib_0.4.0.bb b/meta-python/recipes-devtools/python/python3-ntplib_0.4.0.bb
new file mode 100644
index 0000000000..d0a8d7a823
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-ntplib_0.4.0.bb
@@ -0,0 +1,11 @@
+DESCRIPTION = "This module offers a simple interface to query NTP servers from Python."
+HOMEPAGE = "https://github.com/cf-natali/ntplib"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=40707636fe237d725e2bd32cd949b7fe"
+
+SRC_URI[sha256sum] = "899d8fb5f8c2555213aea95efca02934c7343df6ace9d7628a5176b176906267"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-datetime python3-io"
diff --git a/meta-python/recipes-devtools/python/python3-oauthlib_2.0.6.bb b/meta-python/recipes-devtools/python/python3-oauthlib_2.0.6.bb
deleted file mode 100644
index da13b55d8a..0000000000
--- a/meta-python/recipes-devtools/python/python3-oauthlib_2.0.6.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-oauthlib.inc
diff --git a/meta-python/recipes-devtools/python/python3-oauthlib_3.2.2.bb b/meta-python/recipes-devtools/python/python3-oauthlib_3.2.2.bb
new file mode 100644
index 0000000000..833fdbcc58
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-oauthlib_3.2.2.bb
@@ -0,0 +1,22 @@
+SUMMARY = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic"
+HOMEPAGE = "https://github.com/idan/oauthlib"
+
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=abd2675e944a2011aed7e505290ba482"
+
+SRC_URI[sha256sum] = "9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"
+
+inherit pypi setuptools3
+
+# The following configs & dependencies are from setuptools extras_require.
+# These dependencies are optional, hence can be controlled via PACKAGECONFIG.
+# The upstream names may not correspond exactly to bitbake package names.
+#
+# Uncomment this line to enable all the optional features.
+#PACKAGECONFIG ?= "test signedtoken signals rsa"
+PACKAGECONFIG[test] = ",,,python3-blinker python3-cryptography python3-pytest python3-pyjwt"
+PACKAGECONFIG[signedtoken] = ",,,python3-cryptography python3-pyjwt"
+PACKAGECONFIG[signals] = ",,,python3-blinker"
+PACKAGECONFIG[rsa] = ",,,python3-cryptography"
+
+RDEPENDS:${PN} += "python3-core python3-crypt python3-datetime python3-json python3-logging python3-math python3-netclient python3-unittest"
diff --git a/meta-python/recipes-devtools/python/python3-obd_0.7.1.bb b/meta-python/recipes-devtools/python/python3-obd_0.7.1.bb
deleted file mode 100644
index 578e38d3a5..0000000000
--- a/meta-python/recipes-devtools/python/python3-obd_0.7.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-obd.inc
diff --git a/meta-python/recipes-devtools/python/python3-obd_0.7.2.bb b/meta-python/recipes-devtools/python/python3-obd_0.7.2.bb
new file mode 100644
index 0000000000..cf3daae6ac
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-obd_0.7.2.bb
@@ -0,0 +1,9 @@
+DESCRIPTION = "A python module for handling realtime sensor data from OBD-II vehicle ports"HOMEPAGE = "https://github.com/brendan-w/python-OBD"
+LICENSE = "GPL-2.0-only"
+LIC_FILES_CHKSUM = "file://README.md;md5=176d0f9ad45c10895296260d426fa862"
+
+SRC_URI[sha256sum] = "20d38c9ded3daad1e8affab3ff367a70788d4f29ac77ab7aacddc6a6d2a43d61"
+
+inherit setuptools3 pypi
+
+RDEPENDS:${PN} += "python3-pyserial python3-pint python3-setuptools python3-packaging"
diff --git a/meta-python/recipes-devtools/python/python3-objectpath_0.6.1.bb b/meta-python/recipes-devtools/python/python3-objectpath_0.6.1.bb
new file mode 100644
index 0000000000..6e82dc13b9
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-objectpath_0.6.1.bb
@@ -0,0 +1,9 @@
+DESCRIPTION = "The agile NoSQL query language for semi-structured data"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=a53cbc7cb75660694e138ba973c148df"
+
+DEPENDS += "dtc-native"
+
+SRC_URI[sha256sum] = "461263136c79292e42431fbb85cdcaac4c6a256f6b1aa5b3ae9316e4965ad819"
+
+inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-olefile_0.47.bb b/meta-python/recipes-devtools/python/python3-olefile_0.47.bb
new file mode 100644
index 0000000000..bb6fa7a8cc
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-olefile_0.47.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Python package to parse, read and write Microsoft OLE2 files"
+HOMEPAGE = "https://github.com/decalage2/olefile"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=f18814bd70fd28e11a4545145dcb3822"
+
+SRC_URI[sha256sum] = "599383381a0bf3dfbd932ca0ca6515acd174ed48870cbf7fee123d698c192c1c"
+
+inherit pypi setuptools3
+
+PYPI_PACKAGE = "olefile"
+PYPI_PACKAGE_EXT = "zip"
+
+RDEPENDS:${PN} += "\
+ python3-core \
+ python3-datetime \
+ python3-logging \
+"
diff --git a/meta-python/recipes-devtools/python/python3-oletools_0.60.1.bb b/meta-python/recipes-devtools/python/python3-oletools_0.60.1.bb
new file mode 100644
index 0000000000..fbb7955d6f
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-oletools_0.60.1.bb
@@ -0,0 +1,11 @@
+SUMMARY = "Python tools to analyze security characteristics of MS Office and OLE files"
+HOMEPAGE = "https://github.com/decalage2/olefile"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=d7dd4b0d1f7153322a546e89b5a0a632"
+
+SRC_URI[sha256sum] = "67a796da4c4b8e2feb9a6b2495bef8798a3323a75512de4e5669d9dc9d1fae31"
+
+inherit pypi setuptools3
+
+PYPI_PACKAGE = "oletools"
+PYPI_PACKAGE_EXT = "zip"
diff --git a/meta-python/recipes-devtools/python/python3-openpyxl_3.1.2.bb b/meta-python/recipes-devtools/python/python3-openpyxl_3.1.2.bb
new file mode 100644
index 0000000000..4a3254cc53
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-openpyxl_3.1.2.bb
@@ -0,0 +1,23 @@
+SUMMARY = "openpyxl is a Python library to read/write Excel 2010 xlsx/xlsm/xltx/xltm files"
+DESCRIPTION = "It was born from lack of existing library to read/write natively \
+from Python the Office Open XML format. All kudos to the PHPExcel team as openpyxl \
+was initially based on PHPExcel."
+
+HOMEPAGE = "http://www.python-excel.org/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=8227180126797a0148f94f483f3e1489"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "a6f5977418eff3b2d5500d54d9db50c8277a368436f4e4f8ddb1be3422870184"
+
+RDEPENDS:${PN} += "\
+ python3-compression \
+ python3-io \
+ python3-pprint \
+ python3-shell \
+ python3-jdcal \
+ python3-et-xmlfile \
+ python3-numbers \
+ python3-xml \
+"
diff --git a/meta-python/recipes-devtools/python/python3-ordered-set/run-ptest b/meta-python/recipes-devtools/python/python3-ordered-set/run-ptest
new file mode 100644
index 0000000000..64799ba008
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-ordered-set/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake test_ordered_set.py
diff --git a/meta-python/recipes-devtools/python/python3-ordered-set_3.0.1.bb b/meta-python/recipes-devtools/python/python3-ordered-set_3.0.1.bb
deleted file mode 100644
index 662d3eebb3..0000000000
--- a/meta-python/recipes-devtools/python/python3-ordered-set_3.0.1.bb
+++ /dev/null
@@ -1,11 +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] = "a8059c7b99cde0f8dda01ddee6b43c2c"
-SRC_URI[sha256sum] = "3d6fd7bffbb15f613a9e8a6281bf97c2d67f7bb8677deca8249df2fbdd9cce7b"
-
-inherit pypi setuptools3
-
-DEPENDS += "python3-pytest-runner-native"
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-packaging_19.2.bb b/meta-python/recipes-devtools/python/python3-packaging_19.2.bb
deleted file mode 100644
index aa20fb26f9..0000000000
--- a/meta-python/recipes-devtools/python/python3-packaging_19.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-packaging.inc
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.7.bb b/meta-python/recipes-devtools/python/python3-padatious_0.4.7.bb
deleted file mode 100644
index 4abe7c7474..0000000000
--- a/meta-python/recipes-devtools/python/python3-padatious_0.4.7.bb
+++ /dev/null
@@ -1,9 +0,0 @@
-SUMMARY = "An efficient and agile neural network intent parser. Padatious is a core component of Mycroft AI."
-HOMEPAGE = "https://github.com/MycroftAI/padatious"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://README.md;md5=77baec496a458dd0e0fc4ca64cd305bc"
-
-SRC_URI[md5sum] = "1f53967a1633baa8fd48f11139808a33"
-SRC_URI[sha256sum] = "3c235942ff4151a3c36536fd776bd8a6d4d57c97046723d2fa80a89b34faac1f"
-
-inherit pypi setuptools3
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
new file mode 100644
index 0000000000..fef6376ef7
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-padatious_0.4.8.bb
@@ -0,0 +1,17 @@
+SUMMARY = "An efficient and agile neural network intent parser. Padatious is a core component of Mycroft AI."
+HOMEPAGE = "https://github.com/MycroftAI/padatious"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://README.md;md5=cc85c733dffe81e8a7fde2e8f8a6a404"
+
+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.4.0.bb b/meta-python/recipes-devtools/python/python3-paho-mqtt_1.4.0.bb
deleted file mode 100644
index 4981e61ed8..0000000000
--- a/meta-python/recipes-devtools/python/python3-paho-mqtt_1.4.0.bb
+++ /dev/null
@@ -1,3 +0,0 @@
-inherit setuptools3
-require python-paho-mqtt.inc
-
diff --git a/meta-python/recipes-devtools/python/python3-paho-mqtt_2.0.0.bb b/meta-python/recipes-devtools/python/python3-paho-mqtt_2.0.0.bb
new file mode 100644
index 0000000000..e4cf77a134
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-paho-mqtt_2.0.0.bb
@@ -0,0 +1,37 @@
+SUMMARY = "MQTT version 3.1/3.1.1 client library"
+LICENSE = "EPL-1.0 | EDL-1.0"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=8e5f264c6988aec56808a3a11e77b913 \
+ file://edl-v10;md5=c09f121939f063aeb5235972be8c722c \
+"
+SRCNAME = "paho-mqtt"
+
+inherit pypi python_hatchling python_setuptools_build_meta
+
+SRC_URI[sha256sum] = "13b205f29251e4f2c66a6c923c31fc4fd780561e03b2d775cff8e4f2915cf947"
+
+PYPI_SRC_URI = "https://files.pythonhosted.org/packages/73/b7/a4df0f93bbdae237e16ba402752151eceee576cbe80c235a2475fbf81eea/paho_mqtt-${PV}.tar.gz"
+
+S = "${WORKDIR}/paho_mqtt-${PV}"
+
+DEPENDS += "python3-pytest-runner-native"
+
+do_install:append() {
+ install -d -m0755 ${D}${datadir}/${BPN}/examples
+ cp --preserve=mode,timestamps -R ${S}/examples/* ${D}${datadir}/${BPN}/examples
+}
+
+PACKAGES =+ "${PN}-examples"
+
+RDEPENDS:${PN}-examples += "${PN} python3-core"
+
+FILES:${PN}-examples = "${datadir}/${BPN}/examples"
+
+RDEPENDS:${PN} = "\
+ python3-io \
+ python3-logging \
+ python3-math \
+ python3-netclient \
+ python3-threading \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-pako_0.3.1.bb b/meta-python/recipes-devtools/python/python3-pako_0.3.1.bb
new file mode 100644
index 0000000000..046e6571ea
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pako_0.3.1.bb
@@ -0,0 +1,20 @@
+SUMMARY = "The universal package manager library"
+HOMEPAGE = "https://github.com/MycroftAI/pako"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e23fadd6ceef8c618fc1c65191d846fa"
+
+SRC_URI[sha256sum] = "c033a073bb818ca336ae1fccba2655bd60dfe77744f85d4517abd3160d72231f"
+
+inherit pypi setuptools3
+
+do_install:append() {
+ rm -rf ${D}${prefix}/pako/LICENSE
+ rm -rf ${D}${prefix}/pako
+}
+
+RDEPENDS:${PN} += " \
+ python3-appdirs \
+ python3-io \
+ python3-json \
+ python3-logging \
+"
diff --git a/meta-python/recipes-devtools/python/python3-pandas_0.23.4.bb b/meta-python/recipes-devtools/python/python3-pandas_0.23.4.bb
deleted file mode 100644
index b5dd5e0924..0000000000
--- a/meta-python/recipes-devtools/python/python3-pandas_0.23.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-pandas.inc
diff --git a/meta-python/recipes-devtools/python/python3-pandas_2.0.3.bb b/meta-python/recipes-devtools/python/python3-pandas_2.0.3.bb
new file mode 100644
index 0000000000..91e76d9919
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pandas_2.0.3.bb
@@ -0,0 +1,38 @@
+SUMMARY = "pandas library for high-performance data analysis tools"
+DESCRIPTION = "pandas is an open source, BSD-licensed library providing \
+high-performance, easy-to-use data structures and data analysis tools for \
+the Python programming language."
+HOMEPAGE = "http://pandas.pydata.org/"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=cb819092901ddb13a7d0a4f5e05f098a"
+
+SRC_URI[sha256sum] = "c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c"
+
+inherit pypi setuptools3
+
+DEPENDS += " \
+ python3-cython-native \
+ python3-numpy-native \
+ python3-versioneer-native \
+"
+
+PACKAGESPLITFUNCS =+ "fix_cythonized_sources"
+
+fix_cythonized_sources() {
+ for f in `grep -l -r -e '\/* Generated by Cython.*/$' ${PKGD}${TARGET_DBGSRC_DIR}`; do
+ if [ -e $f ]; then
+ sed -i -e 's#${RECIPE_SYSROOT_NATIVE}##g' $f
+ fi
+ done
+}
+
+CFLAGS:append:toolchain-clang = " -Wno-error=deprecated-declarations"
+
+RDEPENDS:${PN} += " \
+ python3-json \
+ python3-numpy \
+ python3-dateutil \
+ python3-dateutil-zoneinfo \
+ python3-pytz \
+ python3-profile \
+"
diff --git a/meta-python/recipes-devtools/python/python3-parallax_1.0.6.bb b/meta-python/recipes-devtools/python/python3-parallax_1.0.6.bb
new file mode 100644
index 0000000000..1fc967d953
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-parallax_1.0.6.bb
@@ -0,0 +1,13 @@
+SUMMARY = "Execute commands and copy files over SSH to multiple machines at once."
+HOMEPAGE = "https://github.com/krig/parallax/"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://COPYING;md5=52c67ffa6102f288a0347f8c5802fd18"
+
+SRC_URI[md5sum] = "e312397b083426af84db7076dc2a28d7"
+SRC_URI[sha256sum] = "c16703202ff67aed4740c0727df304abe9f3e7851e653533b24de21b338d9081"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-fcntl python3-threading python3-unixadmin"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-paramiko_3.4.0.bb b/meta-python/recipes-devtools/python/python3-paramiko_3.4.0.bb
new file mode 100644
index 0000000000..0d32d361cf
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-paramiko_3.4.0.bb
@@ -0,0 +1,20 @@
+DESCRIPTION = "The leading native Python SSHv2 protocol library."
+HOMEPAGE = "https://github.com/paramiko/paramiko/"
+LICENSE = "LGPL-2.1-only"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=fd0120fc2e9f841c73ac707a30389af5"
+
+SRC_URI[sha256sum] = "aac08f26a31dc4dffd92821527d1682d99d52f9ef6851968114a8728f3c274d3"
+
+PYPI_PACKAGE = "paramiko"
+
+inherit pypi setuptools3
+
+CLEANBROKEN = "1"
+
+RDEPENDS:${PN} += " \
+ python3-bcrypt \
+ python3-cryptography \
+ python3-logging \
+ python3-pynacl \
+ python3-unixadmin \
+"
diff --git a/meta-python/recipes-devtools/python/python3-parse-type/run-ptest b/meta-python/recipes-devtools/python/python3-parse-type/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-parse-type/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-parse-type_0.4.2.bb b/meta-python/recipes-devtools/python/python3-parse-type_0.4.2.bb
deleted file mode 100644
index 91d9ce2d43..0000000000
--- a/meta-python/recipes-devtools/python/python3-parse-type_0.4.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-parse-type.inc
diff --git a/meta-python/recipes-devtools/python/python3-parse-type_0.6.2.bb b/meta-python/recipes-devtools/python/python3-parse-type_0.6.2.bb
new file mode 100644
index 0000000000..a7d8cd86ce
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-parse-type_0.6.2.bb
@@ -0,0 +1,25 @@
+SUMMARY = "Simplifies building parse types based on the parse module"
+HOMEPAGE = "https://github.com/jenisys/parse_type"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=2e469278ace89c246d52505acc39c3da"
+
+SRC_URI[sha256sum] = "79b1f2497060d0928bc46016793f1fca1057c4aacdf15ef876aa48d75a73a355"
+
+PYPI_PACKAGE = "parse_type"
+inherit pypi ptest setuptools3
+
+RDEPENDS:${PN} += "python3-parse"
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
diff --git a/meta-python/recipes-devtools/python/python3-parse/run-ptest b/meta-python/recipes-devtools/python/python3-parse/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-parse/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-parse_1.20.1.bb b/meta-python/recipes-devtools/python/python3-parse_1.20.1.bb
new file mode 100644
index 0000000000..d2b91b3f30
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-parse_1.20.1.bb
@@ -0,0 +1,27 @@
+SUMMARY = "Parse strings using a specification based on the Python format() syntax"
+HOMEPAGE = "https://github.com/r1chardj0n3s/parse"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=8ab458ad281b60e6f1b39b3feafbfc05"
+
+SRC_URI[sha256sum] = "09002ca350ad42e76629995f71f7b518670bcf93548bdde3684fd55d2be51975"
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+inherit pypi python_setuptools_build_meta ptest
+
+RDEPENDS:${PN} += "\
+ python3-datetime \
+ python3-logging \
+ python3-numbers \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ cp -f ${S}/tests/test*.py ${D}${PTEST_PATH}/
+}
diff --git a/meta-python/recipes-devtools/python/python3-parse_1.8.4.bb b/meta-python/recipes-devtools/python/python3-parse_1.8.4.bb
deleted file mode 100644
index b1242545cc..0000000000
--- a/meta-python/recipes-devtools/python/python3-parse_1.8.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-parse.inc
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.4.bb b/meta-python/recipes-devtools/python/python3-parso_0.8.4.bb
new file mode 100644
index 0000000000..176bf6f277
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-parso_0.8.4.bb
@@ -0,0 +1,16 @@
+SUMMARY = "A Python Parser"
+HOMEPAGE = "https://github.com/davidhalter/parso"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=cbaa2675b2424d771451332a7a69503f"
+
+PYPI_PACKAGE = "parso"
+
+SRC_URI[sha256sum] = "eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"
+
+inherit setuptools3 pypi
+
+RDEPENDS:${PN} = " \
+ python3-crypt \
+ python3-difflib \
+ python3-logging \
+"
diff --git a/meta-python/recipes-devtools/python/python3-passlib_1.7.1.bb b/meta-python/recipes-devtools/python/python3-passlib_1.7.1.bb
deleted file mode 100644
index 18180a07ab..0000000000
--- a/meta-python/recipes-devtools/python/python3-passlib_1.7.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-passlib.inc \ No newline at end of file
diff --git a/meta-python/recipes-devtools/python/python-passlib.inc b/meta-python/recipes-devtools/python/python3-passlib_1.7.4.bb
index 9e477ecf9f..8b66e25922 100644
--- a/meta-python/recipes-devtools/python/python-passlib.inc
+++ b/meta-python/recipes-devtools/python/python3-passlib_1.7.4.bb
@@ -5,15 +5,17 @@ implementations of over 30 password hashing algorithms, as well as a framework f
managing existing password hashes. It’s designed to be useful for a wide range of \
tasks, from verifying a hash found in /etc/shadow, to providing full-strength password \
hashing for multi-user applications."
-HOMEPAGE = "https://bitbucket.org/ecollins/passlib"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=73eed1a5470b969951dac411086c7036"
+HOMEPAGE = "https://foss.heptapod.net/python-libs/passlib/wikis/home"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=c8449c5e10474d113ab787ed2753bafe"
-SRC_URI[md5sum] = "254869dae3fd9f09f0746a3cb29a0b15"
-SRC_URI[sha256sum] = "3d948f64138c25633613f303bcc471126eae67c04d5e3f6b7b8ce6242f8653e0"
+SRC_URI[md5sum] = "3a229cbd00dfb33e99885b43325e0591"
+SRC_URI[sha256sum] = "defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c4152ebe04"
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-crypt \
- ${PYTHON_PN}-logging \
- ${PYTHON_PN}-netclient \
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "\
+ python3-crypt \
+ python3-logging \
+ python3-netclient \
"
diff --git a/meta-python/recipes-devtools/python/python3-pastedeploy_3.1.0.bb b/meta-python/recipes-devtools/python/python3-pastedeploy_3.1.0.bb
new file mode 100644
index 0000000000..27f32bf1af
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pastedeploy_3.1.0.bb
@@ -0,0 +1,21 @@
+SUMMARY = "Load, configure, and compose WSGI applications and servers"
+HOMEPAGE = "https://pylonsproject.org/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://license.txt;md5=1798f29d55080c60365e6283cb49779c"
+
+inherit pypi
+PYPI_PACKAGE = "PasteDeploy"
+
+SRC_URI[sha256sum] = "9ddbaf152f8095438a9fe81f82c78a6714b92ae8e066bed418b6a7ff6a095a95"
+
+S = "${WORKDIR}/PasteDeploy-${PV}"
+
+inherit setuptools3
+
+# Uncomment this line to enable all the optional features.
+#PACKAGECONFIG ?= "paste docs"
+PACKAGECONFIG[paste] = ",,,python3-paste"
+PACKAGECONFIG[docs] = ",,,python3-sphinx python3-pylons-sphinx-themes"
+
+DEPENDS= "python3 python3-setuptools-scm-native python3-pytest-runner-native"
+RDEPENDS:${PN} += "python3-core python3-misc python3-netclient python3-pkgutil python3-setuptools python3-threading python3-core"
diff --git a/meta-python/recipes-devtools/python/python3-path/run-ptest b/meta-python/recipes-devtools/python/python3-path/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-path/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-path_16.14.0.bb b/meta-python/recipes-devtools/python/python3-path_16.14.0.bb
new file mode 100644
index 0000000000..b4d290a230
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-path_16.14.0.bb
@@ -0,0 +1,34 @@
+SUMMARY = "A module wrapper for os.path"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=141643e11c48898150daa83802dbc65f"
+
+SRC_URI[sha256sum] = "dbaaa7efd4602fd6ba8d82890dc7823d69e5de740a6e842d9919b0faaf2b6a8e"
+
+SRC_URI += "\
+ file://run-ptest \
+"
+
+inherit pypi python_setuptools_build_meta ptest
+
+DEPENDS += "python3-setuptools-scm-native"
+
+RDEPENDS:${PN} += " \
+ python3-appdirs \
+ python3-crypt \
+ python3-io \
+ python3-numbers \
+ python3-shell \
+"
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+BBCLASSEXTEND = "nativesdk native"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/test
+ cp -rf ${S}/test_* ${D}${PTEST_PATH}/test/
+ install -d ${D}${PTEST_PATH}/path
+ cp -rf ${S}/path/* ${D}${PTEST_PATH}/path/
+}
diff --git a/meta-python/recipes-devtools/python/python3-pathlib2_2.3.4.bb b/meta-python/recipes-devtools/python/python3-pathlib2_2.3.4.bb
deleted file mode 100644
index 66f71e57a4..0000000000
--- a/meta-python/recipes-devtools/python/python3-pathlib2_2.3.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-pathlib2.inc
diff --git a/meta-python/recipes-devtools/python/python3-pathtools3_0.2.1.bb b/meta-python/recipes-devtools/python/python3-pathtools3_0.2.1.bb
new file mode 100644
index 0000000000..644f7b119d
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pathtools3_0.2.1.bb
@@ -0,0 +1,10 @@
+SUMMARY = "Filesystem events monitoring"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=56bd93578433bb99b4fdf7ff481722df"
+
+SRC_URI[sha256sum] = "630c1edc09ef93abea40fc06b10067e5734d8f38cc85867bc61d1a5c9eb7796f"
+
+inherit pypi setuptools3
+
+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.1.8.bb b/meta-python/recipes-devtools/python/python3-pdm-backend_2.1.8.bb
new file mode 100644
index 0000000000..f1f507243e
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pdm-backend_2.1.8.bb
@@ -0,0 +1,13 @@
+SUMMARY = "The build backend used by PDM that supports latest packaging standards"
+HOMEPAGE = "https://github.com/pdm-project/pdm-backend"
+LICENSE = "MIT"
+SECTION = "devel/python"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=4a564297b3c5b629a528b92fd8ff61ea"
+
+SRC_URI[sha256sum] = "2487dfbd13f69d80fb4e6a08006a3ee68272833970813047dc5fcfacdfdc0151"
+
+inherit pypi python_setuptools_build_meta
+
+PYPI_PACKAGE= "pdm_backend"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-pdm_2.14.0.bb b/meta-python/recipes-devtools/python/python3-pdm_2.14.0.bb
new file mode 100644
index 0000000000..011ba5b3dd
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pdm_2.14.0.bb
@@ -0,0 +1,15 @@
+SUMMARY = "A modern Python package and dependency manager supporting the latest PEP standards"
+HOMEPAGE = "https://pdm-project.org/latest/"
+LICENSE = "MIT"
+SECTION = "devel/python"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=2eb31a2cc1a758c34b499f287dd04ef2"
+
+SRC_URI[sha256sum] = "7ae6c4b5518085a703e0824ab10cbc3b7246b599ef07b8c4dcb2af1e42859190"
+
+inherit pypi python_setuptools_build_meta
+
+DEPENDS += " \
+ python3-pdm-backend-native \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-pefile_2023.2.7.bb b/meta-python/recipes-devtools/python/python3-pefile_2023.2.7.bb
new file mode 100644
index 0000000000..50dae7b407
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pefile_2023.2.7.bb
@@ -0,0 +1,16 @@
+SUMMARY = "Python PE parsing module"
+DESCRIPTION = "A multi-platform Python module to parse and work with Portable Executable (PE) files."
+HOMEPAGE = "https://github.com/erocarrera/pefile"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=38066667888b01d8118ff9cc23da1873"
+
+inherit setuptools3 pypi ptest
+SRC_URI[sha256sum] = "82e6114004b3d6911c77c3953e3838654b04511b8b66e8583db70c65998017dc"
+
+BBCLASSEXTEND = "native nativesdk"
+
+RDEPENDS:${PN} += " \
+ python3-mmap \
+ python3-netclient \
+ python3-stringold \
+"
diff --git a/meta-python/recipes-devtools/python/python3-pep8_1.7.1.bb b/meta-python/recipes-devtools/python/python3-pep8_1.7.1.bb
new file mode 100644
index 0000000000..68507e2482
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pep8_1.7.1.bb
@@ -0,0 +1,17 @@
+DESCRIPTION = "Python style guide checker"
+HOMEPAGE = "https://github.com/PyCQA/pycodestyle"
+SECTION = "devel/python"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://README.rst;md5=d8ebbbe831259ce010179d2f310b0f3e"
+
+SRC_URI[md5sum] = "a03bb494859e87b42601b61b1b043a0c"
+SRC_URI[sha256sum] = "603a46e5c358ce20ac4807a0eeafac7505d1125a4c1bd8378757ada06f61bed8"
+
+inherit pypi setuptools3
+
+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_1.1.1.bb b/meta-python/recipes-devtools/python/python3-periphery_1.1.1.bb
deleted file mode 100644
index ba9a95dbff..0000000000
--- a/meta-python/recipes-devtools/python/python3-periphery_1.1.1.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-inherit pypi setuptools3
-require python-periphery.inc
-
-SRC_URI[sha256sum] = "fe8f351934edce72cd919b4eb070878ebff551db5e21aea61e0f446101f0a79f" \ No newline at end of file
diff --git a/meta-python/recipes-devtools/python/python3-periphery_2.4.1.bb b/meta-python/recipes-devtools/python/python3-periphery_2.4.1.bb
new file mode 100644
index 0000000000..c2764b27d2
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-periphery_2.4.1.bb
@@ -0,0 +1,15 @@
+DESCRIPTION = "A pure Python 2/3 library for peripheral I/O (GPIO, LED, PWM, SPI, I2C, MMIO, Serial) in Linux."
+HOMEPAGE = "http://pythonhosted.org/python-periphery/"
+LICENSE = "MIT"
+
+LIC_FILES_CHKSUM = "file://LICENSE;md5=30fe6f023a80fb33989fb3b9d773fea0"
+
+SRC_URI[sha256sum] = "61d461d736982a6f766e878720ab10a68151e2e8c1086600d9389ac47e40e88a"
+
+inherit pypi setuptools3
+
+PYPI_PACKAGE = "python-periphery"
+
+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/0001-FSM.py-change-shebang-from-python-to-python3.patch b/meta-python/recipes-devtools/python/python3-pexpect/0001-FSM.py-change-shebang-from-python-to-python3.patch
new file mode 100644
index 0000000000..bee772da63
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pexpect/0001-FSM.py-change-shebang-from-python-to-python3.patch
@@ -0,0 +1,25 @@
+From 35462d7b778eea32fd0cc0bbc79d6e6f53d942b4 Mon Sep 17 00:00:00 2001
+From: Changqing Li <changqing.li@windriver.com>
+Date: Thu, 23 Apr 2020 08:01:42 +0000
+Subject: [PATCH] FSM.py: change shebang from python to python3
+
+Upstream-Status: Pending
+
+Signed-off-by: Changqing Li <changqing.li@windriver.com>
+---
+ pexpect/FSM.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/pexpect/FSM.py b/pexpect/FSM.py
+index 46b392e..4e77654 100644
+--- a/pexpect/FSM.py
++++ b/pexpect/FSM.py
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python
++#!/usr/bin/env python3
+
+ '''This module implements a Finite State Machine (FSM). In addition to state
+ this FSM also maintains a user defined "memory". So this FSM can be used as a
+--
+2.24.1
+
diff --git a/meta-python/recipes-devtools/python/python3-pexpect_4.6.0.bb b/meta-python/recipes-devtools/python/python3-pexpect_4.6.0.bb
deleted file mode 100644
index cf39233a3a..0000000000
--- a/meta-python/recipes-devtools/python/python3-pexpect_4.6.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-pexpect.inc
-inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-pexpect_4.9.0.bb b/meta-python/recipes-devtools/python/python3-pexpect_4.9.0.bb
new file mode 100644
index 0000000000..521df9dcd4
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pexpect_4.9.0.bb
@@ -0,0 +1,24 @@
+SUMMARY = "A Pure Python Expect like Module for Python"
+HOMEPAGE = "http://pexpect.readthedocs.org/"
+SECTION = "devel/python"
+LICENSE = "ISC"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=1c7a725251880af8c6a148181665385b"
+
+SRC_URI += "file://0001-FSM.py-change-shebang-from-python-to-python3.patch"
+
+SRC_URI[sha256sum] = "ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"
+
+inherit pypi setuptools3
+
+UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/pexpect"
+
+RDEPENDS:${PN} = "\
+ python3-core \
+ python3-io \
+ python3-terminal \
+ python3-resource \
+ python3-fcntl \
+ python3-ptyprocess \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-pickleshare_0.7.5.bb b/meta-python/recipes-devtools/python/python3-pickleshare_0.7.5.bb
new file mode 100644
index 0000000000..bb16c78ce8
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pickleshare_0.7.5.bb
@@ -0,0 +1,13 @@
+SUMMARY = "Tiny 'shelve'-like database with concurrency support"
+HOMEPAGE = "https://github.com/pickleshare/pickleshare"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=905c08218089ffebea3a64c82fc4d7d0"
+
+PYPI_PACKAGE = "pickleshare"
+
+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/0001-remove-requirement-of-nose.patch b/meta-python/recipes-devtools/python/python3-pid/0001-remove-requirement-of-nose.patch
deleted file mode 100644
index 3beef0700a..0000000000
--- a/meta-python/recipes-devtools/python/python3-pid/0001-remove-requirement-of-nose.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From 04d04a8fa1ef3d8dbdaebbaac9ae936e1c8234c1 Mon Sep 17 00:00:00 2001
-From: Hongxu Jia <hongxu.jia@windriver.com>
-Date: Wed, 28 Jun 2017 21:17:43 -0400
-Subject: [PATCH] remove requirement of nose
-
-The nose extends unittest to make testing easier.
-Do not need the test suite, so remove requirement of nose.
-
-Upstream-Status: Inappropriate [oe specific]
-
-Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
----
- setup.py | 2 --
- 1 file changed, 2 deletions(-)
-
-diff --git a/setup.py b/setup.py
-index 3f7c7cb..c42a546 100644
---- a/setup.py
-+++ b/setup.py
-@@ -53,6 +53,4 @@ setup(
- keywords='pid pidfile context manager decorator',
- packages=["pid"],
- install_requires=[],
-- test_suite='nose.collector',
-- setup_requires=['nose>=1.0'],
- )
---
-2.8.1
-
diff --git a/meta-python/recipes-devtools/python/python3-pid_2.2.0.bb b/meta-python/recipes-devtools/python/python3-pid_3.0.4.bb
index e438319896..c90f551056 100644
--- a/meta-python/recipes-devtools/python/python3-pid_2.2.0.bb
+++ b/meta-python/recipes-devtools/python/python3-pid_3.0.4.bb
@@ -4,11 +4,9 @@ HOMEPAGE = "https://github.com/trbs/pid/"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE;md5=83d53cbd3105063f20305bc313464e29"
-SRC_URI[md5sum] = "04d30308013d16aa882b3806feda8ab2"
-SRC_URI[sha256sum] = "d8bb2ceec21a4ae84be6e9d320db1f56934b30e676e31c6f098ca7218b3d67d4"
+SRC_URI[md5sum] = "af607e6e2a51129e3fef516b7994c85b"
+SRC_URI[sha256sum] = "0e33670e83f6a33ebb0822e43a609c3247178d4a375ff50a4689e266d853eb66"
inherit pypi setuptools3
-SRC_URI += " \
- file://0001-remove-requirement-of-nose.patch \
-"
+RDEPENDS:${PN} += "python3-fcntl python3-logging python3-io"
diff --git a/meta-python/recipes-devtools/python/python3-pika_1.1.0.bb b/meta-python/recipes-devtools/python/python3-pika_1.1.0.bb
deleted file mode 100644
index a1515881f2..0000000000
--- a/meta-python/recipes-devtools/python/python3-pika_1.1.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-pika.inc
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 d4372696fe..0000000000
--- a/meta-python/recipes-devtools/python/python3-pillow/0001-explicitly-set-compile-options.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 9f3073bf6a7c7c51bb49d25f65c8f75cc704a5ee Mon Sep 17 00:00:00 2001
-From: Hongxu Jia <hongxu.jia@windriver.com>
-Date: Mon, 18 Mar 2019 23:23:55 -0400
-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>
----
- setup.cfg | 12 ++++++++++++
- 1 file changed, 12 insertions(+)
-
-diff --git a/setup.cfg b/setup.cfg
-index 3ab2e127..e92615f3 100644
---- a/setup.cfg
-+++ b/setup.cfg
-@@ -4,3 +4,15 @@ test=pytest
- [flake8]
- extend-ignore = E203, W503
- max-line-length = 88
-+
-+[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.20.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 6de19ad87a..e4ba35b886 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,20 +1,21 @@
-From ae7c8d0336381dd4c10e809e9c8926f9deeafeb8 Mon Sep 17 00:00:00 2001
-From: Hongxu Jia <hongxu.jia@windriver.com>
-Date: Thu, 14 Mar 2019 03:48:10 -0400
+From cd09b6f68aa49c72e9a9bb0765e8c666238a7b7e 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
Upstream-Status: Inappropriate [oe specific]
-Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
+Suggested-by: Hongxu Jia <hongxu.jia@windriver.com>
+Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
---
- setup.py | 13 +++----------
- 1 file changed, 3 insertions(+), 10 deletions(-)
+ setup.py | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/setup.py b/setup.py
-index 5ceae344..07863340 100755
+index cbc2641c..302bc6e7 100755
--- a/setup.py
+++ b/setup.py
-@@ -105,7 +105,7 @@ _LIB_IMAGING = (
+@@ -123,7 +123,7 @@ _LIB_IMAGING = (
"codec_fd",
)
@@ -23,39 +24,21 @@ index 5ceae344..07863340 100755
class DependencyException(Exception):
-@@ -396,21 +396,16 @@ class pil_build_ext(build_ext):
+@@ -408,12 +408,12 @@ class pil_build_ext(build_ext):
_add_directory(library_dirs, match.group(1))
# include, rpath, if set as environment variables:
- for k in ("C_INCLUDE_PATH", "CPATH", "INCLUDE"):
-+ for k in ('C_INCLUDE_PATH', 'CPATH', 'INCLUDE', 'STAGING_INCDIR'):
++ for k in ("C_INCLUDE_PATH", "CPATH", "INCLUDE", "STAGING_INCDIR"):
if k in os.environ:
for d in os.environ[k].split(os.path.pathsep):
_add_directory(include_dirs, d)
- for k in ("LD_RUN_PATH", "LIBRARY_PATH", "LIB"):
-+ for k in ('LD_RUN_PATH', 'LIBRARY_PATH', 'LIB', 'STAGING_LIBDIR'):
++ for k in ("LD_RUN_PATH", "LIBRARY_PATH", "LIB", "STAGING_LIBDIR"):
if k in os.environ:
for d in os.environ[k].split(os.path.pathsep):
_add_directory(library_dirs, d)
-
-- 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"))
--
- #
- # add platform directories
-
-@@ -469,8 +464,6 @@ class pil_build_ext(build_ext):
- or sys.platform.startswith("gnu")
- or sys.platform.startswith("freebsd")
- ):
-- for dirname in _find_library_dirs_ldconfig():
-- _add_directory(library_dirs, dirname)
- if sys.platform.startswith("linux") and os.environ.get(
- "ANDROID_ROOT", None
- ):
--
-2.20.1
+2.17.1
diff --git a/meta-python/recipes-devtools/python/python3-pillow/run-ptest b/meta-python/recipes-devtools/python/python3-pillow/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pillow/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-pillow_10.3.0.bb b/meta-python/recipes-devtools/python/python3-pillow_10.3.0.bb
new file mode 100644
index 0000000000..debf488154
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pillow_10.3.0.bb
@@ -0,0 +1,72 @@
+SUMMARY = "Python Imaging Library (Fork). Pillow is the friendly PIL fork by Alex \
+Clark and Contributors. PIL is the Python Imaging Library by Fredrik Lundh and \
+Contributors."
+HOMEPAGE = "https://pillow.readthedocs.io"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=c349a4b4b9ec2377a8fd6a7df87dbffe"
+
+SRC_URI = "git://github.com/python-pillow/Pillow.git;branch=main;protocol=https \
+ file://0001-support-cross-compiling.patch \
+ file://run-ptest \
+ "
+SRCREV = "5c89d88eee199ba53f64581ea39b6a1bc52feb1a"
+
+inherit python_setuptools_build_meta ptest
+
+PEP517_BUILD_OPTS += " \
+ -C platform-guessing=disable \
+ -C zlib=enable \
+ -C jpeg=enable \
+ -C tiff=enable \
+ -C freetype=enable \
+ -C lcms=enable \
+ -C jpeg2000=enable \
+ -C webp=disable \
+ -C webpmux=disable \
+ -C imagequant=disable \
+"
+
+DEPENDS += " \
+ zlib \
+ jpeg \
+ tiff \
+ freetype \
+ lcms \
+ openjpeg \
+"
+
+RDEPENDS:${PN} += " \
+ python3-misc \
+ python3-logging \
+ python3-numbers \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'libxcb', '', d)} \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ bash \
+ ghostscript \
+ jpeg-tools \
+ libwebp \
+ python3-core \
+ python3-image \
+ python3-mmap \
+ python3-pytest \
+ python3-pytest-timeout \
+ python3-resource \
+ python3-unittest-automake-output \
+ python3-unixadmin\
+ ${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'tk', '', d)} \
+"
+
+CVE_PRODUCT = "pillow"
+
+S = "${WORKDIR}/git"
+
+RPROVIDES:${PN} += "python3-imaging"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/Tests
+ cp -rf ${S}/Tests ${D}${PTEST_PATH}/
+}
+
+BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python3-pillow_6.1.bb b/meta-python/recipes-devtools/python/python3-pillow_6.1.bb
deleted file mode 100644
index 1d91066481..0000000000
--- a/meta-python/recipes-devtools/python/python3-pillow_6.1.bb
+++ /dev/null
@@ -1,38 +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=55c0f320370091249c1755c0d2b48e89"
-
-SRC_URI = "git://github.com/python-pillow/Pillow.git;branch=6.1.x \
- file://0001-support-cross-compiling.patch \
- file://0001-explicitly-set-compile-options.patch \
-"
-SRCREV ?= "aaca672173413883fbcefd659f04d74fe44fb5d5"
-
-
-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/python-cryptography/run-ptest b/meta-python/recipes-devtools/python/python3-pint/run-ptest
index 0ba239c2a4..5cec711696 100644
--- a/meta-python/recipes-devtools/python/python-cryptography/run-ptest
+++ b/meta-python/recipes-devtools/python/python3-pint/run-ptest
@@ -1,2 +1,3 @@
#!/bin/sh
-py.test
+
+pytest
diff --git a/meta-python/recipes-devtools/python/python3-pint_0.23.bb b/meta-python/recipes-devtools/python/python3-pint_0.23.bb
new file mode 100644
index 0000000000..370cd7017b
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pint_0.23.bb
@@ -0,0 +1,41 @@
+SUMMARY = "Physical quantities module"
+DESCRIPTION = "Physical quantities Python module"
+HOMEPAGE = "https://github.com/hgrecco/pint"
+SECTION = "devel/python"
+
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=bccf824202692270a1e0829a62e3f47b"
+
+PYPI_PACKAGE := "Pint"
+
+inherit ptest python_setuptools_build_meta
+
+SRCREV = "f2e4081aee38f850938048beac7fb69c4908bc5e"
+SRC_URI = "git://github.com/hgrecco/pint;protocol=https;branch=master"
+S = "${WORKDIR}/git"
+#SRC_URI[sha256sum] = "e1509b91606dbc52527c600a4ef74ffac12fff70688aff20e9072409346ec9b4"
+
+DEPENDS += "python3-setuptools-scm-native"
+
+BBCLASSEXTEND = "native nativesdk"
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN} += " \
+ python3-setuptools \
+ python3-packaging \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-appdirs \
+ python3-flexcache \
+ python3-flexparser \
+ python3-pytest \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/testsuite
+ cp -rf ${S}/pint/* ${D}${PTEST_PATH}/
+}
diff --git a/meta-python/recipes-devtools/python/python3-pint_0.8.1.bb b/meta-python/recipes-devtools/python/python3-pint_0.8.1.bb
deleted file mode 100644
index f793ac4ace..0000000000
--- a/meta-python/recipes-devtools/python/python3-pint_0.8.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-pint.inc
diff --git a/meta-python/recipes-devtools/python/python3-pkcs11_0.7.0.bb b/meta-python/recipes-devtools/python/python3-pkcs11_0.7.0.bb
new file mode 100644
index 0000000000..816b728dc0
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pkcs11_0.7.0.bb
@@ -0,0 +1,25 @@
+SUMMARY = "PKCS#11 (Cryptoki) support for Python"
+DESCRIPTION = "A high level, “more Pythonic” interface to the PKCS#11 (Cryptoki) standard to support HSM and Smartcard devices in Python."
+HOMEPAGE = "https://pypi.org/project/python-pkcs11/"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://README.rst;beginline=337;endline=358;md5=f68bda54505b4002e6ec86e08125ef79"
+
+SRC_URI[sha256sum] = "9737e0c24cabb8bc9d48bf8c57c3df2a70f8cdd96b70c50290803286f9e46bf7"
+
+PYPI_PACKAGE = "python-pkcs11"
+
+inherit pypi setuptools3
+
+BBCLASSEXTEND = "native"
+
+DEPENDS += " \
+ python3-cython-native \
+ python3-setuptools-scm-native \
+ python3 \
+"
+
+RDEPENDS:${PN} += " \
+ python3-asn1crypto \
+ python3-cached-property \
+"
diff --git a/meta-python/recipes-devtools/python/python3-pkgconfig_1.4.0.bb b/meta-python/recipes-devtools/python/python3-pkgconfig_1.5.5.bb
index 92eb8bfb55..9ff4d1318d 100644
--- a/meta-python/recipes-devtools/python/python3-pkgconfig_1.4.0.bb
+++ b/meta-python/recipes-devtools/python/python3-pkgconfig_1.5.5.bb
@@ -4,15 +4,13 @@ SECTION = "devel/python"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=faa7f82be8f220bff6156be4790344fc"
-SRC_URI = "git://github.com/matze/pkgconfig.git"
-SRCREV ?= "8af0102346847e8873af8e76ab3f34ba9da806e2"
+SRC_URI[sha256sum] = "deb4163ef11f75b520d822d9505c1f462761b4309b1bb713d08689759ea8b899"
-RDEPENDS_${PN} = "pkgconfig \
+RDEPENDS:${PN} = "pkgconfig \
+ python3-shell \
"
-inherit setuptools3
-
-S = "${WORKDIR}/git"
+inherit pypi python_poetry_core
BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python3-platformdirs/run-ptest b/meta-python/recipes-devtools/python/python3-platformdirs/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-platformdirs/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-platformdirs_4.2.0.bb b/meta-python/recipes-devtools/python/python3-platformdirs_4.2.0.bb
new file mode 100644
index 0000000000..19c95b374a
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-platformdirs_4.2.0.bb
@@ -0,0 +1,32 @@
+SUMMARY = "A small Python module for determining appropriate platform-specific dirs"
+HOMEPAGE = "https://github.com/platformdirs/platformdirs"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ea4f5a41454746a9ed111e3d8723d17a"
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+SRC_URI[sha256sum] = "ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"
+
+inherit pypi python_hatchling ptest
+
+DEPENDS += " \
+ python3-hatch-vcs-native \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-appdirs \
+ python3-covdefaults \
+ python3-pytest \
+ python3-pytest-cov \
+ python3-pytest-mock \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}
+ cp -rf ${S}/tests ${D}${PTEST_PATH}/
+}
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-pluggy_0.13.0.bb b/meta-python/recipes-devtools/python/python3-pluggy_0.13.0.bb
deleted file mode 100644
index 941e8e3d8c..0000000000
--- a/meta-python/recipes-devtools/python/python3-pluggy_0.13.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-pluggy.inc
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 72410baebf..0000000000
--- a/meta-python/recipes-devtools/python/python3-ply_3.11.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-ply.inc
-inherit setuptools3
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.0.bb b/meta-python/recipes-devtools/python/python3-pocketsphinx_0.1.0.bb
deleted file mode 100644
index 2275d1b50a..0000000000
--- a/meta-python/recipes-devtools/python/python3-pocketsphinx_0.1.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-pocketsphinx.inc
-inherit pypi setuptools3
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
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-polyline/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
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.4.2.bb b/meta-python/recipes-devtools/python/python3-portion_2.4.2.bb
new file mode 100644
index 0000000000..3af94b48f1
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-portion_2.4.2.bb
@@ -0,0 +1,16 @@
+DESCRIPTION = "Python data structure and operations for intervals"
+HOMEPAGE = "https://github.com/AlexandreDecan/portion"
+SECTION = "devel/python"
+
+LICENSE = "LGPL-3.0-only"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=05f1e16a8e59ce3e9a979e881816c2ab"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "5289b40d98959b16b3f6927781678935d3df1b7c14947f5d7778e5e04dd9a065"
+
+RDEPENDS:${PN} = "\
+ python3-sortedcontainers \
+"
+
+BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python3-posix-ipc_1.1.1.bb b/meta-python/recipes-devtools/python/python3-posix-ipc_1.1.1.bb
new file mode 100644
index 0000000000..a71187399b
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-posix-ipc_1.1.1.bb
@@ -0,0 +1,11 @@
+DESCRIPTION = "POSIX IPC primitives (semaphores, shared memory and message queues) for Python"
+HOMEPAGE = "http://semanchuk.com/philip/posix_ipc/"
+SECTION = "devel/python"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=513d94a7390d4d72f3475e2d45c739b5"
+
+PYPI_PACKAGE = "posix_ipc"
+
+SRC_URI[sha256sum] = "e2456ba0cfb2ee5ba14121450e8d825b3c4a1461fca0761220aab66d4111cbb7"
+
+inherit setuptools3 pypi
diff --git a/meta-python/recipes-devtools/python/python3-prctl/0001-support-cross-complication.patch b/meta-python/recipes-devtools/python/python3-prctl/0001-support-cross-complication.patch
index 775ae1b2e2..98d250c74c 100644
--- a/meta-python/recipes-devtools/python/python3-prctl/0001-support-cross-complication.patch
+++ b/meta-python/recipes-devtools/python/python3-prctl/0001-support-cross-complication.patch
@@ -1,4 +1,4 @@
-From 9a16800738547d117284354bbcad7dd77d9d0344 Mon Sep 17 00:00:00 2001
+From 5f3911737c63a098caf73f1365320fe1b3a7638b Mon Sep 17 00:00:00 2001
From: Hongxu Jia <hongxu.jia@windriver.com>
Date: Thu, 21 Apr 2016 03:05:57 -0400
Subject: [PATCH] support cross-complication
@@ -6,12 +6,13 @@ Subject: [PATCH] support cross-complication
Upstream-Status: Inappropriate [oe specific]
Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
+Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
---
setup.py | 35 -----------------------------------
1 file changed, 35 deletions(-)
diff --git a/setup.py b/setup.py
-index 658d1a5..e8be7eb 100755
+index eb83cfe..3f9567b 100755
--- a/setup.py
+++ b/setup.py
@@ -13,41 +13,6 @@ import sys
@@ -38,13 +39,13 @@ index 658d1a5..e8be7eb 100755
- sys.stderr.write("You need to install gcc to build this module\n")
- sys.exit(1)
-
--sp = subprocess.Popen(['cpp'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+-sp = subprocess.Popen(['cpp'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=os.environ)
-sp.communicate('#include <sys/prctl.h>\n'.encode())
-if sp.returncode:
- sys.stderr.write("You need to install libc development headers to build this module\n")
- exit = True
-
--sp = subprocess.Popen(['cpp'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+-sp = subprocess.Popen(['cpp'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=os.environ)
-sp.communicate('#include <sys/capability.h>\n'.encode())
-if sp.returncode:
- sys.stderr.write("You need to install libcap development headers to build this module\n")
@@ -57,5 +58,5 @@ index 658d1a5..e8be7eb 100755
sources = ['_prctlmodule.c'],
depends = ['securebits.h'],
--
-2.8.1
+2.17.1
diff --git a/meta-python/recipes-devtools/python/python3-prctl_1.7.bb b/meta-python/recipes-devtools/python/python3-prctl_1.8.1.bb
index 54620a0661..a4732993f8 100644
--- a/meta-python/recipes-devtools/python/python3-prctl_1.7.bb
+++ b/meta-python/recipes-devtools/python/python3-prctl_1.8.1.bb
@@ -4,16 +4,14 @@ process' behaviour. Usage of the function is fairly messy though, due to \
limitations in C and linux. This module provides a nice non-messy python(ic) \
interface."
SECTION = "devel/python"
-LICENSE = "GPLv3"
-LIC_FILES_CHKSUM = "file://COPYING;md5=23ff9f50449d4bd0e513df16e4d9755f"
+LICENSE = "GPL-3.0-only"
+LIC_FILES_CHKSUM = "file://COPYING;md5=1475481f9ec754d758859bd2c75f6f6f"
S = "${WORKDIR}/git"
B = "${S}"
-SRCREV = "57cd0a7cad76e8f8792eea22ee5b5d17bae0a90f"
-PV = "1.7+git${SRCPV}"
-
-SRC_URI = "git://github.com/seveas/python-prctl;branch=master \
+SRCREV = "5e12e398eb5c4e30d7b29b02458c76d2cc780700"
+SRC_URI = "git://github.com/seveas/python-prctl;protocol=https;branch=main \
file://0001-support-cross-complication.patch \
"
inherit setuptools3 python3native
diff --git a/meta-python/recipes-devtools/python/python3-precise-runner/run-ptest b/meta-python/recipes-devtools/python/python3-precise-runner/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-precise-runner/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+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 98b62d899c..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
@@ -6,4 +6,18 @@ LIC_FILES_CHKSUM = "file://README.md;md5=2ad29e930f3107d52d2a55728bf62116"
SRC_URI[md5sum] = "a2434be110444192e804f4dada0ccecf"
SRC_URI[sha256sum] = "1a464209fb4bf0a3f5d5a428310cb2a70487a01a6bc3a960d1dda90af896b80d"
-inherit pypi setuptools3
+inherit pypi setuptools3 ptest
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/test
+ cp -rf ${S}/test/* ${D}${PTEST_PATH}/test/
+}
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 9c5d8a8437..0000000000
--- a/meta-python/recipes-devtools/python/python3-pretend_1.0.9.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-pretend.inc
diff --git a/meta-python/recipes-devtools/python/python3-prettytable/run-ptest b/meta-python/recipes-devtools/python/python3-prettytable/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-prettytable/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-prettytable_0.7.2.bb b/meta-python/recipes-devtools/python/python3-prettytable_0.7.2.bb
deleted file mode 100644
index 5445f10192..0000000000
--- a/meta-python/recipes-devtools/python/python3-prettytable_0.7.2.bb
+++ /dev/null
@@ -1,3 +0,0 @@
-inherit setuptools3
-require python-prettytable.inc
-
diff --git a/meta-python/recipes-devtools/python/python3-prettytable_3.10.0.bb b/meta-python/recipes-devtools/python/python3-prettytable_3.10.0.bb
new file mode 100644
index 0000000000..35e9ab1798
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-prettytable_3.10.0.bb
@@ -0,0 +1,45 @@
+SUMMARY = "Python library for displaying tabular data in a ASCII table format"
+HOMEPAGE = "http://code.google.com/p/prettytable"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=c9a6829fcd174d9535b46211917c7671"
+
+
+SRC_URI[sha256sum] = "9665594d137fb08a1117518c25551e0ede1687197cf353a4fdc78d27e1073568"
+SRC_URI += " \
+ file://run-ptest \
+"
+inherit pypi ptest python_hatchling
+
+do_install:append() {
+ perm_files=`find "${D}${PYTHON_SITEPACKAGES_DIR}/" -name "*.txt" -o -name "PKG-INFO"`
+ for f in $perm_files; do
+ chmod 644 "${f}"
+ done
+}
+
+DEPENDS += "\
+ python3-hatch-vcs-native \
+"
+
+RDEPENDS:${PN} += " \
+ python3-compression \
+ python3-html \
+ python3-importlib-metadata \
+ python3-json \
+ python3-math \
+ python3-wcwidth \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-pytest-lazy-fixtures \
+ python3-sqlite3 \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-process-tests_3.0.0.bb b/meta-python/recipes-devtools/python/python3-process-tests_3.0.0.bb
new file mode 100644
index 0000000000..a16497b984
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-process-tests_3.0.0.bb
@@ -0,0 +1,21 @@
+# Copyright (C) 2021 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+SUMMARY = "Tools for testing processes."
+HOMEPAGE = "https://github.com/ionelmc/python-process-tests"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=aea36d49429f53e06868d87cd9d62349"
+
+SRC_URI[sha256sum] = "e5d57dea7161251e91cadb84bf3ecc85275fb121fd478e579f800777b1d424bd"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-core"
+
+BBCLASSEXTEND = "native nativesdk"
+
+RDEPENDS:${PN} += " \
+ python3-io \
+ python3-logging \
+ python3-unittest \
+"
diff --git a/meta-python/recipes-devtools/python/python3-progress_1.4.bb b/meta-python/recipes-devtools/python/python3-progress_1.4.bb
deleted file mode 100644
index 45e2642133..0000000000
--- a/meta-python/recipes-devtools/python/python3-progress_1.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-progress.inc
diff --git a/meta-python/recipes-devtools/python/python3-progress_1.6.bb b/meta-python/recipes-devtools/python/python3-progress_1.6.bb
new file mode 100644
index 0000000000..59d1f90e98
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-progress_1.6.bb
@@ -0,0 +1,15 @@
+SUMMARY = "Easy progress reporting for Python"
+HOMEPAGE = "http://github.com/verigak/progress/"
+LICENSE = "ISC"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=00ab78a4113b09aacf63d762a7bb9644"
+
+SRC_URI[sha256sum] = "c9c86e98b5c03fa1fe11e3b67c1feda4788b8d0fe7336c2ff7d5644ccfba34cd"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN}:class-target += " \
+ python3-datetime \
+ python3-math \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-prompt-toolkit_2.0.4.bb b/meta-python/recipes-devtools/python/python3-prompt-toolkit_2.0.4.bb
deleted file mode 100644
index 0e99917c21..0000000000
--- a/meta-python/recipes-devtools/python/python3-prompt-toolkit_2.0.4.bb
+++ /dev/null
@@ -1,7 +0,0 @@
-inherit pypi setuptools3
-require python-prompt-toolkit.inc
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-datetime \
- ${PYTHON_PN}-shell \
-"
diff --git a/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.43.bb b/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.43.bb
new file mode 100644
index 0000000000..8b3b709763
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.43.bb
@@ -0,0 +1,25 @@
+SUMMARY = "Library for building powerful interactive command lines in Python"
+HOMEPAGE = "https://python-prompt-toolkit.readthedocs.io/"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=b2cde7da89f0c1f3e49bf968d00d554f"
+
+SRC_URI[sha256sum] = "3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"
+
+inherit pypi setuptools3
+
+PYPI_PACKAGE = "prompt_toolkit"
+
+RDEPENDS:${PN} += " \
+ python3-core \
+ python3-six \
+ python3-terminal \
+ python3-threading \
+ python3-wcwidth \
+ python3-datetime \
+ python3-shell \
+ python3-image \
+ python3-asyncio \
+ python3-xml \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-protobuf_3.9.2.bb b/meta-python/recipes-devtools/python/python3-protobuf_3.9.2.bb
deleted file mode 100644
index 30ea34e908..0000000000
--- a/meta-python/recipes-devtools/python/python3-protobuf_3.9.2.bb
+++ /dev/null
@@ -1,10 +0,0 @@
-inherit setuptools3
-require python-protobuf.inc
-
-DEPENDS += "protobuf"
-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..8bb8a93f76
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-protobuf_4.25.3.bb
@@ -0,0 +1,38 @@
+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-datetime \
+ python3-json \
+ python3-logging \
+ python3-netclient \
+ python3-numbers \
+ python3-pkgutil \
+ python3-six \
+ python3-unittest \
+"
+
+# For usage in other recipies when compiling protobuf files (e.g. by grpcio-tools)
+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-psutil_5.6.3.bb b/meta-python/recipes-devtools/python/python3-psutil_5.6.3.bb
deleted file mode 100644
index c1969ea657..0000000000
--- a/meta-python/recipes-devtools/python/python3-psutil_5.6.3.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-inherit pypi setuptools3
-require python-psutil.inc
-
-RDEPENDS_${PN} += "${PYTHON_PN}-netclient"
diff --git a/meta-python/recipes-devtools/python/python3-ptyprocess/run-ptest b/meta-python/recipes-devtools/python/python3-ptyprocess/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-ptyprocess/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-ptyprocess_0.6.0.bb b/meta-python/recipes-devtools/python/python3-ptyprocess_0.6.0.bb
deleted file mode 100644
index bdcd0e2539..0000000000
--- a/meta-python/recipes-devtools/python/python3-ptyprocess_0.6.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-ptyprocess.inc
-inherit pypi setuptools3
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
new file mode 100644
index 0000000000..4abec0a01c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-ptyprocess_0.7.0.bb
@@ -0,0 +1,44 @@
+SUMMARY = "Run a subprocess in a pseudo terminal"
+HOMEPAGE = "http://ptyprocess.readthedocs.io/en/latest/"
+SECTION = "devel/python"
+LICENSE = "ISC"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=cfdcd51fa7d5808da4e74346ee394490"
+
+SRCNAME = "ptyprocess"
+
+SRC_URI[sha256sum] = "5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"
+
+inherit pypi python_flit_core
+
+UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/ptyprocess"
+
+S = "${WORKDIR}/${SRCNAME}-${PV}"
+
+RDEPENDS:${PN} = "\
+ python3-core \
+ python3-fcntl \
+ python3-terminal \
+ python3-resource \
+"
+
+BBCLASSEXTEND = "native nativesdk"
+
+inherit ptest
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ bash \
+ python3-fcntl \
+ python3-pytest \
+ python3-resource \
+ python3-terminal \
+ 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-pulsectl_18.12.5.bb b/meta-python/recipes-devtools/python/python3-pulsectl_24.4.0.bb
index 9882ea6a8a..3bc15bb08a 100644
--- a/meta-python/recipes-devtools/python/python3-pulsectl_18.12.5.bb
+++ b/meta-python/recipes-devtools/python/python3-pulsectl_24.4.0.bb
@@ -3,9 +3,11 @@ HOMEPAGE = "https://github.com/mk-fg/python-pulse-control"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://COPYING;md5=f1d10048469ff90123263eb5e214061d"
-SRC_URI[md5sum] = "8e79ef002856c1858058ca0b08bf1a01"
-SRC_URI[sha256sum] = "41db4dd19e7cd28e2609baf2b551f34991f1890024be119b6075a286abfb65d3"
+SRC_URI[sha256sum] = "697ed50e7d452e78678ae38e2ab935843008bec448955283cd0fb362867e3165"
-RDEPENDS_${PN} += "pulseaudio"
+RDEPENDS:${PN} += " \
+ libpulse \
+ python3-ctypes \
+"
inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-pure-eval_0.2.2.bb b/meta-python/recipes-devtools/python/python3-pure-eval_0.2.2.bb
new file mode 100644
index 0000000000..66e4673a70
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pure-eval_0.2.2.bb
@@ -0,0 +1,16 @@
+SUMMARY = "Safely evaluate AST nodes without side effects"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=a3d6c15f7859ae235a78f2758e5a48cf"
+
+DEPENDS = "python3-setuptools-scm-native"
+
+PYPI_PACKAGE = "pure_eval"
+
+inherit pypi python_setuptools_build_meta
+
+SRC_URI[sha256sum] = "2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"
+
+RDEPENDS:${PN} += " \
+ python3-datetime \
+ python3-numbers \
+"
diff --git a/meta-python/recipes-devtools/python/python3-py-cpuinfo/0001-test_cli.py-disable.patch b/meta-python/recipes-devtools/python/python3-py-cpuinfo/0001-test_cli.py-disable.patch
new file mode 100644
index 0000000000..e4165d2d66
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-py-cpuinfo/0001-test_cli.py-disable.patch
@@ -0,0 +1,32 @@
+From 620cb80b0bb5ec58fe15592f033487a4e1cd3859 Mon Sep 17 00:00:00 2001
+From: Trevor Gamblin <tgamblin@baylibre.com>
+Date: Thu, 12 Oct 2023 16:46:53 -0400
+Subject: [PATCH] test_cli.py: disable
+
+These tests fail if .../site-packages/cpuinfo/cpuinfo.py isn't
+executable, but setting it so during do_install doesn't seem to work.
+Disable them for now so that the ptests work with the remaining ~150
+successes.
+
+Upstream-Status: Inappropriate [OE-Specific]
+
+Signed-off-by: Trevor Gamblin <tgamblin@baylibre.com>
+---
+ tests/test_cli.py | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/tests/test_cli.py b/tests/test_cli.py
+index a6b1985..43c4334 100644
+--- a/tests/test_cli.py
++++ b/tests/test_cli.py
+@@ -6,6 +6,7 @@ import helpers
+
+
+
++@unittest.skip("Disable while permissions issues are figured out")
+ class TestCLI(unittest.TestCase):
+ def setUp(self):
+ helpers.backup_data_source(cpuinfo)
+--
+2.41.0
+
diff --git a/meta-python/recipes-devtools/python/python3-py-cpuinfo/run-ptest b/meta-python/recipes-devtools/python/python3-py-cpuinfo/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-py-cpuinfo/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-py-cpuinfo_9.0.0.bb b/meta-python/recipes-devtools/python/python3-py-cpuinfo_9.0.0.bb
new file mode 100644
index 0000000000..857afd1db7
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-py-cpuinfo_9.0.0.bb
@@ -0,0 +1,36 @@
+# Copyright (C) 2021 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+SUMMARY = "Get CPU info with pure Python 2 & 3"
+HOMEPAGE = "https://github.com/workhorsy/py-cpuinfo"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d2379ecb0d7a8299101b1e4c160cd1f7"
+
+SRC_URI[sha256sum] = "3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690"
+
+inherit ptest pypi setuptools3
+
+SRC_URI += "file://run-ptest \
+ file://0001-test_cli.py-disable.patch \
+ "
+
+do_install:append() {
+ # Make sure we use /usr/bin/env python3
+ for PYTHSCRIPT in `grep -rIl '^#!.*python' ${D}`; do
+ sed -i -e '1s|^#!.*|#!/usr/bin/env python3|' $PYTHSCRIPT
+ done
+}
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+RDEPENDS:${PN}-ptest += "\
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+RDEPENDS:${PN} += "python3-core python3-ctypes python3-datetime python3-json python3-io python3-mmap python3-multiprocessing python3-netclient python3-pickle python3-pprint python3-shell"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-py-ubjson_0.16.1.bb b/meta-python/recipes-devtools/python/python3-py-ubjson_0.16.1.bb
new file mode 100644
index 0000000000..0db9d65fd3
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-py-ubjson_0.16.1.bb
@@ -0,0 +1,14 @@
+DESCRIPTION = "Universal Binary JSON encoder/decoder"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=383b9e6c3f9d1386a4eea17792291d91"
+
+SRC_URI[sha256sum] = "b9bfb8695a1c7e3632e800fb83c943bf67ed45ddd87cd0344851610c69a5a482"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-numbers \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-py7zr_0.20.8.bb b/meta-python/recipes-devtools/python/python3-py7zr_0.20.8.bb
new file mode 100644
index 0000000000..3d48b5116f
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-py7zr_0.20.8.bb
@@ -0,0 +1,29 @@
+SUMMARY = "Pure Python 7-zip library"
+HOMEPAGE = "https://py7zr.readthedocs.io/en/latest/"
+LICENSE = "LGPL-2.1-or-later"
+SECTION = "devel/python"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=4fbd65380cdd255951079008b364516c"
+
+SRC_URI[sha256sum] = "2a6b0db0441e63a2dd74cbd18f5d9ae7e08dc0e54685aa486361d0db6a0b4f78"
+
+inherit pypi python_setuptools_build_meta
+
+DEPENDS += " \
+ python3-setuptools-scm-native \
+ python3-toml-native \
+ python3-wheel-native \
+"
+
+RDEPENDS:${PN} += "\
+ python3-pycryptodomex \
+ python3-multivolumefile \
+ python3-pybcj \
+ python3-inflate64 \
+ python3-pyppmd \
+ python3-pyzstd \
+ python3-brotli \
+ python3-multiprocessing \
+ python3-datetime \
+ python3-core \
+ python3-threading \
+"
diff --git a/meta-python/recipes-devtools/python/python3-py_1.8.0.bb b/meta-python/recipes-devtools/python/python3-py_1.8.0.bb
deleted file mode 100644
index 0ee373d24c..0000000000
--- a/meta-python/recipes-devtools/python/python3-py_1.8.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-py.inc
diff --git a/meta-python/recipes-devtools/python/python3-pyalsaaudio_0.10.0.bb b/meta-python/recipes-devtools/python/python3-pyalsaaudio_0.10.0.bb
new file mode 100644
index 0000000000..8b22faad3a
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyalsaaudio_0.10.0.bb
@@ -0,0 +1,12 @@
+SUMMARY = "ALSA bindings"
+SECTION = "devel/python"
+LICENSE = "PSF-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=1a3b161aa0fcec32a0c8907a2219ad9d"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "e21175500a2bd310ae3867e7991639defc1e2a5c92cf1b9f7083296b346738ab"
+
+DEPENDS += "alsa-lib"
+
+RDEPENDS:${PN} += "libasound"
diff --git a/meta-python/recipes-devtools/python/python3-pyalsaaudio_0.8.4.bb b/meta-python/recipes-devtools/python/python3-pyalsaaudio_0.8.4.bb
deleted file mode 100644
index b7da1a43d8..0000000000
--- a/meta-python/recipes-devtools/python/python3-pyalsaaudio_0.8.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-pyalsaaudio.inc
-inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-pyasn1-modules/run-ptest b/meta-python/recipes-devtools/python/python3-pyasn1-modules/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyasn1-modules/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-pyasn1-modules_0.2.7.bb b/meta-python/recipes-devtools/python/python3-pyasn1-modules_0.2.7.bb
deleted file mode 100644
index 3b1186f06c..0000000000
--- a/meta-python/recipes-devtools/python/python3-pyasn1-modules_0.2.7.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-pyasn1-modules.inc
-inherit setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-pyasn1-modules_0.4.0.bb b/meta-python/recipes-devtools/python/python3-pyasn1-modules_0.4.0.bb
new file mode 100644
index 0000000000..34f3639e53
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyasn1-modules_0.4.0.bb
@@ -0,0 +1,31 @@
+SUMMARY = "A collection of ASN.1-based protocols modules."
+DESCRIPTION = "A collection of ASN.1 modules expressed in form of pyasn1\
+ classes. Includes protocols PDUs definition (SNMP, LDAP etc.) and various\
+ data structures (X.509, PKCS etc.)."
+HOMEPAGE = "https://github.com/etingof/pyasn1-modules"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=190f79253908c986e6cacf380c3a5f6d"
+
+SRC_URI[sha256sum] = "831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6"
+
+PYPI_PACKAGE = "pyasn1_modules"
+
+inherit pypi ptest setuptools3
+
+RDEPENDS:${PN} = "python3-pyasn1"
+
+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}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
diff --git a/meta-python/recipes-devtools/python/python3-pyasn1_0.4.7.bb b/meta-python/recipes-devtools/python/python3-pyasn1_0.4.7.bb
deleted file mode 100644
index a5e2a71362..0000000000
--- a/meta-python/recipes-devtools/python/python3-pyasn1_0.4.7.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.32.1.bb b/meta-python/recipes-devtools/python/python3-pyatspi_2.46.1.bb
index c60d40e3a2..2b6a6c2c0e 100644
--- a/meta-python/recipes-devtools/python/python3-pyatspi_2.32.1.bb
+++ b/meta-python/recipes-devtools/python/python3-pyatspi_2.46.1.bb
@@ -2,19 +2,23 @@ SUMMARY = "Python bindings for DBus AT-SPI2 accessibility"
DESCRIPTION = "AT-SPI2 is a protocol over DBus, toolkit widgets use to provide content to screen readers such as Orca"
SECTION = "devel/python"
HOMEPAGE = "https://www.freedesktop.org/wiki/Accessibility/AT-SPI2/"
-LICENSE = "GPLv2"
-LIC_FILES_CHKSUM = "file://COPYING;md5=e9f288ba982d60518f375b5898283886 \
+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=gnome-3-32"
-SRCREV = "dc4565208fca00da06b972915a080ad3c63f640d"
+SRC_URI = "git://github.com/GNOME/pyatspi2.git;protocol=https;branch=master"
+SRCREV = "8c69016b38d0e4caaf4c986938ea3410fb7351b6"
+
S = "${WORKDIR}/git"
# Same restriction as gtk+
-inherit distro_features_check
+inherit features_check setuptools3
ANY_OF_DISTRO_FEATURES = "${GTK2DISTROFEATURES}"
+REQUIRED_DISTRO_FEATURES = "gobject-introspection-data"
inherit pkgconfig autotools python3native
-FILES_${PN} += "${PYTHON_SITEPACKAGES_DIR}/pyatspi/*"
+FILES:${PN} += "${PYTHON_SITEPACKAGES_DIR}/pyatspi/*"
+
+RDEPENDS:${PN} += "python3-pygobject"
diff --git a/meta-python/recipes-devtools/python/python3-pyaudio/0001-Remove-absolute-paths-into-build-machine-system-dirs.patch b/meta-python/recipes-devtools/python/python3-pyaudio/0001-Remove-absolute-paths-into-build-machine-system-dirs.patch
new file mode 100644
index 0000000000..a71902a362
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyaudio/0001-Remove-absolute-paths-into-build-machine-system-dirs.patch
@@ -0,0 +1,28 @@
+From d94518b558c1812aecb87d8ef19d75c2df1b98a5 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Wed, 26 Jul 2023 19:54:19 -0700
+Subject: [PATCH] Remove absolute paths into build machine system dirs
+
+This ensures that it does not add /usr/include and /usr/local/include/
+into cflags
+
+Upstream-Status: Pending
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ setup.py | 2 --
+ 1 file changed, 2 deletions(-)
+
+--- a/setup.py
++++ b/setup.py
+@@ -111,11 +111,6 @@ def setup_extension():
+ # the standard portaudio cmake settings. For details, see:
+ # https://devblogs.microsoft.com/cppblog/vcpkg-updates-static-linking-is-now-available/
+ extra_compile_args += ["/MT"]
+- else:
+- # GNU/Linux and other posix-like OSes will dynamically link to
+- # portaudio, installed by the package manager.
+- include_dirs += ['/usr/local/include', '/usr/include']
+- external_libraries_path += ['/usr/local/lib', '/usr/lib']
+
+ return Extension(
+ 'pyaudio._portaudio',
diff --git a/meta-python/recipes-devtools/python/python3-pyaudio_0.2.11.bb b/meta-python/recipes-devtools/python/python3-pyaudio_0.2.11.bb
deleted file mode 100644
index abb01bf691..0000000000
--- a/meta-python/recipes-devtools/python/python3-pyaudio_0.2.11.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-pyaudio.inc
-inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-pyaudio_0.2.14.bb b/meta-python/recipes-devtools/python/python3-pyaudio_0.2.14.bb
new file mode 100644
index 0000000000..1599ea8347
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyaudio_0.2.14.bb
@@ -0,0 +1,16 @@
+SUMMARY = "PyAudio provides Python bindings for PortAudio, the cross-platform audio I/O library"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=7c3152b432b96d6dc4a1cb35397da9ec"
+
+PYPI_PACKAGE = "PyAudio"
+
+SRC_URI[sha256sum] = "78dfff3879b4994d1f4fc6485646a57755c6ee3c19647a491f790a0895bd2f87"
+
+inherit pypi setuptools3
+
+SRC_URI += "file://0001-Remove-absolute-paths-into-build-machine-system-dirs.patch"
+
+DEPENDS += "portaudio-v19"
+
+RDEPENDS:${PN} += "portaudio-v19"
diff --git a/meta-python/recipes-devtools/python/python3-pybcj_1.0.2.bb b/meta-python/recipes-devtools/python/python3-pybcj_1.0.2.bb
new file mode 100644
index 0000000000..8cb176f2b5
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pybcj_1.0.2.bb
@@ -0,0 +1,24 @@
+SUMMARY = "bcj filter library"
+HOMEPAGE = "https://codeberg.org/miurahr/pybcj"
+LICENSE = "LGPL-2.1-or-later"
+SECTION = "devel/python"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=4fbd65380cdd255951079008b364516c"
+
+SRC_URI[sha256sum] = "c7f5bef7f47723c53420e377bc64d2553843bee8bcac5f0ad076ab1524780018"
+
+inherit pypi python_setuptools_build_meta pypi
+
+#PROVIDES = "python3-pybcj"
+
+DEPENDS += " \
+ python3-setuptools-scm-native \
+ python3-toml-native \
+ python3-wheel-native \
+"
+
+RDEPENDS:${PN} += "\
+ python3-email \
+ python3-importlib-metadata \
+ python3-core \
+ python3-compression \
+"
diff --git a/meta-python/recipes-devtools/python/python3-pybind11-json_0.2.13.bb b/meta-python/recipes-devtools/python/python3-pybind11-json_0.2.13.bb
new file mode 100644
index 0000000000..67bd2a33a7
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pybind11-json_0.2.13.bb
@@ -0,0 +1,12 @@
+SUMMARY = "Using nlohmann::json with pybind11"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=0e25ff0ec476d06d366439e1120cce98"
+
+SRCREV = "b02a2ad597d224c3faee1f05a56d81d4c4453092"
+SRC_URI = "git://github.com/pybind/pybind11_json;branch=master;protocol=https"
+
+DEPENDS += "nlohmann-json python3-pybind11"
+
+S = "${WORKDIR}/git"
+
+inherit cmake
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
new file mode 100644
index 0000000000..91575d2712
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pybind11/0001-Do-not-strip-binaries.patch
@@ -0,0 +1,54 @@
+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>
+
+Upstream-Status: Pending
+---
+ tools/pybind11NewTools.cmake | 7 -------
+ tools/pybind11Tools.cmake | 6 ------
+ 2 files changed, 13 deletions(-)
+
+diff --git a/tools/pybind11NewTools.cmake b/tools/pybind11NewTools.cmake
+index 7d7424a7..accd90c4 100644
+--- a/tools/pybind11NewTools.cmake
++++ b/tools/pybind11NewTools.cmake
+@@ -233,13 +233,6 @@ function(pybind11_add_module target_name)
+ endif()
+ endif()
+
+- # Use case-insensitive comparison to match the result of $<CONFIG:cfgs>
+- string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
+- if(NOT MSVC AND NOT "${uppercase_CMAKE_BUILD_TYPE}" MATCHES DEBUG|RELWITHDEBINFO)
+- # Strip unnecessary sections of the binary on Linux/macOS
+- pybind11_strip(${target_name})
+- endif()
+-
+ if(MSVC)
+ target_link_libraries(${target_name} PRIVATE pybind11::windows_extras)
+ endif()
+diff --git a/tools/pybind11Tools.cmake b/tools/pybind11Tools.cmake
+index 66ad00a4..855ede41 100644
+--- a/tools/pybind11Tools.cmake
++++ b/tools/pybind11Tools.cmake
+@@ -212,12 +212,6 @@ function(pybind11_add_module target_name)
+ endif()
+ endif()
+
+- # Use case-insensitive comparison to match the result of $<CONFIG:cfgs>
+- string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
+- if(NOT MSVC AND NOT "${uppercase_CMAKE_BUILD_TYPE}" MATCHES DEBUG|RELWITHDEBINFO)
+- pybind11_strip(${target_name})
+- endif()
+-
+ if(MSVC)
+ target_link_libraries(${target_name} PRIVATE pybind11::windows_extras)
+ endif()
+--
+2.39.2
+
diff --git a/meta-python/recipes-devtools/python/python3-pybind11_2.11.1.bb b/meta-python/recipes-devtools/python/python3-pybind11_2.11.1.bb
new file mode 100644
index 0000000000..78662fe3cd
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pybind11_2.11.1.bb
@@ -0,0 +1,34 @@
+SUMMARY = "Seamless operability between C++11 and Python"
+HOMEPAGE = "https://github.com/pybind/pybind11"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=774f65abd8a7fe3124be2cdf766cd06f"
+DEPENDS = "\
+ python3-cmake-native \
+ python3-ninja-native \
+"
+
+SRCREV = "8a099e44b3d5f85b20f05828d919d2332a8de841"
+SRC_URI = "\
+ git://github.com/pybind/pybind11.git;branch=stable;protocol=https \
+ file://0001-Do-not-strip-binaries.patch \
+"
+
+S = "${WORKDIR}/git"
+
+inherit cmake python_setuptools_build_meta
+
+EXTRA_OECMAKE = "-DPYBIND11_TEST=OFF"
+
+do_configure:append() {
+ cmake_do_configure
+}
+
+do_compile:append() {
+ cmake_do_compile
+}
+
+do_install:append() {
+ cmake_do_install
+}
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-pybind11_2.2.3.bb b/meta-python/recipes-devtools/python/python3-pybind11_2.2.3.bb
deleted file mode 100644
index 355e28460e..0000000000
--- a/meta-python/recipes-devtools/python/python3-pybind11_2.2.3.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-pybind11.inc
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", &param, &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#", &param, &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.22.bb b/meta-python/recipes-devtools/python/python3-pybluez_0.22.bb
deleted file mode 100644
index 9712a76085..0000000000
--- a/meta-python/recipes-devtools/python/python3-pybluez_0.22.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-pybluez.inc
-inherit setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-pybluez_0.23.bb b/meta-python/recipes-devtools/python/python3-pybluez_0.23.bb
new file mode 100644
index 0000000000..a38e10eec0
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pybluez_0.23.bb
@@ -0,0 +1,26 @@
+DESCRIPTION = "Bluetooth Python extension module"
+HOMEPAGE = "https://pybluez.github.io/"
+SECTION = "devel/python"
+
+DEPENDS = "bluez5"
+
+LICENSE = "GPL-2.0-only"
+LIC_FILES_CHKSUM = "file://COPYING;md5=8a71d0475d08eee76d8b6d0c6dbec543"
+
+SRC_URI += "file://0001-Use-Py_ssize_t-when-parsing-buffer-length-fix-426-42.patch \
+ file://py-3.11.patch "
+SRC_URI[md5sum] = "afbe8429bb82d2c46a3d0f5f4f898f9d"
+SRC_URI[sha256sum] = "c8f04d2e78951eaa9de486b4d49381704e8943d0a6e6e58f55fcd7b8582e90de"
+
+PYPI_PACKAGE = "PyBluez"
+
+inherit pypi setuptools3
+
+do_configure:prepend() {
+ sed -i -e "/use_2to3=True,/d" ${S}/setup.py
+}
+
+RDEPENDS:${PN} += "\
+ bluez5 \
+ python3-fcntl \
+"
diff --git a/meta-python/recipes-devtools/python/python3-pycares_4.4.0.bb b/meta-python/recipes-devtools/python/python3-pycares_4.4.0.bb
new file mode 100644
index 0000000000..b6b0de8809
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pycares_4.4.0.bb
@@ -0,0 +1,22 @@
+SUMMARY = "Python interface for c-ares"
+DESCRIPTION = "\
+pycares is a Python module which provides an interface to c-ares. c-ares is \
+a C library that performs DNS requests and name resolutions asynchronously."
+HOMEPAGE = "https://github.com/saghul/pycares"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=b1538fcaea82ebf2313ed648b96c69b1"
+
+SRC_URI[sha256sum] = "f47579d508f2f56eddd16ce72045782ad3b1b3b678098699e2b6a1b30733e1c2"
+
+PYPI_PACKAGE = "pycares"
+
+inherit pypi setuptools3
+
+DEPENDS += "python3-cffi-native"
+
+RDEPENDS:${PN} += " \
+ python3-cffi \
+ python3-idna \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-pychromecast/0001-Allow-newer-version-of-wheel-and-setuptools.patch b/meta-python/recipes-devtools/python/python3-pychromecast/0001-Allow-newer-version-of-wheel-and-setuptools.patch
new file mode 100644
index 0000000000..447f679070
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pychromecast/0001-Allow-newer-version-of-wheel-and-setuptools.patch
@@ -0,0 +1,22 @@
+From 5ee73f91b7f13dd5c700c69e7fc43cecab5868da Mon Sep 17 00:00:00 2001
+From: Tom Geelen <t.f.g.geelen@gmail.com>
+Date: Sun, 7 Apr 2024 22:39:35 +0000
+Subject: [PATCH] Allow newer version of wheel and setuptools
+
+Upstream-Status: Pending
+Signed-off-by: Tom Geelen <t.f.g.geelen@gmail.com>
+---
+ pyproject.toml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/pyproject.toml b/pyproject.toml
+index 56df5bd..17ca62d 100644
+--- a/pyproject.toml
++++ b/pyproject.toml
+@@ -1,5 +1,5 @@
+ [build-system]
+-requires = ["setuptools~=65.6", "wheel~=0.37.1"]
++requires = ["setuptools>=65.6", "wheel>=0.37.1"]
+ build-backend = "setuptools.build_meta"
+
+ [project]
diff --git a/meta-python/recipes-devtools/python/python3-pychromecast_14.0.1.bb b/meta-python/recipes-devtools/python/python3-pychromecast_14.0.1.bb
new file mode 100644
index 0000000000..dee4bf6ebe
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pychromecast_14.0.1.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Library for Python 3.6+ to communicate with the Google Chromecast."
+HOMEPAGE = "https://github.com/balloob/pychromecast"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=b1dbd4e85f47b389bdadee9c694669f5"
+
+SRC_URI += "file://0001-Allow-newer-version-of-wheel-and-setuptools.patch"
+SRC_URI[sha256sum] = "e16e0a7f9488319191b8b4fa21ca0beb4bf12eeda5c9bf640241188f2bea0a3e"
+
+PYPI_PACKAGE = "PyChromecast"
+
+inherit pypi python_setuptools_build_meta
+
+RDEPENDS:${PN} += "\
+ python3-zeroconf (>=0.131.0) \
+ python3-protobuf (>=4.25.2) \
+ python3-casttube (>=0.2.1) \
+"
diff --git a/meta-python/recipes-devtools/python/python3-pychromecast_4.0.1.bb b/meta-python/recipes-devtools/python/python3-pychromecast_4.0.1.bb
deleted file mode 100644
index 1b9301f96f..0000000000
--- a/meta-python/recipes-devtools/python/python3-pychromecast_4.0.1.bb
+++ /dev/null
@@ -1,11 +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[md5sum] = "d6f96d478fd768696a0e440cb0ea903b"
-SRC_URI[sha256sum] = "d98df28f340bb14a07236846518daad7107b66581512c33da921663df61ac819"
-
-PYPI_PACKAGE = "PyChromecast"
-
-inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-pycocotools_2.0.7.bb b/meta-python/recipes-devtools/python/python3-pycocotools_2.0.7.bb
new file mode 100644
index 0000000000..bebfb128f2
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pycocotools_2.0.7.bb
@@ -0,0 +1,11 @@
+SUMMARY = "COCO is a large image dataset designed for object detection, segmentation, \
+ person keypoints detection, stuff segmentation, and caption generation."
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://pycocotools/coco.py;beginline=45;endline=45;md5=12cb539683cf245df8b6ce782d78f647"
+
+inherit setuptools3 pypi
+
+SRC_URI[sha256sum] = "da8b7815196eebf0adabf67fcc459126cbc6498bbc6ab1fd144c371465d86879"
+
+DEPENDS = "python3-cython-native python3-numpy-native virtual/crypt"
+RDEPENDS:${PN} = "python3-matplotlib python3-pillow python3-profile"
diff --git a/meta-python/recipes-devtools/python/python3-pycodestyle_2.11.1.bb b/meta-python/recipes-devtools/python/python3-pycodestyle_2.11.1.bb
new file mode 100644
index 0000000000..a282afb466
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pycodestyle_2.11.1.bb
@@ -0,0 +1,11 @@
+SUMMARY = "Python style guide checker (formly called pep8)"
+HOMEPAGE = "https://pypi.org/project/pycodestyle"
+LICENSE = "MIT"
+SECTION = "devel/python"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=a8546d0e77f416fb05a26acd89c8b3bd"
+
+SRC_URI[sha256sum] = "41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"
+
+inherit pypi setuptools3
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-pycodestyle_2.5.0.bb b/meta-python/recipes-devtools/python/python3-pycodestyle_2.5.0.bb
deleted file mode 100644
index cedcdb3bf8..0000000000
--- a/meta-python/recipes-devtools/python/python3-pycodestyle_2.5.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-pycodestyle.inc
diff --git a/meta-python/recipes-devtools/python/python3-pycparser_2.19.bb b/meta-python/recipes-devtools/python/python3-pycparser_2.19.bb
deleted file mode 100644
index 7cc024ea09..0000000000
--- a/meta-python/recipes-devtools/python/python3-pycparser_2.19.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-inherit pypi setuptools3
-require python-pycparser.inc
-
-RDEPENDS_${PN}_class-target += "\
- ${PYTHON_PN}-netclient \
- "
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 02d634cb00..0000000000
--- a/meta-python/recipes-devtools/python/python3-pycrypto_2.6.1.bb
+++ /dev/null
@@ -1,9 +0,0 @@
-inherit distutils3
-require python-pycrypto.inc
-
-# 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
-}
diff --git a/meta-python/recipes-devtools/python/python3-pycryptodome_3.4.11.bb b/meta-python/recipes-devtools/python/python3-pycryptodome_3.4.11.bb
deleted file mode 100644
index 0c062dddf8..0000000000
--- a/meta-python/recipes-devtools/python/python3-pycryptodome_3.4.11.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-pycryptodome.inc
-inherit setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-pycurl_7.43.0.3.bb b/meta-python/recipes-devtools/python/python3-pycurl_7.43.0.3.bb
deleted file mode 100644
index 5ad319ae2f..0000000000
--- a/meta-python/recipes-devtools/python/python3-pycurl_7.43.0.3.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-pycurl.inc
diff --git a/meta-python/recipes-devtools/python/python3-pycurl_7.45.2.bb b/meta-python/recipes-devtools/python/python3-pycurl_7.45.2.bb
new file mode 100644
index 0000000000..a6863e21ff
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pycurl_7.45.2.bb
@@ -0,0 +1,21 @@
+SUMMARY = "A Python Interface To The cURL library"
+DESCRIPTION = "\
+PycURL is a Python interface to libcurl, the multiprotocol file \
+transfer library. Similarly to the urllib Python module, PycURL can \
+be used to fetch objects identified by a URL from a Python program \
+"
+SECTION = "devel/python"
+HOMEPAGE = "http://pycurl.io/"
+
+LICENSE = "LGPL-2.0-only | MIT"
+LIC_FILES_CHKSUM = "file://COPYING-LGPL;md5=4fbd65380cdd255951079008b364516c \
+ file://COPYING-MIT;md5=be42e1b1e58c8d59c2901fd747bfc55d \
+ "
+
+SRC_URI[sha256sum] = "5730590be0271364a5bddd9e245c9cc0fb710c4cbacbdd95264a3122d23224ca"
+
+DEPENDS = "curl"
+
+inherit pypi setuptools3
+
+BBCLASSEXTEND += "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-pydantic-core-crates.inc b/meta-python/recipes-devtools/python/python3-pydantic-core-crates.inc
new file mode 100644
index 0000000000..dd2027948c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pydantic-core-crates.inc
@@ -0,0 +1,170 @@
+# Autogenerated with 'bitbake -c update_crates python3-pydantic-core'
+
+# from Cargo.lock
+SRC_URI += " \
+ crate://crates.io/ahash/0.8.7 \
+ crate://crates.io/aho-corasick/1.0.2 \
+ crate://crates.io/allocator-api2/0.2.16 \
+ crate://crates.io/autocfg/1.1.0 \
+ crate://crates.io/base64/0.21.7 \
+ crate://crates.io/bitflags/1.3.2 \
+ crate://crates.io/cc/1.0.79 \
+ crate://crates.io/cfg-if/1.0.0 \
+ crate://crates.io/enum_dispatch/0.3.12 \
+ crate://crates.io/equivalent/1.0.1 \
+ crate://crates.io/form_urlencoded/1.2.1 \
+ crate://crates.io/getrandom/0.2.10 \
+ crate://crates.io/hashbrown/0.14.3 \
+ crate://crates.io/heck/0.4.1 \
+ crate://crates.io/idna/0.5.0 \
+ crate://crates.io/indexmap/2.0.0 \
+ crate://crates.io/indoc/2.0.4 \
+ crate://crates.io/itoa/1.0.8 \
+ crate://crates.io/jiter/0.0.6 \
+ crate://crates.io/lexical-core/0.8.5 \
+ crate://crates.io/lexical-parse-float/0.8.5 \
+ crate://crates.io/lexical-parse-integer/0.8.6 \
+ crate://crates.io/lexical-util/0.8.5 \
+ crate://crates.io/lexical-write-float/0.8.5 \
+ crate://crates.io/lexical-write-integer/0.8.5 \
+ crate://crates.io/libc/0.2.147 \
+ crate://crates.io/lock_api/0.4.10 \
+ crate://crates.io/memchr/2.6.3 \
+ crate://crates.io/memoffset/0.9.0 \
+ crate://crates.io/num-bigint/0.4.4 \
+ crate://crates.io/num-integer/0.1.45 \
+ crate://crates.io/num-traits/0.2.16 \
+ crate://crates.io/once_cell/1.18.0 \
+ crate://crates.io/parking_lot/0.12.1 \
+ crate://crates.io/parking_lot_core/0.9.8 \
+ crate://crates.io/percent-encoding/2.3.1 \
+ crate://crates.io/portable-atomic/1.6.0 \
+ crate://crates.io/proc-macro2/1.0.76 \
+ crate://crates.io/pyo3/0.20.3 \
+ crate://crates.io/pyo3-build-config/0.20.3 \
+ crate://crates.io/pyo3-ffi/0.20.3 \
+ crate://crates.io/pyo3-macros/0.20.3 \
+ crate://crates.io/pyo3-macros-backend/0.20.3 \
+ crate://crates.io/python3-dll-a/0.2.9 \
+ crate://crates.io/quote/1.0.35 \
+ crate://crates.io/redox_syscall/0.3.5 \
+ crate://crates.io/regex/1.10.2 \
+ crate://crates.io/regex-automata/0.4.3 \
+ crate://crates.io/regex-syntax/0.8.2 \
+ crate://crates.io/rustversion/1.0.13 \
+ crate://crates.io/ryu/1.0.14 \
+ crate://crates.io/scopeguard/1.1.0 \
+ crate://crates.io/serde/1.0.195 \
+ crate://crates.io/serde_derive/1.0.195 \
+ crate://crates.io/serde_json/1.0.109 \
+ crate://crates.io/smallvec/1.11.2 \
+ crate://crates.io/speedate/0.13.0 \
+ crate://crates.io/static_assertions/1.1.0 \
+ crate://crates.io/strum/0.25.0 \
+ crate://crates.io/strum_macros/0.25.3 \
+ crate://crates.io/syn/2.0.48 \
+ crate://crates.io/target-lexicon/0.12.9 \
+ crate://crates.io/tinyvec/1.6.0 \
+ crate://crates.io/tinyvec_macros/0.1.1 \
+ crate://crates.io/unicode-bidi/0.3.13 \
+ crate://crates.io/unicode-ident/1.0.10 \
+ crate://crates.io/unicode-normalization/0.1.22 \
+ crate://crates.io/unindent/0.2.3 \
+ crate://crates.io/url/2.5.0 \
+ crate://crates.io/uuid/1.6.1 \
+ crate://crates.io/version_check/0.9.4 \
+ crate://crates.io/wasi/0.11.0+wasi-snapshot-preview1 \
+ crate://crates.io/windows-targets/0.48.1 \
+ crate://crates.io/windows_aarch64_gnullvm/0.48.0 \
+ crate://crates.io/windows_aarch64_msvc/0.48.0 \
+ crate://crates.io/windows_i686_gnu/0.48.0 \
+ crate://crates.io/windows_i686_msvc/0.48.0 \
+ crate://crates.io/windows_x86_64_gnu/0.48.0 \
+ crate://crates.io/windows_x86_64_gnullvm/0.48.0 \
+ crate://crates.io/windows_x86_64_msvc/0.48.0 \
+ crate://crates.io/zerocopy/0.7.32 \
+ crate://crates.io/zerocopy-derive/0.7.32 \
+"
+
+SRC_URI[ahash-0.8.7.sha256sum] = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01"
+SRC_URI[aho-corasick-1.0.2.sha256sum] = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41"
+SRC_URI[allocator-api2-0.2.16.sha256sum] = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5"
+SRC_URI[autocfg-1.1.0.sha256sum] = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+SRC_URI[base64-0.21.7.sha256sum] = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
+SRC_URI[bitflags-1.3.2.sha256sum] = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+SRC_URI[cc-1.0.79.sha256sum] = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
+SRC_URI[cfg-if-1.0.0.sha256sum] = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+SRC_URI[enum_dispatch-0.3.12.sha256sum] = "8f33313078bb8d4d05a2733a94ac4c2d8a0df9a2b84424ebf4f33bfc224a890e"
+SRC_URI[equivalent-1.0.1.sha256sum] = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
+SRC_URI[form_urlencoded-1.2.1.sha256sum] = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
+SRC_URI[getrandom-0.2.10.sha256sum] = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427"
+SRC_URI[hashbrown-0.14.3.sha256sum] = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
+SRC_URI[heck-0.4.1.sha256sum] = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+SRC_URI[idna-0.5.0.sha256sum] = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
+SRC_URI[indexmap-2.0.0.sha256sum] = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d"
+SRC_URI[indoc-2.0.4.sha256sum] = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8"
+SRC_URI[itoa-1.0.8.sha256sum] = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a"
+SRC_URI[jiter-0.0.6.sha256sum] = "87db066a99f69382be06d02313f8ce989996b53a04a8a70cfd1a6483a56227f7"
+SRC_URI[lexical-core-0.8.5.sha256sum] = "2cde5de06e8d4c2faabc400238f9ae1c74d5412d03a7bd067645ccbc47070e46"
+SRC_URI[lexical-parse-float-0.8.5.sha256sum] = "683b3a5ebd0130b8fb52ba0bdc718cc56815b6a097e28ae5a6997d0ad17dc05f"
+SRC_URI[lexical-parse-integer-0.8.6.sha256sum] = "6d0994485ed0c312f6d965766754ea177d07f9c00c9b82a5ee62ed5b47945ee9"
+SRC_URI[lexical-util-0.8.5.sha256sum] = "5255b9ff16ff898710eb9eb63cb39248ea8a5bb036bea8085b1a767ff6c4e3fc"
+SRC_URI[lexical-write-float-0.8.5.sha256sum] = "accabaa1c4581f05a3923d1b4cfd124c329352288b7b9da09e766b0668116862"
+SRC_URI[lexical-write-integer-0.8.5.sha256sum] = "e1b6f3d1f4422866b68192d62f77bc5c700bee84f3069f2469d7bc8c77852446"
+SRC_URI[libc-0.2.147.sha256sum] = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
+SRC_URI[lock_api-0.4.10.sha256sum] = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
+SRC_URI[memchr-2.6.3.sha256sum] = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c"
+SRC_URI[memoffset-0.9.0.sha256sum] = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
+SRC_URI[num-bigint-0.4.4.sha256sum] = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0"
+SRC_URI[num-integer-0.1.45.sha256sum] = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+SRC_URI[num-traits-0.2.16.sha256sum] = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2"
+SRC_URI[once_cell-1.18.0.sha256sum] = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
+SRC_URI[parking_lot-0.12.1.sha256sum] = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+SRC_URI[parking_lot_core-0.9.8.sha256sum] = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"
+SRC_URI[percent-encoding-2.3.1.sha256sum] = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
+SRC_URI[portable-atomic-1.6.0.sha256sum] = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0"
+SRC_URI[proc-macro2-1.0.76.sha256sum] = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c"
+SRC_URI[pyo3-0.20.3.sha256sum] = "53bdbb96d49157e65d45cc287af5f32ffadd5f4761438b527b055fb0d4bb8233"
+SRC_URI[pyo3-build-config-0.20.3.sha256sum] = "deaa5745de3f5231ce10517a1f5dd97d53e5a2fd77aa6b5842292085831d48d7"
+SRC_URI[pyo3-ffi-0.20.3.sha256sum] = "62b42531d03e08d4ef1f6e85a2ed422eb678b8cd62b762e53891c05faf0d4afa"
+SRC_URI[pyo3-macros-0.20.3.sha256sum] = "7305c720fa01b8055ec95e484a6eca7a83c841267f0dd5280f0c8b8551d2c158"
+SRC_URI[pyo3-macros-backend-0.20.3.sha256sum] = "7c7e9b68bb9c3149c5b0cade5d07f953d6d125eb4337723c4ccdb665f1f96185"
+SRC_URI[python3-dll-a-0.2.9.sha256sum] = "d5f07cd4412be8fa09a721d40007c483981bbe072cd6a21f2e83e04ec8f8343f"
+SRC_URI[quote-1.0.35.sha256sum] = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
+SRC_URI[redox_syscall-0.3.5.sha256sum] = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
+SRC_URI[regex-1.10.2.sha256sum] = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"
+SRC_URI[regex-automata-0.4.3.sha256sum] = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"
+SRC_URI[regex-syntax-0.8.2.sha256sum] = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
+SRC_URI[rustversion-1.0.13.sha256sum] = "dc31bd9b61a32c31f9650d18add92aa83a49ba979c143eefd27fe7177b05bd5f"
+SRC_URI[ryu-1.0.14.sha256sum] = "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9"
+SRC_URI[scopeguard-1.1.0.sha256sum] = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+SRC_URI[serde-1.0.195.sha256sum] = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02"
+SRC_URI[serde_derive-1.0.195.sha256sum] = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c"
+SRC_URI[serde_json-1.0.109.sha256sum] = "cb0652c533506ad7a2e353cce269330d6afd8bdfb6d75e0ace5b35aacbd7b9e9"
+SRC_URI[smallvec-1.11.2.sha256sum] = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970"
+SRC_URI[speedate-0.13.0.sha256sum] = "242f76c50fd18cbf098607090ade73a08d39cfd84ea835f3796a2c855223b19b"
+SRC_URI[static_assertions-1.1.0.sha256sum] = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+SRC_URI[strum-0.25.0.sha256sum] = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125"
+SRC_URI[strum_macros-0.25.3.sha256sum] = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0"
+SRC_URI[syn-2.0.48.sha256sum] = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f"
+SRC_URI[target-lexicon-0.12.9.sha256sum] = "df8e77cb757a61f51b947ec4a7e3646efd825b73561db1c232a8ccb639e611a0"
+SRC_URI[tinyvec-1.6.0.sha256sum] = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+SRC_URI[tinyvec_macros-0.1.1.sha256sum] = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+SRC_URI[unicode-bidi-0.3.13.sha256sum] = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
+SRC_URI[unicode-ident-1.0.10.sha256sum] = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73"
+SRC_URI[unicode-normalization-0.1.22.sha256sum] = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+SRC_URI[unindent-0.2.3.sha256sum] = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce"
+SRC_URI[url-2.5.0.sha256sum] = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633"
+SRC_URI[uuid-1.6.1.sha256sum] = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560"
+SRC_URI[version_check-0.9.4.sha256sum] = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+SRC_URI[wasi-0.11.0+wasi-snapshot-preview1.sha256sum] = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+SRC_URI[windows-targets-0.48.1.sha256sum] = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f"
+SRC_URI[windows_aarch64_gnullvm-0.48.0.sha256sum] = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
+SRC_URI[windows_aarch64_msvc-0.48.0.sha256sum] = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
+SRC_URI[windows_i686_gnu-0.48.0.sha256sum] = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
+SRC_URI[windows_i686_msvc-0.48.0.sha256sum] = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
+SRC_URI[windows_x86_64_gnu-0.48.0.sha256sum] = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
+SRC_URI[windows_x86_64_gnullvm-0.48.0.sha256sum] = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
+SRC_URI[windows_x86_64_msvc-0.48.0.sha256sum] = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
+SRC_URI[zerocopy-0.7.32.sha256sum] = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be"
+SRC_URI[zerocopy-derive-0.7.32.sha256sum] = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
diff --git a/meta-python/recipes-devtools/python/python3-pydantic-core/0001-Bumps-pyo3-https-github.com-pyo3-pyo3-from-0.20.2-to.patch b/meta-python/recipes-devtools/python/python3-pydantic-core/0001-Bumps-pyo3-https-github.com-pyo3-pyo3-from-0.20.2-to.patch
new file mode 100644
index 0000000000..32777e1d03
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pydantic-core/0001-Bumps-pyo3-https-github.com-pyo3-pyo3-from-0.20.2-to.patch
@@ -0,0 +1,126 @@
+From a5690f973384bf8cbf4deb3b83d822b7aaefbdd8 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Tue, 27 Feb 2024 11:00:46 -0800
+Subject: [PATCH] Bumps [pyo3](https://github.com/pyo3/pyo3) from 0.20.2 to
+ 0.20.3.
+
+Upstream-Status: Pending
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ Cargo.lock | 26 +++++++++++++++++---------
+ Cargo.toml | 2 +-
+ 2 files changed, 18 insertions(+), 10 deletions(-)
+
+--- a/Cargo.lock
++++ b/Cargo.lock
+@@ -322,6 +322,12 @@ source = "registry+https://github.com/ru
+ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
+
+ [[package]]
++name = "portable-atomic"
++version = "1.6.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0"
++
++[[package]]
+ name = "proc-macro2"
+ version = "1.0.76"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+@@ -357,9 +363,9 @@ dependencies = [
+
+ [[package]]
+ name = "pyo3"
+-version = "0.20.2"
++version = "0.20.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "9a89dc7a5850d0e983be1ec2a463a171d20990487c3cfcd68b5363f1ee3d6fe0"
++checksum = "53bdbb96d49157e65d45cc287af5f32ffadd5f4761438b527b055fb0d4bb8233"
+ dependencies = [
+ "cfg-if",
+ "indoc",
+@@ -367,6 +373,7 @@ dependencies = [
+ "memoffset",
+ "num-bigint",
+ "parking_lot",
++ "portable-atomic",
+ "pyo3-build-config",
+ "pyo3-ffi",
+ "pyo3-macros",
+@@ -375,9 +382,9 @@ dependencies = [
+
+ [[package]]
+ name = "pyo3-build-config"
+-version = "0.20.2"
++version = "0.20.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "07426f0d8fe5a601f26293f300afd1a7b1ed5e78b2a705870c5f30893c5163be"
++checksum = "deaa5745de3f5231ce10517a1f5dd97d53e5a2fd77aa6b5842292085831d48d7"
+ dependencies = [
+ "once_cell",
+ "python3-dll-a",
+@@ -386,9 +393,9 @@ dependencies = [
+
+ [[package]]
+ name = "pyo3-ffi"
+-version = "0.20.2"
++version = "0.20.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "dbb7dec17e17766b46bca4f1a4215a85006b4c2ecde122076c562dd058da6cf1"
++checksum = "62b42531d03e08d4ef1f6e85a2ed422eb678b8cd62b762e53891c05faf0d4afa"
+ dependencies = [
+ "libc",
+ "pyo3-build-config",
+@@ -396,9 +403,9 @@ dependencies = [
+
+ [[package]]
+ name = "pyo3-macros"
+-version = "0.20.2"
++version = "0.20.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "05f738b4e40d50b5711957f142878cfa0f28e054aa0ebdfc3fd137a843f74ed3"
++checksum = "7305c720fa01b8055ec95e484a6eca7a83c841267f0dd5280f0c8b8551d2c158"
+ dependencies = [
+ "proc-macro2",
+ "pyo3-macros-backend",
+@@ -408,12 +415,13 @@ dependencies = [
+
+ [[package]]
+ name = "pyo3-macros-backend"
+-version = "0.20.2"
++version = "0.20.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "0fc910d4851847827daf9d6cdd4a823fbdaab5b8818325c5e97a86da79e8881f"
++checksum = "7c7e9b68bb9c3149c5b0cade5d07f953d6d125eb4337723c4ccdb665f1f96185"
+ dependencies = [
+ "heck",
+ "proc-macro2",
++ "pyo3-build-config",
+ "quote",
+ "syn",
+ ]
+--- a/Cargo.toml
++++ b/Cargo.toml
+@@ -26,7 +26,7 @@ include = [
+ ]
+
+ [dependencies]
+-pyo3 = { version = "0.20.2", features = ["generate-import-lib", "num-bigint"] }
++pyo3 = { version = "0.20.3", features = ["generate-import-lib", "num-bigint"] }
+ regex = "1.10.2"
+ strum = { version = "0.25.0", features = ["derive"] }
+ strum_macros = "0.25.3"
+@@ -70,12 +70,12 @@ debug = true
+ strip = false
+
+ [dev-dependencies]
+-pyo3 = { version = "0.20.2", features = ["auto-initialize"] }
++pyo3 = { version = "0.20.3", features = ["auto-initialize"] }
+
+ [build-dependencies]
+ version_check = "0.9.4"
+ # used where logic has to be version/distribution specific, e.g. pypy
+-pyo3-build-config = { version = "0.20.2" }
++pyo3-build-config = { version = "0.20.3" }
+
+ [lints.clippy]
+ dbg_macro = "warn"
diff --git a/meta-python/recipes-devtools/python/python3-pydantic-core/run-ptest b/meta-python/recipes-devtools/python/python3-pydantic-core/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pydantic-core/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-pydantic-core_2.16.3.bb b/meta-python/recipes-devtools/python/python3-pydantic-core_2.16.3.bb
new file mode 100644
index 0000000000..faa291ea6d
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pydantic-core_2.16.3.bb
@@ -0,0 +1,52 @@
+SUMMARY = "Provides the core functionality for pydantic validation and serialization."
+DESCRIPTION = "This package provides the core functionality for \
+pydantic validation and serialization.\
+\
+Pydantic-core is currently around 17x faster than pydantic V1."
+HOMEPAGE = "https://github.com/pydantic/pydantic-core"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ab599c188b4a314d2856b3a55030c75c"
+
+SRC_URI += "file://0001-Bumps-pyo3-https-github.com-pyo3-pyo3-from-0.20.2-to.patch"
+SRC_URI[sha256sum] = "1cac689f80a3abab2d3c0048b29eea5751114054f032a941a32de4c852c59cad"
+
+DEPENDS = "python3-maturin-native python3-typing-extensions"
+
+require ${BPN}-crates.inc
+
+inherit pypi cargo-update-recipe-crates python_maturin
+
+PYPI_PACKAGE = "pydantic_core"
+
+RDEPENDS:${PN} += "python3-typing-extensions"
+
+INSANE_SKIP:${PN} = "already-stripped"
+
+inherit ptest
+SRC_URI += "file://run-ptest"
+RDEPENDS:${PN}-ptest += "\
+ python3-dirty-equals \
+ python3-hypothesis \
+ python3-pytest \
+ python3-pytest-mock \
+ python3-pytest-timeout \
+ python3-pytest-benchmark \
+ python3-unittest-automake-output \
+"
+
+do_install:append() {
+ for f in ${D}/${PYTHON_SITEPACKAGES_DIR}/pydantic_core/_pydantic_core.*.so
+ do
+ fname=`basename $f`
+ lname=`echo $fname | sed 's/musl/gnu/'`
+ if [ "$fname" != "$lname" ]; then
+ mv $f ${D}/${PYTHON_SITEPACKAGES_DIR}/pydantic_core/$lname
+ fi
+ done
+}
+
+do_install_ptest() {
+ cp -rf ${S}/tests/ ${D}${PTEST_PATH}/
+ sed -i -e "/--automake/ s/$/ -k 'not test_model_class_root_validator_wrap and not test_model_class_root_validator_before and not test_model_class_root_validator_after'/" ${D}${PTEST_PATH}/run-ptest
+}
diff --git a/meta-python/recipes-devtools/python/python3-pydantic/run-ptest b/meta-python/recipes-devtools/python/python3-pydantic/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pydantic/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-pydantic_2.7.0.bb b/meta-python/recipes-devtools/python/python3-pydantic_2.7.0.bb
new file mode 100644
index 0000000000..36ad83527d
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pydantic_2.7.0.bb
@@ -0,0 +1,53 @@
+SUMMARY = "Data validation using Python type hinting"
+DESCRIPTION = "Data validation and settings management using Python \
+type hints.\
+\
+Fast and extensible, Pydantic plays nicely with your linters/IDE/brain. \
+Define how data should be in pure, canonical Python 3.7+; validate it with \
+Pydantic."
+HOMEPAGE = "https://github.com/samuelcolvin/pydantic"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=09280955509d1c4ca14bae02f21d49a6"
+
+inherit pypi python_hatchling
+
+SRC_URI[sha256sum] = "b5ecdd42262ca2462e2624793551e80911a1e989f462910bb81aef974b4bb383"
+
+DEPENDS += "python3-hatch-fancy-pypi-readme-native"
+
+RDEPENDS:${PN} += "\
+ python3-annotated-types \
+ python3-core \
+ python3-datetime \
+ python3-image \
+ python3-io \
+ python3-json \
+ python3-logging \
+ python3-netclient \
+ python3-numbers \
+ python3-profile \
+ python3-pydantic-core \
+ python3-typing-extensions \
+"
+
+inherit ptest
+SRC_URI += "file://run-ptest"
+RDEPENDS:${PN}-ptest += "\
+ python3-cloudpickle \
+ python3-dirty-equals \
+ python3-pytest \
+ python3-pytest-mock \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ cp -rf ${S}/tests/ ${D}${PTEST_PATH}/
+ # Requires 'ruff' (python3-ruff) which we cannot build
+ # until we have Rust 1.71+ in oe-core
+ rm -f ${D}${PTEST_PATH}/tests/test_docs.py
+ # We are not trying to support mypy
+ rm -f ${D}${PTEST_PATH}/tests/test_mypy.py
+ # We are not trying to run benchmarks
+ rm -rf ${D}${PTEST_PATH}/tests/benchmarks
+ sed -i -e "/--automake/ s/$/ -k 'not test_config_validation_error_cause and not test_dataclass_config_validate_default and not test_annotated_validator_nested and not test_use_bare and not test_use_no_fields and not test_validator_bad_fields_throws_configerror and not test_assert_raises_validation_error and not test_model_config_validate_default'/" ${D}${PTEST_PATH}/run-ptest
+}
diff --git a/meta-python/recipes-devtools/python/python3-pydbus/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 adaa86d5a2..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,6 +1,28 @@
-require python-pydbus.inc
-inherit pypi setuptools3
+DESCRIPTION = "Pythonic DBus library"
+HOMEPAGE = "https://pypi.python.org/pypi/pydbus/"
+LICENSE = "LGPL-2.1-only"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=a916467b91076e631dd8edb7424769c7"
-SRC_URI += "file://0001-Support-asynchronous-calls-58.patch \
- file://0002-Support-transformation-between-D-Bus-errors-and-exce.patch \
+SRCREV = "f2e6355a88351e7d644ccb2b4d67b19305507312"
+SRC_URI = " \
+ git://github.com/LEW21/pydbus.git;protocol=https;branch=master \
+ file://0001-make-direction-attribute-conforming-to-introspect.dt.patch \
+ file://0002-Support-asynchronous-calls-58.patch \
+ file://0003-Support-transformation-between-D-Bus-errors-and-exce.patch \
+ file://run-ptest \
"
+
+inherit ptest setuptools3
+
+S = "${WORKDIR}/git"
+
+RDEPENDS:${PN} = "python3-pygobject \
+ python3-io \
+ python3-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.2.1.bb b/meta-python/recipes-devtools/python/python3-pydicti_1.2.1.bb
new file mode 100644
index 0000000000..2363c29059
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pydicti_1.2.1.bb
@@ -0,0 +1,8 @@
+SUMMARY = "Case insensitive derivable dictionary"
+HOMEPAGE = "https://github.com/coldfix/pydicti"
+LICENSE = "WTFPL"
+LIC_FILES_CHKSUM = "file://COPYING;md5=389a9e29629d1f05e115f8f05c283df5"
+
+SRC_URI[sha256sum] = "63e0756ff27a335e92916ff40be589a21a58894b3a93099edf0f3cbf695690dc"
+
+inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-pyexpect_1.0.17.bb b/meta-python/recipes-devtools/python/python3-pyexpect_1.0.17.bb
deleted file mode 100644
index bfd5840410..0000000000
--- a/meta-python/recipes-devtools/python/python3-pyexpect_1.0.17.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-pyexpect.inc
diff --git a/meta-python/recipes-devtools/python/python3-pyexpect_1.0.22.bb b/meta-python/recipes-devtools/python/python3-pyexpect_1.0.22.bb
new file mode 100644
index 0000000000..1cbd2384a3
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyexpect_1.0.22.bb
@@ -0,0 +1,12 @@
+SUMMARY = "Python expectaton library"
+DESCRIPTION = "Minimal but very flexible implementation of the expect pattern"
+SECTION = "devel/python"
+HOMEPAGE = " https://bitbucket.org/dwt/pyexpect"
+LICENSE = "ISC"
+LIC_FILES_CHKSUM = "file://README.md;md5=a6aa1e7097aca5955f9a2e1c8b0ce158"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "659351e7ee8923b42de8a774fabfc806acf07377d7fd19f2ea4412ef8f619c6a"
+
+RDEPENDS:${PN} += "python3-numbers"
diff --git a/meta-python/recipes-devtools/python/python3-pyfanotify/0001-ext-define-FNM_EXTMATCH-if-not-already-defined.patch b/meta-python/recipes-devtools/python/python3-pyfanotify/0001-ext-define-FNM_EXTMATCH-if-not-already-defined.patch
new file mode 100644
index 0000000000..4c279bbcda
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyfanotify/0001-ext-define-FNM_EXTMATCH-if-not-already-defined.patch
@@ -0,0 +1,29 @@
+From 87f1bf7d1e0ca2a841706d1c41d14382f11264db Mon Sep 17 00:00:00 2001
+From: Bartosz Golaszewski <brgl@bgdev.pl>
+Date: Thu, 28 Apr 2022 16:32:06 +0200
+Subject: [PATCH] ext: define FNM_EXTMATCH if not already defined
+
+On musl this constant is not defined. Define it locally if not present.
+
+Upstream-Status: Inappropriate
+
+Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>
+
+---
+ src/ext.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/src/ext.c b/src/ext.c
+index fb33de1..fa01a81 100644
+--- a/src/ext.c
++++ b/src/ext.c
+@@ -19,6 +19,9 @@
+ #include <sys/vfs.h>
+ #include <unistd.h>
+
++#ifndef FNM_EXTMATCH
++#define FNM_EXTMATCH 0
++#endif
+
+ #define FUNUSED __attribute__((unused))
+
diff --git a/meta-python/recipes-devtools/python/python3-pyfanotify_0.2.2.bb b/meta-python/recipes-devtools/python/python3-pyfanotify_0.2.2.bb
new file mode 100644
index 0000000000..292ceab2e3
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyfanotify_0.2.2.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Python wrapper for Linux fanotify."
+HOMEPAGE = "https://github.com/baskiton/pyfanotify"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=636a36c9df04efcfacf839b8866d9a37"
+
+SRC_URI += "file://0001-ext-define-FNM_EXTMATCH-if-not-already-defined.patch"
+SRC_URI[sha256sum] = "90219aa9f8b78fa732f24aa7b21c7bb6ac97a6eb47f1763c899b8194e23af1df"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-crypt \
+ python3-datetime \
+ python3-logging \
+ python3-multiprocessing \
+"
diff --git a/meta-python/recipes-devtools/python/python3-pyfirmata_1.0.3.bb b/meta-python/recipes-devtools/python/python3-pyfirmata_1.0.3.bb
deleted file mode 100644
index 25af1b5c0a..0000000000
--- a/meta-python/recipes-devtools/python/python3-pyfirmata_1.0.3.bb
+++ /dev/null
@@ -1,3 +0,0 @@
-inherit setuptools3
-require python-pyfirmata.inc
-
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
new file mode 100644
index 0000000000..02ebeaad79
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyfirmata_1.1.0.bb
@@ -0,0 +1,13 @@
+SUMMARY = "A Python interface for the Firmata protocol"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=84ddcef430b7c44caa22b2ff4b37a3df"
+PYPI_PACKAGE = "pyFirmata"
+
+RDEPENDS:${PN} = "\
+ python3-pyserial \
+"
+
+SRC_URI[md5sum] = "159673cfb56c72ceafc30fe91eedd847"
+SRC_URI[sha256sum] = "cc180d1b30c85a2bbca62c15fef1b871db048cdcfa80959968356d97bd3ff08e"
+
+inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-pyflakes_3.2.0.bb b/meta-python/recipes-devtools/python/python3-pyflakes_3.2.0.bb
new file mode 100644
index 0000000000..b7ee20ebe4
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyflakes_3.2.0.bb
@@ -0,0 +1,10 @@
+SUMMARY = "passive checker of Python programs"
+HOMEPAGE = "https://github.com/PyCQA/pyflakes"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=690c2d09203dc9e07c4083fc45ea981f"
+
+SRC_URI[sha256sum] = "1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"
+
+inherit pypi setuptools3
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-pyhamcrest_2.1.0.bb b/meta-python/recipes-devtools/python/python3-pyhamcrest_2.1.0.bb
new file mode 100644
index 0000000000..eaa24eefe5
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyhamcrest_2.1.0.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Hamcrest framework for matcher objects"
+HOMEPAGE = "https://github.com/hamcrest/PyHamcrest"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=79391bf1501c898472d043f36e960612"
+
+SRC_URI[sha256sum] = "c6acbec0923d0cb7e72c22af1926f3e7c97b8e8d69fc7498eabacaf7c975bd9c"
+
+inherit pypi python_setuptools_build_meta
+
+DEPENDS += "python3-hatch-vcs-native"
+
+UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/PyHamcrest/"
+UPSTREAM_CHECK_REGEX = "/PyHamcrest/(?P<pver>(\d+[\.\-_]*)+)"
+
+RDEPENDS:${PN} += " \
+ python3-six \
+ python3-numbers \
+"
diff --git a/meta-python/recipes-devtools/python/python3-pyiface_0.0.11.bb b/meta-python/recipes-devtools/python/python3-pyiface_0.0.11.bb
index 721e7b1c99..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,2 +1,18 @@
-inherit setuptools3
-require python-pyiface.inc
+SUMMARY = "Pyiface is a package that exposes the network interfaces of the operating system in a easy to use and transparent way"
+HOMEPAGE = "https://pypi.python.org/pypi/pyiface/"
+SECTION = "devel/python"
+LICENSE = "GPL-3.0-or-later"
+
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=4fe869ee987a340198fb0d54c55c47f1"
+
+DEPENDS += "python3-setuptools-scm-native"
+
+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 b3bab989ab..0000000000
--- a/meta-python/recipes-devtools/python/python3-pyinotify_0.9.6.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-pyinotify.inc
diff --git a/meta-python/recipes-devtools/python/python3-pyjks_17.1.1.bb b/meta-python/recipes-devtools/python/python3-pyjks_17.1.1.bb
deleted file mode 100644
index 8982fcebc3..0000000000
--- a/meta-python/recipes-devtools/python/python3-pyjks_17.1.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-pyjks.inc
-inherit setuptools3
diff --git a/meta-python/recipes-devtools/python/python-pyjks.inc b/meta-python/recipes-devtools/python/python3-pyjks_20.0.0.bb
index d866c56504..c0cca98ff6 100644
--- a/meta-python/recipes-devtools/python/python-pyjks.inc
+++ b/meta-python/recipes-devtools/python/python3-pyjks_20.0.0.bb
@@ -6,17 +6,17 @@ HOMEPAGE = "http://github.com/kurtbrose/pyjks"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=9694d6cc724caf7f7386be88a4a81958"
-SRC_URI[md5sum] = "d53501e7c80d465969742bc6bee91d49"
-SRC_URI[sha256sum] = "709c44a303dd6b2464078ebeb677417e717818d4b3dc3844a462bef9d215dcc8"
+SRC_URI[md5sum] = "1a6bce95484f1f62f8ff59755972c632"
+SRC_URI[sha256sum] = "0378cec15fb11b2ed27ba54dad9fd987d48e6f62f49fcff138f5f7a8b312b044"
-inherit pypi
+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_1.6.4.bb b/meta-python/recipes-devtools/python/python3-pyjwt_1.6.4.bb
deleted file mode 100644
index dc16d22825..0000000000
--- a/meta-python/recipes-devtools/python/python3-pyjwt_1.6.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-pyjwt.inc
-inherit setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-pyjwt_2.8.0.bb b/meta-python/recipes-devtools/python/python3-pyjwt_2.8.0.bb
new file mode 100644
index 0000000000..92a8f44c6b
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyjwt_2.8.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] = "57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"
+
+PYPI_PACKAGE = "PyJWT"
+inherit pypi setuptools3
+
+RDEPENDS:${PN} = " \
+ python3-json \
+ python3-cryptography \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-pykwalify_1.8.0.bb b/meta-python/recipes-devtools/python/python3-pykwalify_1.8.0.bb
new file mode 100644
index 0000000000..d94051df89
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pykwalify_1.8.0.bb
@@ -0,0 +1,20 @@
+SUMMARY = "YAML/JSON validation library"
+DESCRIPTION = "pykwalify is a schema validator for YAML and JSON"
+HOMEPAGE = "https://pypi.org/project/pykwalify/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=4eaf57328ad29ea2e0ed31a57f0914dc"
+
+SRC_URI[sha256sum] = "796b2ad3ed4cb99b88308b533fb2f559c30fa6efb4fa9fda11347f483d245884"
+
+PYPI_PACKAGE = "pykwalify"
+
+inherit setuptools3 pypi
+
+RDEPENDS:${PN} = "\
+ python3-dateutil \
+ python3-docopt \
+ python3-logging \
+ python3-ruamel-yaml \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-pylint/0001-Adjust-test-expectations-for-ptest.patch b/meta-python/recipes-devtools/python/python3-pylint/0001-Adjust-test-expectations-for-ptest.patch
new file mode 100644
index 0000000000..8edecbf1bd
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pylint/0001-Adjust-test-expectations-for-ptest.patch
@@ -0,0 +1,44 @@
+From f3a213cf4922c122e554277ea2031c0c54cd3fe5 Mon Sep 17 00:00:00 2001
+From: Dan McGregor <dan.mcgregor@vecima.com>
+Date: Wed, 13 Mar 2024 14:08:25 -0600
+Subject: [PATCH] Adjust test expectations for ptest
+
+Because of the way we install ptests, some first party imports
+became third party. Reflect that in the test case.
+
+Upstream-Status: Inappropriate (embedded specific)
+Signed-off-by: Dan McGregor <dan.mcgregor@vecima.com>
+---
+ tests/functional/w/wrong_import_order.txt | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+diff --git a/tests/functional/w/wrong_import_order.txt b/tests/functional/w/wrong_import_order.txt
+index 068d2140d..9594ff9e0 100644
+--- a/tests/functional/w/wrong_import_order.txt
++++ b/tests/functional/w/wrong_import_order.txt
+@@ -3,14 +3,14 @@ wrong-import-order:14:0:14:10::"standard import ""sys"" should be placed before
+ wrong-import-order:15:0:15:15::"standard import ""datetime"" should be placed before third party imports ""six"", ""astroid.are_exclusive""":UNDEFINED
+ wrong-import-order:18:0:18:22::"third party import ""totally_missing"" should be placed before local import ""package.Class""":UNDEFINED
+ wrong-import-order:20:0:20:14::"third party import ""astroid"" should be placed before local imports ""package.Class"", "".package""":UNDEFINED
+-wrong-import-order:22:0:22:22::"first party import ""pylint.checkers"" should be placed before local imports ""package.Class"", "".package"", "".package2""":UNDEFINED
+-wrong-import-order:23:0:23:25::"first party import ""pylint.config"" should be placed before local imports ""package.Class"", "".package"", "".package2""":UNDEFINED
+-wrong-import-order:24:0:24:17::"first party import ""pylint.sys"" should be placed before local imports ""package.Class"", "".package"", "".package2""":UNDEFINED
+-wrong-import-order:25:0:25:28::"first party import ""pylint.pyreverse"" should be placed before local imports ""package.Class"", "".package"", "".package2""":UNDEFINED
+-wrong-import-order:30:0:30:40::"third party import ""six.moves.urllib.parse.quote"" should be placed before first party imports ""pylint.checkers"", ""pylint.config"", ""pylint.sys"", ""pylint.pyreverse"" and local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
+-wrong-import-order:31:0:31:23::"first party import ""pylint.constants"" should be placed before local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
+-wrong-import-order:32:0:32:19::"standard import ""re"" should be placed before third party imports ""six"", ""astroid.are_exclusive"", ""unused_import"", ""totally_missing"", ""astroid"", ""six.moves.urllib.parse.quote"", first party imports ""pylint.checkers"", ""pylint.config"", ""pylint.sys"", ""pylint.pyreverse"", ""pylint.constants"", and local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
+-wrong-import-order:32:0:32:19::"third party import ""requests"" should be placed before first party imports ""pylint.checkers"", ""pylint.config"", ""pylint.sys"", ""pylint.pyreverse"", ""pylint.constants"" and local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
+-wrong-import-order:33:0:33:24::"first party import ""pylint.exceptions"" should be placed before local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
+-wrong-import-order:34:0:34:21::"first party import ""pylint.message"" should be placed before local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
+-wrong-import-order:35:0:35:11::"standard import ""time"" should be placed before third party imports ""six"", ""astroid.are_exclusive"", ""unused_import"" (...) ""astroid"", ""six.moves.urllib.parse.quote"", ""requests"", first party imports ""pylint.checkers"", ""pylint.config"", ""pylint.sys"" (...) ""pylint.constants"", ""pylint.exceptions"", ""pylint.message"", and local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
++wrong-import-order:22:0:22:22::"third party import ""pylint.checkers"" should be placed before local imports ""package.Class"", "".package"", "".package2""":UNDEFINED
++wrong-import-order:23:0:23:25::"third party import ""pylint.config"" should be placed before local imports ""package.Class"", "".package"", "".package2""":UNDEFINED
++wrong-import-order:24:0:24:17::"third party import ""pylint.sys"" should be placed before local imports ""package.Class"", "".package"", "".package2""":UNDEFINED
++wrong-import-order:25:0:25:28::"third party import ""pylint.pyreverse"" should be placed before local imports ""package.Class"", "".package"", "".package2""":UNDEFINED
++wrong-import-order:30:0:30:40::"third party import ""six.moves.urllib.parse.quote"" should be placed before local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
++wrong-import-order:31:0:31:23::"third party import ""pylint.constants"" should be placed before local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
++wrong-import-order:32:0:32:19::"standard import ""re"" should be placed before third party imports ""six"", ""astroid.are_exclusive"", ""unused_import"" (...) ""pylint.pyreverse"", ""six.moves.urllib.parse.quote"", ""pylint.constants"" and local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
++wrong-import-order:32:0:32:19::"third party import ""requests"" should be placed before local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
++wrong-import-order:33:0:33:24::"third party import ""pylint.exceptions"" should be placed before local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
++wrong-import-order:34:0:34:21::"third party import ""pylint.message"" should be placed before local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
++wrong-import-order:35:0:35:11::"standard import ""time"" should be placed before third party imports ""six"", ""astroid.are_exclusive"", ""unused_import"" (...) ""requests"", ""pylint.exceptions"", ""pylint.message"" and local imports ""package.Class"", "".package"", "".package2"" (...) ""package3.Class3"", "".package4"", ""package4.Class4""":UNDEFINED
diff --git a/meta-python/recipes-devtools/python/python3-pylint/run-ptest b/meta-python/recipes-devtools/python/python3-pylint/run-ptest
new file mode 100644
index 0000000000..ed424cb879
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pylint/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --benchmark-disable -vv --minimal-messages-config --automake tests/test_functional.py
diff --git a/meta-python/recipes-devtools/python/python3-pylint_1.8.3.bb b/meta-python/recipes-devtools/python/python3-pylint_1.8.3.bb
deleted file mode 100644
index 563e8316cf..0000000000
--- a/meta-python/recipes-devtools/python/python3-pylint_1.8.3.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3 python3-dir
-require python-pylint.inc
diff --git a/meta-python/recipes-devtools/python/python3-pylint_3.1.0.bb b/meta-python/recipes-devtools/python/python3-pylint_3.1.0.bb
new file mode 100644
index 0000000000..12f4f908af
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pylint_3.1.0.bb
@@ -0,0 +1,57 @@
+SUMMARY="Pylint is a Python source code analyzer"
+HOMEPAGE= "http://www.pylint.org/"
+LICENSE = "GPL-2.0-only"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=c107cf754550e65755c42985a5d4e9c9"
+
+SRC_URI += "git://github.com/pylint-dev/pylint;branch=maintenance/3.1.x;protocol=https \
+ file://0001-Adjust-test-expectations-for-ptest.patch \
+ file://run-ptest \
+ "
+SRCREV = "053c2c3a25f97f043e10cdd41d2609e495a68f57"
+
+inherit python_setuptools_build_meta ptest
+
+RDEPENDS:${PN} += "\
+ python3-astroid \
+ python3-difflib \
+ python3-dill \
+ python3-isort \
+ python3-json \
+ python3-mccabe \
+ python3-netserver \
+ python3-numbers \
+ python3-pkgutil \
+ python3-platformdirs \
+ python3-shell \
+ python3-tomlkit \
+ "
+
+RDEPENDS:${PN}-ptest += " \
+ python3-core \
+ python3-git \
+ python3-py \
+ python3-pytest \
+ python3-pytest-benchmark \
+ python3-pytest-runner \
+ python3-pytest-timeout \
+ python3-pytest-xdist \
+ python3-requests \
+ python3-statistics \
+ python3-tomllib \
+ python3-typing-extensions \
+ python3-unittest-automake-output \
+ "
+
+S = "${WORKDIR}/git"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+ install -Dm 0644 ${S}/tests/.pylint_primer_tests/.gitkeep ${D}${PTEST_PATH}/tests/.pylint_primer_tests/.gitkeep
+ sed -i 's#/usr/bin/python$#/usr/bin/python3#g' ${D}${PTEST_PATH}/tests/data/ascript
+ # regression_distutil_import_error_73.py fails to run see
+ # https://lists.openembedded.org/g/openembedded-devel/topic/103181847
+ rm ${D}${PTEST_PATH}/tests/functional/r/regression_02/regression_distutil_import_error_73.py
+}
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-pylyrics_1.1.0.bb b/meta-python/recipes-devtools/python/python3-pylyrics_1.1.0.bb
index 207751c451..1ac95e8be3 100644
--- a/meta-python/recipes-devtools/python/python3-pylyrics_1.1.0.bb
+++ b/meta-python/recipes-devtools/python/python3-pylyrics_1.1.0.bb
@@ -9,4 +9,10 @@ SRC_URI[sha256sum] = "c5f36e8ef0ed3b487a9242ce34c19f9684e418a5bbffd5d367dc1d1604
PYPI_PACKAGE = "PyLyrics"
PYPI_PACKAGE_EXT = "zip"
-inherit pypi setuptools3 \ No newline at end of file
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-beautifulsoup4 \
+ python3-classes \
+ python3-requests \
+"
diff --git a/meta-python/recipes-devtools/python/python3-pymemcache_4.0.0.bb b/meta-python/recipes-devtools/python/python3-pymemcache_4.0.0.bb
new file mode 100644
index 0000000000..8d966cfb63
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pymemcache_4.0.0.bb
@@ -0,0 +1,22 @@
+DESCRIPTION = "A comprehensive, fast, pure Python memcached client"
+HOMEPAGE = "https://github.com/pinterest/pymemcache"
+SECTION = "devel/python"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=3b83ef96387f14655fc854ddc3c6bd57"
+
+PYPI_PACKAGE = "pymemcache"
+
+SRC_URI[sha256sum] = "27bf9bd1bbc1e20f83633208620d56de50f14185055e49504f4f5e94e94aff94"
+
+inherit pypi setuptools3
+
+DEPENDS += " \
+ python3-setuptools-scm-native \
+ python3-six-native \
+"
+
+RDEPENDS:${PN} += "\
+ python3-io \
+ python3-core \
+ python3-logging \
+"
diff --git a/meta-python/recipes-devtools/python/python3-pymetno_0.12.0.bb b/meta-python/recipes-devtools/python/python3-pymetno_0.12.0.bb
new file mode 100644
index 0000000000..5be6e6319b
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pymetno_0.12.0.bb
@@ -0,0 +1,16 @@
+SUMMARY = "Python library to talk to the met.no api"
+HOMEPAGE = "https://github.com/Danielhiversen/pyMetno"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=5d503272f52c35147ec960cb56a03bf4"
+
+SRC_URI = "git://github.com/Danielhiversen/pyMetno.git;protocol=https;branch=master"
+SRCREV = "50f427aad264a4793abb94a3c8cbf987fadcd4ae"
+S = "${WORKDIR}/git"
+
+inherit setuptools3
+
+RDEPENDS:${PN} = "\
+ python3-aiohttp (>=3.6.1) \
+ python3-async-timeout (>=3.0.1) \
+ python3-pytz (>=2019.3) \
+"
diff --git a/meta-python/recipes-devtools/python/python3-pymisp_2.4.188.bb b/meta-python/recipes-devtools/python/python3-pymisp_2.4.188.bb
new file mode 100644
index 0000000000..59a00be154
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pymisp_2.4.188.bb
@@ -0,0 +1,22 @@
+DESCRIPTION = "Python API for MISP"
+HOMEPAGE = "https://github.com/MISP/PyMISP"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=a3639cf5780f71b125d3e9d1dc127c20"
+
+SRC_URI[sha256sum] = "c2313d059a9f4d1221243fcda64fb8ae11603c1745e92d57c4071aad04336696"
+
+inherit python_poetry_core pypi
+
+RDEPENDS:${PN} += " \
+ python3-dateutil \
+ python3-json \
+ python3-jsonschema \
+ python3-requests \
+ python3-six \
+ python3-deprecated \
+ python3-wrapt \
+"
+
+# Fixes: python3-pymisp requires /bin/bash, but no
+# providers found in RDEPENDS:python3-pymisp? [file-rdep]
+RDEPENDS:${PN} += "bash"
diff --git a/meta-python/recipes-devtools/python/python3-pymisp_2.4.93.bb b/meta-python/recipes-devtools/python/python3-pymisp_2.4.93.bb
deleted file mode 100644
index 4523d9e30a..0000000000
--- a/meta-python/recipes-devtools/python/python3-pymisp_2.4.93.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-pymisp.inc
diff --git a/meta-python/recipes-devtools/python/python3-pymodbus_3.6.7.bb b/meta-python/recipes-devtools/python/python3-pymodbus_3.6.7.bb
new file mode 100644
index 0000000000..323377253e
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pymodbus_3.6.7.bb
@@ -0,0 +1,31 @@
+SUMMARY = "A fully featured modbus protocol stack in python"
+HOMEPAGE = "https://github.com/riptideio/pymodbus/"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=eba8057aa82c058d2042b4b0a0e9cc63"
+
+SRC_URI[sha256sum] = "e6cefac57f8d0e887ef49a705743787d8f1f005df94bd148e3da43c2599c77f3"
+
+inherit pypi python_setuptools_build_meta
+
+PACKAGECONFIG ??= ""
+PACKAGECONFIG[repl] = ",,,python3-aiohttp python3-click python3-prompt-toolkit python3-pygments python3-pyserial-asyncio"
+PACKAGECONFIG[asyncio] = ",,,python3-pyserial-asyncio"
+PACKAGECONFIG[tornado] = ",,,python3-tornado"
+PACKAGECONFIG[twisted] = ",,,python3-twisted-conch"
+PACKAGECONFIG[redis] = ",,,python3-redis"
+PACKAGECONFIG[sql] = ",,,python3-sqlalchemy"
+
+RDEPENDS:${PN} += " \
+ python3-asyncio \
+ python3-core \
+ python3-io \
+ python3-json \
+ python3-logging \
+ python3-math \
+ python3-netserver \
+"
+
+RDEPENDS:${PN} += " \
+ python3-pyserial \
+ python3-six \
+"
diff --git a/meta-python/recipes-devtools/python/python3-pymongo_3.9.0.bb b/meta-python/recipes-devtools/python/python3-pymongo_3.9.0.bb
deleted file mode 100644
index 5164b186bf..0000000000
--- a/meta-python/recipes-devtools/python/python3-pymongo_3.9.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-pymongo.inc
diff --git a/meta-python/recipes-devtools/python/python-pymongo.inc b/meta-python/recipes-devtools/python/python3-pymongo_4.6.1.bb
index cd11d98129..260e134cd2 100644
--- a/meta-python/recipes-devtools/python/python-pymongo.inc
+++ b/meta-python/recipes-devtools/python/python3-pymongo_4.6.1.bb
@@ -8,22 +8,23 @@ HOMEPAGE = "http://github.com/mongodb/mongo-python-driver"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327"
-SRC_URI[md5sum] = "531786df7ad98f15c43f1b17edf5f84c"
-SRC_URI[sha256sum] = "4249c6ba45587b959292a727532826c5032d59171f923f7f823788f413c2a5a3"
+SRC_URI[sha256sum] = "31dab1f3e1d0cdd57e8df01b645f52d43cc1b653ed3afd535d2891f4fc4f9712"
-PACKAGES =+ "${PYTHON_PN}-bson"
+inherit pypi setuptools3
-FILES_${PYTHON_PN}-bson = "${PYTHON_SITEPACKAGES_DIR}/bson/*"
+PACKAGES =+ "python3-bson"
-RDEPENDS_${PYTHON_PN}-bson += " \
- ${PYTHON_PN}-datetime \
- ${PYTHON_PN}-json \
- ${PYTHON_PN}-netclient \
- ${PYTHON_PN}-numbers \
- ${PYTHON_PN}-threading \
+FILES:python3-bson = "${PYTHON_SITEPACKAGES_DIR}/bson/*"
+
+RDEPENDS:python3-bson += " \
+ python3-datetime \
+ python3-json \
+ python3-netclient \
+ python3-numbers \
+ python3-threading \
"
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-bson \
- ${PYTHON_PN}-pprint \
+RDEPENDS:${PN} += " \
+ python3-bson \
+ python3-pprint \
"
diff --git a/meta-python/recipes-devtools/python/python3-pymysql_0.9.3.bb b/meta-python/recipes-devtools/python/python3-pymysql_0.9.3.bb
deleted file mode 100644
index 13774bd632..0000000000
--- a/meta-python/recipes-devtools/python/python3-pymysql_0.9.3.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-pymysql.inc
diff --git a/meta-python/recipes-devtools/python/python-pymysql.inc b/meta-python/recipes-devtools/python/python3-pymysql_1.1.0.bb
index 8c7f4556cb..5e56a64aa1 100644
--- a/meta-python/recipes-devtools/python/python-pymysql.inc
+++ b/meta-python/recipes-devtools/python/python3-pymysql_1.1.0.bb
@@ -8,11 +8,12 @@ HOMEPAGE = "https://pymysql.readthedocs.io"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=528175c84163bb800d23ad835c7fa0fc"
-SRC_URI[md5sum] = "e5d9183cc0a775ac29f9e0365cca6556"
-SRC_URI[sha256sum] = "d8c059dcd81dedb85a9f034d5e22dcb4442c0b201908bede99e306d65ea7c8e7"
-
-inherit pypi
+SRC_URI[sha256sum] = "4f13a7df8bf36a51e81dd9f3605fede45a4878fe02f9236349fd82a3f0612f96"
PYPI_PACKAGE = "PyMySQL"
+inherit pypi python_setuptools_build_meta
+
+UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/pymysql/"
+UPSTREAM_CHECK_REGEX = "/pymysql/(?P<pver>(\d+[\.\-_]*)+)"
-RDEPENDS_${PN} += "${PYTHON_PN}-cryptography"
+RDEPENDS:${PN} += "python3-cryptography"
diff --git a/meta-python/recipes-devtools/python/python3-pynacl_1.5.0.bb b/meta-python/recipes-devtools/python/python3-pynacl_1.5.0.bb
new file mode 100644
index 0000000000..a2f2ab4df4
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pynacl_1.5.0.bb
@@ -0,0 +1,38 @@
+SUMMARY = "Python binding to the Networking and Cryptography (NaCl) library"
+DESCRIPTION = "Python binding to the Networking and Cryptography (NaCl) library"
+HOMEPAGE = "https://github.com/pyca/pynacl"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=8cc789b082b3d97e1ccc5261f8594d3f"
+
+SRC_URI[sha256sum] = "8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"
+
+PYPI_PACKAGE = "PyNaCl"
+
+inherit pypi python_setuptools_build_meta
+
+DEPENDS += "\
+ python3-cffi-native \
+ libsodium \
+"
+
+do_compile:prepend() {
+ export SODIUM_INSTALL=system
+}
+
+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 f6d9e3c06e..b1abac17aa 100644
--- a/meta-python/recipes-devtools/python/python3-pynetlinux_1.1.bb
+++ b/meta-python/recipes-devtools/python/python3-pynetlinux_1.1.bb
@@ -1,2 +1,21 @@
-inherit setuptools3
-require python-pynetlinux.inc
+SUMMARY = "Linux network configuration library for Python"
+DESCRIPTION = "This library contains Python bindings to ioctl calls"
+SECTION = "devel/python"
+HOMEPAGE = "http://github.com/rlisagor/pynetlinux"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=74e1861736ee959824fe7542323c12e9"
+
+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_19.0.0.bb b/meta-python/recipes-devtools/python/python3-pyopenssl_19.0.0.bb
deleted file mode 100644
index 0f0f83e3a2..0000000000
--- a/meta-python/recipes-devtools/python/python3-pyopenssl_19.0.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-pyopenssl.inc
diff --git a/meta-python/recipes-devtools/python/python3-pyparsing_2.4.2.bb b/meta-python/recipes-devtools/python/python3-pyparsing_2.4.2.bb
deleted file mode 100644
index 0805fee3e2..0000000000
--- a/meta-python/recipes-devtools/python/python3-pyparsing_2.4.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-pyparsing.inc
diff --git a/meta-python/recipes-devtools/python/python3-pyperclip_1.7.0.bb b/meta-python/recipes-devtools/python/python3-pyperclip_1.7.0.bb
deleted file mode 100644
index ee6f88bbbc..0000000000
--- a/meta-python/recipes-devtools/python/python3-pyperclip_1.7.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-pyperclip.inc
diff --git a/meta-python/recipes-devtools/python/python3-pyperclip_1.8.2.bb b/meta-python/recipes-devtools/python/python3-pyperclip_1.8.2.bb
new file mode 100644
index 0000000000..dcf0015c59
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyperclip_1.8.2.bb
@@ -0,0 +1,14 @@
+DESCRIPTION = "A cross-platform clipboard module for Python. (only handles plain text for now)"
+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"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-ctypes \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-pyperf_1.6.1.bb b/meta-python/recipes-devtools/python/python3-pyperf_1.6.1.bb
deleted file mode 100644
index 5ba5efb05d..0000000000
--- a/meta-python/recipes-devtools/python/python3-pyperf_1.6.1.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-inherit setuptools3
-require python-pyperf.inc
-
-RDEPENDS_${PN} += "${PYTHON_PN}-misc"
diff --git a/meta-python/recipes-devtools/python/python-pyperf.inc b/meta-python/recipes-devtools/python/python3-pyperf_2.6.3.bb
index 81837f3005..6b37e1864a 100644
--- a/meta-python/recipes-devtools/python/python-pyperf.inc
+++ b/meta-python/recipes-devtools/python/python3-pyperf_2.6.3.bb
@@ -13,11 +13,11 @@ Features: \
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://COPYING;md5=78bc2e6e87c8c61272937b879e6dc2f8"
-SRC_URI[md5sum] = "d67fe5f447963da8873f3e9923f76de1"
-SRC_URI[sha256sum] = "8d0143a22a13ee10c997a648f30b82cdc40175d5a20b11055ae058a82e45d371"
+SRC_URI[sha256sum] = "9752fe749c21e460a564bb3f52fc319b892c62ee61c5138b4a9bbf94ad2755e6"
-inherit pypi
+DEPENDS += "python3-six-native"
PYPI_PACKAGE = "pyperf"
+inherit pypi python_setuptools_build_meta
-DEPENDS += "${PYTHON_PN}-six-native"
+RDEPENDS:${PN} += "python3-misc python3-statistics"
diff --git a/meta-python/recipes-devtools/python/python3-pypng_0.20220715.0.bb b/meta-python/recipes-devtools/python/python3-pypng_0.20220715.0.bb
new file mode 100644
index 0000000000..9e30f67dc6
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pypng_0.20220715.0.bb
@@ -0,0 +1,8 @@
+SUMMARY = "PNG module for Python."
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENCE;md5=5b60f319c8cf51f825b4f40aadee3243"
+
+SRC_URI[sha256sum] = "739c433ba96f078315de54c0db975aee537cbc3e1d0ae4ed9aab0ca1e427e2c1"
+
+inherit pypi python_setuptools_build_meta
diff --git a/meta-python/recipes-devtools/python/python3-pyppmd_1.1.0.bb b/meta-python/recipes-devtools/python/python3-pyppmd_1.1.0.bb
new file mode 100644
index 0000000000..cec21007a2
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyppmd_1.1.0.bb
@@ -0,0 +1,20 @@
+SUMMARY = "PPMd compression/decompression library"
+HOMEPAGE = "https://pyppmd.readthedocs.io/en/latest/"
+LICENSE = "LGPL-2.1-or-later"
+SECTION = "devel/python"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=4fbd65380cdd255951079008b364516c"
+
+inherit pypi python_setuptools_build_meta
+
+SRC_URI[sha256sum] = "1d38ce2e4b7eb84b53bc8a52380b94f66ba6c39328b8800b30c2b5bf31693973"
+
+DEPENDS += " \
+ python3-setuptools-scm-native \
+ python3-toml-native \
+ python3-wheel-native \
+"
+
+RDEPENDS:${PN} += "\
+ python3-email \
+ python3-importlib-metadata \
+"
diff --git a/meta-python/recipes-devtools/python/python3-pyproj_3.6.1.bb b/meta-python/recipes-devtools/python/python3-pyproj_3.6.1.bb
new file mode 100644
index 0000000000..a4121c3934
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyproj_3.6.1.bb
@@ -0,0 +1,23 @@
+SUMMARY = "Python interface to PROJ (cartographic projections and coordinate transformations library)"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=873757af01d2d221eedb422c4c1dd163"
+DEPENDS = "python3-cython proj"
+DEPENDS:append:class-target = " python3-cython-native proj-native"
+
+PYPI_PACKAGE = "pyproj"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "44aa7c704c2b7d8fb3d483bbf75af6cb2350d30a63b144279a09b75fead501bf"
+
+RDEPENDS:${PN} = " \
+ python3-certifi \
+ python3-compression \
+ python3-json \
+ python3-logging \
+ python3-profile \
+"
+
+export PROJ_INCDIR = "${STAGING_INCDIR}"
+export PROJ_LIBDIR = "${STAGING_LIBDIR}"
+export PROJ_DIR = "${STAGING_BINDIR_NATIVE}/.."
diff --git a/meta-python/recipes-devtools/python/python3-pyproject-api_1.6.1.bb b/meta-python/recipes-devtools/python/python3-pyproject-api_1.6.1.bb
new file mode 100644
index 0000000000..aec19949d2
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyproject-api_1.6.1.bb
@@ -0,0 +1,23 @@
+# SPDX-License-Identifier: MIT
+# Copyright (C) 2023 iris-GmbH infrared & intelligent sensors
+
+SUMMARY = "pyproject-api aims to abstract away interaction with pyproject.toml style projects in a flexible way."
+HOMEPAGE = "https://pyproject-api.readthedocs.io"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=11610a9d8fd95649cf8159be12b98cb7"
+
+SRC_URI[sha256sum] = "1817dc018adc0d1ff9ca1ed8c60e1623d5aaca40814b953af14a9cf9a5cae538"
+
+PYPI_PACKAGE = "pyproject_api"
+
+BBCLASSEXTEND = "native nativesdk"
+inherit pypi python_hatchling
+
+DEPENDS += "\
+ python3-hatch-vcs-native \
+"
+
+RDEPENDS:${PN} += "\
+ python3-packaging \
+ python3-tomli \
+"
diff --git a/meta-python/recipes-devtools/python/python3-pyrad/use-poetry-core.patch b/meta-python/recipes-devtools/python/python3-pyrad/use-poetry-core.patch
new file mode 100644
index 0000000000..43a177da0a
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyrad/use-poetry-core.patch
@@ -0,0 +1,26 @@
+Upstream-Status: Backport [https://github.com/pyradius/pyrad/commit/ffe182a44909e8f8278fb3e2ea052ddc097b48b9]
+Signed-off-by: Ross Burton <ross.burton@arm.com>
+
+From a4b70067dd6269e14a2f9530d820390a8a454231 Mon Sep 17 00:00:00 2001
+From: Martin Weinelt <hexa@darmstadt.ccc.de>
+Date: Thu, 14 Apr 2022 22:07:37 +0200
+Subject: [PATCH] Use poetry-core for pyproject based builds
+
+https://github.com/python-poetry/poetry-core#why-is-this-required
+---
+ pyproject.toml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/pyproject.toml b/pyproject.toml
+index 87b1df3..711c52f 100755
+--- a/pyproject.toml
++++ b/pyproject.toml
+@@ -1,6 +1,6 @@
+ [build-system]
+-requires = ["poetry>=1.0"]
+-build-backend = "poetry.masonry.api"
++requires = ["poetry-core>=1.0.0"]
++build-backend = "poetry.core.masonry.api"
+
+ [tool.poetry]
+ name = "pyrad"
diff --git a/meta-python/recipes-devtools/python/python3-pyrad_2.4.bb b/meta-python/recipes-devtools/python/python3-pyrad_2.4.bb
new file mode 100644
index 0000000000..801233a026
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyrad_2.4.bb
@@ -0,0 +1,19 @@
+SUMMARY = "RADIUS tools"
+SECTION = "devel/python"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e910b35b0ef4e1f665b9a75d6afb7709"
+
+PYPI_PACKAGE = "pyrad"
+SRC_URI[sha256sum] = "057de4b7e89d8da57ba782c1bde45c63ebee720ae2c0b0a69beaff15c47e30d9"
+
+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
new file mode 100644
index 0000000000..f1c8729f0e
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyroute2/run-ptest
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+pytest --automake
+
diff --git a/meta-python/recipes-devtools/python/python3-pyroute2_0.5.2.bb b/meta-python/recipes-devtools/python/python3-pyroute2_0.5.2.bb
deleted file mode 100644
index a23e72c4ad..0000000000
--- a/meta-python/recipes-devtools/python/python3-pyroute2_0.5.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-pyroute2.inc
-inherit setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-pyroute2_0.7.10.bb b/meta-python/recipes-devtools/python/python3-pyroute2_0.7.10.bb
new file mode 100644
index 0000000000..740a6d7f73
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyroute2_0.7.10.bb
@@ -0,0 +1,41 @@
+SUMMARY = "A pure Python netlink and Linux network configuration library"
+LICENSE = "GPL-2.0-or-later | Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=dccbff78d7d79ae7e53953d43445c6e6 \
+ file://LICENSE.GPL-2.0-or-later;md5=b234ee4d69f5fce4486a80fdaf4a4263 \
+ file://LICENSE.Apache-2.0;md5=34281e312165f843a2b7d1f114fe65ce"
+
+SRC_URI[sha256sum] = "cc2f90aad1517cb0b301041f678cc8d3c3427c26e53f15c78c93c67928d89a02"
+
+inherit setuptools3 pypi ptest
+
+RDEPENDS:${PN} += " \
+ python3-ctypes \
+ python3-io \
+ python3-json \
+ python3-fcntl \
+ python3-logging \
+ python3-multiprocessing \
+ python3-pickle \
+ python3-pkgutil \
+ python3-pprint \
+ python3-shell \
+ python3-unixadmin \
+"
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-fcntl \
+ python3-pytest \
+ python3-sqlite3 \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+ sed -e "s|'test_unit|'tests/test_unit|g" -i ${D}${PTEST_PATH}/tests/test_unit/test_nlmsg/test_marshal.py \
+ ${D}${PTEST_PATH}/tests/test_unit/test_iproute_match/test_match.py
+}
diff --git a/meta-python/recipes-devtools/python/python3-pyrsistent_0.15.4.bb b/meta-python/recipes-devtools/python/python3-pyrsistent_0.15.4.bb
deleted file mode 100644
index 2e567e9f9c..0000000000
--- a/meta-python/recipes-devtools/python/python3-pyrsistent_0.15.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-pyrsistent.inc
diff --git a/meta-python/recipes-devtools/python/python3-pyruvate-crates.inc b/meta-python/recipes-devtools/python/python3-pyruvate-crates.inc
new file mode 100644
index 0000000000..b8a74e617f
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyruvate-crates.inc
@@ -0,0 +1,216 @@
+# Autogenerated with 'bitbake -c update_crates python3-pyruvate'
+
+# from Cargo.lock
+SRC_URI += " \
+ crate://crates.io/aho-corasick/0.7.20 \
+ crate://crates.io/autocfg/1.1.0 \
+ crate://crates.io/bitflags/1.3.2 \
+ crate://crates.io/block-buffer/0.10.3 \
+ crate://crates.io/cc/1.0.78 \
+ crate://crates.io/cfg-if/1.0.0 \
+ crate://crates.io/cpufeatures/0.2.5 \
+ crate://crates.io/cpython/0.7.1 \
+ crate://crates.io/crossbeam/0.8.2 \
+ crate://crates.io/crossbeam-channel/0.5.6 \
+ crate://crates.io/crossbeam-deque/0.8.2 \
+ crate://crates.io/crossbeam-epoch/0.9.13 \
+ crate://crates.io/crossbeam-queue/0.3.8 \
+ crate://crates.io/crossbeam-utils/0.8.14 \
+ crate://crates.io/crypto-common/0.1.6 \
+ crate://crates.io/digest/0.10.6 \
+ crate://crates.io/encoding/0.2.33 \
+ crate://crates.io/encoding-index-japanese/1.20141219.5 \
+ crate://crates.io/encoding-index-korean/1.20141219.5 \
+ crate://crates.io/encoding-index-simpchinese/1.20141219.5 \
+ crate://crates.io/encoding-index-singlebyte/1.20141219.5 \
+ crate://crates.io/encoding-index-tradchinese/1.20141219.5 \
+ crate://crates.io/encoding_index_tests/0.1.4 \
+ crate://crates.io/env_logger/0.10.0 \
+ crate://crates.io/errno/0.2.8 \
+ crate://crates.io/errno-dragonfly/0.1.2 \
+ crate://crates.io/fastrand/1.8.0 \
+ crate://crates.io/generic-array/0.14.6 \
+ crate://crates.io/getrandom/0.2.8 \
+ crate://crates.io/hermit-abi/0.1.19 \
+ crate://crates.io/hermit-abi/0.2.6 \
+ crate://crates.io/hmac/0.12.1 \
+ crate://crates.io/httparse/1.8.0 \
+ crate://crates.io/humantime/2.1.0 \
+ crate://crates.io/instant/0.1.12 \
+ crate://crates.io/io-lifetimes/1.0.3 \
+ crate://crates.io/is-terminal/0.4.1 \
+ crate://crates.io/itoa/1.0.5 \
+ crate://crates.io/libc/0.2.138 \
+ crate://crates.io/libsystemd/0.5.0 \
+ crate://crates.io/linux-raw-sys/0.1.4 \
+ crate://crates.io/log/0.4.17 \
+ crate://crates.io/memchr/2.5.0 \
+ crate://crates.io/memoffset/0.6.5 \
+ crate://crates.io/memoffset/0.7.1 \
+ crate://crates.io/minimal-lexical/0.2.1 \
+ crate://crates.io/mio/0.8.5 \
+ crate://crates.io/nix/0.23.2 \
+ crate://crates.io/nix/0.26.1 \
+ crate://crates.io/nom/7.1.1 \
+ crate://crates.io/num-traits/0.2.15 \
+ crate://crates.io/num_cpus/1.14.0 \
+ crate://crates.io/num_threads/0.1.6 \
+ crate://crates.io/once_cell/1.16.0 \
+ crate://crates.io/paste/1.0.11 \
+ crate://crates.io/pin-utils/0.1.0 \
+ crate://crates.io/ppv-lite86/0.2.17 \
+ crate://crates.io/proc-macro2/1.0.49 \
+ crate://crates.io/python3-sys/0.7.1 \
+ crate://crates.io/quote/1.0.23 \
+ crate://crates.io/rand/0.8.5 \
+ crate://crates.io/rand_chacha/0.3.1 \
+ crate://crates.io/rand_core/0.6.4 \
+ crate://crates.io/redox_syscall/0.2.16 \
+ crate://crates.io/regex/1.7.0 \
+ crate://crates.io/regex-syntax/0.6.28 \
+ crate://crates.io/remove_dir_all/0.5.3 \
+ crate://crates.io/rustix/0.36.5 \
+ crate://crates.io/scopeguard/1.1.0 \
+ crate://crates.io/serde/1.0.151 \
+ crate://crates.io/serde_derive/1.0.151 \
+ crate://crates.io/sha2/0.10.6 \
+ crate://crates.io/signal-hook/0.3.14 \
+ crate://crates.io/signal-hook-registry/1.4.0 \
+ crate://crates.io/simplelog/0.12.0 \
+ crate://crates.io/spmc/0.3.0 \
+ crate://crates.io/static_assertions/1.1.0 \
+ crate://crates.io/subtle/2.4.1 \
+ crate://crates.io/syn/1.0.107 \
+ crate://crates.io/tempfile/3.3.0 \
+ crate://crates.io/termcolor/1.1.3 \
+ crate://crates.io/thiserror/1.0.38 \
+ crate://crates.io/thiserror-impl/1.0.38 \
+ crate://crates.io/threadpool/1.8.1 \
+ crate://crates.io/time/0.3.17 \
+ crate://crates.io/time-core/0.1.0 \
+ crate://crates.io/time-macros/0.2.6 \
+ crate://crates.io/typenum/1.16.0 \
+ crate://crates.io/unicode-ident/1.0.6 \
+ crate://crates.io/urlencoding/2.1.2 \
+ crate://crates.io/uuid/0.8.2 \
+ crate://crates.io/version_check/0.9.4 \
+ crate://crates.io/wasi/0.11.0+wasi-snapshot-preview1 \
+ crate://crates.io/winapi/0.3.9 \
+ crate://crates.io/winapi-i686-pc-windows-gnu/0.4.0 \
+ crate://crates.io/winapi-util/0.1.5 \
+ crate://crates.io/winapi-x86_64-pc-windows-gnu/0.4.0 \
+ crate://crates.io/windows-sys/0.42.0 \
+ crate://crates.io/windows_aarch64_gnullvm/0.42.0 \
+ crate://crates.io/windows_aarch64_msvc/0.42.0 \
+ crate://crates.io/windows_i686_gnu/0.42.0 \
+ crate://crates.io/windows_i686_msvc/0.42.0 \
+ crate://crates.io/windows_x86_64_gnu/0.42.0 \
+ crate://crates.io/windows_x86_64_gnullvm/0.42.0 \
+ crate://crates.io/windows_x86_64_msvc/0.42.0 \
+"
+
+SRC_URI[aho-corasick-0.7.20.sha256sum] = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
+SRC_URI[autocfg-1.1.0.sha256sum] = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+SRC_URI[bitflags-1.3.2.sha256sum] = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+SRC_URI[block-buffer-0.10.3.sha256sum] = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e"
+SRC_URI[cc-1.0.78.sha256sum] = "a20104e2335ce8a659d6dd92a51a767a0c062599c73b343fd152cb401e828c3d"
+SRC_URI[cfg-if-1.0.0.sha256sum] = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+SRC_URI[cpufeatures-0.2.5.sha256sum] = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320"
+SRC_URI[cpython-0.7.1.sha256sum] = "3052106c29da7390237bc2310c1928335733b286287754ea85e6093d2495280e"
+SRC_URI[crossbeam-0.8.2.sha256sum] = "2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c"
+SRC_URI[crossbeam-channel-0.5.6.sha256sum] = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521"
+SRC_URI[crossbeam-deque-0.8.2.sha256sum] = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc"
+SRC_URI[crossbeam-epoch-0.9.13.sha256sum] = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a"
+SRC_URI[crossbeam-queue-0.3.8.sha256sum] = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add"
+SRC_URI[crossbeam-utils-0.8.14.sha256sum] = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f"
+SRC_URI[crypto-common-0.1.6.sha256sum] = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
+SRC_URI[digest-0.10.6.sha256sum] = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f"
+SRC_URI[encoding-0.2.33.sha256sum] = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec"
+SRC_URI[encoding-index-japanese-1.20141219.5.sha256sum] = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91"
+SRC_URI[encoding-index-korean-1.20141219.5.sha256sum] = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81"
+SRC_URI[encoding-index-simpchinese-1.20141219.5.sha256sum] = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7"
+SRC_URI[encoding-index-singlebyte-1.20141219.5.sha256sum] = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a"
+SRC_URI[encoding-index-tradchinese-1.20141219.5.sha256sum] = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18"
+SRC_URI[encoding_index_tests-0.1.4.sha256sum] = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569"
+SRC_URI[env_logger-0.10.0.sha256sum] = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0"
+SRC_URI[errno-0.2.8.sha256sum] = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1"
+SRC_URI[errno-dragonfly-0.1.2.sha256sum] = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+SRC_URI[fastrand-1.8.0.sha256sum] = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499"
+SRC_URI[generic-array-0.14.6.sha256sum] = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9"
+SRC_URI[getrandom-0.2.8.sha256sum] = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
+SRC_URI[hermit-abi-0.1.19.sha256sum] = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
+SRC_URI[hermit-abi-0.2.6.sha256sum] = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7"
+SRC_URI[hmac-0.12.1.sha256sum] = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
+SRC_URI[httparse-1.8.0.sha256sum] = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+SRC_URI[humantime-2.1.0.sha256sum] = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
+SRC_URI[instant-0.1.12.sha256sum] = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+SRC_URI[io-lifetimes-1.0.3.sha256sum] = "46112a93252b123d31a119a8d1a1ac19deac4fac6e0e8b0df58f0d4e5870e63c"
+SRC_URI[is-terminal-0.4.1.sha256sum] = "927609f78c2913a6f6ac3c27a4fe87f43e2a35367c0c4b0f8265e8f49a104330"
+SRC_URI[itoa-1.0.5.sha256sum] = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440"
+SRC_URI[libc-0.2.138.sha256sum] = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8"
+SRC_URI[libsystemd-0.5.0.sha256sum] = "8144587c71c16756b1055d3dcb0c75cb605a10ecd6523cc33702d5f90902bf6d"
+SRC_URI[linux-raw-sys-0.1.4.sha256sum] = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4"
+SRC_URI[log-0.4.17.sha256sum] = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
+SRC_URI[memchr-2.5.0.sha256sum] = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+SRC_URI[memoffset-0.6.5.sha256sum] = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce"
+SRC_URI[memoffset-0.7.1.sha256sum] = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4"
+SRC_URI[minimal-lexical-0.2.1.sha256sum] = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+SRC_URI[mio-0.8.5.sha256sum] = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de"
+SRC_URI[nix-0.23.2.sha256sum] = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c"
+SRC_URI[nix-0.26.1.sha256sum] = "46a58d1d356c6597d08cde02c2f09d785b09e28711837b1ed667dc652c08a694"
+SRC_URI[nom-7.1.1.sha256sum] = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36"
+SRC_URI[num-traits-0.2.15.sha256sum] = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
+SRC_URI[num_cpus-1.14.0.sha256sum] = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5"
+SRC_URI[num_threads-0.1.6.sha256sum] = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44"
+SRC_URI[once_cell-1.16.0.sha256sum] = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860"
+SRC_URI[paste-1.0.11.sha256sum] = "d01a5bd0424d00070b0098dd17ebca6f961a959dead1dbcbbbc1d1cd8d3deeba"
+SRC_URI[pin-utils-0.1.0.sha256sum] = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+SRC_URI[ppv-lite86-0.2.17.sha256sum] = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+SRC_URI[proc-macro2-1.0.49.sha256sum] = "57a8eca9f9c4ffde41714334dee777596264c7825420f521abc92b5b5deb63a5"
+SRC_URI[python3-sys-0.7.1.sha256sum] = "49f8b50d72fb3015735aa403eebf19bbd72c093bfeeae24ee798be5f2f1aab52"
+SRC_URI[quote-1.0.23.sha256sum] = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b"
+SRC_URI[rand-0.8.5.sha256sum] = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+SRC_URI[rand_chacha-0.3.1.sha256sum] = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+SRC_URI[rand_core-0.6.4.sha256sum] = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+SRC_URI[redox_syscall-0.2.16.sha256sum] = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+SRC_URI[regex-1.7.0.sha256sum] = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a"
+SRC_URI[regex-syntax-0.6.28.sha256sum] = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
+SRC_URI[remove_dir_all-0.5.3.sha256sum] = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
+SRC_URI[rustix-0.36.5.sha256sum] = "a3807b5d10909833d3e9acd1eb5fb988f79376ff10fce42937de71a449c4c588"
+SRC_URI[scopeguard-1.1.0.sha256sum] = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+SRC_URI[serde-1.0.151.sha256sum] = "97fed41fc1a24994d044e6db6935e69511a1153b52c15eb42493b26fa87feba0"
+SRC_URI[serde_derive-1.0.151.sha256sum] = "255abe9a125a985c05190d687b320c12f9b1f0b99445e608c21ba0782c719ad8"
+SRC_URI[sha2-0.10.6.sha256sum] = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0"
+SRC_URI[signal-hook-0.3.14.sha256sum] = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d"
+SRC_URI[signal-hook-registry-1.4.0.sha256sum] = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0"
+SRC_URI[simplelog-0.12.0.sha256sum] = "48dfff04aade74dd495b007c831cd6f4e0cee19c344dd9dc0884c0289b70a786"
+SRC_URI[spmc-0.3.0.sha256sum] = "02a8428da277a8e3a15271d79943e80ccc2ef254e78813a166a08d65e4c3ece5"
+SRC_URI[static_assertions-1.1.0.sha256sum] = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+SRC_URI[subtle-2.4.1.sha256sum] = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601"
+SRC_URI[syn-1.0.107.sha256sum] = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5"
+SRC_URI[tempfile-3.3.0.sha256sum] = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4"
+SRC_URI[termcolor-1.1.3.sha256sum] = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755"
+SRC_URI[thiserror-1.0.38.sha256sum] = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0"
+SRC_URI[thiserror-impl-1.0.38.sha256sum] = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f"
+SRC_URI[threadpool-1.8.1.sha256sum] = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa"
+SRC_URI[time-0.3.17.sha256sum] = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376"
+SRC_URI[time-core-0.1.0.sha256sum] = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd"
+SRC_URI[time-macros-0.2.6.sha256sum] = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2"
+SRC_URI[typenum-1.16.0.sha256sum] = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
+SRC_URI[unicode-ident-1.0.6.sha256sum] = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc"
+SRC_URI[urlencoding-2.1.2.sha256sum] = "e8db7427f936968176eaa7cdf81b7f98b980b18495ec28f1b5791ac3bfe3eea9"
+SRC_URI[uuid-0.8.2.sha256sum] = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
+SRC_URI[version_check-0.9.4.sha256sum] = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+SRC_URI[wasi-0.11.0+wasi-snapshot-preview1.sha256sum] = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+SRC_URI[winapi-0.3.9.sha256sum] = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+SRC_URI[winapi-i686-pc-windows-gnu-0.4.0.sha256sum] = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+SRC_URI[winapi-util-0.1.5.sha256sum] = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+SRC_URI[winapi-x86_64-pc-windows-gnu-0.4.0.sha256sum] = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+SRC_URI[windows-sys-0.42.0.sha256sum] = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
+SRC_URI[windows_aarch64_gnullvm-0.42.0.sha256sum] = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e"
+SRC_URI[windows_aarch64_msvc-0.42.0.sha256sum] = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4"
+SRC_URI[windows_i686_gnu-0.42.0.sha256sum] = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7"
+SRC_URI[windows_i686_msvc-0.42.0.sha256sum] = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246"
+SRC_URI[windows_x86_64_gnu-0.42.0.sha256sum] = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed"
+SRC_URI[windows_x86_64_gnullvm-0.42.0.sha256sum] = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028"
+SRC_URI[windows_x86_64_msvc-0.42.0.sha256sum] = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5"
diff --git a/meta-python/recipes-devtools/python/python3-pyruvate/0001-check-for-mips-targets-for-stat.st_dev-definitions.patch b/meta-python/recipes-devtools/python/python3-pyruvate/0001-check-for-mips-targets-for-stat.st_dev-definitions.patch
new file mode 100644
index 0000000000..3f8256b027
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyruvate/0001-check-for-mips-targets-for-stat.st_dev-definitions.patch
@@ -0,0 +1,47 @@
+From 56984b19469ff5b69b8b8e180dc75cf825bb1123 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Tue, 25 Jan 2022 22:28:11 -0800
+Subject: [PATCH] check for mips targets for stat.st_dev definitions
+
+st_dev has wrong type in glibc when using mips/O32 ABI
+its type should be dev_t but it is set to unsigned long int
+this is specific issue on mips/o32 ABI in glibc for details
+
+See
+https://sourceware.org/bugzilla/show_bug.cgi?id=17786
+
+currently the build fails on mips archirecture with type mismatches
+
+ Fixes
+ error[E0308]: mismatched types
+* --> /usr/src/debug/python3-pyruvate/1.1.2-r0/cargo_home/bitbake/libsystemd-0.4.1/src/logging.rs:296:25
+ |
+ 296 | device: stat.st_dev,
+ | ^^^^^^^^^^^ expected `u64`, found `u32`
+
+Drop this patch when libsystemd-rs crate bumps to 0.6.0+
+
+Upstream-Status: Backport [https://github.com/lucab/libsystemd-rs/pull/104]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ src/logging.rs | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/src/logging.rs b/src/logging.rs
+index a68c36a..6e374ae 100644
+--- a/src/logging.rs
++++ b/src/logging.rs
+@@ -292,7 +292,10 @@ impl JournalStream {
+ pub fn from_fd<F: AsRawFd>(fd: F) -> std::io::Result<Self> {
+ nix::sys::stat::fstat(fd.as_raw_fd())
+ .map(|stat| JournalStream {
++ #[cfg(not(target_arch = "mips"))]
+ device: stat.st_dev,
++ #[cfg(target_arch = "mips")]
++ device: stat.st_dev as u64,
+ inode: stat.st_ino,
+ })
+ .map_err(std::io::Error::from)
+--
+2.35.0
+
diff --git a/meta-python/recipes-devtools/python/python3-pyruvate/0001-linux.rs-Define-consts-for-rv32-architecture.patch b/meta-python/recipes-devtools/python/python3-pyruvate/0001-linux.rs-Define-consts-for-rv32-architecture.patch
new file mode 100644
index 0000000000..a2d4091a95
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyruvate/0001-linux.rs-Define-consts-for-rv32-architecture.patch
@@ -0,0 +1,26 @@
+From 3a3bd8475f93d54cb5bb62d239247fef2e03a733 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Sat, 5 Mar 2022 00:37:01 -0800
+Subject: [PATCH] linux.rs: Define consts for rv32 architecture
+
+Upstream-Status: Submitted [https://github.com/nix-rust/nix/pull/1669]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ src/sys/ioctl/linux.rs | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/src/sys/ioctl/linux.rs b/src/sys/ioctl/linux.rs
+index 68ebaba..08cd0c3 100644
+--- a/src/sys/ioctl/linux.rs
++++ b/src/sys/ioctl/linux.rs
+@@ -34,6 +34,7 @@ mod consts {
+ target_arch = "s390x",
+ target_arch = "x86_64",
+ target_arch = "aarch64",
++ target_arch = "riscv32",
+ target_arch = "riscv64"))]
+ mod consts {
+ #[doc(hidden)]
+--
+2.35.1
+
diff --git a/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Define-O_LARGEFILE-for-riscv32.patch b/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Define-O_LARGEFILE-for-riscv32.patch
new file mode 100644
index 0000000000..621249c483
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Define-O_LARGEFILE-for-riscv32.patch
@@ -0,0 +1,21 @@
+From fdf98602ad20d06ebf65574541caac68ca421ac4 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Sat, 8 Apr 2023 09:19:53 -0700
+Subject: [PATCH] musl: Define O_LARGEFILE for riscv32
+
+Upstream-Status: Submitted [https://github.com/rust-lang/libc/pull/3191]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ src/unix/linux_like/linux/musl/b32/riscv32/mod.rs | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs
++++ b/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs
+@@ -370,6 +370,7 @@ pub const __SIZEOF_PTHREAD_CONDATTR_T: u
+ pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4;
+ pub const O_DIRECT: ::c_int = 16384;
+ pub const O_DIRECTORY: ::c_int = 65536;
++pub const O_LARGEFILE: ::c_int = 0o0100000;
+ pub const O_NOFOLLOW: ::c_int = 131072;
+ pub const MAP_HUGETLB: ::c_int = 262144;
+ pub const MAP_LOCKED: ::c_int = 8192;
diff --git a/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Define-SOCK_NONBLOCK-with-O_NONBLOCK.patch b/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Define-SOCK_NONBLOCK-with-O_NONBLOCK.patch
new file mode 100644
index 0000000000..e19b50d30d
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Define-SOCK_NONBLOCK-with-O_NONBLOCK.patch
@@ -0,0 +1,99 @@
+From f2b06fa4ea6ec9a33f8b269f0a1730a26276c5b0 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Sat, 8 Apr 2023 08:25:46 -0700
+Subject: [PATCH] musl: Define SOCK_NONBLOCK with O_NONBLOCK
+
+Much like glibc, these defines are same on musl [1] [2]
+therefore consolidate the definition in one place
+for SOCK_NONBLOCK
+
+[1] https://github.com/search?q=repo%3Abminor%2Fmusl++%22%23define+SOCK_NONBLOCK%22&type=code
+[2] https://github.com/search?q=repo%3Abminor%2Fmusl++%22%23define+O_NONBLOCK%22&type=code
+
+Upstream-Status: Submitted [https://github.com/rust-lang/libc/pull/3191]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ src/unix/linux_like/linux/musl/b32/arm/mod.rs | 2 --
+ src/unix/linux_like/linux/musl/b32/hexagon.rs | 1 -
+ src/unix/linux_like/linux/musl/b32/mips/mod.rs | 2 --
+ src/unix/linux_like/linux/musl/b32/powerpc.rs | 2 --
+ src/unix/linux_like/linux/musl/b32/x86/mod.rs | 2 --
+ src/unix/linux_like/linux/musl/b64/mod.rs | 2 --
+ src/unix/linux_like/linux/musl/mod.rs | 1 +
+ 7 files changed, 1 insertion(+), 11 deletions(-)
+
+--- a/src/unix/linux_like/linux/musl/b32/arm/mod.rs
++++ b/src/unix/linux_like/linux/musl/b32/arm/mod.rs
+@@ -311,8 +311,6 @@ pub const O_SYNC: ::c_int = 1052672;
+ pub const O_RSYNC: ::c_int = 1052672;
+ pub const O_DSYNC: ::c_int = 4096;
+
+-pub const SOCK_NONBLOCK: ::c_int = 2048;
+-
+ pub const MAP_ANON: ::c_int = 0x0020;
+ pub const MAP_GROWSDOWN: ::c_int = 0x0100;
+ pub const MAP_DENYWRITE: ::c_int = 0x0800;
+--- a/src/unix/linux_like/linux/musl/b32/hexagon.rs
++++ b/src/unix/linux_like/linux/musl/b32/hexagon.rs
+@@ -295,7 +295,6 @@ pub const SIG_SETMASK: ::c_int = 2; // F
+ pub const SIG_BLOCK: ::c_int = 0x000000;
+ pub const SIG_UNBLOCK: ::c_int = 0x01;
+ pub const SOCK_DGRAM: ::c_int = 2;
+-pub const SOCK_NONBLOCK: ::c_int = 2048;
+ pub const SOCK_SEQPACKET: ::c_int = 5;
+ pub const SOCK_STREAM: ::c_int = 1;
+ pub const SOL_CAIF: ::c_int = 278;
+--- a/src/unix/linux_like/linux/musl/b32/mips/mod.rs
++++ b/src/unix/linux_like/linux/musl/b32/mips/mod.rs
+@@ -250,8 +250,6 @@ pub const O_SYNC: ::c_int = 0o40020;
+ pub const O_RSYNC: ::c_int = 0o40020;
+ pub const O_DSYNC: ::c_int = 0o020;
+
+-pub const SOCK_NONBLOCK: ::c_int = 0o200;
+-
+ pub const MAP_ANON: ::c_int = 0x800;
+ pub const MAP_GROWSDOWN: ::c_int = 0x1000;
+ pub const MAP_DENYWRITE: ::c_int = 0x2000;
+--- a/src/unix/linux_like/linux/musl/b32/powerpc.rs
++++ b/src/unix/linux_like/linux/musl/b32/powerpc.rs
+@@ -243,8 +243,6 @@ pub const O_SYNC: ::c_int = 1052672;
+ pub const O_RSYNC: ::c_int = 1052672;
+ pub const O_DSYNC: ::c_int = 4096;
+
+-pub const SOCK_NONBLOCK: ::c_int = 2048;
+-
+ pub const MAP_ANON: ::c_int = 0x0020;
+ pub const MAP_GROWSDOWN: ::c_int = 0x0100;
+ pub const MAP_DENYWRITE: ::c_int = 0x0800;
+--- a/src/unix/linux_like/linux/musl/b32/x86/mod.rs
++++ b/src/unix/linux_like/linux/musl/b32/x86/mod.rs
+@@ -300,8 +300,6 @@ pub const O_SYNC: ::c_int = 1052672;
+ pub const O_RSYNC: ::c_int = 1052672;
+ pub const O_DSYNC: ::c_int = 4096;
+
+-pub const SOCK_NONBLOCK: ::c_int = 2048;
+-
+ pub const MAP_ANON: ::c_int = 0x0020;
+ pub const MAP_GROWSDOWN: ::c_int = 0x0100;
+ pub const MAP_DENYWRITE: ::c_int = 0x0800;
+--- a/src/unix/linux_like/linux/musl/b64/mod.rs
++++ b/src/unix/linux_like/linux/musl/b64/mod.rs
+@@ -133,8 +133,6 @@ s! {
+ pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56;
+ pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40;
+
+-pub const SOCK_NONBLOCK: ::c_int = 2048;
+-
+ pub const SOCK_SEQPACKET: ::c_int = 5;
+
+ extern "C" {
+--- a/src/unix/linux_like/linux/musl/mod.rs
++++ b/src/unix/linux_like/linux/musl/mod.rs
+@@ -527,6 +527,7 @@ pub const POSIX_MADV_DONTNEED: ::c_int =
+ pub const MAP_ANONYMOUS: ::c_int = MAP_ANON;
+
+ pub const SOCK_DCCP: ::c_int = 6;
++pub const SOCK_NONBLOCK: ::c_int = O_NONBLOCK;
+ pub const SOCK_PACKET: ::c_int = 10;
+
+ pub const SOMAXCONN: ::c_int = 128;
diff --git a/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Define-SOCK_SEQPACKET-in-common-place.patch b/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Define-SOCK_SEQPACKET-in-common-place.patch
new file mode 100644
index 0000000000..2da3a43154
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Define-SOCK_SEQPACKET-in-common-place.patch
@@ -0,0 +1,92 @@
+From e00da82cd46221bfb650895c9cea65082da66b4e Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Sat, 8 Apr 2023 09:25:31 -0700
+Subject: [PATCH] musl: Define SOCK_SEQPACKET in common place
+
+This define is not architecture specific in musl [1]
+
+[1] https://git.musl-libc.org/cgit/musl/tree/include/sys/socket.h#n90
+
+Upstream-Status: Submitted [https://github.com/rust-lang/libc/pull/3191]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ src/unix/linux_like/linux/musl/b32/arm/mod.rs | 1 -
+ src/unix/linux_like/linux/musl/b32/hexagon.rs | 1 -
+ src/unix/linux_like/linux/musl/b32/mips/mod.rs | 1 -
+ src/unix/linux_like/linux/musl/b32/powerpc.rs | 1 -
+ src/unix/linux_like/linux/musl/b32/x86/mod.rs | 1 -
+ src/unix/linux_like/linux/musl/b64/mod.rs | 2 --
+ src/unix/linux_like/linux/musl/mod.rs | 1 +
+ 7 files changed, 1 insertion(+), 7 deletions(-)
+
+--- a/src/unix/linux_like/linux/musl/b32/arm/mod.rs
++++ b/src/unix/linux_like/linux/musl/b32/arm/mod.rs
+@@ -324,7 +324,6 @@ pub const MAP_SYNC: ::c_int = 0x080000;
+
+ pub const SOCK_STREAM: ::c_int = 1;
+ pub const SOCK_DGRAM: ::c_int = 2;
+-pub const SOCK_SEQPACKET: ::c_int = 5;
+
+ pub const EDEADLK: ::c_int = 35;
+ pub const ENAMETOOLONG: ::c_int = 36;
+--- a/src/unix/linux_like/linux/musl/b32/hexagon.rs
++++ b/src/unix/linux_like/linux/musl/b32/hexagon.rs
+@@ -292,7 +292,6 @@ pub const SIG_SETMASK: ::c_int = 2; // F
+ pub const SIG_BLOCK: ::c_int = 0x000000;
+ pub const SIG_UNBLOCK: ::c_int = 0x01;
+ pub const SOCK_DGRAM: ::c_int = 2;
+-pub const SOCK_SEQPACKET: ::c_int = 5;
+ pub const SOCK_STREAM: ::c_int = 1;
+ pub const SOL_CAIF: ::c_int = 278;
+ pub const SOL_IUCV: ::c_int = 277;
+--- a/src/unix/linux_like/linux/musl/b32/mips/mod.rs
++++ b/src/unix/linux_like/linux/musl/b32/mips/mod.rs
+@@ -348,7 +348,6 @@ pub const ERFKILL: ::c_int = 167;
+
+ pub const SOCK_STREAM: ::c_int = 2;
+ pub const SOCK_DGRAM: ::c_int = 1;
+-pub const SOCK_SEQPACKET: ::c_int = 5;
+
+ pub const SA_ONSTACK: ::c_int = 0x08000000;
+ pub const SA_SIGINFO: ::c_int = 8;
+--- a/src/unix/linux_like/linux/musl/b32/powerpc.rs
++++ b/src/unix/linux_like/linux/musl/b32/powerpc.rs
+@@ -255,7 +255,6 @@ pub const MAP_STACK: ::c_int = 0x020000;
+
+ pub const SOCK_STREAM: ::c_int = 1;
+ pub const SOCK_DGRAM: ::c_int = 2;
+-pub const SOCK_SEQPACKET: ::c_int = 5;
+
+ pub const EDEADLK: ::c_int = 35;
+ pub const ENAMETOOLONG: ::c_int = 36;
+--- a/src/unix/linux_like/linux/musl/b32/x86/mod.rs
++++ b/src/unix/linux_like/linux/musl/b32/x86/mod.rs
+@@ -313,7 +313,6 @@ pub const MAP_SYNC: ::c_int = 0x080000;
+
+ pub const SOCK_STREAM: ::c_int = 1;
+ pub const SOCK_DGRAM: ::c_int = 2;
+-pub const SOCK_SEQPACKET: ::c_int = 5;
+
+ pub const EDEADLK: ::c_int = 35;
+ pub const ENAMETOOLONG: ::c_int = 36;
+--- a/src/unix/linux_like/linux/musl/b64/mod.rs
++++ b/src/unix/linux_like/linux/musl/b64/mod.rs
+@@ -133,8 +133,6 @@ s! {
+ pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56;
+ pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40;
+
+-pub const SOCK_SEQPACKET: ::c_int = 5;
+-
+ extern "C" {
+ pub fn getrandom(buf: *mut ::c_void, buflen: ::size_t, flags: ::c_uint) -> ::ssize_t;
+ }
+--- a/src/unix/linux_like/linux/musl/mod.rs
++++ b/src/unix/linux_like/linux/musl/mod.rs
+@@ -530,6 +530,7 @@ pub const POSIX_MADV_DONTNEED: ::c_int =
+
+ pub const MAP_ANONYMOUS: ::c_int = MAP_ANON;
+
++pub const SOCK_SEQPACKET: ::c_int = 5;
+ pub const SOCK_DCCP: ::c_int = 6;
+ pub const SOCK_NONBLOCK: ::c_int = O_NONBLOCK;
+ pub const SOCK_PACKET: ::c_int = 10;
diff --git a/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Move-F_OFD_GETLK-F_OFD_SETLK-and-F_OFD_SETLKW-t.patch b/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Move-F_OFD_GETLK-F_OFD_SETLK-and-F_OFD_SETLKW-t.patch
new file mode 100644
index 0000000000..9c93434e03
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-Move-F_OFD_GETLK-F_OFD_SETLK-and-F_OFD_SETLKW-t.patch
@@ -0,0 +1,140 @@
+From e4f6d7b6d57e83633814c54d93dff292ed0e4609 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Sat, 8 Apr 2023 09:01:54 -0700
+Subject: [PATCH] musl: Move F_OFD_GETLK, F_OFD_SETLK and F_OFD_SETLKW to
+ common location
+
+These defines are not architecture specific in musl [1] therefore move them
+to be common
+
+[1] https://git.musl-libc.org/cgit/musl/tree/include/fcntl.h#n48
+
+Upstream-Status: Submitted [https://github.com/rust-lang/libc/pull/3191]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ src/unix/linux_like/linux/musl/b32/arm/mod.rs | 3 ---
+ src/unix/linux_like/linux/musl/b32/hexagon.rs | 3 ---
+ src/unix/linux_like/linux/musl/b32/mips/mod.rs | 3 ---
+ src/unix/linux_like/linux/musl/b32/powerpc.rs | 3 ---
+ src/unix/linux_like/linux/musl/b32/x86/mod.rs | 3 ---
+ src/unix/linux_like/linux/musl/b64/aarch64/mod.rs | 3 ---
+ src/unix/linux_like/linux/musl/b64/mips64.rs | 3 ---
+ src/unix/linux_like/linux/musl/mod.rs | 4 ++++
+ 8 files changed, 4 insertions(+), 21 deletions(-)
+
+diff --git a/src/unix/linux_like/linux/musl/b32/arm/mod.rs b/src/unix/linux_like/linux/musl/b32/arm/mod.rs
+index c47fa2c4c..3c8978e4f 100644
+--- a/src/unix/linux_like/linux/musl/b32/arm/mod.rs
++++ b/src/unix/linux_like/linux/musl/b32/arm/mod.rs
+@@ -451,9 +451,6 @@ pub const F_GETOWN: ::c_int = 9;
+ pub const F_SETLK: ::c_int = 13;
+ pub const F_SETLKW: ::c_int = 14;
+ pub const F_SETOWN: ::c_int = 8;
+-pub const F_OFD_GETLK: ::c_int = 36;
+-pub const F_OFD_SETLK: ::c_int = 37;
+-pub const F_OFD_SETLKW: ::c_int = 38;
+
+ pub const VEOF: usize = 4;
+ pub const VEOL: usize = 11;
+diff --git a/src/unix/linux_like/linux/musl/b32/hexagon.rs b/src/unix/linux_like/linux/musl/b32/hexagon.rs
+index f83d208d5..720c603da 100644
+--- a/src/unix/linux_like/linux/musl/b32/hexagon.rs
++++ b/src/unix/linux_like/linux/musl/b32/hexagon.rs
+@@ -225,9 +225,6 @@ pub const F_GETOWN_EX: ::c_int = 16;
+ pub const F_GETSIG: ::c_int = 11;
+ pub const F_LINUX_SPECIFIC_BASE: ::c_int = 1024;
+ pub const FLUSHO: ::c_int = 4096;
+-pub const F_OFD_GETLK: ::c_int = 36;
+-pub const F_OFD_SETLK: ::c_int = 37;
+-pub const F_OFD_SETLKW: ::c_int = 38;
+ pub const F_OWNER_PGRP: ::c_int = 2;
+ pub const F_OWNER_PID: ::c_int = 1;
+ pub const F_OWNER_TID: ::c_int = 0;
+diff --git a/src/unix/linux_like/linux/musl/b32/mips/mod.rs b/src/unix/linux_like/linux/musl/b32/mips/mod.rs
+index d09b8278e..69e20ce32 100644
+--- a/src/unix/linux_like/linux/musl/b32/mips/mod.rs
++++ b/src/unix/linux_like/linux/musl/b32/mips/mod.rs
+@@ -388,9 +388,6 @@ pub const F_GETOWN: ::c_int = 23;
+ pub const F_SETLK: ::c_int = 34;
+ pub const F_SETLKW: ::c_int = 35;
+ pub const F_SETOWN: ::c_int = 24;
+-pub const F_OFD_GETLK: ::c_int = 36;
+-pub const F_OFD_SETLK: ::c_int = 37;
+-pub const F_OFD_SETLKW: ::c_int = 38;
+
+ pub const VEOF: usize = 16;
+ pub const VEOL: usize = 17;
+diff --git a/src/unix/linux_like/linux/musl/b32/powerpc.rs b/src/unix/linux_like/linux/musl/b32/powerpc.rs
+index 3b998329b..63bc9163d 100644
+--- a/src/unix/linux_like/linux/musl/b32/powerpc.rs
++++ b/src/unix/linux_like/linux/musl/b32/powerpc.rs
+@@ -384,9 +384,6 @@ pub const F_GETOWN: ::c_int = 9;
+ pub const F_SETLK: ::c_int = 13;
+ pub const F_SETLKW: ::c_int = 14;
+ pub const F_SETOWN: ::c_int = 8;
+-pub const F_OFD_GETLK: ::c_int = 36;
+-pub const F_OFD_SETLK: ::c_int = 37;
+-pub const F_OFD_SETLKW: ::c_int = 38;
+
+ pub const VEOF: usize = 4;
+ pub const VEOL: usize = 6;
+diff --git a/src/unix/linux_like/linux/musl/b32/x86/mod.rs b/src/unix/linux_like/linux/musl/b32/x86/mod.rs
+index c319b91b6..52ecf3c7e 100644
+--- a/src/unix/linux_like/linux/musl/b32/x86/mod.rs
++++ b/src/unix/linux_like/linux/musl/b32/x86/mod.rs
+@@ -441,9 +441,6 @@ pub const F_GETOWN: ::c_int = 9;
+ pub const F_SETLK: ::c_int = 13;
+ pub const F_SETLKW: ::c_int = 14;
+ pub const F_SETOWN: ::c_int = 8;
+-pub const F_OFD_GETLK: ::c_int = 36;
+-pub const F_OFD_SETLK: ::c_int = 37;
+-pub const F_OFD_SETLKW: ::c_int = 38;
+
+ pub const VEOF: usize = 4;
+ pub const VEOL: usize = 11;
+diff --git a/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs b/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs
+index 14b4bc6d6..522493ff3 100644
+--- a/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs
++++ b/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs
+@@ -250,9 +250,6 @@ pub const F_GETOWN: ::c_int = 9;
+ pub const F_SETLK: ::c_int = 6;
+ pub const F_SETLKW: ::c_int = 7;
+ pub const F_SETOWN: ::c_int = 8;
+-pub const F_OFD_GETLK: ::c_int = 36;
+-pub const F_OFD_SETLK: ::c_int = 37;
+-pub const F_OFD_SETLKW: ::c_int = 38;
+
+ pub const VEOF: usize = 4;
+
+diff --git a/src/unix/linux_like/linux/musl/b64/mips64.rs b/src/unix/linux_like/linux/musl/b64/mips64.rs
+index 22ac91690..c7f041260 100644
+--- a/src/unix/linux_like/linux/musl/b64/mips64.rs
++++ b/src/unix/linux_like/linux/musl/b64/mips64.rs
+@@ -612,9 +612,6 @@ pub const F_GETOWN: ::c_int = 23;
+ pub const F_SETOWN: ::c_int = 24;
+ pub const F_SETLK: ::c_int = 6;
+ pub const F_SETLKW: ::c_int = 7;
+-pub const F_OFD_GETLK: ::c_int = 36;
+-pub const F_OFD_SETLK: ::c_int = 37;
+-pub const F_OFD_SETLKW: ::c_int = 38;
+
+ pub const MCL_CURRENT: ::c_int = 0x0001;
+ pub const MCL_FUTURE: ::c_int = 0x0002;
+diff --git a/src/unix/linux_like/linux/musl/mod.rs b/src/unix/linux_like/linux/musl/mod.rs
+index 37a8ca2af..9a4fa7ca7 100644
+--- a/src/unix/linux_like/linux/musl/mod.rs
++++ b/src/unix/linux_like/linux/musl/mod.rs
+@@ -506,6 +506,10 @@ pub const ECOMM: ::c_int = 70;
+ pub const EPROTO: ::c_int = 71;
+ pub const EDOTDOT: ::c_int = 73;
+
++pub const F_OFD_GETLK: ::c_int = 36;
++pub const F_OFD_SETLK: ::c_int = 37;
++pub const F_OFD_SETLKW: ::c_int = 38;
++
+ pub const F_RDLCK: ::c_int = 0;
+ pub const F_WRLCK: ::c_int = 1;
+ pub const F_UNLCK: ::c_int = 2;
+--
+2.40.0
+
diff --git a/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-riscv32-Define-F_SETLK-F_SETLKW-and-fix-F_GETLK.patch b/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-riscv32-Define-F_SETLK-F_SETLKW-and-fix-F_GETLK.patch
new file mode 100644
index 0000000000..47969542c8
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyruvate/0001-musl-riscv32-Define-F_SETLK-F_SETLKW-and-fix-F_GETLK.patch
@@ -0,0 +1,35 @@
+From b87552c504b53a5e5df2438adfe24e35b0168aba Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Sat, 8 Apr 2023 08:51:02 -0700
+Subject: [PATCH] musl/riscv32: Define F_SETLK, F_SETLKW and fix F_GETLK
+
+F_SETLK and F_SETLKW were not defined therefore define them
+and F_GETLK value was not matching the musl port hence fixed
+
+Upstream-Status: Submitted [https://github.com/rust-lang/libc/pull/3191]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ src/unix/linux_like/linux/musl/b32/riscv32/mod.rs | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs b/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs
+index 9ce6a9fd3..e56ff4853 100644
+--- a/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs
++++ b/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs
+@@ -339,9 +339,11 @@ pub const POLLWRBAND: ::c_short = 512;
+ pub const O_ASYNC: ::c_int = 8192;
+ pub const O_NDELAY: ::c_int = 2048;
+ pub const EFD_NONBLOCK: ::c_int = 2048;
+-pub const F_GETLK: ::c_int = 5;
+-pub const F_GETOWN: ::c_int = 9;
+ pub const F_SETOWN: ::c_int = 8;
++pub const F_GETOWN: ::c_int = 9;
++pub const F_GETLK: ::c_int = 12;
++pub const F_SETLK: ::c_int = 13;
++pub const F_SETLKW: ::c_int = 14;
+ pub const SFD_NONBLOCK: ::c_int = 2048;
+ pub const TCSANOW: ::c_int = 0;
+ pub const TCSADRAIN: ::c_int = 1;
+--
+2.40.0
+
diff --git a/meta-python/recipes-devtools/python/python3-pyruvate_1.2.1.bb b/meta-python/recipes-devtools/python/python3-pyruvate_1.2.1.bb
new file mode 100644
index 0000000000..2807c054d9
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyruvate_1.2.1.bb
@@ -0,0 +1,47 @@
+SUMMARY = "WSGI server implemented in Rust."
+DESCRIPTION = "Pyruvate is a reasonably fast, multithreaded, non-blocking \
+WSGI server implemented in Rust."
+HOMEPAGE = "https://gitlab.com/tschorr/pyruvate"
+BUGTRACKER = "https://gitlab.com/tschorr/pyruvate/-/issues"
+
+LICENSE = "GPL-2.0-only"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=b234ee4d69f5fce4486a80fdaf4a4263"
+
+SRC_URI += "\
+ git://gitlab.com/tschorr/pyruvate.git;protocol=https;branch=main \
+ file://0001-linux.rs-Define-consts-for-rv32-architecture.patch;patchdir=../cargo_home/bitbake/nix-0.23.2/ \
+ file://0001-musl-Define-SOCK_NONBLOCK-with-O_NONBLOCK.patch;patchdir=../cargo_home/bitbake/libc-0.2.138/ \
+ file://0001-musl-riscv32-Define-F_SETLK-F_SETLKW-and-fix-F_GETLK.patch;patchdir=../cargo_home/bitbake/libc-0.2.138/ \
+ file://0001-musl-Move-F_OFD_GETLK-F_OFD_SETLK-and-F_OFD_SETLKW-t.patch;patchdir=../cargo_home/bitbake/libc-0.2.138/ \
+ file://0001-musl-Define-O_LARGEFILE-for-riscv32.patch;patchdir=../cargo_home/bitbake/libc-0.2.138/ \
+ file://0001-musl-Define-SOCK_SEQPACKET-in-common-place.patch;patchdir=../cargo_home/bitbake/libc-0.2.138/ \
+"
+SRCREV = "57db64c9f65ced05c71b8d786c1cedfaa2991597"
+
+SRC_URI:append:mips = " file://0001-check-for-mips-targets-for-stat.st_dev-definitions.patch;patchdir=../cargo_home/bitbake/libsystemd-0.5.0/"
+
+S = "${WORKDIR}/git"
+
+inherit python_setuptools3_rust cargo-update-recipe-crates
+
+# crossbeam-* -> std::sync::atomic AtomicI64, AtomicU64
+# not supported on mips/powerpc with 32-bit pointers
+# https://doc.rust-lang.org/std/sync/atomic/#portability
+RUSTFLAGS:append:mips = " --cfg crossbeam_no_atomic_64"
+RUSTFLAGS:append:mipsel = " --cfg crossbeam_no_atomic_64"
+RUSTFLAGS:append:powerpc = " --cfg crossbeam_no_atomic_64"
+RUSTFLAGS:append:riscv32 = " --cfg crossbeam_no_atomic_64"
+
+require ${BPN}-crates.inc
+
+# The following configs & dependencies are from setuptools extras_require.
+# These dependencies are optional, hence can be controlled via PACKAGECONFIG.
+# The upstream names may not correspond exactly to bitbake package names.
+#
+# Uncomment this line to enable all the optional features.
+#PACKAGECONFIG ?= "test"
+PACKAGECONFIG[test] = ",,,python3-pytest python3-requests"
+
+# WARNING: the following rdepends are determined through basic analysis of the
+# python sources, and might not be 100% accurate.
+RDEPENDS:${PN} += "python3-core"
diff --git a/meta-python/recipes-devtools/python/python3-pyscaffold_4.5.bb b/meta-python/recipes-devtools/python/python3-pyscaffold_4.5.bb
new file mode 100644
index 0000000000..dda81e2256
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyscaffold_4.5.bb
@@ -0,0 +1,22 @@
+SUMMARY = "Python project template generator with batteries included"
+DESCRIPTION = "PyScaffold package helps to setup a new Python project. \
+After installation, it provides a new command [putup], which could be \
+used to create template Projects."
+
+HOMEPAGE = "https://github.com/pyscaffold/pyscaffold"
+SECTION = "devel/python"
+LICENSE = "0BSD & MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=14a49c74a1d91829908ac756c07e6b91"
+DEPENDS += "python3-setuptools-scm-native"
+
+SRC_URI[sha256sum] = "d849f9a2e15bdcf165e19f96835f0b17e1a2d59d4c561c445b827a081de6d262"
+
+inherit pypi python_setuptools_build_meta
+PYPI_PACKAGE = "PyScaffold"
+
+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
new file mode 100644
index 0000000000..b651411db7
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyserial/run-ptest
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-pyserial_3.4.bb b/meta-python/recipes-devtools/python/python3-pyserial_3.4.bb
deleted file mode 100644
index 17ed3f8bc4..0000000000
--- a/meta-python/recipes-devtools/python/python3-pyserial_3.4.bb
+++ /dev/null
@@ -1,7 +0,0 @@
-inherit setuptools3
-require python-pyserial.inc
-
-do_install_append() {
- rm -f ${D}${bindir}/miniterm.py
- rmdir ${D}${bindir}
-}
diff --git a/meta-python/recipes-devtools/python/python3-pyserial_3.5.bb b/meta-python/recipes-devtools/python/python3-pyserial_3.5.bb
new file mode 100644
index 0000000000..ade137a385
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyserial_3.5.bb
@@ -0,0 +1,64 @@
+SUMMARY = "Serial Port Support for Python"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=520e45e59fc2cf94aa53850f46b86436"
+
+SRC_URI[sha256sum] = "3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb"
+
+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}
+}
+
+PACKAGES =+ "${PN}-java ${PN}-osx ${PN}-win32 ${PN}-tools"
+
+FILES:${PN}-java = " \
+ ${PYTHON_SITEPACKAGES_DIR}/serial/*java* \
+ ${PYTHON_SITEPACKAGES_DIR}/serial/__pycache__/*java* \
+"
+
+FILES:${PN}-osx = " \
+ ${PYTHON_SITEPACKAGES_DIR}/serial/tools/*osx* \
+ ${PYTHON_SITEPACKAGES_DIR}/serial/tools/__pycache__/*osx* \
+"
+
+FILES:${PN}-win32 = " \
+ ${PYTHON_SITEPACKAGES_DIR}/serial/*serialcli* \
+ ${PYTHON_SITEPACKAGES_DIR}/serial/__pycache__/*serialcli* \
+ ${PYTHON_SITEPACKAGES_DIR}/serial/*win32* \
+ ${PYTHON_SITEPACKAGES_DIR}/serial/__pycache__/*win32* \
+ ${PYTHON_SITEPACKAGES_DIR}/serial/tools/miniterm* \
+ ${PYTHON_SITEPACKAGES_DIR}/serial/tools/__pycache__/miniterm* \
+ ${PYTHON_SITEPACKAGES_DIR}/serial/tools/*windows* \
+ ${PYTHON_SITEPACKAGES_DIR}/serial/tools/__pycache__/*windows* \
+"
+
+RDEPENDS:${PN} = "\
+ python3-fcntl \
+ python3-io \
+ python3-logging \
+ python3-netclient \
+ python3-numbers \
+ python3-shell \
+ python3-stringold \
+ python3-threading \
+"
+
+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}/test/* ${D}${PTEST_PATH}/test/
+}
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 bbda05a518..0000000000
--- a/meta-python/recipes-devtools/python/python3-pysocks_1.7.1.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-inherit pypi setuptools3
-require python-pysocks.inc
-
-RDEPENDS_${PN}_class-target += "\
- ${PYTHON_PN}-netclient \
-"
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
new file mode 100644
index 0000000000..6a484b8ae9
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pysonos_0.0.54.bb
@@ -0,0 +1,15 @@
+DESCRIPTION = "A SoCo fork with fixes for Home Assistant "
+HOMEPAGE = "https://pypi.org/project/pysonos/"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=07b0e2ca9ac77cd65cd4edf2e13367ea"
+
+SRC_URI[sha256sum] = "2a72897cfd342382573632d80d38776884a38c8d02353d9d5da4e9e8e83cb42b"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "\
+ python3-ifaddr \
+ python3-requests \
+ python3-xmltodict \
+ "
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.6.0.bb b/meta-python/recipes-devtools/python/python3-pystemd_0.6.0.bb
deleted file mode 100644
index 89d718de68..0000000000
--- a/meta-python/recipes-devtools/python/python3-pystemd_0.6.0.bb
+++ /dev/null
@@ -1,13 +0,0 @@
-SUMMARY = "Python bindings for interacting with systemd over DBus"
-LICENSE = "LGPLv2.1"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=4fbd65380cdd255951079008b364516c"
-
-SRC_URI[md5sum] = "c5472be419f53f53f5da089ca8c981c0"
-SRC_URI[sha256sum] = "b1fc072c87e3766711f64caf86fd633dca393e20c8a0a37a5058dd70a21d8a14"
-
-DEPENDS = "systemd"
-REQUIRED_DISTRO_FEATURES = "systemd"
-
-inherit pypi setuptools3 distro_features_check
-
-BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python3-pytest-asyncio_0.10.0.bb b/meta-python/recipes-devtools/python/python3-pytest-asyncio_0.10.0.bb
deleted file mode 100644
index 09f26f8d15..0000000000
--- a/meta-python/recipes-devtools/python/python3-pytest-asyncio_0.10.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-pytest-asyncio.inc
diff --git a/meta-python/recipes-devtools/python/python3-pytest-asyncio_0.23.6.bb b/meta-python/recipes-devtools/python/python3-pytest-asyncio_0.23.6.bb
new file mode 100644
index 0000000000..492020477e
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pytest-asyncio_0.23.6.bb
@@ -0,0 +1,16 @@
+DESCRIPTION = "pytest-asyncio is an Apache2 licensed library, written in Python, for testing asyncio code with pytest"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=136e4f49dbf29942c572a3a8f6e88a77"
+
+SRC_URI[sha256sum] = "ffe523a89c1c222598c76856e76852b787504ddb72dd5d9b6617ffa8aa2cde5f"
+
+inherit pypi python_setuptools_build_meta
+
+DEPENDS += "python3-setuptools-scm-native"
+
+RDEPENDS:${PN} += " \
+ python3-pytest \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-pytest-benchmark_4.0.0.bb b/meta-python/recipes-devtools/python/python3-pytest-benchmark_4.0.0.bb
new file mode 100644
index 0000000000..98ba6c3822
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pytest-benchmark_4.0.0.bb
@@ -0,0 +1,12 @@
+SUMMARY = "A ``pytest`` fixture for benchmarking code. It will group the tests into rounds that are calibrated to the chosen timer."
+HOMEPAGE = "https://github.com/ionelmc/pytest-benchmark"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=c7d2e9d24c2b5bad57ca894da972e22e"
+
+SRC_URI[sha256sum] = "fb0785b83efe599a6a956361c0691ae1dbb5318018561af10f3e915caa0048d1"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-core python3-py-cpuinfo python3-pytest python3-aspectlib"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-pytest-cache_1.0.bb b/meta-python/recipes-devtools/python/python3-pytest-cache_1.0.bb
new file mode 100644
index 0000000000..5338ffdd29
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pytest-cache_1.0.bb
@@ -0,0 +1,15 @@
+# Copyright (C) 2021 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+SUMMARY = "pytest plugin with mechanisms for caching across test runs"
+HOMEPAGE = "http://bitbucket.org/hpk42/pytest-cache/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=a6bb0320b04a0a503f12f69fea479de9"
+
+SRC_URI[sha256sum] = "be7468edd4d3d83f1e844959fd6e3fd28e77a481440a7118d430130ea31b07a9"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-core python3-execnet python3-pprint python3-py python3-pytest"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-pytest-cov_5.0.0.bb b/meta-python/recipes-devtools/python/python3-pytest-cov_5.0.0.bb
new file mode 100644
index 0000000000..e3e4affb9d
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pytest-cov_5.0.0.bb
@@ -0,0 +1,15 @@
+SUMMARY = "Pytest plugin for measuring coverage."
+HOMEPAGE = "https://github.com/pytest-dev/pytest-cov"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = " \
+ file://LICENSE;md5=cbc4e25353c748c817db2daffe605e43 \
+"
+
+SRC_URI[sha256sum] = "5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"
+
+inherit pypi setuptools3
+
+DEPENDS += "python3-setuptools-scm-native"
+RDEPENDS:${PN} += "python3-coverage python3-pytest"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-pytest-forked_1.6.0.bb b/meta-python/recipes-devtools/python/python3-pytest-forked_1.6.0.bb
new file mode 100644
index 0000000000..f573bf0523
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pytest-forked_1.6.0.bb
@@ -0,0 +1,17 @@
+SUMMARY = "run tests in isolated forked subprocesses"
+HOMEPAGE = "https://github.com/pytest-dev/pytest-forked"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=772fcdaca14b378878d05c7d857e6c3e"
+
+SRC_URI[sha256sum] = "4dafd46a9a600f65d822b8f605133ecf5b3e1941ebb3588e943b4e3eb71a5a3f"
+
+inherit pypi python_setuptools_build_meta
+
+PEP517_BUILD_OPTS = "--skip-dependency-check"
+
+DEPENDS += "python3-setuptools-scm-native"
+
+RDEPENDS:${PN} += " \
+ python3-py \
+ python3-pytest \
+"
diff --git a/meta-python/recipes-devtools/python/python3-pytest-helpers-namespace_2016.7.10.bb b/meta-python/recipes-devtools/python/python3-pytest-helpers-namespace_2016.7.10.bb
deleted file mode 100644
index f03f5d415f..0000000000
--- a/meta-python/recipes-devtools/python/python3-pytest-helpers-namespace_2016.7.10.bb
+++ /dev/null
@@ -1,7 +0,0 @@
-require python-pytest-helpers-namespace.inc
-
-inherit setuptools3
-
-RDEPENDS_${PN} += " \
- python3-pytest \
- "
diff --git a/meta-python/recipes-devtools/python/python-pytest-helpers-namespace.inc b/meta-python/recipes-devtools/python/python3-pytest-helpers-namespace_2021.12.29.bb
index a69867d91a..6698b6dde3 100644
--- a/meta-python/recipes-devtools/python/python-pytest-helpers-namespace.inc
+++ b/meta-python/recipes-devtools/python/python3-pytest-helpers-namespace_2021.12.29.bb
@@ -2,9 +2,14 @@ DESCRIPTION = "This plugin does not provide any helpers to pytest, it does, howe
HOMEPAGE = "https://github.com/saltstack/pytest-helpers-namespace"
SECTION = "devel/python"
LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://PKG-INFO;md5=71fac4dfeee99c39c51f617e9486237c"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=440a4cdb311cd7ad181efb4cba06d562"
-SRC_URI[md5sum] = "80fe3e515f640b1459709b539f6b857e"
-SRC_URI[sha256sum] = "d8bdb017c0f7271699c08850b6b12e1ce9e52913cbd4461b5febd21082a29113"
+SRC_URI[sha256sum] = "792038247e0021beb966a7ea6e3a70ff5fcfba77eb72c6ec8fd6287af871c35b"
-inherit pypi
+inherit pypi python_setuptools_build_meta
+
+DEPENDS += "python3-setuptools-scm-native python3-setuptools-declarative-requirements-native"
+
+RDEPENDS:${PN} += " \
+ python3-pytest \
+"
diff --git a/meta-python/recipes-devtools/python/python3-pytest-html_4.1.1.bb b/meta-python/recipes-devtools/python/python3-pytest-html_4.1.1.bb
new file mode 100644
index 0000000000..37478ee0ae
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pytest-html_4.1.1.bb
@@ -0,0 +1,21 @@
+DESCRIPTION = "pytest plugin for generating html reports from test results"
+DEPENDS += "python3-setuptools-scm-native"
+
+LICENSE = "MPL-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=5d425c8f3157dbf212db2ec53d9e5132"
+
+SRC_URI[sha256sum] = "70a01e8ae5800f4a074b56a4cb1025c8f4f9b038bba5fe31e3c98eb996686f07"
+
+PYPI_PACKAGE = "pytest_html"
+
+inherit pypi python_hatchling
+
+DEPENDS += "\
+ python3-hatch-vcs-native \
+"
+
+RDEPENDS:${PN} += " \
+ python3-pytest \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-pytest-json-report_1.5.0.bb b/meta-python/recipes-devtools/python/python3-pytest-json-report_1.5.0.bb
new file mode 100644
index 0000000000..6b108a2d0a
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pytest-json-report_1.5.0.bb
@@ -0,0 +1,18 @@
+SUMMARY = "pytest-json-report is a plugin that creates test reports as JSON"
+HOMEPAGE = "https://github.com/numirias/pytest-json-report"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=8b4ca2f2ad5aaaebd8eb24f262f8fe60"
+
+SRC_URI[sha256sum] = "2dde3c647851a19b5f3700729e8310a6e66efb2077d674f27ddea3d34dc615de"
+
+PYPI_PACKAGE = "pytest-json-report"
+
+inherit pypi setuptools3
+
+DEPENDS += "python3-setuptools-scm-native"
+
+RDEPENDS:${PN} = "\
+ python3-pytest \
+ python3-pytest-metadata \
+"
+
diff --git a/meta-python/recipes-devtools/python/python3-pytest-lazy-fixtures_1.0.7.bb b/meta-python/recipes-devtools/python/python3-pytest-lazy-fixtures_1.0.7.bb
new file mode 100644
index 0000000000..f5e6dbfcd2
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pytest-lazy-fixtures_1.0.7.bb
@@ -0,0 +1,21 @@
+SUMMARY = "Allows you to use fixtures in @pytest.mark.parametrize."
+DESCRIPTION = "Use your fixtures in @pytest.mark.parametrize. \
+\
+This project was inspired by pytest-lazy-fixture.\
+\
+Improvements that have been made in this project:\
+\
+* You can use fixtures in any data structures\
+* You can access the attributes of fixtures\
+* You can use functions in fixtures"
+HOMEPAGE = "https://github.com/dev-petrov/pytest-lazy-fixtures"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=4475e66fcfabe27395e6764c8f69c876"
+
+SRC_URI[sha256sum] = "87ef7424dc0229ff9cb72d482f49b7806535c3500641f612c13ddf243c9adacb"
+
+inherit pypi python_poetry_core
+
+PYPI_PACKAGE = "pytest_lazy_fixtures"
+
+RDEPENDS:${PN} = "python3-pytest"
diff --git a/meta-python/recipes-devtools/python/python3-pytest-localserver/run-ptest b/meta-python/recipes-devtools/python/python3-pytest-localserver/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pytest-localserver/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-pytest-localserver_0.8.1.bb b/meta-python/recipes-devtools/python/python3-pytest-localserver_0.8.1.bb
new file mode 100644
index 0000000000..669817829d
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pytest-localserver_0.8.1.bb
@@ -0,0 +1,29 @@
+SUMMARY = "pytest plugin to test server connections locally."
+HOMEPAGE = "https://github.com/pytest-dev/pytest-localserver"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=b8da7a541d738b054dcbf70c31530432"
+
+DEPENDS += "python3-setuptools-scm-native"
+
+inherit pypi python_setuptools_build_meta ptest
+
+SRC_URI[sha256sum] = "66569c34fef31a5750b16effd1cd1288a7a90b59155d005e7f916accd3dee4f1"
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-requests \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+RDEPENDS:${PN} += " \
+ python3-werkzeug \
+"
diff --git a/meta-python/recipes-devtools/python/python3-pytest-metadata_2.0.2.bb b/meta-python/recipes-devtools/python/python3-pytest-metadata_2.0.2.bb
new file mode 100644
index 0000000000..163a363f82
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pytest-metadata_2.0.2.bb
@@ -0,0 +1,17 @@
+DESCRIPTION = "pytest-metadata is a plugin that allowed for accessing pytest metadata"
+DEPENDS += "python3-setuptools-scm-native"
+
+LICENSE = "MPL-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=5d425c8f3157dbf212db2ec53d9e5132"
+
+SRC_URI[sha256sum] = "fcd2f416f15be295943527b3c8ba16a44ae5a7141939c90c3dc5ce9d167cf2a5"
+
+PYPI_PACKAGE = "pytest-metadata"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} = " \
+ python3-pytest \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-pytest-mock/0001-test_pytest_mock-skip-args-introspection-tests.patch b/meta-python/recipes-devtools/python/python3-pytest-mock/0001-test_pytest_mock-skip-args-introspection-tests.patch
new file mode 100644
index 0000000000..f024e79d93
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pytest-mock/0001-test_pytest_mock-skip-args-introspection-tests.patch
@@ -0,0 +1,38 @@
+From e184fb950ad3b52c5c16438d39fe4d516c784e30 Mon Sep 17 00:00:00 2001
+From: Trevor Gamblin <tgamblin@baylibre.com>
+Date: Thu, 12 Oct 2023 17:32:40 -0400
+Subject: [PATCH] test_pytest_mock: skip args introspection tests
+
+Disable these two tests for now so that python3-pytest-mock can have
+successful ptest runs.
+
+Upstream-Status: Inappropriate [OE-Specific]
+
+Signed-off-by: Trevor Gamblin <tgamblin@baylibre.com>
+---
+ tests/test_pytest_mock.py | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/tests/test_pytest_mock.py b/tests/test_pytest_mock.py
+index 3d53241..157b6c3 100644
+--- a/tests/test_pytest_mock.py
++++ b/tests/test_pytest_mock.py
+@@ -581,6 +581,7 @@ def test_assert_called_wrapper(mocker: MockerFixture) -> None:
+ stub.assert_called()
+
+
++@pytest.mark.skip("Async not correctly detected, skip for now")
+ @pytest.mark.usefixtures("needs_assert_rewrite")
+ def test_assert_called_args_with_introspection(mocker: MockerFixture) -> None:
+ stub = mocker.stub()
+@@ -597,6 +598,7 @@ def test_assert_called_args_with_introspection(mocker: MockerFixture) -> None:
+ stub.assert_called_once_with(*wrong_args)
+
+
++@pytest.mark.skip("Async not correctly detected, skip for now")
+ @pytest.mark.usefixtures("needs_assert_rewrite")
+ def test_assert_called_kwargs_with_introspection(mocker: MockerFixture) -> None:
+ stub = mocker.stub()
+--
+2.41.0
+
diff --git a/meta-python/recipes-devtools/python/python3-pytest-mock/403.patch b/meta-python/recipes-devtools/python/python3-pytest-mock/403.patch
new file mode 100644
index 0000000000..6787c2a3dc
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pytest-mock/403.patch
@@ -0,0 +1,92 @@
+From 8480bb6d0500f933be039cfec65e04157e6ecffe Mon Sep 17 00:00:00 2001
+From: Bruno Oliveira <nicoddemus@gmail.com>
+Date: Tue, 19 Dec 2023 08:24:23 -0300
+Subject: [PATCH 1/3] Fix tests for Python 3.11 and 3.12
+
+Fixes #401.
+Upstream-Status: Backport [https://github.com/pytest-dev/pytest-mock/pull/403]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ tests/test_pytest_mock.py | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/tests/test_pytest_mock.py b/tests/test_pytest_mock.py
+index 3ee00da..7acb361 100644
+--- a/tests/test_pytest_mock.py
++++ b/tests/test_pytest_mock.py
+@@ -246,9 +246,8 @@ def __test_failure_message(self, mocker: MockerFixture, **kwargs: Any) -> None:
+ msg = "Expected call: {0}()\nNot called"
+ expected_message = msg.format(expected_name)
+ stub = mocker.stub(**kwargs)
+- with pytest.raises(AssertionError) as exc_info:
++ with pytest.raises(AssertionError, match=re.escape(expected_message)) as exc_info:
+ stub.assert_called_with()
+- assert str(exc_info.value) == expected_message
+
+ def test_failure_message_with_no_name(self, mocker: MagicMock) -> None:
+ self.__test_failure_message(mocker)
+
+From c596504e062be06475b03122c9c0cc732ae87840 Mon Sep 17 00:00:00 2001
+From: "pre-commit-ci[bot]"
+ <66853113+pre-commit-ci[bot]@users.noreply.github.com>
+Date: Tue, 19 Dec 2023 11:24:38 +0000
+Subject: [PATCH 2/3] [pre-commit.ci] auto fixes from pre-commit.com hooks
+
+for more information, see https://pre-commit.ci
+---
+ tests/test_pytest_mock.py | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/tests/test_pytest_mock.py b/tests/test_pytest_mock.py
+index 7acb361..c185f2a 100644
+--- a/tests/test_pytest_mock.py
++++ b/tests/test_pytest_mock.py
+@@ -246,7 +246,9 @@ def __test_failure_message(self, mocker: MockerFixture, **kwargs: Any) -> None:
+ msg = "Expected call: {0}()\nNot called"
+ expected_message = msg.format(expected_name)
+ stub = mocker.stub(**kwargs)
+- with pytest.raises(AssertionError, match=re.escape(expected_message)) as exc_info:
++ with pytest.raises(
++ AssertionError, match=re.escape(expected_message)
++ ) as exc_info:
+ stub.assert_called_with()
+
+ def test_failure_message_with_no_name(self, mocker: MagicMock) -> None:
+
+From 6da5b0506d6378a8dbe5ae314d5134e6868aeabd Mon Sep 17 00:00:00 2001
+From: danigm <daniel.garcia@suse.com>
+Date: Wed, 20 Dec 2023 16:02:13 +0100
+Subject: [PATCH 3/3] Update expected message to match python 3.11.7 (#404)
+
+https://github.com/python/cpython/issues/111019
+
+Fixes #401.
+Closes #403.
+---
+ tests/test_pytest_mock.py | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/tests/test_pytest_mock.py b/tests/test_pytest_mock.py
+index c185f2a..01534a4 100644
+--- a/tests/test_pytest_mock.py
++++ b/tests/test_pytest_mock.py
+@@ -25,6 +25,8 @@
+
+ # Python 3.8 changed the output formatting (bpo-35500), which has been ported to mock 3.0
+ NEW_FORMATTING = sys.version_info >= (3, 8)
++# Python 3.11.7 changed the output formatting, https://github.com/python/cpython/issues/111019
++NEWEST_FORMATTING = sys.version_info >= (3, 11, 7)
+
+ if sys.version_info[:2] >= (3, 8):
+ from unittest.mock import AsyncMock
+@@ -240,7 +242,9 @@ def test_repr_with_name(self, mocker: MockerFixture) -> None:
+
+ def __test_failure_message(self, mocker: MockerFixture, **kwargs: Any) -> None:
+ expected_name = kwargs.get("name") or "mock"
+- if NEW_FORMATTING:
++ if NEWEST_FORMATTING:
++ msg = "expected call not found.\nExpected: {0}()\n Actual: not called."
++ elif NEW_FORMATTING:
+ msg = "expected call not found.\nExpected: {0}()\nActual: not called."
+ else:
+ msg = "Expected call: {0}()\nNot called"
diff --git a/meta-python/recipes-devtools/python/python3-pytest-mock/run-ptest b/meta-python/recipes-devtools/python/python3-pytest-mock/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pytest-mock/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-pytest-mock_3.12.0.bb b/meta-python/recipes-devtools/python/python3-pytest-mock_3.12.0.bb
new file mode 100644
index 0000000000..e9a9a4fbc5
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pytest-mock_3.12.0.bb
@@ -0,0 +1,33 @@
+SUMMARY = "Thin-wrapper around the mock package for easier use with pytest"
+HOMEPAGE = "https://github.com/pytest-dev/pytest-mock/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = " \
+ file://LICENSE;md5=b2ddb1e69238461b7e4ef2a84d874109 \
+"
+
+SRC_URI = " \
+ git://github.com/pytest-dev/pytest-mock;branch=main;protocol=https \
+ file://run-ptest \
+ file://0001-test_pytest_mock-skip-args-introspection-tests.patch \
+ file://403.patch \
+"
+SRCREV = "69adc6f76c1a7baf4e7a728da9eec38741d5783e"
+
+inherit setuptools3 ptest
+
+DEPENDS += "python3-setuptools-scm-native"
+
+RDEPENDS:${PN} += " \
+ python3-asyncio \
+ python3-pytest \
+ python3-pytest-asyncio \
+ python3-unittest \
+ python3-unittest-automake-output \
+"
+
+S = "${WORKDIR}/git"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests ${D}${PTEST_PATH}/
+}
diff --git a/meta-python/recipes-devtools/python/python3-pytest-runner_5.1.bb b/meta-python/recipes-devtools/python/python3-pytest-runner_5.1.bb
deleted file mode 100644
index df56ba6d47..0000000000
--- a/meta-python/recipes-devtools/python/python3-pytest-runner_5.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-pytest-runner.inc
diff --git a/meta-python/recipes-devtools/python/python3-pytest-tempdir_2016.8.20.bb b/meta-python/recipes-devtools/python/python3-pytest-tempdir_2016.8.20.bb
deleted file mode 100644
index 02e8215636..0000000000
--- a/meta-python/recipes-devtools/python/python3-pytest-tempdir_2016.8.20.bb
+++ /dev/null
@@ -1,7 +0,0 @@
-require python-pytest-tempdir.inc
-
-inherit setuptools3
-
-RDEPENDS_${PN} += " \
- python3-pytest \
- "
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
new file mode 100644
index 0000000000..dff6af4e0a
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pytest-tempdir_2019.10.12.bb
@@ -0,0 +1,14 @@
+DESCRIPTION = "Adds support for a predictable and repeatable temporary directory."
+HOMEPAGE = "https://github.com/saltstack/pytest-tempdir"
+SECTION = "devel/python"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://PKG-INFO;md5=9872c3a37cc9baf79a464cd168282be5"
+
+SRC_URI[md5sum] = "79b997d418fb85c2529ab50cd4333689"
+SRC_URI[sha256sum] = "e7d91813a9aa991db87dacdef8cfd3f1657632d731d56d06238c5ffb63ab36d8"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-pytest \
+"
diff --git a/meta-python/recipes-devtools/python/python3-pytest-timeout_2.3.1.bb b/meta-python/recipes-devtools/python/python3-pytest-timeout_2.3.1.bb
new file mode 100644
index 0000000000..b56c26aada
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pytest-timeout_2.3.1.bb
@@ -0,0 +1,12 @@
+SUMMARY = "py.test plugin to abort hanging tests"
+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"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} = "python3-pytest"
diff --git a/meta-python/recipes-devtools/python/python3-pytest-xdist_3.5.0.bb b/meta-python/recipes-devtools/python/python3-pytest-xdist_3.5.0.bb
new file mode 100644
index 0000000000..89b5039571
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pytest-xdist_3.5.0.bb
@@ -0,0 +1,17 @@
+SUMMARY = "pytest xdist plugin for distributed testing and loop-on-failing modes"
+HOMEPAGE = "https://github.com/pytest-dev/pytest-xdist"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=772fcdaca14b378878d05c7d857e6c3e"
+
+SRC_URI[sha256sum] = "cbb36f3d67e0c478baa57fa4edc8843887e0f6cfc42d677530a36d7472b32d8a"
+
+inherit pypi python_setuptools_build_meta
+
+DEPENDS += "python3-setuptools-scm-native"
+
+# Note that the dependency on pytest-forked is scheduled to be dropped in 3.0
+RDEPENDS:${PN} += " \
+ python3-execnet \
+ python3-pytest \
+ python3-pytest-forked \
+"
diff --git a/meta-python/recipes-devtools/python/python3-pytest_5.2.1.bb b/meta-python/recipes-devtools/python/python3-pytest_5.2.1.bb
deleted file mode 100644
index eba6632a27..0000000000
--- a/meta-python/recipes-devtools/python/python3-pytest_5.2.1.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-inherit pypi setuptools3
-require python-pytest.inc
-
-ALTERNATIVE_PRIORITY = "100"
diff --git a/meta-python/recipes-devtools/python/python3-python-vlc_3.0.7110.bb b/meta-python/recipes-devtools/python/python3-python-vlc_3.0.20123.bb
index be63fed02a..960da1437c 100644
--- a/meta-python/recipes-devtools/python/python3-python-vlc_3.0.7110.bb
+++ b/meta-python/recipes-devtools/python/python3-python-vlc_3.0.20123.bb
@@ -1,9 +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[md5sum] = "e128abf7115d6513582bd460c0e74485"
-SRC_URI[sha256sum] = "821bca0dbe08fbff97a65e56ff2318ad7d499330876579c39f01f3fb38c7b679"
+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.4.bb b/meta-python/recipes-devtools/python/python3-pythonping_1.1.4.bb
new file mode 100644
index 0000000000..62f5c0caad
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pythonping_1.1.4.bb
@@ -0,0 +1,11 @@
+SUMMARY = "PythonPing is simple way to ping in Python."
+HOMEPAGE = "https://pypi.org/project/pythonping/"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://setup.py;beginline=12;endline=12;md5=2d33c00f47720c7e35e1fdb4b9fab027"
+
+SRC_URI[sha256sum] = "acef84640fee6f20b725f2a1d2392771f2845554cfabcef30b1fdea5030161af"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-io"
diff --git a/meta-python/recipes-devtools/python/python3-pytoml/run-ptest b/meta-python/recipes-devtools/python/python3-pytoml/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pytoml/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+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
new file mode 100644
index 0000000000..1717085967
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pytoml_0.1.21.bb
@@ -0,0 +1,31 @@
+SUMMARY = "A TOML-0.4.0 parser/writer for Python"
+HOMEPAGE = "https://pypi.python.org/pypi/pytoml/"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=cfff423699bdaef24331933ac4f56078"
+
+SRC_URI[md5sum] = "e59dd36a559dd2a876e4c149c69e947b"
+SRC_URI[sha256sum] = "8eecf7c8d0adcff3b375b09fe403407aa9b645c499e5ab8cac670ac4a35f61e7"
+
+inherit pypi setuptools3 ptest
+
+BBCLASSEXTEND = "native nativesdk"
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN} += " \
+ python3-datetime \
+ python3-stringold \
+ "
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/test
+ cp -rf ${S}/test/* ${D}${PTEST_PATH}/test/
+}
diff --git a/meta-python/recipes-devtools/python/python3-pytz_2019.3.bb b/meta-python/recipes-devtools/python/python3-pytz_2019.3.bb
deleted file mode 100755
index 19a89dc55d..0000000000
--- a/meta-python/recipes-devtools/python/python3-pytz_2019.3.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-pytz.inc
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.21.0.bb b/meta-python/recipes-devtools/python/python3-pyudev_0.21.0.bb
deleted file mode 100644
index a62d944bac..0000000000
--- a/meta-python/recipes-devtools/python/python3-pyudev_0.21.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-pyudev.inc
-inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-pyudev_0.24.1.bb b/meta-python/recipes-devtools/python/python3-pyudev_0.24.1.bb
new file mode 100644
index 0000000000..ed5175fcf7
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyudev_0.24.1.bb
@@ -0,0 +1,22 @@
+SUMMARY = "A libudev binding"
+
+LICENSE = "LGPL-2.1-or-later"
+LIC_FILES_CHKSUM = "file://COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343"
+
+SRC_URI[sha256sum] = "75e54d37218f5ac45b0da1f0fd9cc5e526a3cac3ef1cfad410cf7ab338b01471"
+
+inherit pypi setuptools3
+
+do_configure:prepend() {
+ sed -i "/import pyudev/d" ${S}/setup.py
+ sed -i "s/str(pyudev.__version__)/'${PV}'/g" ${S}/setup.py
+}
+
+RDEPENDS:${PN} = "\
+ python3-ctypes \
+ python3-misc \
+ python3-six \
+ python3-threading \
+ python3-fcntl \
+ libudev \
+"
diff --git a/meta-python/recipes-devtools/python/python3-pyunormalize_15.1.0.bb b/meta-python/recipes-devtools/python/python3-pyunormalize_15.1.0.bb
new file mode 100644
index 0000000000..6992ca24cc
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyunormalize_15.1.0.bb
@@ -0,0 +1,8 @@
+SUMMARY = "Unicode normalization forms (NFC, NFKC, NFD, NFKD). A library independent from the Python core Unicode database."
+HOMEPAGE = "https://github.com/mlodewijck/pyunormalize"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=dc15b678c3bac1f5b2c873591a330eae"
+
+SRC_URI[sha256sum] = "cf4a87451a0f1cb76911aa97f432f4579e1f564a2f0c84ce488c73a73901b6c1"
+
+inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-pyusb_1.0.2.bb b/meta-python/recipes-devtools/python/python3-pyusb_1.0.2.bb
deleted file mode 100644
index 1ecede7cf8..0000000000
--- a/meta-python/recipes-devtools/python/python3-pyusb_1.0.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-pyusb.inc
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
new file mode 100644
index 0000000000..2282e0300b
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyusb_1.2.1.bb
@@ -0,0 +1,18 @@
+SUMMARY = "PyUSB provides USB access on the Python language"
+HOMEPAGE = "http://pyusb.sourceforge.net/"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e64a29fcd3c3dd356a24e235dfcb3905"
+
+DEPENDS += "libusb1 python3-setuptools-scm-native"
+
+RDEPENDS:${PN} += " \
+ python3-logging \
+"
+
+SRC_URI[sha256sum] = "a4cc7404a203144754164b8b40994e2849fde1cfff06b08492f12fff9d9de7b9"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-ctypes"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-pyyaml-include/run-ptest b/meta-python/recipes-devtools/python/python3-pyyaml-include/run-ptest
new file mode 100755
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyyaml-include/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-pyyaml-include_1.3.2.bb b/meta-python/recipes-devtools/python/python3-pyyaml-include_1.3.2.bb
new file mode 100644
index 0000000000..3a5bd99a78
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyyaml-include_1.3.2.bb
@@ -0,0 +1,29 @@
+SUMMARY = "Extending PyYAML with a custom constructor for including YAML files within YAML files"
+HOMEPAGE = "https://github.com/tanbro/pyyaml-include"
+LICENSE = "GPL-3.0-only"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d32239bcb673463ab874e80d47fae504"
+DEPENDS += "python3-setuptools-scm-native"
+SRCREV = "36b6975aa8fc7a6cbf37de40aa2ed6d996b2f7be"
+
+SRC_URI = " \
+ git://github.com/tanbro/pyyaml-include;protocol=https;branch=main \
+ file://run-ptest \
+ "
+
+S = "${WORKDIR}/git"
+
+inherit python_setuptools_build_meta ptest
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+RDEPENDS:${PN} += " \
+ python3-pyyaml \
+"
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
diff --git a/meta-python/recipes-devtools/python/python3-pyyaml_5.1.2.bb b/meta-python/recipes-devtools/python/python3-pyyaml_5.1.2.bb
deleted file mode 100644
index 470aca608b..0000000000
--- a/meta-python/recipes-devtools/python/python3-pyyaml_5.1.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-pyyaml.inc
diff --git a/meta-python/recipes-devtools/python/python3-pyzmq/club-rpath-out.patch b/meta-python/recipes-devtools/python/python3-pyzmq/club-rpath-out.patch
new file mode 100644
index 0000000000..61aeaca5fa
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyzmq/club-rpath-out.patch
@@ -0,0 +1,29 @@
+From efae4e08d13e0958d929ea524e21c0a210b31982 Mon Sep 17 00:00:00 2001
+From: Leon Anavi <leon.anavi@konsulko.com>
+Date: Fri, 22 Jan 2021 11:41:12 +0200
+Subject: [PATCH] setup.py: Adjust _add_rpath
+
+Fix error: unrecognized command-line option '-R'
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
+
+---
+ setup.py | 3 ---
+ 1 file changed, 3 deletions(-)
+
+diff --git a/setup.py b/setup.py
+index b634d94..7f6a2f1 100755
+--- a/setup.py
++++ b/setup.py
+@@ -235,9 +235,6 @@ def _add_rpath(settings, path):
+ """
+ if sys.platform == 'darwin':
+ settings['extra_link_args'].extend(['-Wl,-rpath', '-Wl,%s' % path])
+- else:
+- settings['runtime_library_dirs'].append(path)
+-
+
+ def settings_from_prefix(prefix=None):
+ """load appropriate library/include settings from ZMQ prefix"""
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_17.1.0.bb b/meta-python/recipes-devtools/python/python3-pyzmq_17.1.0.bb
deleted file mode 100644
index 050f53af14..0000000000
--- a/meta-python/recipes-devtools/python/python3-pyzmq_17.1.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-pyzmq.inc
-inherit setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-pyzmq_25.1.2.bb b/meta-python/recipes-devtools/python/python3-pyzmq_25.1.2.bb
new file mode 100644
index 0000000000..2a6993c141
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyzmq_25.1.2.bb
@@ -0,0 +1,58 @@
+SUMMARY = "PyZMQ: Python bindings for ZMQ"
+DESCRIPTION = "This package contains Python bindings for ZeroMQ. ZMQ is a lightweight and fast messaging implementation."
+HOMEPAGE = "http://zeromq.org/bindings:python"
+LICENSE = "BSD-3-Clause & LGPL-3.0-only"
+LIC_FILES_CHKSUM = "\
+ file://LICENSE.BSD;md5=1787206f198344195a671b60326c59dc \
+ file://LICENSE.LESSER;md5=0e99bfbdd8b9d33b0221986fe3be89ed \
+"
+
+DEPENDS = "python3-packaging-native python3-cython-native python3-setuptools-scm-native zeromq"
+
+SRC_URI:append = " \
+ file://club-rpath-out.patch \
+ file://run-ptest \
+"
+SRC_URI[sha256sum] = "93f1aa311e8bb912e34f004cf186407a4e90eec4f0ecc0efd26056bf7eda0226"
+
+inherit pypi pkgconfig python_setuptools_build_meta ptest
+
+PACKAGES =+ "\
+ ${PN}-test \
+"
+
+FILES:${PN}-test += "\
+ ${PYTHON_SITEPACKAGES_DIR}/*/tests \
+"
+
+RDEPENDS:${PN} += "\
+ python3-json \
+ python3-multiprocessing \
+ python3-tornado \
+"
+
+RDEPENDS:${PN}-ptest += "\
+ ${PN}-test \
+ python3-pytest \
+ python3-unittest-automake-output \
+ python3-unixadmin \
+"
+
+do_compile:prepend() {
+ echo [global] > ${S}/setup.cfg
+ echo zmq_prefix = ${STAGING_DIR_HOST} >> ${S}/setup.cfg
+ echo have_sys_un_h = True >> ${S}/setup.cfg
+ echo skip_check_zmq = True >> ${S}/setup.cfg
+ echo libzmq_extension = False >> ${S}/setup.cfg
+ echo no_libzmq_extension = True >> ${S}/setup.cfg
+}
+
+do_install:append() {
+ sed -i -e 's#${RECIPE_SYSROOT}##g' ${D}${PYTHON_SITEPACKAGES_DIR}/zmq/utils/config.json
+ sed -i -e 's#${RECIPE_SYSROOT}##g' ${D}${PYTHON_SITEPACKAGES_DIR}/zmq/utils/compiler.json
+}
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/zmq/tests/* ${D}${PTEST_PATH}/tests/
+}
diff --git a/meta-python/recipes-devtools/python/python3-pyzstd_0.15.10.bb b/meta-python/recipes-devtools/python/python3-pyzstd_0.15.10.bb
new file mode 100644
index 0000000000..c094a8d6f0
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-pyzstd_0.15.10.bb
@@ -0,0 +1,18 @@
+DESCRIPTION = "Pyzstd module provides classes and functions for compressing and \
+decompressing data, using Facebook’s Zstandard (or zstd as short name) algorithm."
+HOMEPAGE = "https://github.com/animalize/pyzstd"
+SECTION = "devel/python"
+
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=aedb5a2679cd1552fb61c181ef974b9e"
+
+PYPI_PACKAGE = "pyzstd"
+
+SRC_URI[sha256sum] = "83603a97fdbcf2139f475c940789f09e32703f931f29f4a8ddf3551e6700108b"
+
+inherit pypi setuptools3
+
+# clang-16 with -flto segfaults on arm, therefore ignore flto for now
+do_configure:append:arm:toolchain-clang() {
+ sed -i -e "s|'-flto'|''|" ${S}/setup.py
+}
diff --git a/meta-python/recipes-devtools/python/python3-qface_2.0.8.bb b/meta-python/recipes-devtools/python/python3-qface_2.0.8.bb
new file mode 100644
index 0000000000..8ad61ab12b
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-qface_2.0.8.bb
@@ -0,0 +1,24 @@
+SUMMARY = "A generator framework based on a common modern IDL"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=eee61e10a40b0e3045ee5965bcd9a8b5"
+
+SRC_URI[sha256sum] = "eccee7dbc4290c5a4e394df8d527f39148e0de0ff22c6b260f48c48f12b3beb4"
+
+inherit pypi setuptools3
+
+DEPS = "\
+ python3-jinja2 \
+ python3-click \
+ python3-pyyaml \
+ python3-pytest \
+ python3-six \
+ python3-path \
+ python3-antlr4-runtime \
+ python3-watchdog \
+ python3-markupsafe \
+ python3-setuptools \
+"
+DEPENDS += "${DEPS}"
+RDEPENDS:${PN} += "${DEPS}"
+
+BBCLASSEXTEND = "nativesdk native"
diff --git a/meta-python/recipes-devtools/python/python3-qrcode_7.4.2.bb b/meta-python/recipes-devtools/python/python3-qrcode_7.4.2.bb
new file mode 100644
index 0000000000..204f4eceec
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-qrcode_7.4.2.bb
@@ -0,0 +1,16 @@
+SUMMARY = "QR Code image generator"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=4b802d2a65df4626623c79757f486af9"
+
+PYPI_PACKAGE = "qrcode"
+SRC_URI[sha256sum] = "9dd969454827e127dbd93696b20747239e6d540e082937c90f14ac95b30f5845"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} = " \
+ python3-six \
+ python3-pillow \
+ python3-pypng \
+ python3-typing-extensions \
+"
diff --git a/meta-python/recipes-devtools/python/python3-rapidjson/run-ptest b/meta-python/recipes-devtools/python/python3-rapidjson/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-rapidjson/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-rapidjson_1.14.bb b/meta-python/recipes-devtools/python/python3-rapidjson_1.14.bb
new file mode 100644
index 0000000000..22868d8df0
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-rapidjson_1.14.bb
@@ -0,0 +1,40 @@
+SUMMARY = "Python wrapper around rapidjson"
+HOMEPAGE = "https://github.com/python-rapidjson/python-rapidjson"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=4daf3929156304df67003c33274a98bd"
+
+SRC_URI[sha256sum] = "26806f0a658c34b48d2951d8d3f846ca9deb93a34e664ef436db632a188b6779"
+
+# Inheriting ptest provides functionality for packaging and installing runtime tests for this recipe
+inherit setuptools3 pypi ptest
+
+PYPI_PACKAGE = "python-rapidjson"
+
+SETUPTOOLS_BUILD_ARGS += " --rj-include-dir=${RECIPE_SYSROOT}${includedir}"
+
+# run-ptest is a shell script that starts the test suite
+SRC_URI += " \
+ file://run-ptest \
+"
+
+DEPENDS += " \
+ rapidjson \
+"
+
+# Adding required python package for the ptest (pytest and pytest->automake report translation)
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+ python3-pytz \
+"
+
+RDEPENDS:${PN} += " \
+ python3-core \
+"
+
+# Installing the test suite on the target
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
diff --git a/meta-python/recipes-devtools/python/python3-rarfile_4.2.bb b/meta-python/recipes-devtools/python/python3-rarfile_4.2.bb
new file mode 100644
index 0000000000..41cff4bfc4
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-rarfile_4.2.bb
@@ -0,0 +1,23 @@
+SUMMARY = "RAR archive reader for Python"
+HOMEPAGE = "https://github.com/markokr/rarfile"
+LICENSE = "ISC"
+SECTION = "devel/python"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=1916695551f7eec48dfd97db9467b831"
+
+inherit setuptools3
+
+SRC_URI[sha256sum] = "8e1c8e72d0845ad2b32a47ab11a719bc2e41165ec101fd4d3fe9e92aa3f469ef"
+
+inherit pypi
+
+PYPI_PACKAGE="rarfile"
+
+RDEPENDS:${PN} += "\
+ p7zip \
+ python3-core \
+ python3-datetime \
+ python3-crypt \
+ python3-io \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-raven_6.10.0.bb b/meta-python/recipes-devtools/python/python3-raven_6.10.0.bb
index 0f346e45ec..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
@@ -1,2 +1,18 @@
-inherit setuptools3
-require python-raven.inc
+SUMMARY = "Raven is the legacy Python client for Sentry (getsentry.com)"
+DESCRIPTION = "\
+Raven is the official legacy Python client for Sentry, officially \
+supports Python 2.6–2.7 & 3.3–3.7, and runs on PyPy and Google App Engine."
+HOMEPAGE = "https://github.com/getsentry/raven-python"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=b9a4414e08f0571d55184531cefc131b"
+
+SRC_URI[md5sum] = "3676f31dadfa61526444dd0245c78a38"
+SRC_URI[sha256sum] = "3fa6de6efa2493a7c827472e984ce9b020797d0da16f1db67197bcc23c8fae54"
+
+PYPI_PACKAGE = "raven"
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-json \
+ python3-logging \
+"
diff --git a/meta-python/recipes-devtools/python/python3-rdflib_4.2.2.bb b/meta-python/recipes-devtools/python/python3-rdflib_4.2.2.bb
deleted file mode 100644
index 6511df3ce1..0000000000
--- a/meta-python/recipes-devtools/python/python3-rdflib_4.2.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-rdflib.inc
diff --git a/meta-python/recipes-devtools/python/python3-redis_2.10.6.bb b/meta-python/recipes-devtools/python/python3-redis_2.10.6.bb
deleted file mode 100644
index b192ed8725..0000000000
--- a/meta-python/recipes-devtools/python/python3-redis_2.10.6.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-redis.inc
diff --git a/meta-python/recipes-devtools/python/python3-redis_5.0.1.bb b/meta-python/recipes-devtools/python/python3-redis_5.0.1.bb
new file mode 100644
index 0000000000..2c473c03ea
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-redis_5.0.1.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Python client for Redis key-value store"
+DESCRIPTION = "The Python interface to the Redis key-value store."
+HOMEPAGE = "http://github.com/andymccurdy/redis-py"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=609ded3add9111c4c6e102f1d421d3f8"
+
+SRC_URI[sha256sum] = "0dab495cd5753069d3bc650a0dde8a8f9edde16fc5691b689a566eda58100d0f"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-asyncio \
+ python3-compression \
+ python3-cryptography \
+ python3-datetime \
+ python3-json \
+ python3-packaging \
+"
diff --git a/meta-python/recipes-devtools/python/python3-regex_2019.08.19.bb b/meta-python/recipes-devtools/python/python3-regex_2019.08.19.bb
deleted file mode 100755
index 80194d60f9..0000000000
--- a/meta-python/recipes-devtools/python/python3-regex_2019.08.19.bb
+++ /dev/null
@@ -1,12 +0,0 @@
-SUMMARY = ""
-HOMEPAGE = "http://pythonhosted.org/regex"
-LICENSE = "PSF"
-LIC_FILES_CHKSUM = "file://PKG-INFO;md5=51cb124129fa4d157b4aebb77df73629"
-
-inherit pypi setuptools3
-
-SRC_URI[md5sum] = "d31ec392ab75b894404d8db76dacd191"
-SRC_URI[sha256sum] = "587b62d48ca359d2d4f02d486f1f0aa9a20fbaf23a9d4198c4bed72ab2f6c849"
-
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-regex_2023.12.25.bb b/meta-python/recipes-devtools/python/python3-regex_2023.12.25.bb
new file mode 100644
index 0000000000..d7ac616083
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-regex_2023.12.25.bb
@@ -0,0 +1,14 @@
+SUMMARY = "Alternative regular expression module, to replace re."
+HOMEPAGE = "https://bitbucket.org/mrabarnett/mrab-regex/src"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=7b5751ddd6b643203c31ff873051d069"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"
+
+RDEPENDS:${PN} += " \
+ python3-stringold \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-requests-file/run-ptest b/meta-python/recipes-devtools/python/python3-requests-file/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-requests-file/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-requests-file_1.4.3.bb b/meta-python/recipes-devtools/python/python3-requests-file_1.4.3.bb
deleted file mode 100644
index 0407779da3..0000000000
--- a/meta-python/recipes-devtools/python/python3-requests-file_1.4.3.bb
+++ /dev/null
@@ -1,14 +0,0 @@
-SUMMARY = "File transport adapter for Requests"
-HOMEPAGE = "http://github.com/dashea/requests-file"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=9cc728d6087e43796227b0a31422de6b"
-
-SRC_URI[md5sum] = "470711c9b7e0de1057f7b72a58b7ab51"
-SRC_URI[sha256sum] = "8f04aa6201bacda0567e7ac7f677f1499b0fc76b22140c54bc06edf1ba92e2fa"
-
-inherit pypi setuptools3
-
-RDEPENDS_${PN} += " \
- python3-requests \
-"
-
diff --git a/meta-python/recipes-devtools/python/python3-requests-file_1.5.1.bb b/meta-python/recipes-devtools/python/python3-requests-file_1.5.1.bb
new file mode 100644
index 0000000000..7ff984a933
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-requests-file_1.5.1.bb
@@ -0,0 +1,28 @@
+SUMMARY = "File transport adapter for Requests"
+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"
+
+inherit pypi setuptools3 ptest
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+RDEPENDS:${PN} += " \
+ python3-requests \
+"
+
diff --git a/meta-python/recipes-devtools/python/python3-requests-ftp_0.3.1.bb b/meta-python/recipes-devtools/python/python3-requests-ftp_0.3.1.bb
index 3f99ed6756..6df8e7e0bb 100644
--- a/meta-python/recipes-devtools/python/python3-requests-ftp_0.3.1.bb
+++ b/meta-python/recipes-devtools/python/python3-requests-ftp_0.3.1.bb
@@ -8,7 +8,7 @@ SRC_URI[sha256sum] = "7504ceb5cba8a5c0135ed738596820a78c5f2be92d79b29f96ba99b183
inherit pypi setuptools3
-RDEPENDS_${PN} += " \
+RDEPENDS:${PN} += " \
python3-requests \
"
diff --git a/meta-python/recipes-devtools/python/python3-requests-futures_0.9.5.bb b/meta-python/recipes-devtools/python/python3-requests-futures_1.0.1.bb
index b94929d8c6..28f034f7e3 100644
--- a/meta-python/recipes-devtools/python/python3-requests-futures_0.9.5.bb
+++ b/meta-python/recipes-devtools/python/python3-requests-futures_1.0.1.bb
@@ -3,12 +3,11 @@ HOMEPAGE = "https://github.com/ross/requests-futures"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE;md5=e1e50798d0afe0e1f87594c6619a2fa5"
-SRC_URI[md5sum] = "e20dc6f063c70888a7f8225e349b6682"
-SRC_URI[sha256sum] = "33aa8a3b7892850701707d7e094b1e1ce7c4f7a36ff2a1dcc2da4e01a1a00f7e"
+SRC_URI[sha256sum] = "f55a4ef80070e2858e7d1e73123d2bfaeaf25b93fd34384d8ddf148e2b676373"
inherit pypi setuptools3
-RDEPENDS_${PN} += " \
+RDEPENDS:${PN} += " \
python3-requests \
"
diff --git a/meta-python/recipes-devtools/python/python3-requests-oauthlib_0.8.0.bb b/meta-python/recipes-devtools/python/python3-requests-oauthlib_0.8.0.bb
deleted file mode 100644
index 1294661509..0000000000
--- a/meta-python/recipes-devtools/python/python3-requests-oauthlib_0.8.0.bb
+++ /dev/null
@@ -1,3 +0,0 @@
-require python-requests-oauthlib.inc
-inherit pypi setuptools3
-
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
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-requests-toolbelt/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-requests-toolbelt_1.0.0.bb b/meta-python/recipes-devtools/python/python3-requests-toolbelt_1.0.0.bb
new file mode 100644
index 0000000000..9cbe4927a2
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-requests-toolbelt_1.0.0.bb
@@ -0,0 +1,36 @@
+DESCRIPTION = "A utility belt for advanced users of python-requests."
+HOMEPAGE = "https://toolbelt.readthedocs.org"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=6f14302a4b4099009ab38b4dde5f1075"
+
+SRC_URI = "file://run-ptest \
+ file://090856f4159c40a2927fb88546419f2e1697ad5f.patch \
+ file://720240501dca0b4eacc3295665d7ced8719e11d2.patch \
+ "
+
+SRC_URI[sha256sum] = "7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"
+
+inherit pypi setuptools3 ptest
+
+RDEPENDS:${PN} += " \
+ python3-requests (>=2.0.1) \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-betamax \
+ python3-mock \
+ python3-multiprocessing \
+ python3-pytest \
+ python3-trustme \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+ cp -rf ${S}/setup.py ${D}${PTEST_PATH}
+ # remove test test_multipart_encoder.py as it fails,
+ # downloaded file is not supported
+ rm -f ${D}${PTEST_PATH}/tests/test_multipart_encoder.py
+}
diff --git a/meta-python/recipes-devtools/python/python3-requests-unixsocket_0.3.0.bb b/meta-python/recipes-devtools/python/python3-requests-unixsocket_0.3.0.bb
new file mode 100644
index 0000000000..94497b609b
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-requests-unixsocket_0.3.0.bb
@@ -0,0 +1,14 @@
+SUMMARY = "Use requests to talk HTTP via a UNIX domain socket"
+HOMEPAGE = "https://pypi.org/project/requests-unixsocket/"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d2794c0df5b907fdace235a619d80314"
+
+SRC_URI[sha256sum] = "28304283ea9357d45fff58ad5b11e47708cfbf5806817aa59b2a363228ee971e"
+
+PYPI_PACKAGE = "requests-unixsocket"
+
+inherit pypi
+inherit setuptools3
+
+DEPENDS += "python3-pbr-native"
+RDEPENDS:${PN} = "python3-requests python3-urllib3"
diff --git a/meta-python/recipes-devtools/python/python3-requests_2.22.0.bb b/meta-python/recipes-devtools/python/python3-requests_2.22.0.bb
deleted file mode 100644
index 0a2410f85c..0000000000
--- a/meta-python/recipes-devtools/python/python3-requests_2.22.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-requests.inc
diff --git a/meta-python/recipes-devtools/python/python3-responses_0.25.0.bb b/meta-python/recipes-devtools/python/python3-responses_0.25.0.bb
new file mode 100644
index 0000000000..f4b59c7506
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-responses_0.25.0.bb
@@ -0,0 +1,15 @@
+DESCRIPTION = "A utility library for mocking out the requests Python library."
+HOMEPAGE = "https://github.com/getsentry/responses"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=0e601511a8517f4daf688a8eb95be7a2"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "01ae6a02b4f34e39bffceb0fc6786b67a25eae919c6368d05eabc8d9576c2a66"
+
+RDEPENDS:${PN} += " \
+ python3-mock \
+ python3-pyyaml \
+ python3-requests \
+ python3-urllib3 \
+"
diff --git a/meta-python/recipes-devtools/python/python3-rfc3987_1.3.8.bb b/meta-python/recipes-devtools/python/python3-rfc3987_1.3.8.bb
deleted file mode 100644
index cd1536b36f..0000000000
--- a/meta-python/recipes-devtools/python/python3-rfc3987_1.3.8.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-rfc3987.inc
diff --git a/meta-python/recipes-devtools/python/python3-rlp_4.0.0.bb b/meta-python/recipes-devtools/python/python3-rlp_4.0.0.bb
new file mode 100644
index 0000000000..7df8ac07c5
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-rlp_4.0.0.bb
@@ -0,0 +1,16 @@
+SUMMARY = "A Python implementation of Recursive Length Prefix encoding (RLP)."
+HOMEPAGE = "https://github.com/ethereum/pyrlp"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=00854fa80a84236706b11f47f23e61e7"
+
+SRC_URI[sha256sum] = "61a5541f86e4684ab145cb849a5929d2ced8222930a570b3941cf4af16b72a78"
+
+inherit pypi setuptools3
+
+DEPENDS += "python3-pip-native"
+
+RDEPENDS:${PN} += " \
+ python3-eth-utils \
+ python3-typing-extensions \
+"
diff --git a/meta-python/recipes-devtools/python/python3-robotframework-seriallibrary_0.3.1.bb b/meta-python/recipes-devtools/python/python3-robotframework-seriallibrary_0.3.1.bb
deleted file mode 100644
index 440f69cbf7..0000000000
--- a/meta-python/recipes-devtools/python/python3-robotframework-seriallibrary_0.3.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools
-require python-robotframework-seriallibrary.inc
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_3.0.4.bb b/meta-python/recipes-devtools/python/python3-robotframework_3.0.4.bb
deleted file mode 100644
index 8f613c3868..0000000000
--- a/meta-python/recipes-devtools/python/python3-robotframework_3.0.4.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-robotframework.inc
diff --git a/meta-python/recipes-devtools/python/python-robotframework.inc b/meta-python/recipes-devtools/python/python3-robotframework_7.0.bb
index e920c51da1..beb71e6a18 100644
--- a/meta-python/recipes-devtools/python/python-robotframework.inc
+++ b/meta-python/recipes-devtools/python/python3-robotframework_7.0.bb
@@ -9,18 +9,22 @@ HOMEPAGE = "http://robotframework.org"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=3b83ef96387f14655fc854ddc3c6bd57"
-inherit pypi
+inherit pypi setuptools3
-SRC_URI[md5sum] = "ee753415645ff4831ff0d366a0467fe7"
-SRC_URI[sha256sum] = "ab94257cbd848dfca7148e092d233a12853cc7e840ce8231af9cbb5e7f51aa47"
+PYPI_PACKAGE_EXT = "zip"
-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 \
+SRC_URI[sha256sum] = "04623f758346c917db182e17591ffa474090560c02ed5a64343902e72b7b4bd5"
+
+RDEPENDS:${PN} += " \
+ python3-shell \
+ python3-pprint \
+ python3-xml \
+ python3-difflib \
+ python3-threading \
+ python3-html \
+ python3-docutils \
+ python3-ctypes \
+ python3-logging \
+ python3-numbers \
+ python3-profile \
"
diff --git a/meta-python/recipes-devtools/python/python3-rsa_4.9.bb b/meta-python/recipes-devtools/python/python3-rsa_4.9.bb
new file mode 100644
index 0000000000..c27cd1d68a
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-rsa_4.9.bb
@@ -0,0 +1,39 @@
+SUMMARY = "Pure-Python RSA implementation"
+SECTION = "devel/python"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=c403f6882d4f97a9cd927df987d55634"
+
+SRC_URI[sha256sum] = "e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"
+
+inherit pypi python_poetry_core update-alternatives
+
+ALTERNATIVE:${PN} = "\
+ pyrsa-decrypt \
+ pyrsa-encrypt \
+ pyrsa-keygen \
+ pyrsa-priv2pub \
+ pyrsa-sign \
+ pyrsa-verify \
+"
+
+ALTERNATIVE_LINK_NAME[pyrsa-decrypt] = "${bindir}/pyrsa-decrypt"
+ALTERNATIVE_LINK_NAME[pyrsa-encrypt] = "${bindir}/pyrsa-encrypt"
+ALTERNATIVE_LINK_NAME[pyrsa-keygen] = "${bindir}/pyrsa-keygen"
+ALTERNATIVE_LINK_NAME[pyrsa-priv2pub] = "${bindir}/pyrsa-priv2pub"
+ALTERNATIVE_LINK_NAME[pyrsa-sign] = "${bindir}/pyrsa-sign"
+ALTERNATIVE_LINK_NAME[pyrsa-verify] = "${bindir}/pyrsa-verify"
+ALTERNATIVE_PRIORITY = "30"
+
+
+RDEPENDS:${PN} += "\
+ python3-compression \
+ python3-crypt \
+ python3-doctest \
+ python3-logging \
+ python3-math \
+ python3-multiprocessing \
+ python3-netclient \
+ python3-pickle \
+"
+
+RDEPENDS:${PN} += "python3-pyasn1"
diff --git a/meta-python/recipes-devtools/python/python3-ruamel-yaml_0.16.5.bb b/meta-python/recipes-devtools/python/python3-ruamel-yaml_0.16.5.bb
deleted file mode 100644
index ba095648fb..0000000000
--- a/meta-python/recipes-devtools/python/python3-ruamel-yaml_0.16.5.bb
+++ /dev/null
@@ -1,16 +0,0 @@
-SUMMARY = "YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order."
-AUTHOR = "Anthon van der Neut"
-
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=caf8bd842440b537c044e131785a4666"
-
-PYPI_PACKAGE = "ruamel.yaml"
-
-inherit pypi setuptools3
-
-SRC_URI[md5sum] = "7d5a5b0a7621a1247b081cc8e4978354"
-SRC_URI[sha256sum] = "412a6f5cfdc0525dee6a27c08f5415c7fd832a7afcb7a0ed7319628aed23d408"
-
-do_install_prepend() {
- export RUAMEL_NO_PIP_INSTALL_CHECK=1
-}
diff --git a/meta-python/recipes-devtools/python/python3-scapy_0.25.bb b/meta-python/recipes-devtools/python/python3-scapy_0.25.bb
deleted file mode 100644
index f785a2fe86..0000000000
--- a/meta-python/recipes-devtools/python/python3-scapy_0.25.bb
+++ /dev/null
@@ -1,13 +0,0 @@
-DESCRIPTION = "Packet crafting/sending/sniffing, PCAP processing tool,\
-based on scapy with python3 compatibility"
-SECTION = "devel/python"
-HOMEPAGE = "https://github.com/phaethon/scapy"
-LICENSE = "GPLv2"
-LIC_FILES_CHKSUM = "file://PKG-INFO;md5=a4282d4d80227fa599a99e77fdd95e71"
-
-inherit pypi setuptools3
-
-PYPI_PACKAGE = "scapy-python3"
-
-SRC_URI[md5sum] = "c9003d39def73c028cb8c71bcbb42629"
-SRC_URI[sha256sum] = "2ae1b3bd9759844e830a6cc3ba11c3f25b08433a8ee3e7eddc08224905e5ef2b"
diff --git a/meta-python/recipes-devtools/python/python3-schedule_1.2.1.bb b/meta-python/recipes-devtools/python/python3-schedule_1.2.1.bb
new file mode 100644
index 0000000000..6ebde30e61
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-schedule_1.2.1.bb
@@ -0,0 +1,10 @@
+SUMMARY = "Job scheduling for humans"
+HOMEPAGE = "https://github.com/dbader/schedule"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=6400f153491d45ea3459761627ca24b2"
+
+SRC_URI[sha256sum] = "843bc0538b99c93f02b8b50e3e39886c06f2d003b24f48e1aa4cadfa3f341279"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-datetime python3-logging python3-math"
diff --git a/meta-python/recipes-devtools/python/python3-schedutils_0.6.bb b/meta-python/recipes-devtools/python/python3-schedutils_0.6.bb
new file mode 100644
index 0000000000..50868b9c40
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-schedutils_0.6.bb
@@ -0,0 +1,12 @@
+DESCRIPTION = "Python interface for the Linux scheduler functions etc."
+HOMEPAGE = "https://git.kernel.org/pub/scm/libs/python/python-schedutils/python-schedutils.git/"
+SECTION = "devel/python"
+LICENSE = "GPL-2.0-only"
+LIC_FILES_CHKSUM = "file://COPYING;md5=8ca43cbc842c2336e835926c2166c28b"
+
+SRC_URI = "git://git.kernel.org/pub/scm/libs/python/python-schedutils/python-schedutils.git;branch=main"
+SRCREV = "46469f425f9844f355f6496785ee1ce993b58747"
+
+S = "${WORKDIR}/git"
+
+inherit setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-scikit-build_0.17.6.bb b/meta-python/recipes-devtools/python/python3-scikit-build_0.17.6.bb
new file mode 100644
index 0000000000..dde0941ef1
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-scikit-build_0.17.6.bb
@@ -0,0 +1,22 @@
+SUMMARY = "Improved build system generator for Python C/C++/Fortran/Cython extensions"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=7c96d2b08b3cec6d3c67fb864d1fd8cc"
+
+DEPENDS = "python3-hatch-vcs-native python3-hatch-fancy-pypi-readme-native"
+
+PYPI_PACKAGE = "scikit_build"
+
+inherit pypi python_hatchling
+
+SRC_URI[sha256sum] = "b51a51a36b37c42650994b5047912f59b22e3210b23e321f287611f9ef6e5c9d"
+
+RDEPENDS:${PN} = " \
+ python3-distro \
+ python3-packaging \
+ python3-setuptools \
+ python3-typing-extensions \
+ python3-wheel \
+ cmake \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-screeninfo_0.8.1.bb b/meta-python/recipes-devtools/python/python3-screeninfo_0.8.1.bb
new file mode 100644
index 0000000000..19ac3f67f0
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-screeninfo_0.8.1.bb
@@ -0,0 +1,16 @@
+DESCRIPTION = "Fetch location and size of physical screens."
+HOMEPAGE = "https://github.com/rr-/screeninfo"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.md;md5=a23813181e06852d377bc25ae5563a97"
+
+PYPI_PACKAGE = "screeninfo"
+
+SRC_URI[sha256sum] = "9983076bcc7e34402a1a9e4d7dabf3729411fd2abb3f3b4be7eba73519cd2ed1"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "\
+ python3-core \
+ python3-profile \
+"
diff --git a/meta-python/recipes-devtools/python/python-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/python-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
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-scrypt/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-scrypt_0.8.24.bb b/meta-python/recipes-devtools/python/python3-scrypt_0.8.24.bb
new file mode 100644
index 0000000000..94c83e4952
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-scrypt_0.8.24.bb
@@ -0,0 +1,28 @@
+DESCRIPTION = "Bindings for the scrypt key derivation function library"
+LICENSE = "BSD-2-Clause"
+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] = "98ffde45e4a95461d73ded54ba7a26857679920d4f8ff320f6f7ade6e29531bd"
+
+inherit pypi ptest setuptools3 dos2unix
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+RDEPENDS:${PN} += " \
+ python3-ctypes \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/scrypt/tests/* ${D}${PTEST_PATH}/tests/
+}
diff --git a/meta-python/recipes-devtools/python/python3-scrypt_0.8.6.bb b/meta-python/recipes-devtools/python/python3-scrypt_0.8.6.bb
deleted file mode 100644
index f49665322e..0000000000
--- a/meta-python/recipes-devtools/python/python3-scrypt_0.8.6.bb
+++ /dev/null
@@ -1,3 +0,0 @@
-inherit setuptools3 python3-dir
-require python-scrypt.inc
-
diff --git a/meta-python/recipes-devtools/python/python3-sdbus_0.11.1.bb b/meta-python/recipes-devtools/python/python3-sdbus_0.11.1.bb
new file mode 100644
index 0000000000..26bc71762e
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-sdbus_0.11.1.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Modern Python library for the systemd D-Bus"
+HOMEPAGE = "https://python-sdbus.readthedocs.io/en/latest/"
+LICENSE = "LGPL-2.1-or-later"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e77986dc8e2ee22d44a7c863e96852ae"
+
+SRC_URI[sha256sum] = "adb97718ce996bb308520682c50b1a13e606d65a6edb1c1967a15d2e570cb3b7"
+
+REQUIRED_DISTRO_FEATURES = "systemd"
+DEPENDS += "systemd"
+
+RDEPENDS:${PN} += " \
+ python3-asyncio \
+ python3-numbers \
+ python3-core \
+"
+
+inherit pypi setuptools3 features_check pkgconfig
diff --git a/meta-python/recipes-devtools/python/python3-sdnotify/0001-setup.py-switch-to-setuptools.patch b/meta-python/recipes-devtools/python/python3-sdnotify/0001-setup.py-switch-to-setuptools.patch
new file mode 100644
index 0000000000..cf7696aa63
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-sdnotify/0001-setup.py-switch-to-setuptools.patch
@@ -0,0 +1,31 @@
+From f662280b26eb1549890e88e8e9085f1937d7962d Mon Sep 17 00:00:00 2001
+From: Tim Orling <tim.orling@konsulko.com>
+Date: Mon, 28 Feb 2022 07:54:03 -0800
+Subject: [PATCH] setup.py: switch to setuptools
+
+In Python 3.10, 'distutils' is deprecated and is slated for removal in
+Python 3.12.
+
+Switch from distutils.core to setuptools. This also allows the 'wheel'
+binary archive format to be built with 'setup.py bdist_wheel'.
+
+Upstream-Status: Submitted [https://github.com/bb4242/sdnotify/pull/7]
+
+Signed-off-by: Tim Orling <tim.orling@konsulko.com>
+---
+ setup.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/setup.py b/setup.py
+index 433222c..32b5bd6 100644
+--- a/setup.py
++++ b/setup.py
+@@ -1,4 +1,4 @@
+-from distutils.core import setup
++from setuptools import setup
+
+ VERSION='0.3.2'
+
+--
+2.30.2
+
diff --git a/meta-python/recipes-devtools/python/python3-sdnotify_0.3.2.bb b/meta-python/recipes-devtools/python/python3-sdnotify_0.3.2.bb
index 377af12e16..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
@@ -1,2 +1,21 @@
+HOMEPAGE = "https://github.com/bb4242/sdnotify"
+SUMMARY = "A pure Python implementation of systemd's service notification protocol (sd_notify)"
+
+DESCRIPTION = "\
+ sdnotify is a pure Python implementation of the systemd sd_notify protocol. \
+ This protocol can be used to inform systemd about service start-up completion, \
+ watchdog events, and other service status changes. \
+ Thus, this package can be used to write system services in Python that play nicely with systemd. \
+ "
+
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=cc572ccc4b18a4b7d13be5d01bc8213e"
+
+SRC_URI[sha256sum] = "73977fc746b36cc41184dd43c3fe81323e7b8b06c2bb0826c4f59a20c56bb9f1"
+
+SRC_URI += "file://0001-setup.py-switch-to-setuptools.patch"
+
inherit setuptools3 pypi
-require python-sdnotify.inc
+
+RDEPENDS:${PN} += "python3-io"
diff --git a/meta-python/recipes-devtools/python/python3-semver/run-ptest b/meta-python/recipes-devtools/python/python3-semver/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-semver/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-semver_2.8.1.bb b/meta-python/recipes-devtools/python/python3-semver_2.8.1.bb
deleted file mode 100644
index 77925ae2b1..0000000000
--- a/meta-python/recipes-devtools/python/python3-semver_2.8.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-semver.inc
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_0.7.14.bb b/meta-python/recipes-devtools/python/python3-sentry-sdk_0.7.14.bb
deleted file mode 100644
index 840df93404..0000000000
--- a/meta-python/recipes-devtools/python/python3-sentry-sdk_0.7.14.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-sentry-sdk.inc
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
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-serpent/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-serpent_1.25.bb b/meta-python/recipes-devtools/python/python3-serpent_1.25.bb
deleted file mode 100644
index 1e04def7b7..0000000000
--- a/meta-python/recipes-devtools/python/python3-serpent_1.25.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-serpent.inc
diff --git a/meta-python/recipes-devtools/python/python3-serpent_1.41.bb b/meta-python/recipes-devtools/python/python3-serpent_1.41.bb
new file mode 100644
index 0000000000..941b5ee0f3
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-serpent_1.41.bb
@@ -0,0 +1,27 @@
+SUMMARY = "Serialization based on ast.literal_eval"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d7c28f460fafe7be454fcdcac0b60263"
+
+SRC_URI[sha256sum] = "0407035fe3c6644387d48cff1467d5aa9feff814d07372b78677ed0ee3ed7095"
+
+inherit pypi ptest setuptools3
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-pytz \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+RDEPENDS:${PN} += "\
+ python3-netclient \
+ python3-numbers \
+"
diff --git a/meta-python/recipes-devtools/python/python3-service-identity/run-ptest b/meta-python/recipes-devtools/python/python3-service-identity/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-service-identity/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-service-identity_21.1.0.bb b/meta-python/recipes-devtools/python/python3-service-identity_21.1.0.bb
new file mode 100644
index 0000000000..006fae290d
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-service-identity_21.1.0.bb
@@ -0,0 +1,32 @@
+DESCRIPTION = "The tools for verifying whether a certificate is valid for the intended purposes."
+HOMEPAGE = "https://pypi.org/project/service-identity"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=8a0f079f4e6a215d6bd6f9d97cab4d5f"
+
+SRC_URI[md5sum] = "5e5c195d8fcedc72f9068be2ad9b5a13"
+SRC_URI[sha256sum] = "6e6c6086ca271dc11b033d17c3a8bea9f24ebff920c587da090afc9519419d34"
+
+inherit pypi setuptools3 ptest
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN} += " \
+ python3-attr \
+ python3-cryptography \
+ python3-pyasn1-modules \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+ python3-pyopenssl \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+ cp -rf ${S}/setup.py ${D}${PTEST_PATH}
+}
diff --git a/meta-python/recipes-devtools/python/python3-setuptools-declarative-requirements_1.3.0.bb b/meta-python/recipes-devtools/python/python3-setuptools-declarative-requirements_1.3.0.bb
new file mode 100644
index 0000000000..82bb3415be
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-setuptools-declarative-requirements_1.3.0.bb
@@ -0,0 +1,12 @@
+SUMMARY = "File support for setuptools declarative setup.cfg"
+HOMEPAGE = "https://pypi.org/project/setuptools-declarative-requirements/"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327"
+
+SRC_URI[sha256sum] = "57a5b9bb9ad350c278e8aa6be4cdebbcd925b9ba71d6a712a178a618cfb898f7"
+
+inherit pypi python_setuptools_build_meta
+
+DEPENDS += "python3-setuptools-scm-native"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-setuptools-scm_2.1.0.bb b/meta-python/recipes-devtools/python/python3-setuptools-scm_2.1.0.bb
deleted file mode 100644
index 5bf5983874..0000000000
--- a/meta-python/recipes-devtools/python/python3-setuptools-scm_2.1.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-setuptools-scm.inc
diff --git a/meta-python/recipes-devtools/python/python3-sh_1.12.14.bb b/meta-python/recipes-devtools/python/python3-sh_1.12.14.bb
deleted file mode 100644
index 812bd4b1ac..0000000000
--- a/meta-python/recipes-devtools/python/python3-sh_1.12.14.bb
+++ /dev/null
@@ -1,5 +0,0 @@
-require python-sh.inc
-inherit setuptools3
-
-RDEPENDS_${PN} += " \
-"
diff --git a/meta-python/recipes-devtools/python/python3-sh_2.0.6.bb b/meta-python/recipes-devtools/python/python3-sh_2.0.6.bb
new file mode 100644
index 0000000000..cbe000e31c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-sh_2.0.6.bb
@@ -0,0 +1,25 @@
+SUMMARY = "Python subprocess replacement"
+HOMEPAGE = "https://github.com/amoffat/sh"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=5317094292296f03405f59ae5f6544b6"
+
+SRC_URI[sha256sum] = "9b2998f313f201c777e2c0061f0b1367497097ef13388595be147e2a00bf7ba1"
+
+PYPI_PACKAGE = "sh"
+
+inherit pypi python_poetry_core
+
+RDEPENDS:${PN} += " \
+ python3-asyncio \
+ python3-codecs \
+ python3-compression \
+ python3-core \
+ python3-io \
+ python3-logging \
+ python3-resource \
+ python3-shell \
+ python3-terminal \
+ python3-threading \
+ python3-unixadmin \
+ python3-fcntl \
+"
diff --git a/meta-python/recipes-devtools/python/python3-shellingham_1.5.4.bb b/meta-python/recipes-devtools/python/python3-shellingham_1.5.4.bb
new file mode 100644
index 0000000000..e519e8e229
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-shellingham_1.5.4.bb
@@ -0,0 +1,10 @@
+SUMMARY = "Tool to Detect Surrounding Shell"
+SECTION = "devel/python"
+LICENSE = "ISC"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=78e1c0248051c32a38a7f820c30bd7a5"
+
+SRC_URI[sha256sum] = "8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"
+
+inherit pypi setuptools3
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-sijax_0.3.2.bb b/meta-python/recipes-devtools/python/python3-sijax_0.3.2.bb
index 24e683372e..9a28fc5586 100644
--- a/meta-python/recipes-devtools/python/python3-sijax_0.3.2.bb
+++ b/meta-python/recipes-devtools/python/python3-sijax_0.3.2.bb
@@ -1,4 +1,10 @@
-inherit setuptools3
-require python-sijax.inc
+DESCRIPTION = "An easy to use AJAX library for Python based on jQuery.ajax"
+HOMEPAGE = "https://github.com/spantaleev/sijax-python"
+LICENSE = "BSD-3-Clause"
-SRC_URI[sha256sum] = "11b062f4a8b2aad95c87e7c09e5daf5a6b0d0f08abf9efe5f91a0075c6be7c0d" \ No newline at end of file
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=16e213d75641a392478df50cf0841903"
+
+SRC_URI[sha256sum] = "11b062f4a8b2aad95c87e7c09e5daf5a6b0d0f08abf9efe5f91a0075c6be7c0d"
+
+PYPI_PACKAGE = "Sijax"
+inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-simpleeval/run-ptest b/meta-python/recipes-devtools/python/python3-simpleeval/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-simpleeval/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-simpleeval_0.9.13.bb b/meta-python/recipes-devtools/python/python3-simpleeval_0.9.13.bb
new file mode 100644
index 0000000000..af2c4a1e2e
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-simpleeval_0.9.13.bb
@@ -0,0 +1,25 @@
+SUMMARY = "A simple, safe single expression evaluator library"
+HOMEPAGE = "https://pypi.org/project/simpleeval/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENCE;md5=dc9277482effe59b734b004cbcc1fee7"
+
+SRC_URI[sha256sum] = "4a30f9cc01825fe4c719c785e3762623e350c4840d5e6855c2a8496baaa65fac"
+
+inherit pypi python_setuptools_build_meta ptest
+
+BBCLASSEXTEND = "native nativesdk"
+
+SRC_URI += "file://run-ptest"
+
+RDEPENDS:${PN} += " \
+ python3-math \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ cp -f ${S}/test_simpleeval.py ${D}${PTEST_PATH}/
+}
diff --git a/meta-python/recipes-devtools/python/python3-simplejson_3.16.0.bb b/meta-python/recipes-devtools/python/python3-simplejson_3.16.0.bb
deleted file mode 100644
index 38f406c5de..0000000000
--- a/meta-python/recipes-devtools/python/python3-simplejson_3.16.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-simplejson.inc
diff --git a/meta-python/recipes-devtools/python/python-simplejson.inc b/meta-python/recipes-devtools/python/python3-simplejson_3.19.2.bb
index 3d36f96089..cc5b1bc90a 100644
--- a/meta-python/recipes-devtools/python/python-simplejson.inc
+++ b/meta-python/recipes-devtools/python/python3-simplejson_3.19.2.bb
@@ -4,20 +4,21 @@ HOMEPAGE = "http://cheeseshop.python.org/pypi/simplejson"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=c6338d7abd321c0b50a2a547e441c52e"
-SRC_URI[md5sum] = "744fa99aed207478f8fbf9dd9f04fad3"
-SRC_URI[sha256sum] = "b1f329139ba647a9548aa05fb95d046b4a677643070dc2afc05fa2e975d09ca5"
+SRC_URI[sha256sum] = "9eb442a2442ce417801c912df68e1f6ccfcd41577ae7274953ab3ad24ef7d82c"
-inherit pypi
+inherit pypi setuptools3
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-io \
- ${PYTHON_PN}-netserver \
- ${PYTHON_PN}-numbers \
+RDEPENDS:${PN} += "\
+ python3-io \
+ python3-netserver \
+ python3-numbers \
"
PACKAGES =+ "${PN}-tests"
-RDEPENDS_${PN}-tests = "${PN} ${PYTHON_PN}-unittest"
-FILES_${PN}-tests+= " \
+RDEPENDS:${PN}-tests = "${PN} python3-unittest"
+FILES:${PN}-tests+= " \
${PYTHON_SITEPACKAGES_DIR}/simplejson/tests \
${PYTHON_SITEPACKAGES_DIR}/simplejson/tool.py* \
"
+
+BBCLASSEXTEND = "native nativesdk"
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 2402a7a74d..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
@@ -1,2 +1,36 @@
+SUMMARY = "Convenience functions for dbus services in Python 2.x"
+HOMEPAGE = "https://github.com/nphilipp/python-slip"
+DESCRIPTION = "\
+The Simple Library for Python 2.x packages contain miscellaneous code for \
+convenience, extension and workaround purposes. \
+\
+This package provides slip.dbus.service.Object, which is a dbus.service.Object \
+derivative that ends itself after a certain time without being used and/or if \
+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 = "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 \
+ 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} += "\
+ python3-six \
+"
+# http://errors.yoctoproject.org/Errors/Details/184713/
+# python-native/python: can't open file 'setup.py': [Errno 2] No such file or directory
+CLEANBROKEN = "1"
+
inherit setuptools3
-require python-slip-dbus.inc
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.3.bb b/meta-python/recipes-devtools/python/python3-smbus2_0.4.3.bb
new file mode 100644
index 0000000000..b54cdb005f
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-smbus2_0.4.3.bb
@@ -0,0 +1,18 @@
+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"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "36f2288a8e1a363cb7a7b2244ec98d880eb5a728a2494ac9c71e9de7bf6a803a"
+
+CLEANBROKEN = "1"
+
+PYPI_PACKAGE = "smbus2"
+
+RDEPENDS:${PN} += "\
+ python3-ctypes \
+ python3-fcntl \
+"
diff --git a/meta-python/recipes-devtools/python/python3-smbus_4.0.bb b/meta-python/recipes-devtools/python/python3-smbus_4.0.bb
deleted file mode 100644
index b357bcd822..0000000000
--- a/meta-python/recipes-devtools/python/python3-smbus_4.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit distutils3
-require python-smbus.inc
diff --git a/meta-python/recipes-devtools/python/python3-smbus_4.3.bb b/meta-python/recipes-devtools/python/python3-smbus_4.3.bb
new file mode 100644
index 0000000000..b305a128a2
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-smbus_4.3.bb
@@ -0,0 +1,16 @@
+SUMMARY = "Set of i2c tools for linux - Python module"
+LICENSE = "GPL-2.0-only"
+LIC_FILES_CHKSUM = "file://py-smbus/smbusmodule.c;beginline=1;endline=18;md5=46e424fb045901ab25e0f92c28c80055"
+
+SRC_URI = "${KERNELORG_MIRROR}/software/utils/i2c-tools/i2c-tools-${PV}.tar.gz \
+ file://0001-Use-setuptools-as-distutils-is-deprecated.patch \
+ "
+SRC_URI[sha256sum] = "eec464e42301d93586cbeca3845ed61bff40f560670e5b35baec57301d438148"
+
+DEPENDS += "i2c-tools"
+
+S = "${WORKDIR}/i2c-tools-${PV}"
+
+inherit setuptools3
+
+SETUPTOOLS_SETUP_PATH = "${S}/py-smbus"
diff --git a/meta-python/recipes-devtools/python/python3-smpplib/run-ptest b/meta-python/recipes-devtools/python/python3-smpplib/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-smpplib/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-smpplib_2.2.3.bb b/meta-python/recipes-devtools/python/python3-smpplib_2.2.3.bb
new file mode 100644
index 0000000000..7979f04c5b
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-smpplib_2.2.3.bb
@@ -0,0 +1,31 @@
+SUMMARY = "SMPP library for python"
+SECTION = "devel/python"
+LICENSE = "GPL-3.0-only"
+LIC_FILES_CHKSUM = "file://README.md;md5=8b4e2ac8cf248f7b991784f88b630852"
+
+PYPI_PACKAGE = "smpplib"
+SRC_URI[sha256sum] = "5215a95b0538d26f189600e0982b31da8281f7453cd6e2862c5b21e3e1002331"
+
+inherit pypi setuptools3 ptest
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN} += " \
+ python3-logging \
+ python3-six \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-mock \
+ python3-profile \
+ python3-pytest \
+ python3-unittest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/smpplib/tests/* ${D}${PTEST_PATH}/tests/
+}
diff --git a/meta-python/recipes-devtools/python/python3-snagboot_1.2.bb b/meta-python/recipes-devtools/python/python3-snagboot_1.2.bb
new file mode 100644
index 0000000000..57a3280de4
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-snagboot_1.2.bb
@@ -0,0 +1,21 @@
+SUMMARY = "Snagboot intends to be an open-source replacement vendor-specific tools used to recover and/or reflash embedded platforms."
+
+LICENSE = "GPL-2.0-only"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=b234ee4d69f5fce4486a80fdaf4a4263"
+
+SRC_URI[sha256sum] = "3d5cdd5ffe7355deba27657e6f45d45538a398f92215d219a8cfd6e716f67c34"
+
+inherit pypi python_setuptools_build_meta
+
+RDEPENDS:${PN} += " \
+ bash \
+ python3-fcntl \
+ python3-pyusb \
+ python3-pyyaml \
+ python3-setuptools \
+ python3-six \
+"
+
+do_install:append() {
+ install -D -m 0644 ${S}/src/snagrecover/50-snagboot.rules ${D}${sysconfdir}/udev/rules.d/50-snagboot.rules
+}
diff --git a/meta-python/recipes-devtools/python/python3-snappy_0.6.1.bb b/meta-python/recipes-devtools/python/python3-snappy_0.6.1.bb
new file mode 100644
index 0000000000..bd0979d0b4
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-snappy_0.6.1.bb
@@ -0,0 +1,13 @@
+DESCRIPTION = "Python library for the snappy compression library from Google"
+DEPENDS += "snappy"
+
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=b3090152f53ee19f6a7b64b1a36384fb"
+
+SRC_URI[sha256sum] = "b6a107ab06206acc5359d4c5632bd9b22d448702a79b3169b0c62e0fb808bb2a"
+
+inherit pypi setuptools3
+
+PYPI_PACKAGE = "python-snappy"
+
+RDEPENDS:${PN} += "snappy"
diff --git a/meta-python/recipes-devtools/python/python3-sniffio_1.3.0.bb b/meta-python/recipes-devtools/python/python3-sniffio_1.3.0.bb
new file mode 100644
index 0000000000..448ac34f54
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-sniffio_1.3.0.bb
@@ -0,0 +1,12 @@
+SUMMARY = "Sniff out which async library your code is running under"
+SECTION = "devel/python"
+LICENSE = "MIT | Apache-2.0"
+LIC_FILES_CHKSUM = "\
+ file://LICENSE;md5=fa7b86389e58dd4087a8d2b833e5fe96 \
+ file://LICENSE.MIT;md5=e62ba5042d5983462ad229f5aec1576c \
+ file://LICENSE.APACHE2;md5=3b83ef96387f14655fc854ddc3c6bd57 \
+"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"
diff --git a/meta-python/recipes-devtools/python/python3-socketio_4.3.1.bb b/meta-python/recipes-devtools/python/python3-socketio_4.3.1.bb
deleted file mode 100644
index 8ff590bd75..0000000000
--- a/meta-python/recipes-devtools/python/python3-socketio_4.3.1.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-inherit setuptools3
-
-PACKAGECONFIG ?= "asyncio_client client"
-require python-socketio.inc
diff --git a/meta-python/recipes-devtools/python/python3-socketio_5.11.2.bb b/meta-python/recipes-devtools/python/python3-socketio_5.11.2.bb
new file mode 100644
index 0000000000..4251a81d6c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-socketio_5.11.2.bb
@@ -0,0 +1,28 @@
+SUMMARY = "Socket.IO server"
+HOMEPAGE = "https://github.com/miguelgrinberg/python-socketio/"
+SECTION = "devel/python"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=42d0a9e728978f0eeb759c3be91536b8"
+
+inherit pypi python_setuptools_build_meta
+
+PYPI_PACKAGE = "python-socketio"
+
+SRC_URI[sha256sum] = "ae6a1de5c5209ca859dc574dccc8931c4be17ee003e74ce3b8d1306162bb4a37"
+
+PACKAGECONFIG ?= "asyncio_client client"
+PACKAGECONFIG[asyncio_client] = ",,,python3-aiohttp python3-websockets"
+PACKAGECONFIG[client] = ",,,python3-requests python3-websocket-client"
+
+RDEPENDS:${PN} += "\
+ python3-engineio \
+ python3-logging \
+ python3-math \
+ python3-pickle \
+ python3-json \
+ python3-threading \
+ python3-six \
+ python3-attrs \
+ python3-bidict \
+ "
diff --git a/meta-python/recipes-devtools/python/python3-socksio/0001-Unpin-flit-core-dependency.patch b/meta-python/recipes-devtools/python/python3-socksio/0001-Unpin-flit-core-dependency.patch
new file mode 100644
index 0000000000..75be61fc4f
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-socksio/0001-Unpin-flit-core-dependency.patch
@@ -0,0 +1,21 @@
+From 5c50fd76e7459bb822ff8f712172a78e21b8dd04 Mon Sep 17 00:00:00 2001
+From: Theodore Ni <3806110+tjni@users.noreply.github.com>
+Date: Sun, 13 Aug 2023 09:21:49 -0700
+Subject: [PATCH] Unpin flit-core dependency
+
+Upstream-Status: Submitted [https://github.com/sethmlarson/socksio/pull/61]
+---
+ pyproject.toml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/pyproject.toml b/pyproject.toml
+index 2d6c5a3..60c63ea 100644
+--- a/pyproject.toml
++++ b/pyproject.toml
+@@ -1,5 +1,5 @@
+ [build-system]
+-requires = ["flit_core >=2,<3"]
++requires = ["flit_core >=2"]
+ build-backend = "flit_core.buildapi"
+
+ [tool.flit.metadata]
diff --git a/meta-python/recipes-devtools/python/python3-socksio_1.0.0.bb b/meta-python/recipes-devtools/python/python3-socksio_1.0.0.bb
new file mode 100644
index 0000000000..4353a52ee1
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-socksio_1.0.0.bb
@@ -0,0 +1,10 @@
+SUMMARY = "Sans-I/O implementation of SOCKS4, SOCKS4A, and SOCKS5."
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=0b4dda8edb09eec767aaded3cbf8f6b1"
+
+inherit pypi python_flit_core
+
+SRC_URI += "file://0001-Unpin-flit-core-dependency.patch"
+
+SRC_URI[sha256sum] = "f88beb3da5b5c38b9890469de67d0cb0f9d494b78b106ca1845f96c10b91c4ac"
diff --git a/meta-python/recipes-devtools/python/python3-soupsieve/run-ptest b/meta-python/recipes-devtools/python/python3-soupsieve/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-soupsieve/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-soupsieve_2.5.bb b/meta-python/recipes-devtools/python/python3-soupsieve_2.5.bb
new file mode 100644
index 0000000000..d26a13dfbd
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-soupsieve_2.5.bb
@@ -0,0 +1,26 @@
+SUMMARY = "CSS selector library for python-beautifulsoup4"
+HOMEPAGE = "https://github.com/facelessuser/soupsieve"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.md;md5=520586fa71ed2cbda50b4a8c89621e09"
+
+SRC_URI[sha256sum] = "5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"
+
+inherit pypi python_hatchling python_setuptools_build_meta ptest
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-beautifulsoup4 \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-speaklater_1.3.bb b/meta-python/recipes-devtools/python/python3-speaklater_1.3.bb
index aa4f699be0..5948dc8596 100644
--- a/meta-python/recipes-devtools/python/python3-speaklater_1.3.bb
+++ b/meta-python/recipes-devtools/python/python3-speaklater_1.3.bb
@@ -1,2 +1,9 @@
+DESCRIPTION = "Media asset management for Python, with glue code for various frameworks"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=b810770075a29bf44b96607440e7c801"
+
+SRC_URI[md5sum] = "e8d5dbe36e53d5a35cff227e795e8bbf"
+SRC_URI[sha256sum] = "59fea336d0eed38c1f0bf3181ee1222d0ef45f3a9dd34ebe65e6bfffdd6a65a9"
+
+PYPI_PACKAGE = "speaklater"
inherit pypi setuptools3
-require python-speaklater.inc
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
new file mode 100644
index 0000000000..472113b059
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-speedtest-cli_2.1.3.bb
@@ -0,0 +1,14 @@
+SUMMARY = "Command line interface for testing internet bandwidth using speedtest.net"
+HOMEPAGE = "https://github.com/sivel/speedtest-cli"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
+
+SRC_URI[sha256sum] = "5e2773233cedb5fa3d8120eb7f97bcc4974b5221b254d33ff16e2f1d413d90f0"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-misc \
+ python3-threading \
+ python3-xml \
+"
diff --git a/meta-python/recipes-devtools/python/python3-spidev_3.2.bb b/meta-python/recipes-devtools/python/python3-spidev_3.2.bb
deleted file mode 100644
index 610611e438..0000000000
--- a/meta-python/recipes-devtools/python/python3-spidev_3.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-spidev.inc
diff --git a/meta-python/recipes-devtools/python/python-spidev.inc b/meta-python/recipes-devtools/python/python3-spidev_3.6.bb
index 1b93763d57..e3fdc435ac 100644
--- a/meta-python/recipes-devtools/python/python-spidev.inc
+++ b/meta-python/recipes-devtools/python/python3-spidev_3.6.bb
@@ -6,12 +6,10 @@ This is a modified version of the code originally found\
All code is GPLv2 licensed unless explicitly stated otherwise."
HOMEPAGE = "http://github.com/doceme/py-spidev"
SECTION = "devel/python"
-LICENSE = "GPLv2"
-LIC_FILES_CHKSUM = "file://LICENSE.md;md5=54bdb9022ebb75ab68399cdaab97da60"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRCNAME = "spidev"
-SRC_URI[md5sum] = "f601676f1bb48b9aa3b3897f95216365"
-SRC_URI[sha256sum] = "09d2b5122f0dd79910713a11f9a0020f71537224bf829916def4fffc0ea59456"
+SRC_URI[sha256sum] = "14dbc37594a4aaef85403ab617985d3c3ef464d62bc9b769ef552db53701115b"
-
-inherit pypi
+inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-sqlalchemy_1.1.17.bb b/meta-python/recipes-devtools/python/python3-sqlalchemy_1.1.17.bb
deleted file mode 100644
index 86cf9eddeb..0000000000
--- a/meta-python/recipes-devtools/python/python3-sqlalchemy_1.1.17.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-sqlalchemy.inc
diff --git a/meta-python/recipes-devtools/python/python3-sqlalchemy_2.0.29.bb b/meta-python/recipes-devtools/python/python3-sqlalchemy_2.0.29.bb
new file mode 100644
index 0000000000..e646bd0d9c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-sqlalchemy_2.0.29.bb
@@ -0,0 +1,25 @@
+DESCRIPTION = "Python SQL toolkit and Object Relational Mapper that gives \
+application developers the full power and flexibility of SQL"
+HOMEPAGE = "http://www.sqlalchemy.org/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=c78b979ae6c20775a28a287d32092cbb"
+
+SRC_URI[sha256sum] = "bd9566b8e58cabd700bc367b60e90d9349cd16f0984973f98a9a09f9c64e86f0"
+
+PYPI_PACKAGE = "SQLAlchemy"
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-asyncio \
+ python3-compression \
+ python3-json \
+ python3-logging \
+ python3-netclient \
+ python3-numbers \
+ python3-pickle \
+ python3-profile \
+ python3-threading \
+ python3-typing-extensions \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-sqlparse/0001-sqlparse-change-shebang-to-python3.patch b/meta-python/recipes-devtools/python/python3-sqlparse/0001-sqlparse-change-shebang-to-python3.patch
new file mode 100644
index 0000000000..0c9f29a6b8
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-sqlparse/0001-sqlparse-change-shebang-to-python3.patch
@@ -0,0 +1,41 @@
+From f236a30dc8528b6f114201580f1efdcc1c447d43 Mon Sep 17 00:00:00 2001
+From: Changqing Li <changqing.li@windriver.com>
+Date: Mon, 9 Mar 2020 13:10:37 +0800
+Subject: [PATCH] sqlparse: change shebang to python3
+
+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>
+---
+ sqlparse/__main__.py | 2 +-
+ sqlparse/cli.py | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+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.41.0
+
diff --git a/meta-python/recipes-devtools/python/python3-sqlparse/run-ptest b/meta-python/recipes-devtools/python/python3-sqlparse/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-sqlparse/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-sqlparse_0.4.4.bb b/meta-python/recipes-devtools/python/python3-sqlparse_0.4.4.bb
new file mode 100644
index 0000000000..c04971ee8f
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-sqlparse_0.4.4.bb
@@ -0,0 +1,29 @@
+DESCRIPTION = "Non-validating SQL parser module"
+HOMEPAGE = "http://pypi.python.org/pypi/sqlparse"
+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[sha256sum] = "d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c"
+
+export BUILD_SYS
+export HOST_SYS
+
+inherit pypi ptest python_flit_core
+
+RDEPENDS:${PN}-ptest += " \
+ 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/
+}
+
+BBCLASSEXTEND = "native nativesdk"
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
new file mode 100644
index 0000000000..e7f329e9bb
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-sqlsoup_0.9.1.bb
@@ -0,0 +1,11 @@
+SUMMARY = "A one step database access tool, built on the SQLAlchemy ORM."
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=4382f3a1adb96f258dbd80f5b400f0d5"
+
+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_1.31.0.bb b/meta-python/recipes-devtools/python/python3-stevedore_1.31.0.bb
deleted file mode 100644
index 3f557f2cbf..0000000000
--- a/meta-python/recipes-devtools/python/python3-stevedore_1.31.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-stevedore.inc
diff --git a/meta-python/recipes-devtools/python/python3-stevedore_5.1.0.bb b/meta-python/recipes-devtools/python/python3-stevedore_5.1.0.bb
new file mode 100644
index 0000000000..ce71796339
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-stevedore_5.1.0.bb
@@ -0,0 +1,14 @@
+DESCRIPTION = "Manage dynamic plugins for Python applications"
+HOMEPAGE = "https://docs.openstack.org/stevedore/latest/"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
+
+SRC_URI[sha256sum] = "a54534acf9b89bc7ed264807013b505bf07f74dbe4bcfa37d32bd063870b087c"
+
+DEPENDS += "python3-pbr-native"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-pbr python3-six"
+
+BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python3-stopit/LICENSE b/meta-python/recipes-devtools/python/python3-stopit/LICENSE
new file mode 100644
index 0000000000..0b9a5bec37
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-stopit/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 Gilles Lenfant
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE. \ No newline at end of file
diff --git a/meta-python/recipes-devtools/python/python3-stopit_1.1.2.bb b/meta-python/recipes-devtools/python/python3-stopit_1.1.2.bb
new file mode 100644
index 0000000000..e119a0f11a
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-stopit_1.1.2.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Raise asynchronous exceptions in other threads, control the timeout of blocks or callables with two context managers and two decorators."
+HOMEPAGE = "https://pypi.org/project/stopit/"
+SECTION = "devel/python"
+
+SRC_URI += " file://LICENSE "
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${WORKDIR}/LICENSE;md5=497c556f42b1355b64190da2f3d88f93"
+
+SRC_URI[sha256sum] = "f7f39c583fd92027bd9d06127b259aee7a5b7945c1f1fa56263811e1e766996d"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "\
+ python3-setuptools \
+ "
+
+BBCLASSEXTEND = "native nativesdk" \ No newline at end of file
diff --git a/meta-python/recipes-devtools/python/python3-strenum/0001-patch-versioneer-for-python-3.12-compatibility.patch b/meta-python/recipes-devtools/python/python3-strenum/0001-patch-versioneer-for-python-3.12-compatibility.patch
new file mode 100644
index 0000000000..cdf3f1acb7
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-strenum/0001-patch-versioneer-for-python-3.12-compatibility.patch
@@ -0,0 +1,37 @@
+From 3a71c9bc3747201e5bebe0e80b98ac6219209875 Mon Sep 17 00:00:00 2001
+From: alperak <alperyasinak1@gmail.com>
+Date: Thu, 8 Feb 2024 14:09:32 +0300
+Subject: [PATCH] Patch versioneer for Python 3.12 compatibility
+
+AttributeError: 'ConfigParser' object has no attribute 'readfp'. Did you mean: 'read'?
+AttributeError: module 'configparser' has no attribute 'SafeConfigParser'. Did you mean: 'RawConfigParser'?
+
+readfp and SafeConfigParser has been deprecated since Python 3.2 and removed in Python 3.12 (due October 2023). Use read_file and ConfigParser instead.
+
+https://docs.python.org/3/whatsnew/3.12.html#configparser
+
+Upstream-Status: Submitted [https://github.com/irgeek/StrEnum/pull/34]
+Signed-off-by: alperak <alperyasinak1@gmail.com>
+---
+ versioneer.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/versioneer.py b/versioneer.py
+index 64fea1c..3aa5da3 100644
+--- a/versioneer.py
++++ b/versioneer.py
+@@ -339,9 +339,9 @@ def get_config_from_root(root):
+ # configparser.NoOptionError (if it lacks "VCS="). See the docstring at
+ # the top of versioneer.py for instructions on writing your setup.cfg .
+ setup_cfg = os.path.join(root, "setup.cfg")
+- parser = configparser.SafeConfigParser()
++ parser = configparser.ConfigParser()
+ with open(setup_cfg, "r") as f:
+- parser.readfp(f)
++ parser.read_file(f)
+ VCS = parser.get("versioneer", "VCS") # mandatory
+
+ def get(parser, name):
+--
+2.25.1
+
diff --git a/meta-python/recipes-devtools/python/python3-strenum_0.4.15.bb b/meta-python/recipes-devtools/python/python3-strenum_0.4.15.bb
new file mode 100644
index 0000000000..cbe7fcc215
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-strenum_0.4.15.bb
@@ -0,0 +1,14 @@
+SUMMARY = "An Enum that inherits from str"
+HOMEPAGE = "https://github.com/irgeek/StrEnum"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ba0eb3de1df70bde0ed48488cfd81269"
+
+SRC_URI += "file://0001-patch-versioneer-for-python-3.12-compatibility.patch"
+
+DEPENDS = "python3-pytest-runner-native"
+
+SRC_URI[sha256sum] = "878fb5ab705442070e4dd1929bb5e2249511c0bcf2b0eeacf3bcd80875c82eff"
+
+PYPI_PACKAGE = "StrEnum"
+
+inherit pypi python_setuptools_build_meta
diff --git a/meta-python/recipes-devtools/python/python3-strict-rfc3339_0.7.bb b/meta-python/recipes-devtools/python/python3-strict-rfc3339_0.7.bb
deleted file mode 100644
index 9e37052aed..0000000000
--- a/meta-python/recipes-devtools/python/python3-strict-rfc3339_0.7.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-strict-rfc3339.inc
diff --git a/meta-python/recipes-devtools/python/python3-supervisor_4.0.2.bb b/meta-python/recipes-devtools/python/python3-supervisor_4.0.2.bb
deleted file mode 100644
index d29e1d6b66..0000000000
--- a/meta-python/recipes-devtools/python/python3-supervisor_4.0.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-supervisor.inc
diff --git a/meta-python/recipes-devtools/python/python-supervisor.inc b/meta-python/recipes-devtools/python/python3-supervisor_4.2.5.bb
index beab497392..06b08e78a3 100644
--- a/meta-python/recipes-devtools/python/python-supervisor.inc
+++ b/meta-python/recipes-devtools/python/python3-supervisor_4.2.5.bb
@@ -4,24 +4,27 @@ Supervisor is a client/server system that allows its users \
to monitorand control a number of processes on UNIX-like \
operating systems."
HOMEPAGE = "https://github.com/Supervisor/supervisor"
-LICENSE = "BSD"
+LICENSE = "BSD-4-Clause"
LIC_FILES_CHKSUM = "file://LICENSES.txt;md5=5b4e3a2172bba4c47cded5885e7e507e"
-SRC_URI[md5sum] = "ac70dadd051dcaf1d03c467d51a3aac1"
-SRC_URI[sha256sum] = "5604457da4fb89d850e78c128205fe4938c9277f87301885b33c94c60361e575"
+SRC_URI[sha256sum] = "34761bae1a23c58192281a5115fb07fbf22c9b0133c08166beffc70fed3ebc12"
PYPI_PACKAGE = "supervisor"
-inherit pypi systemd
-RDEPENDS_${PN} = "\
- ${PYTHON_PN}-meld3 \
+inherit pypi systemd setuptools3
+RDEPENDS:${PN} = "\
+ python3-meld3 \
+ python3-io \
+ python3-xmlrpc \
+ python3-resource \
+ python3-setuptools \
"
SRC_URI += "file://supervisord.conf \
file://supervisor.service \
"
-SYSTEMD_SERVICE_${PN} = "supervisor.service"
+SYSTEMD_SERVICE:${PN} = "supervisor.service"
-do_install_append() {
+do_install:append() {
install -d ${D}${sysconfdir}/supervisor
install -d ${D}${systemd_system_unitdir}
diff --git a/meta-python/recipes-devtools/python/python3-sympy_1.12.bb b/meta-python/recipes-devtools/python/python3-sympy_1.12.bb
new file mode 100644
index 0000000000..088dda3a2a
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-sympy_1.12.bb
@@ -0,0 +1,15 @@
+SUMMARY = "Computer algebra system (CAS) in Python"
+HOMEPAGE = "https://pypi.org/project/sympy/"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ea48085d7dff75b49271b25447e8cdca"
+
+SRC_URI[sha256sum] = "ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-misc \
+ python3-mpmath \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/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 78ec431560..0000000000
--- a/meta-python/recipes-devtools/python/python3-systemd_234.bb
+++ /dev/null
@@ -1,3 +0,0 @@
-require python-systemd.inc
-RDEPENDS_${PN} += "python3-syslog"
-inherit setuptools3
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.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 372cffe047..0000000000
--- a/meta-python/recipes-devtools/python/python3-term_2.3.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-term.inc
-inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-term_2.5.bb b/meta-python/recipes-devtools/python/python3-term_2.5.bb
new file mode 100644
index 0000000000..7d508ad809
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-term_2.5.bb
@@ -0,0 +1,12 @@
+SUMMARY = "An enhanced version of the tty module"
+SECTION = "devel/python"
+LICENSE = "Python-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d90e2d280a4836c607520383d1639be1"
+
+SRC_URI[sha256sum] = "846fda941dbb8a7c9f246e99bf5ee731910fc4a4cc54b7e36457c133c9f6b78b"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} = "\
+ python3-io \
+"
diff --git a/meta-python/recipes-devtools/python/python3-termcolor_1.1.0.bb b/meta-python/recipes-devtools/python/python3-termcolor_1.1.0.bb
deleted file mode 100644
index 17df7f983d..0000000000
--- a/meta-python/recipes-devtools/python/python3-termcolor_1.1.0.bb
+++ /dev/null
@@ -1,12 +0,0 @@
-SUMMARY = "ANSII Color formatting for output in terminal"
-HOMEPAGE = "https://pypi.python.org/pypi/termcolor"
-SECTION = "devel/python"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://COPYING.txt;md5=809e8749b63567978acfbd81d9f6a27d"
-
-inherit pypi setuptools3
-
-SRC_URI[md5sum] = "043e89644f8909d462fbbfa511c768df"
-SRC_URI[sha256sum] = "1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"
-
-BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python3-termcolor_2.4.0.bb b/meta-python/recipes-devtools/python/python3-termcolor_2.4.0.bb
new file mode 100644
index 0000000000..ea6b683991
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-termcolor_2.4.0.bb
@@ -0,0 +1,16 @@
+SUMMARY = "ANSII Color formatting for output in terminal"
+HOMEPAGE = "https://pypi.python.org/pypi/termcolor"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://COPYING.txt;md5=e5f5f7c9b280511f124dba5dda3d180e"
+
+inherit pypi python_setuptools_build_meta
+
+SRC_URI[sha256sum] = "aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"
+
+DEPENDS += " \
+ python3-toml-native \
+ python3-hatch-vcs-native \
+"
+
+BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python3-test-generator_0.1.2.bb b/meta-python/recipes-devtools/python/python3-test-generator_0.1.2.bb
deleted file mode 100644
index 14943a4bd5..0000000000
--- a/meta-python/recipes-devtools/python/python3-test-generator_0.1.2.bb
+++ /dev/null
@@ -1,15 +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[md5sum] = "6c69e73ba5b4b3ed62f7bcda071c64f1"
-SRC_URI[sha256sum] = "ad5925c814bfe79497b43df096e3bb52c166d1577f7aff160137301676232f4a"
-
-inherit pypi setuptools3
-
-DEPENDS += "python3-nose-native"
-
-RDEPENDS_${PN} += "python3-six"
diff --git a/meta-python/recipes-devtools/python/python3-textparser_0.24.0.bb b/meta-python/recipes-devtools/python/python3-textparser_0.24.0.bb
new file mode 100644
index 0000000000..8db949d0dc
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-textparser_0.24.0.bb
@@ -0,0 +1,13 @@
+DESCRIPTION = "A text parser written in the Python language."
+HOMEPAGE = "https://github.com/eerimoq/textparser"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=fe9942a8bba5458a9dbd11277bc347ad"
+
+SRC_URI[sha256sum] = "56f708e75aa9d002adb76d823ba6ef166d7ecec1e3e4ca4c1ca103f817568335"
+
+PYPI_PACKAGE = "textparser"
+
+inherit pypi setuptools3
+
+CLEANBROKEN = "1"
+
diff --git a/meta-python/recipes-devtools/python/python3-texttable_1.7.0.bb b/meta-python/recipes-devtools/python/python3-texttable_1.7.0.bb
new file mode 100644
index 0000000000..56448f738e
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-texttable_1.7.0.bb
@@ -0,0 +1,10 @@
+SUMMARY = "module for creating simple ASCII tables"
+HOMEPAGE = "https://github.com/foutaise/texttable/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=7a97cdac2d9679ffdcfef3dc036d24f6"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "2d2068fb55115807d3ac77a4ca68fa48803e84ebb0ee2340f858107a36522638"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-tinyrecord_0.1.5.bb b/meta-python/recipes-devtools/python/python3-tinyrecord_0.1.5.bb
deleted file mode 100644
index 3f1b31f48b..0000000000
--- a/meta-python/recipes-devtools/python/python3-tinyrecord_0.1.5.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-tinyrecord.inc
diff --git a/meta-python/recipes-devtools/python/python-tinyrecord.inc b/meta-python/recipes-devtools/python/python3-tinyrecord_0.2.0.bb
index 981dc074fc..1d99ae2f39 100644
--- a/meta-python/recipes-devtools/python/python-tinyrecord.inc
+++ b/meta-python/recipes-devtools/python/python3-tinyrecord_0.2.0.bb
@@ -6,10 +6,10 @@ then execute architecture which allows us to minimize the time \
that we are within a thread lock."
HOMEPAGE = "https://github.com/eugene-eeo/tinyrecord"
LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://README;md5=31c1dc11b4ae83546538de4c16bceabc"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ee157eec4b228c8d5b7a6e0feab2864a"
-SRC_URI[md5sum] = "e47dcfe299686cd3fa7ffaa7cb2ee8b1"
-SRC_URI[sha256sum] = "bc7e6a8e78600df234d7a85c2f5d584130f2c6ffd7cd310f9d3a1d976d3373c8"
+SRC_URI[md5sum] = "cbaae3f4599b12e3bea67ca4a75eca99"
+SRC_URI[sha256sum] = "eb6dc23601be359ee00f5a3d31a46adf3bad0a16f8d60af216cd67982ca75cf4"
PYPI_PACKAGE = "tinyrecord"
-inherit pypi
+inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-toml_0.10.0.bb b/meta-python/recipes-devtools/python/python3-toml_0.10.0.bb
deleted file mode 100644
index cebb41a533..0000000000
--- a/meta-python/recipes-devtools/python/python3-toml_0.10.0.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-inherit setuptools3
-require python-toml.inc
-
-RDEPENDS_${PN} += " \
- ${PYTHON_PN}-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-tomlkit/run-ptest b/meta-python/recipes-devtools/python/python3-tomlkit/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-tomlkit/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-tomlkit_0.12.3.bb b/meta-python/recipes-devtools/python/python3-tomlkit_0.12.3.bb
new file mode 100644
index 0000000000..d4162a110b
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-tomlkit_0.12.3.bb
@@ -0,0 +1,32 @@
+SUMMARY = "Style preserving TOML library"
+HOMEPAGE = "https://pypi.org/project/tomlkit/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=31aac0dbc1babd278d5386dadb7f8e82"
+
+SRC_URI[sha256sum] = "75baf5012d06501f07bee5bf8e801b9f343e7aac5a92581f20f80ce632e6b5a4"
+
+inherit pypi python_poetry_core ptest
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN} += " \
+ python3-datetime \
+ python3-profile \
+ python3-stringold \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-poetry-core \
+ python3-pytest \
+ python3-pyyaml \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-toolz_0.12.1.bb b/meta-python/recipes-devtools/python/python3-toolz_0.12.1.bb
new file mode 100644
index 0000000000..f1763ee518
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-toolz_0.12.1.bb
@@ -0,0 +1,14 @@
+SUMMARY = "A set of utility functions for iterators, functions, and dictionaries."
+HOMEPAGE = "https://github.com/pytoolz/toolz"
+SECTION = "devel/python"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=ca09cab178326d18433aae982d1edf5d"
+
+SRC_URI[sha256sum] = "ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-json \
+ python3-math \
+"
diff --git a/meta-python/recipes-devtools/python/python3-tornado_5.1.bb b/meta-python/recipes-devtools/python/python3-tornado_5.1.bb
deleted file mode 100644
index 77c9fb516f..0000000000
--- a/meta-python/recipes-devtools/python/python3-tornado_5.1.bb
+++ /dev/null
@@ -1,7 +0,0 @@
-inherit pypi setuptools3
-require python-tornado.inc
-
-# Requires _compression which is currently located in misc
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-misc \
- "
diff --git a/meta-python/recipes-devtools/python/python-tornado.inc b/meta-python/recipes-devtools/python/python3-tornado_6.4.bb
index 16899f88c9..b01c1cec2a 100644
--- a/meta-python/recipes-devtools/python/python-tornado.inc
+++ b/meta-python/recipes-devtools/python/python3-tornado_6.4.bb
@@ -6,20 +6,36 @@ HOMEPAGE = "http://www.tornadoweb.org/en/stable/"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
-SRC_URI[md5sum] = "bd264851c409f926d1dae1ad5055d28d"
-SRC_URI[sha256sum] = "4f66a2172cb947387193ca4c2c3e19131f1c70fa8be470ddbbd9317fd0801582"
+SRC_URI[sha256sum] = "72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"
-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"
+inherit pypi setuptools3
-RDEPENDS_${PN}-test += "${PN} ${PYTHON_PN}-unittest"
+# Requires _compression which is currently located in 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 += "python3-unittest"
PACKAGES =+ "\
${PN}-test \
"
-FILES_${PN}-test = " \
- ${libdir}/${PYTHON_DIR}/site-packages/*/test \
- ${libdir}/${PYTHON_DIR}/site-packages/*/testing.py* \
+FILES:${PN}-test = " \
+ ${PYTHON_SITEPACKAGES_DIR}/*/test \
"
+
+BBCLASSEXTEND += "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-tox_4.14.2.bb b/meta-python/recipes-devtools/python/python3-tox_4.14.2.bb
new file mode 100644
index 0000000000..f451de3218
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-tox_4.14.2.bb
@@ -0,0 +1,34 @@
+# SPDX-License-Identifier: MIT
+# Copyright (C) 2023 iris-GmbH infrared & intelligent sensors
+
+SUMMARY = "Automate and standardize testing in Python. It is part of a larger vision of easing the packaging, testing and release process of Python software (alongside pytest and devpi)."
+HOMEPAGE = "http://tox.readthedocs.org/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=11610a9d8fd95649cf8159be12b98cb7"
+
+SRC_URI[sha256sum] = "0defb44f6dafd911b61788325741cc6b2e12ea71f987ac025ad4d649f1f1a104"
+
+BBCLASSEXTEND = "native nativesdk"
+inherit pypi python_hatchling
+
+DEPENDS += "\
+ python3-hatch-vcs-native \
+"
+
+RDEPENDS:${PN} += "\
+ python3-cachetools \
+ python3-chardet \
+ python3-colorama \
+ python3-filelock \
+ python3-packaging \
+ python3-platformdirs \
+ python3-pluggy \
+ python3-pyproject-api \
+ python3-tomli \
+ python3-virtualenv \
+"
+
+# Install all built-in python3 modules, as the software tested with tox might
+# depend on it. Tox will attempt to install all required dependencies
+# in a virtualenv using pip, but this obviously does not include the built-in modules.
+RDEPENDS:${PN} += "python3-modules"
diff --git a/meta-python/recipes-devtools/python/python3-tqdm_4.31.1.bb b/meta-python/recipes-devtools/python/python3-tqdm_4.31.1.bb
deleted file mode 100644
index 348337f0d6..0000000000
--- a/meta-python/recipes-devtools/python/python3-tqdm_4.31.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-tqdm.inc
diff --git a/meta-python/recipes-devtools/python/python3-tqdm_4.66.2.bb b/meta-python/recipes-devtools/python/python3-tqdm_4.66.2.bb
new file mode 100644
index 0000000000..77d26f54b2
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-tqdm_4.66.2.bb
@@ -0,0 +1,19 @@
+SUMMARY = "Fast, Extensible Progress Meter"
+HOMEPAGE = "http://tqdm.github.io/"
+SECTION = "devel/python"
+
+LICENSE = "MIT & MPL-2.0"
+LIC_FILES_CHKSUM = "file://LICENCE;md5=42dfa9e8c616dbc295df3f58d756b2a1"
+
+SRC_URI[sha256sum] = "6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531"
+
+inherit pypi python_setuptools_build_meta
+
+DEPENDS += "python3-setuptools-scm-native"
+
+RDEPENDS:${PN} += " \
+ python3-logging \
+ python3-numbers \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-trafaret-config_2.0.2.bb b/meta-python/recipes-devtools/python/python3-trafaret-config_2.0.2.bb
new file mode 100644
index 0000000000..eee9ab88ba
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-trafaret-config_2.0.2.bb
@@ -0,0 +1,15 @@
+SUMMARY = "This is a wrapper that loads yaml and checks config using trafaret while keeping track of actual lines of file where error has happened."
+
+LICENSE = "Apache-2.0 & MIT"
+LIC_FILES_CHKSUM = "file://README.rst;beginline=98;endline=106;md5=a15308789c3b7d0f3ef36b69048423e4"
+
+SRC_URI[sha256sum] = "440b6b49e5e975f9a640a2519abb2feddd96eb2aeb1715f87f947a7a079f20be"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-trafaret \
+ python3-pyyaml \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-trafaret_2.1.1.bb b/meta-python/recipes-devtools/python/python3-trafaret_2.1.1.bb
new file mode 100644
index 0000000000..5b24206a27
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-trafaret_2.1.1.bb
@@ -0,0 +1,16 @@
+SUMMARY = "Ultimate transformation library that supports validation, contexts and aiohttp."
+
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=21ecc7aa8f699874e706fc1354903437"
+
+SRC_URI[sha256sum] = "d9d00800318fbd343fdfb3353e947b2ebb5557159c844696c5ac24846f76d41c"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-datetime \
+ python3-numbers \
+ python3-urllib3 \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-traitlets/run-ptest b/meta-python/recipes-devtools/python/python3-traitlets/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-traitlets/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-traitlets_5.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.9.0.bb b/meta-python/recipes-devtools/python/python3-transitions_0.9.0.bb
new file mode 100644
index 0000000000..980351bf14
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-transitions_0.9.0.bb
@@ -0,0 +1,9 @@
+SUMMARY = "A lightweight, object-oriented Python state machine implementation with many extensions."
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=de0a0876a688a4483bfafa764773ab39"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "2f54d11bdb225779d7e729011e93a9fb717668ce3dc65f8d4f5a5d7ba2f48e10"
+
+RDEPENDS:${PN} += "python3-six python3-logging"
diff --git a/meta-python/recipes-devtools/python/python3-trustme/run-ptest b/meta-python/recipes-devtools/python/python3-trustme/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-trustme/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-trustme_1.1.0.bb b/meta-python/recipes-devtools/python/python3-trustme_1.1.0.bb
new file mode 100644
index 0000000000..21161a0e0f
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-trustme_1.1.0.bb
@@ -0,0 +1,34 @@
+DESCRIPTION = "A utility provides a fake certificate authority (CA)"
+HOMEPAGE = "https://pypi.org/project/trustme"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d5a7af1a4b73e57431e25d15a2da745a"
+
+SRC_URI[sha256sum] = "5375ad7fb427074bec956592e0d4ee2a4cf4da68934e1ba4bcf4217126bc45e6"
+
+inherit pypi setuptools3 ptest
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN} += " \
+ python3-cryptography \
+ python3-datetime \
+ python3-idna \
+ python3-io \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pyopenssl \
+ python3-pyasn1-modules \
+ python3-pytest \
+ python3-service-identity \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+ cp -rf ${S}/setup.py ${D}${PTEST_PATH}
+}
diff --git a/meta-python/recipes-devtools/python/python3-twine_1.13.0.bb b/meta-python/recipes-devtools/python/python3-twine_1.13.0.bb
deleted file mode 100644
index 0456ec92d3..0000000000
--- a/meta-python/recipes-devtools/python/python3-twine_1.13.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-twine.inc
diff --git a/meta-python/recipes-devtools/python/python3-twine_5.0.0.bb b/meta-python/recipes-devtools/python/python3-twine_5.0.0.bb
new file mode 100644
index 0000000000..cb45074811
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-twine_5.0.0.bb
@@ -0,0 +1,18 @@
+DESCRIPTION = "Utilities for interacting with PyPI"
+HOMEPAGE = "https://twine.readthedocs.io/"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=a3d1106b253a8d50dd82a4202a045b4c"
+
+SRC_URI[sha256sum] = "89b0cc7d370a4b66421cc6102f269aa910fe0f1861c124f573cf2ddedbc10cf4"
+
+inherit pypi python_setuptools_build_meta
+
+DEPENDS += "\
+ python3-setuptools-scm-native \
+"
+
+RDEPENDS:${PN} += " \
+ python3-importlib-metadata \
+"
+
+BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python3-twisted_19.7.0.bb b/meta-python/recipes-devtools/python/python3-twisted_19.7.0.bb
deleted file mode 100644
index dfb9d4a4cc..0000000000
--- a/meta-python/recipes-devtools/python/python3-twisted_19.7.0.bb
+++ /dev/null
@@ -1,65 +0,0 @@
-inherit pypi setuptools3
-require python-twisted.inc
-
-FILES_${PN}-core_append += " \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/__pycache__ \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/python/__pycache__/*pyc \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/__init__*.pyc \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/notestplugin*.pyc \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/testplugin*.pyc \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_ftp*.pyc \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_inet*.pyc \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_manhole*.pyc \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_portforward*.pyc \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_socks*.pyc \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_telnet*.pyc \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_trial*.pyc \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_core*.pyc \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_qtstub*.pyc \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_reactors*.pyc \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/cred*.pyc \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/dropin*.cache \
-"
-
-FILES_${PN}-names_append = " \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_names*.pyc \
-"
-
-FILES_${PN}-news_append = " \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_news*.pyc \
-"
-
-FILES_${PN}-protocols_append += " \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/protocols/__pycache__/*pyc \
-"
-
-FILES_${PN}-conch_append = " \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_conch*.pyc \
-"
-
-FILES_${PN}-lore_append = " \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_lore*.pyc \
-"
-FILES_${PN}-mail_append = " \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_mail*.pyc \
-"
-
-FILES_${PN}-web_append = " \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_web*.pyc \
-"
-
-FILES_${PN}-words_append = " \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_words*.pyc \
-"
-
-FILES_${PN}-flow_append = " \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_flow*.pyc \
-"
-
-FILES_${PN}-pair_append = " \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_pair*.pyc \
-"
-
-FILES_${PN}-runner_append = " \
- ${libdir}/${PYTHON_DIR}/site-packages/twisted/plugins/__pycache__/twisted_runner*.pyc \
-"
diff --git a/meta-python/recipes-devtools/python/python3-twisted_22.10.0.bb b/meta-python/recipes-devtools/python/python3-twisted_22.10.0.bb
new file mode 100644
index 0000000000..20b9ce2541
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-twisted_22.10.0.bb
@@ -0,0 +1,201 @@
+DESCRIPTION = "Twisted is an event-driven networking framework written in Python and licensed under the LGPL. \
+Twisted supports TCP, UDP, SSL/TLS, multicast, Unix sockets, a large number of protocols \
+(including HTTP, NNTP, IMAP, SSH, IRC, FTP, and others), and much more."
+HOMEPAGE = "http://www.twistedmatrix.com"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=0f8d67f84b6e178c92d471011b2245fc"
+
+SRC_URI[sha256sum] = "32acbd40a94f5f46e7b42c109bfae2b302250945561783a8b7a059048f2d4d31"
+
+PYPI_PACKAGE = "Twisted"
+
+inherit pypi python_setuptools_build_meta
+
+do_install:append() {
+ # remove some useless files before packaging
+ find ${D} \( -name "*.bat" -o -name "*.c" -o -name "*.h" \) -exec rm -f {} \;
+}
+
+PACKAGES += "\
+ ${PN}-zsh \
+ ${PN}-test \
+ ${PN}-protocols \
+ ${PN}-conch \
+ ${PN}-mail \
+ ${PN}-names \
+ ${PN}-news \
+ ${PN}-runner \
+ ${PN}-web \
+ ${PN}-words \
+ ${PN}-flow \
+ ${PN}-pair \
+ ${PN}-core \
+"
+
+DEPENDS += " \
+ python3-incremental-native \
+"
+
+RDEPENDS:${PN} = "\
+ ${PN}-core \
+ ${PN}-conch \
+ ${PN}-mail \
+ ${PN}-names \
+ ${PN}-pair \
+ ${PN}-protocols \
+ ${PN}-runner \
+ ${PN}-web \
+ ${PN}-words \
+ ${PN}-zsh \
+"
+
+RDEPENDS:${PN}-core = "python3-appdirs \
+ python3-asyncio \
+ python3-automat \
+ python3-constantly \
+ python3-core \
+ python3-debugger \
+ python3-hyperlink \
+ python3-incremental \
+ python3-pyhamcrest \
+ python3-pyserial \
+ python3-typing-extensions \
+ python3-unixadmin \
+ python3-zopeinterface \
+"
+RDEPENDS:${PN}-test = "${PN}"
+RDEPENDS:${PN}-conch = "${PN}-core ${PN}-protocols python3-bcrypt python3-cryptography python3-pyasn1 python3-pickle"
+RDEPENDS:${PN}-mail = "${PN}-core ${PN}-protocols"
+RDEPENDS:${PN}-names = "${PN}-core"
+RDEPENDS:${PN}-news = "${PN}-core ${PN}-protocols"
+RDEPENDS:${PN}-runner = "${PN}-core ${PN}-protocols"
+RDEPENDS:${PN}-web += "${PN}-core ${PN}-protocols"
+RDEPENDS:${PN}-words += "${PN}-core"
+RDEPENDS:${PN}-flow += "${PN}-core"
+RDEPENDS:${PN}-pair += "${PN}-core"
+
+FILES:${PN} = "${PYTHON_SITEPACKAGES_DIR}/${PYPI_PACKAGE}-${PV}.dist-info/*"
+
+FILES:${PN}-test = " \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/test \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/*/test \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/protocols/haproxy/test/ \
+"
+
+FILES:${PN}-protocols = " \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/protocols/*.py* \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/protocols/gps/ \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/protocols/mice/ \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/protocols/haproxy \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/protocols/__pycache__/*pyc \
+"
+
+FILES:${PN}-zsh = " \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/python/twisted-completion.zsh \
+"
+
+FILES:${PN}-conch = " \
+ ${bindir}/ckeygen \
+ ${bindir}/tkconch \
+ ${bindir}/conch \
+ ${bindir}/cftp \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_conch.py* \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_conch*.pyc \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/conch \
+"
+
+FILES:${PN}-core = " \
+ ${bindir}/twist \
+ ${bindir}/twistd \
+ ${bindir}/trial \
+ ${bindir}/pyhtmlizer \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/*.py* \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/application \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/cred \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/enterprise \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/internet \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/persisted \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/protocols \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/scripts \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/spread \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/tap \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/trial \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/*.py* \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/python/*.py* \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/*.py* \
+ ${PYTHON_SITEPACKAGES_DIR}/Twisted*egg-info \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/logger \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/_threads \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/positioning \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/py.typed \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/__pycache__/*pyc \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/python/__pycache__/*pyc \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/__init__*.pyc \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/cred_anonymous*.pyc \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/cred_file*.pyc \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/cred_memory*.pyc \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/cred_sshkeys*.pyc \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/cred_unix*.pyc \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_core*.pyc \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_ftp*.pyc \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_inet*.pyc \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_portforward*.pyc \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_reactors*.pyc \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_socks*.pyc \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_trial*.pyc \
+"
+
+FILES:${PN}-mail = " \
+ ${bindir}/mailmail \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_mail.py* \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_mail*.pyc \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/mail \
+"
+
+FILES:${PN}-names = " \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_names.py* \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_names*.pyc \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/names \
+"
+
+FILES:${PN}-news = " \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_news.py* \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_news*.pyc \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/news \
+"
+
+FILES:${PN}-runner = " \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_runner.py* \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_runner*.pyc \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/runner \
+"
+
+FILES:${PN}-web = " \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_web.py* \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_web*.pyc \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/web \
+"
+
+FILES:${PN}-words = " \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_words.py* \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_words*.pyc \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/words \
+"
+
+FILES:${PN}-flow = " \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_flow.py* \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_flow*.pyc \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/flow \
+"
+
+FILES:${PN}-pair = " \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/twisted_pair.py* \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/plugins/__pycache__/twisted_pair*.pyc \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/pair \
+"
+
+FILES:${PN}-doc += " \
+ ${PYTHON_SITEPACKAGES_DIR}/twisted/python/_pydoctortemplates \
+"
+
diff --git a/meta-python/recipes-devtools/python/python3-twitter_3.7.0.bb b/meta-python/recipes-devtools/python/python3-twitter_3.7.0.bb
deleted file mode 100644
index c2e4d2ebd3..0000000000
--- a/meta-python/recipes-devtools/python/python3-twitter_3.7.0.bb
+++ /dev/null
@@ -1,3 +0,0 @@
-require python-twitter.inc
-inherit pypi setuptools3
-
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 7b8eb2ef0f..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
@@ -1,4 +1,19 @@
-require python-twofish.inc
-inherit setuptools3
+SUMMARY = "Bindings for the Twofish implementation by Niels Ferguson"
+DESCRIPTION = "Bindings for the Twofish implementation by Niels Ferguson\
+ libtwofish-dev."
+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[sha256sum] = "b09d8bb50d33b23ff34cafb1f9209f858f752935c6a5c901efb92a41acb830fa"
+
+inherit pypi setuptools3
+
+BBCLASSEXTEND = "native nativesdk"
+
+RDEPENDS:${PN} += "python3-ctypes"
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
new file mode 100644
index 0000000000..d579ca0441
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-txdbus_1.1.2.bb
@@ -0,0 +1,12 @@
+SUMMARY = "A native Python implementation of the DBus protocol for Twisted applications."
+HOMEPAGE = "https://pypi.org/project/txdbus/"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://README.rst;beginline=32;endline=32;md5=2141358b0bce85fc45216ba91735ad50"
+
+SRC_URI[md5sum] = "d397357dee78750385f92ca9c6c1f063"
+SRC_URI[sha256sum] = "8375a5fb68a12054f0def91af800c821fb2232949337756ed975f88d8ea2bc97"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-six python3-twisted"
diff --git a/meta-python/recipes-devtools/python/python3-typeguard/run-ptest b/meta-python/recipes-devtools/python/python3-typeguard/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-typeguard/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-typeguard_4.2.1.bb b/meta-python/recipes-devtools/python/python3-typeguard_4.2.1.bb
new file mode 100644
index 0000000000..e0e84df28a
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-typeguard_4.2.1.bb
@@ -0,0 +1,39 @@
+SUMMARY = "Run-time type checker for Python"
+HOMEPAGE = "https://pypi.org/project/typeguard/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=f0e423eea5c91e7aa21bdb70184b3e53"
+
+SRC_URI[sha256sum] = "c556a1b95948230510070ca53fa0341fb0964611bd05d598d87fb52115d65fee"
+
+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 += " \
+ python3-pytest \
+ python3-typing-extensions \
+ python3-unittest-automake-output \
+ python3-unixadmin \
+ python3-mypy \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+DEPENDS += "\
+ python3-distutils-extra-native \
+ python3-setuptools-scm-native \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-types-psutil_5.9.5.20240316.bb b/meta-python/recipes-devtools/python/python3-types-psutil_5.9.5.20240316.bb
new file mode 100644
index 0000000000..c6f15696e9
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-types-psutil_5.9.5.20240316.bb
@@ -0,0 +1,10 @@
+SUMMARY = "Typing stubs for psutil"
+HOMEPAGE = "https://github.com/python/typeshed"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=6;endline=6;md5=ef4dc1e740f5c928f1608a4a9c7b578e"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "5636f5714bb930c64bb34c4d47a59dc92f9d610b778b5364a31daa5584944848"
+
+BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python3-types-python-dateutil_2.9.0.20240316.bb b/meta-python/recipes-devtools/python/python3-types-python-dateutil_2.9.0.20240316.bb
new file mode 100644
index 0000000000..4b786066f7
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-types-python-dateutil_2.9.0.20240316.bb
@@ -0,0 +1,8 @@
+SUMMARY = "Typing stubs for python-dateutil"
+HOMEPAGE = "https://github.com/python/typeshed"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=6;endline=6;md5=ef4dc1e740f5c928f1608a4a9c7b578e"
+
+SRC_URI[sha256sum] = "5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202"
+
+inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-types-setuptools_69.0.0.20240125.bb b/meta-python/recipes-devtools/python/python3-types-setuptools_69.0.0.20240125.bb
new file mode 100644
index 0000000000..7e15dcb13a
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-types-setuptools_69.0.0.20240125.bb
@@ -0,0 +1,10 @@
+SUMMARY = "Typing stubs for setuptools"
+HOMEPAGE = "https://github.com/python/typeshed"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=6;endline=6;md5=ef4dc1e740f5c928f1608a4a9c7b578e"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "22ad498cb585b22ce8c97ada1fccdf294a2e0dd7dc984a28535a84ea82f45b3f"
+
+BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python3-tzlocal_1.5.1.bb b/meta-python/recipes-devtools/python/python3-tzlocal_1.5.1.bb
deleted file mode 100644
index 813934c812..0000000000
--- a/meta-python/recipes-devtools/python/python3-tzlocal_1.5.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-tzlocal.inc
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
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-u-msgpack-python/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-u-msgpack-python_2.8.0.bb b/meta-python/recipes-devtools/python/python3-u-msgpack-python_2.8.0.bb
new file mode 100644
index 0000000000..6cde243fe8
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-u-msgpack-python_2.8.0.bb
@@ -0,0 +1,27 @@
+DESCRIPTION = "A portable, lightweight MessagePack serializer and deserializer written in pure Python."
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=17df11353545c53a2df0ce7655859306"
+
+SRC_URI[sha256sum] = "b801a83d6ed75e6df41e44518b4f2a9c221dc2da4bcd5380e3a0feda520bc61a"
+
+inherit pypi setuptools3 ptest
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ cp -f ${S}/test_umsgpack.py ${D}${PTEST_PATH}/
+}
+
+RDEPENDS:${PN} += " \
+ python3-datetime \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-uefi-firmware_1.11.bb b/meta-python/recipes-devtools/python/python3-uefi-firmware_1.11.bb
new file mode 100644
index 0000000000..67e668ac69
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-uefi-firmware_1.11.bb
@@ -0,0 +1,21 @@
+SUMMARY = "Various data structures and parsing tools for UEFI firmware."
+DESCRIPTION = "This package contains Python UEFI firmware parser tool. The \
+UEFI firmware parser is a simple module and set of scripts for parsing, \
+extracting, and recreating UEFI firmware volumes. This includes parsing \
+modules for BIOS, OptionROM, Intel ME and other formats too."
+HOMEPAGE = "https://github.com/theopolis/uefi-firmware-parser"
+LICENSE = "BSD-2-Clause & BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://setup.py;md5=5a59066a8676f17262ef7e691f8ef253"
+
+SRC_URI = "git://github.com/theopolis/uefi-firmware-parser;protocol=https;branch=master"
+
+SRCREV = "f289219b99eb525cbc58e4dc2b07df3811f92ef7"
+
+S = "${WORKDIR}/git"
+
+inherit setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-ctypes \
+ python3-logging \
+"
diff --git a/meta-python/recipes-devtools/python/python3-ujson/0001-setup.py-Do-not-strip-debugging-symbols.patch b/meta-python/recipes-devtools/python/python3-ujson/0001-setup.py-Do-not-strip-debugging-symbols.patch
new file mode 100644
index 0000000000..8ba8ada556
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-ujson/0001-setup.py-Do-not-strip-debugging-symbols.patch
@@ -0,0 +1,37 @@
+From aec3b64b0aaea0178b44ea65a204d76696e6a45e Mon Sep 17 00:00:00 2001
+From: Leon Anavi <leon.anavi@konsulko.com>
+Date: Mon, 10 Jan 2022 14:04:28 +0200
+Subject: [PATCH] setup.py: Do not strip debugging symbols
+
+Do not strip debugging symbols from Linux binaries to avoid
+bitbake build errors related to already-stripped.
+
+Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
+---
+Upstream-Status: Pending
+
+ setup.py | 8 +-------
+ 1 file changed, 1 insertion(+), 7 deletions(-)
+
+diff --git a/setup.py b/setup.py
+index b98963b..d42f07a 100644
+--- a/setup.py
++++ b/setup.py
+@@ -19,13 +19,7 @@ if not dconv_libs:
+ dconv_source_files.extend(glob("./deps/double-conversion/double-conversion/*.cc"))
+ dconv_source_files.append("./lib/dconv_wrapper.cc")
+
+-if platform.system() == "Linux" and environ.get("UJSON_BUILD_NO_STRIP", "0") not in (
+- "1",
+- "True",
+-):
+- strip_flags = ["-Wl,--strip-all"]
+-else:
+- strip_flags = []
++strip_flags = []
+
+ module1 = Extension(
+ "ujson",
+--
+2.25.1
+
diff --git a/meta-python/recipes-devtools/python/python3-ujson/run-ptest b/meta-python/recipes-devtools/python/python3-ujson/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-ujson/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-ujson_1.35.bb b/meta-python/recipes-devtools/python/python3-ujson_1.35.bb
deleted file mode 100644
index ae4cc0a812..0000000000
--- a/meta-python/recipes-devtools/python/python3-ujson_1.35.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-ujson.inc
diff --git a/meta-python/recipes-devtools/python/python3-ujson_5.9.0.bb b/meta-python/recipes-devtools/python/python3-ujson_5.9.0.bb
new file mode 100644
index 0000000000..b5f6be9f27
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-ujson_5.9.0.bb
@@ -0,0 +1,35 @@
+SUMMARY = "Ultra fast JSON encoder and decoder for Python"
+DESCRIPTION = "UltraJSON is an ultra fast JSON encoder and decoder written in pure C with bindings for Python 2.5+ and 3."
+
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e0039a83d8a99726b5418f0b03302d0a"
+
+SRC_URI[sha256sum] = "89cc92e73d5501b8a7f48575eeb14ad27156ad092c2e9fc7e3cf949f07e75532"
+
+inherit pypi ptest setuptools3
+
+SRC_URI += " \
+ file://run-ptest \
+ file://0001-setup.py-Do-not-strip-debugging-symbols.patch \
+"
+
+DEPENDS += "python3-setuptools-scm-native"
+
+RDEPENDS:${PN} += "\
+ python3-datetime \
+ python3-numbers \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-json \
+ python3-pytest \
+ python3-pytz \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-unidiff/run-ptest b/meta-python/recipes-devtools/python/python3-unidiff/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-unidiff/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-unidiff_0.5.5.bb b/meta-python/recipes-devtools/python/python3-unidiff_0.5.5.bb
deleted file mode 100644
index 0ddc7e2f20..0000000000
--- a/meta-python/recipes-devtools/python/python3-unidiff_0.5.5.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-unidiff.inc
-inherit setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-unidiff_0.7.5.bb b/meta-python/recipes-devtools/python/python3-unidiff_0.7.5.bb
new file mode 100644
index 0000000000..d77252beac
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-unidiff_0.7.5.bb
@@ -0,0 +1,27 @@
+SUMMARY = "Unified diff parsing/metadata extraction library"
+HOMEPAGE = "http://github.com/matiasb/python-unidiff"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=4c434b08ef42fea235bb019b5e5a97b3"
+
+SRC_URI[sha256sum] = "2e5f0162052248946b9f0970a40e9e124236bf86c82b70821143a6fc1dea2574"
+
+inherit pypi setuptools3 ptest
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+RDEPENDS:${PN} += " \
+ python3-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
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-uritemplate/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+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
new file mode 100644
index 0000000000..e741b6268d
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-uritemplate_4.1.1.bb
@@ -0,0 +1,26 @@
+# This recipe is originally from meta-openstack:
+# 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."
+LICENSE = "Apache-2.0 | BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=0f6d769bdcfacac3c1a1ffa568937fe0"
+
+SRC_URI[sha256sum] = "4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"
+
+inherit pypi setuptools3 ptest
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-urllib3_1.25.6.bb b/meta-python/recipes-devtools/python/python3-urllib3_1.25.6.bb
deleted file mode 100644
index 19eb7025b2..0000000000
--- a/meta-python/recipes-devtools/python/python3-urllib3_1.25.6.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-urllib3.inc
diff --git a/meta-python/recipes-devtools/python/python3-uswid_0.4.7.bb b/meta-python/recipes-devtools/python/python3-uswid_0.4.7.bb
new file mode 100644
index 0000000000..4499edb216
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-uswid_0.4.7.bb
@@ -0,0 +1,19 @@
+SUMMARY = "A pure-python library for embedding CoSWID data"
+HOMEPAGE = "https://github.com/hughsie/python-uswid"
+SECTION = "devel/python"
+LICENSE = "LGPL-2.1-or-later"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=40d2542b8c43a3ec2b7f5da31a697b88"
+
+SRC_URI[sha256sum] = "de15c2421bedaa5f54606558700c1f628f07d73da49ec69d1888214ac52c49e6"
+
+inherit setuptools3 python3native pypi
+
+DEPENDS += " python3-cbor2 python3-lxml python3-pefile"
+RDEPENDS:${PN} += " \
+ python3-cbor2 \
+ python3-json \
+ python3-lxml \
+ python3-netclient \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-validators/run-ptest b/meta-python/recipes-devtools/python/python3-validators/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-validators/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-validators_0.28.0.bb b/meta-python/recipes-devtools/python/python3-validators_0.28.0.bb
new file mode 100644
index 0000000000..36444c0bfc
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-validators_0.28.0.bb
@@ -0,0 +1,30 @@
+SUMMARY = "Python Data Validation for Humans"
+HOMEPAGE = "https://python-validators.github.io/validators"
+LICENSE = "MIT"
+
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=b3fb4b9e6db86c69a33d5e3ee013ab59"
+SRC_URI[sha256sum] = "85bc82511f6ccd0800f4c15d8c0dc546c15e369640c5ea1f24349ba0b3b17815"
+
+inherit pypi python_setuptools_build_meta ptest
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+RDEPENDS:${PN} += " \
+ python3-crypt \
+ python3-datetime \
+ python3-netclient \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-vcversioner_2.16.0.0.bb b/meta-python/recipes-devtools/python/python3-vcversioner_2.16.0.0.bb
deleted file mode 100644
index 149078c51b..0000000000
--- a/meta-python/recipes-devtools/python/python3-vcversioner_2.16.0.0.bb
+++ /dev/null
@@ -1,12 +0,0 @@
-SUMMARY = "Python vcversioner, automagically update the project's version"
-HOMEPAGE = "https://github.com/habnabit/vcversioner"
-
-LICENSE = "ISC"
-LIC_FILES_CHKSUM = "file://PKG-INFO;md5=827a7a91a8d20d3c666b665cd96db8e3"
-
-SRC_URI[md5sum] = "aab6ef5e0cf8614a1b1140ed5b7f107d"
-SRC_URI[sha256sum] = "dae60c17a479781f44a4010701833f1829140b1eeccd258762a74974aa06e19b"
-
-inherit pypi setuptools3
-
-BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python3-versioneer_0.29.bb b/meta-python/recipes-devtools/python/python3-versioneer_0.29.bb
new file mode 100644
index 0000000000..bdfbfd1be1
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-versioneer_0.29.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Easy VCS-based management of project version strings"
+HOMEPAGE = "https://github.com/python-versioneer/python-versioneer"
+SECTION = "devel/python"
+
+LICENSE = "Unlicense"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=f4c62131f879a8445e16a7f265aea635"
+
+SRC_URI[sha256sum] = "5ab283b9857211d61b53318b7c792cf68e798e765ee17c27ade9f6c924235731"
+
+inherit pypi python_setuptools_build_meta
+
+RDEPENDS:${PN} += "\
+ python3-json \
+ python3-netclient \
+ python3-tomllib \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-versiontools_1.9.1.bb b/meta-python/recipes-devtools/python/python3-versiontools_1.9.1.bb
index e8d6b7ddaf..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,2 +1,12 @@
-inherit setuptools3
-require python-versiontools.inc
+SUMMARY = "Smart replacement for plain tuple used in __version__"
+SECTION = "devel/python"
+HOMEPAGE = "https://launchpad.net/versiontools"
+LICENSE = "LGPL-3.0-only"
+LIC_FILES_CHKSUM = "file://setup.py;beginline=3;endline=20;md5=02193721a38fd8a05a4ddeb7df8e294d"
+
+SRC_URI[md5sum] = "602b7db8eea30dd29a1d451997adf251"
+SRC_URI[sha256sum] = "a969332887a18a9c98b0df0ea4d4ca75972f24ca94f06fb87d591377e83414f6"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-setuptools"
diff --git a/meta-python/recipes-devtools/python/python3-virtualenv_20.25.0.bb b/meta-python/recipes-devtools/python/python3-virtualenv_20.25.0.bb
new file mode 100644
index 0000000000..1858fee25a
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-virtualenv_20.25.0.bb
@@ -0,0 +1,22 @@
+# SPDX-License-Identifier: MIT
+# Copyright (C) 2023 iris-GmbH infrared & intelligent sensors
+
+SUMMARY = "A tool for creating isolated virtual python environments."
+HOMEPAGE = "https://github.com/pypa/virtualenv"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=0ce089158cf60a8ab6abb452b6405538"
+
+SRC_URI[sha256sum] = "bf51c0d9c7dd63ea8e44086fa1e4fb1093a31e963b86959257378aef020e1f1b"
+
+BBCLASSEXTEND = "native nativesdk"
+inherit pypi python_hatchling
+
+DEPENDS += "\
+ python3-hatch-vcs-native \
+"
+
+RDEPENDS:${PN} += " \
+ python3-distlib \
+ python3-filelock \
+ python3-platformdirs \
+"
diff --git a/meta-python/recipes-devtools/python/python3-visitor_0.1.3.bb b/meta-python/recipes-devtools/python/python3-visitor_0.1.3.bb
index b9bc51d4b9..ac3a90efb0 100644
--- a/meta-python/recipes-devtools/python/python3-visitor_0.1.3.bb
+++ b/meta-python/recipes-devtools/python/python3-visitor_0.1.3.bb
@@ -1,2 +1,8 @@
+SUMMARY = "A tiny pythonic visitor implementation."
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=8227180126797a0148f94f483f3e1489"
+
+SRC_URI[md5sum] = "94a024ed0ec1b02b4497c15267d319ca"
+SRC_URI[sha256sum] = "2c737903b2b6864ebc6167eef7cf3b997126f1aa94bdf590f90f1436d23e480a"
+
inherit pypi setuptools3
-require python-visitor.inc
diff --git a/meta-python/recipes-devtools/python/python3-waitress_1.3.1.bb b/meta-python/recipes-devtools/python/python3-waitress_1.3.1.bb
deleted file mode 100644
index 83c8b66d82..0000000000
--- a/meta-python/recipes-devtools/python/python3-waitress_1.3.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3 pypi
-require python-waitress.inc
diff --git a/meta-python/recipes-devtools/python/python-waitress.inc b/meta-python/recipes-devtools/python/python3-waitress_3.0.0.bb
index 732c31dbd7..7470fc02a0 100644
--- a/meta-python/recipes-devtools/python/python-waitress.inc
+++ b/meta-python/recipes-devtools/python/python3-waitress_3.0.0.bb
@@ -6,5 +6,10 @@ SECTION = "devel/python"
LICENSE = "ZPL-2.1"
LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=78ccb3640dc841e1baecb3e27a6966b2"
-SRC_URI[md5sum] = "d9132d313de0c5e0fec34ef9ede5442e"
-SRC_URI[sha256sum] = "278e09d6849acc1365404bbf7d790d0423b159802e850c726e8cd0a126a2dac7"
+RDEPENDS:${PN} += " \
+ python3-logging \
+"
+
+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_4.0.0.bb b/meta-python/recipes-devtools/python/python3-watchdog_4.0.0.bb
new file mode 100644
index 0000000000..9e36264d62
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-watchdog_4.0.0.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Filesystem events monitoring"
+DEPENDS = "python3-argh"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
+
+SRC_URI[sha256sum] = "e3e7065cbdabe6183ab82199d7a4f6b3ba0a438c5a512a68559846ccb76a78ec"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} = " \
+ python3-argh \
+ python3-pathtools3 \
+ python3-pyyaml \
+ python3-requests \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-watchdogdev_1.0.0.bb b/meta-python/recipes-devtools/python/python3-watchdogdev_1.0.0.bb
new file mode 100644
index 0000000000..3acb366c1d
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-watchdogdev_1.0.0.bb
@@ -0,0 +1,9 @@
+SUMMARY = "Linux watchdog device API for Python."
+HOMEPAGE = "https://github.com/timka/watchdogdev"
+SECTION = "devel/python"
+LICENSE = "Python-2.0"
+LIC_FILES_CHKSUM = "file://setup.py;beginline=47;endline=47;md5=ad880087bee2eb64e368954eb7b99bfd"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "776ba57a07aef0084466493f40ce20814a29f8914a10ef8177317d02559fd017"
diff --git a/meta-python/recipes-devtools/python/python3-wcwidth_0.1.7.bb b/meta-python/recipes-devtools/python/python3-wcwidth_0.1.7.bb
deleted file mode 100644
index 5f6259b081..0000000000
--- a/meta-python/recipes-devtools/python/python3-wcwidth_0.1.7.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-wcwidth.inc
diff --git a/meta-python/recipes-devtools/python/python3-web3_6.17.0.bb b/meta-python/recipes-devtools/python/python3-web3_6.17.0.bb
new file mode 100644
index 0000000000..f1be4dcf4d
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-web3_6.17.0.bb
@@ -0,0 +1,26 @@
+SUMMARY = "A Python library for interacting with Ethereum."
+HOMEPAGE = "https://github.com/ethereum/web3.py"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=373fede350846fdffd23648fba504635"
+
+SRC_URI[sha256sum] = "1b535272a40da3d8d2b120856edb53b84b0c08bcc8fe1a5bbd5f816fd72f4ec6"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-aiohttp \
+ python3-eth-abi \
+ python3-eth-account \
+ python3-eth-hash \
+ python3-eth-typing \
+ python3-eth-utils \
+ python3-hexbytes \
+ python3-jsonschema \
+ python3-protobuf \
+ python3-pydantic \
+ python3-requests \
+ python3-typing-extensions \
+ python3-websockets \
+ python3-pyunormalize \
+"
diff --git a/meta-python/recipes-devtools/python/python3-webargs_8.4.0.bb b/meta-python/recipes-devtools/python/python3-webargs_8.4.0.bb
new file mode 100644
index 0000000000..78af013320
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-webargs_8.4.0.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Declarative parsing and validation of HTTP request objects, with built-in support for popular web frameworks."
+HOMEPAGE = "https://github.com/marshmallow-code/webargs"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=dfbd4ae0074716275fc229c775723e8f"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "ea99368214a4ce613924be99d71db58c269631e95eff4fa09b7354e52dc006a5"
+
+RDEPENDS:${PN} += "\
+ python3-marshmallow \
+ python3-packaging \
+ python3-core \
+ python3-json \
+ python3-asyncio \
+ python3-logging \
+"
diff --git a/meta-python/recipes-devtools/python/python3-webcolors_1.8.1.bb b/meta-python/recipes-devtools/python/python3-webcolors_1.8.1.bb
deleted file mode 100644
index fcd9f70726..0000000000
--- a/meta-python/recipes-devtools/python/python3-webcolors_1.8.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-webcolors.inc
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 71fe741e4c..cedc790815 100644
--- a/meta-python/recipes-devtools/python/python3-webencodings_0.5.1.bb
+++ b/meta-python/recipes-devtools/python/python3-webencodings_0.5.1.bb
@@ -1,2 +1,15 @@
-inherit setuptools3
-require python-webencodings.inc
+SUMMARY = "Character encoding aliases for legacy web content"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e910b35b0ef4e1f665b9a75d6afb7709"
+
+SRC_URI[md5sum] = "32f6e261d52e57bf7e1c4d41546d15b8"
+SRC_URI[sha256sum] = "b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-codecs \
+ python3-json \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-websocket-client_0.56.0.bb b/meta-python/recipes-devtools/python/python3-websocket-client_0.56.0.bb
deleted file mode 100644
index 9b6696ead1..0000000000
--- a/meta-python/recipes-devtools/python/python3-websocket-client_0.56.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-websocket-client.inc
diff --git a/meta-python/recipes-devtools/python/python3-websocket-client_1.7.0.bb b/meta-python/recipes-devtools/python/python3-websocket-client_1.7.0.bb
new file mode 100644
index 0000000000..fc73f1b0a5
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-websocket-client_1.7.0.bb
@@ -0,0 +1,17 @@
+SUMMARY = "websocket client for python"
+DESCRIPTION = "\
+websocket-client module is WebSocket client for python. \
+This provide the low level APIs for WebSocket. All APIs \
+are the synchronous functions."
+HOMEPAGE = "https://github.com/websocket-client/websocket-client"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=6eae3bb7247ccb2c3a087ea8de759c01"
+
+SRC_URI[sha256sum] = "10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} = "\
+ python3-six \
+ python3-logging \
+"
diff --git a/meta-python/recipes-devtools/python/python3-websockets_8.0.2.bb b/meta-python/recipes-devtools/python/python3-websockets_8.0.2.bb
deleted file mode 100644
index 6da73ce358..0000000000
--- a/meta-python/recipes-devtools/python/python3-websockets_8.0.2.bb
+++ /dev/null
@@ -1,16 +0,0 @@
-SUMMARY = "An implementation of the WebSocket Protocol (RFC 6455)"
-HOMEPAGE = "https://github.com/aaugustin/websockets"
-
-LICENSE = "BSD-3-Clause"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=ad5c6d36b3d0098b2f33a5ab69a9e750"
-
-inherit pypi setuptools3
-
-SRC_URI[md5sum] = "a37f0e22c3aa5f1cf12a6a3ae22b36ca"
-SRC_URI[sha256sum] = "882a7266fa867a2ebb2c0baaa0f9159cabf131cf18c1b4270d79ad42f9208dc5"
-
-BBCLASSEXTEND = "native nativesdk"
-
-RDEPENDS_${PN} = "\
- ${PYTHON_PN}-asyncio \
-"
diff --git a/meta-python/recipes-devtools/python/python3-werkzeug_0.14.1.bb b/meta-python/recipes-devtools/python/python3-werkzeug_0.14.1.bb
deleted file mode 100644
index 145a1de0a1..0000000000
--- a/meta-python/recipes-devtools/python/python3-werkzeug_0.14.1.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-inherit pypi setuptools3
-require python-werkzeug.inc
-
-RDEPENDS_${PN} += "${PYTHON_PN}-misc"
diff --git a/meta-python/recipes-devtools/python/python3-werkzeug_3.0.1.bb b/meta-python/recipes-devtools/python/python3-werkzeug_3.0.1.bb
new file mode 100644
index 0000000000..f8d2769b41
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-werkzeug_3.0.1.bb
@@ -0,0 +1,23 @@
+SUMMARY = "The comprehensive WSGI web application library"
+DESCRIPTION = "\
+Werkzeug started as simple collection of various utilities for WSGI \
+applications and has become one of the most advanced WSGI utility modules. \
+It includes a powerful debugger, full featured request and response objects, \
+HTTP utilities to handle entity tags, cache control headers, HTTP dates, \
+cookie handling, file uploads, a powerful URL routing system and a bunch \
+of community contributed addon modules."
+HOMEPAGE = "https://werkzeug.palletsprojects.com"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=5dc88300786f1c214c1e9827a5229462"
+
+SRC_URI[sha256sum] = "507e811ecea72b18a404947aded4b3390e1db8f826b494d76550ef45bb3b1dcc"
+
+inherit pypi python_flit_core
+
+RDEPENDS:${PN} += " \
+ python3-markupsafe \
+ python3-logging \
+ python3-profile \
+ python3-compression \
+ python3-json \
+"
diff --git a/meta-python/recipes-devtools/python/python3-wheel_0.32.3.bb b/meta-python/recipes-devtools/python/python3-wheel_0.32.3.bb
deleted file mode 100644
index e8c08a7dd9..0000000000
--- a/meta-python/recipes-devtools/python/python3-wheel_0.32.3.bb
+++ /dev/null
@@ -1,16 +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://LICENSE.txt;md5=9d66b41bc2a080e7174acc5dffecd752"
-
-SRC_URI = "git://github.com/pypa/wheel.git"
-SRCREV ?= "11584b78a56b4eedba4eedc55c9dac8aa2dd7070"
-
-
-inherit setuptools3
-
-S = "${WORKDIR}/git"
-
-BBCLASSEXTEND = "native"
-
diff --git a/meta-python/recipes-devtools/python/python3-whitenoise_6.6.0.bb b/meta-python/recipes-devtools/python/python3-whitenoise_6.6.0.bb
new file mode 100644
index 0000000000..352a53769a
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-whitenoise_6.6.0.bb
@@ -0,0 +1,19 @@
+SUMMARY = "Radically simplified static file serving for WSGI applications"
+AUTHOR = "David Evans <d@evans.io>"
+HOMEPAGE = "https://whitenoise.evans.io"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=aba4901cc64e401cea5a267eac2a2e1e"
+
+PYPI_PACKAGE = "whitenoise"
+
+SRC_URI[sha256sum] = "8998f7370973447fac1e8ef6e8ded2c5209a7b1f67c1012866dbcd09681c3251"
+
+inherit pypi python_setuptools_build_meta
+
+RDEPENDS:${PN}:append = " \
+ python3-brotli \
+ python3-coverage \
+ python3-django \
+ python3-pytest \
+ python3-requests \
+"
diff --git a/meta-python/recipes-devtools/python/python3-whoosh/0001-Mark-non-determinstic-test_minimize_dfa-test-as-XFAI.patch b/meta-python/recipes-devtools/python/python3-whoosh/0001-Mark-non-determinstic-test_minimize_dfa-test-as-XFAI.patch
new file mode 100644
index 0000000000..91fea24524
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-whoosh/0001-Mark-non-determinstic-test_minimize_dfa-test-as-XFAI.patch
@@ -0,0 +1,29 @@
+From ede95a4f4487b4fc3cad8452ae388376966fca0e Mon Sep 17 00:00:00 2001
+From: Chris Lamb <lamby@debian.org>
+Date: Fri, 5 Apr 2019 15:48:23 +0200
+Subject: [PATCH] Mark non-determinstic test_minimize_dfa test as XFAIL
+
+Sourced from Debian [1]
+[1] https://sources.debian.org/src/python-whoosh/2.7.4%2Bgit6-g9134ad92-8/debian/patches/0003-Mark-non-determinstic-test_minimize_dfa-test-as-XFAI.patch/
+
+Upstream-Status: Pending
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ tests/test_automata.py | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/tests/test_automata.py b/tests/test_automata.py
+index daab96c..7031dc3 100644
+--- a/tests/test_automata.py
++++ b/tests/test_automata.py
+@@ -327,6 +327,7 @@ def test_regular():
+ assert not ex.accept("bc")
+
+
++@pytest.mark.xfail(strict=False)
+ def test_minimize_dfa():
+ # Example from www.cs.odu.edu/~toida/nerzic/390teched/regular/fa/min-fa.html
+
+--
+2.44.0
+
diff --git a/meta-python/recipes-devtools/python/python3-whoosh/run-ptest b/meta-python/recipes-devtools/python/python3-whoosh/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-whoosh/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+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 5d8af303c7..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
@@ -1,2 +1,43 @@
-inherit pypi setuptools3
-require python-whoosh.inc
+SUMMARY = "Fast, pure-Python full text indexing, search, and spell checking library."
+DESCRIPTION = "\
+Whoosh is a fast, featureful full-text indexing and searching library \
+implemented in pure Python. Programmers can use it to easily add search \
+functionality to their applications and websites. Every part of how \
+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"
+
+PYPI_PACKAGE = "Whoosh"
+PYPI_PACKAGE_EXT = "zip"
+
+inherit ptest pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-email \
+ python3-multiprocessing \
+ python3-netclient \
+ python3-numbers \
+ python3-pickle \
+ python3-shell \
+ python3-stringold \
+"
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-fcntl \
+ 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-wpa-supplicant/0001-cli-drop-the-second-argument-from-click.argument-dec.patch b/meta-python/recipes-devtools/python/python3-wpa-supplicant/0001-cli-drop-the-second-argument-from-click.argument-dec.patch
new file mode 100644
index 0000000000..59aaa7ed82
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-wpa-supplicant/0001-cli-drop-the-second-argument-from-click.argument-dec.patch
@@ -0,0 +1,127 @@
+From 49b133d84e7a1471bf51d8d005b1ba8b78c37724 Mon Sep 17 00:00:00 2001
+From: Bartosz Golaszewski <brgl@bgdev.pl>
+Date: Sat, 20 Mar 2021 20:59:54 +0100
+Subject: [PATCH] cli: drop the second argument from @click.argument()
+ decorator
+
+@click.argument no longer takes two positional arguments.
+
+Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>
+---
+Upstream-Status: Pending
+
+ wpa_supplicant/cli.py | 28 ++++++++++++++--------------
+ 1 file changed, 14 insertions(+), 14 deletions(-)
+
+diff --git a/wpa_supplicant/cli.py b/wpa_supplicant/cli.py
+index bad5b5b..1fb322d 100644
+--- a/wpa_supplicant/cli.py
++++ b/wpa_supplicant/cli.py
+@@ -81,7 +81,7 @@ def root(ctx, debug):
+
+
+ @root.group()
+-@click.argument('ifname', 'e.g. wlan0')
++@click.argument('ifname')
+ @click.pass_context
+ def interface(ctx, ifname):
+ """Access fi.w1.wpa_supplicant1.Interface object"""
+@@ -101,7 +101,7 @@ def interface_p2p_device():
+
+
+ @root.group()
+-@click.argument('ifname', 'e.g. wlan0')
++@click.argument('ifname')
+ @click.option('--ssid', default=None, help='Look at scan results for BSS examples')
+ @click.option('--bssid', default=None, help='Look at scan results for BSS examples')
+ @click.pass_context
+@@ -149,7 +149,7 @@ def persistent_group():
+ # fi.w1.wpa_supplicant1 API
+ #
+ @root.command()
+-@click.argument('ifname', 'e.g. wlan0')
++@click.argument('ifname')
+ @click.option('--bridge_if_name', default=None, help='Bridge to control, e.g., br0')
+ @click.option('--driver', default=None, help='e.g. nl80211')
+ @click.option('--config_file', default=None, help='Config file path')
+@@ -161,7 +161,7 @@ def create_interface(ifname, bridge_if_name, driver, config_file):
+
+
+ @root.command()
+-@click.argument('ifname', 'e.g. wlan0')
++@click.argument('ifname')
+ def remove_interface(ifname):
+ """Method: Deregisters a wireless interface from wpa_supplicant"""
+ with supplicant() as supp:
+@@ -170,7 +170,7 @@ def remove_interface(ifname):
+
+
+ @root.command()
+-@click.argument('ifname', 'e.g. wlan0')
++@click.argument('ifname')
+ def get_interface(ifname):
+ """Method: Returns a D-Bus path to an object related to an interface which wpa_supplicant already controls"""
+ with supplicant() as supp:
+@@ -178,7 +178,7 @@ def get_interface(ifname):
+
+
+ @root.command(name='get')
+-@click.argument('name', 'Name of property (case sensitive)')
++@click.argument('name')
+ def root_get(name):
+ """Method: Get Property (case sensitive)"""
+ with supplicant() as supp:
+@@ -186,8 +186,8 @@ def root_get(name):
+
+
+ @root.command(name='set')
+-@click.argument('name', 'Name of property (case sensitive)')
+-@click.argument('value', 'Value to be set')
++@click.argument('name')
++@click.argument('value')
+ def root_set(name, value):
+ """Method: Set Property (case sensitive)"""
+ with supplicant() as supp:
+@@ -217,7 +217,7 @@ def disconnect(ctx):
+
+
+ @interface.command(name='get')
+-@click.argument('name', 'Name of property (case sensitive)')
++@click.argument('name')
+ @click.pass_context
+ def interface_get(ctx, name):
+ """Method: Get Property (case sensitive)"""
+@@ -227,8 +227,8 @@ def interface_get(ctx, name):
+
+
+ @interface.command(name='set')
+-@click.argument('name', 'Name of property (case sensitive)')
+-@click.argument('value', 'Value to be set')
++@click.argument('name')
++@click.argument('value')
+ @click.pass_context
+ def interface_set(ctx, name, value):
+ """Method: Set Property (case sensitive)"""
+@@ -241,7 +241,7 @@ def interface_set(ctx, name, value):
+ # fi.w1.wpa_supplicant1.BSS API
+ #
+ @bss.command(name='get')
+-@click.argument('name', 'Name of property (case sensitive)')
++@click.argument('name')
+ @click.pass_context
+ def bss_get(ctx, name):
+ """Method: Get Property (case sensitive)"""
+@@ -261,8 +261,8 @@ def bss_get(ctx, name):
+
+
+ @bss.command(name='set')
+-@click.argument('name', 'Name of property (case sensitive)')
+-@click.argument('value', 'Value to be set')
++@click.argument('name')
++@click.argument('value')
+ @click.pass_context
+ def bss_set(ctx, name, value):
+ """Method: Set Property (case sensitive)"""
+--
+2.25.1
+
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
new file mode 100644
index 0000000000..b9c62ced78
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-wpa-supplicant_0.2.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Python interface to the wpa_supplicant D-Bus interface"
+HOMEPAGE = "https://pypi.org/project/wpa_supplicant/"
+SECTION = "devel/python"
+LICENSE = "MPL-2.0"
+LIC_FILES_CHKSUM = "file://README.md;beginline=171;endline=199;md5=462586bcbebd12f5d0ac443be0ed3d91"
+
+SRC_URI[md5sum] = "c21c7841f5e03ff709a0564b2e094010"
+SRC_URI[sha256sum] = "3ad0f40a696763bb0f4d4dec5b51f6b53ccfeb7c16ebb5897349303045f94776"
+
+SRC_URI += "file://0001-cli-drop-the-second-argument-from-click.argument-dec.patch"
+
+PYPI_PACKAGE = "wpa_supplicant"
+UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/wpa_supplicant"
+UPSTREAM_CHECK_REGEX = "/wpa_supplicant/(?P<pver>(\d+[\.\-_]*)+)"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-twisted python3-click python3-txdbus"
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.11.2.bb b/meta-python/recipes-devtools/python/python3-wrapt_1.11.2.bb
deleted file mode 100644
index 85f446ef98..0000000000
--- a/meta-python/recipes-devtools/python/python3-wrapt_1.11.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-wrapt.inc
diff --git a/meta-python/recipes-devtools/python/python3-wrapt_1.16.0.bb b/meta-python/recipes-devtools/python/python3-wrapt_1.16.0.bb
new file mode 100644
index 0000000000..056323cd39
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-wrapt_1.16.0.bb
@@ -0,0 +1,30 @@
+SUMMARY = "A Python module for decorators, wrappers and monkey patching."
+HOMEPAGE = "http://wrapt.readthedocs.org/"
+LICENSE = "BSD-2-Clause"
+SECTION = "devel/python"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=dc34cbad60bc961452eb7ade801d25f7"
+
+SRC_URI[sha256sum] = "5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"
+
+inherit pypi setuptools3 ptest
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+RDEPENDS:${PN}:class-target += "\
+ python3-stringold \
+ python3-threading \
+"
+
+BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-devtools/python/python3-wsproto/run-ptest b/meta-python/recipes-devtools/python/python3-wsproto/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-wsproto/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-wsproto_1.2.0.bb b/meta-python/recipes-devtools/python/python3-wsproto_1.2.0.bb
new file mode 100644
index 0000000000..09f5565a94
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-wsproto_1.2.0.bb
@@ -0,0 +1,27 @@
+SUMMARY = "WebSockets state-machine based protocol implementation"
+HOMEPAGE = "https://github.com/python-hyper/wsproto/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=69fabf732409f4ac61875827b258caaf"
+
+inherit pypi setuptools3 ptest
+
+SRC_URI[sha256sum] = "ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065"
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/test/* ${D}${PTEST_PATH}/tests/
+}
+
+RDEPENDS:${PN} += " \
+ python3-h11 \
+ python3-netclient \
+"
diff --git a/meta-python/recipes-devtools/python/python3-wtforms_2.2.1.bb b/meta-python/recipes-devtools/python/python3-wtforms_2.2.1.bb
deleted file mode 100644
index add59cf7d6..0000000000
--- a/meta-python/recipes-devtools/python/python3-wtforms_2.2.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-wtforms.inc
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
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-xlrd/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-xlrd_1.1.0.bb b/meta-python/recipes-devtools/python/python3-xlrd_1.1.0.bb
deleted file mode 100644
index b7bd969c71..0000000000
--- a/meta-python/recipes-devtools/python/python3-xlrd_1.1.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-xlrd.inc
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
new file mode 100644
index 0000000000..aedf483bef
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-xlrd_2.0.1.bb
@@ -0,0 +1,39 @@
+SUMMARY = "Library for developers to extract data from Microsoft Excel (tm) spreadsheet files"
+DESCRIPTION = "Extract data from Excel spreadsheets (.xls and .xlsx,\
+ versions 2.0 onwards) on any platform. Pure Python (2.6, 2.7, 3.2+). \
+Strong support for Excel dates. Unicode-aware."
+HOMEPAGE = "http://www.python-excel.org/"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=00ea1e843a43c20d9b63a8112239b0d1"
+
+SRC_URI[sha256sum] = "f72f148f54442c6b056bf931dbc34f986fd0c3b0b6b5a58d013c9aef274d0c88"
+
+
+SRC_URI = "git://github.com/python-excel/xlrd.git;branch=master;protocol=https \
+ file://run-ptest \
+"
+SRCREV = "b8d573e11ec149da695d695c81a156232b89a949"
+
+S = "${WORKDIR}/git"
+
+inherit ptest setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-compression \
+ python3-io \
+ python3-mmap \
+ python3-pprint \
+ python3-shell \
+"
+
+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/
+}
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-xlsxwriter_3.1.9.bb b/meta-python/recipes-devtools/python/python3-xlsxwriter_3.1.9.bb
new file mode 100644
index 0000000000..ee7dab35cb
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-xlsxwriter_3.1.9.bb
@@ -0,0 +1,21 @@
+SUMMARY = "Python 2 and 3 compatibility library"
+HOMEPAGE = "https://xlsxwriter.readthedocs.io"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=12d9fac1f0049be71ab5aa4a78da02b0"
+
+inherit pypi setuptools3
+
+PYPI_PACKAGE = "XlsxWriter"
+
+RDEPENDS:${PN} += " \
+ python3-crypt \
+ python3-datetime \
+ python3-compression \
+ python3-numbers \
+ python3-io \
+"
+
+SRC_URI[sha256sum] = "de810bf328c6a4550f4ffd6b0b34972aeb7ffcf40f3d285a0413734f9b63a929"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-xmlrunner_1.7.7.bb b/meta-python/recipes-devtools/python/python3-xmlrunner_1.7.7.bb
deleted file mode 100644
index 7e7b5235ee..0000000000
--- a/meta-python/recipes-devtools/python/python3-xmlrunner_1.7.7.bb
+++ /dev/null
@@ -1,9 +0,0 @@
-SUMMARY = "unittest-based test runner with Ant/JUnit like XML reporting"
-HOMEPAGE = "https://github.com/pycontribs/xmlrunner"
-LICENSE = "LGPL-3.0"
-LIC_FILES_CHKSUM = "file://PKG-INFO;md5=fa964f202b6ae067ed5828fe43c77c1a"
-
-SRC_URI[md5sum] = "7b0b152ed2d278516aedbc0cac22dfb3"
-SRC_URI[sha256sum] = "5a6113d049eca7646111ee657266966e5bbfb0b5ceb2e83ee0772e16d7110f39"
-
-inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-xmlschema_3.0.1.bb b/meta-python/recipes-devtools/python/python3-xmlschema_3.0.1.bb
new file mode 100644
index 0000000000..97dc683785
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-xmlschema_3.0.1.bb
@@ -0,0 +1,20 @@
+SUMMARY = "The xmlschema library is an implementation of XML Schema for Python (supports Python 3.6+)."
+HOMEPAGE = "https://github.com/sissaschool/xmlschema"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=26aa26eda991a3a2b61c11b62d3fda65"
+
+SRC_URI[sha256sum] = "bb24a5f4738e49d85d9eb03a2b5af26bbbbfdb055517ad953d98925094b8c026"
+
+PYPI_PACKAGE = "xmlschema"
+inherit pypi setuptools3
+
+DEPENDS += "\
+ python3-elementpath-native \
+"
+
+RDEPENDS:${PN} += "\
+ python3-elementpath \
+ python3-modules \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-xmodem_0.4.7.bb b/meta-python/recipes-devtools/python/python3-xmodem_0.4.7.bb
new file mode 100644
index 0000000000..482f0c641b
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-xmodem_0.4.7.bb
@@ -0,0 +1,19 @@
+DESCRIPTION = "XMODEM protocol implementation"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
+
+SRC_URI[sha256sum] = "2f1068aa8676f0d1d112498b5786c4f8ea4f89d8f25d07d3a0f293cd21db1c35"
+
+inherit pypi setuptools3
+
+do_install:append() {
+ install -d ${D}${docdir}/${PN}
+ mv ${D}/usr/doc/* ${D}${docdir}/${PN}/
+ rmdir ${D}/usr/doc
+}
+
+RDEPENDS:${PN} += " \
+ python3-logging \
+"
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-devtools/python/python3-xstatic-font-awesome_4.7.0.0.bb b/meta-python/recipes-devtools/python/python3-xstatic-font-awesome_4.7.0.0.bb
deleted file mode 100644
index 639f80de91..0000000000
--- a/meta-python/recipes-devtools/python/python3-xstatic-font-awesome_4.7.0.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-xstatic-font-awesome.inc
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.1.bb b/meta-python/recipes-devtools/python/python3-xstatic_1.0.1.bb
deleted file mode 100644
index 76cb702737..0000000000
--- a/meta-python/recipes-devtools/python/python3-xstatic_1.0.1.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-xstatic.inc
diff --git a/meta-python/recipes-devtools/python/python3-xstatic_1.0.3.bb b/meta-python/recipes-devtools/python/python3-xstatic_1.0.3.bb
new file mode 100644
index 0000000000..22bfa365ff
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-xstatic_1.0.3.bb
@@ -0,0 +1,15 @@
+DESCRIPTION = "XStatic base package with minimal support code"
+HOMEPAGE = "https://pypi.python.org/pypi/XStatic"
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://README.txt;md5=1418684272f85f400cebf1b1a255c5cd"
+
+PYPI_PACKAGE = "XStatic"
+
+SRC_URI[sha256sum] = "402544cc9e179489441054f09c807804e115ea246907de87c0355fb4f5a31268"
+
+DEPENDS += " \
+ 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
new file mode 100644
index 0000000000..72c918c1a1
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-xxhash/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake tests/test.py
diff --git a/meta-python/recipes-devtools/python/python3-xxhash_1.4.2.bb b/meta-python/recipes-devtools/python/python3-xxhash_1.4.2.bb
deleted file mode 100644
index 76bc41a11c..0000000000
--- a/meta-python/recipes-devtools/python/python3-xxhash_1.4.2.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-xxhash.inc
-inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python/python3-xxhash_3.4.1.bb b/meta-python/recipes-devtools/python/python3-xxhash_3.4.1.bb
new file mode 100644
index 0000000000..be9ce005ea
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-xxhash_3.4.1.bb
@@ -0,0 +1,24 @@
+SUMMARY = "xxhash is a Python binding for the xxHash library by Yann Collet."
+SECTION = "devel/python"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3a9dab7f159514231249aa3e108ab26b"
+
+DEPENDS += "python3-setuptools-scm-native"
+
+SRC_URI[sha256sum] = "0379d6cf1ff987cd421609a264ce025e74f346e3e145dd106c0cc2e3ec3f99a9"
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+inherit pypi python_setuptools_build_meta ptest
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
diff --git a/meta-python/recipes-devtools/python/python3-yamlloader_1.3.2.bb b/meta-python/recipes-devtools/python/python3-yamlloader_1.3.2.bb
new file mode 100644
index 0000000000..93c58c11ca
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-yamlloader_1.3.2.bb
@@ -0,0 +1,12 @@
+SUMMARY = "Ordered YAML loader and dumper for PyYAML."
+HOMEPAGE = "https://github.com/Phynix/yamlloader"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=6831ef36faa29329bce2420c5356f97e"
+
+SRC_URI[sha256sum] = "7dbd98421d8090c521655f1b06ca030067f29df5253a8878126bce3a90f56817"
+
+inherit pypi python_setuptools_build_meta
+
+RDEPENDS:${PN}:class-target += "\
+ python3-pyyaml \
+"
diff --git a/meta-python/recipes-devtools/python/python3-yappi/0001-test_functionality-convert-line-endings-to-Unix.patch b/meta-python/recipes-devtools/python/python3-yappi/0001-test_functionality-convert-line-endings-to-Unix.patch
new file mode 100644
index 0000000000..70d4607c29
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-yappi/0001-test_functionality-convert-line-endings-to-Unix.patch
@@ -0,0 +1,3845 @@
+From 0136ca731cba8b056b3f2ff0e7df3953b94f1e87 Mon Sep 17 00:00:00 2001
+From: Tim Orling <tim.orling@konsulko.com>
+Date: Sun, 24 Dec 2023 09:41:57 -0800
+Subject: [PATCH 1/2] test_functionality: convert line endings to Unix
+
+Convert the Windows line endings with dos2unix to be like the
+other files in tests/*
+
+Upstream-Status: Submitted [https://github.com/sumerc/yappi/pull/164]
+
+Signed-off-by: Tim Orling <tim.orling@konsulko.com>
+---
+ tests/test_functionality.py | 3822 +++++++++++++++++------------------
+ 1 file changed, 1911 insertions(+), 1911 deletions(-)
+
+diff --git a/tests/test_functionality.py b/tests/test_functionality.py
+index 0e99c47..38bbe67 100644
+--- a/tests/test_functionality.py
++++ b/tests/test_functionality.py
+@@ -1,1911 +1,1911 @@
+-import os
+-import sys
+-import time
+-import threading
+-import unittest
+-import yappi
+-import _yappi
+-import utils
+-import multiprocessing
+-import subprocess
+-
+-_counter = 0
+-
+-
+-class BasicUsage(utils.YappiUnitTestCase):
+-
+- def test_callback_function_int_return_overflow(self):
+- # this test is just here to check if any errors are generated, as the err
+- # is printed in C side, I did not include it here. THere are ways to test
+- # this deterministically, I did not bother
+- import ctypes
+-
+- def _unsigned_overflow_margin():
+- return 2**(ctypes.sizeof(ctypes.c_void_p) * 8) - 1
+-
+- def foo():
+- pass
+-
+- #with utils.captured_output() as (out, err):
+- yappi.set_context_id_callback(_unsigned_overflow_margin)
+- yappi.set_tag_callback(_unsigned_overflow_margin)
+- yappi.start()
+- foo()
+-
+- def test_issue60(self):
+-
+- def foo():
+- buf = bytearray()
+- buf += b't' * 200
+- view = memoryview(buf)[10:]
+- view = view.tobytes()
+- del buf[:10] # this throws exception
+- return view
+-
+- yappi.start(builtins=True)
+- foo()
+- self.assertTrue(
+- len(
+- yappi.get_func_stats(
+- filter_callback=lambda x: yappi.
+- func_matches(x, [memoryview.tobytes])
+- )
+- ) > 0
+- )
+- yappi.stop()
+-
+- def test_issue54(self):
+-
+- def _tag_cbk():
+- global _counter
+- _counter += 1
+- return _counter
+-
+- def a():
+- pass
+-
+- def b():
+- pass
+-
+- yappi.set_tag_callback(_tag_cbk)
+- yappi.start()
+- a()
+- a()
+- a()
+- yappi.stop()
+- stats = yappi.get_func_stats()
+- self.assertEqual(stats.pop().ncall, 3) # aggregated if no tag is given
+- stats = yappi.get_func_stats(tag=1)
+-
+- for i in range(1, 3):
+- stats = yappi.get_func_stats(tag=i)
+- stats = yappi.get_func_stats(
+- tag=i, filter_callback=lambda x: yappi.func_matches(x, [a])
+- )
+-
+- stat = stats.pop()
+- self.assertEqual(stat.ncall, 1)
+-
+- yappi.set_tag_callback(None)
+- yappi.clear_stats()
+- yappi.start()
+- b()
+- b()
+- stats = yappi.get_func_stats()
+- self.assertEqual(len(stats), 1)
+- stat = stats.pop()
+- self.assertEqual(stat.ncall, 2)
+-
+- def test_filter(self):
+-
+- def a():
+- pass
+-
+- def b():
+- a()
+-
+- def c():
+- b()
+-
+- _TCOUNT = 5
+-
+- ts = []
+- yappi.start()
+- for i in range(_TCOUNT):
+- t = threading.Thread(target=c)
+- t.start()
+- ts.append(t)
+-
+- for t in ts:
+- t.join()
+-
+- yappi.stop()
+-
+- ctx_ids = []
+- for tstat in yappi.get_thread_stats():
+- if tstat.name == '_MainThread':
+- main_ctx_id = tstat.id
+- else:
+- ctx_ids.append(tstat.id)
+-
+- fstats = yappi.get_func_stats(filter={"ctx_id": 9})
+- self.assertTrue(fstats.empty())
+- fstats = yappi.get_func_stats(
+- filter={
+- "ctx_id": main_ctx_id,
+- "name": "c"
+- }
+- ) # main thread
+- self.assertTrue(fstats.empty())
+-
+- for i in ctx_ids:
+- fstats = yappi.get_func_stats(
+- filter={
+- "ctx_id": i,
+- "name": "a",
+- "ncall": 1
+- }
+- )
+- self.assertEqual(fstats.pop().ncall, 1)
+- fstats = yappi.get_func_stats(filter={"ctx_id": i, "name": "b"})
+- self.assertEqual(fstats.pop().ncall, 1)
+- fstats = yappi.get_func_stats(filter={"ctx_id": i, "name": "c"})
+- self.assertEqual(fstats.pop().ncall, 1)
+-
+- yappi.clear_stats()
+- yappi.start(builtins=True)
+- time.sleep(0.1)
+- yappi.stop()
+- fstats = yappi.get_func_stats(filter={"module": "time"})
+- self.assertEqual(len(fstats), 1)
+-
+- # invalid filters`
+- self.assertRaises(
+- Exception, yappi.get_func_stats, filter={'tag': "sss"}
+- )
+- self.assertRaises(
+- Exception, yappi.get_func_stats, filter={'ctx_id': "None"}
+- )
+-
+- def test_filter_callback(self):
+-
+- def a():
+- time.sleep(0.1)
+-
+- def b():
+- a()
+-
+- def c():
+- pass
+-
+- def d():
+- pass
+-
+- yappi.set_clock_type("wall")
+- yappi.start(builtins=True)
+- a()
+- b()
+- c()
+- d()
+- stats = yappi.get_func_stats(
+- filter_callback=lambda x: yappi.func_matches(x, [a, b])
+- )
+- #stats.print_all()
+- r1 = '''
+- tests/test_functionality.py:98 a 2 0.000000 0.200350 0.100175
+- tests/test_functionality.py:101 b 1 0.000000 0.120000 0.100197
+- '''
+- self.assert_traces_almost_equal(r1, stats)
+- self.assertEqual(len(stats), 2)
+- stats = yappi.get_func_stats(
+- filter_callback=lambda x: yappi.
+- module_matches(x, [sys.modules[__name__]])
+- )
+- r1 = '''
+- tests/test_functionality.py:98 a 2 0.000000 0.230130 0.115065
+- tests/test_functionality.py:101 b 1 0.000000 0.120000 0.109011
+- tests/test_functionality.py:104 c 1 0.000000 0.000002 0.000002
+- tests/test_functionality.py:107 d 1 0.000000 0.000001 0.000001
+- '''
+- self.assert_traces_almost_equal(r1, stats)
+- self.assertEqual(len(stats), 4)
+-
+- stats = yappi.get_func_stats(
+- filter_callback=lambda x: yappi.func_matches(x, [time.sleep])
+- )
+- self.assertEqual(len(stats), 1)
+- r1 = '''
+- time.sleep 2 0.206804 0.220000 0.103402
+- '''
+- self.assert_traces_almost_equal(r1, stats)
+-
+- def test_print_formatting(self):
+-
+- def a():
+- pass
+-
+- def b():
+- a()
+-
+- func_cols = {
+- 1: ("name", 48),
+- 0: ("ncall", 5),
+- 2: ("tsub", 8),
+- }
+- thread_cols = {
+- 1: ("name", 48),
+- 0: ("ttot", 8),
+- }
+-
+- yappi.start()
+- a()
+- b()
+- yappi.stop()
+- fs = yappi.get_func_stats()
+- cs = fs[1].children
+- ts = yappi.get_thread_stats()
+- #fs.print_all(out=sys.stderr, columns={1:("name", 70), })
+- #cs.print_all(out=sys.stderr, columns=func_cols)
+- #ts.print_all(out=sys.stderr, columns=thread_cols)
+- #cs.print_all(out=sys.stderr, columns={})
+-
+- self.assertRaises(
+- yappi.YappiError, fs.print_all, columns={1: ("namee", 9)}
+- )
+- self.assertRaises(
+- yappi.YappiError, cs.print_all, columns={1: ("dd", 0)}
+- )
+- self.assertRaises(
+- yappi.YappiError, ts.print_all, columns={1: ("tidd", 0)}
+- )
+-
+- def test_get_clock(self):
+- yappi.set_clock_type('cpu')
+- self.assertEqual('cpu', yappi.get_clock_type())
+- clock_info = yappi.get_clock_info()
+- self.assertTrue('api' in clock_info)
+- self.assertTrue('resolution' in clock_info)
+-
+- yappi.set_clock_type('wall')
+- self.assertEqual('wall', yappi.get_clock_type())
+-
+- t0 = yappi.get_clock_time()
+- time.sleep(0.1)
+- duration = yappi.get_clock_time() - t0
+- self.assertTrue(0.05 < duration < 0.3)
+-
+- def test_profile_decorator(self):
+-
+- def aggregate(func, stats):
+- fname = f"tests/{func.__name__}.profile"
+- try:
+- stats.add(fname)
+- except OSError:
+- pass
+- stats.save(fname)
+- raise Exception("messing around")
+-
+- @yappi.profile(return_callback=aggregate)
+- def a(x, y):
+- if x + y == 25:
+- raise Exception("")
+- return x + y
+-
+- def b():
+- pass
+-
+- try:
+- os.remove(
+- "tests/a.profile"
+- ) # remove the one from prev test, if available
+- except:
+- pass
+-
+- # global profile is on to mess things up
+- yappi.start()
+- b()
+-
+- # assert functionality and call function at same time
+- try:
+- self.assertEqual(a(1, 2), 3)
+- except:
+- pass
+- try:
+- self.assertEqual(a(2, 5), 7)
+- except:
+- pass
+- try:
+- a(4, 21)
+- except:
+- pass
+- stats = yappi.get_func_stats().add("tests/a.profile")
+- fsa = utils.find_stat_by_name(stats, 'a')
+- self.assertEqual(fsa.ncall, 3)
+- self.assertEqual(len(stats), 1) # b() should be cleared out.
+-
+- @yappi.profile(return_callback=aggregate)
+- def count_down_rec(n):
+- if n == 0:
+- return
+- count_down_rec(n - 1)
+-
+- try:
+- os.remove(
+- "tests/count_down_rec.profile"
+- ) # remove the one from prev test, if available
+- except:
+- pass
+-
+- try:
+- count_down_rec(4)
+- except:
+- pass
+- try:
+- count_down_rec(3)
+- except:
+- pass
+-
+- stats = yappi.YFuncStats("tests/count_down_rec.profile")
+- fsrec = utils.find_stat_by_name(stats, 'count_down_rec')
+- self.assertEqual(fsrec.ncall, 9)
+- self.assertEqual(fsrec.nactualcall, 2)
+-
+- def test_strip_dirs(self):
+-
+- def a():
+- pass
+-
+- stats = utils.run_and_get_func_stats(a, )
+- stats.strip_dirs()
+- fsa = utils.find_stat_by_name(stats, "a")
+- self.assertEqual(fsa.module, os.path.basename(fsa.module))
+-
+- @unittest.skipIf(os.name == "nt", "do not run on Windows")
+- def test_run_as_script(self):
+- import re
+- p = subprocess.Popen(
+- ['yappi', os.path.join('./tests', 'run_as_script.py')],
+- stdout=subprocess.PIPE
+- )
+- out, err = p.communicate()
+- self.assertEqual(p.returncode, 0)
+- func_stats, thread_stats = re.split(
+- b'name\\s+id\\s+tid\\s+ttot\\s+scnt\\s*\n', out
+- )
+- self.assertTrue(b'FancyThread' in thread_stats)
+-
+- def test_yappi_overhead(self):
+- LOOP_COUNT = 100000
+-
+- def a():
+- pass
+-
+- def b():
+- for i in range(LOOP_COUNT):
+- a()
+-
+- t0 = time.time()
+- yappi.start()
+- b()
+- yappi.stop()
+- time_with_yappi = time.time() - t0
+- t0 = time.time()
+- b()
+- time_without_yappi = time.time() - t0
+- if time_without_yappi == 0:
+- time_without_yappi = 0.000001
+-
+- # in latest v0.82, I calculated this as close to "7.0" in my machine.
+- # however, %83 of this overhead is coming from tickcount(). The other %17
+- # seems to have been evenly distributed to the internal bookkeeping
+- # structures/algorithms which seems acceptable. Note that our test only
+- # tests one function being profiled at-a-time in a short interval.
+- # profiling high number of functions in a small time
+- # is a different beast, (which is pretty unlikely in most applications)
+- # So as a conclusion: I cannot see any optimization window for Yappi that
+- # is worth implementing as we will only optimize %17 of the time.
+- sys.stderr.write("\r\nYappi puts %0.1f times overhead to the profiled application in average.\r\n" % \
+- (time_with_yappi / time_without_yappi))
+-
+- def test_clear_stats_while_running(self):
+-
+- def a():
+- pass
+-
+- yappi.start()
+- a()
+- yappi.clear_stats()
+- a()
+- stats = yappi.get_func_stats()
+- fsa = utils.find_stat_by_name(stats, 'a')
+- self.assertEqual(fsa.ncall, 1)
+-
+- def test_generator(self):
+-
+- def _gen(n):
+- while (n > 0):
+- yield n
+- n -= 1
+-
+- yappi.start()
+- for x in _gen(5):
+- pass
+- self.assertTrue(
+- yappi.convert2pstats(yappi.get_func_stats()) is not None
+- )
+-
+- def test_slice_child_stats_and_strip_dirs(self):
+-
+- def b():
+- for i in range(10000000):
+- pass
+-
+- def a():
+- b()
+-
+- yappi.start(builtins=True)
+- a()
+- stats = yappi.get_func_stats()
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+- self.assertTrue(fsa.children[0:1] is not None)
+- prev_afullname = fsa.full_name
+- prev_bchildfullname = fsa.children[fsb].full_name
+- stats.strip_dirs()
+- self.assertTrue(len(prev_afullname) > len(fsa.full_name))
+- self.assertTrue(
+- len(prev_bchildfullname) > len(fsa.children[fsb].full_name)
+- )
+-
+- def test_children_stat_functions(self):
+- _timings = {"a_1": 5, "b_1": 3, "c_1": 1}
+- _yappi._set_test_timings(_timings)
+-
+- def b():
+- pass
+-
+- def c():
+- pass
+-
+- def a():
+- b()
+- c()
+-
+- yappi.start()
+- a()
+- b() # non-child call
+- c() # non-child call
+- stats = yappi.get_func_stats()
+- fsa = utils.find_stat_by_name(stats, 'a')
+- childs_of_a = fsa.children.get().sort("tavg", "desc")
+- prev_item = None
+- for item in childs_of_a:
+- if prev_item:
+- self.assertTrue(prev_item.tavg > item.tavg)
+- prev_item = item
+- childs_of_a.sort("name", "desc")
+- prev_item = None
+- for item in childs_of_a:
+- if prev_item:
+- self.assertTrue(prev_item.name > item.name)
+- prev_item = item
+- childs_of_a.clear()
+- self.assertTrue(childs_of_a.empty())
+-
+- def test_no_stats_different_clock_type_load(self):
+-
+- def a():
+- pass
+-
+- yappi.start()
+- a()
+- yappi.stop()
+- yappi.get_func_stats().save("tests/ystats1.ys")
+- yappi.clear_stats()
+- yappi.set_clock_type("WALL")
+- yappi.start()
+- yappi.stop()
+- stats = yappi.get_func_stats().add("tests/ystats1.ys")
+- fsa = utils.find_stat_by_name(stats, 'a')
+- self.assertTrue(fsa is not None)
+-
+- def test_subsequent_profile(self):
+- _timings = {"a_1": 1, "b_1": 1}
+- _yappi._set_test_timings(_timings)
+-
+- def a():
+- pass
+-
+- def b():
+- pass
+-
+- yappi.start()
+- a()
+- yappi.stop()
+- yappi.start()
+- b()
+- yappi.stop()
+- stats = yappi.get_func_stats()
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+- self.assertTrue(fsa is not None)
+- self.assertTrue(fsb is not None)
+- self.assertEqual(fsa.ttot, 1)
+- self.assertEqual(fsb.ttot, 1)
+-
+- def test_lambda(self):
+- f = lambda: time.sleep(0.3)
+- yappi.set_clock_type("wall")
+- yappi.start()
+- f()
+- stats = yappi.get_func_stats()
+- fsa = utils.find_stat_by_name(stats, '<lambda>')
+- self.assertTrue(fsa.ttot > 0.1)
+-
+- def test_module_stress(self):
+- self.assertEqual(yappi.is_running(), False)
+-
+- yappi.start()
+- yappi.clear_stats()
+- self.assertRaises(_yappi.error, yappi.set_clock_type, "wall")
+-
+- yappi.stop()
+- yappi.clear_stats()
+- yappi.set_clock_type("cpu")
+- self.assertRaises(yappi.YappiError, yappi.set_clock_type, "dummy")
+- self.assertEqual(yappi.is_running(), False)
+- yappi.clear_stats()
+- yappi.clear_stats()
+-
+- def test_stat_sorting(self):
+- _timings = {"a_1": 13, "b_1": 10, "a_2": 6, "b_2": 1}
+- _yappi._set_test_timings(_timings)
+-
+- self._ncall = 1
+-
+- def a():
+- b()
+-
+- def b():
+- if self._ncall == 2:
+- return
+- self._ncall += 1
+- a()
+-
+- stats = utils.run_and_get_func_stats(a)
+- stats = stats.sort("totaltime", "desc")
+- prev_stat = None
+- for stat in stats:
+- if prev_stat:
+- self.assertTrue(prev_stat.ttot >= stat.ttot)
+- prev_stat = stat
+- stats = stats.sort("totaltime", "asc")
+- prev_stat = None
+- for stat in stats:
+- if prev_stat:
+- self.assertTrue(prev_stat.ttot <= stat.ttot)
+- prev_stat = stat
+- stats = stats.sort("avgtime", "asc")
+- prev_stat = None
+- for stat in stats:
+- if prev_stat:
+- self.assertTrue(prev_stat.tavg <= stat.tavg)
+- prev_stat = stat
+- stats = stats.sort("name", "asc")
+- prev_stat = None
+- for stat in stats:
+- if prev_stat:
+- self.assertTrue(prev_stat.name <= stat.name)
+- prev_stat = stat
+- stats = stats.sort("subtime", "asc")
+- prev_stat = None
+- for stat in stats:
+- if prev_stat:
+- self.assertTrue(prev_stat.tsub <= stat.tsub)
+- prev_stat = stat
+-
+- self.assertRaises(
+- yappi.YappiError, stats.sort, "invalid_func_sorttype_arg"
+- )
+- self.assertRaises(
+- yappi.YappiError, stats.sort, "totaltime",
+- "invalid_func_sortorder_arg"
+- )
+-
+- def test_start_flags(self):
+- self.assertEqual(_yappi._get_start_flags(), None)
+- yappi.start()
+-
+- def a():
+- pass
+-
+- a()
+- self.assertEqual(_yappi._get_start_flags()["profile_builtins"], 0)
+- self.assertEqual(_yappi._get_start_flags()["profile_multicontext"], 1)
+- self.assertEqual(len(yappi.get_thread_stats()), 1)
+-
+- def test_builtin_profiling(self):
+-
+- def a():
+- time.sleep(0.4) # is a builtin function
+-
+- yappi.set_clock_type('wall')
+-
+- yappi.start(builtins=True)
+- a()
+- stats = yappi.get_func_stats()
+- fsa = utils.find_stat_by_name(stats, 'sleep')
+- self.assertTrue(fsa is not None)
+- self.assertTrue(fsa.ttot > 0.3)
+- yappi.stop()
+- yappi.clear_stats()
+-
+- def a():
+- pass
+-
+- yappi.start()
+- t = threading.Thread(target=a)
+- t.start()
+- t.join()
+- stats = yappi.get_func_stats()
+-
+- def test_singlethread_profiling(self):
+- yappi.set_clock_type('wall')
+-
+- def a():
+- time.sleep(0.2)
+-
+- class Worker1(threading.Thread):
+-
+- def a(self):
+- time.sleep(0.3)
+-
+- def run(self):
+- self.a()
+-
+- yappi.start(profile_threads=False)
+-
+- c = Worker1()
+- c.start()
+- c.join()
+- a()
+- stats = yappi.get_func_stats()
+- fsa1 = utils.find_stat_by_name(stats, 'Worker1.a')
+- fsa2 = utils.find_stat_by_name(stats, 'a')
+- self.assertTrue(fsa1 is None)
+- self.assertTrue(fsa2 is not None)
+- self.assertTrue(fsa2.ttot > 0.1)
+-
+- def test_run(self):
+-
+- def profiled():
+- pass
+-
+- yappi.clear_stats()
+- try:
+- with yappi.run():
+- profiled()
+- stats = yappi.get_func_stats()
+- finally:
+- yappi.clear_stats()
+-
+- self.assertIsNotNone(utils.find_stat_by_name(stats, 'profiled'))
+-
+- def test_run_recursive(self):
+-
+- def profiled():
+- pass
+-
+- def not_profiled():
+- pass
+-
+- yappi.clear_stats()
+- try:
+- with yappi.run():
+- with yappi.run():
+- profiled()
+- # Profiling stopped here
+- not_profiled()
+- stats = yappi.get_func_stats()
+- finally:
+- yappi.clear_stats()
+-
+- self.assertIsNotNone(utils.find_stat_by_name(stats, 'profiled'))
+- self.assertIsNone(utils.find_stat_by_name(stats, 'not_profiled'))
+-
+-
+-class StatSaveScenarios(utils.YappiUnitTestCase):
+-
+- def test_pstats_conversion(self):
+-
+- def pstat_id(fs):
+- return (fs.module, fs.lineno, fs.name)
+-
+- def a():
+- d()
+-
+- def b():
+- d()
+-
+- def c():
+- pass
+-
+- def d():
+- pass
+-
+- _timings = {"a_1": 12, "b_1": 7, "c_1": 5, "d_1": 2}
+- _yappi._set_test_timings(_timings)
+- stats = utils.run_and_get_func_stats(a, )
+- stats.strip_dirs()
+- stats.save("tests/a1.pstats", type="pstat")
+- fsa_pid = pstat_id(utils.find_stat_by_name(stats, "a"))
+- fsd_pid = pstat_id(utils.find_stat_by_name(stats, "d"))
+- yappi.clear_stats()
+- _yappi._set_test_timings(_timings)
+- stats = utils.run_and_get_func_stats(a, )
+- stats.strip_dirs()
+- stats.save("tests/a2.pstats", type="pstat")
+- yappi.clear_stats()
+- _yappi._set_test_timings(_timings)
+- stats = utils.run_and_get_func_stats(b, )
+- stats.strip_dirs()
+- stats.save("tests/b1.pstats", type="pstat")
+- fsb_pid = pstat_id(utils.find_stat_by_name(stats, "b"))
+- yappi.clear_stats()
+- _yappi._set_test_timings(_timings)
+- stats = utils.run_and_get_func_stats(c, )
+- stats.strip_dirs()
+- stats.save("tests/c1.pstats", type="pstat")
+- fsc_pid = pstat_id(utils.find_stat_by_name(stats, "c"))
+-
+- # merge saved stats and check pstats values are correct
+- import pstats
+- p = pstats.Stats(
+- 'tests/a1.pstats', 'tests/a2.pstats', 'tests/b1.pstats',
+- 'tests/c1.pstats'
+- )
+- p.strip_dirs()
+- # ct = ttot, tt = tsub
+- (cc, nc, tt, ct, callers) = p.stats[fsa_pid]
+- self.assertEqual(cc, nc, 2)
+- self.assertEqual(tt, 20)
+- self.assertEqual(ct, 24)
+- (cc, nc, tt, ct, callers) = p.stats[fsd_pid]
+- self.assertEqual(cc, nc, 3)
+- self.assertEqual(tt, 6)
+- self.assertEqual(ct, 6)
+- self.assertEqual(len(callers), 2)
+- (cc, nc, tt, ct) = callers[fsa_pid]
+- self.assertEqual(cc, nc, 2)
+- self.assertEqual(tt, 4)
+- self.assertEqual(ct, 4)
+- (cc, nc, tt, ct) = callers[fsb_pid]
+- self.assertEqual(cc, nc, 1)
+- self.assertEqual(tt, 2)
+- self.assertEqual(ct, 2)
+-
+- def test_merge_stats(self):
+- _timings = {
+- "a_1": 15,
+- "b_1": 14,
+- "c_1": 12,
+- "d_1": 10,
+- "e_1": 9,
+- "f_1": 7,
+- "g_1": 6,
+- "h_1": 5,
+- "i_1": 1
+- }
+- _yappi._set_test_timings(_timings)
+-
+- def a():
+- b()
+-
+- def b():
+- c()
+-
+- def c():
+- d()
+-
+- def d():
+- e()
+-
+- def e():
+- f()
+-
+- def f():
+- g()
+-
+- def g():
+- h()
+-
+- def h():
+- i()
+-
+- def i():
+- pass
+-
+- yappi.start()
+- a()
+- a()
+- yappi.stop()
+- stats = yappi.get_func_stats()
+- self.assertRaises(
+- NotImplementedError, stats.save, "", "INVALID_SAVE_TYPE"
+- )
+- stats.save("tests/ystats2.ys")
+- yappi.clear_stats()
+- _yappi._set_test_timings(_timings)
+- yappi.start()
+- a()
+- stats = yappi.get_func_stats().add("tests/ystats2.ys")
+- fsa = utils.find_stat_by_name(stats, "a")
+- fsb = utils.find_stat_by_name(stats, "b")
+- fsc = utils.find_stat_by_name(stats, "c")
+- fsd = utils.find_stat_by_name(stats, "d")
+- fse = utils.find_stat_by_name(stats, "e")
+- fsf = utils.find_stat_by_name(stats, "f")
+- fsg = utils.find_stat_by_name(stats, "g")
+- fsh = utils.find_stat_by_name(stats, "h")
+- fsi = utils.find_stat_by_name(stats, "i")
+- self.assertEqual(fsa.ttot, 45)
+- self.assertEqual(fsa.ncall, 3)
+- self.assertEqual(fsa.nactualcall, 3)
+- self.assertEqual(fsa.tsub, 3)
+- self.assertEqual(fsa.children[fsb].ttot, fsb.ttot)
+- self.assertEqual(fsa.children[fsb].tsub, fsb.tsub)
+- self.assertEqual(fsb.children[fsc].ttot, fsc.ttot)
+- self.assertEqual(fsb.children[fsc].tsub, fsc.tsub)
+- self.assertEqual(fsc.tsub, 6)
+- self.assertEqual(fsc.children[fsd].ttot, fsd.ttot)
+- self.assertEqual(fsc.children[fsd].tsub, fsd.tsub)
+- self.assertEqual(fsd.children[fse].ttot, fse.ttot)
+- self.assertEqual(fsd.children[fse].tsub, fse.tsub)
+- self.assertEqual(fse.children[fsf].ttot, fsf.ttot)
+- self.assertEqual(fse.children[fsf].tsub, fsf.tsub)
+- self.assertEqual(fsf.children[fsg].ttot, fsg.ttot)
+- self.assertEqual(fsf.children[fsg].tsub, fsg.tsub)
+- self.assertEqual(fsg.ttot, 18)
+- self.assertEqual(fsg.tsub, 3)
+- self.assertEqual(fsg.children[fsh].ttot, fsh.ttot)
+- self.assertEqual(fsg.children[fsh].tsub, fsh.tsub)
+- self.assertEqual(fsh.ttot, 15)
+- self.assertEqual(fsh.tsub, 12)
+- self.assertEqual(fsh.tavg, 5)
+- self.assertEqual(fsh.children[fsi].ttot, fsi.ttot)
+- self.assertEqual(fsh.children[fsi].tsub, fsi.tsub)
+- #stats.debug_print()
+-
+- def test_merge_multithreaded_stats(self):
+- import _yappi
+- timings = {"a_1": 2, "b_1": 1}
+- _yappi._set_test_timings(timings)
+-
+- def a():
+- pass
+-
+- def b():
+- pass
+-
+- yappi.start()
+- t = threading.Thread(target=a)
+- t.start()
+- t.join()
+- t = threading.Thread(target=b)
+- t.start()
+- t.join()
+- yappi.get_func_stats().save("tests/ystats1.ys")
+- yappi.clear_stats()
+- _yappi._set_test_timings(timings)
+- self.assertEqual(len(yappi.get_func_stats()), 0)
+- self.assertEqual(len(yappi.get_thread_stats()), 1)
+- t = threading.Thread(target=a)
+- t.start()
+- t.join()
+-
+- self.assertEqual(_yappi._get_start_flags()["profile_builtins"], 0)
+- self.assertEqual(_yappi._get_start_flags()["profile_multicontext"], 1)
+- yappi.get_func_stats().save("tests/ystats2.ys")
+-
+- stats = yappi.YFuncStats([
+- "tests/ystats1.ys",
+- "tests/ystats2.ys",
+- ])
+- fsa = utils.find_stat_by_name(stats, "a")
+- fsb = utils.find_stat_by_name(stats, "b")
+- self.assertEqual(fsa.ncall, 2)
+- self.assertEqual(fsb.ncall, 1)
+- self.assertEqual(fsa.tsub, fsa.ttot, 4)
+- self.assertEqual(fsb.tsub, fsb.ttot, 1)
+-
+- def test_merge_load_different_clock_types(self):
+- yappi.start(builtins=True)
+-
+- def a():
+- b()
+-
+- def b():
+- c()
+-
+- def c():
+- pass
+-
+- t = threading.Thread(target=a)
+- t.start()
+- t.join()
+- yappi.get_func_stats().sort("name", "asc").save("tests/ystats1.ys")
+- yappi.stop()
+- yappi.clear_stats()
+- yappi.start(builtins=False)
+- t = threading.Thread(target=a)
+- t.start()
+- t.join()
+- yappi.get_func_stats().save("tests/ystats2.ys")
+- yappi.stop()
+- self.assertRaises(_yappi.error, yappi.set_clock_type, "wall")
+- yappi.clear_stats()
+- yappi.set_clock_type("wall")
+- yappi.start()
+- t = threading.Thread(target=a)
+- t.start()
+- t.join()
+- yappi.get_func_stats().save("tests/ystats3.ys")
+- self.assertRaises(
+- yappi.YappiError,
+- yappi.YFuncStats().add("tests/ystats1.ys").add, "tests/ystats3.ys"
+- )
+- stats = yappi.YFuncStats(["tests/ystats1.ys",
+- "tests/ystats2.ys"]).sort("name")
+- fsa = utils.find_stat_by_name(stats, "a")
+- fsb = utils.find_stat_by_name(stats, "b")
+- fsc = utils.find_stat_by_name(stats, "c")
+- self.assertEqual(fsa.ncall, 2)
+- self.assertEqual(fsa.ncall, fsb.ncall, fsc.ncall)
+-
+- def test_merge_aabab_aabbc(self):
+- _timings = {
+- "a_1": 15,
+- "a_2": 14,
+- "b_1": 12,
+- "a_3": 10,
+- "b_2": 9,
+- "c_1": 4
+- }
+- _yappi._set_test_timings(_timings)
+-
+- def a():
+- if self._ncall == 1:
+- self._ncall += 1
+- a()
+- elif self._ncall == 5:
+- self._ncall += 1
+- a()
+- else:
+- b()
+-
+- def b():
+- if self._ncall == 2:
+- self._ncall += 1
+- a()
+- elif self._ncall == 6:
+- self._ncall += 1
+- b()
+- elif self._ncall == 7:
+- c()
+- else:
+- return
+-
+- def c():
+- pass
+-
+- self._ncall = 1
+- stats = utils.run_and_get_func_stats(a, )
+- stats.save("tests/ystats1.ys")
+- yappi.clear_stats()
+- _yappi._set_test_timings(_timings)
+- #stats.print_all()
+-
+- self._ncall = 5
+- stats = utils.run_and_get_func_stats(a, )
+- stats.save("tests/ystats2.ys")
+-
+- #stats.print_all()
+-
+- def a(): # same name but another function(code object)
+- pass
+-
+- yappi.start()
+- a()
+- stats = yappi.get_func_stats().add(
+- ["tests/ystats1.ys", "tests/ystats2.ys"]
+- )
+- #stats.print_all()
+- self.assertEqual(len(stats), 4)
+-
+- fsa = None
+- for stat in stats:
+- if stat.name == "a" and stat.ttot == 45:
+- fsa = stat
+- break
+- self.assertTrue(fsa is not None)
+-
+- self.assertEqual(fsa.ncall, 7)
+- self.assertEqual(fsa.nactualcall, 3)
+- self.assertEqual(fsa.ttot, 45)
+- self.assertEqual(fsa.tsub, 10)
+- fsb = utils.find_stat_by_name(stats, "b")
+- fsc = utils.find_stat_by_name(stats, "c")
+- self.assertEqual(fsb.ncall, 6)
+- self.assertEqual(fsb.nactualcall, 3)
+- self.assertEqual(fsb.ttot, 36)
+- self.assertEqual(fsb.tsub, 27)
+- self.assertEqual(fsb.tavg, 6)
+- self.assertEqual(fsc.ttot, 8)
+- self.assertEqual(fsc.tsub, 8)
+- self.assertEqual(fsc.tavg, 4)
+- self.assertEqual(fsc.nactualcall, fsc.ncall, 2)
+-
+-
+-class MultithreadedScenarios(utils.YappiUnitTestCase):
+-
+- def test_issue_32(self):
+- '''
+- Start yappi from different thread and we get Internal Error(15) as
+- the current_ctx_id() called while enumerating the threads in start()
+- and as it does not swap to the enumerated ThreadState* the THreadState_GetDict()
+- returns wrong object and thus sets an invalid id for the _ctx structure.
+-
+- When this issue happens multiple Threads have same tid as the internal ts_ptr
+- will be same for different contexts. So, let's see if that happens
+- '''
+-
+- def foo():
+- time.sleep(0.2)
+-
+- def bar():
+- time.sleep(0.1)
+-
+- def thread_func():
+- yappi.set_clock_type("wall")
+- yappi.start()
+-
+- bar()
+-
+- t = threading.Thread(target=thread_func)
+- t.start()
+- t.join()
+-
+- foo()
+-
+- yappi.stop()
+-
+- thread_ids = set()
+- for tstat in yappi.get_thread_stats():
+- self.assertTrue(tstat.tid not in thread_ids)
+- thread_ids.add(tstat.tid)
+-
+- def test_subsequent_profile(self):
+- WORKER_COUNT = 5
+-
+- def a():
+- pass
+-
+- def b():
+- pass
+-
+- def c():
+- pass
+-
+- _timings = {
+- "a_1": 3,
+- "b_1": 2,
+- "c_1": 1,
+- }
+-
+- yappi.start()
+-
+- def g():
+- pass
+-
+- g()
+- yappi.stop()
+- yappi.clear_stats()
+- _yappi._set_test_timings(_timings)
+- yappi.start()
+-
+- _dummy = []
+- for i in range(WORKER_COUNT):
+- t = threading.Thread(target=a)
+- t.start()
+- t.join()
+- for i in range(WORKER_COUNT):
+- t = threading.Thread(target=b)
+- t.start()
+- _dummy.append(t)
+- t.join()
+- for i in range(WORKER_COUNT):
+- t = threading.Thread(target=a)
+- t.start()
+- t.join()
+- for i in range(WORKER_COUNT):
+- t = threading.Thread(target=c)
+- t.start()
+- t.join()
+- yappi.stop()
+- yappi.start()
+-
+- def f():
+- pass
+-
+- f()
+- stats = yappi.get_func_stats()
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+- fsc = utils.find_stat_by_name(stats, 'c')
+- self.assertEqual(fsa.ncall, 10)
+- self.assertEqual(fsb.ncall, 5)
+- self.assertEqual(fsc.ncall, 5)
+- self.assertEqual(fsa.ttot, fsa.tsub, 30)
+- self.assertEqual(fsb.ttot, fsb.tsub, 10)
+- self.assertEqual(fsc.ttot, fsc.tsub, 5)
+-
+- # MACOSx optimizes by only creating one worker thread
+- self.assertTrue(len(yappi.get_thread_stats()) >= 2)
+-
+- def test_basic(self):
+- yappi.set_clock_type('wall')
+-
+- def dummy():
+- pass
+-
+- def a():
+- time.sleep(0.2)
+-
+- class Worker1(threading.Thread):
+-
+- def a(self):
+- time.sleep(0.3)
+-
+- def run(self):
+- self.a()
+-
+- yappi.start(builtins=False, profile_threads=True)
+-
+- c = Worker1()
+- c.start()
+- c.join()
+- a()
+- stats = yappi.get_func_stats()
+- fsa1 = utils.find_stat_by_name(stats, 'Worker1.a')
+- fsa2 = utils.find_stat_by_name(stats, 'a')
+- self.assertTrue(fsa1 is not None)
+- self.assertTrue(fsa2 is not None)
+- self.assertTrue(fsa1.ttot > 0.2)
+- self.assertTrue(fsa2.ttot > 0.1)
+- tstats = yappi.get_thread_stats()
+- self.assertEqual(len(tstats), 2)
+- tsa = utils.find_stat_by_name(tstats, 'Worker1')
+- tsm = utils.find_stat_by_name(tstats, '_MainThread')
+- dummy() # call dummy to force ctx name to be retrieved again.
+- self.assertTrue(tsa is not None)
+- # TODO: I put dummy() to fix below, remove the comments after a while.
+- self.assertTrue( # FIX: I see this fails sometimes?
+- tsm is not None,
+- f"Could not find \"_MainThread\". Found: {', '.join(utils.get_stat_names(tstats))}")
+-
+- def test_ctx_stats(self):
+- from threading import Thread
+- DUMMY_WORKER_COUNT = 5
+- yappi.start()
+-
+- class DummyThread(Thread):
+- pass
+-
+- def dummy():
+- pass
+-
+- def dummy_worker():
+- pass
+-
+- for i in range(DUMMY_WORKER_COUNT):
+- t = DummyThread(target=dummy_worker)
+- t.start()
+- t.join()
+- yappi.stop()
+- stats = yappi.get_thread_stats()
+- tsa = utils.find_stat_by_name(stats, "DummyThread")
+- self.assertTrue(tsa is not None)
+- yappi.clear_stats()
+- time.sleep(1.0)
+- _timings = {
+- "a_1": 6,
+- "b_1": 5,
+- "c_1": 3,
+- "d_1": 1,
+- "a_2": 4,
+- "b_2": 3,
+- "c_2": 2,
+- "d_2": 1
+- }
+- _yappi._set_test_timings(_timings)
+-
+- class Thread1(Thread):
+- pass
+-
+- class Thread2(Thread):
+- pass
+-
+- def a():
+- b()
+-
+- def b():
+- c()
+-
+- def c():
+- d()
+-
+- def d():
+- time.sleep(0.6)
+-
+- yappi.set_clock_type("wall")
+- yappi.start()
+- t1 = Thread1(target=a)
+- t1.start()
+- t2 = Thread2(target=a)
+- t2.start()
+- t1.join()
+- t2.join()
+- stats = yappi.get_thread_stats()
+-
+- # the fist clear_stats clears the context table?
+- tsa = utils.find_stat_by_name(stats, "DummyThread")
+- self.assertTrue(tsa is None)
+-
+- tst1 = utils.find_stat_by_name(stats, "Thread1")
+- tst2 = utils.find_stat_by_name(stats, "Thread2")
+- tsmain = utils.find_stat_by_name(stats, "_MainThread")
+- dummy() # call dummy to force ctx name to be retrieved again.
+- self.assertTrue(len(stats) == 3)
+- self.assertTrue(tst1 is not None)
+- self.assertTrue(tst2 is not None)
+- # TODO: I put dummy() to fix below, remove the comments after a while.
+- self.assertTrue( # FIX: I see this fails sometimes
+- tsmain is not None,
+- f"Could not find \"_MainThread\". Found: {', '.join(utils.get_stat_names(stats))}")
+- self.assertTrue(1.0 > tst2.ttot >= 0.5)
+- self.assertTrue(1.0 > tst1.ttot >= 0.5)
+-
+- # test sorting of the ctx stats
+- stats = stats.sort("totaltime", "desc")
+- prev_stat = None
+- for stat in stats:
+- if prev_stat:
+- self.assertTrue(prev_stat.ttot >= stat.ttot)
+- prev_stat = stat
+- stats = stats.sort("totaltime", "asc")
+- prev_stat = None
+- for stat in stats:
+- if prev_stat:
+- self.assertTrue(prev_stat.ttot <= stat.ttot)
+- prev_stat = stat
+- stats = stats.sort("schedcount", "desc")
+- prev_stat = None
+- for stat in stats:
+- if prev_stat:
+- self.assertTrue(prev_stat.sched_count >= stat.sched_count)
+- prev_stat = stat
+- stats = stats.sort("name", "desc")
+- prev_stat = None
+- for stat in stats:
+- if prev_stat:
+- self.assertTrue(prev_stat.name.lower() >= stat.name.lower())
+- prev_stat = stat
+- self.assertRaises(
+- yappi.YappiError, stats.sort, "invalid_thread_sorttype_arg"
+- )
+- self.assertRaises(
+- yappi.YappiError, stats.sort, "invalid_thread_sortorder_arg"
+- )
+-
+- def test_ctx_stats_cpu(self):
+-
+- def get_thread_name():
+- try:
+- return threading.current_thread().name
+- except AttributeError:
+- return "Anonymous"
+-
+- def burn_cpu(sec):
+- t0 = yappi.get_clock_time()
+- elapsed = 0
+- while (elapsed < sec):
+- for _ in range(1000):
+- pass
+- elapsed = yappi.get_clock_time() - t0
+-
+- def test():
+-
+- ts = []
+- for i in (0.01, 0.05, 0.1):
+- t = threading.Thread(target=burn_cpu, args=(i, ))
+- t.name = f"burn_cpu-{str(i)}"
+- t.start()
+- ts.append(t)
+- for t in ts:
+- t.join()
+-
+- yappi.set_clock_type("cpu")
+- yappi.set_context_name_callback(get_thread_name)
+-
+- yappi.start()
+-
+- test()
+-
+- yappi.stop()
+-
+- tstats = yappi.get_thread_stats()
+- r1 = '''
+- burn_cpu-0.1 3 123145356058624 0.100105 8
+- burn_cpu-0.05 2 123145361313792 0.050149 8
+- burn_cpu-0.01 1 123145356058624 0.010127 2
+- MainThread 0 4321620864 0.001632 6
+- '''
+- self.assert_ctx_stats_almost_equal(r1, tstats)
+-
+- def test_producer_consumer_with_queues(self):
+- # we currently just stress yappi, no functionality test is done here.
+- yappi.start()
+- from queue import Queue
+- from threading import Thread
+- WORKER_THREAD_COUNT = 50
+- WORK_ITEM_COUNT = 2000
+-
+- def worker():
+- while True:
+- item = q.get()
+- # do the work with item
+- q.task_done()
+-
+- q = Queue()
+- for i in range(WORKER_THREAD_COUNT):
+- t = Thread(target=worker)
+- t.daemon = True
+- t.start()
+-
+- for item in range(WORK_ITEM_COUNT):
+- q.put(item)
+- q.join() # block until all tasks are done
+- #yappi.get_func_stats().sort("callcount").print_all()
+- yappi.stop()
+-
+- def test_temporary_lock_waiting(self):
+- yappi.start()
+- _lock = threading.Lock()
+-
+- def worker():
+- _lock.acquire()
+- try:
+- time.sleep(1.0)
+- finally:
+- _lock.release()
+-
+- t1 = threading.Thread(target=worker)
+- t2 = threading.Thread(target=worker)
+- t1.start()
+- t2.start()
+- t1.join()
+- t2.join()
+- #yappi.get_func_stats().sort("callcount").print_all()
+- yappi.stop()
+-
+- @unittest.skipIf(os.name != "posix", "requires Posix compliant OS")
+- def test_signals_with_blocking_calls(self):
+- import signal, os, time
+-
+- # just to verify if signal is handled correctly and stats/yappi are not corrupted.
+- def handler(signum, frame):
+- raise Exception("Signal handler executed!")
+-
+- yappi.start()
+- signal.signal(signal.SIGALRM, handler)
+- signal.alarm(1)
+- self.assertRaises(Exception, time.sleep, 2)
+- stats = yappi.get_func_stats()
+- fsh = utils.find_stat_by_name(stats, "handler")
+- self.assertTrue(fsh is not None)
+-
+- def test_concurrent_futures(self):
+- yappi.start()
+- from concurrent.futures import ThreadPoolExecutor
+- with ThreadPoolExecutor(max_workers=5) as executor:
+- f = executor.submit(pow, 5, 2)
+- self.assertEqual(f.result(), 25)
+- time.sleep(1.0)
+- yappi.stop()
+-
+- def test_barrier(self):
+- yappi.start()
+- b = threading.Barrier(2, timeout=1)
+-
+- def worker():
+- try:
+- b.wait()
+- except threading.BrokenBarrierError:
+- pass
+- except Exception:
+- raise Exception("BrokenBarrierError not raised")
+-
+- t1 = threading.Thread(target=worker)
+- t1.start()
+- #b.wait()
+- t1.join()
+- yappi.stop()
+-
+-
+-class NonRecursiveFunctions(utils.YappiUnitTestCase):
+-
+- def test_abcd(self):
+- _timings = {"a_1": 6, "b_1": 5, "c_1": 3, "d_1": 1}
+- _yappi._set_test_timings(_timings)
+-
+- def a():
+- b()
+-
+- def b():
+- c()
+-
+- def c():
+- d()
+-
+- def d():
+- pass
+-
+- stats = utils.run_and_get_func_stats(a)
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+- fsc = utils.find_stat_by_name(stats, 'c')
+- fsd = utils.find_stat_by_name(stats, 'd')
+- cfsab = fsa.children[fsb]
+- cfsbc = fsb.children[fsc]
+- cfscd = fsc.children[fsd]
+-
+- self.assertEqual(fsa.ttot, 6)
+- self.assertEqual(fsa.tsub, 1)
+- self.assertEqual(fsb.ttot, 5)
+- self.assertEqual(fsb.tsub, 2)
+- self.assertEqual(fsc.ttot, 3)
+- self.assertEqual(fsc.tsub, 2)
+- self.assertEqual(fsd.ttot, 1)
+- self.assertEqual(fsd.tsub, 1)
+- self.assertEqual(cfsab.ttot, 5)
+- self.assertEqual(cfsab.tsub, 2)
+- self.assertEqual(cfsbc.ttot, 3)
+- self.assertEqual(cfsbc.tsub, 2)
+- self.assertEqual(cfscd.ttot, 1)
+- self.assertEqual(cfscd.tsub, 1)
+-
+- def test_stop_in_middle(self):
+- _timings = {"a_1": 6, "b_1": 4}
+- _yappi._set_test_timings(_timings)
+-
+- def a():
+- b()
+- yappi.stop()
+-
+- def b():
+- time.sleep(0.2)
+-
+- yappi.start()
+- a()
+- stats = yappi.get_func_stats()
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+-
+- self.assertEqual(fsa.ncall, 1)
+- self.assertEqual(fsa.nactualcall, 0)
+- self.assertEqual(fsa.ttot, 0) # no call_leave called
+- self.assertEqual(fsa.tsub, 0) # no call_leave called
+- self.assertEqual(fsb.ttot, 4)
+-
+-
+-class RecursiveFunctions(utils.YappiUnitTestCase):
+-
+- def test_fibonacci(self):
+-
+- def fib(n):
+- if n > 1:
+- return fib(n - 1) + fib(n - 2)
+- else:
+- return n
+-
+- stats = utils.run_and_get_func_stats(fib, 22)
+- fs = utils.find_stat_by_name(stats, 'fib')
+- self.assertEqual(fs.ncall, 57313)
+- self.assertEqual(fs.ttot, fs.tsub)
+-
+- def test_abcadc(self):
+- _timings = {
+- "a_1": 20,
+- "b_1": 19,
+- "c_1": 17,
+- "a_2": 13,
+- "d_1": 12,
+- "c_2": 10,
+- "a_3": 5
+- }
+- _yappi._set_test_timings(_timings)
+-
+- def a(n):
+- if n == 3:
+- return
+- if n == 1 + 1:
+- d(n)
+- else:
+- b(n)
+-
+- def b(n):
+- c(n)
+-
+- def c(n):
+- a(n + 1)
+-
+- def d(n):
+- c(n)
+-
+- stats = utils.run_and_get_func_stats(a, 1)
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+- fsc = utils.find_stat_by_name(stats, 'c')
+- fsd = utils.find_stat_by_name(stats, 'd')
+- self.assertEqual(fsa.ncall, 3)
+- self.assertEqual(fsa.nactualcall, 1)
+- self.assertEqual(fsa.ttot, 20)
+- self.assertEqual(fsa.tsub, 7)
+- self.assertEqual(fsb.ttot, 19)
+- self.assertEqual(fsb.tsub, 2)
+- self.assertEqual(fsc.ttot, 17)
+- self.assertEqual(fsc.tsub, 9)
+- self.assertEqual(fsd.ttot, 12)
+- self.assertEqual(fsd.tsub, 2)
+- cfsca = fsc.children[fsa]
+- self.assertEqual(cfsca.nactualcall, 0)
+- self.assertEqual(cfsca.ncall, 2)
+- self.assertEqual(cfsca.ttot, 13)
+- self.assertEqual(cfsca.tsub, 6)
+-
+- def test_aaaa(self):
+- _timings = {"d_1": 9, "d_2": 7, "d_3": 3, "d_4": 2}
+- _yappi._set_test_timings(_timings)
+-
+- def d(n):
+- if n == 3:
+- return
+- d(n + 1)
+-
+- stats = utils.run_and_get_func_stats(d, 0)
+- fsd = utils.find_stat_by_name(stats, 'd')
+- self.assertEqual(fsd.ncall, 4)
+- self.assertEqual(fsd.nactualcall, 1)
+- self.assertEqual(fsd.ttot, 9)
+- self.assertEqual(fsd.tsub, 9)
+- cfsdd = fsd.children[fsd]
+- self.assertEqual(cfsdd.ttot, 7)
+- self.assertEqual(cfsdd.tsub, 7)
+- self.assertEqual(cfsdd.ncall, 3)
+- self.assertEqual(cfsdd.nactualcall, 0)
+-
+- def test_abcabc(self):
+- _timings = {
+- "a_1": 20,
+- "b_1": 19,
+- "c_1": 17,
+- "a_2": 13,
+- "b_2": 11,
+- "c_2": 9,
+- "a_3": 6
+- }
+- _yappi._set_test_timings(_timings)
+-
+- def a(n):
+- if n == 3:
+- return
+- else:
+- b(n)
+-
+- def b(n):
+- c(n)
+-
+- def c(n):
+- a(n + 1)
+-
+- stats = utils.run_and_get_func_stats(a, 1)
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+- fsc = utils.find_stat_by_name(stats, 'c')
+- self.assertEqual(fsa.ncall, 3)
+- self.assertEqual(fsa.nactualcall, 1)
+- self.assertEqual(fsa.ttot, 20)
+- self.assertEqual(fsa.tsub, 9)
+- self.assertEqual(fsb.ttot, 19)
+- self.assertEqual(fsb.tsub, 4)
+- self.assertEqual(fsc.ttot, 17)
+- self.assertEqual(fsc.tsub, 7)
+- cfsab = fsa.children[fsb]
+- cfsbc = fsb.children[fsc]
+- cfsca = fsc.children[fsa]
+- self.assertEqual(cfsab.ttot, 19)
+- self.assertEqual(cfsab.tsub, 4)
+- self.assertEqual(cfsbc.ttot, 17)
+- self.assertEqual(cfsbc.tsub, 7)
+- self.assertEqual(cfsca.ttot, 13)
+- self.assertEqual(cfsca.tsub, 8)
+-
+- def test_abcbca(self):
+- _timings = {"a_1": 10, "b_1": 9, "c_1": 7, "b_2": 4, "c_2": 2, "a_2": 1}
+- _yappi._set_test_timings(_timings)
+- self._ncall = 1
+-
+- def a():
+- if self._ncall == 1:
+- b()
+- else:
+- return
+-
+- def b():
+- c()
+-
+- def c():
+- if self._ncall == 1:
+- self._ncall += 1
+- b()
+- else:
+- a()
+-
+- stats = utils.run_and_get_func_stats(a)
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+- fsc = utils.find_stat_by_name(stats, 'c')
+- cfsab = fsa.children[fsb]
+- cfsbc = fsb.children[fsc]
+- cfsca = fsc.children[fsa]
+- self.assertEqual(fsa.ttot, 10)
+- self.assertEqual(fsa.tsub, 2)
+- self.assertEqual(fsb.ttot, 9)
+- self.assertEqual(fsb.tsub, 4)
+- self.assertEqual(fsc.ttot, 7)
+- self.assertEqual(fsc.tsub, 4)
+- self.assertEqual(cfsab.ttot, 9)
+- self.assertEqual(cfsab.tsub, 2)
+- self.assertEqual(cfsbc.ttot, 7)
+- self.assertEqual(cfsbc.tsub, 4)
+- self.assertEqual(cfsca.ttot, 1)
+- self.assertEqual(cfsca.tsub, 1)
+- self.assertEqual(cfsca.ncall, 1)
+- self.assertEqual(cfsca.nactualcall, 0)
+-
+- def test_aabccb(self):
+- _timings = {
+- "a_1": 13,
+- "a_2": 11,
+- "b_1": 9,
+- "c_1": 5,
+- "c_2": 3,
+- "b_2": 1
+- }
+- _yappi._set_test_timings(_timings)
+- self._ncall = 1
+-
+- def a():
+- if self._ncall == 1:
+- self._ncall += 1
+- a()
+- else:
+- b()
+-
+- def b():
+- if self._ncall == 3:
+- return
+- else:
+- c()
+-
+- def c():
+- if self._ncall == 2:
+- self._ncall += 1
+- c()
+- else:
+- b()
+-
+- stats = utils.run_and_get_func_stats(a)
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+- fsc = utils.find_stat_by_name(stats, 'c')
+- cfsaa = fsa.children[fsa.index]
+- cfsab = fsa.children[fsb]
+- cfsbc = fsb.children[fsc.full_name]
+- cfscc = fsc.children[fsc]
+- cfscb = fsc.children[fsb]
+- self.assertEqual(fsb.ttot, 9)
+- self.assertEqual(fsb.tsub, 5)
+- self.assertEqual(cfsbc.ttot, 5)
+- self.assertEqual(cfsbc.tsub, 2)
+- self.assertEqual(fsa.ttot, 13)
+- self.assertEqual(fsa.tsub, 4)
+- self.assertEqual(cfsab.ttot, 9)
+- self.assertEqual(cfsab.tsub, 4)
+- self.assertEqual(cfsaa.ttot, 11)
+- self.assertEqual(cfsaa.tsub, 2)
+- self.assertEqual(fsc.ttot, 5)
+- self.assertEqual(fsc.tsub, 4)
+-
+- def test_abaa(self):
+- _timings = {"a_1": 13, "b_1": 10, "a_2": 9, "a_3": 5}
+- _yappi._set_test_timings(_timings)
+-
+- self._ncall = 1
+-
+- def a():
+- if self._ncall == 1:
+- b()
+- elif self._ncall == 2:
+- self._ncall += 1
+- a()
+- else:
+- return
+-
+- def b():
+- self._ncall += 1
+- a()
+-
+- stats = utils.run_and_get_func_stats(a)
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+- cfsaa = fsa.children[fsa]
+- cfsba = fsb.children[fsa]
+- self.assertEqual(fsb.ttot, 10)
+- self.assertEqual(fsb.tsub, 1)
+- self.assertEqual(fsa.ttot, 13)
+- self.assertEqual(fsa.tsub, 12)
+- self.assertEqual(cfsaa.ttot, 5)
+- self.assertEqual(cfsaa.tsub, 5)
+- self.assertEqual(cfsba.ttot, 9)
+- self.assertEqual(cfsba.tsub, 4)
+-
+- def test_aabb(self):
+- _timings = {"a_1": 13, "a_2": 10, "b_1": 9, "b_2": 5}
+- _yappi._set_test_timings(_timings)
+-
+- self._ncall = 1
+-
+- def a():
+- if self._ncall == 1:
+- self._ncall += 1
+- a()
+- elif self._ncall == 2:
+- b()
+- else:
+- return
+-
+- def b():
+- if self._ncall == 2:
+- self._ncall += 1
+- b()
+- else:
+- return
+-
+- stats = utils.run_and_get_func_stats(a)
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+- cfsaa = fsa.children[fsa]
+- cfsab = fsa.children[fsb]
+- cfsbb = fsb.children[fsb]
+- self.assertEqual(fsa.ttot, 13)
+- self.assertEqual(fsa.tsub, 4)
+- self.assertEqual(fsb.ttot, 9)
+- self.assertEqual(fsb.tsub, 9)
+- self.assertEqual(cfsaa.ttot, 10)
+- self.assertEqual(cfsaa.tsub, 1)
+- self.assertEqual(cfsab.ttot, 9)
+- self.assertEqual(cfsab.tsub, 4)
+- self.assertEqual(cfsbb.ttot, 5)
+- self.assertEqual(cfsbb.tsub, 5)
+-
+- def test_abbb(self):
+- _timings = {"a_1": 13, "b_1": 10, "b_2": 6, "b_3": 1}
+- _yappi._set_test_timings(_timings)
+-
+- self._ncall = 1
+-
+- def a():
+- if self._ncall == 1:
+- b()
+-
+- def b():
+- if self._ncall == 3:
+- return
+- self._ncall += 1
+- b()
+-
+- stats = utils.run_and_get_func_stats(a)
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+- cfsab = fsa.children[fsb]
+- cfsbb = fsb.children[fsb]
+- self.assertEqual(fsa.ttot, 13)
+- self.assertEqual(fsa.tsub, 3)
+- self.assertEqual(fsb.ttot, 10)
+- self.assertEqual(fsb.tsub, 10)
+- self.assertEqual(fsb.ncall, 3)
+- self.assertEqual(fsb.nactualcall, 1)
+- self.assertEqual(cfsab.ttot, 10)
+- self.assertEqual(cfsab.tsub, 4)
+- self.assertEqual(cfsbb.ttot, 6)
+- self.assertEqual(cfsbb.tsub, 6)
+- self.assertEqual(cfsbb.nactualcall, 0)
+- self.assertEqual(cfsbb.ncall, 2)
+-
+- def test_aaab(self):
+- _timings = {"a_1": 13, "a_2": 10, "a_3": 6, "b_1": 1}
+- _yappi._set_test_timings(_timings)
+-
+- self._ncall = 1
+-
+- def a():
+- if self._ncall == 3:
+- b()
+- return
+- self._ncall += 1
+- a()
+-
+- def b():
+- return
+-
+- stats = utils.run_and_get_func_stats(a)
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+- cfsaa = fsa.children[fsa]
+- cfsab = fsa.children[fsb]
+- self.assertEqual(fsa.ttot, 13)
+- self.assertEqual(fsa.tsub, 12)
+- self.assertEqual(fsb.ttot, 1)
+- self.assertEqual(fsb.tsub, 1)
+- self.assertEqual(cfsaa.ttot, 10)
+- self.assertEqual(cfsaa.tsub, 9)
+- self.assertEqual(cfsab.ttot, 1)
+- self.assertEqual(cfsab.tsub, 1)
+-
+- def test_abab(self):
+- _timings = {"a_1": 13, "b_1": 10, "a_2": 6, "b_2": 1}
+- _yappi._set_test_timings(_timings)
+-
+- self._ncall = 1
+-
+- def a():
+- b()
+-
+- def b():
+- if self._ncall == 2:
+- return
+- self._ncall += 1
+- a()
+-
+- stats = utils.run_and_get_func_stats(a)
+- fsa = utils.find_stat_by_name(stats, 'a')
+- fsb = utils.find_stat_by_name(stats, 'b')
+- cfsab = fsa.children[fsb]
+- cfsba = fsb.children[fsa]
+- self.assertEqual(fsa.ttot, 13)
+- self.assertEqual(fsa.tsub, 8)
+- self.assertEqual(fsb.ttot, 10)
+- self.assertEqual(fsb.tsub, 5)
+- self.assertEqual(cfsab.ttot, 10)
+- self.assertEqual(cfsab.tsub, 5)
+- self.assertEqual(cfsab.ncall, 2)
+- self.assertEqual(cfsab.nactualcall, 1)
+- self.assertEqual(cfsba.ttot, 6)
+- self.assertEqual(cfsba.tsub, 5)
+-
+-
+-if __name__ == '__main__':
+- # import sys;sys.argv = ['', 'BasicUsage.test_run_as_script']
+- # import sys;sys.argv = ['', 'MultithreadedScenarios.test_subsequent_profile']
+- unittest.main()
++import os
++import sys
++import time
++import threading
++import unittest
++import yappi
++import _yappi
++import utils
++import multiprocessing
++import subprocess
++
++_counter = 0
++
++
++class BasicUsage(utils.YappiUnitTestCase):
++
++ def test_callback_function_int_return_overflow(self):
++ # this test is just here to check if any errors are generated, as the err
++ # is printed in C side, I did not include it here. THere are ways to test
++ # this deterministically, I did not bother
++ import ctypes
++
++ def _unsigned_overflow_margin():
++ return 2**(ctypes.sizeof(ctypes.c_void_p) * 8) - 1
++
++ def foo():
++ pass
++
++ #with utils.captured_output() as (out, err):
++ yappi.set_context_id_callback(_unsigned_overflow_margin)
++ yappi.set_tag_callback(_unsigned_overflow_margin)
++ yappi.start()
++ foo()
++
++ def test_issue60(self):
++
++ def foo():
++ buf = bytearray()
++ buf += b't' * 200
++ view = memoryview(buf)[10:]
++ view = view.tobytes()
++ del buf[:10] # this throws exception
++ return view
++
++ yappi.start(builtins=True)
++ foo()
++ self.assertTrue(
++ len(
++ yappi.get_func_stats(
++ filter_callback=lambda x: yappi.
++ func_matches(x, [memoryview.tobytes])
++ )
++ ) > 0
++ )
++ yappi.stop()
++
++ def test_issue54(self):
++
++ def _tag_cbk():
++ global _counter
++ _counter += 1
++ return _counter
++
++ def a():
++ pass
++
++ def b():
++ pass
++
++ yappi.set_tag_callback(_tag_cbk)
++ yappi.start()
++ a()
++ a()
++ a()
++ yappi.stop()
++ stats = yappi.get_func_stats()
++ self.assertEqual(stats.pop().ncall, 3) # aggregated if no tag is given
++ stats = yappi.get_func_stats(tag=1)
++
++ for i in range(1, 3):
++ stats = yappi.get_func_stats(tag=i)
++ stats = yappi.get_func_stats(
++ tag=i, filter_callback=lambda x: yappi.func_matches(x, [a])
++ )
++
++ stat = stats.pop()
++ self.assertEqual(stat.ncall, 1)
++
++ yappi.set_tag_callback(None)
++ yappi.clear_stats()
++ yappi.start()
++ b()
++ b()
++ stats = yappi.get_func_stats()
++ self.assertEqual(len(stats), 1)
++ stat = stats.pop()
++ self.assertEqual(stat.ncall, 2)
++
++ def test_filter(self):
++
++ def a():
++ pass
++
++ def b():
++ a()
++
++ def c():
++ b()
++
++ _TCOUNT = 5
++
++ ts = []
++ yappi.start()
++ for i in range(_TCOUNT):
++ t = threading.Thread(target=c)
++ t.start()
++ ts.append(t)
++
++ for t in ts:
++ t.join()
++
++ yappi.stop()
++
++ ctx_ids = []
++ for tstat in yappi.get_thread_stats():
++ if tstat.name == '_MainThread':
++ main_ctx_id = tstat.id
++ else:
++ ctx_ids.append(tstat.id)
++
++ fstats = yappi.get_func_stats(filter={"ctx_id": 9})
++ self.assertTrue(fstats.empty())
++ fstats = yappi.get_func_stats(
++ filter={
++ "ctx_id": main_ctx_id,
++ "name": "c"
++ }
++ ) # main thread
++ self.assertTrue(fstats.empty())
++
++ for i in ctx_ids:
++ fstats = yappi.get_func_stats(
++ filter={
++ "ctx_id": i,
++ "name": "a",
++ "ncall": 1
++ }
++ )
++ self.assertEqual(fstats.pop().ncall, 1)
++ fstats = yappi.get_func_stats(filter={"ctx_id": i, "name": "b"})
++ self.assertEqual(fstats.pop().ncall, 1)
++ fstats = yappi.get_func_stats(filter={"ctx_id": i, "name": "c"})
++ self.assertEqual(fstats.pop().ncall, 1)
++
++ yappi.clear_stats()
++ yappi.start(builtins=True)
++ time.sleep(0.1)
++ yappi.stop()
++ fstats = yappi.get_func_stats(filter={"module": "time"})
++ self.assertEqual(len(fstats), 1)
++
++ # invalid filters`
++ self.assertRaises(
++ Exception, yappi.get_func_stats, filter={'tag': "sss"}
++ )
++ self.assertRaises(
++ Exception, yappi.get_func_stats, filter={'ctx_id': "None"}
++ )
++
++ def test_filter_callback(self):
++
++ def a():
++ time.sleep(0.1)
++
++ def b():
++ a()
++
++ def c():
++ pass
++
++ def d():
++ pass
++
++ yappi.set_clock_type("wall")
++ yappi.start(builtins=True)
++ a()
++ b()
++ c()
++ d()
++ stats = yappi.get_func_stats(
++ filter_callback=lambda x: yappi.func_matches(x, [a, b])
++ )
++ #stats.print_all()
++ r1 = '''
++ tests/test_functionality.py:98 a 2 0.000000 0.200350 0.100175
++ tests/test_functionality.py:101 b 1 0.000000 0.120000 0.100197
++ '''
++ self.assert_traces_almost_equal(r1, stats)
++ self.assertEqual(len(stats), 2)
++ stats = yappi.get_func_stats(
++ filter_callback=lambda x: yappi.
++ module_matches(x, [sys.modules[__name__]])
++ )
++ r1 = '''
++ tests/test_functionality.py:98 a 2 0.000000 0.230130 0.115065
++ tests/test_functionality.py:101 b 1 0.000000 0.120000 0.109011
++ tests/test_functionality.py:104 c 1 0.000000 0.000002 0.000002
++ tests/test_functionality.py:107 d 1 0.000000 0.000001 0.000001
++ '''
++ self.assert_traces_almost_equal(r1, stats)
++ self.assertEqual(len(stats), 4)
++
++ stats = yappi.get_func_stats(
++ filter_callback=lambda x: yappi.func_matches(x, [time.sleep])
++ )
++ self.assertEqual(len(stats), 1)
++ r1 = '''
++ time.sleep 2 0.206804 0.220000 0.103402
++ '''
++ self.assert_traces_almost_equal(r1, stats)
++
++ def test_print_formatting(self):
++
++ def a():
++ pass
++
++ def b():
++ a()
++
++ func_cols = {
++ 1: ("name", 48),
++ 0: ("ncall", 5),
++ 2: ("tsub", 8),
++ }
++ thread_cols = {
++ 1: ("name", 48),
++ 0: ("ttot", 8),
++ }
++
++ yappi.start()
++ a()
++ b()
++ yappi.stop()
++ fs = yappi.get_func_stats()
++ cs = fs[1].children
++ ts = yappi.get_thread_stats()
++ #fs.print_all(out=sys.stderr, columns={1:("name", 70), })
++ #cs.print_all(out=sys.stderr, columns=func_cols)
++ #ts.print_all(out=sys.stderr, columns=thread_cols)
++ #cs.print_all(out=sys.stderr, columns={})
++
++ self.assertRaises(
++ yappi.YappiError, fs.print_all, columns={1: ("namee", 9)}
++ )
++ self.assertRaises(
++ yappi.YappiError, cs.print_all, columns={1: ("dd", 0)}
++ )
++ self.assertRaises(
++ yappi.YappiError, ts.print_all, columns={1: ("tidd", 0)}
++ )
++
++ def test_get_clock(self):
++ yappi.set_clock_type('cpu')
++ self.assertEqual('cpu', yappi.get_clock_type())
++ clock_info = yappi.get_clock_info()
++ self.assertTrue('api' in clock_info)
++ self.assertTrue('resolution' in clock_info)
++
++ yappi.set_clock_type('wall')
++ self.assertEqual('wall', yappi.get_clock_type())
++
++ t0 = yappi.get_clock_time()
++ time.sleep(0.1)
++ duration = yappi.get_clock_time() - t0
++ self.assertTrue(0.05 < duration < 0.3)
++
++ def test_profile_decorator(self):
++
++ def aggregate(func, stats):
++ fname = f"tests/{func.__name__}.profile"
++ try:
++ stats.add(fname)
++ except OSError:
++ pass
++ stats.save(fname)
++ raise Exception("messing around")
++
++ @yappi.profile(return_callback=aggregate)
++ def a(x, y):
++ if x + y == 25:
++ raise Exception("")
++ return x + y
++
++ def b():
++ pass
++
++ try:
++ os.remove(
++ "tests/a.profile"
++ ) # remove the one from prev test, if available
++ except:
++ pass
++
++ # global profile is on to mess things up
++ yappi.start()
++ b()
++
++ # assert functionality and call function at same time
++ try:
++ self.assertEqual(a(1, 2), 3)
++ except:
++ pass
++ try:
++ self.assertEqual(a(2, 5), 7)
++ except:
++ pass
++ try:
++ a(4, 21)
++ except:
++ pass
++ stats = yappi.get_func_stats().add("tests/a.profile")
++ fsa = utils.find_stat_by_name(stats, 'a')
++ self.assertEqual(fsa.ncall, 3)
++ self.assertEqual(len(stats), 1) # b() should be cleared out.
++
++ @yappi.profile(return_callback=aggregate)
++ def count_down_rec(n):
++ if n == 0:
++ return
++ count_down_rec(n - 1)
++
++ try:
++ os.remove(
++ "tests/count_down_rec.profile"
++ ) # remove the one from prev test, if available
++ except:
++ pass
++
++ try:
++ count_down_rec(4)
++ except:
++ pass
++ try:
++ count_down_rec(3)
++ except:
++ pass
++
++ stats = yappi.YFuncStats("tests/count_down_rec.profile")
++ fsrec = utils.find_stat_by_name(stats, 'count_down_rec')
++ self.assertEqual(fsrec.ncall, 9)
++ self.assertEqual(fsrec.nactualcall, 2)
++
++ def test_strip_dirs(self):
++
++ def a():
++ pass
++
++ stats = utils.run_and_get_func_stats(a, )
++ stats.strip_dirs()
++ fsa = utils.find_stat_by_name(stats, "a")
++ self.assertEqual(fsa.module, os.path.basename(fsa.module))
++
++ @unittest.skipIf(os.name == "nt", "do not run on Windows")
++ def test_run_as_script(self):
++ import re
++ p = subprocess.Popen(
++ ['yappi', os.path.join('./tests', 'run_as_script.py')],
++ stdout=subprocess.PIPE
++ )
++ out, err = p.communicate()
++ self.assertEqual(p.returncode, 0)
++ func_stats, thread_stats = re.split(
++ b'name\\s+id\\s+tid\\s+ttot\\s+scnt\\s*\n', out
++ )
++ self.assertTrue(b'FancyThread' in thread_stats)
++
++ def test_yappi_overhead(self):
++ LOOP_COUNT = 100000
++
++ def a():
++ pass
++
++ def b():
++ for i in range(LOOP_COUNT):
++ a()
++
++ t0 = time.time()
++ yappi.start()
++ b()
++ yappi.stop()
++ time_with_yappi = time.time() - t0
++ t0 = time.time()
++ b()
++ time_without_yappi = time.time() - t0
++ if time_without_yappi == 0:
++ time_without_yappi = 0.000001
++
++ # in latest v0.82, I calculated this as close to "7.0" in my machine.
++ # however, %83 of this overhead is coming from tickcount(). The other %17
++ # seems to have been evenly distributed to the internal bookkeeping
++ # structures/algorithms which seems acceptable. Note that our test only
++ # tests one function being profiled at-a-time in a short interval.
++ # profiling high number of functions in a small time
++ # is a different beast, (which is pretty unlikely in most applications)
++ # So as a conclusion: I cannot see any optimization window for Yappi that
++ # is worth implementing as we will only optimize %17 of the time.
++ sys.stderr.write("\r\nYappi puts %0.1f times overhead to the profiled application in average.\r\n" % \
++ (time_with_yappi / time_without_yappi))
++
++ def test_clear_stats_while_running(self):
++
++ def a():
++ pass
++
++ yappi.start()
++ a()
++ yappi.clear_stats()
++ a()
++ stats = yappi.get_func_stats()
++ fsa = utils.find_stat_by_name(stats, 'a')
++ self.assertEqual(fsa.ncall, 1)
++
++ def test_generator(self):
++
++ def _gen(n):
++ while (n > 0):
++ yield n
++ n -= 1
++
++ yappi.start()
++ for x in _gen(5):
++ pass
++ self.assertTrue(
++ yappi.convert2pstats(yappi.get_func_stats()) is not None
++ )
++
++ def test_slice_child_stats_and_strip_dirs(self):
++
++ def b():
++ for i in range(10000000):
++ pass
++
++ def a():
++ b()
++
++ yappi.start(builtins=True)
++ a()
++ stats = yappi.get_func_stats()
++ fsa = utils.find_stat_by_name(stats, 'a')
++ fsb = utils.find_stat_by_name(stats, 'b')
++ self.assertTrue(fsa.children[0:1] is not None)
++ prev_afullname = fsa.full_name
++ prev_bchildfullname = fsa.children[fsb].full_name
++ stats.strip_dirs()
++ self.assertTrue(len(prev_afullname) > len(fsa.full_name))
++ self.assertTrue(
++ len(prev_bchildfullname) > len(fsa.children[fsb].full_name)
++ )
++
++ def test_children_stat_functions(self):
++ _timings = {"a_1": 5, "b_1": 3, "c_1": 1}
++ _yappi._set_test_timings(_timings)
++
++ def b():
++ pass
++
++ def c():
++ pass
++
++ def a():
++ b()
++ c()
++
++ yappi.start()
++ a()
++ b() # non-child call
++ c() # non-child call
++ stats = yappi.get_func_stats()
++ fsa = utils.find_stat_by_name(stats, 'a')
++ childs_of_a = fsa.children.get().sort("tavg", "desc")
++ prev_item = None
++ for item in childs_of_a:
++ if prev_item:
++ self.assertTrue(prev_item.tavg > item.tavg)
++ prev_item = item
++ childs_of_a.sort("name", "desc")
++ prev_item = None
++ for item in childs_of_a:
++ if prev_item:
++ self.assertTrue(prev_item.name > item.name)
++ prev_item = item
++ childs_of_a.clear()
++ self.assertTrue(childs_of_a.empty())
++
++ def test_no_stats_different_clock_type_load(self):
++
++ def a():
++ pass
++
++ yappi.start()
++ a()
++ yappi.stop()
++ yappi.get_func_stats().save("tests/ystats1.ys")
++ yappi.clear_stats()
++ yappi.set_clock_type("WALL")
++ yappi.start()
++ yappi.stop()
++ stats = yappi.get_func_stats().add("tests/ystats1.ys")
++ fsa = utils.find_stat_by_name(stats, 'a')
++ self.assertTrue(fsa is not None)
++
++ def test_subsequent_profile(self):
++ _timings = {"a_1": 1, "b_1": 1}
++ _yappi._set_test_timings(_timings)
++
++ def a():
++ pass
++
++ def b():
++ pass
++
++ yappi.start()
++ a()
++ yappi.stop()
++ yappi.start()
++ b()
++ yappi.stop()
++ stats = yappi.get_func_stats()
++ fsa = utils.find_stat_by_name(stats, 'a')
++ fsb = utils.find_stat_by_name(stats, 'b')
++ self.assertTrue(fsa is not None)
++ self.assertTrue(fsb is not None)
++ self.assertEqual(fsa.ttot, 1)
++ self.assertEqual(fsb.ttot, 1)
++
++ def test_lambda(self):
++ f = lambda: time.sleep(0.3)
++ yappi.set_clock_type("wall")
++ yappi.start()
++ f()
++ stats = yappi.get_func_stats()
++ fsa = utils.find_stat_by_name(stats, '<lambda>')
++ self.assertTrue(fsa.ttot > 0.1)
++
++ def test_module_stress(self):
++ self.assertEqual(yappi.is_running(), False)
++
++ yappi.start()
++ yappi.clear_stats()
++ self.assertRaises(_yappi.error, yappi.set_clock_type, "wall")
++
++ yappi.stop()
++ yappi.clear_stats()
++ yappi.set_clock_type("cpu")
++ self.assertRaises(yappi.YappiError, yappi.set_clock_type, "dummy")
++ self.assertEqual(yappi.is_running(), False)
++ yappi.clear_stats()
++ yappi.clear_stats()
++
++ def test_stat_sorting(self):
++ _timings = {"a_1": 13, "b_1": 10, "a_2": 6, "b_2": 1}
++ _yappi._set_test_timings(_timings)
++
++ self._ncall = 1
++
++ def a():
++ b()
++
++ def b():
++ if self._ncall == 2:
++ return
++ self._ncall += 1
++ a()
++
++ stats = utils.run_and_get_func_stats(a)
++ stats = stats.sort("totaltime", "desc")
++ prev_stat = None
++ for stat in stats:
++ if prev_stat:
++ self.assertTrue(prev_stat.ttot >= stat.ttot)
++ prev_stat = stat
++ stats = stats.sort("totaltime", "asc")
++ prev_stat = None
++ for stat in stats:
++ if prev_stat:
++ self.assertTrue(prev_stat.ttot <= stat.ttot)
++ prev_stat = stat
++ stats = stats.sort("avgtime", "asc")
++ prev_stat = None
++ for stat in stats:
++ if prev_stat:
++ self.assertTrue(prev_stat.tavg <= stat.tavg)
++ prev_stat = stat
++ stats = stats.sort("name", "asc")
++ prev_stat = None
++ for stat in stats:
++ if prev_stat:
++ self.assertTrue(prev_stat.name <= stat.name)
++ prev_stat = stat
++ stats = stats.sort("subtime", "asc")
++ prev_stat = None
++ for stat in stats:
++ if prev_stat:
++ self.assertTrue(prev_stat.tsub <= stat.tsub)
++ prev_stat = stat
++
++ self.assertRaises(
++ yappi.YappiError, stats.sort, "invalid_func_sorttype_arg"
++ )
++ self.assertRaises(
++ yappi.YappiError, stats.sort, "totaltime",
++ "invalid_func_sortorder_arg"
++ )
++
++ def test_start_flags(self):
++ self.assertEqual(_yappi._get_start_flags(), None)
++ yappi.start()
++
++ def a():
++ pass
++
++ a()
++ self.assertEqual(_yappi._get_start_flags()["profile_builtins"], 0)
++ self.assertEqual(_yappi._get_start_flags()["profile_multicontext"], 1)
++ self.assertEqual(len(yappi.get_thread_stats()), 1)
++
++ def test_builtin_profiling(self):
++
++ def a():
++ time.sleep(0.4) # is a builtin function
++
++ yappi.set_clock_type('wall')
++
++ yappi.start(builtins=True)
++ a()
++ stats = yappi.get_func_stats()
++ fsa = utils.find_stat_by_name(stats, 'sleep')
++ self.assertTrue(fsa is not None)
++ self.assertTrue(fsa.ttot > 0.3)
++ yappi.stop()
++ yappi.clear_stats()
++
++ def a():
++ pass
++
++ yappi.start()
++ t = threading.Thread(target=a)
++ t.start()
++ t.join()
++ stats = yappi.get_func_stats()
++
++ def test_singlethread_profiling(self):
++ yappi.set_clock_type('wall')
++
++ def a():
++ time.sleep(0.2)
++
++ class Worker1(threading.Thread):
++
++ def a(self):
++ time.sleep(0.3)
++
++ def run(self):
++ self.a()
++
++ yappi.start(profile_threads=False)
++
++ c = Worker1()
++ c.start()
++ c.join()
++ a()
++ stats = yappi.get_func_stats()
++ fsa1 = utils.find_stat_by_name(stats, 'Worker1.a')
++ fsa2 = utils.find_stat_by_name(stats, 'a')
++ self.assertTrue(fsa1 is None)
++ self.assertTrue(fsa2 is not None)
++ self.assertTrue(fsa2.ttot > 0.1)
++
++ def test_run(self):
++
++ def profiled():
++ pass
++
++ yappi.clear_stats()
++ try:
++ with yappi.run():
++ profiled()
++ stats = yappi.get_func_stats()
++ finally:
++ yappi.clear_stats()
++
++ self.assertIsNotNone(utils.find_stat_by_name(stats, 'profiled'))
++
++ def test_run_recursive(self):
++
++ def profiled():
++ pass
++
++ def not_profiled():
++ pass
++
++ yappi.clear_stats()
++ try:
++ with yappi.run():
++ with yappi.run():
++ profiled()
++ # Profiling stopped here
++ not_profiled()
++ stats = yappi.get_func_stats()
++ finally:
++ yappi.clear_stats()
++
++ self.assertIsNotNone(utils.find_stat_by_name(stats, 'profiled'))
++ self.assertIsNone(utils.find_stat_by_name(stats, 'not_profiled'))
++
++
++class StatSaveScenarios(utils.YappiUnitTestCase):
++
++ def test_pstats_conversion(self):
++
++ def pstat_id(fs):
++ return (fs.module, fs.lineno, fs.name)
++
++ def a():
++ d()
++
++ def b():
++ d()
++
++ def c():
++ pass
++
++ def d():
++ pass
++
++ _timings = {"a_1": 12, "b_1": 7, "c_1": 5, "d_1": 2}
++ _yappi._set_test_timings(_timings)
++ stats = utils.run_and_get_func_stats(a, )
++ stats.strip_dirs()
++ stats.save("tests/a1.pstats", type="pstat")
++ fsa_pid = pstat_id(utils.find_stat_by_name(stats, "a"))
++ fsd_pid = pstat_id(utils.find_stat_by_name(stats, "d"))
++ yappi.clear_stats()
++ _yappi._set_test_timings(_timings)
++ stats = utils.run_and_get_func_stats(a, )
++ stats.strip_dirs()
++ stats.save("tests/a2.pstats", type="pstat")
++ yappi.clear_stats()
++ _yappi._set_test_timings(_timings)
++ stats = utils.run_and_get_func_stats(b, )
++ stats.strip_dirs()
++ stats.save("tests/b1.pstats", type="pstat")
++ fsb_pid = pstat_id(utils.find_stat_by_name(stats, "b"))
++ yappi.clear_stats()
++ _yappi._set_test_timings(_timings)
++ stats = utils.run_and_get_func_stats(c, )
++ stats.strip_dirs()
++ stats.save("tests/c1.pstats", type="pstat")
++ fsc_pid = pstat_id(utils.find_stat_by_name(stats, "c"))
++
++ # merge saved stats and check pstats values are correct
++ import pstats
++ p = pstats.Stats(
++ 'tests/a1.pstats', 'tests/a2.pstats', 'tests/b1.pstats',
++ 'tests/c1.pstats'
++ )
++ p.strip_dirs()
++ # ct = ttot, tt = tsub
++ (cc, nc, tt, ct, callers) = p.stats[fsa_pid]
++ self.assertEqual(cc, nc, 2)
++ self.assertEqual(tt, 20)
++ self.assertEqual(ct, 24)
++ (cc, nc, tt, ct, callers) = p.stats[fsd_pid]
++ self.assertEqual(cc, nc, 3)
++ self.assertEqual(tt, 6)
++ self.assertEqual(ct, 6)
++ self.assertEqual(len(callers), 2)
++ (cc, nc, tt, ct) = callers[fsa_pid]
++ self.assertEqual(cc, nc, 2)
++ self.assertEqual(tt, 4)
++ self.assertEqual(ct, 4)
++ (cc, nc, tt, ct) = callers[fsb_pid]
++ self.assertEqual(cc, nc, 1)
++ self.assertEqual(tt, 2)
++ self.assertEqual(ct, 2)
++
++ def test_merge_stats(self):
++ _timings = {
++ "a_1": 15,
++ "b_1": 14,
++ "c_1": 12,
++ "d_1": 10,
++ "e_1": 9,
++ "f_1": 7,
++ "g_1": 6,
++ "h_1": 5,
++ "i_1": 1
++ }
++ _yappi._set_test_timings(_timings)
++
++ def a():
++ b()
++
++ def b():
++ c()
++
++ def c():
++ d()
++
++ def d():
++ e()
++
++ def e():
++ f()
++
++ def f():
++ g()
++
++ def g():
++ h()
++
++ def h():
++ i()
++
++ def i():
++ pass
++
++ yappi.start()
++ a()
++ a()
++ yappi.stop()
++ stats = yappi.get_func_stats()
++ self.assertRaises(
++ NotImplementedError, stats.save, "", "INVALID_SAVE_TYPE"
++ )
++ stats.save("tests/ystats2.ys")
++ yappi.clear_stats()
++ _yappi._set_test_timings(_timings)
++ yappi.start()
++ a()
++ stats = yappi.get_func_stats().add("tests/ystats2.ys")
++ fsa = utils.find_stat_by_name(stats, "a")
++ fsb = utils.find_stat_by_name(stats, "b")
++ fsc = utils.find_stat_by_name(stats, "c")
++ fsd = utils.find_stat_by_name(stats, "d")
++ fse = utils.find_stat_by_name(stats, "e")
++ fsf = utils.find_stat_by_name(stats, "f")
++ fsg = utils.find_stat_by_name(stats, "g")
++ fsh = utils.find_stat_by_name(stats, "h")
++ fsi = utils.find_stat_by_name(stats, "i")
++ self.assertEqual(fsa.ttot, 45)
++ self.assertEqual(fsa.ncall, 3)
++ self.assertEqual(fsa.nactualcall, 3)
++ self.assertEqual(fsa.tsub, 3)
++ self.assertEqual(fsa.children[fsb].ttot, fsb.ttot)
++ self.assertEqual(fsa.children[fsb].tsub, fsb.tsub)
++ self.assertEqual(fsb.children[fsc].ttot, fsc.ttot)
++ self.assertEqual(fsb.children[fsc].tsub, fsc.tsub)
++ self.assertEqual(fsc.tsub, 6)
++ self.assertEqual(fsc.children[fsd].ttot, fsd.ttot)
++ self.assertEqual(fsc.children[fsd].tsub, fsd.tsub)
++ self.assertEqual(fsd.children[fse].ttot, fse.ttot)
++ self.assertEqual(fsd.children[fse].tsub, fse.tsub)
++ self.assertEqual(fse.children[fsf].ttot, fsf.ttot)
++ self.assertEqual(fse.children[fsf].tsub, fsf.tsub)
++ self.assertEqual(fsf.children[fsg].ttot, fsg.ttot)
++ self.assertEqual(fsf.children[fsg].tsub, fsg.tsub)
++ self.assertEqual(fsg.ttot, 18)
++ self.assertEqual(fsg.tsub, 3)
++ self.assertEqual(fsg.children[fsh].ttot, fsh.ttot)
++ self.assertEqual(fsg.children[fsh].tsub, fsh.tsub)
++ self.assertEqual(fsh.ttot, 15)
++ self.assertEqual(fsh.tsub, 12)
++ self.assertEqual(fsh.tavg, 5)
++ self.assertEqual(fsh.children[fsi].ttot, fsi.ttot)
++ self.assertEqual(fsh.children[fsi].tsub, fsi.tsub)
++ #stats.debug_print()
++
++ def test_merge_multithreaded_stats(self):
++ import _yappi
++ timings = {"a_1": 2, "b_1": 1}
++ _yappi._set_test_timings(timings)
++
++ def a():
++ pass
++
++ def b():
++ pass
++
++ yappi.start()
++ t = threading.Thread(target=a)
++ t.start()
++ t.join()
++ t = threading.Thread(target=b)
++ t.start()
++ t.join()
++ yappi.get_func_stats().save("tests/ystats1.ys")
++ yappi.clear_stats()
++ _yappi._set_test_timings(timings)
++ self.assertEqual(len(yappi.get_func_stats()), 0)
++ self.assertEqual(len(yappi.get_thread_stats()), 1)
++ t = threading.Thread(target=a)
++ t.start()
++ t.join()
++
++ self.assertEqual(_yappi._get_start_flags()["profile_builtins"], 0)
++ self.assertEqual(_yappi._get_start_flags()["profile_multicontext"], 1)
++ yappi.get_func_stats().save("tests/ystats2.ys")
++
++ stats = yappi.YFuncStats([
++ "tests/ystats1.ys",
++ "tests/ystats2.ys",
++ ])
++ fsa = utils.find_stat_by_name(stats, "a")
++ fsb = utils.find_stat_by_name(stats, "b")
++ self.assertEqual(fsa.ncall, 2)
++ self.assertEqual(fsb.ncall, 1)
++ self.assertEqual(fsa.tsub, fsa.ttot, 4)
++ self.assertEqual(fsb.tsub, fsb.ttot, 1)
++
++ def test_merge_load_different_clock_types(self):
++ yappi.start(builtins=True)
++
++ def a():
++ b()
++
++ def b():
++ c()
++
++ def c():
++ pass
++
++ t = threading.Thread(target=a)
++ t.start()
++ t.join()
++ yappi.get_func_stats().sort("name", "asc").save("tests/ystats1.ys")
++ yappi.stop()
++ yappi.clear_stats()
++ yappi.start(builtins=False)
++ t = threading.Thread(target=a)
++ t.start()
++ t.join()
++ yappi.get_func_stats().save("tests/ystats2.ys")
++ yappi.stop()
++ self.assertRaises(_yappi.error, yappi.set_clock_type, "wall")
++ yappi.clear_stats()
++ yappi.set_clock_type("wall")
++ yappi.start()
++ t = threading.Thread(target=a)
++ t.start()
++ t.join()
++ yappi.get_func_stats().save("tests/ystats3.ys")
++ self.assertRaises(
++ yappi.YappiError,
++ yappi.YFuncStats().add("tests/ystats1.ys").add, "tests/ystats3.ys"
++ )
++ stats = yappi.YFuncStats(["tests/ystats1.ys",
++ "tests/ystats2.ys"]).sort("name")
++ fsa = utils.find_stat_by_name(stats, "a")
++ fsb = utils.find_stat_by_name(stats, "b")
++ fsc = utils.find_stat_by_name(stats, "c")
++ self.assertEqual(fsa.ncall, 2)
++ self.assertEqual(fsa.ncall, fsb.ncall, fsc.ncall)
++
++ def test_merge_aabab_aabbc(self):
++ _timings = {
++ "a_1": 15,
++ "a_2": 14,
++ "b_1": 12,
++ "a_3": 10,
++ "b_2": 9,
++ "c_1": 4
++ }
++ _yappi._set_test_timings(_timings)
++
++ def a():
++ if self._ncall == 1:
++ self._ncall += 1
++ a()
++ elif self._ncall == 5:
++ self._ncall += 1
++ a()
++ else:
++ b()
++
++ def b():
++ if self._ncall == 2:
++ self._ncall += 1
++ a()
++ elif self._ncall == 6:
++ self._ncall += 1
++ b()
++ elif self._ncall == 7:
++ c()
++ else:
++ return
++
++ def c():
++ pass
++
++ self._ncall = 1
++ stats = utils.run_and_get_func_stats(a, )
++ stats.save("tests/ystats1.ys")
++ yappi.clear_stats()
++ _yappi._set_test_timings(_timings)
++ #stats.print_all()
++
++ self._ncall = 5
++ stats = utils.run_and_get_func_stats(a, )
++ stats.save("tests/ystats2.ys")
++
++ #stats.print_all()
++
++ def a(): # same name but another function(code object)
++ pass
++
++ yappi.start()
++ a()
++ stats = yappi.get_func_stats().add(
++ ["tests/ystats1.ys", "tests/ystats2.ys"]
++ )
++ #stats.print_all()
++ self.assertEqual(len(stats), 4)
++
++ fsa = None
++ for stat in stats:
++ if stat.name == "a" and stat.ttot == 45:
++ fsa = stat
++ break
++ self.assertTrue(fsa is not None)
++
++ self.assertEqual(fsa.ncall, 7)
++ self.assertEqual(fsa.nactualcall, 3)
++ self.assertEqual(fsa.ttot, 45)
++ self.assertEqual(fsa.tsub, 10)
++ fsb = utils.find_stat_by_name(stats, "b")
++ fsc = utils.find_stat_by_name(stats, "c")
++ self.assertEqual(fsb.ncall, 6)
++ self.assertEqual(fsb.nactualcall, 3)
++ self.assertEqual(fsb.ttot, 36)
++ self.assertEqual(fsb.tsub, 27)
++ self.assertEqual(fsb.tavg, 6)
++ self.assertEqual(fsc.ttot, 8)
++ self.assertEqual(fsc.tsub, 8)
++ self.assertEqual(fsc.tavg, 4)
++ self.assertEqual(fsc.nactualcall, fsc.ncall, 2)
++
++
++class MultithreadedScenarios(utils.YappiUnitTestCase):
++
++ def test_issue_32(self):
++ '''
++ Start yappi from different thread and we get Internal Error(15) as
++ the current_ctx_id() called while enumerating the threads in start()
++ and as it does not swap to the enumerated ThreadState* the THreadState_GetDict()
++ returns wrong object and thus sets an invalid id for the _ctx structure.
++
++ When this issue happens multiple Threads have same tid as the internal ts_ptr
++ will be same for different contexts. So, let's see if that happens
++ '''
++
++ def foo():
++ time.sleep(0.2)
++
++ def bar():
++ time.sleep(0.1)
++
++ def thread_func():
++ yappi.set_clock_type("wall")
++ yappi.start()
++
++ bar()
++
++ t = threading.Thread(target=thread_func)
++ t.start()
++ t.join()
++
++ foo()
++
++ yappi.stop()
++
++ thread_ids = set()
++ for tstat in yappi.get_thread_stats():
++ self.assertTrue(tstat.tid not in thread_ids)
++ thread_ids.add(tstat.tid)
++
++ def test_subsequent_profile(self):
++ WORKER_COUNT = 5
++
++ def a():
++ pass
++
++ def b():
++ pass
++
++ def c():
++ pass
++
++ _timings = {
++ "a_1": 3,
++ "b_1": 2,
++ "c_1": 1,
++ }
++
++ yappi.start()
++
++ def g():
++ pass
++
++ g()
++ yappi.stop()
++ yappi.clear_stats()
++ _yappi._set_test_timings(_timings)
++ yappi.start()
++
++ _dummy = []
++ for i in range(WORKER_COUNT):
++ t = threading.Thread(target=a)
++ t.start()
++ t.join()
++ for i in range(WORKER_COUNT):
++ t = threading.Thread(target=b)
++ t.start()
++ _dummy.append(t)
++ t.join()
++ for i in range(WORKER_COUNT):
++ t = threading.Thread(target=a)
++ t.start()
++ t.join()
++ for i in range(WORKER_COUNT):
++ t = threading.Thread(target=c)
++ t.start()
++ t.join()
++ yappi.stop()
++ yappi.start()
++
++ def f():
++ pass
++
++ f()
++ stats = yappi.get_func_stats()
++ fsa = utils.find_stat_by_name(stats, 'a')
++ fsb = utils.find_stat_by_name(stats, 'b')
++ fsc = utils.find_stat_by_name(stats, 'c')
++ self.assertEqual(fsa.ncall, 10)
++ self.assertEqual(fsb.ncall, 5)
++ self.assertEqual(fsc.ncall, 5)
++ self.assertEqual(fsa.ttot, fsa.tsub, 30)
++ self.assertEqual(fsb.ttot, fsb.tsub, 10)
++ self.assertEqual(fsc.ttot, fsc.tsub, 5)
++
++ # MACOSx optimizes by only creating one worker thread
++ self.assertTrue(len(yappi.get_thread_stats()) >= 2)
++
++ def test_basic(self):
++ yappi.set_clock_type('wall')
++
++ def dummy():
++ pass
++
++ def a():
++ time.sleep(0.2)
++
++ class Worker1(threading.Thread):
++
++ def a(self):
++ time.sleep(0.3)
++
++ def run(self):
++ self.a()
++
++ yappi.start(builtins=False, profile_threads=True)
++
++ c = Worker1()
++ c.start()
++ c.join()
++ a()
++ stats = yappi.get_func_stats()
++ fsa1 = utils.find_stat_by_name(stats, 'Worker1.a')
++ fsa2 = utils.find_stat_by_name(stats, 'a')
++ self.assertTrue(fsa1 is not None)
++ self.assertTrue(fsa2 is not None)
++ self.assertTrue(fsa1.ttot > 0.2)
++ self.assertTrue(fsa2.ttot > 0.1)
++ tstats = yappi.get_thread_stats()
++ self.assertEqual(len(tstats), 2)
++ tsa = utils.find_stat_by_name(tstats, 'Worker1')
++ tsm = utils.find_stat_by_name(tstats, '_MainThread')
++ dummy() # call dummy to force ctx name to be retrieved again.
++ self.assertTrue(tsa is not None)
++ # TODO: I put dummy() to fix below, remove the comments after a while.
++ self.assertTrue( # FIX: I see this fails sometimes?
++ tsm is not None,
++ f"Could not find \"_MainThread\". Found: {', '.join(utils.get_stat_names(tstats))}")
++
++ def test_ctx_stats(self):
++ from threading import Thread
++ DUMMY_WORKER_COUNT = 5
++ yappi.start()
++
++ class DummyThread(Thread):
++ pass
++
++ def dummy():
++ pass
++
++ def dummy_worker():
++ pass
++
++ for i in range(DUMMY_WORKER_COUNT):
++ t = DummyThread(target=dummy_worker)
++ t.start()
++ t.join()
++ yappi.stop()
++ stats = yappi.get_thread_stats()
++ tsa = utils.find_stat_by_name(stats, "DummyThread")
++ self.assertTrue(tsa is not None)
++ yappi.clear_stats()
++ time.sleep(1.0)
++ _timings = {
++ "a_1": 6,
++ "b_1": 5,
++ "c_1": 3,
++ "d_1": 1,
++ "a_2": 4,
++ "b_2": 3,
++ "c_2": 2,
++ "d_2": 1
++ }
++ _yappi._set_test_timings(_timings)
++
++ class Thread1(Thread):
++ pass
++
++ class Thread2(Thread):
++ pass
++
++ def a():
++ b()
++
++ def b():
++ c()
++
++ def c():
++ d()
++
++ def d():
++ time.sleep(0.6)
++
++ yappi.set_clock_type("wall")
++ yappi.start()
++ t1 = Thread1(target=a)
++ t1.start()
++ t2 = Thread2(target=a)
++ t2.start()
++ t1.join()
++ t2.join()
++ stats = yappi.get_thread_stats()
++
++ # the fist clear_stats clears the context table?
++ tsa = utils.find_stat_by_name(stats, "DummyThread")
++ self.assertTrue(tsa is None)
++
++ tst1 = utils.find_stat_by_name(stats, "Thread1")
++ tst2 = utils.find_stat_by_name(stats, "Thread2")
++ tsmain = utils.find_stat_by_name(stats, "_MainThread")
++ dummy() # call dummy to force ctx name to be retrieved again.
++ self.assertTrue(len(stats) == 3)
++ self.assertTrue(tst1 is not None)
++ self.assertTrue(tst2 is not None)
++ # TODO: I put dummy() to fix below, remove the comments after a while.
++ self.assertTrue( # FIX: I see this fails sometimes
++ tsmain is not None,
++ f"Could not find \"_MainThread\". Found: {', '.join(utils.get_stat_names(stats))}")
++ self.assertTrue(1.0 > tst2.ttot >= 0.5)
++ self.assertTrue(1.0 > tst1.ttot >= 0.5)
++
++ # test sorting of the ctx stats
++ stats = stats.sort("totaltime", "desc")
++ prev_stat = None
++ for stat in stats:
++ if prev_stat:
++ self.assertTrue(prev_stat.ttot >= stat.ttot)
++ prev_stat = stat
++ stats = stats.sort("totaltime", "asc")
++ prev_stat = None
++ for stat in stats:
++ if prev_stat:
++ self.assertTrue(prev_stat.ttot <= stat.ttot)
++ prev_stat = stat
++ stats = stats.sort("schedcount", "desc")
++ prev_stat = None
++ for stat in stats:
++ if prev_stat:
++ self.assertTrue(prev_stat.sched_count >= stat.sched_count)
++ prev_stat = stat
++ stats = stats.sort("name", "desc")
++ prev_stat = None
++ for stat in stats:
++ if prev_stat:
++ self.assertTrue(prev_stat.name.lower() >= stat.name.lower())
++ prev_stat = stat
++ self.assertRaises(
++ yappi.YappiError, stats.sort, "invalid_thread_sorttype_arg"
++ )
++ self.assertRaises(
++ yappi.YappiError, stats.sort, "invalid_thread_sortorder_arg"
++ )
++
++ def test_ctx_stats_cpu(self):
++
++ def get_thread_name():
++ try:
++ return threading.current_thread().name
++ except AttributeError:
++ return "Anonymous"
++
++ def burn_cpu(sec):
++ t0 = yappi.get_clock_time()
++ elapsed = 0
++ while (elapsed < sec):
++ for _ in range(1000):
++ pass
++ elapsed = yappi.get_clock_time() - t0
++
++ def test():
++
++ ts = []
++ for i in (0.01, 0.05, 0.1):
++ t = threading.Thread(target=burn_cpu, args=(i, ))
++ t.name = f"burn_cpu-{str(i)}"
++ t.start()
++ ts.append(t)
++ for t in ts:
++ t.join()
++
++ yappi.set_clock_type("cpu")
++ yappi.set_context_name_callback(get_thread_name)
++
++ yappi.start()
++
++ test()
++
++ yappi.stop()
++
++ tstats = yappi.get_thread_stats()
++ r1 = '''
++ burn_cpu-0.1 3 123145356058624 0.100105 8
++ burn_cpu-0.05 2 123145361313792 0.050149 8
++ burn_cpu-0.01 1 123145356058624 0.010127 2
++ MainThread 0 4321620864 0.001632 6
++ '''
++ self.assert_ctx_stats_almost_equal(r1, tstats)
++
++ def test_producer_consumer_with_queues(self):
++ # we currently just stress yappi, no functionality test is done here.
++ yappi.start()
++ from queue import Queue
++ from threading import Thread
++ WORKER_THREAD_COUNT = 50
++ WORK_ITEM_COUNT = 2000
++
++ def worker():
++ while True:
++ item = q.get()
++ # do the work with item
++ q.task_done()
++
++ q = Queue()
++ for i in range(WORKER_THREAD_COUNT):
++ t = Thread(target=worker)
++ t.daemon = True
++ t.start()
++
++ for item in range(WORK_ITEM_COUNT):
++ q.put(item)
++ q.join() # block until all tasks are done
++ #yappi.get_func_stats().sort("callcount").print_all()
++ yappi.stop()
++
++ def test_temporary_lock_waiting(self):
++ yappi.start()
++ _lock = threading.Lock()
++
++ def worker():
++ _lock.acquire()
++ try:
++ time.sleep(1.0)
++ finally:
++ _lock.release()
++
++ t1 = threading.Thread(target=worker)
++ t2 = threading.Thread(target=worker)
++ t1.start()
++ t2.start()
++ t1.join()
++ t2.join()
++ #yappi.get_func_stats().sort("callcount").print_all()
++ yappi.stop()
++
++ @unittest.skipIf(os.name != "posix", "requires Posix compliant OS")
++ def test_signals_with_blocking_calls(self):
++ import signal, os, time
++
++ # just to verify if signal is handled correctly and stats/yappi are not corrupted.
++ def handler(signum, frame):
++ raise Exception("Signal handler executed!")
++
++ yappi.start()
++ signal.signal(signal.SIGALRM, handler)
++ signal.alarm(1)
++ self.assertRaises(Exception, time.sleep, 2)
++ stats = yappi.get_func_stats()
++ fsh = utils.find_stat_by_name(stats, "handler")
++ self.assertTrue(fsh is not None)
++
++ def test_concurrent_futures(self):
++ yappi.start()
++ from concurrent.futures import ThreadPoolExecutor
++ with ThreadPoolExecutor(max_workers=5) as executor:
++ f = executor.submit(pow, 5, 2)
++ self.assertEqual(f.result(), 25)
++ time.sleep(1.0)
++ yappi.stop()
++
++ def test_barrier(self):
++ yappi.start()
++ b = threading.Barrier(2, timeout=1)
++
++ def worker():
++ try:
++ b.wait()
++ except threading.BrokenBarrierError:
++ pass
++ except Exception:
++ raise Exception("BrokenBarrierError not raised")
++
++ t1 = threading.Thread(target=worker)
++ t1.start()
++ #b.wait()
++ t1.join()
++ yappi.stop()
++
++
++class NonRecursiveFunctions(utils.YappiUnitTestCase):
++
++ def test_abcd(self):
++ _timings = {"a_1": 6, "b_1": 5, "c_1": 3, "d_1": 1}
++ _yappi._set_test_timings(_timings)
++
++ def a():
++ b()
++
++ def b():
++ c()
++
++ def c():
++ d()
++
++ def d():
++ pass
++
++ stats = utils.run_and_get_func_stats(a)
++ fsa = utils.find_stat_by_name(stats, 'a')
++ fsb = utils.find_stat_by_name(stats, 'b')
++ fsc = utils.find_stat_by_name(stats, 'c')
++ fsd = utils.find_stat_by_name(stats, 'd')
++ cfsab = fsa.children[fsb]
++ cfsbc = fsb.children[fsc]
++ cfscd = fsc.children[fsd]
++
++ self.assertEqual(fsa.ttot, 6)
++ self.assertEqual(fsa.tsub, 1)
++ self.assertEqual(fsb.ttot, 5)
++ self.assertEqual(fsb.tsub, 2)
++ self.assertEqual(fsc.ttot, 3)
++ self.assertEqual(fsc.tsub, 2)
++ self.assertEqual(fsd.ttot, 1)
++ self.assertEqual(fsd.tsub, 1)
++ self.assertEqual(cfsab.ttot, 5)
++ self.assertEqual(cfsab.tsub, 2)
++ self.assertEqual(cfsbc.ttot, 3)
++ self.assertEqual(cfsbc.tsub, 2)
++ self.assertEqual(cfscd.ttot, 1)
++ self.assertEqual(cfscd.tsub, 1)
++
++ def test_stop_in_middle(self):
++ _timings = {"a_1": 6, "b_1": 4}
++ _yappi._set_test_timings(_timings)
++
++ def a():
++ b()
++ yappi.stop()
++
++ def b():
++ time.sleep(0.2)
++
++ yappi.start()
++ a()
++ stats = yappi.get_func_stats()
++ fsa = utils.find_stat_by_name(stats, 'a')
++ fsb = utils.find_stat_by_name(stats, 'b')
++
++ self.assertEqual(fsa.ncall, 1)
++ self.assertEqual(fsa.nactualcall, 0)
++ self.assertEqual(fsa.ttot, 0) # no call_leave called
++ self.assertEqual(fsa.tsub, 0) # no call_leave called
++ self.assertEqual(fsb.ttot, 4)
++
++
++class RecursiveFunctions(utils.YappiUnitTestCase):
++
++ def test_fibonacci(self):
++
++ def fib(n):
++ if n > 1:
++ return fib(n - 1) + fib(n - 2)
++ else:
++ return n
++
++ stats = utils.run_and_get_func_stats(fib, 22)
++ fs = utils.find_stat_by_name(stats, 'fib')
++ self.assertEqual(fs.ncall, 57313)
++ self.assertEqual(fs.ttot, fs.tsub)
++
++ def test_abcadc(self):
++ _timings = {
++ "a_1": 20,
++ "b_1": 19,
++ "c_1": 17,
++ "a_2": 13,
++ "d_1": 12,
++ "c_2": 10,
++ "a_3": 5
++ }
++ _yappi._set_test_timings(_timings)
++
++ def a(n):
++ if n == 3:
++ return
++ if n == 1 + 1:
++ d(n)
++ else:
++ b(n)
++
++ def b(n):
++ c(n)
++
++ def c(n):
++ a(n + 1)
++
++ def d(n):
++ c(n)
++
++ stats = utils.run_and_get_func_stats(a, 1)
++ fsa = utils.find_stat_by_name(stats, 'a')
++ fsb = utils.find_stat_by_name(stats, 'b')
++ fsc = utils.find_stat_by_name(stats, 'c')
++ fsd = utils.find_stat_by_name(stats, 'd')
++ self.assertEqual(fsa.ncall, 3)
++ self.assertEqual(fsa.nactualcall, 1)
++ self.assertEqual(fsa.ttot, 20)
++ self.assertEqual(fsa.tsub, 7)
++ self.assertEqual(fsb.ttot, 19)
++ self.assertEqual(fsb.tsub, 2)
++ self.assertEqual(fsc.ttot, 17)
++ self.assertEqual(fsc.tsub, 9)
++ self.assertEqual(fsd.ttot, 12)
++ self.assertEqual(fsd.tsub, 2)
++ cfsca = fsc.children[fsa]
++ self.assertEqual(cfsca.nactualcall, 0)
++ self.assertEqual(cfsca.ncall, 2)
++ self.assertEqual(cfsca.ttot, 13)
++ self.assertEqual(cfsca.tsub, 6)
++
++ def test_aaaa(self):
++ _timings = {"d_1": 9, "d_2": 7, "d_3": 3, "d_4": 2}
++ _yappi._set_test_timings(_timings)
++
++ def d(n):
++ if n == 3:
++ return
++ d(n + 1)
++
++ stats = utils.run_and_get_func_stats(d, 0)
++ fsd = utils.find_stat_by_name(stats, 'd')
++ self.assertEqual(fsd.ncall, 4)
++ self.assertEqual(fsd.nactualcall, 1)
++ self.assertEqual(fsd.ttot, 9)
++ self.assertEqual(fsd.tsub, 9)
++ cfsdd = fsd.children[fsd]
++ self.assertEqual(cfsdd.ttot, 7)
++ self.assertEqual(cfsdd.tsub, 7)
++ self.assertEqual(cfsdd.ncall, 3)
++ self.assertEqual(cfsdd.nactualcall, 0)
++
++ def test_abcabc(self):
++ _timings = {
++ "a_1": 20,
++ "b_1": 19,
++ "c_1": 17,
++ "a_2": 13,
++ "b_2": 11,
++ "c_2": 9,
++ "a_3": 6
++ }
++ _yappi._set_test_timings(_timings)
++
++ def a(n):
++ if n == 3:
++ return
++ else:
++ b(n)
++
++ def b(n):
++ c(n)
++
++ def c(n):
++ a(n + 1)
++
++ stats = utils.run_and_get_func_stats(a, 1)
++ fsa = utils.find_stat_by_name(stats, 'a')
++ fsb = utils.find_stat_by_name(stats, 'b')
++ fsc = utils.find_stat_by_name(stats, 'c')
++ self.assertEqual(fsa.ncall, 3)
++ self.assertEqual(fsa.nactualcall, 1)
++ self.assertEqual(fsa.ttot, 20)
++ self.assertEqual(fsa.tsub, 9)
++ self.assertEqual(fsb.ttot, 19)
++ self.assertEqual(fsb.tsub, 4)
++ self.assertEqual(fsc.ttot, 17)
++ self.assertEqual(fsc.tsub, 7)
++ cfsab = fsa.children[fsb]
++ cfsbc = fsb.children[fsc]
++ cfsca = fsc.children[fsa]
++ self.assertEqual(cfsab.ttot, 19)
++ self.assertEqual(cfsab.tsub, 4)
++ self.assertEqual(cfsbc.ttot, 17)
++ self.assertEqual(cfsbc.tsub, 7)
++ self.assertEqual(cfsca.ttot, 13)
++ self.assertEqual(cfsca.tsub, 8)
++
++ def test_abcbca(self):
++ _timings = {"a_1": 10, "b_1": 9, "c_1": 7, "b_2": 4, "c_2": 2, "a_2": 1}
++ _yappi._set_test_timings(_timings)
++ self._ncall = 1
++
++ def a():
++ if self._ncall == 1:
++ b()
++ else:
++ return
++
++ def b():
++ c()
++
++ def c():
++ if self._ncall == 1:
++ self._ncall += 1
++ b()
++ else:
++ a()
++
++ stats = utils.run_and_get_func_stats(a)
++ fsa = utils.find_stat_by_name(stats, 'a')
++ fsb = utils.find_stat_by_name(stats, 'b')
++ fsc = utils.find_stat_by_name(stats, 'c')
++ cfsab = fsa.children[fsb]
++ cfsbc = fsb.children[fsc]
++ cfsca = fsc.children[fsa]
++ self.assertEqual(fsa.ttot, 10)
++ self.assertEqual(fsa.tsub, 2)
++ self.assertEqual(fsb.ttot, 9)
++ self.assertEqual(fsb.tsub, 4)
++ self.assertEqual(fsc.ttot, 7)
++ self.assertEqual(fsc.tsub, 4)
++ self.assertEqual(cfsab.ttot, 9)
++ self.assertEqual(cfsab.tsub, 2)
++ self.assertEqual(cfsbc.ttot, 7)
++ self.assertEqual(cfsbc.tsub, 4)
++ self.assertEqual(cfsca.ttot, 1)
++ self.assertEqual(cfsca.tsub, 1)
++ self.assertEqual(cfsca.ncall, 1)
++ self.assertEqual(cfsca.nactualcall, 0)
++
++ def test_aabccb(self):
++ _timings = {
++ "a_1": 13,
++ "a_2": 11,
++ "b_1": 9,
++ "c_1": 5,
++ "c_2": 3,
++ "b_2": 1
++ }
++ _yappi._set_test_timings(_timings)
++ self._ncall = 1
++
++ def a():
++ if self._ncall == 1:
++ self._ncall += 1
++ a()
++ else:
++ b()
++
++ def b():
++ if self._ncall == 3:
++ return
++ else:
++ c()
++
++ def c():
++ if self._ncall == 2:
++ self._ncall += 1
++ c()
++ else:
++ b()
++
++ stats = utils.run_and_get_func_stats(a)
++ fsa = utils.find_stat_by_name(stats, 'a')
++ fsb = utils.find_stat_by_name(stats, 'b')
++ fsc = utils.find_stat_by_name(stats, 'c')
++ cfsaa = fsa.children[fsa.index]
++ cfsab = fsa.children[fsb]
++ cfsbc = fsb.children[fsc.full_name]
++ cfscc = fsc.children[fsc]
++ cfscb = fsc.children[fsb]
++ self.assertEqual(fsb.ttot, 9)
++ self.assertEqual(fsb.tsub, 5)
++ self.assertEqual(cfsbc.ttot, 5)
++ self.assertEqual(cfsbc.tsub, 2)
++ self.assertEqual(fsa.ttot, 13)
++ self.assertEqual(fsa.tsub, 4)
++ self.assertEqual(cfsab.ttot, 9)
++ self.assertEqual(cfsab.tsub, 4)
++ self.assertEqual(cfsaa.ttot, 11)
++ self.assertEqual(cfsaa.tsub, 2)
++ self.assertEqual(fsc.ttot, 5)
++ self.assertEqual(fsc.tsub, 4)
++
++ def test_abaa(self):
++ _timings = {"a_1": 13, "b_1": 10, "a_2": 9, "a_3": 5}
++ _yappi._set_test_timings(_timings)
++
++ self._ncall = 1
++
++ def a():
++ if self._ncall == 1:
++ b()
++ elif self._ncall == 2:
++ self._ncall += 1
++ a()
++ else:
++ return
++
++ def b():
++ self._ncall += 1
++ a()
++
++ stats = utils.run_and_get_func_stats(a)
++ fsa = utils.find_stat_by_name(stats, 'a')
++ fsb = utils.find_stat_by_name(stats, 'b')
++ cfsaa = fsa.children[fsa]
++ cfsba = fsb.children[fsa]
++ self.assertEqual(fsb.ttot, 10)
++ self.assertEqual(fsb.tsub, 1)
++ self.assertEqual(fsa.ttot, 13)
++ self.assertEqual(fsa.tsub, 12)
++ self.assertEqual(cfsaa.ttot, 5)
++ self.assertEqual(cfsaa.tsub, 5)
++ self.assertEqual(cfsba.ttot, 9)
++ self.assertEqual(cfsba.tsub, 4)
++
++ def test_aabb(self):
++ _timings = {"a_1": 13, "a_2": 10, "b_1": 9, "b_2": 5}
++ _yappi._set_test_timings(_timings)
++
++ self._ncall = 1
++
++ def a():
++ if self._ncall == 1:
++ self._ncall += 1
++ a()
++ elif self._ncall == 2:
++ b()
++ else:
++ return
++
++ def b():
++ if self._ncall == 2:
++ self._ncall += 1
++ b()
++ else:
++ return
++
++ stats = utils.run_and_get_func_stats(a)
++ fsa = utils.find_stat_by_name(stats, 'a')
++ fsb = utils.find_stat_by_name(stats, 'b')
++ cfsaa = fsa.children[fsa]
++ cfsab = fsa.children[fsb]
++ cfsbb = fsb.children[fsb]
++ self.assertEqual(fsa.ttot, 13)
++ self.assertEqual(fsa.tsub, 4)
++ self.assertEqual(fsb.ttot, 9)
++ self.assertEqual(fsb.tsub, 9)
++ self.assertEqual(cfsaa.ttot, 10)
++ self.assertEqual(cfsaa.tsub, 1)
++ self.assertEqual(cfsab.ttot, 9)
++ self.assertEqual(cfsab.tsub, 4)
++ self.assertEqual(cfsbb.ttot, 5)
++ self.assertEqual(cfsbb.tsub, 5)
++
++ def test_abbb(self):
++ _timings = {"a_1": 13, "b_1": 10, "b_2": 6, "b_3": 1}
++ _yappi._set_test_timings(_timings)
++
++ self._ncall = 1
++
++ def a():
++ if self._ncall == 1:
++ b()
++
++ def b():
++ if self._ncall == 3:
++ return
++ self._ncall += 1
++ b()
++
++ stats = utils.run_and_get_func_stats(a)
++ fsa = utils.find_stat_by_name(stats, 'a')
++ fsb = utils.find_stat_by_name(stats, 'b')
++ cfsab = fsa.children[fsb]
++ cfsbb = fsb.children[fsb]
++ self.assertEqual(fsa.ttot, 13)
++ self.assertEqual(fsa.tsub, 3)
++ self.assertEqual(fsb.ttot, 10)
++ self.assertEqual(fsb.tsub, 10)
++ self.assertEqual(fsb.ncall, 3)
++ self.assertEqual(fsb.nactualcall, 1)
++ self.assertEqual(cfsab.ttot, 10)
++ self.assertEqual(cfsab.tsub, 4)
++ self.assertEqual(cfsbb.ttot, 6)
++ self.assertEqual(cfsbb.tsub, 6)
++ self.assertEqual(cfsbb.nactualcall, 0)
++ self.assertEqual(cfsbb.ncall, 2)
++
++ def test_aaab(self):
++ _timings = {"a_1": 13, "a_2": 10, "a_3": 6, "b_1": 1}
++ _yappi._set_test_timings(_timings)
++
++ self._ncall = 1
++
++ def a():
++ if self._ncall == 3:
++ b()
++ return
++ self._ncall += 1
++ a()
++
++ def b():
++ return
++
++ stats = utils.run_and_get_func_stats(a)
++ fsa = utils.find_stat_by_name(stats, 'a')
++ fsb = utils.find_stat_by_name(stats, 'b')
++ cfsaa = fsa.children[fsa]
++ cfsab = fsa.children[fsb]
++ self.assertEqual(fsa.ttot, 13)
++ self.assertEqual(fsa.tsub, 12)
++ self.assertEqual(fsb.ttot, 1)
++ self.assertEqual(fsb.tsub, 1)
++ self.assertEqual(cfsaa.ttot, 10)
++ self.assertEqual(cfsaa.tsub, 9)
++ self.assertEqual(cfsab.ttot, 1)
++ self.assertEqual(cfsab.tsub, 1)
++
++ def test_abab(self):
++ _timings = {"a_1": 13, "b_1": 10, "a_2": 6, "b_2": 1}
++ _yappi._set_test_timings(_timings)
++
++ self._ncall = 1
++
++ def a():
++ b()
++
++ def b():
++ if self._ncall == 2:
++ return
++ self._ncall += 1
++ a()
++
++ stats = utils.run_and_get_func_stats(a)
++ fsa = utils.find_stat_by_name(stats, 'a')
++ fsb = utils.find_stat_by_name(stats, 'b')
++ cfsab = fsa.children[fsb]
++ cfsba = fsb.children[fsa]
++ self.assertEqual(fsa.ttot, 13)
++ self.assertEqual(fsa.tsub, 8)
++ self.assertEqual(fsb.ttot, 10)
++ self.assertEqual(fsb.tsub, 5)
++ self.assertEqual(cfsab.ttot, 10)
++ self.assertEqual(cfsab.tsub, 5)
++ self.assertEqual(cfsab.ncall, 2)
++ self.assertEqual(cfsab.nactualcall, 1)
++ self.assertEqual(cfsba.ttot, 6)
++ self.assertEqual(cfsba.tsub, 5)
++
++
++if __name__ == '__main__':
++ # import sys;sys.argv = ['', 'BasicUsage.test_run_as_script']
++ # import sys;sys.argv = ['', 'MultithreadedScenarios.test_subsequent_profile']
++ unittest.main()
+--
+2.34.1
+
diff --git a/meta-python/recipes-devtools/python/python3-yappi/0002-Fix-import-of-tests.utils-to-enable-pytest.patch b/meta-python/recipes-devtools/python/python3-yappi/0002-Fix-import-of-tests.utils-to-enable-pytest.patch
new file mode 100644
index 0000000000..96dd024125
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-yappi/0002-Fix-import-of-tests.utils-to-enable-pytest.patch
@@ -0,0 +1,101 @@
+From 28eac38566327091221aabbc164ea8e433c66e7e Mon Sep 17 00:00:00 2001
+From: Tim Orling <tim.orling@konsulko.com>
+Date: Sun, 24 Dec 2023 09:27:50 -0800
+Subject: [PATCH 2/2] Fix import of tests.utils to enable pytest
+
+Running the test cases with pytest leads to importlib errors
+because the "utils" module cannot be found.
+
+Upstream-Status: Submitted [https://github.com/sumerc/yappi/pull/164]
+
+Signed-off-by: Tim Orling <tim.orling@konsulko.com>
+---
+ tests/test_asyncio.py | 2 +-
+ tests/test_asyncio_context_vars.py | 2 +-
+ tests/test_functionality.py | 2 +-
+ tests/test_gevent.py | 2 +-
+ tests/test_hooks.py | 2 +-
+ tests/test_tags.py | 2 +-
+ 6 files changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/tests/test_asyncio.py b/tests/test_asyncio.py
+index 8e9e631..bb36f4a 100644
+--- a/tests/test_asyncio.py
++++ b/tests/test_asyncio.py
+@@ -2,7 +2,7 @@ import unittest
+ import yappi
+ import asyncio
+ import threading
+-from utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io
++from tests.utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io
+
+
+ async def async_sleep(sec):
+diff --git a/tests/test_asyncio_context_vars.py b/tests/test_asyncio_context_vars.py
+index 5bd750c..9a253c0 100644
+--- a/tests/test_asyncio_context_vars.py
++++ b/tests/test_asyncio_context_vars.py
+@@ -5,7 +5,7 @@ import contextvars
+ import functools
+ import time
+ import os
+-import utils
++import tests.utils as utils
+ import yappi
+
+ async_context_id = contextvars.ContextVar('async_context_id')
+diff --git a/tests/test_functionality.py b/tests/test_functionality.py
+index 38bbe67..8098f17 100644
+--- a/tests/test_functionality.py
++++ b/tests/test_functionality.py
+@@ -5,7 +5,7 @@ import threading
+ import unittest
+ import yappi
+ import _yappi
+-import utils
++import tests.utils as utils
+ import multiprocessing
+ import subprocess
+
+diff --git a/tests/test_gevent.py b/tests/test_gevent.py
+index ed9e6ae..502af5f 100644
+--- a/tests/test_gevent.py
++++ b/tests/test_gevent.py
+@@ -2,7 +2,7 @@ import unittest
+ import _yappi
+ import yappi
+ import threading
+-from utils import (
++from tests.utils import (
+ YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io, burn_io_gevent
+ )
+
+diff --git a/tests/test_hooks.py b/tests/test_hooks.py
+index 297c643..8c387fc 100644
+--- a/tests/test_hooks.py
++++ b/tests/test_hooks.py
+@@ -5,7 +5,7 @@ import unittest
+ import time
+
+ import yappi
+-import utils
++import tests.utils as utils
+
+
+ def a():
+diff --git a/tests/test_tags.py b/tests/test_tags.py
+index b0b531d..b5a4016 100644
+--- a/tests/test_tags.py
++++ b/tests/test_tags.py
+@@ -2,7 +2,7 @@ import unittest
+ import yappi
+ import threading
+ import time
+-from utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io
++from tests.utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io
+
+
+ class MultiThreadTests(YappiUnitTestCase):
+--
+2.34.1
+
diff --git a/meta-python/recipes-devtools/python/python3-yappi/run-ptest b/meta-python/recipes-devtools/python/python3-yappi/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-yappi/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-yappi_0.98.bb b/meta-python/recipes-devtools/python/python3-yappi_0.98.bb
deleted file mode 100644
index 07da5b6ebd..0000000000
--- a/meta-python/recipes-devtools/python/python3-yappi_0.98.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-require python-yappi.inc
-inherit setuptools3
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
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-yarl/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-devtools/python/python3-yarl_1.3.0.bb b/meta-python/recipes-devtools/python/python3-yarl_1.3.0.bb
deleted file mode 100644
index c5df44216b..0000000000
--- a/meta-python/recipes-devtools/python/python3-yarl_1.3.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit setuptools3
-require python-yarl.inc
diff --git a/meta-python/recipes-devtools/python/python3-yarl_1.9.4.bb b/meta-python/recipes-devtools/python/python3-yarl_1.9.4.bb
new file mode 100644
index 0000000000..29897b7f1c
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-yarl_1.9.4.bb
@@ -0,0 +1,33 @@
+SUMMARY = "The module provides handy URL class for url parsing and changing"
+HOMEPAGE = "https://github.com/aio-libs/yarl/"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
+
+SRC_URI[sha256sum] = "566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"
+
+SRC_URI += "file://run-ptest"
+
+PYPI_PACKAGE = "yarl"
+
+inherit pypi ptest python_setuptools_build_meta
+
+DEPENDS += " \
+ python3-expandvars-native \
+ python3-cython-native \
+"
+
+RDEPENDS:${PN} = "\
+ python3-multidict \
+ python3-idna \
+ python3-io \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-pytest \
+ python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
diff --git a/meta-python/recipes-devtools/python/python3-zeroconf_0.132.0.bb b/meta-python/recipes-devtools/python/python3-zeroconf_0.132.0.bb
new file mode 100644
index 0000000000..ea8ef1cb92
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-zeroconf_0.132.0.bb
@@ -0,0 +1,15 @@
+SUMMARY = "Pure Python Multicast DNS Service Discovery Library (Bonjour/Avahi compatible)"
+HOMEPAGE = "https://github.com/jstasiak/python-zeroconf"
+LICENSE = "LGPL-2.1-only"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=6;endline=6;md5=6517bdc8f2416f27ab725d4702f7aac3"
+
+SRC_URI[sha256sum] = "e2dddb9b8e6a9de3c43f943d8547300e6bd49b2043fd719ae830cfe0f2908a5c"
+
+DEPENDS += "python3-cython-native"
+
+inherit pypi python_poetry_core
+
+RDEPENDS:${PN} += " \
+ python3-ifaddr (>=0.1.7) \
+ python3-async-timeout \
+"
diff --git a/meta-python/recipes-devtools/python/python3-zipp_0.6.0.bb b/meta-python/recipes-devtools/python/python3-zipp_0.6.0.bb
deleted file mode 100644
index b78663fd61..0000000000
--- a/meta-python/recipes-devtools/python/python3-zipp_0.6.0.bb
+++ /dev/null
@@ -1,2 +0,0 @@
-inherit pypi setuptools3
-require python-zipp.inc
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_4.6.0.bb b/meta-python/recipes-devtools/python/python3-zopeinterface_4.6.0.bb
deleted file mode 100644
index be11858d34..0000000000
--- a/meta-python/recipes-devtools/python/python3-zopeinterface_4.6.0.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-inherit pypi setuptools3
-require python-zopeinterface.inc
-
-RDEPENDS_${PN}-test += "python3-unittest python3-doctest"
diff --git a/meta-python/recipes-devtools/python/python3-zopeinterface_6.3.bb b/meta-python/recipes-devtools/python/python3-zopeinterface_6.3.bb
new file mode 100644
index 0000000000..21d03f2e7d
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-zopeinterface_6.3.bb
@@ -0,0 +1,23 @@
+SUMMARY = "Interface definitions for Zope products"
+LICENSE = "ZPL-2.1"
+LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e54fd776274c1b7423ec128974bd9d46"
+
+PYPI_PACKAGE = "zope.interface"
+
+inherit pypi setuptools3
+SRC_URI[sha256sum] = "f83d6b4b22262d9a826c3bd4b2fbfafe1d0000f085ef8e44cd1328eea274ae6a"
+
+PACKAGES =. "${PN}-test "
+
+RPROVIDES:${PN} += "zope-interfaces"
+
+RDEPENDS:${PN}:class-target += "python3-datetime"
+RDEPENDS:${PN}-test += "python3-unittest python3-doctest"
+
+FILES:${PN}-dbg += "${PYTHON_SITEPACKAGES_DIR}/*.egg/*/*/.debug"
+FILES:${PN}-dev += "${PYTHON_SITEPACKAGES_DIR}/zope/interface/*.c"
+FILES:${PN}-doc += "${PYTHON_SITEPACKAGES_DIR}/zope/interface/*.txt"
+FILES:${PN}-test += " \
+ ${PYTHON_SITEPACKAGES_DIR}/zope/interface/tests \
+ ${PYTHON_SITEPACKAGES_DIR}/zope/interface/common/tests \
+"
diff --git a/meta-python/recipes-devtools/python/tftpy_0.8.2.bb b/meta-python/recipes-devtools/python/tftpy_0.8.2.bb
new file mode 100644
index 0000000000..c1b3234f72
--- /dev/null
+++ b/meta-python/recipes-devtools/python/tftpy_0.8.2.bb
@@ -0,0 +1,13 @@
+SUMMARY = "Tftpy is a TFTP library for the Python programming language. It includes client and server classes, with sample implementations."
+DESCRIPTION = "Tftpy is a TFTP library for the Python programming language. It \
+includes client and server classes, with sample implementations. Hooks are \
+included for easy inclusion in a UI for populating progress indicators. It \
+supports RFCs 1350, 2347, 2348 and the tsize option from RFC 2349."
+
+HOMEPAGE = "https://github.com/msoulier/tftpy"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=22770e72ae03c61f5bcc4e333b61368d"
+
+SRC_URI[sha256sum] = "e1d1a680efd88eba176b351175844253067392a9b0f8b81588e3ff2b9e7bbb5b"
+
+inherit pypi setuptools3
diff --git a/meta-python/recipes-devtools/python3-attrdict3/python3-attrdict3_2.0.2.bb b/meta-python/recipes-devtools/python3-attrdict3/python3-attrdict3_2.0.2.bb
new file mode 100644
index 0000000000..ee099c7ac9
--- /dev/null
+++ b/meta-python/recipes-devtools/python3-attrdict3/python3-attrdict3_2.0.2.bb
@@ -0,0 +1,14 @@
+SUMMARY = "AttrDict is an MIT-licensed library that provides mapping objects that allow their elements to be accessed both as keys and as attributes"
+HOMEPAGE = "https://pypi.org/project/attrdict3/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=2b37be7e71ebfc92a94bfacf6b20a1cc"
+
+DEPENDS = ""
+
+SRC_URI[sha256sum] = "004c171ca1120cc1755701db99d7fa4944afb1e68950434efdaa542513335fe8"
+
+inherit pypi setuptools3
+
+BBCLASSEXTEND = "native"
+
+RDEPENDS:${PN} += "python3-six"
diff --git a/meta-python/recipes-devtools/python3-gspread/python3-gspread_6.1.0.bb b/meta-python/recipes-devtools/python3-gspread/python3-gspread_6.1.0.bb
new file mode 100644
index 0000000000..482155856a
--- /dev/null
+++ b/meta-python/recipes-devtools/python3-gspread/python3-gspread_6.1.0.bb
@@ -0,0 +1,14 @@
+SUMMARY = "Google Spreadsheets Python API"
+HOMEPAGE = "https://github.com/burnash/gspread"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=9488e21983675fa56dc05af558b83e2f"
+
+SRC_URI[sha256sum] = "576b72b628b251d2ee41e02b982d3c714d511d2a5aa3a88e587ed9efc4d6e752"
+
+RDEPENDS:${PN} = " \
+ python3-google-auth \
+ python3-google-auth-oauthlib \
+ python3-strenum \
+ "
+
+inherit pypi python_flit_core
diff --git a/meta-python/recipes-devtools/python3-piccata/python3-piccata_2.0.3.bb b/meta-python/recipes-devtools/python3-piccata/python3-piccata_2.0.3.bb
new file mode 100644
index 0000000000..fadcc32c24
--- /dev/null
+++ b/meta-python/recipes-devtools/python3-piccata/python3-piccata_2.0.3.bb
@@ -0,0 +1,13 @@
+SUMMARY = "Python CoAP Toolkit"
+HOMEPAGE = "https://github.com/NordicSemiconductor/piccata"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e664eb75e2791c2e505e6e1c274e6d4f"
+
+SRCREV = "218d310e3d840715b1c8e67cefd5b6d71a2d7a1a"
+SRC_URI = "git://github.com/NordicSemiconductor/piccata.git;protocol=https;branch=master"
+
+S = "${WORKDIR}/git"
+
+inherit setuptools3
+
+RDEPENDS:${PN} += "python3-core python3-datetime python3-io python3-logging python3-math"
diff --git a/meta-python/recipes-devtools/python3-reedsolo/python3-reedsolo_2.0.13.bb b/meta-python/recipes-devtools/python3-reedsolo/python3-reedsolo_2.0.13.bb
new file mode 100644
index 0000000000..bb5b973d86
--- /dev/null
+++ b/meta-python/recipes-devtools/python3-reedsolo/python3-reedsolo_2.0.13.bb
@@ -0,0 +1,10 @@
+SUMMARY = "Pure-Python Reed Solomon encoder/decoder"
+HOMEPAGE = "https://github.com/tomerfiliba/reedsolomon"
+LICENSE = "MIT-0 | Unlicense"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ffde61aeb8917e70e0257e0a4b6d103c"
+
+SRC_URI[sha256sum] = "71b4121c6860a55899435c552051a19d5f023c50358be4b1c0fa0c6e2f4ac717"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-core"
diff --git a/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/0001-sip-Conditionally-use-GetAssertStackTrace-under-USE_.patch b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/0001-sip-Conditionally-use-GetAssertStackTrace-under-USE_.patch
new file mode 100644
index 0000000000..f8a3061ae0
--- /dev/null
+++ b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/0001-sip-Conditionally-use-GetAssertStackTrace-under-USE_.patch
@@ -0,0 +1,32 @@
+From b9f95c06b2e7a525f4f93d705976882e8dcba6ab Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Tue, 20 Dec 2022 09:46:31 -0800
+Subject: [PATCH] sip: Conditionally use GetAssertStackTrace under
+ USE_STACKWALKER
+
+Musl eg. does not implement stack walker ( backtrace ) therefore it gets
+disabled for wxwidgets on those systems. This needs to be checked before using
+GetAssertStackTrace()
+
+Upstream-Status: Pending
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ sip/cpp/sip_corewxAppTraits.cpp | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/sip/cpp/sip_corewxAppTraits.cpp b/sip/cpp/sip_corewxAppTraits.cpp
+index 9c9f9d5b..1d2d2f90 100644
+--- a/sip/cpp/sip_corewxAppTraits.cpp
++++ b/sip/cpp/sip_corewxAppTraits.cpp
+@@ -471,7 +471,11 @@ static PyObject *meth_wxAppTraits_GetAssertStackTrace(PyObject *sipSelf, PyObjec
+ PyErr_Clear();
+
+ Py_BEGIN_ALLOW_THREADS
++#if wxUSE_STACKWALKER
+ sipRes = new ::wxString((sipSelfWasArg ? sipCpp-> ::wxAppTraits::GetAssertStackTrace() : sipCpp->GetAssertStackTrace()));
++#else
++ sipRes = new ::wxString("");
++#endif
+ Py_END_ALLOW_THREADS
+
+ if (PyErr_Occurred())
diff --git a/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/add-back-option-build-base.patch b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/add-back-option-build-base.patch
new file mode 100644
index 0000000000..a46f3f870a
--- /dev/null
+++ b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/add-back-option-build-base.patch
@@ -0,0 +1,22 @@
+Add back default user options for cross build.
+
+Upstream-Status: Pending [oe specific]
+
+Signed-off-by: Kai Kang <kai.kang@windriver.com>
+---
+ setup.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/setup.py b/setup.py
+index a215da7..dccfeb3 100644
+--- a/setup.py
++++ b/setup.py
+@@ -105,7 +105,7 @@ class wx_build(orig_build):
+ Delegate to build.py for doing the actual build, (including wxWidgets)
+ instead of letting distutils do it all.
+ """
+- user_options = [
++ user_options = orig_build.user_options + [
+ ('skip-build', None, 'skip building the C/C++ code (assumes it has already been done)'),
+ ]
+ boolean_options = ['skip-build']
diff --git a/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/not-overwrite-cflags-cxxflags.patch b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/not-overwrite-cflags-cxxflags.patch
new file mode 100644
index 0000000000..67f7949b38
--- /dev/null
+++ b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/not-overwrite-cflags-cxxflags.patch
@@ -0,0 +1,28 @@
+Not overwrite CFLAGS and CXXFLAGS. It also avoid buildpaths qa issue:
+
+ WARNING: python3-wxgtk4-4.2.0-r0 do_package_qa: QA Issue: File
+ /usr/lib64/python3.11/site-packages/wx/.debug/_xml.cpython-311-aarch64-linux-gnu.so
+ in package python3-wxgtk4-dbg contains reference to TMPDIR [buildpaths]
+
+Upstream-Status: Pending [oe specific]
+
+Signed-off-by: Kai Kang <kai.kang@windriver.com>
+---
+ wscript | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/wscript b/wscript
+index 067b307..50d96d1 100644
+--- a/wscript
++++ b/wscript
+@@ -195,8 +195,8 @@ def configure(conf):
+ cfg.finishSetup(conf.env.wx_config, conf.env.debug,
+ 'mingw32' if isWindows and not conf.env.use_msvc else None)
+
+- conf.env.CFLAGS = cfg.cflags[:]
+- conf.env.CXXFLAGS = cfg.cxxflags[:]
++ #conf.env.CFLAGS = cfg.cflags[:]
++ #conf.env.CXXFLAGS = cfg.cxxflags[:]
+ conf.env.CFLAGS_WX = list()
+ conf.env.CXXFLAGS_WX = list()
+ conf.env.CFLAGS_WXPY = list()
diff --git a/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/wxgtk-fixup-build-scripts.patch b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/wxgtk-fixup-build-scripts.patch
new file mode 100644
index 0000000000..0d65ebb598
--- /dev/null
+++ b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4/wxgtk-fixup-build-scripts.patch
@@ -0,0 +1,53 @@
+Fix issues in build scripts:
+
+* remove hardcode lib path from buildtools/config.py which is not suitable for
+ cross build
+* only build target 'build_py' in setup.py
+* do not override self.install_lib with self.install_platlib which causes
+ package issue when multilib is enabled.
+
+Upstream-Status: Pending [cross build specific]
+
+Signed-off-by: Kai Kang <kai.kang@windriver.com>
+---
+ buildtools/config.py | 4 ++--
+ setup.py | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/buildtools/config.py b/buildtools/config.py
+index c837e5d..d426005 100644
+--- a/buildtools/config.py
++++ b/buildtools/config.py
+@@ -312,8 +312,8 @@ class Configuration(object):
+ # wx-config doesn't output that for some reason. For now, just
+ # add it unconditionally but we should really check if the lib is
+ # really found there or wx-config should be fixed.
+- if self.WXPORT != 'msw':
+- self.libdirs.append("/usr/X11R6/lib")
++ #if self.WXPORT != 'msw':
++ # self.libdirs.append("/usr/X11R6/lib")
+
+ # Move the various -I, -D, etc. flags we got from the config scripts
+ # into the distutils lists.
+diff --git a/setup.py b/setup.py
+index 64bec4b..fb29253 100644
+--- a/setup.py
++++ b/setup.py
+@@ -130,7 +130,7 @@ class wx_build(orig_build):
+ 'message and the wxWidgets and Phoenix build steps in the future.\n')
+
+ # Use the same Python that is running this script.
+- cmd = ['"{}"'.format(sys.executable), '-u', 'build.py', 'build']
++ cmd = ['"{}"'.format(sys.executable), '-u', 'build.py', 'build_py']
+ cmd = ' '.join(cmd)
+ runcmd(cmd)
+
+@@ -233,7 +233,7 @@ if haveWheel:
+ class wx_install(orig_install):
+ def finalize_options(self):
+ orig_install.finalize_options(self)
+- self.install_lib = self.install_platlib
++ #self.install_lib = self.install_platlib
+
+ def run(self):
+ self.run_command("build")
diff --git a/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4_4.2.1.bb b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4_4.2.1.bb
new file mode 100644
index 0000000000..fb011cb71b
--- /dev/null
+++ b/meta-python/recipes-devtools/python3-wxgtk4/python3-wxgtk4_4.2.1.bb
@@ -0,0 +1,38 @@
+DESCRIPTION = "Python3 interface to the wxWidgets Cross-platform C++ GUI toolkit."
+HOMEPAGE = "http://www.wxpython.org"
+
+LICENSE = "LGPL-2.0-only & WXwindows"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=bdabf9e11191e2b9d3b6aef5f338ec00"
+
+DEPENDS = "python3-attrdict3-native python3-six-native wxwidgets-native \
+ wxwidgets \
+ "
+
+PYPI_PACKAGE = "wxPython"
+
+SRC_URI += "file://add-back-option-build-base.patch \
+ file://wxgtk-fixup-build-scripts.patch \
+ file://not-overwrite-cflags-cxxflags.patch \
+ file://0001-sip-Conditionally-use-GetAssertStackTrace-under-USE_.patch \
+ "
+SRC_URI[sha256sum] = "e48de211a6606bf072ec3fa778771d6b746c00b7f4b970eb58728ddf56d13d5c"
+
+S = "${WORKDIR}/wxPython-${PV}"
+
+inherit pypi setuptools3 pkgconfig features_check
+
+REQUIRED_DISTRO_FEATURES = "x11"
+
+export WX_CONFIG = "'${RECIPE_SYSROOT_NATIVE}${bindir}/wx-config --prefix=${STAGING_EXECPREFIXDIR} --baselib=${baselib}'"
+
+RDEPENDS:${PN} = "\
+ python3-difflib \
+ python3-image \
+ python3-numpy \
+ python3-pillow \
+ python3-pip \
+ python3-pprint \
+ python3-pycairo \
+ python3-six \
+ python3-xml \
+"
diff --git a/meta-python/recipes-devtools/python3_oauth2client/python3-oauth2client_4.1.3.bb b/meta-python/recipes-devtools/python3_oauth2client/python3-oauth2client_4.1.3.bb
new file mode 100644
index 0000000000..d87e289c5f
--- /dev/null
+++ b/meta-python/recipes-devtools/python3_oauth2client/python3-oauth2client_4.1.3.bb
@@ -0,0 +1,19 @@
+DESCRIPTION = "OAuth 2.0 client library"
+
+HOMEPAGE = "http://github.com/google/oauth2client/"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=038e1390e94fe637991fa5569daa62bc"
+
+inherit pypi
+
+SRC_URI[sha256sum] = "d486741e451287f69568a4d26d70d9acd73a2bbfa275746c535b4209891cccc6"
+
+RDEPENDS:${PN} += " \
+ python3-httplib2 \
+ python3-pyasn1 \
+ python3-pyasn1-modules \
+ python3-rsa \
+ python3-six \
+ "
+
+inherit setuptools3
diff --git a/meta-python/recipes-extended/python-blivet/python3-blivet/0001-comment-out-selinux.patch b/meta-python/recipes-extended/python-blivet/python3-blivet/0001-comment-out-selinux.patch
deleted file mode 100644
index 90fa387b01..0000000000
--- a/meta-python/recipes-extended/python-blivet/python3-blivet/0001-comment-out-selinux.patch
+++ /dev/null
@@ -1,70 +0,0 @@
-From fc8e93530ba017ecfe111e53d3cbdc3a5b3ac286 Mon Sep 17 00:00:00 2001
-From: Hongxu Jia <hongxu.jia@windriver.com>
-Date: Fri, 23 Nov 2018 16:58:38 +0800
-Subject: [PATCH 01/11] comment out selinux
-
-Upstream-Status: Inappropriate [oe specific]
-
-Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
----
- blivet/flags.py | 5 +++--
- blivet/util.py | 6 +++++-
- 2 files changed, 8 insertions(+), 3 deletions(-)
-
-diff --git a/blivet/flags.py b/blivet/flags.py
-index 4e26d82..94324ff 100644
---- a/blivet/flags.py
-+++ b/blivet/flags.py
-@@ -20,7 +20,7 @@
- #
-
- import shlex
--import selinux
-+#import selinux
-
-
- class Flags(object):
-@@ -47,7 +47,8 @@ class Flags(object):
- #
- # enable/disable functionality
- #
-- self.selinux = selinux.is_selinux_enabled()
-+ #self.selinux = selinux.is_selinux_enabled()
-+ self.selinux = False
- self.multipath = True
- self.dmraid = True
- self.ibft = True
-diff --git a/blivet/util.py b/blivet/util.py
-index 9daf151..4eac8b9 100644
---- a/blivet/util.py
-+++ b/blivet/util.py
-@@ -3,7 +3,7 @@ import functools
- import glob
- import itertools
- import os
--import selinux
-+#import selinux
- import subprocess
- import re
- import sys
-@@ -444,6 +444,8 @@ def get_cow_sysfs_path(dev_path, dev_sysfsPath):
- def match_path_context(path):
- """ Return the default SELinux context for the given path. """
- context = None
-+ return context
-+
- try:
- context = selinux.matchpathcon(os.path.normpath(path), 0)[1]
- except OSError as e:
-@@ -468,6 +470,8 @@ def set_file_context(path, context, root=None):
-
- True if successful, False if not.
- """
-+ return False
-+
- if root is None:
- root = '/'
-
---
-2.7.4
-
diff --git a/meta-python/recipes-extended/python-blivet/python3-blivet/0002-run_program-support-timeout.patch b/meta-python/recipes-extended/python-blivet/python3-blivet/0002-run_program-support-timeout.patch
index 5b388599bf..d277e8b0f7 100644
--- a/meta-python/recipes-extended/python-blivet/python3-blivet/0002-run_program-support-timeout.patch
+++ b/meta-python/recipes-extended/python-blivet/python3-blivet/0002-run_program-support-timeout.patch
@@ -1,4 +1,4 @@
-From 713cf821ebe17f9e1771502a85e0905ea04dafae Mon Sep 17 00:00:00 2001
+From 8a18a6c1dea7cce6669d0eeb4230e85aa88d8e44 Mon Sep 17 00:00:00 2001
From: Hongxu Jia <hongxu.jia@windriver.com>
Date: Fri, 23 Nov 2018 17:03:58 +0800
Subject: [PATCH 02/11] run_program support timeout
@@ -7,14 +7,14 @@ Upstream-Status: Pending
Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
- blivet/util.py | 70 ++++++++++++++++++++++++++++++++++------------------------
+ blivet/util.py | 70 +++++++++++++++++++++++++++++---------------------
1 file changed, 41 insertions(+), 29 deletions(-)
diff --git a/blivet/util.py b/blivet/util.py
-index 4eac8b9..4f05076 100644
+index f8a8f88..a5da7b6 100644
--- a/blivet/util.py
+++ b/blivet/util.py
-@@ -158,6 +158,30 @@ class Path(str):
+@@ -171,6 +171,30 @@ class Path(str):
def __hash__(self):
return self._path.__hash__()
@@ -45,7 +45,7 @@ index 4eac8b9..4f05076 100644
def _run_program(argv, root='/', stdin=None, env_prune=None, stderr_to_stdout=False, binary_output=False):
if env_prune is None:
-@@ -180,35 +204,23 @@ def _run_program(argv, root='/', stdin=None, env_prune=None, stderr_to_stdout=Fa
+@@ -193,35 +217,23 @@ def _run_program(argv, root='/', stdin=None, env_prune=None, stderr_to_stdout=Fa
stderr_dir = subprocess.STDOUT
else:
stderr_dir = subprocess.PIPE
@@ -98,6 +98,3 @@ index 4eac8b9..4f05076 100644
def run_program(*args, **kwargs):
---
-2.7.4
-
diff --git a/meta-python/recipes-extended/python-blivet/python3-blivet/0003-support-infinit-timeout.patch b/meta-python/recipes-extended/python-blivet/python3-blivet/0003-support-infinit-timeout.patch
index 861b2cdd46..8ab65a3e22 100644
--- a/meta-python/recipes-extended/python-blivet/python3-blivet/0003-support-infinit-timeout.patch
+++ b/meta-python/recipes-extended/python-blivet/python3-blivet/0003-support-infinit-timeout.patch
@@ -1,4 +1,4 @@
-From 5d5436dfa3bdde7b4e87ce5a40cbc724199847d6 Mon Sep 17 00:00:00 2001
+From 112b825541f498762f373cfc9918e444dda74095 Mon Sep 17 00:00:00 2001
From: Hongxu Jia <hongxu.jia@windriver.com>
Date: Mon, 8 May 2017 16:18:02 +0800
Subject: [PATCH 03/11] support infinit timeout
@@ -11,10 +11,10 @@ Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/blivet/util.py b/blivet/util.py
-index 4f05076..7e89949 100644
+index a5da7b6..58117ae 100644
--- a/blivet/util.py
+++ b/blivet/util.py
-@@ -158,6 +158,7 @@ class Path(str):
+@@ -171,6 +171,7 @@ class Path(str):
def __hash__(self):
return self._path.__hash__()
@@ -22,7 +22,7 @@ index 4f05076..7e89949 100644
def timeout_command(argv, timeout, *args, **kwargs):
"""call shell-command and either return its output or kill it
if it doesn't normally exit within timeout seconds and return None"""
-@@ -169,7 +170,7 @@ def timeout_command(argv, timeout, *args, **kwargs):
+@@ -182,7 +183,7 @@ def timeout_command(argv, timeout, *args, **kwargs):
while proc.poll() is None:
time.sleep(0.1)
now = datetime.datetime.now()
@@ -31,7 +31,7 @@ index 4f05076..7e89949 100644
os.kill(proc.pid, signal.SIGKILL)
os.waitpid(-1, os.WNOHANG)
program_log.debug("%d seconds timeout" % timeout)
-@@ -183,7 +184,7 @@ def timeout_command(argv, timeout, *args, **kwargs):
+@@ -196,7 +197,7 @@ def timeout_command(argv, timeout, *args, **kwargs):
program_log.debug("Return code: %d", proc.returncode)
return (proc.returncode, proc.stdout.read())
@@ -40,7 +40,7 @@ index 4f05076..7e89949 100644
if env_prune is None:
env_prune = []
-@@ -192,7 +193,10 @@ def _run_program(argv, root='/', stdin=None, env_prune=None, stderr_to_stdout=Fa
+@@ -205,7 +206,10 @@ def _run_program(argv, root='/', stdin=None, env_prune=None, stderr_to_stdout=Fa
os.chroot(root)
with program_log_lock: # pylint: disable=not-context-manager
@@ -52,7 +52,7 @@ index 4f05076..7e89949 100644
env = os.environ.copy()
env.update({"LC_ALL": "C",
-@@ -205,7 +209,7 @@ def _run_program(argv, root='/', stdin=None, env_prune=None, stderr_to_stdout=Fa
+@@ -218,7 +222,7 @@ def _run_program(argv, root='/', stdin=None, env_prune=None, stderr_to_stdout=Fa
else:
stderr_dir = subprocess.PIPE
@@ -61,6 +61,3 @@ index 4f05076..7e89949 100644
stdin=stdin,
stdout=subprocess.PIPE,
stderr=stderr_dir,
---
-2.7.4
-
diff --git a/meta-python/recipes-extended/python-blivet/python3-blivet/0004-fix-new.roots-object-is-not-iterable.patch b/meta-python/recipes-extended/python-blivet/python3-blivet/0004-fix-new.roots-object-is-not-iterable.patch
deleted file mode 100644
index 526a3b1fb2..0000000000
--- a/meta-python/recipes-extended/python-blivet/python3-blivet/0004-fix-new.roots-object-is-not-iterable.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From 3bb8d08bdec2f79bb13c0a44b81718d26e5bdabc Mon Sep 17 00:00:00 2001
-From: Hongxu Jia <hongxu.jia@windriver.com>
-Date: Mon, 8 May 2017 16:30:20 +0800
-Subject: [PATCH 04/11] fix new.roots object is not iterable
-
-Upstream-Status: Pending
-
-Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
----
- blivet/blivet.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/blivet/blivet.py b/blivet/blivet.py
-index ea08837..91c92b2 100644
---- a/blivet/blivet.py
-+++ b/blivet/blivet.py
-@@ -1206,7 +1206,7 @@ class Blivet(object):
- p = partition.disk.format.parted_disk.getPartitionByPath(partition.path)
- partition.parted_partition = p
-
-- for root in new.roots:
-+ for root in new.roots or []:
- root.swaps = [new.devicetree.get_device_by_id(d.id, hidden=True) for d in root.swaps]
- root.swaps = [s for s in root.swaps if s]
-
---
-2.7.4
-
diff --git a/meta-python/recipes-extended/python-blivet/python3-blivet/0005-fix-incorrect-timeout-while-system-time-changed.patch b/meta-python/recipes-extended/python-blivet/python3-blivet/0005-fix-incorrect-timeout-while-system-time-changed.patch
index 9c5d53b430..795e4f1206 100644
--- a/meta-python/recipes-extended/python-blivet/python3-blivet/0005-fix-incorrect-timeout-while-system-time-changed.patch
+++ b/meta-python/recipes-extended/python-blivet/python3-blivet/0005-fix-incorrect-timeout-while-system-time-changed.patch
@@ -1,4 +1,4 @@
-From f783b9b00da5df176fcd7927b752f574ca6db319 Mon Sep 17 00:00:00 2001
+From c645c83628b2290855cbd225e13c038ab75a7f74 Mon Sep 17 00:00:00 2001
From: Hongxu Jia <hongxu.jia@windriver.com>
Date: Fri, 26 Aug 2016 02:02:49 -0400
Subject: [PATCH 05/11] fix incorrect timeout while system time changed
@@ -22,10 +22,10 @@ Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/blivet/util.py b/blivet/util.py
-index 7e89949..5571e73 100644
+index 58117ae..5bc5804 100644
--- a/blivet/util.py
+++ b/blivet/util.py
-@@ -163,14 +163,14 @@ def timeout_command(argv, timeout, *args, **kwargs):
+@@ -176,14 +176,14 @@ def timeout_command(argv, timeout, *args, **kwargs):
"""call shell-command and either return its output or kill it
if it doesn't normally exit within timeout seconds and return None"""
import subprocess, datetime, os, time, signal
@@ -43,6 +43,3 @@ index 7e89949..5571e73 100644
os.kill(proc.pid, signal.SIGKILL)
os.waitpid(-1, os.WNOHANG)
program_log.debug("%d seconds timeout" % timeout)
---
-2.7.4
-
diff --git a/meta-python/recipes-extended/python-blivet/python3-blivet/0006-tweak-btrfs-packages.patch b/meta-python/recipes-extended/python-blivet/python3-blivet/0006-tweak-btrfs-packages.patch
index 2e53a64777..6c53f03db1 100644
--- a/meta-python/recipes-extended/python-blivet/python3-blivet/0006-tweak-btrfs-packages.patch
+++ b/meta-python/recipes-extended/python-blivet/python3-blivet/0006-tweak-btrfs-packages.patch
@@ -1,7 +1,7 @@
-From 8932ae933f2b6acf5e98c9956beff69ae430eed2 Mon Sep 17 00:00:00 2001
+From b55b1023f8f1ad3121928eb9d0ee9902f5474752 Mon Sep 17 00:00:00 2001
From: Hongxu Jia <hongxu.jia@windriver.com>
Date: Mon, 8 May 2017 16:33:15 +0800
-Subject: [PATCH 06/11] tweak btrfs packages
+Subject: [PATCH] tweak btrfs packages
In oe-cre/yocto, we name btrfs package with btrfs-tools,
rather than btrfs-progs.
@@ -15,10 +15,10 @@ Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/blivet/devices/btrfs.py b/blivet/devices/btrfs.py
-index cada940..7e4d4b8 100644
+index c446e7e..37c183e 100644
--- a/blivet/devices/btrfs.py
+++ b/blivet/devices/btrfs.py
-@@ -55,7 +55,7 @@ class BTRFSDevice(StorageDevice):
+@@ -58,7 +58,7 @@ class BTRFSDevice(StorageDevice):
""" Base class for BTRFS volume and sub-volume devices. """
_type = "btrfs"
@@ -28,10 +28,10 @@ index cada940..7e4d4b8 100644
def __init__(self, *args, **kwargs):
diff --git a/blivet/formats/fs.py b/blivet/formats/fs.py
-index 81e367f..55e5d57 100644
+index 1e102b6..f16941e 100644
--- a/blivet/formats/fs.py
+++ b/blivet/formats/fs.py
-@@ -926,7 +926,7 @@ class BTRFS(FS):
+@@ -1050,7 +1050,7 @@ class BTRFS(FS):
_formattable = True
_linux_native = True
_supported = True
@@ -40,6 +40,3 @@ index 81e367f..55e5d57 100644
_min_size = Size("256 MiB")
_max_size = Size("16 EiB")
_mkfs_class = fsmkfs.BTRFSMkfs
---
-2.7.4
-
diff --git a/meta-python/recipes-extended/python-blivet/python3-blivet/0007-invoking-mount-with-infinite-timeout.patch b/meta-python/recipes-extended/python-blivet/python3-blivet/0007-invoking-mount-with-infinite-timeout.patch
index b2606d7699..809f4e1584 100644
--- a/meta-python/recipes-extended/python-blivet/python3-blivet/0007-invoking-mount-with-infinite-timeout.patch
+++ b/meta-python/recipes-extended/python-blivet/python3-blivet/0007-invoking-mount-with-infinite-timeout.patch
@@ -1,4 +1,4 @@
-From f53481dc4a56b8a996628733553e080bb0aafdd7 Mon Sep 17 00:00:00 2001
+From f159d71d742ace5640c7810bcc27365f8fde95a3 Mon Sep 17 00:00:00 2001
From: Hongxu Jia <hongxu.jia@windriver.com>
Date: Fri, 23 Nov 2018 17:07:22 +0800
Subject: [PATCH 07/11] invoking mount with infinite timeout
@@ -14,10 +14,10 @@ Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/blivet/util.py b/blivet/util.py
-index 5571e73..02c8033 100644
+index 5bc5804..9de77e1 100644
--- a/blivet/util.py
+++ b/blivet/util.py
-@@ -258,7 +258,7 @@ def mount(device, mountpoint, fstype, options=None):
+@@ -271,7 +271,7 @@ def mount(device, mountpoint, fstype, options=None):
makedirs(mountpoint)
argv = ["mount", "-t", fstype, "-o", options, device, mountpoint]
@@ -26,6 +26,3 @@ index 5571e73..02c8033 100644
def umount(mountpoint):
---
-2.7.4
-
diff --git a/meta-python/recipes-extended/python-blivet/python3-blivet/0008-use-oe-variable-to-replace-hardcoded-dir.patch b/meta-python/recipes-extended/python-blivet/python3-blivet/0008-use-oe-variable-to-replace-hardcoded-dir.patch
index ade1862d78..d3ab8f8526 100644
--- a/meta-python/recipes-extended/python-blivet/python3-blivet/0008-use-oe-variable-to-replace-hardcoded-dir.patch
+++ b/meta-python/recipes-extended/python-blivet/python3-blivet/0008-use-oe-variable-to-replace-hardcoded-dir.patch
@@ -1,4 +1,4 @@
-From 12e2579333258d1a690f8718e91b0f217078e886 Mon Sep 17 00:00:00 2001
+From 6a85945c060154581f5a129a6a946258bf9333c4 Mon Sep 17 00:00:00 2001
From: Hongxu Jia <hongxu.jia@windriver.com>
Date: Mon, 8 May 2017 03:54:12 -0400
Subject: [PATCH 08/11] use oe variable to replace hardcoded dir
@@ -6,29 +6,30 @@ Subject: [PATCH 08/11] use oe variable to replace hardcoded dir
Upstream-Status: Pending
Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
+
+Rebase for python3-blivet 3.4.0.
+
+Signed-off-by: Kai Kang <kai.kang@windriver.com>
---
setup.py | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/setup.py b/setup.py
-index b745a79..b5b4258 100644
+index e6bb3f3..700085b 100644
--- a/setup.py
+++ b/setup.py
-@@ -61,10 +61,10 @@ class blivet_sdist(sdist):
+@@ -73,10 +73,10 @@ class blivet_sdist(sdist):
data_files = [
- ('/etc/dbus-1/system.d', ['dbus/blivet.conf']),
-- ('/usr/share/dbus-1/system-services', ['dbus/com.redhat.Blivet1.service']),
+- ('/usr/share/dbus-1/system-services', ['dbus/com.redhat.Blivet0.service']),
- ('/usr/libexec', ['dbus/blivetd']),
- ('/usr/lib/systemd/system', ['dbus/blivet.service'])
+ (os.environ.get('sysconfdir')+'/dbus-1/system.d', ['dbus/blivet.conf']),
-+ (os.environ.get('datadir')+'/dbus-1/system-services', ['dbus/com.redhat.Blivet1.service']),
++ (os.environ.get('datadir')+'/dbus-1/system-services', ['dbus/com.redhat.Blivet0.service']),
+ (os.environ.get('libexecdir'), ['dbus/blivetd']),
+ (os.environ.get('systemd_system_unitdir'), ['dbus/blivet.service'])
]
---
-2.7.4
-
diff --git a/meta-python/recipes-extended/python-blivet/python3-blivet/0010-invoking-mkfs-with-infinite-timeout.patch b/meta-python/recipes-extended/python-blivet/python3-blivet/0010-invoking-mkfs-with-infinite-timeout.patch
index f128490458..394a818aa2 100644
--- a/meta-python/recipes-extended/python-blivet/python3-blivet/0010-invoking-mkfs-with-infinite-timeout.patch
+++ b/meta-python/recipes-extended/python-blivet/python3-blivet/0010-invoking-mkfs-with-infinite-timeout.patch
@@ -1,4 +1,4 @@
-From 33844f6773a676bd57240954e402ae9a843663a4 Mon Sep 17 00:00:00 2001
+From abadd821acffd5dbc870f86dad3c3a6bf3f2f74f Mon Sep 17 00:00:00 2001
From: Hongxu Jia <hongxu.jia@windriver.com>
Date: Fri, 16 Jun 2017 15:43:00 +0800
Subject: [PATCH 10/11] invoking mkfs with infinite timeout
@@ -9,23 +9,24 @@ lots of disks, or with slow disks.
Upstream-Status: Pending
Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
+
+Rebase for python3-blivet 3.4.0.
+
+Signed-off-by: Kai Kang <kai.kang@windriver.com>
---
blivet/tasks/fsmkfs.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/blivet/tasks/fsmkfs.py b/blivet/tasks/fsmkfs.py
-index ad166aa..7bf5075 100644
+index e9daa9e..2174cc3 100644
--- a/blivet/tasks/fsmkfs.py
+++ b/blivet/tasks/fsmkfs.py
-@@ -170,7 +170,7 @@ class FSMkfs(task.BasicApplication, FSMkfsTask):
+@@ -207,7 +207,7 @@ class FSMkfs(task.BasicApplication, FSMkfsTask):
options = options or []
- cmd = self._mkfs_command(options, label, set_uuid)
+ cmd = self._mkfs_command(options, label, set_uuid, nodiscard)
try:
- ret = util.run_program(cmd)
+ ret = util.run_program(cmd, timeout=-1)
except OSError as e:
raise FSError(e)
---
-2.7.4
-
diff --git a/meta-python/recipes-extended/python-blivet/python3-blivet/0011-invoking-dd-with-infinite-timeout.patch b/meta-python/recipes-extended/python-blivet/python3-blivet/0011-invoking-dd-with-infinite-timeout.patch
index 13c2933f0a..ea4cffa9b3 100644
--- a/meta-python/recipes-extended/python-blivet/python3-blivet/0011-invoking-dd-with-infinite-timeout.patch
+++ b/meta-python/recipes-extended/python-blivet/python3-blivet/0011-invoking-dd-with-infinite-timeout.patch
@@ -1,7 +1,7 @@
-From 21ca2b859a49e96a230d55a7866dfc7ed5d1366c Mon Sep 17 00:00:00 2001
+From 5ee527fab06f9d33b162a6cd0c068d7b3ac2ecb0 Mon Sep 17 00:00:00 2001
From: Hongxu Jia <hongxu.jia@windriver.com>
Date: Tue, 6 Mar 2018 17:28:56 +0800
-Subject: [PATCH 11/11] invoking dd with infinite timeout
+Subject: [PATCH] invoking dd with infinite timeout
This large timeout is needed when running on machines with
lots of disks, or with slow disks.
@@ -14,10 +14,10 @@ Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/blivet/devices/partition.py b/blivet/devices/partition.py
-index 623e1c9..141d8ad 100644
+index 2d67be8..a4cf9a0 100644
--- a/blivet/devices/partition.py
+++ b/blivet/devices/partition.py
-@@ -618,7 +618,7 @@ class PartitionDevice(StorageDevice):
+@@ -677,7 +677,7 @@ class PartitionDevice(StorageDevice):
cmd = ["dd", "if=/dev/zero", "of=%s" % device, "bs=%d" % bs,
"seek=%d" % start, "count=%d" % count]
try:
@@ -26,6 +26,3 @@ index 623e1c9..141d8ad 100644
except OSError as e:
log.error(str(e))
finally:
---
-2.7.4
-
diff --git a/meta-python/recipes-extended/python-blivet/python3-blivet_3.1.4.bb b/meta-python/recipes-extended/python-blivet/python3-blivet_3.9.2.bb
index fe9d27ab8f..f0ce981480 100644
--- a/meta-python/recipes-extended/python-blivet/python3-blivet_3.1.4.bb
+++ b/meta-python/recipes-extended/python-blivet/python3-blivet_3.9.2.bb
@@ -1,19 +1,13 @@
DESCRIPTION = "A python module for system storage configuration"
HOMEPAGE = "http://fedoraproject.org/wiki/blivet"
-LICENSE = "LGPLv2+"
+LICENSE = "LGPL-2.0-or-later"
SECTION = "devel/python"
LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263"
-S = "${WORKDIR}/git"
-B = "${S}"
-
-SRCREV = "9b5ad2d5b5df159963e1c6c24523e1dfe1f71435"
-SRC_URI = "git://github.com/rhinstaller/blivet;branch=3.1-release \
- file://0001-comment-out-selinux.patch \
+SRC_URI += "\
file://0002-run_program-support-timeout.patch \
file://0003-support-infinit-timeout.patch \
- file://0004-fix-new.roots-object-is-not-iterable.patch \
file://0005-fix-incorrect-timeout-while-system-time-changed.patch \
file://0006-tweak-btrfs-packages.patch \
file://0007-invoking-mount-with-infinite-timeout.patch \
@@ -22,25 +16,21 @@ SRC_URI = "git://github.com/rhinstaller/blivet;branch=3.1-release \
file://0010-invoking-mkfs-with-infinite-timeout.patch \
file://0011-invoking-dd-with-infinite-timeout.patch \
"
+SRC_URI[sha256sum] = "9d97e37ebba01db28a1e6155cbd71c54fb55e9c2be5921982dc85bed316d8cfe"
-UPSTREAM_CHECK_GITTAGREGEX = "blivet-(?P<pver>\d+(\.\d+)+)$"
+inherit pypi features_check systemd setuptools3_legacy
-inherit distro_features_check
REQUIRED_DISTRO_FEATURES = "systemd"
-inherit setuptools3 python3native
-
-RDEPENDS_${PN} += "python3-pykickstart python3-pyudev \
- parted python3-pyparted multipath-tools \
- lsof cryptsetup libblockdev \
- libbytesize \
+RDEPENDS:${PN} += "python3-pykickstart python3-pyudev \
+ parted python3-pyparted multipath-tools \
+ lsof cryptsetup libblockdev \
+ libbytesize \
"
-FILES_${PN} += " \
+FILES:${PN} += " \
${datadir}/dbus-1/system-services \
"
-inherit systemd
-
SYSTEMD_AUTO_ENABLE = "disable"
-SYSTEMD_SERVICE_${PN} = "blivet.service"
+SYSTEMD_SERVICE:${PN} = "blivet.service"
diff --git a/meta-python/recipes-extended/python-blivet/python3-blivetgui/0001-Fix-return-type-of-BlivetUtils.get_disks-1658893.patch b/meta-python/recipes-extended/python-blivet/python3-blivetgui/0001-Fix-return-type-of-BlivetUtils.get_disks-1658893.patch
deleted file mode 100644
index cf80566854..0000000000
--- a/meta-python/recipes-extended/python-blivet/python3-blivetgui/0001-Fix-return-type-of-BlivetUtils.get_disks-1658893.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From 4d0f9f961704bc1dd83fdf6808fb6ab91dc6a768 Mon Sep 17 00:00:00 2001
-From: Vojtech Trefny <vtrefny@redhat.com>
-Date: Thu, 13 Dec 2018 13:39:03 +0100
-Subject: [PATCH] Fix return type of BlivetUtils.get_disks (#1658893)
-
-This must be a list, not a generator, because we are iterating
-over it multiple times in some cases.
-
-Upstream-Status: Backport[git://github.com/rhinstaller/blivet-gui]
-
-Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
-
----
- blivetgui/blivet_utils.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/blivetgui/blivet_utils.py b/blivetgui/blivet_utils.py
-index e2bd802..ddb04fc 100644
---- a/blivetgui/blivet_utils.py
-+++ b/blivetgui/blivet_utils.py
-@@ -204,7 +204,7 @@ class BlivetUtils(object):
-
- """
-
-- return (device for device in self.storage.disks if device.type != "mdarray")
-+ return [device for device in self.storage.disks if device.type != "mdarray"]
-
- def get_group_devices(self):
- """ Return list of LVM2 Volume Group devices
---
-2.7.4
-
diff --git a/meta-python/recipes-extended/python-blivet/python3-blivetgui_2.1.10.bb b/meta-python/recipes-extended/python-blivet/python3-blivetgui_2.1.10.bb
deleted file mode 100644
index b7e2493c32..0000000000
--- a/meta-python/recipes-extended/python-blivet/python3-blivetgui_2.1.10.bb
+++ /dev/null
@@ -1,28 +0,0 @@
-DESCRIPTION = "GUI tool for storage configuration using blivet library"
-HOMEPAGE = "https://github.com/rhinstaller/blivet-gui"
-LICENSE = "GPLv2+"
-SECTION = "devel/python"
-
-LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263"
-
-S = "${WORKDIR}/git"
-B = "${S}"
-
-SRCREV = "67ec0b7a0e065ba24ab87963409bfb21b2aac6dd"
-SRC_URI = "git://github.com/rhinstaller/blivet-gui;branch=master \
- file://0001-Fix-return-type-of-BlivetUtils.get_disks-1658893.patch \
-"
-
-inherit distro_features_check
-REQUIRED_DISTRO_FEATURES = "x11 systemd"
-
-inherit setuptools3 python3native
-
-RDEPENDS_${PN} = "python3-pygobject python3 \
- python3-blivet gtk+3 \
- python3-pid libreport \
-"
-
-FILES_${PN} += " \
- ${datadir}/* \
- "
diff --git a/meta-python/recipes-extended/python-blivet/python3-blivetgui_2.5.0.bb b/meta-python/recipes-extended/python-blivet/python3-blivetgui_2.5.0.bb
new file mode 100644
index 0000000000..124f36c6e0
--- /dev/null
+++ b/meta-python/recipes-extended/python-blivet/python3-blivetgui_2.5.0.bb
@@ -0,0 +1,21 @@
+DESCRIPTION = "GUI tool for storage configuration using blivet library"
+HOMEPAGE = "https://github.com/rhinstaller/blivet-gui"
+LICENSE = "GPL-2.0-or-later"
+SECTION = "devel/python"
+
+LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263"
+
+SRC_URI = "git://github.com/storaged-project/blivet-gui.git;branch=main;protocol=https"
+SRCREV = "626b44610a30ad26734dd20642538caab5a9178a"
+
+S = "${WORKDIR}/git"
+
+inherit features_check setuptools3
+REQUIRED_DISTRO_FEATURES = "x11 systemd gobject-introspection-data"
+
+RDEPENDS:${PN} = "python3-pygobject python3 \
+ python3-blivet gtk+3 \
+ python3-pid libreport \
+"
+
+FILES:${PN} += "${datadir}/*"
diff --git a/meta-python/recipes-extended/python-cson/python3-cson/0001-setup.py-Do-not-poke-at-git-describe-to-find-version.patch b/meta-python/recipes-extended/python-cson/python3-cson/0001-setup.py-Do-not-poke-at-git-describe-to-find-version.patch
new file mode 100644
index 0000000000..dc3f8657ec
--- /dev/null
+++ b/meta-python/recipes-extended/python-cson/python3-cson/0001-setup.py-Do-not-poke-at-git-describe-to-find-version.patch
@@ -0,0 +1,40 @@
+From 0d0ffab004306b1379f247016200ade381d1d181 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Wed, 8 Feb 2023 23:03:47 -0800
+Subject: [PATCH] setup.py: Do not poke at git describe to find version
+
+OE uses git snapshot and git describe --tags will emit a string which is
+not PEP440 compliant version scheme. setuptools 67+ is strict about it
+and fails to build. Therefore inject a static version.py from OE
+environment and use that for version number based on PV
+
+Upstream-Status: Pending
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ setup.py | 10 ++--------
+ 1 file changed, 2 insertions(+), 8 deletions(-)
+
+diff --git a/setup.py b/setup.py
+index a77138f..df675cd 100644
+--- a/setup.py
++++ b/setup.py
+@@ -28,14 +28,8 @@ def main():
+ # Also, when git is not available (PyPi package), use stored version.py.
+ version_py = os.path.join(os.path.dirname(__file__), 'version.py')
+
+- try:
+- if sys.version_info < (2, 7) or (3,) <= sys.version_info < (3, 2):
+- version_git = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE).communicate()[0]
+- else:
+- version_git = subprocess.check_output(["git", "describe", "--tags"]).rstrip()
+- except:
+- with open(version_py, 'r') as fh:
+- version_git = open(version_py).read().strip().split('=')[-1].replace('"','')
++ with open(version_py, 'r') as fh:
++ version_git = open(version_py).read().strip().split('=')[-1].replace('"','')
+
+ version_msg = "# Do not edit this file, pipeline versioning is governed by git tags"
+ with open(version_py, 'w') as fh:
+--
+2.39.1
+
diff --git a/meta-python/recipes-extended/python-cson/python-cson_git.bb b/meta-python/recipes-extended/python-cson/python3-cson_git.bb
index efb338cf28..489733c767 100644
--- a/meta-python/recipes-extended/python-cson/python-cson_git.bb
+++ b/meta-python/recipes-extended/python-cson/python3-cson_git.bb
@@ -7,15 +7,20 @@ LICENSE = "MIT"
SECTION = "devel/python"
LIC_FILES_CHKSUM = "file://LICENSE;md5=7709d2635e63ab96973055a23c2a4cac"
-SRCREV = "f3f2898c44bb16b951d3e9f2fbf6d1c4158edda2"
-SRC_URI = "git://github.com/gt3389b/python-cson.git"
+PV = "1.0.9+1.0.10"
+SRCREV = "69090778bccc5ed124342ba288597fbb2bfa9f39"
+SRC_URI = "git://github.com/gt3389b/python-cson.git;branch=master;protocol=https \
+ file://0001-setup.py-Do-not-poke-at-git-describe-to-find-version.patch"
S = "${WORKDIR}/git"
-RDEPENDS_${PN}_class-native = ""
-DEPENDS_append_class-native = " python-native "
+RDEPENDS:${PN} = "python3-json"
-inherit setuptools
+inherit setuptools3
+
+do_configure:prepend() {
+ echo "__version__=${PV}" > ${S}/version.py
+}
BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-extended/python-meh/python3-meh_0.47.bb b/meta-python/recipes-extended/python-meh/python3-meh_0.51.bb
index 95d6d183cc..e83514af1b 100644
--- a/meta-python/recipes-extended/python-meh/python3-meh_0.47.bb
+++ b/meta-python/recipes-extended/python-meh/python3-meh_0.51.bb
@@ -1,17 +1,16 @@
SUMMARY = "A python library for handling exceptions"
DESCRIPTION = "The python-meh package is a python library for handling, saving, and reporting \
exceptions."
-HOMEPAGE = "http://git.fedorahosted.org/git/?p=python-meh.git"
-LICENSE = "GPLv2+"
+HOMEPAGE = "https://github.com/rhinstaller/python-meh"
+LICENSE = "GPL-2.0-or-later"
+LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263"
-inherit setuptools3
+inherit setuptools3_legacy
S = "${WORKDIR}/git"
-SRC_URI = "git://github.com/rhinstaller/python-meh.git;protocol=https;branch=master \
-"
-SRCREV = "78d868d99104317ce8820f39f61d207566e61a55"
-LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263"
+SRC_URI = "git://github.com/rhinstaller/python-meh.git;protocol=https;branch=master"
-FILES_${PN} += "${datadir}/*"
+SRCREV = "eb5d4adc3b838704b6a68f0f77ada2063a11ab1b"
+FILES:${PN} += "${datadir}/python-meh"
diff --git a/meta-python/recipes-extended/python-pyephem/python-pyephem_3.7.6.0.bb b/meta-python/recipes-extended/python-pyephem/python-pyephem_3.7.6.0.bb
deleted file mode 100644
index e28ce6ccc8..0000000000
--- a/meta-python/recipes-extended/python-pyephem/python-pyephem_3.7.6.0.bb
+++ /dev/null
@@ -1,17 +0,0 @@
-SUMMARY = "PyEphem astronomical calculations"
-HOMEPAGE = "http://rhodesmill.org/pyephem/"
-
-LICENSE = "LGPL-3.0"
-LIC_FILES_CHKSUM = "file://COPYING;md5=f288303760f6e5ceaafe3aaa32186ab1"
-
-SRC_URI[md5sum] = "405a109f3017251ecd8c2890d850f649"
-SRC_URI[sha256sum] = "7a4c82b1def2893e02aec0394f108d24adb17bd7b0ca6f4bc78eb7120c0212ac"
-
-PYPI_PACKAGE = "ephem"
-
-inherit pypi setuptools
-
-RDEPENDS_${PN} += "\
- ${PYTHON_PN}-datetime \
- ${PYTHON_PN}-math \
- "
diff --git a/meta-python/recipes-extended/python-pyephem/python3-pyephem_4.1.5.bb b/meta-python/recipes-extended/python-pyephem/python3-pyephem_4.1.5.bb
new file mode 100644
index 0000000000..8c9262afb8
--- /dev/null
+++ b/meta-python/recipes-extended/python-pyephem/python3-pyephem_4.1.5.bb
@@ -0,0 +1,16 @@
+SUMMARY = "PyEphem astronomical calculations"
+HOMEPAGE = "http://rhodesmill.org/pyephem/"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=9c930b395b435b00bb13ec83b0c99f40"
+
+SRC_URI[sha256sum] = "0c64a8aa401574c75942045b9af70d1656e14c5366151c0cbb400cbeedc2362a"
+
+PYPI_PACKAGE = "ephem"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "\
+ python3-datetime \
+ python3-math \
+ "
diff --git a/meta-python/recipes-extended/python-pykickstart/files/0001-support-authentication-for-kickstart.patch b/meta-python/recipes-extended/python-pykickstart/files/0001-support-authentication-for-kickstart.patch
index e7533f4769..309a00122a 100644
--- a/meta-python/recipes-extended/python-pykickstart/files/0001-support-authentication-for-kickstart.patch
+++ b/meta-python/recipes-extended/python-pykickstart/files/0001-support-authentication-for-kickstart.patch
@@ -1,7 +1,7 @@
-From f05f5fc363e2510f6943532f3e14a6423f6a2cf1 Mon Sep 17 00:00:00 2001
+From 3540ddcc7448dc784b65c74424c8a25132cb8534 Mon Sep 17 00:00:00 2001
From: Hongxu Jia <hongxu.jia@windriver.com>
Date: Tue, 31 Jul 2018 17:24:47 +0800
-Subject: [PATCH 1/4] support authentication for kickstart
+Subject: [PATCH] support authentication for kickstart
While download kickstart file from web server,
we support basic/digest authentication.
@@ -9,17 +9,17 @@ we support basic/digest authentication.
Add KickstartAuthError to report authentication failure,
which the invoker could parse this specific error.
-Upstream-Status: inappropriate [oe specific]
+Upstream-Status: Inappropriate [oe specific]
Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
pykickstart/errors.py | 17 +++++++++++++++++
- pykickstart/load.py | 34 ++++++++++++++++++++++++++++------
+ pykickstart/load.py | 32 +++++++++++++++++++++++++++-----
pykickstart/parser.py | 4 ++--
- 3 files changed, 47 insertions(+), 8 deletions(-)
+ 3 files changed, 46 insertions(+), 7 deletions(-)
diff --git a/pykickstart/errors.py b/pykickstart/errors.py
-index bf08ac5..aada7aa 100644
+index 8294f59..3d20bf8 100644
--- a/pykickstart/errors.py
+++ b/pykickstart/errors.py
@@ -32,6 +32,9 @@ This module exports several exception classes:
@@ -32,10 +32,10 @@ index bf08ac5..aada7aa 100644
And some warning classes:
KickstartWarning - A generic warning class.
-@@ -131,3 +134,17 @@ class KickstartDeprecationWarning(KickstartParseWarning, DeprecationWarning):
+@@ -125,3 +128,17 @@ class KickstartDeprecationWarning(KickstartParseWarning, DeprecationWarning):
+ """A class for warnings occurring during parsing related to using deprecated
commands and options.
"""
- pass
+
+class KickstartAuthError(KickstartError):
+ """An exception for errors relating to authentication failed while
@@ -43,7 +43,7 @@ index bf08ac5..aada7aa 100644
+ """
+ def __init__(self, msg):
+ """Create a new KickstartAuthError exception instance with the
-+ descriptive message val. val should be the return value of
++ descriptive message val. val should be the return value of
+ formatErrorMsg.
+ """
+ KickstartError.__init__(self, msg)
@@ -51,25 +51,23 @@ index bf08ac5..aada7aa 100644
+ def __str__(self):
+ return self.value
diff --git a/pykickstart/load.py b/pykickstart/load.py
-index fb935f2..41a2e9e 100644
+index eb76b65..f51cf08 100644
--- a/pykickstart/load.py
+++ b/pykickstart/load.py
-@@ -18,10 +18,13 @@
+@@ -18,9 +18,11 @@
# with the express permission of Red Hat, Inc.
#
import requests
+from requests.auth import HTTPDigestAuth
+from requests.auth import HTTPBasicAuth
-+
import shutil
- import six
-from pykickstart.errors import KickstartError
+from pykickstart.errors import KickstartError, KickstartAuthError
from pykickstart.i18n import _
from requests.exceptions import SSLError, RequestException
-@@ -29,7 +32,7 @@ _is_url = lambda location: '://' in location # RFC 3986
+@@ -28,7 +30,7 @@ is_url = lambda location: '://' in location # RFC 3986
SSL_VERIFY = True
@@ -78,21 +76,20 @@ index fb935f2..41a2e9e 100644
'''Load a destination URL or file into a string.
Type of input is inferred automatically.
-@@ -40,7 +43,7 @@ def load_to_str(location):
+@@ -39,7 +41,7 @@ def load_to_str(location):
Raises: KickstartError on error reading'''
- if _is_url(location):
+ if is_url(location):
- return _load_url(location)
+ return _load_url(location, user=user, passwd=passwd)
else:
return _load_file(location)
-@@ -70,11 +73,30 @@ def load_to_file(location, destination):
+@@ -69,11 +71,31 @@ def load_to_file(location, destination):
_copy_file(location, destination)
return destination
-def _load_url(location):
-- '''Load a location (URL or filename) and return contents as string'''
+def _get_auth(location, user=None, passwd=None):
+
+ auth = None
@@ -101,7 +98,7 @@ index fb935f2..41a2e9e 100644
+ if user is None or passwd is None:
+ log.info("Require Authentication")
+ raise KickstartAuthError("Require Authentication.\nAppend 'ksuser=<username> kspasswd=<password>' to boot command")
-
++
+ reasons = request.headers.get("WWW-Authenticate", "").split()
+ if reasons:
+ auth_type = reasons[0]
@@ -113,8 +110,9 @@ index fb935f2..41a2e9e 100644
+ return auth
+
+def _load_url(location, user=None, passwd=None):
-+ '''Load a location (URL or filename) and return contents as string'''
+ '''Load a location (URL or filename) and return contents as string'''
+ auth = _get_auth(location, user=user, passwd=passwd)
+
try:
- request = requests.get(location, verify=SSL_VERIFY)
+ request = requests.get(location, verify=SSL_VERIFY, auth=auth)
@@ -122,10 +120,10 @@ index fb935f2..41a2e9e 100644
raise KickstartError(_('Error securely accessing URL "%s"') % location + ': {e}'.format(e=str(e)))
except RequestException as e:
diff --git a/pykickstart/parser.py b/pykickstart/parser.py
-index d8880eb..22d14cb 100644
+index 7edf8aa..46c5299 100644
--- a/pykickstart/parser.py
+++ b/pykickstart/parser.py
-@@ -787,7 +787,7 @@ class KickstartParser(object):
+@@ -790,7 +790,7 @@ class KickstartParser(object):
i = PutBackIterator(s.splitlines(True) + [""])
self._stateMachine(i)
@@ -134,7 +132,7 @@ index d8880eb..22d14cb 100644
"""Process a kickstart file, given by the filename f."""
if reset:
self._reset()
-@@ -808,7 +808,7 @@ class KickstartParser(object):
+@@ -811,7 +811,7 @@ class KickstartParser(object):
self.currentdir[self._includeDepth] = cd
try:
@@ -144,5 +142,5 @@ index d8880eb..22d14cb 100644
raise KickstartError(_("Unable to open input kickstart file: %s") % str(e), lineno=0)
--
-2.7.4
+2.34.1
diff --git a/meta-python/recipes-extended/python-pykickstart/files/0002-pykickstart-parser.py-add-lock-for-readKickstart-and.patch b/meta-python/recipes-extended/python-pykickstart/files/0002-pykickstart-parser.py-add-lock-for-readKickstart-and.patch
index 4a001f3386..f5483db825 100644
--- a/meta-python/recipes-extended/python-pykickstart/files/0002-pykickstart-parser.py-add-lock-for-readKickstart-and.patch
+++ b/meta-python/recipes-extended/python-pykickstart/files/0002-pykickstart-parser.py-add-lock-for-readKickstart-and.patch
@@ -1,7 +1,7 @@
From 62fdead139edb0f29b2f222efcb8f39be15b057e Mon Sep 17 00:00:00 2001
From: Hongxu Jia <hongxu.jia@windriver.com>
Date: Mon, 30 Jul 2018 15:47:13 +0800
-Subject: [PATCH 2/4] pykickstart/parser.py: add lock for readKickstart and
+Subject: [PATCH 2/4] pykickstart/parser.py: add lock for readKickstart and
support https without certification
- Add lock for readKickstart to fix race issue
@@ -9,18 +9,21 @@ Subject: [PATCH 2/4] pykickstart/parser.py: add lock for readKickstart and
- Support to download kickstart file through https without certification
Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
+Signed-off-by: Wang Mingyu <wangmy@fujitsu.com>
---
+Upstream-Status: Pending
+
pykickstart/load.py | 2 +-
pykickstart/parser.py | 18 ++++++++++++++++++
2 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/pykickstart/load.py b/pykickstart/load.py
-index c6f013f..7adb751 100644
+index 8da8051..e856c8d 100644
--- a/pykickstart/load.py
+++ b/pykickstart/load.py
-@@ -30,7 +30,7 @@ from requests.exceptions import SSLError, RequestException
+@@ -32,7 +32,7 @@ log = logging.getLogger("anaconda.main")
- _is_url = lambda location: '://' in location # RFC 3986
+ is_url = lambda location: '://' in location # RFC 3986
-SSL_VERIFY = True
+SSL_VERIFY = False
@@ -28,10 +31,10 @@ index c6f013f..7adb751 100644
def load_to_str(location, user=None, passwd=None):
'''Load a destination URL or file into a string.
diff --git a/pykickstart/parser.py b/pykickstart/parser.py
-index e44099b..e68174d 100644
+index b95ba90..a55a9a3 100644
--- a/pykickstart/parser.py
+++ b/pykickstart/parser.py
-@@ -55,6 +55,20 @@ from pykickstart.i18n import _
+@@ -51,6 +51,20 @@ from pykickstart.i18n import _
STATE_END = "end"
STATE_COMMANDS = "commands"
@@ -52,7 +55,7 @@ index e44099b..e68174d 100644
def _preprocessStateMachine(lineIter):
l = None
lineno = 0
-@@ -788,6 +802,10 @@ class KickstartParser(object):
+@@ -791,6 +805,10 @@ class KickstartParser(object):
self._stateMachine(i)
def readKickstart(self, f, reset=True, username=None, password=None):
@@ -64,5 +67,5 @@ index e44099b..e68174d 100644
if reset:
self._reset()
--
-2.7.4
+2.34.1
diff --git a/meta-python/recipes-extended/python-pykickstart/files/0003-comment-out-sections-shutdown-and-environment-in-gen.patch b/meta-python/recipes-extended/python-pykickstart/files/0003-comment-out-sections-shutdown-and-environment-in-gen.patch
index 81e351b11f..6242e23b9c 100644
--- a/meta-python/recipes-extended/python-pykickstart/files/0003-comment-out-sections-shutdown-and-environment-in-gen.patch
+++ b/meta-python/recipes-extended/python-pykickstart/files/0003-comment-out-sections-shutdown-and-environment-in-gen.patch
@@ -6,7 +6,7 @@ Subject: [PATCH 3/4] comment out sections shutdown and environment in
Both of them is disabled by default.
-Upstream-Status: Inappropriate[oe specific]
+Upstream-Status: Inappropriate [oe specific]
Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
@@ -17,7 +17,7 @@ fixup! add comments of shutdown for user
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/pykickstart/commands/reboot.py b/pykickstart/commands/reboot.py
-index 2c1b1c0..b3ec717 100644
+index 75a6d916..edfe83ff 100644
--- a/pykickstart/commands/reboot.py
+++ b/pykickstart/commands/reboot.py
@@ -43,6 +43,9 @@ class FC3_Reboot(KickstartCommand):
@@ -31,18 +31,18 @@ index 2c1b1c0..b3ec717 100644
return retval
diff --git a/pykickstart/parser.py b/pykickstart/parser.py
-index e68174d..efd78a6 100644
+index bc59131b..b2d09d45 100644
--- a/pykickstart/parser.py
+++ b/pykickstart/parser.py
-@@ -385,7 +385,7 @@ class Packages(KickstartObject):
+@@ -428,7 +428,7 @@ class Packages(KickstartObject):
if not self.default:
if self.environment:
- pkgs += "@^%s\n" % self.environment
+ pkgs += "#@^%s\n" % self.environment
- grps = self.groupList
- grps.sort()
+ grps = self.groupList
+ grps.sort()
--
2.7.4
diff --git a/meta-python/recipes-extended/python-pykickstart/files/0004-load.py-retry-to-invoke-request-with-timeout.patch b/meta-python/recipes-extended/python-pykickstart/files/0004-load.py-retry-to-invoke-request-with-timeout.patch
index 6ed15ab09c..abe2c87e00 100644
--- a/meta-python/recipes-extended/python-pykickstart/files/0004-load.py-retry-to-invoke-request-with-timeout.patch
+++ b/meta-python/recipes-extended/python-pykickstart/files/0004-load.py-retry-to-invoke-request-with-timeout.patch
@@ -1,14 +1,14 @@
-From ffe06c6dd812b604d6482e4353d5564fad78bc90 Mon Sep 17 00:00:00 2001
+From 737e9a7c11233183f48ce6c83d38b504c8ffed12 Mon Sep 17 00:00:00 2001
From: Hongxu Jia <hongxu.jia@windriver.com>
Date: Mon, 30 Jul 2018 15:52:21 +0800
-Subject: [PATCH 4/4] load.py: retry to invoke request with timeout
+Subject: [PATCH] load.py: retry to invoke request with timeout
While networkless, use request to fetch kickstart file from
network, it failed and wait 300s to break, we should retry
to invoke request with timeout explicitly. So if it the
network is up, the fetch works.
-Upstream-Status: inappropriate [oe specific]
+Upstream-Status: Inappropriate [oe specific]
Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
@@ -16,28 +16,27 @@ Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
1 file changed, 31 insertions(+)
diff --git a/pykickstart/load.py b/pykickstart/load.py
-index ad3bad1..a5cbbc5 100644
+index 58faba6..e856c8d 100644
--- a/pykickstart/load.py
+++ b/pykickstart/load.py
-@@ -21,6 +21,7 @@ import requests
+@@ -20,12 +20,16 @@
+ import requests
from requests.auth import HTTPDigestAuth
from requests.auth import HTTPBasicAuth
-
+import time
import shutil
- import six
-@@ -28,6 +29,9 @@ from pykickstart.errors import KickstartError, KickstartAuthError
+ from pykickstart.errors import KickstartError, KickstartAuthError
from pykickstart.i18n import _
from requests.exceptions import SSLError, RequestException
+import logging
+log = logging.getLogger("anaconda.main")
+
- _is_url = lambda location: '://' in location # RFC 3986
+ is_url = lambda location: '://' in location # RFC 3986
SSL_VERIFY = False
-@@ -73,6 +77,29 @@ def load_to_file(location, destination):
+@@ -71,6 +75,29 @@ def load_to_file(location, destination):
_copy_file(location, destination)
return destination
@@ -67,7 +66,7 @@ index ad3bad1..a5cbbc5 100644
def _get_auth(location, user=None, passwd=None):
auth = None
-@@ -94,6 +121,10 @@ def _get_auth(location, user=None, passwd=None):
+@@ -92,6 +119,10 @@ def _get_auth(location, user=None, passwd=None):
def _load_url(location, user=None, passwd=None):
'''Load a location (URL or filename) and return contents as string'''
@@ -76,8 +75,8 @@ index ad3bad1..a5cbbc5 100644
+ raise KickstartError(_("Connection %s failed" % location))
+
auth = _get_auth(location, user=user, passwd=passwd)
+
try:
- request = requests.get(location, verify=SSL_VERIFY, auth=auth)
--
-2.7.4
+2.34.1
diff --git a/meta-python/recipes-extended/python-pykickstart/python3-pykickstart_3.20.bb b/meta-python/recipes-extended/python-pykickstart/python3-pykickstart_3.48.bb
index ed10ce958c..953068f7c3 100644
--- a/meta-python/recipes-extended/python-pykickstart/python3-pykickstart_3.20.bb
+++ b/meta-python/recipes-extended/python-pykickstart/python3-pykickstart_3.48.bb
@@ -1,12 +1,12 @@
DESCRIPTION = "A python library for manipulating kickstart files"
HOMEPAGE = "http://fedoraproject.org/wiki/pykickstart"
-LICENSE = "GPLv2+"
+LICENSE = "GPL-2.0-or-later"
LIC_FILES_CHKSUM = "file://COPYING;md5=8ca43cbc842c2336e835926c2166c28b"
-FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
DEPENDS = "python3"
-RDEPENDS_${PN} = "python3 \
+RDEPENDS:${PN} = "python3 \
python3-requests \
python3-six \
"
@@ -18,7 +18,7 @@ SRC_URI = "git://github.com/rhinstaller/pykickstart.git;protocol=https;branch=ma
file://0003-comment-out-sections-shutdown-and-environment-in-gen.patch \
file://0004-load.py-retry-to-invoke-request-with-timeout.patch \
"
-SRCREV = "487edfded19d5969db0673b200ee4272b7dc6697"
+SRCREV = "fa6c80c0e5c6bee29d089899a10d26e6f7f8afd8"
UPSTREAM_CHECK_GITTAGREGEX = "r(?P<pver>\d+(\.\d+)+(-\d+)*)"
diff --git a/meta-python/recipes-extended/python-pyparted/python-pyparted_3.11.2.bb b/meta-python/recipes-extended/python-pyparted/python-pyparted_3.11.2.bb
deleted file mode 100644
index 32aa378cc7..0000000000
--- a/meta-python/recipes-extended/python-pyparted/python-pyparted_3.11.2.bb
+++ /dev/null
@@ -1,8 +0,0 @@
-require python-pyparted.inc
-
-inherit distutils
-
-RDEPENDS_${PN} += "python-stringold python-codecs python-math python-subprocess"
-RDEPENDS_${PN}_class-native = ""
-
-BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-extended/python-pyparted/python3-pyparted_3.11.2.bb b/meta-python/recipes-extended/python-pyparted/python3-pyparted_3.11.2.bb
deleted file mode 100644
index d83901ff3a..0000000000
--- a/meta-python/recipes-extended/python-pyparted/python3-pyparted_3.11.2.bb
+++ /dev/null
@@ -1,8 +0,0 @@
-require python-pyparted.inc
-
-inherit distutils3
-
-RDEPENDS_${PN} += "python3-stringold python3-codecs python3-math"
-RDEPENDS_${PN}_class-native = ""
-
-BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-extended/python-pyparted/python-pyparted.inc b/meta-python/recipes-extended/python-pyparted/python3-pyparted_3.12.0.bb
index f769f95a09..7a0d3987d2 100644
--- a/meta-python/recipes-extended/python-pyparted/python-pyparted.inc
+++ b/meta-python/recipes-extended/python-pyparted/python3-pyparted_3.12.0.bb
@@ -3,20 +3,25 @@ an interface to libparted, the GNU parted library for disk partitioning and \
filesystem manipulation."
SUMMARY = "Python bindings for libparted"
HOMEPAGE = "https://github.com/rhinstaller/pyparted"
-LICENSE = "GPL-2.0+"
+LICENSE = "GPL-2.0-or-later"
LIC_FILES_CHKSUM = "\
file://COPYING;md5=8ca43cbc842c2336e835926c2166c28b \
file://src/_pedmodule.c;beginline=10;endline=22;md5=9e53304db812b80d0939e11bb69dcab2 \
"
-DEPENDS += "parted"
-# upstream only publishes releases in github archives which are discouraged
-SRCREV = "2396ba7df56de277b4999bdd5f7d1a1706a6388a"
-SRC_URI = "git://github.com/rhinstaller/pyparted.git;protocol=https"
+SRC_URI[sha256sum] = "da985e116beb733371feb605b174db9eec8bd0eedffc8f739f8e603f51b521e7"
+
+inherit pkgconfig pypi setuptools3
-S = "${WORKDIR}/git"
+DEPENDS += "parted"
-RDEPENDS_${PN}_class-target += " \
+RDEPENDS:${PN}:class-target += " \
parted (>= 2.3) \
+ python3-codecs \
+ python3-math \
+ python3-numbers \
+ python3-stringold \
"
-RDEPENDS_${PN}_class-native = ""
+RDEPENDS:${PN}:class-native = ""
+
+BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-extended/python-rich/python3-rich_13.7.0.bb b/meta-python/recipes-extended/python-rich/python3-rich_13.7.0.bb
new file mode 100644
index 0000000000..959f0d51aa
--- /dev/null
+++ b/meta-python/recipes-extended/python-rich/python3-rich_13.7.0.bb
@@ -0,0 +1,15 @@
+SUMMARY = "Rich is a Python library for rich text and beautiful formatting in the terminal"
+DESCRIPTION = "The Rich API makes it easy to add color and style to terminal output. \
+Rich can also render pretty tables, progress bars, markdown, syntax highlighted source code, \
+tracebacks, and more."
+HOMEPAGE="https://github.com/Textualize/rich"
+SECTION = "devel/python"
+LICENSE = "MIT"
+
+LIC_FILES_CHKSUM = "file://LICENSE;md5=b5f0b94fbc94f5ad9ae4efcf8a778303"
+
+SRC_URI[sha256sum] = "5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa"
+
+inherit pypi python_poetry_core
+
+RDEPENDS:${PN} = "python3-pygments"
diff --git a/meta-python/recipes-extended/python3-portalocker/python3-portalocker/run-ptest b/meta-python/recipes-extended/python3-portalocker/python3-portalocker/run-ptest
new file mode 100644
index 0000000000..8d2017d39c
--- /dev/null
+++ b/meta-python/recipes-extended/python3-portalocker/python3-portalocker/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-python/recipes-extended/python3-portalocker/python3-portalocker_2.8.2.bb b/meta-python/recipes-extended/python3-portalocker/python3-portalocker_2.8.2.bb
new file mode 100644
index 0000000000..c45a3fcda2
--- /dev/null
+++ b/meta-python/recipes-extended/python3-portalocker/python3-portalocker_2.8.2.bb
@@ -0,0 +1,36 @@
+SUMMARY = "Cross-platform locking library"
+DESCRIPTION = "Portalocker is a library to provide an easy API to file locking"
+LICENSE = "BSD-3-Clause"
+
+LIC_FILES_CHKSUM = "file://LICENSE;md5=152634da660a374ca18c0734ed07c63c"
+
+SRC_URI[sha256sum] = "2b035aa7828e46c58e9b31390ee1f169b98e1066ab10b9a6a861fe7e25ee4f33"
+
+DEPENDS += "python3-setuptools-scm-native"
+
+inherit pypi python_setuptools_build_meta ptest
+
+SRC_URI += " \
+ file://run-ptest \
+"
+
+RDEPENDS:${PN}-ptest += " \
+ python3-multiprocessing \
+ python3-pytest \
+ python3-redis \
+ python3-unittest-automake-output \
+ redis \
+"
+
+do_install_ptest() {
+ install -d ${D}${PTEST_PATH}/tests
+ cp -rf ${S}/portalocker_tests/* ${D}${PTEST_PATH}/tests/
+ rm -rf ${D}${PTEST_PATH}/tests/test_combined.py
+}
+
+RDEPENDS:${PN} += " \
+ python3-fcntl \
+ python3-logging \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-python/recipes-extended/python3-pydot/python3-pydot_2.0.0.bb b/meta-python/recipes-extended/python3-pydot/python3-pydot_2.0.0.bb
new file mode 100644
index 0000000000..f0a6abd733
--- /dev/null
+++ b/meta-python/recipes-extended/python3-pydot/python3-pydot_2.0.0.bb
@@ -0,0 +1,11 @@
+SUMMARY = "pydot is is an interface to Graphviz."
+HOMEPAGE = "https://github.com/pydot/pydot"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3f6fa041dfcc7ff7747cfceaa34a3180"
+
+SRC_URI[sha256sum] = "60246af215123fa062f21cd791be67dda23a6f280df09f68919e637a1e4f3235"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} = "graphviz python3-pyparsing"
diff --git a/meta-python/recipes-extended/pywbem/python-pywbem_0.11.0.bb b/meta-python/recipes-extended/pywbem/python-pywbem_0.11.0.bb
deleted file mode 100644
index a699f1c7e3..0000000000
--- a/meta-python/recipes-extended/pywbem/python-pywbem_0.11.0.bb
+++ /dev/null
@@ -1,20 +0,0 @@
-require python-pywbem.inc
-inherit setuptools update-alternatives
-
-DEPENDS += " \
- ${PYTHON_PN}-m2crypto-native \
- ${PYTHON_PN}-typing-native \
-"
-
-RDEPENDS_${PN}_class-target += "\
- ${PYTHON_PN}-argparse \
- ${PYTHON_PN}-m2crypto \
- ${PYTHON_PN}-subprocess \
-"
-
-ALTERNATIVE_${PN} = "mof_compiler pywbemcli wbemcli"
-ALTERNATIVE_TARGET[mof_compiler] = "${bindir}/mof_compiler"
-ALTERNATIVE_TARGET[pywbemcli] = "${bindir}/pywbemcli"
-ALTERNATIVE_TARGET[wbemcli] = "${bindir}/wbemcli"
-
-ALTERNATIVE_PRIORITY = "30"
diff --git a/meta-python/recipes-extended/pywbem/python3-pywbem_0.11.0.bb b/meta-python/recipes-extended/pywbem/python3-pywbem_0.11.0.bb
deleted file mode 100644
index abfb8d9202..0000000000
--- a/meta-python/recipes-extended/pywbem/python3-pywbem_0.11.0.bb
+++ /dev/null
@@ -1,9 +0,0 @@
-require python-pywbem.inc
-inherit setuptools3 update-alternatives
-
-ALTERNATIVE_${PN} = "mof_compiler pywbemcli wbemcli"
-ALTERNATIVE_TARGET[mof_compiler] = "${bindir}/mof_compiler"
-ALTERNATIVE_TARGET[pywbemcli] = "${bindir}/pywbemcli"
-ALTERNATIVE_TARGET[wbemcli] = "${bindir}/wbemcli"
-
-ALTERNATIVE_PRIORITY = "60"
diff --git a/meta-python/recipes-extended/pywbem/python-pywbem.inc b/meta-python/recipes-extended/pywbem/python3-pywbem_1.6.3.bb
index 5151c33ea9..7d1ff28589 100644
--- a/meta-python/recipes-extended/pywbem/python-pywbem.inc
+++ b/meta-python/recipes-extended/pywbem/python3-pywbem_1.6.3.bb
@@ -13,36 +13,39 @@ at http://www.dmtf.org/standards/wbem. \
It also provides a Python provider interface, and is the fastest and easiest \
way to write providers on the planet."
HOMEPAGE = "http://pywbem.github.io"
-LICENSE = "LGPLv2.1"
-LIC_FILES_CHKSUM = "file://pywbem/LICENSE.txt;md5=fbc093901857fcd118f065f900982c24"
-SRC_URI[md5sum] = "1465dfa92e4cbe558c773838b9b00711"
-SRC_URI[sha256sum] = "2a05f2c1a6ab4b08560a6da55fdaabd0f52f4d1e6df6e288b9ed927bf5c289ed"
+LICENSE = "LGPL-2.1-only"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=fbc093901857fcd118f065f900982c24"
-inherit pypi
+SRC_URI[sha256sum] = "78df30dee98c508620b599b8951f322a81c6c0a9d7b78ffe5e017b9417cd97b9"
+
+inherit pypi setuptools3 update-alternatives
DEPENDS += " \
- ${PYTHON_PN}-ply-native \
- ${PYTHON_PN}-pyyaml-native \
- ${PYTHON_PN}-six-native \
+ python3-ply-native \
+ python3-pyyaml-native \
+ python3-six-native \
+ python3-wheel-native \
"
-do_install_append() {
- mv ${D}${bindir}/wbemcli.py ${D}${bindir}/pywbemcli
-
- rm -f ${D}${bindir}/*.bat
-}
-
-RDEPENDS_${PN}_class-target += "\
- ${PYTHON_PN}-datetime \
- ${PYTHON_PN}-io \
- ${PYTHON_PN}-netclient \
- ${PYTHON_PN}-ply \
- ${PYTHON_PN}-pyyaml \
- ${PYTHON_PN}-six \
- ${PYTHON_PN}-stringold \
- ${PYTHON_PN}-threading \
- ${PYTHON_PN}-unixadmin \
- ${PYTHON_PN}-xml \
+RDEPENDS:${PN} += "\
+ python3-datetime \
+ python3-io \
+ python3-logging \
+ python3-netclient \
+ python3-nocasedict \
+ python3-nocaselist \
+ python3-ply \
+ python3-pyyaml \
+ python3-requests \
+ python3-six \
+ python3-stringold \
+ python3-threading \
+ python3-unixadmin \
+ python3-xml \
+ python3-yamlloader \
"
-BBCLASSEXTEND = "native"
+ALTERNATIVE:${PN} = "mof_compiler"
+ALTERNATIVE_TARGET[mof_compiler] = "${bindir}/mof_compiler"
+
+ALTERNATIVE_PRIORITY = "60"
diff --git a/meta-python/recipes-extended/pywbemtools/python3-pywbemtools_1.2.1.bb b/meta-python/recipes-extended/pywbemtools/python3-pywbemtools_1.2.1.bb
new file mode 100644
index 0000000000..c0a5368d11
--- /dev/null
+++ b/meta-python/recipes-extended/pywbemtools/python3-pywbemtools_1.2.1.bb
@@ -0,0 +1,32 @@
+SUMMARY = "A set of tools using pywbem"
+DESCRIPTION = "A set of tools using pywbem to communicate with WBEM servers"
+HOMEPAGE = "https://pywbemtools.readthedocs.io/en/stable/"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=e23fadd6ceef8c618fc1c65191d846fa"
+
+SRC_URI[sha256sum] = "d2ad6c383490ddb3bbb0f737d23a07c7e8c345df65f8309bc554d8455cc913dc"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN}:class-target += "\
+ python3-ply \
+ python3-pyyaml \
+ python3-six \
+ python3-pywbem \
+ python3-click \
+ python3-requests \
+ python3-prompt-toolkit \
+ python3-mock \
+ python3-packaging \
+ python3-nocasedict \
+ python3-yamlloader \
+ python3-click-repl \
+ python3-click-spinner \
+ python3-asciitree \
+ python3-tabulate \
+ python3-pydicti \
+ python3-nocaselist \
+ python3-custom-inherit \
+"
+
+BBCLASSEXTEND = "native"
diff --git a/meta-python/recipes-extended/send2trash/python3-send2trash_1.8.3.bb b/meta-python/recipes-extended/send2trash/python3-send2trash_1.8.3.bb
new file mode 100644
index 0000000000..0bbfb9a11f
--- /dev/null
+++ b/meta-python/recipes-extended/send2trash/python3-send2trash_1.8.3.bb
@@ -0,0 +1,14 @@
+SUMMARY = "Send file to trash natively under Mac OS X, Windows and Linux"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=05faa35ba1ca10b723f19d286c9d5237"
+
+inherit pypi python_setuptools_build_meta
+
+SRC_URI[sha256sum] = "b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf"
+
+PYPI_PACKAGE = "Send2Trash"
+
+RDEPENDS:${PN} += "\
+ python3-io \
+ python3-datetime \
+"
diff --git a/meta-python/recipes-extended/tuna/tuna_0.19.bb b/meta-python/recipes-extended/tuna/tuna_0.19.bb
new file mode 100644
index 0000000000..ea0f157921
--- /dev/null
+++ b/meta-python/recipes-extended/tuna/tuna_0.19.bb
@@ -0,0 +1,24 @@
+SUMMARY = "cui/gui tool for tuning of running processes"
+HOMEPAGE = "https://rt.wiki.kernel.org/index.php/Tuna"
+LICENSE = "GPL-2.0-only"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6"
+
+SRC_URI = "git://git.kernel.org/pub/scm/utils/tuna/tuna.git;branch=main"
+
+SRCREV = "b972b8ce386c29bcbcd45029a617db3db9e5b6ca"
+
+S = "${WORKDIR}/git"
+
+RDEPENDS:${PN} += " \
+ python3-io \
+ python3-linux-procfs \
+ python3-logging \
+ python3-six \
+ "
+
+inherit setuptools3
+
+do_install:append() {
+ install -m 0755 -d ${D}${bindir}
+ install -m 0755 ${S}/tuna-cmd.py ${D}${bindir}/tuna
+}
diff --git a/meta-python/recipes-networking/python/python3-ldap_3.4.4.bb b/meta-python/recipes-networking/python/python3-ldap_3.4.4.bb
new file mode 100644
index 0000000000..6caf5f37ce
--- /dev/null
+++ b/meta-python/recipes-networking/python/python3-ldap_3.4.4.bb
@@ -0,0 +1,30 @@
+SUMMARY = "Provides a wrapper in Python to LDAP"
+DESCRIPTION = "This module provides access to the LDAP \
+(Lightweight Directory Access Protocol) through Python operations \
+instead of C API. The module mainly acts as a wrapper for the \
+OpenLDAP 2.x libraries. Errors will appear as exceptions."
+HOMEPAGE = "http://www.python-ldap.org/"
+LICENSE = "PSF-2.0"
+LIC_FILES_CHKSUM = "file://LICENCE;md5=36ce9d726d0321b73c1521704d07db1b"
+
+DEPENDS = "python3 openldap cyrus-sasl"
+
+PYPI_PACKAGE = "python-ldap"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "7edb0accec4e037797705f3a05cbf36a9fde50d08c8f67f2aef99a2628fab828"
+
+do_configure:prepend() {
+ sed -i -e 's:^library_dirs =.*::' \
+ -e 's:^include_dirs =.*:include_dirs = =/usr/include/sasl/:' \
+ -e 's/= ldap_r/= ldap/g' ${S}/setup.cfg
+}
+
+RDEPENDS:${PN} = " \
+ python3-pprint \
+ python3-pyasn1 \
+ python3-pyasn1-modules \
+ python3-threading \
+ python3-unittest \
+"