meta-openembedded: subtree update:2449e5f07a..8fbcfb9f02

Adrian Zaharia (1):
      ntp: fix ntpdate to wait for subprocesses

Akifumi Chikazawa (1):
      openvpn: add CVE-2020-7224 and CVE-2020-27569 to allowlist

Andrea Adami (3):
      initramfs-kexecboot-image: support cases where machines override IMAGE_FSTYPES
      initramfs-debug-image: support cases where machines override IMAGE_FSTYPES
      rapidjson: remove stale LIB_INSTALL_DIR

Andreas Müller (50):
      poppler: upgrade 21.05.0 -> 21.06.0
      dbus-broker: upgrade 28 -> 29
      libmbim: upgrade 1.24.6 -> 1.24.8
      icewm: upgrade 2.3.3 -> 2.3.4
      poppler: upgrade 21.06.0 -> 21.06.1
      gnome-disk-utility: upgrade 3.36.3 -> 40.1
      gnome-font-viewer: upgrade 3.34.0 -> 40.0
      pipewire: upgrade 0.3.24 -> 0.3.29
      libqmi: upgrade 1.28.4 -> 1.28.6
      ttf-noto-emoji: upgrade 20190815 -> 20200916
      remmina: upgrade 1.4.17 -> 1.4.18
      metacity: upgrade 3.36.1 -> 3.40.0
      gnome-flashback: upgrade 3.36.3 -> 3.40.0
      gthumb: initial add 3.10.3
      atkmm: upgrade 2.28.0 -> 2.28.2
      atkmm: build with meson
      dconf: upgrade 0.38.0 -> 0.40.0
      evolution-data-server: upgrade 3.40.1 -> 3.40.2
      file-roller: upgrade 3.38.1 -> 3.40.0
      glibmm: upgrade 2.62.0 -> 2.66.1 / build with meson / cleanup recipe
      gmime: upgrade 3.2.6 -> 3.2.7
      gnome-autoar; upgrade 0.3.2 -> 0.3.3
      gnome-keyring: upgrade 3.36.0 -> 40.0
      gnome-online-accounts: upgrade 3.36.0 -> 3.40.0
      gnome-terminal: upgrade 3.36.2 -> 3.40.2
      gspell: upgrade 1.8.4 -> 1.9.1
      gtkmm3: upgrade 3.24.3 -> 3.24.5
      gtksourceview4: upgrade 4.6.1 -> 4.8.1
      gupnp: upgrade 1.2.6 -> 1.2.7
      gvfs: upgrade 1.44.1 -> 1.48.1
      libgdata: upgrade 0.17.13 -> 0.18.1
      libmediaart 0.7.0: remove
      libmediaart-2.0: upgrade 1.9.4 -> 1.9.5 / merge inc file / build with meson
      libsigc++-2.0: upgrade 2.10.6 -> 2.10.7
      nautilus: upgrade 40.1 -> 40.2
      pangomm: upgrade 2.42.1 -> 2.46.1 / build with meson
      yelp-xsl: upgrade 3.36.0 -> 4.02
      yelp-tools: upgrade 3.32.2 -> 40.0
      yelp: upgrade 3.36.0 -> 40.2
      modemmanager: upgrade 1.16.4 -> 1.16.6
      xfce4-settings: 4.16.1 upgrade 4.16.2
      blueman: upgrade 2.1.4 -> 2.2.1
      pipewire: upgrade 0.3.30 -> 0-3-31
      cmark: upgrade 0.29.0 -> 0.30.0
      networkmanager: upgrade 1.30.4 -> 1.32.2
      ristretto: upgrade 0.10.0 -> 0.11.0
      libgusb: upgrade 0.3.6 -> 0.3.7
      poppler: upgrade 21.06.1 -> 21.07.0
      gegl: Disable pango on native build to fix gimp build segfaults
      gimp: remove --disable-vector-icons

Bartosz Golaszewski (13):
      libgpiod: coding style fixes
      libgpiod: list all packages in a single assignment
      libgpiod: fix RRECOMMENDS for python bindings
      libgpiod: correctly split output files into packages
      libgpiod: add RDEPENDS for tests
      libgpiod: redirect stdout from the ptest executable to a file
      libgpiod: ptest: run all test-suites if possible
      libgpiod: ptest: warn if the gpio-mockup kernel module is not selected
      libgpiod: ptest: add kernel-modules to RRECOMMENDS
      libgpiod: ptest: only rrecommend a single module that we need
      libgpiod: add the python test-suite to the ptest package
      libgpiod: update my email address
      python3-joblib: new package

Ben Horgan (1):
      cpputest: Add initial recipe. Version 4.0.

Carlos Rafael Giani (2):
      pipewire: Add filter-chain files to modules-filter-chain package
      pipewire: Upgrade to 0.3.30

Changqing Li (1):
      mousepad: fix warning during postinst

Chen Qi (1):
      minifi-cpp: set CLEANBROKEN to 1

Daiane Angolini (1):
      wireguard-module: Stop overriding modules_install in the recipe

Daniel Klauer (1):
      spidev-test: Update common-licenses reference

David Sterling (1):
      can-isotp: Upgrade to latest on master

Ed Tanous (1):
      Use the built-in options for removing pack tools

Geoff Parker (1):
      cifs-utils: set ROOTSBINDIR to /usr/sbin if DISTRO_FEATURES has usrmerge

Gianfranco (2):
      vboxguestdrivers: add a fix for build failure with kernel 5.13
      dlt-daemon: update from 2.18.6 to 2.18.7

Hongxu Jia (1):
      debootstrap: fix runtime failure on nativesdk

Joshua Watt (1):
      gnome: gnome-shell: Move gsettings to their own package

Kai Kang (4):
      python3-m2crypto: fix word size for qemuppc64 little endian
      python3-m2crypto: avoid host contamination for swig
      bats: fix qa issue when multilib eanbled
      mariadb: fix failures to start install_db.service

Khem Raj (57):
      glog: Upgrade to 0.5.0
      mbedtls: Upgrade to 2.26.0
      mbedtls: Add packageconfig for warning-as-errors
      memcached: upgrade to 1.6.9
      indent: Remove dead code using count_parens function
      glm: Fix additional clang warnings
      tbb: Fix warnings with clang
      libwebsockets: Update to latest on v4.2-stable
      packagegroup-meta-oe: Add libparse-yapp-perl
      netplan: Fix a warning with clang
      python3-yappi: Fix patching errors
      packagegroup-meta-oe: Add zsync-curl
      klibc: Add clang's -rtlib to known options
      libpfm4: Upgrade to 4.11.0
      ltrace: Remove unused static function
      flashrom: Fix build with clang
      mongodb: Enable wiredtiger only on aarch64/x86_64 hosts
      mariadb: Fix build with clang/musl
      c-ares: Upgrade to 1.17.1 release
      nodejs: Update to 14.17.1
      rocksdb: Upgrade to 6.20.3
      rocksdb: Implement toku_time_now function for rv32/rv64
      rocksdb: Fix build with ppc64/musl
      rocksdb: Implement timer for mips
      rocksdb: Implement timer for armv6+
      rocksdb: Fix build with gcc on rv32 and mips
      libzip: Upgrade to 1.8.0
      czmq: Inherit pkgconfig
      czmq: Add libmicrohttpd feature via packageconfig
      czmq: Use Cmake knobs to enable/disable designed packageconfigs
      czmq: Add nss packageconfig
      meta-python: Add python3-fastjsonschema and its dependencies
      packagegroup-meta-python: Add newly added recipes
      python3-process-tests: Add recipe
      python3-aspectlib: Add ptests
      python3-execnet: Add ptests
      python3-py-cpuinfo: Add ptests
      libc-bench: Do not override ldflags in makefile
      mpich: Add libgcc to ldflags on x86/glibc
      mpd: Update to 0.22.9
      imlib2: Use propert git SHA in SRCREV
      suitesparse: Update to 5.10.1
      packagegroup-meta-oe: Add libyang
      sysdig: Disable JIT on ppc64
      portaudio-v19: Use GNUInstallDirs to make it portable
      keepalived: Upgrade to 2.2.2
      suitesparse: Fix LIC_FILES_CHKSUM
      xscreensaver: Update to 6.01
      ltrace: Fix mips build with kernels 5.13+
      python3-pyusb: Add missing runtime dependency on libusb1
      can-isotp: Ignore in world builds
      postfix: Upgrade to 3.6.1
      packagegroup-meta-oe: Add new package cpputest
      apitrace: Update to latest trunk
      fatresize: Disable building documentation files
      layers: Fix git send-email instructions in README
      autofs: Upgrade to 5.1.7

Leon Anavi (61):
      python3-oauthlib: Upgrade 3.1.0 -> 3.1.1
      python3-django: Upgrade 3.2.3 -> 3.2.4
      python3-sqlalchemy: Upgrade 1.4.15 -> 1.4.17
      python3-aiohue: Upgrade 2.5.0 -> 2.5.1
      python3-typeguard: Upgrade 2.12.0 -> 2.12.1
      python3-cbor2: Upgrade 5.3.0 -> 5.4.0
      python3-ipython: Upgrade 7.24.0 -> 7.24.1
      python3-pkgconfig: Upgrade 1.5.2 -> 1.5.4
      python3-humanize: Upgrade 3.6.0 -> 3.7.1
      python3-fasteners: Upgrade 0.16 -> 0.16.1
      python3-pythonping: Upgrade 1.0.16 -> 1.1.0
      python3-bitarray: Upgrade 2.1.0 -> 2.1.2
      python3-coloredlogs: Upgrade 15.0 -> 15.0.1
      python3-pysonos: Upgrade 0.0.50 -> 0.0.51
      python3-dill: Upgrade 0.3.3 -> 0.3.4
      python3-humanfriendly: Upgrade 9.1 -> 9.2
      python3-zeroconf: Add recipe
      python3-pychromecast: Upgrade 9.1.2 -> 9.2.0
      python3-ifaddr: Fix RDEPENDS
      python3-bitarray: Upgrade 2.1.2 -> 2.1.3
      python3-astroid: Upgrade 2.5.7 -> 2.5.8
      python3-license-expression: Upgrade 1.2 -> 21.6.14
      python3-humanize: Upgrade 3.7.1 -> 3.9.0
      python3-ruamel-yaml: Upgrade 0.17.7 -> 0.17.9
      python3-cmd2: Upgrade 1.5.0 -> 2.1.1
      python3-fasteners: Upgrade 0.16.1 -> 0.16.3
      python3-elementpath: Upgrade 2.2.2 -> 2.2.3
      python3-prompt-toolkit: Upgrade 3.0.18 -> 3.0.19
      python3-mypy: Upgrade 0.812 -> 0.902
      python3-send2trash: Upgrade 1.5.0 -> 1.7.1
      python3-pandas: Upgrade 1.2.4 -> 1.2.5
      python3-mypy: Upgrade 0.902 -> 0.910
      python3-astroid: Upgrade 2.5.8 -> 2.6.0
      python3-tqdm: Upgrade 4.61.0 -> 4.61.1
      python3-ruamel-yaml: Upgrade 0.17.9 -> 0.17.10
      python3-httplib2: Fix runtime dependencies
      python3-google-api-core: Add recipe
      python3-google-auth: Add recipe
      python3-googleapis-common-protos: Add recipe
      python3-google-api-python-client: Upgrade 2.6.0 -> 2.10.0
      python3-ipython: Upgrade 7.24.1 -> 7.25.0
      python3-croniter: Upgrade 1.0.13 -> 1.0.15
      python3-priority: Upgrade 1.3.0 -> 2.0.0
      python3-astroid: Upgrade 2.6.0 -> 2.6.2
      python3-watchdog: Upgrade 2.1.2 -> 2.1.3
      python3-humanize: Upgrade 3.9.0 -> 3.10.0
      python3-pillow: Upgrade 8.2.0 -> 8.3.1
      python3-bitarray: Upgrade 2.1.3 -> 2.2.1
      python3-cmd2: Upgrade 2.1.1 -> 2.1.2
      python3-pandas: Upgrade 1.2.5 -> 1.3.0
      python3-texttable: Upgrade 1.6.3 -> 1.6.4
      python3-dateutil: Upgrade 2.8.1 -> 2.8.2
      python3-requests: Upgrade 2.25.1 -> 2.26.0
      python3-websocket-client: Upgrade 1.0.1 -> 1.1.0
      python3-pysonos: Upgrade 0.0.51 -> 0.0.53
      python3-bitarray: Upgrade 2.2.1 -> 2.2.2
      python3-pyusb: Upgrade 1.2.0 -> 1.2.1
      python3-zeroconf: Upgrade 0.31.0 -> 0.33.1
      python3-yamlloader: Upgrade 1.0.0 -> 1.1.0
      python3-astroid: Upgrade 2.6.2 -> 2.6.5
      python3-pkgconfig: Upgrade 1.5.4 -> 1.5.5

Luan Rafael Carneiro (1):
      libwebsockets: Update 4.2.0 -> 4.2.1

Luca Boccassi (2):
      dbus-broker: remove deprecated linux-4-17 option
      dbus-broker: enforce required versions of libselinux and libaudit

Marek Vasut (1):
      nss: Fix build on Centos 7

Martin Jansa (1):
      rygel: require gobject-introspection-data in DISTRO_FEATURES

Masaki Ambai (1):
      nss: add CVE-2006-5201 to allowlist

Oleksandr Kravchuk (1):
      iwd: update to 1.15

Olivier Georget (1):
      libpfm4 4.10.1 : enable arm64 host platform

Ovidiu Panait (1):
      libeigen: update LICENSE information

Pascal Bach (1):
      python3-thrift: support native recipe

Persian Prince (1):
      samba: Don't guess dirs for perllocal.pod removing

Peter Bergin (4):
      linuxptp: use install from makefile and install more apps
      linuxptp: add homepage
      linuxptp: ship example configurations in separate package
      hiredis: add cmake config file for pkgconfig

Peter Kjellerstedt (3):
      net-snmp: A little clean up
      net-snmp: Support building for native
      cryptsetup: Only recommend kernel modules when building for target

Philip Balister (1):
      fftw: Update recipe to 3.3.9.

Pierre-Jean Texier (5):
      libtinyxml2: upgrade 8.1.0 -> 9.0.0
      sshfs-fuse: upgrade 3.7.1 -> 3.7.2
      monit: upgrade 5.27.2 -> 5.28.0
      spitools: upgrade 0.8.7 -> 1.0.0
      linuxptp: fix upstream version check

Ross Burton (1):
      zsync-curl: add recipe

Sam Van Den Berge (1):
      libiio: fix installing libiio when python3 bindings are enabled

Sekine Shigeki (2):
      add CVE-2011-2411 to allowlist
      ntp: add CVE-2016-9312 to allowlist

Signed-off-by: Bartosz Golaszewski (1):
      Revert "libgpiod: ptest: warn if the gpio-mockup kernel module is not selected"

Tim Orling (8):
      libcgi-perl: upgrade 4.51 -> 4.53
      libcrypt-openssl-guess-perl: upgrade 0.12 -> 0.13
      libextutils-cppguess-perl: upgrade 0.21 -> 0.23
      libio-socket-ssl-perl: upgrade 2.068 -> 2.071
      libmoo-perl: upgrade 2.004000 -> 2.005004
      libnet-dns-perl: upgrade 1.26 -> 1.31
      libtest-warnings-perl: upgrade 0.028 -> 0.030
      logcheck: upgrade 1.3.20 -> 1.3.23

Tony Tascioglu (2):
      libyang: create recipe for libyang
      redis: upgrade to 6.2.4

Trevor Gamblin (9):
      libnftnl: upgrade 1.1.9 -> 1.2.0
      nftables: upgrade 0.9.8 -> 0.9.9
      python3-yarl: backport fix for test_url_query test
      python3-yappi: fix ptests
      python3-django: upgrade 2.2.23 -> 2.2.24
      python3-django: upgrade 3.2.4 -> 3.2.5
      python3-geomet: add recipe
      python3-cassandra-driver: add geomet to RDEPENDS, remove DISTUTILS options
      python3-geomet: Add missing RDEPENDS; add to packagegroup-meta-python

Yi Zhao (14):
      libldb: upgrade 1.5.8 -> 2.3.0
      samba: upgrade 4.10.18 -> 4.14.4
      samba: update smb.conf
      libparse-yapp-perl: add recipe
      dhcp-relay: update bundled bind to 9.11.32
      dhcp-relay: disable backtrace in bundled bind
      dhcp-relay: update 4.4.2 -> 4.4.2-P1
      packagegroup-meta-networking: add dhcp-relay
      samba: disable check fcntl RW_HINTS when configure
      samba: upgrade 4.14.4 -> 4.14.5
      minifi-cpp: set correct python processor directory in configure file
      samba: fix shebang for pidl
      samba: add missing runtime dependency for pidl
      audit: upgrade 3.0.1 -> 3.0.2

Zoltán Böszörményi (2):
      mariadb: Use qemu to run cross-compiled binaries
      mariadb: Upgrade to 10.5.11

hayashi.satoshi@fujitsu.com (1):
      dracut: add CVE-2010-4176 to allowlist

ito-yuichi@fujitsu.com (2):
      cyrus-sasl: add CVE-2020-8032 to allowlist
      dovecot: add CVE-2016-4983 to allowlist

massimo toscanelli (1):
      sysbench: fix memory test

wangmy (8):
      samba: Solve the dependency problem when installing Samba
      fatresize: upgrade 1.0.2 -> 1.1.0
      xfsprogs: upgrade 5.10.0 -> 5.12.0
      ctags: upgrade 5.9.20210627.0 -> 5.9.20210711.0
      icewm: upgrade 2.3.4 -> 2.6.0
      yelp: upgrade 40.2 -> 40.3
      live555: upgrade 20210406 -> 20210710
      modemmanager: upgrade 1.16.6 -> 1.16.8

zangrc (49):
      python3-idna: upgrade 3.1 -> 3.2
      netplan: upgrade 0.101 -> 0.102
      wireshark: upgrade 3.4.5 -> 3.4.6
      tracker: upgrade 3.0.4 -> 3.1.1
      tracker-miners: upgrade 3.0.5 -> 3.1.1
      rasdaemon: upgrade 0.6.6 -> 0.6.7
      speedtest-cli: upgrade 2.1.2 -> 2.1.3
      abseil-cpp: upgrade 20210324 -> 20210324.2
      cryptsetup: upgrade 2.3.5 -> 2.3.6
      ctags: upgrade 5.9.20210502.0 -> 5.9.20210606.0
      opencl-clhpp: upgrade 2.0.13 -> 2.0.14
      protobuf: upgrade 3.17.0 -> 3.17.3
      toybox: upgrade 0.8.4 -> 0.8.5
      fuse3: upgrade 3.10.3 -> 3.10.4
      evince: upgrade 40.1 -> 40.2
      mosquitto: upgrade 2.0.10 -> 2.0.11
      ctags: upgrade 5.9.20210606.0 -> 20210613.0
      fsverity-utils: upgrade 1.3 -> 1.4
      googletest: upgrade 1.10.0 -> 1.11.0
      mg: upgrade 20210314 -> 20210609
      nano: upgrade 5.7 -> 5.8
      openvpn: upgrade 2.5.2 -> 2.5.3
      snort: upgrade 2.9.17.1 -> 2.9.18
      function2: upgrade 4.1.0 -> 4.2.0
      python3-configargparse: upgrade 1.4.1 -> 1.5
      python3-grpcio-tools: upgrade 1.37.0 -> 1.38.1
      python3-h5py: upgrade 3.2.1 -> 3.3.0
      python3-isort: upgrade 5.8.0 -> 5.9.1
      can-utils: upgrade 2020.12.0 -> 2021.06.0
      ctags: upgrade 5.9.20210620.0 -> 5.9.20210627.0
      python3-gast: upgrade 0.4.0 -> 0.5.0
      python3-grpcio: upgrade 1.38.0 -> 1.38.1
      python3-haversine: upgrade 2.3.0 -> 2.3.1
      python3-m2crypto: upgrade 0.37.1 -> 0.38.0
      python3-pyrsistent: upgrade 0.17.3 -> 0.18.0
      babl: upgrade 0.1.86 -> 0.1.88
      python3-pyusb: upgrade 1.1.1 -> 1.2.0
      python3-google-api-python-client: upgrade 2.10.0 -> 2.12.0
      firewalld: upgrade 0.9.3 -> 0.9.4
      strongswan: upgrade 5.9.2 -> 5.9.3
      opencl-clhpp: upgrade 2.0.14 -> 2.0.15
      python3-cffi: upgrade 1.14.5 -> 1.14.6
      python3-configargparse: upgrade 1.5 -> 1.5.1
      python3-cryptography-vectors: upgrade 3.4.6 -> 3.4.7
      python3-flask-migrate: upgrade 3.0.0 -> 3.0.1
      python3-flask-socketio: upgrade 5.0.3 -> 5.1.0
      python3-isort: upgrade 5.9.1 -> 5.9.2
      python3-networkx: upgrade 2.5.1 -> 2.6.1
      python3-gnupg: upgrade 0.4.6 -> 0.4.7

zhengruoqin (30):
      opensaf: upgrade 5.21.03 -> 5.21.06
      fio: upgrade 3.26 -> 3.27
      gensio: upgrade 2.2.5 -> 2.2.7
      memtester: upgrade 4.5.0 -> 4.5.1
      graphene: upgrade 1.10.2 -> 1.10.6
      iozone3: upgrade 490 -> 492
      net-snmp: upgrade 5.9 -> 5.9.1
      rsnapshot: upgrade 1.4.3 -> 1.4.4
      rsyslog: upgrade 8.2104.0 -> 8.2106.0
      python3-absl: upgrade 0.12.0 -> 0.13.0
      ctags: upgrade 5.9.20210613.0 -> 5.9.20210620.0
      fwts: upgrade 21.03.00 -> 21.06.00
      grpc: upgrade 1.38.0 -> 1.38.1
      libconfig: upgrade 1.7.2 -> 1.7.3
      satyr: upgrade 0.37 -> 0.38
      libnet-telnet-perl: upgrade 3.04 -> 3.05
      python3-scrypt: upgrade 0.8.17 -> 0.8.18
      python3-urllib3: upgrade 1.26.5 -> 1.26.6
      python3-sqlalchemy: upgrade 1.4.17 -> 1.4.20
      python3-qrcode: upgrade 6.1 -> 7.1
      python3-regex: upgrade 2021.4.4 -> 2021.7.6
      python3-sentry-sdk: upgrade 1.1.0 -> 1.2.0
      python3-tqdm: upgrade 4.61.1 -> 4.61.2
      python3-xlsxwriter: upgrade 1.4.3 -> 1.4.4
      ostree: upgrade 2021.2 -> 2021.3
      span-lite: upgrade 0.9.2 -> 0.10.0
      python3-pymisp: upgrade 2.4.143 -> 2.4.144
      python3-protobuf: upgrade 3.17.0 -> 3.17.3
      python3-pulsectl: upgrade 21.5.17 -> 21.5.18
      python3-pytun: upgrade 2.3.0 -> 2.4.1

Signed-off-by: Andrew Geissler <geissonator@yahoo.com>
Change-Id: Ie45184e6f308aa2fc98ee6edf4a3ca1c4afbb5b4
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-absl_0.12.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-absl_0.13.0.bb
similarity index 67%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-absl_0.12.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-absl_0.13.0.bb
index 2ecf10c..2ebd358 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-absl_0.12.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-absl_0.13.0.bb
@@ -4,8 +4,8 @@
 LICENSE = "Apache-2.0"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
 
-SRC_URI[md5sum] = "cfc383e2c647698666a7c5d8ef83a675"
-SRC_URI[sha256sum] = "b44f68984a5ceb2607d135a615999b93924c771238a63920d17d3387b0d229d5"
+SRC_URI[md5sum] = "afb3ffb4b59d53575e8eb073c3a52803"
+SRC_URI[sha256sum] = "6953272383486044699fd0e9f00aad167a27e08ce19aae66c6c4b10e7e767793"
 
 PYPI_PACKAGE = "absl-py"
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-aiohue_2.5.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-aiohue_2.5.1.bb
similarity index 76%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-aiohue_2.5.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-aiohue_2.5.1.bb
index a29625a..4a203cc 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-aiohue_2.5.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-aiohue_2.5.1.bb
@@ -4,7 +4,7 @@
 LICENSE = "Apache-2.0"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=dab31a1d28183826937f4b152143a33f"
 
-SRC_URI[sha256sum] = "e2ae49be45261283a899cc1b95786f07fe5076be9a311d250dbe2de1b8c38f0f"
+SRC_URI[sha256sum] = "3ee8e857b07364516f8b9f0e5c52d4cd775036f3ace37c2769de1e8579f4dc07"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-aspectlib/0001-Remove-tornado-6-test-constraint.-Ref-15.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-aspectlib/0001-Remove-tornado-6-test-constraint.-Ref-15.patch
new file mode 100644
index 0000000..174f088
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-aspectlib/0001-Remove-tornado-6-test-constraint.-Ref-15.patch
@@ -0,0 +1,45 @@
+From d3ae6ac951cc5bbce29b9c987741e0a557c9b777 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ionel=20Cristian=20M=C4=83rie=C8=99?= <contact@ionelmc.ro>
+Date: Sun, 2 May 2021 09:50:43 +0300
+Subject: [PATCH] Remove tornado<6 test constraint. Ref #15.
+
+Upstream-Status: Backport [https://github.com/ionelmc/python-aspectlib/commit/7dccb198dfb426f529b81a28a755f3c02f8b50cb]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ tests/test_integrations_py3.py | 5 ++++-
+ tox.ini                        | 3 ++-
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/tests/test_integrations_py3.py b/tests/test_integrations_py3.py
+index e025eac..596589d 100644
+--- a/tests/test_integrations_py3.py
++++ b/tests/test_integrations_py3.py
+@@ -36,7 +36,10 @@ def test_decorate_tornado_coroutine():
+     @gen.coroutine
+     @debug.log(print_to=buf, module=False, stacktrace=2, result_repr=repr)
+     def coro():
+-        yield gen.Task(loop.add_timeout, timedelta(microseconds=10))
++        if hasattr(gen, 'Task'):
++            yield gen.Task(loop.add_timeout, timedelta(microseconds=10))
++        else:
++            yield gen.sleep(0.01)
+         return "result"
+ 
+     loop = ioloop.IOLoop.current()
+diff --git a/tox.ini b/tox.ini
+index 8c607de..08c31b3 100644
+--- a/tox.ini
++++ b/tox.ini
+@@ -55,7 +55,8 @@ deps =
+     pytest-clarity
+     pytest-cov
+     pytest-travis-fold
+-    tornado<6.0
++    six
++    tornado
+ commands =
+     {posargs:pytest --cov --cov-report=term-missing -vv --ignore=src}
+ 
+-- 
+2.32.0
+
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-aspectlib/run-ptest b/meta-openembedded/meta-python/recipes-devtools/python/python3-aspectlib/run-ptest
new file mode 100644
index 0000000..b63c4de
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-aspectlib/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}'
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-aspectlib_1.5.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-aspectlib_1.5.2.bb
new file mode 100644
index 0000000..2dc57a6
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-aspectlib_1.5.2.bb
@@ -0,0 +1,29 @@
+# Copyright (C) 2021 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+SUMMARY = "``aspectlib`` is an aspect-oriented programming, monkey-patch and decorators library. It is useful when changing"
+HOMEPAGE = "https://github.com/ionelmc/python-aspectlib"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d58b3f20fd10347a9458b8a03793b62e"
+
+SRC_URI[sha256sum] = "d275ec82c4c2712e564bb760e4accff8f061f648e38774feabeb8b241cf3a4aa"
+
+inherit ptest pypi setuptools3
+
+SRC_URI += "file://run-ptest \
+            file://0001-Remove-tornado-6-test-constraint.-Ref-15.patch \
+           "
+
+do_install_ptest() {
+    install -d ${D}${PTEST_PATH}/tests
+    cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
+}
+
+RDEPENDS_${PN}-ptest += "\
+    python3-tornado \
+    python3-process-tests \
+"
+
+RDEPENDS_${PN} += "python3-core python3-fields"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-astroid_2.5.7.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-astroid_2.6.5.bb
similarity index 89%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-astroid_2.5.7.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-astroid_2.6.5.bb
index c805dc4..513235b 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-astroid_2.5.7.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-astroid_2.6.5.bb
@@ -4,7 +4,7 @@
 LICENSE = "LGPL-2.1"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=a70cf540abf41acb644ac3b621b2fad1"
 
-SRC_URI[sha256sum] = "d66a600e1602736a0f24f725a511b0e50d12eb18f54b31ec276d2c26a0a62c6a"
+SRC_URI[sha256sum] = "83e494b02d75d07d4e347b27c066fd791c0c74fc96c613d1ea3de0c82c48168f"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-bitarray_2.1.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-bitarray_2.2.2.bb
similarity index 77%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-bitarray_2.1.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-bitarray_2.2.2.bb
index 12de2c9..01f474d 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-bitarray_2.1.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-bitarray_2.2.2.bb
@@ -3,7 +3,7 @@
 LICENSE = "PSF"
 LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=2ad702cdcd49e8d2ac01d7e7d0810d2d"
 
-SRC_URI[sha256sum] = "97224a19325ecee49a3bf4df3ee0531d3af9cf288b67d089a7ef44a3c4ea3839"
+SRC_URI[sha256sum] = "5ed37f0482199de5a3e096405a646ab3f45dd020d234c42539b3c11ea0e2278d"
 
 inherit setuptools3 pypi
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-cassandra-driver_3.25.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-cassandra-driver_3.25.0.bb
index a1941bf..ad446d6 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-cassandra-driver_3.25.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-cassandra-driver_3.25.0.bb
@@ -10,17 +10,11 @@
 
 SRC_URI[sha256sum] = "8ad7d7c090eb1cac6110b3bfc1fd2d334ac62f415aac09350ebb8d241b7aa7ee"
 
-DISTUTILS_BUILD_ARGS += " \
-    --no-libev \
-"
-DISTUTILS_INSTALL_ARGS += " \
-    --no-libev \
-"
-
 inherit pypi setuptools3
 
 RDEPENDS_${PN} += "\
     ${PYTHON_PN}-cython \
+    ${PYTHON_PN}-geomet \
     ${PYTHON_PN}-json \
     ${PYTHON_PN}-misc \
     ${PYTHON_PN}-multiprocessing \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-cbor2_5.3.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-cbor2_5.4.0.bb
similarity index 87%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-cbor2_5.3.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-cbor2_5.4.0.bb
index 32d2016..b791588 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-cbor2_5.3.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-cbor2_5.4.0.bb
@@ -4,7 +4,7 @@
 LICENSE = "Apache-2.0"
 LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
 
-SRC_URI[sha256sum] = "462b3604d9579458a79e6ca350943c49aabbc98c794c111a79b98720b9164336"
+SRC_URI[sha256sum] = "a7926f7244b08c413f1a4fa71a81aa256771c75bdf1a4fd77308547a2d63dd48"
 
 inherit pypi setuptools3 ptest
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-cffi_1.14.5.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-cffi_1.14.6.bb
similarity index 83%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-cffi_1.14.5.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-cffi_1.14.6.bb
index 16928f0..bcd185d 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-cffi_1.14.5.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-cffi_1.14.6.bb
@@ -4,7 +4,7 @@
 LIC_FILES_CHKSUM = "file://LICENSE;md5=5677e2fdbf7cdda61d6dd2b57df547bf"
 DEPENDS += "libffi ${PYTHON_PN}-pycparser"
 
-SRC_URI[sha256sum] = "fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"
+SRC_URI[sha256sum] = "c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-cmd2_1.5.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-cmd2_2.1.2.bb
similarity index 60%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-cmd2_1.5.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-cmd2_2.1.2.bb
index 18c7a66..38f050a 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-cmd2_1.5.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-cmd2_2.1.2.bb
@@ -1,11 +1,11 @@
 SUMMARY = "Extra features for standard library's cmd module"
 HOMEPAGE = "https://github.com/python-cmd2/cmd2"
 LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=9791cd24ca7d1807388ccd55cd066def"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=4c527bcb481233ebcb803de975f42701"
 
 DEPENDS += "${PYTHON_PN}-setuptools-scm-native"
 
-SRC_URI[sha256sum] = "701a8c9975c4abc45e5d13906ab149f959f812869106347323a3f89ac0e82a62"
+SRC_URI[sha256sum] = "25dbb2e9847aaa686a8a21e84e3d101db8b79f5cb992e044fc54210ab8c0ad41"
 
 inherit pypi setuptools3
 
@@ -14,6 +14,9 @@
     ${PYTHON_PN}-colorama \
     ${PYTHON_PN}-pyperclip \
     ${PYTHON_PN}-wcwidth \
+    ${PYTHON_PN}-compression \
+    ${PYTHON_PN}-pydoc \
+    ${PYTHON_PN}-json \
 "
 
 BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-coloredlogs_15.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-coloredlogs_15.0.1.bb
similarity index 84%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-coloredlogs_15.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-coloredlogs_15.0.1.bb
index daeda6b..5de59d5 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-coloredlogs_15.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-coloredlogs_15.0.1.bb
@@ -4,7 +4,7 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=764e737b117a38d773609885e8d04f0b"
 
-SRC_URI[sha256sum] = "5e78691e2673a8e294499e1832bb13efcfb44a86b92e18109fa18951093218ab"
+SRC_URI[sha256sum] = "7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-configargparse_1.4.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-configargparse_1.5.1.bb
similarity index 81%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-configargparse_1.4.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-configargparse_1.5.1.bb
index 0c851fe..596d16f 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-configargparse_1.4.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-configargparse_1.5.1.bb
@@ -3,7 +3,7 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=da746463714cc35999ed9a42339f2943"
 
-SRC_URI[sha256sum] = "6df537158f28c5ef2e8a8146781833abbc6cb7fca81b1b55d18808ce3439235e"
+SRC_URI[sha256sum] = "371f46577e76ec71a183b88378f36dd09f4b946f60fe60712f411b020f26b812"
 
 PYPI_PACKAGE = "ConfigArgParse"
 
@@ -15,6 +15,7 @@
 RDEPENDS_${PN} += "\
     ${PYTHON_PN}-core \
     ${PYTHON_PN}-shell \
+    ${PYTHON_PN}-json \
 "
 
 BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-croniter_1.0.13.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-croniter_1.0.15.bb
similarity index 77%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-croniter_1.0.13.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-croniter_1.0.15.bb
index c520fa7..1782391 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-croniter_1.0.13.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-croniter_1.0.15.bb
@@ -5,7 +5,7 @@
 
 PYPI_PACKAGE = "croniter"
 
-SRC_URI[sha256sum] = "57f36df4f5a1c31bbf50bbffa3551612c19f6156ab1e88e2e42342ccbb9f9b9a"
+SRC_URI[sha256sum] = "a70dfc9d52de9fc1a886128b9148c89dd9e76b67d55f46516ca94d2d73d58219"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-cryptography-vectors_3.4.6.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-cryptography-vectors_3.4.7.bb
similarity index 81%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-cryptography-vectors_3.4.6.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-cryptography-vectors_3.4.7.bb
index b5f34da..565e223 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-cryptography-vectors_3.4.6.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-cryptography-vectors_3.4.7.bb
@@ -4,7 +4,7 @@
 LICENSE = "Apache-2.0 | BSD"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=8c3617db4fb6fae01f1d253ab91511e4"
 
-SRC_URI[sha256sum] = "e5f88a5fb03d60b4f20eed4920638b6a3ed32a363523a77086528d557a2c2da8"
+SRC_URI[sha256sum] = "a7ac3aaa57514687696ad65f833e5e39b6fa3c5d41de2b8c938346ee119204c2"
 
 PYPI_PACKAGE = "cryptography_vectors"
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-dateutil_2.8.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-dateutil_2.8.2.bb
similarity index 83%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-dateutil_2.8.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-dateutil_2.8.2.bb
index 5326924..a68a736 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-dateutil_2.8.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-dateutil_2.8.2.bb
@@ -4,8 +4,7 @@
 LICENSE = "BSD-3-Clause & Apache-2.0"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=e3155c7bdc71f66e02678411d2abf996"
 
-SRC_URI[md5sum] = "f2a1d4b680b297b367a974664ca3a4f6"
-SRC_URI[sha256sum] = "73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"
+SRC_URI[sha256sum] = "0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"
 
 PYPI_PACKAGE = "python-dateutil"
 inherit pypi setuptools3
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-dill_0.3.3.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-dill_0.3.3.bb
deleted file mode 100644
index bf26ba3..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-dill_0.3.3.bb
+++ /dev/null
@@ -1,11 +0,0 @@
-SUMMARY = "Serialize all of python"
-HOMEPAGE = "https://pypi.org/project/dill/"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=90fee9f98d11d59df3f8aa813ff9a3de"
-
-SRC_URI[md5sum] = "99c878e2e4e924f3234c0efcbcff6abf"
-SRC_URI[sha256sum] = "efb7f6cb65dba7087c1e111bb5390291ba3616741f96840bfc75792a1a9b5ded"
-
-inherit pypi setuptools3
-
-PYPI_PACKAGE_EXT = "zip"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-dill_0.3.4.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-dill_0.3.4.bb
new file mode 100644
index 0000000..0634e17
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-dill_0.3.4.bb
@@ -0,0 +1,14 @@
+SUMMARY = "Serialize all of python"
+HOMEPAGE = "https://pypi.org/project/dill/"
+LICENSE = "BSD"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=41adceb584fdde8323ddf9ad23c07fe5"
+
+SRC_URI[sha256sum] = "9f9734205146b2b353ab3fec9af0070237b6ddae78452af83d2fca84d739e675"
+
+inherit pypi setuptools3
+
+PYPI_PACKAGE_EXT = "zip"
+
+RDEPENDS_${PN} += "\
+    ${PYTHON_PN}-multiprocessing \
+"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-django_2.2.23.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-django_2.2.23.bb
deleted file mode 100644
index ab4b68f..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-django_2.2.23.bb
+++ /dev/null
@@ -1,9 +0,0 @@
-require python-django.inc
-inherit setuptools3
-
-SRC_URI[md5sum] = "d72405637143e201b745714e300bb546"
-SRC_URI[sha256sum] = "12cfc045a4ccb2348719aaaa77b17e66a26bff9fc238b4c765a3e825ef92e414"
-
-RDEPENDS_${PN} += "\
-    ${PYTHON_PN}-sqlparse \
-"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-django_2.2.24.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-django_2.2.24.bb
new file mode 100644
index 0000000..964ca6b
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-django_2.2.24.bb
@@ -0,0 +1,9 @@
+require python-django.inc
+inherit setuptools3
+
+SRC_URI[md5sum] = "ebf3bbb7716a7b11029e860475b9a122"
+SRC_URI[sha256sum] = "3339ff0e03dee13045aef6ae7b523edff75b6d726adf7a7a48f53d5a501f7db7"
+
+RDEPENDS_${PN} += "\
+    ${PYTHON_PN}-sqlparse \
+"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-django_3.2.3.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-django_3.2.5.bb
similarity index 77%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-django_3.2.3.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-django_3.2.5.bb
index 7a9611c..5890c85 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-django_3.2.3.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-django_3.2.5.bb
@@ -1,7 +1,7 @@
 require python-django.inc
 inherit setuptools3
 
-SRC_URI[sha256sum] = "13ac78dbfd189532cad8f383a27e58e18b3d33f80009ceb476d7fcbfc5dcebd8"
+SRC_URI[sha256sum] = "3da05fea54fdec2315b54a563d5b59f3b4e2b1e69c3a5841dda35019c01855cd"
 
 RDEPENDS_${PN} += "\
     ${PYTHON_PN}-sqlparse \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-elementpath_2.2.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-elementpath_2.2.3.bb
similarity index 74%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-elementpath_2.2.2.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-elementpath_2.2.3.bb
index c793592..2d9c531 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-elementpath_2.2.2.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-elementpath_2.2.3.bb
@@ -3,9 +3,13 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=5dbb7fb7d72da3921202dd7b995d3ecf"
 
-SRC_URI[sha256sum] = "68de07c1aec3b1d33126111252cc699600dd1e45802625344aa6eb9e680ef157"
+SRC_URI[sha256sum] = "60139b91ef9646e27381fd62b8c38f1fc8ebc78dc4bc231c08c51240062e58e6"
 
 PYPI_PACKAGE = "elementpath"
 inherit pypi setuptools3
 
+RDEPENDS_${PN} += " \
+    ${PYTHON_PN}-xml \
+"
+
 BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-execnet/run-ptest b/meta-openembedded/meta-python/recipes-devtools/python/python3-execnet/run-ptest
new file mode 100644
index 0000000..b63c4de
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-execnet/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}'
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-execnet_1.9.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-execnet_1.9.0.bb
new file mode 100644
index 0000000..a7b1565
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-execnet_1.9.0.bb
@@ -0,0 +1,28 @@
+# 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"
+
+SRC_URI += "file://run-ptest \
+           "
+SRC_URI[sha256sum] = "8f694f3ba9cc92cab508b152dcfe322153975c29bda272e2fd7f3f00f36e47c5"
+
+inherit ptest pypi setuptools3
+
+do_install_ptest() {
+    install -d ${D}${PTEST_PATH}/tests
+    cp -rf ${S}/testing/* ${D}${PTEST_PATH}/tests/
+}
+
+RDEPENDS_${PN}-ptest += "\
+    python3-pytest \
+"
+
+RDEPENDS_${PN} += "python3-core python3-crypt python3-ctypes python3-fcntl python3-io python3-shell python3-threading"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-fasteners_0.16.3.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-fasteners_0.16.3.bb
new file mode 100644
index 0000000..6f283a3
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-fasteners_0.16.3.bb
@@ -0,0 +1,13 @@
+SUMMARY = "A python package that provides useful locks."
+HOMEPAGE = "https://github.com/harlowja/fasteners"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=4476c4be31402271e101d9a4a3430d52"
+
+SRC_URI[sha256sum] = "b1ab4e5adfbc28681ce44b3024421c4f567e705cc3963c732bf1cba3348307de"
+
+inherit pypi setuptools3
+
+RDEPENDS_${PN} += "\
+    ${PYTHON_PN}-logging \
+    ${PYTHON_PN}-fcntl \
+"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-fasteners_0.16.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-fasteners_0.16.bb
deleted file mode 100644
index eed8d2c..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-fasteners_0.16.bb
+++ /dev/null
@@ -1,8 +0,0 @@
-SUMMARY = "A python package that provides useful locks."
-HOMEPAGE = "https://github.com/harlowja/fasteners"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=4476c4be31402271e101d9a4a3430d52"
-
-SRC_URI[sha256sum] = "c995d8c26b017c5d6a6de9ad29a0f9cdd57de61ae1113d28fac26622b06a0933"
-
-inherit pypi setuptools3
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-fastjsonschema/run-ptest b/meta-openembedded/meta-python/recipes-devtools/python/python3-fastjsonschema/run-ptest
new file mode 100644
index 0000000..b63c4de
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-fastjsonschema/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}'
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-fastjsonschema_2.15.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-fastjsonschema_2.15.1.bb
new file mode 100644
index 0000000..d901fcb
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-fastjsonschema_2.15.1.bb
@@ -0,0 +1,38 @@
+# 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 = "1e214911fe83dbaeea3d50dfb3a539118de8a442"
+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 \
+"
+RDEPENDS_${PN} += "\
+    python3-core \
+    python3-urllib3 \
+    python3-numbers \
+    python3-pickle \
+    "
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-fields_5.0.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-fields_5.0.0.bb
new file mode 100644
index 0000000..9c22b92
--- /dev/null
+++ b/meta-openembedded/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-openembedded/meta-python/recipes-devtools/python/python3-flask-migrate_3.0.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-migrate_3.0.1.bb
similarity index 79%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-flask-migrate_3.0.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-flask-migrate_3.0.1.bb
index 8f84e05..77fd172 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-migrate_3.0.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-migrate_3.0.1.bb
@@ -2,7 +2,7 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=3b69377f79f3f48c661701236d5a6a85"
 
-SRC_URI[sha256sum] = "a6607e66bf1d68489b2281ead5caa6fdf7a21b71984fae922ef5f915ac45bbcb"
+SRC_URI[sha256sum] = "4d42e8f861d78cb6e9319afcba5bf76062e5efd7784184dd2a1cccd9de34a702"
 
 PYPI_PACKAGE = "Flask-Migrate"
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-socketio_5.0.3.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-socketio_5.1.0.bb
similarity index 80%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-flask-socketio_5.0.3.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-flask-socketio_5.1.0.bb
index 5def762..5a6b83b 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-socketio_5.0.3.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-socketio_5.1.0.bb
@@ -9,7 +9,7 @@
 
 PYPI_PACKAGE = "Flask-SocketIO"
 
-SRC_URI[sha256sum] = "4fb968c43bc384f184cd1a25c1842297c2e3d6efc2f755a61be6d4406858220f"
+SRC_URI[sha256sum] = "b41b9f6fb0d7f3fcadd54c44653307a9b96e985c7da73f92779480248b5b6874"
 
 RDEPENDS_${PN} += "\
     ${PYTHON_PN}-flask \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-gast_0.4.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-gast_0.5.0.bb
similarity index 69%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-gast_0.4.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-gast_0.5.0.bb
index 7ef2eb4..9908950 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-gast_0.4.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-gast_0.5.0.bb
@@ -4,8 +4,7 @@
 LICENSE = "BSD-3-Clause"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=a3ad9b6802e713fc5e307e1230f1ea90"
 
-SRC_URI[md5sum] = "d1f258eb70bb916f8fe5535351d5ff05"
-SRC_URI[sha256sum] = "40feb7b8b8434785585ab224d1568b857edb18297e5a3047f1ba012bc83b42c1"
+SRC_URI[sha256sum] = "8109cbe7aa0f7bf7e4348379da05b8137ea1f059f073332c3c1cedd57db8541f"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-geomet_0.3.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-geomet_0.3.0.bb
new file mode 100644
index 0000000..de05534
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-geomet_0.3.0.bb
@@ -0,0 +1,25 @@
+SUMMARY = "Convert GeoJSON to WKT/WKB (Well-Known Text/Binary), and vice versa."
+DESCRIPTION = "Convert GeoJSON to WKT/WKB (Well-Known Text/Binary), and vice versa."
+HOMEPAGE = "https://github.com/geomet/geomet"
+SECTION = "devel/python"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d2794c0df5b907fdace235a619d80314"
+SRCNAME = "geomet"
+
+SRC_URI[sha256sum] = "cb52411978ee01ff104ab48f108d7333b14423ae7a15a65fee25b7d29bda2e1b"
+
+S = "${WORKDIR}/git"
+SRC_URI = "git://github.com/geomet/geomet.git;protocol=https;branch=release-${PV} \
+           "
+SRCREV = "73ec5ec96cca32f2e2461d3964fc3d4ab80248f9"
+
+inherit setuptools3
+
+RDEPENDS_${PN} += "\
+    ${PYTHON_PN}-click \
+    ${PYTHON_PN}-core \
+    ${PYTHON_PN}-io \
+    ${PYTHON_PN}-json \
+    ${PYTHON_PN}-logging \
+    ${PYTHON_PN}-six \
+"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-gnupg_0.4.6.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-gnupg_0.4.7.bb
similarity index 62%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-gnupg_0.4.6.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-gnupg_0.4.7.bb
index ff0a91c..cc441af 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-gnupg_0.4.6.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-gnupg_0.4.7.bb
@@ -4,8 +4,11 @@
 LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=b0b7ac63b60085b23fa9f7e1951daa1d"
 
 PYPI_PACKAGE = "python-gnupg"
-SRC_URI[sha256sum] = "3aa0884b3bd414652c2385b9df39e7b87272c2eca1b8fcc3089bc9e58652019a"
+SRC_URI[sha256sum] = "2061f56b1942c29b92727bf9aecbd3cea3893acc9cccbdc7eb4604285efe4ac7"
 
 inherit pypi setuptools3
 
-RDEPENDS_${PN} +=  "gnupg-gpg"
+RDEPENDS_${PN} +=  " \
+	gnupg-gpg \
+	python3-logging \
+"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-core_1.30.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-core_1.30.0.bb
new file mode 100644
index 0000000..08cc35d
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-core_1.30.0.bb
@@ -0,0 +1,26 @@
+DESCRIPTION = "Google API client core library"
+HOMEPAGE = "https://github.com/googleapis/python-api-core"
+AUTHOR = "Google LLC"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "0724d354d394b3d763bc10dfee05807813c5210f0bd9b8e2ddf6b6925603411c"
+
+RDEPENDS_${PN} += "\
+    ${PYTHON_PN}-asyncio \
+    ${PYTHON_PN}-datetime \
+    ${PYTHON_PN}-logging \
+    ${PYTHON_PN}-math \
+"
+
+RDEPENDS_${PN} += "\
+    ${PYTHON_PN}-googleapis-common-protos \
+    ${PYTHON_PN}-google-auth \
+    ${PYTHON_PN}-grpcio \
+    ${PYTHON_PN}-protobuf \
+    ${PYTHON_PN}-pytz \
+    ${PYTHON_PN}-requests \
+    ${PYTHON_PN}-six \
+"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-python-client_2.12.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-python-client_2.12.0.bb
new file mode 100644
index 0000000..67d05b5
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-python-client_2.12.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=94023d14f6b58272fd885e4e3f2f08b3"
+
+SRC_URI[sha256sum] = "a5d203241a93201a770c966f8eca39de7f88b28194f9d252065b18e83bd99c4b"
+
+inherit pypi setuptools3
+
+RDEPENDS_${PN} += "\
+    ${PYTHON_PN}-logging \
+    ${PYTHON_PN}-six \
+    ${PYTHON_PN}-json \
+    ${PYTHON_PN}-core \
+    ${PYTHON_PN}-netclient \
+    ${PYTHON_PN}-httplib2 \
+    ${PYTHON_PN}-uritemplate \
+    ${PYTHON_PN}-google-api-core \
+"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-python-client_2.6.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-python-client_2.6.0.bb
deleted file mode 100644
index c6ae6e8..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-python-client_2.6.0.bb
+++ /dev/null
@@ -1,9 +0,0 @@
-SUMMARY = "The Google API Client for Python is a client library for accessing the Plus, \
-Moderator, and many other Google APIs."
-HOMEPAGE = "https://github.com/googleapis/google-api-python-client"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=94023d14f6b58272fd885e4e3f2f08b3"
-
-SRC_URI[sha256sum] = "6a87f324334247bf7ba24406da586424b09e715d04336fb7cf45a402b80d38e8"
-
-inherit pypi setuptools3
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-google-auth_1.32.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-google-auth_1.32.0.bb
new file mode 100644
index 0000000..d492bbb
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-google-auth_1.32.0.bb
@@ -0,0 +1,27 @@
+DESCRIPTION = "Google Authentication Library"
+HOMEPAGE = "https://github.com/googleapis/google-auth-library-python"
+AUTHOR = "Google Cloud Platform"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "e34e5f5de5610b202f9b40ebd9f8b27571d5c5537db9afed3a72b2db5a345039"
+
+RDEPENDS_${PN} += "\
+    ${PYTHON_PN}-asyncio \
+    ${PYTHON_PN}-datetime \
+    ${PYTHON_PN}-io \
+    ${PYTHON_PN}-json \
+    ${PYTHON_PN}-logging \
+    ${PYTHON_PN}-netclient \
+    ${PYTHON_PN}-numbers \
+"
+
+RDEPENDS_${PN} += "\
+    ${PYTHON_PN}-aiohttp \
+    ${PYTHON_PN}-cachetools \
+    ${PYTHON_PN}-pyasn1-modules \
+    ${PYTHON_PN}-rsa \
+    ${PYTHON_PN}-six \
+"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-googleapis-common-protos_1.53.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-googleapis-common-protos_1.53.0.bb
new file mode 100644
index 0000000..2c59ae8
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-googleapis-common-protos_1.53.0.bb
@@ -0,0 +1,14 @@
+DESCRIPTION = "Common protobufs used in Google APIs"
+HOMEPAGE = "https://github.com/googleapis/python-api-common-protos"
+AUTHOR = "Google LLC"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "a88ee8903aa0a81f6c3cec2d5cf62d3c8aa67c06439b0496b49048fb1854ebf4"
+
+RDEPENDS_${PN} += "\
+    ${PYTHON_PN}-grpcio \
+    ${PYTHON_PN}-protobuf \
+"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio-tools_1.37.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio-tools_1.38.1.bb
similarity index 85%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio-tools_1.37.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio-tools_1.38.1.bb
index d1b934b..e6680e8 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio-tools_1.37.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio-tools_1.38.1.bb
@@ -11,7 +11,7 @@
 
 SRC_URI += "file://0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch"
 
-SRC_URI[sha256sum] = "3ec510c1b6bfc32effc639acf9a055e72dab7a7b6757bf72f2132790d6a7cf1c"
+SRC_URI[sha256sum] = "cd85f58038b92e1961f8127d79691e84e151390d35cae73c4c0cbe2042f76b77"
 
 RDEPENDS_${PN} = "${PYTHON_PN}-grpcio"
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio_1.38.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio_1.38.1.bb
similarity index 93%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio_1.38.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio_1.38.1.bb
index d9e0042..3af033d 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio_1.38.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio_1.38.1.bb
@@ -12,7 +12,7 @@
                                 file://mips_bigendian.patch \
                                 file://0001-absl-always-use-asm-sgidefs.h.patch \
 "
-SRC_URI[sha256sum] = "abbf9c8c3df4d5233d5888c6cfa85c1bb68a6923749bd4dd1abc6e1e93986f17"
+SRC_URI[sha256sum] = "1f79d8a24261e3c12ec3a6c25945ff799ae09874fd24815bc17c2dc37715ef6c"
 
 RDEPENDS_${PN} = "${PYTHON_PN}-protobuf \
                   ${PYTHON_PN}-setuptools \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-h5py_3.2.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-h5py_3.3.0.bb
similarity index 89%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-h5py_3.2.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-h5py_3.3.0.bb
index 5faa0b8..58498f8 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-h5py_3.2.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-h5py_3.3.0.bb
@@ -4,7 +4,7 @@
 LICENSE = "BSD-3-Clause"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=113251d71fb0384712c719b567261c5c"
 
-SRC_URI[sha256sum] = "89474be911bfcdb34cbf0d98b8ec48b578c27a89fdb1ae4ee7513f1ef8d9249e"
+SRC_URI[sha256sum] = "e0dac887d779929778b3cfd13309a939359cc9e74756fc09af7c527a82797186"
 
 SRC_URI_append = " \
            file://0001-setup_build.py-avoid-absolute-path.patch \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-haversine/0001-setup.py-Correct-the-license-assignment.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-haversine/0001-setup.py-Correct-the-license-assignment.patch
deleted file mode 100644
index bb5955a..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-haversine/0001-setup.py-Correct-the-license-assignment.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From 56b421a18ef8acb41ab9e4bde7e1f5452ec67da9 Mon Sep 17 00:00:00 2001
-From: Khem Raj <raj.khem@gmail.com>
-Date: Mon, 17 May 2021 22:17:07 -0700
-Subject: [PATCH] setup.py: Correct the license assignment
-
-latest python/2.9 + setuptools bail out otherwise
-
-lines = header.split('\n')
-| AttributeError: 'list' object has no attribute 'split'
-
-Upstream-Status: Submitted [https://github.com/mapado/haversine/pull/38]
-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 549436d..9e7fb00 100755
---- a/setup.py
-+++ b/setup.py
-@@ -15,7 +15,7 @@ setup(
-     maintainer_email='julien.deniau@mapado.com',
-     url='https://github.com/mapado/haversine',
-     packages=['haversine'],
--    license=['MIT'],
-+    license='MIT',
-     classifiers=[
-         'Development Status :: 4 - Beta',
-         'Intended Audience :: Developers',
--- 
-2.31.1
-
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-haversine_2.3.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-haversine_2.3.0.bb
deleted file mode 100644
index 624d30c..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-haversine_2.3.0.bb
+++ /dev/null
@@ -1,14 +0,0 @@
-SUMMARY = "Calculate the distance between 2 points on Earth"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
-
-SRC_URI += "file://0001-setup.py-Correct-the-license-assignment.patch"
-
-SRC_URI[md5sum] = "ff2d43a74195ec00c42ccd5da2a3f3de"
-SRC_URI[sha256sum] = "72c76855ac25e6ad054c7ed380e95c1a96803185f005dd11f40ccaa9620b551f"
-
-inherit pypi setuptools3
-
-RDEPENDS_${PN} += "python3-numpy"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-haversine_2.3.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-haversine_2.3.1.bb
new file mode 100644
index 0000000..c325162
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-haversine_2.3.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] = "75a7f859b3fb6df746564ca66ad1fd5b4052cdbab3d74ff16e8f1a7c3d4a26a5"
+
+inherit pypi setuptools3
+
+RDEPENDS_${PN} += "python3-numpy"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-httplib2_0.19.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-httplib2_0.19.1.bb
index a16f8d9..122b4bd 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-httplib2_0.19.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-httplib2_0.19.1.bb
@@ -7,3 +7,9 @@
 SRC_URI[sha256sum] = "0b12617eeca7433d4c396a100eaecfa4b08ee99aa881e6df6e257a7aad5d533d"
 
 inherit pypi setuptools3
+
+RDEPENDS_${PN} += "\
+    ${PYTHON_PN}-compression \
+    ${PYTHON_PN}-netclient \
+    ${PYTHON_PN}-pyparsing \
+"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-humanfriendly_9.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-humanfriendly_9.2.bb
similarity index 74%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-humanfriendly_9.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-humanfriendly_9.2.bb
index fb6a7e3..6be27f7 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-humanfriendly_9.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-humanfriendly_9.2.bb
@@ -2,11 +2,11 @@
 HOMEPAGE = "https://humanfriendly.readthedocs.io/"
 SECTION = "devel/python"
 LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=764e737b117a38d773609885e8d04f0b"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=5d178009f806c2bdd498a19be0013a7a"
 
 PYPI_PACKAGE = "humanfriendly"
 
-SRC_URI[sha256sum] = "066562956639ab21ff2676d1fda0b5987e985c534fc76700a19bd54bcb81121d"
+SRC_URI[sha256sum] = "f7dba53ac7935fd0b4a2fc9a29e316ddd9ea135fb3052d3d0279d10c18ff9c48"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-humanize_3.6.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-humanize_3.10.0.bb
similarity index 75%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-humanize_3.6.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-humanize_3.10.0.bb
index 1c269ba..eba13db 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-humanize_3.6.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-humanize_3.10.0.bb
@@ -5,7 +5,7 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENCE;md5=4ecc42519e84f6f3e23529464df7bd1d"
 
-SRC_URI[sha256sum] = "a31704cf41f023e268032c4813c6482573320150a0d986f76b245e0451bb89e1"
+SRC_URI[sha256sum] = "b2413730ce6684f85e0439a5b80b8f402e09f03e16ab8023d1da758c6ff41148"
 
 inherit pypi setuptools3
 
@@ -15,6 +15,7 @@
 
 RDEPENDS_${PN} += "\
     ${PYTHON_PN}-datetime \
+    ${PYTHON_PN}-setuptools \
 "
 
 BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-idna_3.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-idna_3.2.bb
similarity index 82%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-idna_3.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-idna_3.2.bb
index fbdbab6..4ca7f62 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-idna_3.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-idna_3.2.bb
@@ -3,7 +3,7 @@
 LICENSE = "BSD-3-Clause & Python-2.0 & Unicode"
 LIC_FILES_CHKSUM = "file://LICENSE.md;md5=239668a7c6066d9e0c5382e9c8c6c0e1"
 
-SRC_URI[sha256sum] = "c5b02147e01ea9920e6b0a3f1f7bb833612d507592c837a6c49552768f4054e1"
+SRC_URI[sha256sum] = "467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-ifaddr_0.1.7.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-ifaddr_0.1.7.bb
index 4fff7d1..6d4fab3 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-ifaddr_0.1.7.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-ifaddr_0.1.7.bb
@@ -8,3 +8,7 @@
 SRC_URI[sha256sum] = "1f9e8a6ca6f16db5a37d3356f07b6e52344f6f9f7e806d618537731669eb1a94"
 
 inherit pypi setuptools3
+
+RDEPENDS_${PN} += " \
+    ${PYTHON_PN}-ctypes \
+"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-ipython_7.24.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-ipython_7.25.0.bb
similarity index 88%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-ipython_7.24.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-ipython_7.25.0.bb
index 1c11eec..b8a6db2 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-ipython_7.24.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-ipython_7.25.0.bb
@@ -6,7 +6,7 @@
 
 PYPI_PACKAGE = "ipython"
 
-SRC_URI[sha256sum] = "a171caa3d3d4c819a1c0742e3abecfd5a2b8ab525ca1c9f114b40b76b0679ab1"
+SRC_URI[sha256sum] = "54bbd1fe3882457aaf28ae060a5ccdef97f212a741754e420028d4ec5c2291dc"
 
 RDEPENDS_${PN} = "\
     ${PYTHON_PN}-setuptools \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-isort_5.8.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-isort_5.9.2.bb
similarity index 66%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-isort_5.8.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-isort_5.9.2.bb
index 36de825..5832136 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-isort_5.8.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-isort_5.9.2.bb
@@ -4,13 +4,17 @@
 SECTION = "devel/python"
 LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=6;endline=6;md5=8227180126797a0148f94f483f3e1489"
 
-SRC_URI[sha256sum] = "0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6"
+SRC_URI[sha256sum] = "f65ce5bd4cbc6abdfbe29afc2f0245538ab358c14590912df638033f157d555e"
 
 inherit pypi setuptools3
 
 RDEPENDS_${PN} += "\
     ${PYTHON_PN}-datetime \
     ${PYTHON_PN}-shell \
+    ${PYTHON_PN}-profile \
+    ${PYTHON_PN}-numbers \
+    ${PYTHON_PN}-pprint \
+    ${PYTHON_PN}-difflib \
 "
 
 BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-joblib_1.0.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-joblib_1.0.1.bb
new file mode 100644
index 0000000..4e63b05
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-joblib_1.0.1.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Joblib is a set of tools to provide lightweight pipelining in Python."
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=32b289008fb813a27c9025f02b59d03d"
+
+inherit setuptools3 pypi
+
+SRC_URI[md5sum] = "9914b330916395c0a1feca54949867a3"
+SRC_URI[sha256sum] = "9c17567692206d2f3fb9ecf5e991084254fe631665c450b443761c4186a613f7"
+
+RDEPENDS_${PN} += " \
+    python3-asyncio \
+    python3-distutils \
+    python3-json \
+    python3-multiprocessing \
+    python3-pprint \
+    python3-pydoc \
+"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-license-expression_1.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-license-expression_21.6.14.bb
similarity index 64%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-license-expression_1.2.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-license-expression_21.6.14.bb
index c033bd3..0513d09 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-license-expression_1.2.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-license-expression_21.6.14.bb
@@ -2,16 +2,20 @@
 HOMEPAGE = "https://github.com/nexB/license-expression"
 
 LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://apache-2.0.LICENSE;md5=e23fadd6ceef8c618fc1c65191d846fa"
+LIC_FILES_CHKSUM = "file://apache-2.0.LICENSE;md5=9429839cdc4b292ff46e88b524c6e0c9"
 
-SRC_URI[md5sum] = "fd4cb295cc345be1071274cdbd81c969"
-SRC_URI[sha256sum] = "7960e1dfdf20d127e75ead931476f2b5c7556df05b117a73880b22ade17d1abc"
+SRC_URI[sha256sum] = "9de87a427c9a449eee7913472fb9ed03b63036295547369fdbf95f76a8b924b2"
 
 inherit pypi ptest setuptools3
 
+DEPENDS += "\
+    ${PYTHON_PN}-setuptools-scm-native \
+    ${PYTHON_PN}-wheel-native \
+"
+
 RDEPENDS_${PN} += "\
     ${PYTHON_PN}-booleanpy \
-    "
+"
 
 BBCLASSEXTEND = "native nativesdk"
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-m2crypto/0001-Allow-verify_cb_-to-be-called-with-ok-True.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-m2crypto/0001-Allow-verify_cb_-to-be-called-with-ok-True.patch
deleted file mode 100644
index 3c83663..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-m2crypto/0001-Allow-verify_cb_-to-be-called-with-ok-True.patch
+++ /dev/null
@@ -1,47 +0,0 @@
-From 73fbd1e646f6bbf202d4418bae80eb9941fbf552 Mon Sep 17 00:00:00 2001
-From: Casey Deccio <casey@deccio.net>
-Date: Fri, 8 Jan 2021 12:43:09 -0700
-Subject: [PATCH] Allow verify_cb_* to be called with ok=True
-
-With https://github.com/openssl/openssl/commit/2e06150e3928daa06d5ff70c32bffad8088ebe58
-OpenSSL allowed verificaton to continue on UNABLE_TO_VERIFY_LEAF_SIGNATURE
----
- tests/test_ssl.py | 14 ++++++++++++--
- 1 file changed, 12 insertions(+), 2 deletions(-)
-
-diff --git a/tests/test_ssl.py b/tests/test_ssl.py
-index 92b6942..7a3271a 100644
---- a/tests/test_ssl.py
-+++ b/tests/test_ssl.py
-@@ -59,8 +59,13 @@ def allocate_srv_port():
- 
- 
- def verify_cb_new_function(ok, store):
--    assert not ok
-     err = store.get_error()
-+    # If err is X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE, then instead of
-+    # aborting, this callback is called to retrieve additional error
-+    # information.  In this case, ok might not be False.
-+    # See https://github.com/openssl/openssl/commit/2e06150e3928daa06d5ff70c32bffad8088ebe58
-+    if err != m2.X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE:
-+        assert not ok
-     assert err in [m2.X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT,
-                    m2.X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY,
-                    m2.X509_V_ERR_CERT_UNTRUSTED,
-@@ -618,7 +623,12 @@ class MiscSSLClientTestCase(BaseSSLClientTestCase):
- 
-     def verify_cb_old(self, ctx_ptr, x509_ptr, err, depth, ok):
-         try:
--            self.assertFalse(ok)
-+            # If err is X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE, then instead of
-+            # aborting, this callback is called to retrieve additional error
-+            # information.  In this case, ok might not be False.
-+            # See https://github.com/openssl/openssl/commit/2e06150e3928daa06d5ff70c32bffad8088ebe58
-+            if err != m2.X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE:
-+                self.assertFalse(ok)
-             self.assertIn(err,
-                           [m2.X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT,
-                            m2.X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY,
--- 
-2.29.2
-
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-m2crypto/0001-Use-of-RSA_SSLV23_PADDING-has-been-deprecated.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-m2crypto/0001-Use-of-RSA_SSLV23_PADDING-has-been-deprecated.patch
deleted file mode 100644
index 2313a32..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-m2crypto/0001-Use-of-RSA_SSLV23_PADDING-has-been-deprecated.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From d06eaa88a5f491827733f32027c46de3557fbd05 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Mat=C4=9Bj=20Cepl?= <mcepl@cepl.eu>
-Date: Fri, 19 Feb 2021 15:53:02 +0100
-Subject: [PATCH] Use of RSA_SSLV23_PADDING has been deprecated.
-
-Fixes #293.
----
- tests/test_rsa.py | 5 -----
- 1 file changed, 5 deletions(-)
-
-diff --git a/tests/test_rsa.py b/tests/test_rsa.py
-index 3de5016..7299785 100644
---- a/tests/test_rsa.py
-+++ b/tests/test_rsa.py
-@@ -124,11 +124,6 @@ class RSATestCase(unittest.TestCase):
-             ptxt = priv.private_decrypt(ctxt, p)
-             self.assertEqual(ptxt, self.data)
- 
--        # sslv23_padding
--        ctxt = priv.public_encrypt(self.data, RSA.sslv23_padding)
--        res = priv.private_decrypt(ctxt, RSA.sslv23_padding)
--        self.assertEqual(res, self.data)
--
-         # no_padding
-         with six.assertRaisesRegex(self, RSA.RSAError, 'data too small'):
-             priv.public_encrypt(self.data, RSA.no_padding)
--- 
-2.29.2
-
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-m2crypto/avoid-host-contamination.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-m2crypto/avoid-host-contamination.patch
new file mode 100644
index 0000000..9d9b844
--- /dev/null
+++ b/meta-openembedded/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: 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-openembedded/meta-python/recipes-devtools/python/python3-m2crypto/cross-compile-platform.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-m2crypto/cross-compile-platform.patch
index f039ae8..77ef7e5 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-m2crypto/cross-compile-platform.patch
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-m2crypto/cross-compile-platform.patch
@@ -6,7 +6,7 @@
 
 --- a/setup.py
 +++ b/setup.py
-@@ -169,22 +169,6 @@ class _M2CryptoBuildExt(build_ext.build_
+@@ -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)
  
@@ -25,6 +25,8 @@
 -            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-openembedded/meta-python/recipes-devtools/python/python3-m2crypto_0.37.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-m2crypto_0.38.0.bb
similarity index 84%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-m2crypto_0.37.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-m2crypto_0.38.0.bb
index e1f9292..950de56 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-m2crypto_0.37.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-m2crypto_0.38.0.bb
@@ -8,10 +8,9 @@
 
 SRC_URI += "file://0001-setup.py-link-in-sysroot-not-in-host-directories.patch \
             file://cross-compile-platform.patch \
-            file://0001-Allow-verify_cb_-to-be-called-with-ok-True.patch \
-            file://0001-Use-of-RSA_SSLV23_PADDING-has-been-deprecated.patch \
+            file://avoid-host-contamination.patch \
            "
-SRC_URI[sha256sum] = "e4e42f068b78ccbf113e5d0a72ae5f480f6c3ace4940b91e4fff5598cfff6fb3"
+SRC_URI[sha256sum] = "99f2260a30901c949a8dc6d5f82cd5312ffb8abc92e76633baf231bbbcb2decb"
 
 PYPI_PACKAGE = "M2Crypto"
 inherit pypi siteinfo setuptools3
@@ -39,6 +38,9 @@
 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__"
 export SWIG_FEATURES
 
+export STAGING_DIR
+
 BBCLASSEXTEND = "native"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-mypy_0.812.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-mypy_0.812.bb
deleted file mode 100644
index 8faab60..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-mypy_0.812.bb
+++ /dev/null
@@ -1,18 +0,0 @@
-SUMMARY = "Optional static typing for Python 3 and 2 (PEP 484)"
-HOMEPAGE = "https://github.com/python/mypy"
-LICENSE = "MIT & Python-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=6afb7c151c4dedb5c3dc292cc120fadc"
-
-RDEPENDS_${PN} = " \
-    ${PYTHON_PN}-mypy-extensions \
-    ${PYTHON_PN}-typed-ast \
-    ${PYTHON_PN}-typing-extensions \
-"
-
-PYPI_PACKAGE = "mypy"
-
-inherit pypi setuptools3
-
-SRC_URI[sha256sum] = "cd07039aa5df222037005b08fbbfd69b3ab0b0bd7a07d7906de75ae52c4e3119"
-
-BBCLASSEXTEND = "native"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-mypy_0.910.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-mypy_0.910.bb
new file mode 100644
index 0000000..8e675e6
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-mypy_0.910.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=17b7180fcfc43c4e70c07c71588604c4"
+
+PYPI_PACKAGE = "mypy"
+
+inherit pypi setuptools3
+
+SRC_URI[sha256sum] = "704098302473cb31a218f1775a873b376b30b4c18229421e9e9dc8916fd16150"
+
+BBCLASSEXTEND = "native"
+
+RDEPENDS_${PN} += " \
+    ${PYTHON_PN}-mypy-extensions \
+    ${PYTHON_PN}-typed-ast \
+    ${PYTHON_PN}-typing-extensions \
+    ${PYTHON_PN}-json \
+    ${PYTHON_PN}-compression \
+    ${PYTHON_PN}-pprint \
+    ${PYTHON_PN}-difflib \
+    ${PYTHON_PN}-toml \
+"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-networkx_2.5.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-networkx_2.5.1.bb
deleted file mode 100644
index 0b52cfd..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-networkx_2.5.1.bb
+++ /dev/null
@@ -1,12 +0,0 @@
-DESCRIPTION = "Python package for creating and manipulating graphs and networks"
-HOMEPAGE = "http://networkx.github.io/"
-LICENSE = "BSD-3-Clause"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=a24ea029adac8935699bf69b2e38c728"
-
-SRC_URI[sha256sum] = "109cd585cac41297f71103c3c42ac6ef7379f29788eb54cb751be5a663bb235a"
-
-inherit pypi setuptools3
-
-RDEPENDS_${PN} += "\
-                   ${PYTHON_PN}-decorator \
-                   "
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-networkx_2.6.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-networkx_2.6.1.bb
new file mode 100644
index 0000000..676e1db
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-networkx_2.6.1.bb
@@ -0,0 +1,19 @@
+DESCRIPTION = "Python package for creating and manipulating graphs and networks"
+HOMEPAGE = "http://networkx.github.io/"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=5cfa4d8f5881e0d053bb497130b9c73a"
+
+SRC_URI[sha256sum] = "bf4cb807d1bccf1593c7d0742d9127d9e04e021867299082658b0fc3907924e8"
+
+inherit pypi setuptools3
+
+RDEPENDS_${PN} += "\
+                   ${PYTHON_PN}-decorator \
+                   ${PYTHON_PN}-netclient \
+                   ${PYTHON_PN}-compression \
+                   ${PYTHON_PN}-numbers \
+                   ${PYTHON_PN}-pickle \
+                   ${PYTHON_PN}-html \
+                   ${PYTHON_PN}-xml \
+                   ${PYTHON_PN}-json \
+                   "
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-oauthlib_3.1.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-oauthlib_3.1.1.bb
similarity index 88%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-oauthlib_3.1.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-oauthlib_3.1.1.bb
index fe27e8e..e117863 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-oauthlib_3.1.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-oauthlib_3.1.1.bb
@@ -4,8 +4,7 @@
 LICENSE = "BSD-3-Clause"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=abd2675e944a2011aed7e505290ba482"
 
-SRC_URI[md5sum] = "43cb2b5bac983712ee55076b61181cc2"
-SRC_URI[sha256sum] = "bee41cc35fcca6e988463cacc3bcb8a96224f470ca547e697b604cc697b2f889"
+SRC_URI[sha256sum] = "8f0215fcc533dd8dd1bee6f4c412d4f0cd7297307d43ac61666389e3bc3198a3"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pandas_1.2.4.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pandas_1.3.0.bb
similarity index 73%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-pandas_1.2.4.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-pandas_1.3.0.bb
index 54fa910..b98e286 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pandas_1.2.4.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pandas_1.3.0.bb
@@ -4,9 +4,9 @@
 the Python programming language."
 HOMEPAGE = "http://pandas.pydata.org/"
 LICENSE = "BSD-3-Clause"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=c2a8f987b2ce77c368c6b3e1b5b10774"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3f23c5c092b74d245d48eeef72bc3fd2"
 
-SRC_URI[sha256sum] = "649ecab692fade3cbfcf967ff936496b0cfba0af00a55dfaacd82bdda5cb2279"
+SRC_URI[sha256sum] = "c554e6c9cf2d5ea1aba5979cc837b3649539ced0e18ece186f055450c86622e2"
 
 inherit pypi setuptools3
 
@@ -20,5 +20,7 @@
     ${PYTHON_PN}-json \
     ${PYTHON_PN}-numpy \
     ${PYTHON_PN}-dateutil \
+    ${PYTHON_PN}-dateutil-zoneinfo \
     ${PYTHON_PN}-pytz \
+    ${PYTHON_PN}-profile \
 "
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pillow_8.2.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pillow_8.3.1.bb
similarity index 86%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-pillow_8.2.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-pillow_8.3.1.bb
index 3241230..045357a 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pillow_8.2.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pillow_8.3.1.bb
@@ -5,11 +5,11 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=0337b116233da4616ae9fdb130bf6f1a"
 
-SRC_URI = "git://github.com/python-pillow/Pillow.git;branch=8.2.x \
+SRC_URI = "git://github.com/python-pillow/Pillow.git;branch=8.3.x \
            file://0001-support-cross-compiling.patch \
            file://0001-explicitly-set-compile-options.patch \
 "
-SRCREV ?= "e0e353c0ef7516979a9aedce3792596649ce4433"
+SRCREV ?= "92933b86574b9c80764bf52c357ed29e1ef53382"
 
 inherit setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pkgconfig_1.5.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pkgconfig_1.5.5.bb
similarity index 80%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-pkgconfig_1.5.2.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-pkgconfig_1.5.5.bb
index 7a98ef2..4c0e799 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pkgconfig_1.5.2.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pkgconfig_1.5.5.bb
@@ -4,7 +4,7 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=faa7f82be8f220bff6156be4790344fc"
 
-SRC_URI[sha256sum] = "38d612488f0633755a2e7a8acab6c01d20d63dbc31af75e2a9ac98a6f638ca94"
+SRC_URI[sha256sum] = "deb4163ef11f75b520d822d9505c1f462761b4309b1bb713d08689759ea8b899"
 
 RDEPENDS_${PN} = "pkgconfig \
                  ${PYTHON_PN}-shell \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-process-tests_2.1.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-process-tests_2.1.2.bb
new file mode 100644
index 0000000..dccdeb7
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-process-tests_2.1.2.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 = "Tools for testing processes."
+HOMEPAGE = "https://github.com/ionelmc/python-process-tests"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=37031056aff37e4b3310872a9a3d0b1e"
+
+SRC_URI[sha256sum] = "a3747ad947bdfc93e5c986bdb17a6d718f3f26e8577a0807a00962f29e26deba"
+
+inherit pypi setuptools3
+
+RDEPENDS_${PN} += "python3-core"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.18.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.19.bb
similarity index 82%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.18.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.19.bb
index 3662875..f384e21 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.18.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.19.bb
@@ -3,7 +3,7 @@
 LICENSE = "BSD-3-Clause"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=b2cde7da89f0c1f3e49bf968d00d554f"
 
-SRC_URI[sha256sum] = "e1b4f11b9336a28fa11810bc623c357420f69dfdb6d2dac41ca2c21a55c033bc"
+SRC_URI[sha256sum] = "08360ee3a3148bdb5163621709ee322ec34fc4375099afa4bbf751e9b7b7fa4f"
 
 inherit pypi setuptools3
 
@@ -18,6 +18,7 @@
     ${PYTHON_PN}-datetime \
     ${PYTHON_PN}-shell \
     ${PYTHON_PN}-image \
+    ${PYTHON_PN}-asyncio \
 "
 
 BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-protobuf_3.17.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-protobuf_3.17.3.bb
similarity index 91%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-protobuf_3.17.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-protobuf_3.17.3.bb
index be846f7..b3f9f6f 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-protobuf_3.17.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-protobuf_3.17.3.bb
@@ -7,7 +7,7 @@
 
 inherit pypi setuptools3
 
-SRC_URI[sha256sum] = "05dfe9319939a8473c21b469f34f6486646e54fb8542637cf7ed8e2fbfe21538"
+SRC_URI[sha256sum] = "72804ea5eaa9c22a090d2803813e280fb273b62d5ae497aaf3553d141c4fdd7b"
 
 # http://errors.yoctoproject.org/Errors/Details/184715/
 # Can't find required file: ../src/google/protobuf/descriptor.proto
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pulsectl_21.5.17.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pulsectl_21.5.18.bb
similarity index 84%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-pulsectl_21.5.17.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-pulsectl_21.5.18.bb
index 3c0a9c0..d039b7e 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pulsectl_21.5.17.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pulsectl_21.5.18.bb
@@ -3,7 +3,7 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://COPYING;md5=f1d10048469ff90123263eb5e214061d"
 
-SRC_URI[sha256sum] = "3f782b3adf6d91b2398504002d248b36aa047bd04d5acd0ae5d4e2d3c8e746a0"
+SRC_URI[sha256sum] = "14e34563cdad5f01d193f1ef7cd859a0fbdaa846726d44b0b68f4451a7458458"
 
 RDEPENDS_${PN} += " \
 	libpulse \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-py-cpuinfo/run-ptest b/meta-openembedded/meta-python/recipes-devtools/python/python3-py-cpuinfo/run-ptest
new file mode 100644
index 0000000..b63c4de
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-py-cpuinfo/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}'
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-py-cpuinfo_8.0.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-py-cpuinfo_8.0.0.bb
new file mode 100644
index 0000000..1b62a76
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-py-cpuinfo_8.0.0.bb
@@ -0,0 +1,27 @@
+# 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=b0b97c022f12b14d9e02de0b283ee9e9"
+
+SRC_URI[sha256sum] = "5f269be0e08e33fd959de96b34cd4aeeeacac014dd8305f70eb28d06de2345c5"
+
+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-pytest \
+"
+
+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-openembedded/meta-python/recipes-devtools/python/python3-pychromecast_9.1.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pychromecast_9.1.2.bb
deleted file mode 100644
index c392261..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pychromecast_9.1.2.bb
+++ /dev/null
@@ -1,10 +0,0 @@
-SUMMARY = "Library for Python 3.6+ to communicate with the Google Chromecast."
-HOMEPAGE = "https://github.com/balloob/pychromecast"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=b1dbd4e85f47b389bdadee9c694669f5"
-
-SRC_URI[sha256sum] = "907656cea46d39d0e93ec815979578ef4fb6f655fd8bf4e88e6421fcd7824e85"
-
-PYPI_PACKAGE = "PyChromecast"
-
-inherit pypi setuptools3
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pychromecast_9.2.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pychromecast_9.2.0.bb
new file mode 100644
index 0000000..ebe1124
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pychromecast_9.2.0.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Library for Python 3.6+ to communicate with the Google Chromecast."
+HOMEPAGE = "https://github.com/balloob/pychromecast"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=b1dbd4e85f47b389bdadee9c694669f5"
+
+SRC_URI[sha256sum] = "6d34593575cf77565df47af4c75dd47c6a65831ec18a8c10b5367b2f1c172f0a"
+
+PYPI_PACKAGE = "PyChromecast"
+
+inherit pypi setuptools3
+
+RDEPENDS_${PN} += " \
+    ${PYTHON_PN}-logging \
+    ${PYTHON_PN}-zeroconf \
+    ${PYTHON_PN}-json \
+    ${PYTHON_PN}-requests \
+    ${PYTHON_PN}-protobuf \
+"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pymisp_2.4.143.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pymisp_2.4.144.bb
similarity index 92%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-pymisp_2.4.143.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-pymisp_2.4.144.bb
index 1e3ef27..1e97b27 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pymisp_2.4.143.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pymisp_2.4.144.bb
@@ -4,7 +4,7 @@
 LIC_FILES_CHKSUM = "file://LICENSE;md5=a3639cf5780f71b125d3e9d1dc127c20"
 
 SRC_URI = "git://github.com/MISP/PyMISP.git;protocol=https;branch=main"
-SRCREV = "c2e9663765e83f1a4aa70099546bec653ed770e7"
+SRCREV = "7dbaf665d9288f2a2692bee3d6207bb6abe3c51f"
 S = "${WORKDIR}/git"
 
 inherit setuptools3
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pyrsistent_0.17.3.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pyrsistent_0.17.3.bb
deleted file mode 100644
index 72736c8..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pyrsistent_0.17.3.bb
+++ /dev/null
@@ -1,15 +0,0 @@
-SUMMARY = "Persistent/Immutable/Functional data structures for Python"
-HOMEPAGE = "https://github.com/tobgu/pyrsistent"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENCE.mit;md5=ca574f2891cf528b3e7a2ee570337e7c"
-
-SRC_URI[md5sum] = "cd38658ea772a7f9b12b6f9485a7018b"
-SRC_URI[sha256sum] = "2e636185d9eb976a18a8a8e96efce62f2905fea90041958d8cc2a189756ebf3e"
-
-inherit pypi setuptools3
-
-RDEPENDS_${PN} += " \
-    ${PYTHON_PN}-numbers \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pyrsistent_0.18.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pyrsistent_0.18.0.bb
new file mode 100644
index 0000000..7b79228
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pyrsistent_0.18.0.bb
@@ -0,0 +1,14 @@
+SUMMARY = "Persistent/Immutable/Functional data structures for Python"
+HOMEPAGE = "https://github.com/tobgu/pyrsistent"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.mit;md5=a4b94c2b800b582a8d3925a9939cbf44"
+
+SRC_URI[sha256sum] = "773c781216f8c2900b42a7b638d5b517bb134ae1acbebe4d1e8f1f41ea60eb4b"
+
+inherit pypi setuptools3
+
+RDEPENDS_${PN} += " \
+    ${PYTHON_PN}-numbers \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pysonos_0.0.50.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pysonos_0.0.53.bb
similarity index 79%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-pysonos_0.0.50.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-pysonos_0.0.53.bb
index cfa0d6e..dc7f676 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pysonos_0.0.50.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pysonos_0.0.53.bb
@@ -4,7 +4,7 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=07b0e2ca9ac77cd65cd4edf2e13367ea"
 
-SRC_URI[sha256sum] = "15a583b819c1e758cca72d5e148d59dd3bf7c9d59f19b5e79ab38c743c3e0738"
+SRC_URI[sha256sum] = "e24ea33f4ab810ff5e698d5e577d382413a2994565439ebc67fb42614f899e93"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pytest-benchmark_3.4.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pytest-benchmark_3.4.1.bb
new file mode 100644
index 0000000..5fb11dd
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pytest-benchmark_3.4.1.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 = "A ``pytest`` fixture for benchmarking code. It will group the tests into rounds that are calibrated to the chosen timer."
+HOMEPAGE = "https://github.com/ionelmc/pytest-benchmark"
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=9c5c2c74370826468065c5702b8a1fcf"
+
+SRC_URI[sha256sum] = "40e263f912de5a81d891619032983557d62a3d85843f9a9f30b98baea0cd7b47"
+
+inherit pypi setuptools3
+
+RDEPENDS_${PN} += "python3-core python3-py-cpuinfo python3-pytest python3-aspectlib"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pytest-cache_1.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pytest-cache_1.0.bb
new file mode 100644
index 0000000..4ce91dd
--- /dev/null
+++ b/meta-openembedded/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-openembedded/meta-python/recipes-devtools/python/python3-pythonping_1.0.16.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pythonping_1.1.0.bb
similarity index 68%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-pythonping_1.0.16.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-pythonping_1.1.0.bb
index 5affb93..fd66a6f 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pythonping_1.0.16.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pythonping_1.1.0.bb
@@ -4,8 +4,7 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://setup.py;beginline=12;endline=12;md5=2d33c00f47720c7e35e1fdb4b9fab027"
 
-SRC_URI[md5sum] = "9b505ad8a5b8a6a8e57ccf75098ea364"
-SRC_URI[sha256sum] = "d025c8b25952580dea47bc241421e17a5a97f97f50098e1096dd10d845d0f156"
+SRC_URI[sha256sum] = "71199bdeee942ba1258b65f88ca5624278e63b31e7643ee8ca7292d2f5f77e99"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pyusb_1.1.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pyusb_1.2.1.bb
similarity index 66%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-pyusb_1.1.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-pyusb_1.2.1.bb
index a8c7031..30b2c6d 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pyusb_1.1.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pyusb_1.2.1.bb
@@ -5,8 +5,14 @@
 
 DEPENDS += "libusb1 ${PYTHON_PN}-setuptools-scm-native"
 
-SRC_URI[sha256sum] = "7d449ad916ce58aff60b89aae0b65ac130f289c24d6a5b7b317742eccffafc38"
+RDEPENDS_${PN} += " \
+	python3-logging \
+"
+
+SRC_URI[sha256sum] = "a4cc7404a203144754164b8b40994e2849fde1cfff06b08492f12fff9d9de7b9"
 
 inherit pypi setuptools3
 
+RDEPENDS_${PN} += "libusb1"
+
 BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-qrcode_6.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-qrcode_7.1.bb
similarity index 73%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-qrcode_6.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-qrcode_7.1.bb
index df99d40..329bf3e 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-qrcode_6.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-qrcode_7.1.bb
@@ -4,7 +4,7 @@
 LIC_FILES_CHKSUM = "file://LICENSE;md5=4b802d2a65df4626623c79757f486af9"
 
 PYPI_PACKAGE = "qrcode"
-SRC_URI[sha256sum] = "505253854f607f2abf4d16092c61d4e9d511a3b4392e60bff957a68592b04369"
+SRC_URI[sha256sum] = "59ba630fa2adb637b06571e6ceec1bb0ecf372c458c4447ceba763061bd3af72"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-regex_2021.4.4.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-regex_2021.7.6.bb
similarity index 69%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-regex_2021.4.4.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-regex_2021.7.6.bb
index 177b06b..458236d 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-regex_2021.4.4.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-regex_2021.7.6.bb
@@ -5,6 +5,10 @@
 
 inherit pypi setuptools3
 
-SRC_URI[sha256sum] = "52ba3d3f9b942c49d7e4bc105bb28551c44065f139a65062ab7912bef10c9afb"
+SRC_URI[sha256sum] = "8394e266005f2d8c6f0bc6780001f7afa3ef81a7a2111fa35058ded6fce79e4d"
+
+RDEPENDS_${PN} += " \
+	python3-stringold \
+"
 
 BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-requests/setup.py-Support-idna-version-3.1.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-requests/setup.py-Support-idna-version-3.1.patch
deleted file mode 100644
index 2633224..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-requests/setup.py-Support-idna-version-3.1.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From fc45beed40a86c8fc38fc430765c1c5d2c9961c2 Mon Sep 17 00:00:00 2001
-From: Fabio Berton <fabio.berton@ossystems.com.br>
-Date: Thu, 4 Mar 2021 09:26:48 -0300
-Subject: [PATCH] setup.py: Support idna version 3.1
-Organization: O.S. Systems Software LTDA.
-
-Change idna required version to use python3-idna recipe that currently
-is on version 3.1.
-
-Without this change python-request doesn't work as the idna version
-doesn't match the required versions. When bump python-request recipe,
-verify if the upstream project bumped the idna version and drop this
-patch.
-
-As this recipe was tested with python3-idna_3.1 don't allow higher
-versions.
-
-Upstream-Status: Inappropriate [embedded specific]
-
-Signed-off-by: Fabio Berton <fabio.berton@ossystems.com.br>
----
- setup.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/setup.py b/setup.py
-index 7ba4b2a2..9d3b973e 100755
---- a/setup.py
-+++ b/setup.py
-@@ -43,7 +43,7 @@ packages = ['requests']
- 
- requires = [
-     'chardet>=3.0.2,<5',
--    'idna>=2.5,<3',
-+    'idna>=2.5,<3.2',
-     'urllib3>=1.21.1,<1.27',
-     'certifi>=2017.4.17'
- 
--- 
-2.30.1
-
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-requests_2.25.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-requests_2.26.0.bb
similarity index 78%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-requests_2.25.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-requests_2.26.0.bb
index cea8fd5..95e6e1a 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-requests_2.25.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-requests_2.26.0.bb
@@ -3,9 +3,7 @@
 LICENSE = "Apache-2.0"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=34400b68072d710fecd0a2940a0d1658"
 
-SRC_URI += "file://setup.py-Support-idna-version-3.1.patch"
-
-SRC_URI[sha256sum] = "27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"
+SRC_URI[sha256sum] = "b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-ruamel-yaml_0.17.7.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-ruamel-yaml_0.17.10.bb
similarity index 74%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-ruamel-yaml_0.17.7.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-ruamel-yaml_0.17.10.bb
index 5da0ac3..3414ed0 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-ruamel-yaml_0.17.7.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-ruamel-yaml_0.17.10.bb
@@ -8,9 +8,11 @@
 
 inherit pypi setuptools3
 
-BBCLASSEXTEND = "native nativesdk"
+SRC_URI[sha256sum] = "106bc8d6dc6a0ff7c9196a47570432036f41d556b779c6b4e618085f57e39e67"
 
-SRC_URI[sha256sum] = "5c3fa739bbedd2f23769656784e671c6335d17a5bf163c3c3901d8663c0af287"
+RDEPENDS_${PN} += "\
+    ${PYTHON_PN}-shell \
+"
 
 do_install_prepend() {
     export RUAMEL_NO_PIP_INSTALL_CHECK=1
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-scrypt_0.8.17.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-scrypt_0.8.18.bb
similarity index 79%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-scrypt_0.8.17.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-scrypt_0.8.18.bb
index bcd5891..da31300 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-scrypt_0.8.17.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-scrypt_0.8.18.bb
@@ -5,7 +5,7 @@
 
 SRC_URI += "file://0001-py-scrypt-remove-the-hard-coded-include-paths.patch"
 
-SRC_URI[sha256sum] = "25b5075f2238be93af1cd574540a5ea01b8547f9b678aa72d22fce22577475ec"
+SRC_URI[sha256sum] = "bcf04257af12e6d52974d177a7b08e314b66f350a73f9b6f7b232d69a6a1e041"
 
 inherit pypi ptest setuptools3 dos2unix
 
@@ -17,6 +17,10 @@
     ${PYTHON_PN}-pytest \
 "
 
+RDEPENDS_${PN} += " \
+    ${PYTHON_PN}-ctypes \
+"
+
 do_install_ptest() {
     install -d ${D}${PTEST_PATH}/tests
     cp -rf ${S}/scrypt/tests/* ${D}${PTEST_PATH}/tests/
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-sentry-sdk_1.1.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-sentry-sdk_1.2.0.bb
similarity index 82%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-sentry-sdk_1.1.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-sentry-sdk_1.2.0.bb
index 89c659d..e86ff46 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-sentry-sdk_1.1.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-sentry-sdk_1.2.0.bb
@@ -7,7 +7,7 @@
 
 RDEPENDS_${PN} += "python3-urllib3"
 
-SRC_URI[sha256sum] = "c1227d38dca315ba35182373f129c3e2722e8ed999e52584e6aca7d287870739"
+SRC_URI[sha256sum] = "9907adbdd30a55b818914512cc143e6beae0bb3ba78b2649f4b079752eb0e424"
 
 PYPI_PACKAGE = "sentry-sdk"
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-sqlalchemy_1.4.15.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-sqlalchemy_1.4.20.bb
similarity index 86%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-sqlalchemy_1.4.15.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-sqlalchemy_1.4.20.bb
index 2d7273b..b96cdd3 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-sqlalchemy_1.4.15.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-sqlalchemy_1.4.20.bb
@@ -4,7 +4,7 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=3359ed561ac16aaa25b6c6eff84df595"
 
-SRC_URI[sha256sum] = "0ff100c75cd175f35f4d24375a0b3d82461f5b1af5fc8d112ef0e5ceea8049e6"
+SRC_URI[sha256sum] = "38ee3a266afef2978e82824650457f70c5d74ec0cadec1b10fe5ed6f038eb5d0"
 
 PYPI_PACKAGE = "SQLAlchemy"
 inherit pypi setuptools3
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-texttable_1.6.3.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-texttable_1.6.4.bb
similarity index 64%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-texttable_1.6.3.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-texttable_1.6.4.bb
index 03ebd01..6916a72 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-texttable_1.6.3.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-texttable_1.6.4.bb
@@ -5,7 +5,6 @@
 
 inherit pypi setuptools3
 
-SRC_URI[md5sum] = "68e6b31d36f5c20221da7d5db3eca772"
-SRC_URI[sha256sum] = "ce0faf21aa77d806bbff22b107cc22cce68dc9438f97a2df32c93e9afa4ce436"
+SRC_URI[sha256sum] = "42ee7b9e15f7b225747c3fa08f43c5d6c83bc899f80ff9bae9319334824076e9"
 
 BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-tqdm_4.61.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-tqdm_4.61.2.bb
similarity index 67%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-tqdm_4.61.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-tqdm_4.61.2.bb
index 0c04b67..1e127f7 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-tqdm_4.61.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-tqdm_4.61.2.bb
@@ -5,10 +5,15 @@
 LICENSE = "MIT & MPL-2.0"
 LIC_FILES_CHKSUM = "file://LICENCE;md5=59e4271a933d33edfe60237db377a14b"
 
-SRC_URI[sha256sum] = "cd5791b5d7c3f2f1819efc81d36eb719a38e0906a7380365c556779f585ea042"
+SRC_URI[sha256sum] = "8bb94db0d4468fea27d004a0f1d1c02da3cdedc00fe491c0de986b76a04d6b0a"
 
 inherit pypi setuptools3
 
 DEPENDS += "${PYTHON_PN}-setuptools-scm-native"
 
+RDEPENDS_${PN} += " \
+	python3-logging \
+	python3-numbers \
+"
+
 BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-typeguard_2.12.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-typeguard_2.12.1.bb
similarity index 87%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-typeguard_2.12.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-typeguard_2.12.1.bb
index 148806e..8030676 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-typeguard_2.12.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-typeguard_2.12.1.bb
@@ -3,7 +3,7 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=f0e423eea5c91e7aa21bdb70184b3e53"
 
-SRC_URI[sha256sum] = "fca77fd4ccba63465b421cdbbab5a1a8e3994e6d6f18b45da2bb475c09f147ef"
+SRC_URI[sha256sum] = "c2af8b9bdd7657f4bd27b45336e7930171aead796711bc4cfc99b4731bb9d051"
 
 inherit pypi setuptools3 ptest
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-urllib3_1.26.5.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-urllib3_1.26.6.bb
similarity index 86%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-urllib3_1.26.5.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-urllib3_1.26.6.bb
index f2fb33c..f9b49fe 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-urllib3_1.26.5.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-urllib3_1.26.6.bb
@@ -3,7 +3,7 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=c2823cb995439c984fd62a973d79815c"
 
-SRC_URI[sha256sum] = "a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098"
+SRC_URI[sha256sum] = "f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-watchdog_2.1.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-watchdog_2.1.3.bb
similarity index 80%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-watchdog_2.1.2.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-watchdog_2.1.3.bb
index c2bf68a..ba0fdf1 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-watchdog_2.1.2.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-watchdog_2.1.3.bb
@@ -4,7 +4,7 @@
 LICENSE = "Apache-2.0"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
 
-SRC_URI[sha256sum] = "0237db4d9024859bea27d0efb59fe75eef290833fd988b8ead7a879b0308c2db"
+SRC_URI[sha256sum] = "e5236a8e8602ab6db4b873664c2d356c365ab3cac96fbdec4970ad616415dd45"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-websocket-client_1.0.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-websocket-client_1.1.0.bb
similarity index 82%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-websocket-client_1.0.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-websocket-client_1.1.0.bb
index da4e05f..b46392a 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-websocket-client_1.0.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-websocket-client_1.1.0.bb
@@ -7,7 +7,7 @@
 LICENSE = "LGPLv2.1"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=c96ca6c1de8adc025adfada81d06fba5"
 
-SRC_URI[sha256sum] = "3e2bf58191d4619b161389a95bdce84ce9e0b24eb8107e7e590db682c2d0ca81"
+SRC_URI[sha256sum] = "b68e4959d704768fa20e35c9d508c8dc2bbc041fd8d267c0d7345cffe2824568"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-xlsxwriter_1.4.3.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-xlsxwriter_1.4.4.bb
similarity index 82%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-xlsxwriter_1.4.3.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-xlsxwriter_1.4.4.bb
index e6b1969..64ab8af 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-xlsxwriter_1.4.3.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-xlsxwriter_1.4.4.bb
@@ -16,6 +16,6 @@
 	python3-io \
 "
 
-SRC_URI[sha256sum] = "641db6e7b4f4982fd407a3f372f45b878766098250d26963e95e50121168cbe2"
+SRC_URI[sha256sum] = "791567acccc485ba76e0b84bccced2651981171de5b47d541520416f2f9f93e3"
 
 BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-yamlloader_1.0.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-yamlloader_1.1.0.bb
similarity index 76%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-yamlloader_1.0.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-yamlloader_1.1.0.bb
index a2483a6..25e7eda 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-yamlloader_1.0.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-yamlloader_1.1.0.bb
@@ -3,7 +3,7 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=6831ef36faa29329bce2420c5356f97e"
 
-SRC_URI[sha256sum] = "e96dc3dc6895d814c330c054c966d993fc81ef1dbf5a30a4bdafeb256359e058"
+SRC_URI[sha256sum] = "8a297c7a197683ba02e5e2b882ffd6c6180d01bdefb534b69cd3962df020bfe6"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi/0001-Fix-imports-for-ptests.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi/0001-Fix-imports-for-ptests.patch
new file mode 100644
index 0000000..fa58897
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi/0001-Fix-imports-for-ptests.patch
@@ -0,0 +1,3905 @@
+From 0dedc1c573ddc4e87475eb03c64555cd54a72e92 Mon Sep 17 00:00:00 2001
+From: Trevor Gamblin <trevor.gamblin@windriver.com>
+Date: Mon, 7 Jun 2021 09:40:20 -0400
+Subject: [PATCH] Fix imports for tests
+
+Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.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(-)
+
+--- a/tests/test_asyncio.py
++++ b/tests/test_asyncio.py
+@@ -2,7 +2,7 @@ import unittest
+ import yappi
+ import asyncio
+ import threading
+-from utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io
++from .utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io
+ 
+ 
+ @asyncio.coroutine
+--- a/tests/test_asyncio_context_vars.py
++++ b/tests/test_asyncio_context_vars.py
+@@ -5,7 +5,7 @@ import contextvars
+ import functools
+ import time
+ import os
+-import utils
++import tests.utils as utils
+ import yappi
+ 
+ async_context_id = contextvars.ContextVar('async_context_id')
+--- a/tests/test_functionality.py
++++ b/tests/test_functionality.py
+@@ -1,1916 +1,1916 @@
+-import os

+-import sys

+-import time

+-import threading

+-import unittest

+-import yappi

+-import _yappi

+-import utils

+-import multiprocessing  # added to fix http://bugs.python.org/issue15881 for > Py2.6

+-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 = "tests/%s.profile" % (func.__name__)

+-            try:

+-                stats.add(fname)

+-            except IOError:

+-                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,

+-            'Could not find "_MainThread". Found: %s' % (', '.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,

+-            'Could not find "_MainThread". Found: %s' % (', '.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 = "burn_cpu-%s" % 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()

+-        if utils.is_py3x():

+-            from queue import Queue

+-        else:

+-            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)

+-

+-    @unittest.skipIf(not sys.version_info >= (3, 2), "requires Python 3.2")

+-    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()

+-

+-    @unittest.skipIf(not sys.version_info >= (3, 2), "requires Python 3.2")

+-    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 tests.utils as utils
++import multiprocessing  # added to fix http://bugs.python.org/issue15881 for > Py2.6
++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 = "tests/%s.profile" % (func.__name__)
++            try:
++                stats.add(fname)
++            except IOError:
++                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,
++            'Could not find "_MainThread". Found: %s' % (', '.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,
++            'Could not find "_MainThread". Found: %s' % (', '.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 = "burn_cpu-%s" % 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()
++        if utils.is_py3x():
++            from queue import Queue
++        else:
++            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)
++
++    @unittest.skipIf(not sys.version_info >= (3, 2), "requires Python 3.2")
++    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()
++
++    @unittest.skipIf(not sys.version_info >= (3, 2), "requires Python 3.2")
++    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()
+--- a/tests/test_gevent.py
++++ b/tests/test_gevent.py
+@@ -4,7 +4,7 @@ import yappi
+ import gevent
+ from gevent.event import Event
+ import threading
+-from utils import (
++from .utils import (
+     YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io,
+     burn_io_gevent
+ )
+--- a/tests/test_hooks.py
++++ b/tests/test_hooks.py
+@@ -5,7 +5,7 @@ import unittest
+ import time
+ 
+ import yappi
+-import utils
++import tests.utils as utils
+ 
+ 
+ def a():
+--- a/tests/test_tags.py
++++ b/tests/test_tags.py
+@@ -2,7 +2,7 @@ import unittest
+ import yappi
+ import threading
+ import time
+-from utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io
++from .utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io
+ 
+ 
+ class MultiThreadTests(YappiUnitTestCase):
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi_1.3.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi_1.3.2.bb
index 7c3f0fd..8a1aca2 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi_1.3.2.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi_1.3.2.bb
@@ -8,6 +8,7 @@
 
 SRC_URI += " \
     file://run-ptest \
+    file://0001-Fix-imports-for-ptests.patch \
 "
 
 inherit pypi setuptools3 ptest
@@ -19,9 +20,11 @@
 "
 
 RDEPENDS_${PN}-ptest += " \
-    ${PYTHON_PN}-pytest \
+    ${PYTHON_PN}-gevent \
     ${PYTHON_PN}-multiprocessing \
+    ${PYTHON_PN}-pytest \
     ${PYTHON_PN}-profile \
+    ${PYTHON_PN}-zopeinterface \
 "
 
 do_install_ptest() {
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-yarl/0001-Drop-tests-for-semicolon-as-a-separator.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-yarl/0001-Drop-tests-for-semicolon-as-a-separator.patch
new file mode 100644
index 0000000..1a9d5d0
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-yarl/0001-Drop-tests-for-semicolon-as-a-separator.patch
@@ -0,0 +1,45 @@
+From 47eabc562a8883d757e3cff487c6c6e98def5a21 Mon Sep 17 00:00:00 2001
+From: Andrew Svetlov <andrew.svetlov@gmail.com>
+Date: Fri, 28 May 2021 12:42:17 +0300
+Subject: [PATCH] Drop tests for semicolon as a separator
+
+yarl 1.6.3 ptests check the use of semicolons as separators in URLs,
+which are no longer valid by default in newer versions of Python. This
+patch is in python3-yarl master, but there is no release with it yet, so
+backport it until there is a new release.
+
+For more info, see: 
+https://bugs.python.org/issue42967
+https://github.com/aio-libs/yarl/issues/563
+
+Upstream-Status: Backport
+(https://github.com/aio-libs/yarl/commit/47eabc562a8883d757e3cff487c6c6e98def5a21)
+
+Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com>
+
+---
+ tests/test_url_query.py | 11 -----------
+ 1 file changed, 11 deletions(-)
+
+diff --git a/tests/test_url_query.py b/tests/test_url_query.py
+index d2ca640..07f858b 100644
+--- a/tests/test_url_query.py
++++ b/tests/test_url_query.py
+@@ -60,14 +60,3 @@ def test_ampersand_as_value():
+     u = URL("http://127.0.0.1/?a=1%26b=2")
+     assert len(u.query) == 1
+     assert u.query["a"] == "1&b=2"
+-
+-
+-def test_semicolon_as_separator():
+-    u = URL("http://127.0.0.1/?a=1;b=2")
+-    assert len(u.query) == 2
+-
+-
+-def test_semicolon_as_value():
+-    u = URL("http://127.0.0.1/?a=1%3Bb=2")
+-    assert len(u.query) == 1
+-    assert u.query["a"] == "1;b=2"
+-- 
+2.31.1
+
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-yarl_1.6.3.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-yarl_1.6.3.bb
index 01682a4..e0e2626 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-yarl_1.6.3.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-yarl_1.6.3.bb
@@ -7,6 +7,7 @@
 
 SRC_URI += " \
     file://run-ptest \
+    file://0001-Drop-tests-for-semicolon-as-a-separator.patch \
 "
 
 PYPI_PACKAGE = "yarl"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-zeroconf_0.33.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-zeroconf_0.33.1.bb
new file mode 100644
index 0000000..a0af842
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-zeroconf_0.33.1.bb
@@ -0,0 +1,13 @@
+SUMMARY = "Pure Python Multicast DNS Service Discovery Library (Bonjour/Avahi compatible)"
+HOMEPAGE = "https://github.com/jstasiak/python-zeroconf"
+LICENSE = "LGPL-2.1"
+LIC_FILES_CHKSUM = "file://COPYING;md5=3bb705b228ea4a14ea2728215b780d80"
+
+SRC_URI[sha256sum] = "ac88738639669f924859a4e01d9742f3783e619e710103f4a0d321a47f260fd2"
+
+inherit pypi setuptools3
+
+RDEPENDS_${PN} += " \
+    ${PYTHON_PN}-ifaddr \
+    ${PYTHON_PN}-asyncio \
+"