copr-backendsrc1a0b7d30fa384a2908886d423187dcb79aeae1c70565b669310522c2c1be5f49Backend for CoprCOPR is lightweight build system. It allows you to create new project in WebUI,
and submit new builds and COPR will create yum repository from latest builds.
This package contains backend.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-c81aa1c6-7830-4928-bd89-d5ef271131d0copr-backendsrcf143c6081f1c63bdfef033a88f42fa81b2c3f64fa0f00477345b3c2822dcae98Backend for CoprCOPR is lightweight build system. It allows you to create new project in WebUI,
and submit new builds and COPR will create yum repository from latest builds.
This package contains backend.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-7e5ed7c3-a8b4-4735-a744-bc0561dd5c4acopr-backendsrce866065287602ab1913b9fd0105099bc33e6961fbf254500945bea5e61d56616Backend for CoprCOPR is lightweight build system. It allows you to create new project in WebUI,
and submit new builds and COPR will create yum repository from latest builds.
This package contains backend.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-d816d000-a8b9-4240-b18b-ff361b3179b2copr-backendsrca7556c137147cf078c0161c1eb9fe5edbf91c26a7f2eedc19710282c8a8b92c2Backend for CoprCOPR is lightweight build system. It allows you to create new project in WebUI,
and submit new builds and COPR will create yum repository from latest builds.
This package contains backend.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-ea842833-c78c-4fbe-9b73-eaf717f374accopr-builderx86_64036c6358c5b1f436496097212265996c88b084439a0cc41f56896dbaa58ecbcecopr-rpmbuild with all weak dependenciesProvides command capable of running COPR build-tasks.
Example: copr-rpmbuild 12345-epel-7-x86_64 will locally
build build-id 12345 for chroot epel-7-x86_64.
This package contains all optional modules for building SRPM.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-b769dd42-2f8b-4301-879f-ab304a4ef3a2copr-rpmbuild-0.68-1.src.rpm/etc/copr-builder/etc/copr-builder/hooks/etc/copr-builder/hooks/cleanup/etc/copr-builder/hooks/cleanup/README/etc/copr-rpmbuild/mock-config-overrides/etc/copr-rpmbuild/mock-config-overrides/README/usr/bin/copr-builder-cleanup/usr/bin/copr-update-buildercopr-clisrc825fc389b3b08e638573193deb2d03dbfc38e0c49175ef2544a2b7756af45decCommand line interface for COPRCOPR is lightweight build system. It allows you to create new project in WebUI,
and submit new builds and COPR will create yum repository from latests builds.
This package contains command line interface.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-4f2cc9a9-c8d8-4ca8-ab61-bc4a895c830ccopr-clinoarcha72dc87c929ef7dab68b7d8203a679eec3ef16376cbc29b74c7045aae8e90d0fCommand line interface for COPRCOPR is lightweight build system. It allows you to create new project in WebUI,
and submit new builds and COPR will create yum repository from latests builds.
This package contains command line interface.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-b9cbef08-3acd-45b4-8581-eedaafaac31fcopr-cli-1.109-1.git.7652.b8277be.src.rpm/usr/bin/copr/usr/bin/copr-cli/usr/bin/package-build-ordercopr-clisrc36d703d5d7a808229b7673f8c9fdd43ceb7b20c3c652b70b0938fd220499dbd7Command line interface for COPRCOPR is lightweight build system. It allows you to create new project in WebUI,
and submit new builds and COPR will create yum repository from latests builds.
This package contains command line interface.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-d6e710b1-e0de-4066-b86d-8a8c980bfbaacopr-clisrca9b1e5271a84f8f17b9cde0bb665af9afe8a9704b256585dc2279e23845bfbe9Command line interface for COPRCOPR is lightweight build system. It allows you to create new project in WebUI,
and submit new builds and COPR will create yum repository from latests builds.
This package contains command line interface.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-b9cbef08-3acd-45b4-8581-eedaafaac31fcopr-clisrca4277be693dbeb8cddae38ec9c26a400fcfb1231f839041f6d0c6e5adccafce0Command line interface for COPRCOPR is lightweight build system. It allows you to create new project in WebUI,
and submit new builds and COPR will create yum repository from latests builds.
This package contains command line interface.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-20fcfd7e-fb2e-44c0-8c81-cbb76a370d35copr-dist-gitsrcf90214ef9405d2381de52fbd29a5cbe2cb86f4a35370d87064da9da993db9261Copr services for Dist Git serverCOPR is lightweight build system. It allows you to create new project in WebUI
and submit new builds and COPR will create yum repository from latest builds.
This package contains Copr services for Dist Git server.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-3b3d6607-b444-4e9d-a59f-76d5dbcda7bccopr-dist-gitsrc6777a3bb0659f6325e0a756f8397692daec8b9099ae96af4ccf189109c2a4bbcCopr services for Dist Git serverCOPR is lightweight build system. It allows you to create new project in WebUI
and submit new builds and COPR will create yum repository from latest builds.
This package contains Copr services for Dist Git server.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-c2598c19-13be-42fb-87f3-1b2bc48567eacopr-dist-gitsrce9041768b23b402f439b513f381b553fbfa6bc8254dcee281c58e1182ae5a7e5Copr services for Dist Git serverCOPR is lightweight build system. It allows you to create new project in WebUI
and submit new builds and COPR will create yum repository from latest builds.
This package contains Copr services for Dist Git server.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-a1e74cf6-e060-46ef-8d0b-f66fee0fa988copr-distgit-clientx86_64137d303214649fa09a50c7bb446b278de46bf43cd4b025d85c85ec441e125ac5Utility to download sources from dist-gitA simple, configurable python utility that is able to download sources from
various dist-git instances, and generate source RPMs.
The utility is able to automatically map the .git/config clone URL into
the corresponding dist-git instance configuration.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-b769dd42-2f8b-4301-879f-ab304a4ef3a2copr-rpmbuild-0.68-1.src.rpm/etc/copr-distgit-client/etc/copr-distgit-client/default.ini/usr/bin/copr-distgit-clientcopr-frontendsrc81ad9dd4d7036c5e02a04a53cfb510145ddc022f60be5753ce6d91b20f72dbccFrontend for CoprCOPR is lightweight build system. It allows you to create new project in WebUI,
and submit new builds and COPR will create yum repository from latests builds.
This package contains frontend.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-96041642-e2fc-4731-9f97-b1df5a608792copr-frontendsrc7da331dbf8d90fc08cf099585d81cb08f0550841032d17e75086e84a153de798Frontend for CoprCOPR is lightweight build system. It allows you to create new project in WebUI,
and submit new builds and COPR will create yum repository from latests builds.
This package contains frontend.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-248b4ea4-3910-4ce5-9a49-abc10e36cddbcopr-frontendsrc27b51886552dc86f89dcf6be061a578df45b0f9f32d3491ee6aa837737154e55Frontend for CoprCOPR is lightweight build system. It allows you to create new project in WebUI,
and submit new builds and COPR will create yum repository from latests builds.
This package contains frontend.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-f5ada082-c113-45bd-8ee5-14902e023f54copr-frontendsrc5a597b15e1a9b7f7aeb844f27dda0f55ac9c13b9f6a30208eb6c1b0045b55ef8Frontend for CoprCOPR is lightweight build system. It allows you to create new project in WebUI,
and submit new builds and COPR will create yum repository from latests builds.
This package contains frontend.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-8e1da11b-f3c9-4dac-afe0-5fc249e62475copr-frontendsrcad1d1b35a304e0de9861f6d147a2bcf86ea798d8840db23906ce89570d176919Frontend for CoprCOPR is lightweight build system. It allows you to create new project in WebUI,
and submit new builds and COPR will create yum repository from latests builds.
This package contains frontend.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-92a91969-539f-4f4c-963b-994d09c95edbcopr-keygennoarch865b59d4865bb89898604849e225a8462a57dcf6d5394c9c0c1358e1d3566a00Part of Copr build system. Aux service that generate keys for signdCOPR is lightweight build system. It allows you to create new project in WebUI,
and submit new builds and COPR will create yum repository from latest builds.
This package contains aux service that generate keys for package signing.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-d30a9d8b-f05b-447f-9c5d-faf5b34251a3copr-keygen-1.90-1.src.rpm/etc/copr-keygen/etc/cron.daily/copr-keygen/etc/logrotate.d/copr-keygen/etc/sudoers.d/copr_signer/usr/bin/gpg-copr/usr/bin/gpg-copr-prolong/usr/bin/gpg_copr.shcopr-keygensrc530dbaffd50cf3ab9a3529a74c746bd7de51009cfe95e9b2797c8967876ca0bdPart of Copr build system. Aux service that generate keys for signdCOPR is lightweight build system. It allows you to create new project in WebUI,
and submit new builds and COPR will create yum repository from latest builds.
This package contains aux service that generate keys for package signing.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-d30a9d8b-f05b-447f-9c5d-faf5b34251a3copr-rpmbuildsrcda0a667ee8972fd3e6efb7da0f0a173e02bd123f13a335fb19fc5cc19dcf8c40Run COPR build tasksProvides command capable of running COPR build-tasks.
Example: copr-rpmbuild 12345-epel-7-x86_64 will locally
build build-id 12345 for chroot epel-7-x86_64.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-288babd2-91c5-4d62-bc26-f7c5312b3190copr-rpmbuildsrc9c828c6b2d91c1206c774189c23fae983bf21812c5e0673b2c53c3865710241bRun COPR build tasksProvides command capable of running COPR build-tasks.
Example: copr-rpmbuild 12345-epel-7-x86_64 will locally
build build-id 12345 for chroot epel-7-x86_64.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-747a8944-04af-4ec5-a138-3b91e3f3ead6copr-rpmbuildsrc283090067309af98e72fa4631862dd243864de026532a0dcec50092751b69945Run COPR build tasksProvides command capable of running COPR build-tasks.
Example: copr-rpmbuild 12345-epel-7-x86_64 will locally
build build-id 12345 for chroot epel-7-x86_64.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-b769dd42-2f8b-4301-879f-ab304a4ef3a2copr-rpmbuildx86_64e96c47091bed94f5c8470de8644e4e2a19bcc6a9113e04b61c193fab674040bbRun COPR build tasksProvides command capable of running COPR build-tasks.
Example: copr-rpmbuild 12345-epel-7-x86_64 will locally
build build-id 12345 for chroot epel-7-x86_64.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-b769dd42-2f8b-4301-879f-ab304a4ef3a2copr-rpmbuild-0.68-1.src.rpm/etc/copr-rpmbuild/etc/copr-rpmbuild/main.ini/etc/copr-rpmbuild/mock-custom-build.cfg.j2/etc/copr-rpmbuild/mock-source-build.cfg.j2/etc/copr-rpmbuild/mock.cfg.j2/etc/copr-rpmbuild/rpkg.conf.j2/usr/bin/copr-rpmbuild/usr/bin/copr-rpmbuild-cancel/usr/bin/copr-rpmbuild-log/usr/bin/copr-rpmbuild-loggify/usr/bin/copr-sources-customdist-gitnoarch90c8ba0625556142f23c9031b13022ccbef84ba4d6d8d44412c0eb8b6bd90850Package source version control systemDistGit is a Git repository specifically designed to hold RPM
package sources.https://github.com/release-engineering/dist-gitMIT AND GPL-1.0-onlyopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-a7db64ba-da7c-4dbc-846a-0659b88e4359dist-git-1.17-1.src.rpm/etc/dist-git/etc/dist-git/dist-git.conf/etc/httpd/conf.d/dist-git/etc/httpd/conf.d/dist-git.conf/etc/httpd/conf.d/dist-git/git-smart-http.conf/etc/httpd/conf.d/dist-git/lookaside-upload.conf.example/etc/httpd/conf.d/dist-git/lookaside.conf/etc/httpd/conf.d/dist-git/manifest.confdist-gitsrc79fea52f2b0e71c7f71cc137e4edf0b207a5fcc188660e48f5482209e34f8f83Package source version control systemDistGit is a Git repository specifically designed to hold RPM
package sources.https://github.com/release-engineering/dist-gitMIT AND GPL-1.0-onlyopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-a7db64ba-da7c-4dbc-846a-0659b88e4359dist-git-selinuxnoarchf7548f90df2962456b7117b76d8fed287240018669d3440dd9783800b6e47ecdSELinux support for dist-gitDist Git is a remote Git repository specifically designed to hold RPM
package sources.
This package includes SELinux support.https://github.com/release-engineering/dist-gitMIT AND GPL-1.0-onlyopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-a7db64ba-da7c-4dbc-846a-0659b88e4359dist-git-1.17-1.src.rpm/usr/bin/dist-git-gc/usr/bin/mkbranch/usr/bin/mkbranch_branching/usr/bin/remove_unused_sources/usr/bin/setup_git_packagedistribution-gpg-keysnoarchce97633c6e3d213814ff09302e01d9f4a2a67749bba380d3f10db285e289532bGPG keys of various Linux distributionsGPG keys used by various Linux distributions to sign packages.https://github.com/xsuchy/distribution-gpg-keysCC0-1.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-eab6ed4d-e1d3-4129-b864-a4e0cdc14cf5distribution-gpg-keys-1.87-1.src.rpmdistribution-gpg-keyssrc6e7dc8df3b5026fcf15366d813b355ee4b3ceb1512fec1ebff27c7f3b7780d10GPG keys of various Linux distributionsGPG keys used by various Linux distributions to sign packages.https://github.com/xsuchy/distribution-gpg-keysCC0-1.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-eab6ed4d-e1d3-4129-b864-a4e0cdc14cf5distribution-gpg-keys-coprnoarch8e4eaee34d463de09298777f549b696871e123c14d50bdb1607b53966e0a5b24GPG keys for Copr projectsGPG keys used by Copr projects.https://github.com/xsuchy/distribution-gpg-keysCC0-1.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-eab6ed4d-e1d3-4129-b864-a4e0cdc14cf5distribution-gpg-keys-1.87-1.src.rpmjs-jquery-uinoarch3b90b0b8b02ed0d73c96a164c8bda50b64945ee1704ee8e5ea19479c02125b42jQuery user interfaceA curated set of user interface interactions, effects, widgets, and
themes built on top of the jQuery JavaScript Library.https://jqueryui.com/MITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-a41c7d43-781c-4fc1-b9cb-0ac6e619faa4js-jquery-ui-1.13.2-1.src.rpmjs-jquery-uisrcde4fca06d27c44e6bb6d39c86673263de5348f4ed2f2b948d106ea4a6cdf99e4jQuery user interfaceA curated set of user interface interactions, effects, widgets, and
themes built on top of the jQuery JavaScript Library.https://jqueryui.com/MITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-a41c7d43-781c-4fc1-b9cb-0ac6e619faa4kojinoarchcbab276e0c46398b04712fc2b613b18462ee327b8034c6e343292acfcb3ad039Build system toolsKoji is a system for building and tracking RPMS. The base package
contains shared libraries and the command-line interface.https://pagure.io/koji/LGPLv2 and GPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-43d5e2df-66df-4fb1-b7e7-be8330c989c5koji-1.32.0-1.src.rpm/etc/koji.conf/etc/koji.conf.d/usr/bin/kojikojinoarch3d1aba8c5a4481617b1f4b2bb5c457eea4840bde37d8a946385d6751fcda9d47Build system toolsKoji is a system for building and tracking RPMS. The base package
contains shared libraries and the command-line interface.https://pagure.io/koji/LGPLv2 and GPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-fb1e5b17-d116-44dd-88dd-e321152ce5e5koji-1.32.0-1.src.rpm/etc/koji.conf/etc/koji.conf.d/usr/bin/kojikojisrce03f19bbde3c9be00ee120a58482be2dd5bfd819eb10b5202580152b4c566634Build system toolsKoji is a system for building and tracking RPMS. The base package
contains shared libraries and the command-line interface.https://pagure.io/koji/LGPLv2 and GPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-43d5e2df-66df-4fb1-b7e7-be8330c989c5kojisrc3880c3f0aaf706f2ad40ef6176baa56387433ba76407cf055d25a241c4f721b1Build system toolsKoji is a system for building and tracking RPMS. The base package
contains shared libraries and the command-line interface.https://pagure.io/koji/LGPLv2 and GPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-fb1e5b17-d116-44dd-88dd-e321152ce5e5koji-builder-plugin-rpmautospecnoarch6c838cbf364c265748a6d266d26690725d601343eea64b3eb2115426545e5d2cKoji plugin for generating RPM releases and changelogsA Koji plugin for generating RPM releases and changelogs.https://pagure.io/fedora-infra/rpmautospecMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-c193af30-d8cf-41b3-964b-b57181e178a6python-rpmautospec-0.3.5-1.src.rpmkoji-builder-plugin-rpmautospecnoarch499830deb1e15156aa1c6d31fb967fcca28240c58de01cc75799cced8c22b242Koji plugin for generating RPM releases and changelogsA Koji plugin for generating RPM releases and changelogs.https://pagure.io/fedora-infra/rpmautospecMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-f4072875-c26a-4cd8-abb4-0b60ae8fd4e9python-rpmautospec-0.3.5-1.src.rpmmocknoarch1a96619f212159cb4402a28cb6a295d6f35f4d28e0e4de6cfe4e10436d468de8Builds packages inside chrootsMock takes an SRPM and builds it in a chroot.https://github.com/rpm-software-management/mock/GPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-36990101-4763-400a-a605-019bd1d3c743mock-3.5-1.src.rpm/etc/mock/logging.ini/etc/pam.d/mock/etc/pki/mock/etc/pki/mock/README.txt/etc/security/console.apps/mock/usr/bin/mock/usr/bin/mock-parse-buildlog/usr/bin/mockchainmocksrceb459a7b5faf47078f9bdab1171c91d1b7b42bb5c865651442b109a61b577f5aBuilds packages inside chrootsMock takes an SRPM and builds it in a chroot.https://github.com/rpm-software-management/mock/GPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-36990101-4763-400a-a605-019bd1d3c743mock-core-configsnoarch06f655668554ce3b43c37400015ed2220ded09a745f6f9c0e1d6cd501dd9739bMock core config files basic chrootsConfig files which allow you to create chroots for:
* Fedora
* Epel
* Mageia
* Custom chroot
* OpenSuse Tumbleweed and Leap
* openEulerhttps://github.com/rpm-software-management/mock/GPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-9c8deaa6-0c9d-48e5-801d-28572e613f0bmock-core-configs-31.6-1.src.rpm/etc/mock/etc/mock/amazonlinux-2-aarch64.cfg/etc/mock/amazonlinux-2-x86_64.cfg/etc/mock/centos-stream-aarch64.cfg/etc/mock/centos-stream-ppc64le.cfg/etc/mock/centos-stream-x86_64.cfg/etc/mock/custom-1-aarch64.cfg/etc/mock/custom-1-armhfp.cfg/etc/mock/custom-1-i386.cfg/etc/mock/custom-1-ppc64.cfg/etc/mock/custom-1-ppc64le.cfg/etc/mock/custom-1-s390.cfg/etc/mock/custom-1-s390x.cfg/etc/mock/custom-1-x86_64.cfg/etc/mock/default.cfg/etc/mock/eol/etc/mock/eol/epel-5-i386.cfg/etc/mock/eol/epel-5-x86_64.cfg/etc/mock/eol/fedora-25-aarch64.cfg/etc/mock/eol/fedora-25-armhfp.cfg/etc/mock/eol/fedora-25-i386.cfg/etc/mock/eol/fedora-25-ppc64.cfg/etc/mock/eol/fedora-25-ppc64le.cfg/etc/mock/eol/fedora-25-s390x.cfg/etc/mock/eol/fedora-25-x86_64.cfg/etc/mock/eol/fedora-26-aarch64.cfg/etc/mock/eol/fedora-26-armhfp.cfg/etc/mock/eol/fedora-26-i386.cfg/etc/mock/eol/fedora-26-ppc64.cfg/etc/mock/eol/fedora-26-ppc64le.cfg/etc/mock/eol/fedora-26-s390x.cfg/etc/mock/eol/fedora-26-x86_64.cfg/etc/mock/eol/fedora-27-aarch64.cfg/etc/mock/eol/fedora-27-armhfp.cfg/etc/mock/eol/fedora-27-i386.cfg/etc/mock/eol/fedora-27-ppc64.cfg/etc/mock/eol/fedora-27-ppc64le.cfg/etc/mock/eol/fedora-27-s390x.cfg/etc/mock/eol/fedora-27-x86_64.cfg/etc/mock/eol/fedora-28-aarch64.cfg/etc/mock/eol/fedora-28-armhfp.cfg/etc/mock/eol/fedora-28-i386.cfg/etc/mock/eol/fedora-28-ppc64.cfg/etc/mock/eol/fedora-28-ppc64le.cfg/etc/mock/eol/fedora-28-s390x.cfg/etc/mock/eol/fedora-28-x86_64.cfg/etc/mock/epel-6-i386.cfg/etc/mock/epel-6-ppc64.cfg/etc/mock/epel-6-x86_64.cfg/etc/mock/epel-7-aarch64.cfg/etc/mock/epel-7-ppc64.cfg/etc/mock/epel-7-ppc64le.cfg/etc/mock/epel-7-x86_64.cfg/etc/mock/epel-8-aarch64.cfg/etc/mock/epel-8-ppc64le.cfg/etc/mock/epel-8-x86_64.cfg/etc/mock/fedora-29-aarch64.cfg/etc/mock/fedora-29-armhfp.cfg/etc/mock/fedora-29-i386.cfg/etc/mock/fedora-29-ppc64le.cfg/etc/mock/fedora-29-s390x.cfg/etc/mock/fedora-29-x86_64.cfg/etc/mock/fedora-30-aarch64.cfg/etc/mock/fedora-30-armhfp.cfg/etc/mock/fedora-30-i386.cfg/etc/mock/fedora-30-ppc64le.cfg/etc/mock/fedora-30-s390x.cfg/etc/mock/fedora-30-x86_64.cfg/etc/mock/fedora-31-aarch64.cfg/etc/mock/fedora-31-armhfp.cfg/etc/mock/fedora-31-i386.cfg/etc/mock/fedora-31-ppc64le.cfg/etc/mock/fedora-31-s390x.cfg/etc/mock/fedora-31-x86_64.cfg/etc/mock/fedora-32-aarch64.cfg/etc/mock/fedora-32-armhfp.cfg/etc/mock/fedora-32-i386.cfg/etc/mock/fedora-32-ppc64le.cfg/etc/mock/fedora-32-s390x.cfg/etc/mock/fedora-32-x86_64.cfg/etc/mock/fedora-rawhide-aarch64.cfg/etc/mock/fedora-rawhide-armhfp.cfg/etc/mock/fedora-rawhide-i386.cfg/etc/mock/fedora-rawhide-ppc64le.cfg/etc/mock/fedora-rawhide-s390x.cfg/etc/mock/fedora-rawhide-x86_64.cfg/etc/mock/mageia-6-armv5tl.cfg/etc/mock/mageia-6-armv7hl.cfg/etc/mock/mageia-6-i586.cfg/etc/mock/mageia-6-x86_64.cfg/etc/mock/mageia-7-aarch64.cfg/etc/mock/mageia-7-armv7hl.cfg/etc/mock/mageia-7-i586.cfg/etc/mock/mageia-7-x86_64.cfg/etc/mock/mageia-8-aarch64.cfg/etc/mock/mageia-8-armv7hl.cfg/etc/mock/mageia-8-i586.cfg/etc/mock/mageia-8-x86_64.cfg/etc/mock/mageia-cauldron-aarch64.cfg/etc/mock/mageia-cauldron-armv7hl.cfg/etc/mock/mageia-cauldron-i586.cfg/etc/mock/mageia-cauldron-x86_64.cfg/etc/mock/openmandriva-4.0-aarch64.cfg/etc/mock/openmandriva-4.0-armv7hnl.cfg/etc/mock/openmandriva-4.0-i686.cfg/etc/mock/openmandriva-4.0-x86_64.cfg/etc/mock/openmandriva-cooker-aarch64.cfg/etc/mock/openmandriva-cooker-armv7hnl.cfg/etc/mock/openmandriva-cooker-i686.cfg/etc/mock/openmandriva-cooker-x86_64.cfg/etc/mock/openmandriva-rolling-aarch64.cfg/etc/mock/openmandriva-rolling-armv7hnl.cfg/etc/mock/openmandriva-rolling-i686.cfg/etc/mock/openmandriva-rolling-x86_64.cfg/etc/mock/opensuse-leap-15.0-aarch64.cfg/etc/mock/opensuse-leap-15.0-x86_64.cfg/etc/mock/opensuse-leap-15.1-aarch64.cfg/etc/mock/opensuse-leap-15.1-x86_64.cfg/etc/mock/opensuse-tumbleweed-aarch64.cfg/etc/mock/opensuse-tumbleweed-i586.cfg/etc/mock/opensuse-tumbleweed-ppc64.cfg/etc/mock/opensuse-tumbleweed-ppc64le.cfg/etc/mock/opensuse-tumbleweed-x86_64.cfg/etc/mock/rhel-7-aarch64.cfg/etc/mock/rhel-7-ppc64.cfg/etc/mock/rhel-7-ppc64le.cfg/etc/mock/rhel-7-x86_64.cfg/etc/mock/rhel-8-aarch64.cfg/etc/mock/rhel-8-ppc64.cfg/etc/mock/rhel-8-ppc64le.cfg/etc/mock/rhel-8-x86_64.cfg/etc/mock/rhelbeta-8-aarch64.cfg/etc/mock/rhelbeta-8-ppc64le.cfg/etc/mock/rhelbeta-8-s390x.cfg/etc/mock/rhelbeta-8-x86_64.cfg/etc/mock/rhelepel-8-aarch64.cfg/etc/mock/rhelepel-8-ppc64.cfg/etc/mock/rhelepel-8-ppc64le.cfg/etc/mock/rhelepel-8-x86_64.cfg/etc/mock/templates/etc/mock/templates/amazonlinux-2.tpl/etc/mock/templates/centos-8.tpl/etc/mock/templates/centos-stream.tpl/etc/mock/templates/epel-8.tpl/etc/mock/templates/epel-playground-8.tpl/etc/mock/templates/fedora-29.tpl/etc/mock/templates/fedora-30.tpl/etc/mock/templates/fedora-31.tpl/etc/mock/templates/fedora-rawhide.tpl/etc/mock/templates/rhel-7.tpl/etc/mock/templates/rhel-8.tplmock-core-configssrcbec50624a44c20c8d78a39db48e3b62d081e7bed0e22de0f61fdcca25028b337Mock core config files basic chrootsConfig files which allow you to create chroots for:
* Fedora
* Epel
* Mageia
* Custom chroot
* OpenSuse Tumbleweed and Leap
* openEulerhttps://github.com/rpm-software-management/mock/GPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-9c8deaa6-0c9d-48e5-801d-28572e613f0bmock-core-configsnoarch01eacccb87993373d2c6c1192a8b99fef10f87489ee780aec63122cbea037f0bMock core config files basic chrootsConfig files which allow you to create chroots for:
* Fedora
* Epel
* Mageia
* Custom chroot
* OpenSuse Tumbleweed and Leap
* openEulerhttps://github.com/rpm-software-management/mock/GPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-b273641b-2518-4c8d-97ea-30881b533ef6mock-core-configs-38.3-2.src.rpm/etc/mock/etc/mock/alma+epel-8-aarch64.cfg/etc/mock/alma+epel-8-ppc64le.cfg/etc/mock/alma+epel-8-x86_64.cfg/etc/mock/alma+epel-9-aarch64.cfg/etc/mock/alma+epel-9-ppc64le.cfg/etc/mock/alma+epel-9-s390x.cfg/etc/mock/alma+epel-9-x86_64.cfg/etc/mock/almalinux-8-aarch64.cfg/etc/mock/almalinux-8-ppc64le.cfg/etc/mock/almalinux-8-x86_64.cfg/etc/mock/almalinux-9-aarch64.cfg/etc/mock/almalinux-9-ppc64le.cfg/etc/mock/almalinux-9-s390x.cfg/etc/mock/almalinux-9-x86_64.cfg/etc/mock/amazonlinux-2-aarch64.cfg/etc/mock/amazonlinux-2-x86_64.cfg/etc/mock/anolis-7-aarch64.cfg/etc/mock/anolis-7-x86_64.cfg/etc/mock/anolis-8-aarch64.cfg/etc/mock/anolis-8-x86_64.cfg/etc/mock/centos+epel-7-ppc64le.cfg/etc/mock/centos+epel-7-x86_64.cfg/etc/mock/centos-7-aarch64.cfg/etc/mock/centos-7-ppc64.cfg/etc/mock/centos-7-ppc64le.cfg/etc/mock/centos-7-x86_64.cfg/etc/mock/centos-stream+epel-8-aarch64.cfg/etc/mock/centos-stream+epel-8-ppc64le.cfg/etc/mock/centos-stream+epel-8-x86_64.cfg/etc/mock/centos-stream+epel-9-aarch64.cfg/etc/mock/centos-stream+epel-9-ppc64le.cfg/etc/mock/centos-stream+epel-9-s390x.cfg/etc/mock/centos-stream+epel-9-x86_64.cfg/etc/mock/centos-stream+epel-next-8-aarch64.cfg/etc/mock/centos-stream+epel-next-8-ppc64le.cfg/etc/mock/centos-stream+epel-next-8-x86_64.cfg/etc/mock/centos-stream+epel-next-9-aarch64.cfg/etc/mock/centos-stream+epel-next-9-ppc64le.cfg/etc/mock/centos-stream+epel-next-9-s390x.cfg/etc/mock/centos-stream+epel-next-9-x86_64.cfg/etc/mock/centos-stream-8-aarch64.cfg/etc/mock/centos-stream-8-ppc64le.cfg/etc/mock/centos-stream-8-x86_64.cfg/etc/mock/centos-stream-9-aarch64.cfg/etc/mock/centos-stream-9-ppc64le.cfg/etc/mock/centos-stream-9-s390x.cfg/etc/mock/centos-stream-9-x86_64.cfg/etc/mock/chroot-aliases.cfg/etc/mock/circlelinux+epel-8-aarch64.cfg/etc/mock/circlelinux+epel-8-ppc64le.cfg/etc/mock/circlelinux+epel-8-x86_64.cfg/etc/mock/circlelinux-8-aarch64.cfg/etc/mock/circlelinux-8-ppc64le.cfg/etc/mock/circlelinux-8-x86_64.cfg/etc/mock/custom-1-aarch64.cfg/etc/mock/custom-1-armhfp.cfg/etc/mock/custom-1-i386.cfg/etc/mock/custom-1-ppc64.cfg/etc/mock/custom-1-ppc64le.cfg/etc/mock/custom-1-s390.cfg/etc/mock/custom-1-s390x.cfg/etc/mock/custom-1-x86_64.cfg/etc/mock/default.cfg/etc/mock/eol/etc/mock/eol/centos+epel-7-aarch64.cfg/etc/mock/eol/centos+epel-7-ppc64.cfg/etc/mock/eol/centos+epel-8-aarch64.cfg/etc/mock/eol/centos+epel-8-ppc64le.cfg/etc/mock/eol/centos+epel-8-x86_64.cfg/etc/mock/eol/centos-6-i386.cfg/etc/mock/eol/centos-6-x86_64.cfg/etc/mock/eol/centos-8-aarch64.cfg/etc/mock/eol/centos-8-ppc64le.cfg/etc/mock/eol/centos-8-x86_64.cfg/etc/mock/eol/epel-5-i386.cfg/etc/mock/eol/epel-5-x86_64.cfg/etc/mock/eol/epel-6-i386.cfg/etc/mock/eol/epel-6-x86_64.cfg/etc/mock/eol/epelplayground-8-aarch64.cfg/etc/mock/eol/epelplayground-8-ppc64le.cfg/etc/mock/eol/epelplayground-8-x86_64.cfg/etc/mock/eol/fedora-25-aarch64.cfg/etc/mock/eol/fedora-25-armhfp.cfg/etc/mock/eol/fedora-25-i386.cfg/etc/mock/eol/fedora-25-ppc64.cfg/etc/mock/eol/fedora-25-ppc64le.cfg/etc/mock/eol/fedora-25-s390x.cfg/etc/mock/eol/fedora-25-x86_64.cfg/etc/mock/eol/fedora-26-aarch64.cfg/etc/mock/eol/fedora-26-armhfp.cfg/etc/mock/eol/fedora-26-i386.cfg/etc/mock/eol/fedora-26-ppc64.cfg/etc/mock/eol/fedora-26-ppc64le.cfg/etc/mock/eol/fedora-26-s390x.cfg/etc/mock/eol/fedora-26-x86_64.cfg/etc/mock/eol/fedora-27-aarch64.cfg/etc/mock/eol/fedora-27-armhfp.cfg/etc/mock/eol/fedora-27-i386.cfg/etc/mock/eol/fedora-27-ppc64.cfg/etc/mock/eol/fedora-27-ppc64le.cfg/etc/mock/eol/fedora-27-s390x.cfg/etc/mock/eol/fedora-27-x86_64.cfg/etc/mock/eol/fedora-28-aarch64.cfg/etc/mock/eol/fedora-28-armhfp.cfg/etc/mock/eol/fedora-28-i386.cfg/etc/mock/eol/fedora-28-ppc64.cfg/etc/mock/eol/fedora-28-ppc64le.cfg/etc/mock/eol/fedora-28-s390x.cfg/etc/mock/eol/fedora-28-x86_64.cfg/etc/mock/eol/fedora-29-aarch64.cfg/etc/mock/eol/fedora-29-armhfp.cfg/etc/mock/eol/fedora-29-i386.cfg/etc/mock/eol/fedora-29-ppc64le.cfg/etc/mock/eol/fedora-29-s390x.cfg/etc/mock/eol/fedora-29-x86_64.cfg/etc/mock/eol/fedora-30-aarch64.cfg/etc/mock/eol/fedora-30-armhfp.cfg/etc/mock/eol/fedora-30-i386.cfg/etc/mock/eol/fedora-30-ppc64le.cfg/etc/mock/eol/fedora-30-s390x.cfg/etc/mock/eol/fedora-30-x86_64.cfg/etc/mock/eol/fedora-31-aarch64.cfg/etc/mock/eol/fedora-31-armhfp.cfg/etc/mock/eol/fedora-31-i386.cfg/etc/mock/eol/fedora-31-ppc64le.cfg/etc/mock/eol/fedora-31-s390x.cfg/etc/mock/eol/fedora-31-x86_64.cfg/etc/mock/eol/fedora-32-aarch64.cfg/etc/mock/eol/fedora-32-armhfp.cfg/etc/mock/eol/fedora-32-i386.cfg/etc/mock/eol/fedora-32-ppc64le.cfg/etc/mock/eol/fedora-32-s390x.cfg/etc/mock/eol/fedora-32-x86_64.cfg/etc/mock/eol/fedora-33-aarch64.cfg/etc/mock/eol/fedora-33-armhfp.cfg/etc/mock/eol/fedora-33-i386.cfg/etc/mock/eol/fedora-33-ppc64le.cfg/etc/mock/eol/fedora-33-s390x.cfg/etc/mock/eol/fedora-33-x86_64.cfg/etc/mock/eol/fedora-34-aarch64.cfg/etc/mock/eol/fedora-34-armhfp.cfg/etc/mock/eol/fedora-34-i386.cfg/etc/mock/eol/fedora-34-ppc64le.cfg/etc/mock/eol/fedora-34-s390x.cfg/etc/mock/eol/fedora-34-x86_64.cfg/etc/mock/eol/mageia-6-armv5tl.cfg/etc/mock/eol/mageia-6-armv7hl.cfg/etc/mock/eol/mageia-6-i586.cfg/etc/mock/eol/mageia-6-x86_64.cfg/etc/mock/eol/openmandriva-4.0-aarch64.cfg/etc/mock/eol/openmandriva-4.0-armv7hnl.cfg/etc/mock/eol/openmandriva-4.0-i686.cfg/etc/mock/eol/openmandriva-4.0-x86_64.cfg/etc/mock/eol/opensuse-leap-15.0-aarch64.cfg/etc/mock/eol/opensuse-leap-15.0-x86_64.cfg/etc/mock/eol/opensuse-leap-15.1-aarch64.cfg/etc/mock/eol/opensuse-leap-15.1-x86_64.cfg/etc/mock/eol/opensuse-leap-15.2-aarch64.cfg/etc/mock/eol/opensuse-leap-15.2-x86_64.cfg/etc/mock/eol/rhel-6-x86_64.cfg/etc/mock/epel-7-ppc64le.cfg/etc/mock/epel-7-x86_64.cfg/etc/mock/eurolinux-8-aarch64.cfg/etc/mock/eurolinux-8-i686.cfg/etc/mock/eurolinux-8-x86_64.cfg/etc/mock/eurolinux-9-aarch64.cfg/etc/mock/eurolinux-9-i686.cfg/etc/mock/eurolinux-9-x86_64.cfg/etc/mock/fedora-35-aarch64.cfg/etc/mock/fedora-35-armhfp.cfg/etc/mock/fedora-35-i386.cfg/etc/mock/fedora-35-ppc64le.cfg/etc/mock/fedora-35-s390x.cfg/etc/mock/fedora-35-x86_64.cfg/etc/mock/fedora-36-aarch64.cfg/etc/mock/fedora-36-armhfp.cfg/etc/mock/fedora-36-i386.cfg/etc/mock/fedora-36-ppc64le.cfg/etc/mock/fedora-36-s390x.cfg/etc/mock/fedora-36-x86_64.cfg/etc/mock/fedora-37-aarch64.cfg/etc/mock/fedora-37-i386.cfg/etc/mock/fedora-37-ppc64le.cfg/etc/mock/fedora-37-s390x.cfg/etc/mock/fedora-37-x86_64.cfg/etc/mock/fedora-38-aarch64.cfg/etc/mock/fedora-38-i386.cfg/etc/mock/fedora-38-ppc64le.cfg/etc/mock/fedora-38-s390x.cfg/etc/mock/fedora-38-x86_64.cfg/etc/mock/fedora-39-aarch64.cfg/etc/mock/fedora-39-i386.cfg/etc/mock/fedora-39-ppc64le.cfg/etc/mock/fedora-39-s390x.cfg/etc/mock/fedora-39-x86_64.cfg/etc/mock/fedora-eln-aarch64.cfg/etc/mock/fedora-eln-i386.cfg/etc/mock/fedora-eln-ppc64le.cfg/etc/mock/fedora-eln-s390x.cfg/etc/mock/fedora-eln-x86_64.cfg/etc/mock/fedora-rawhide-aarch64.cfg/etc/mock/fedora-rawhide-i386.cfg/etc/mock/fedora-rawhide-ppc64le.cfg/etc/mock/fedora-rawhide-s390x.cfg/etc/mock/fedora-rawhide-x86_64.cfg/etc/mock/mageia-7-aarch64.cfg/etc/mock/mageia-7-armv7hl.cfg/etc/mock/mageia-7-i586.cfg/etc/mock/mageia-7-x86_64.cfg/etc/mock/mageia-8-aarch64.cfg/etc/mock/mageia-8-armv7hl.cfg/etc/mock/mageia-8-i586.cfg/etc/mock/mageia-8-x86_64.cfg/etc/mock/mageia-9-aarch64.cfg/etc/mock/mageia-9-armv7hl.cfg/etc/mock/mageia-9-i586.cfg/etc/mock/mageia-9-x86_64.cfg/etc/mock/mageia-cauldron-aarch64.cfg/etc/mock/mageia-cauldron-armv7hl.cfg/etc/mock/mageia-cauldron-i586.cfg/etc/mock/mageia-cauldron-x86_64.cfg/etc/mock/navy-8-x86_64.cfg/etc/mock/openeuler-20.03-aarch64.cfg/etc/mock/openeuler-20.03-x86_64.cfg/etc/mock/openeuler-20.03_LTS-aarch64.cfg/etc/mock/openeuler-20.03_LTS-x86_64.cfg/etc/mock/openeuler-20.03_LTS_SP1-aarch64.cfg/etc/mock/openeuler-20.03_LTS_SP1-x86_64.cfg/etc/mock/openeuler-20.03_LTS_SP2-aarch64.cfg/etc/mock/openeuler-20.03_LTS_SP2-x86_64.cfg/etc/mock/openeuler-20.03_LTS_SP3-aarch64.cfg/etc/mock/openeuler-20.03_LTS_SP3-x86_64.cfg/etc/mock/openeuler-20.09-aarch64.cfg/etc/mock/openeuler-20.09-x86_64.cfg/etc/mock/openeuler-21.03-aarch64.cfg/etc/mock/openeuler-21.03-x86_64.cfg/etc/mock/openeuler-21.09-aarch64.cfg/etc/mock/openeuler-21.09-x86_64.cfg/etc/mock/openeuler-22.03-aarch64.cfg/etc/mock/openeuler-22.03-x86_64.cfg/etc/mock/openeuler-22.03_LTS-aarch64.cfg/etc/mock/openeuler-22.03_LTS-x86_64.cfg/etc/mock/openeuler-22.03_LTS_SP1-aarch64.cfg/etc/mock/openeuler-22.03_LTS_SP1-x86_64.cfg/etc/mock/openeuler-22.03_LTS_SP2-aarch64.cfg/etc/mock/openeuler-22.03_LTS_SP2-x86_64.cfg/etc/mock/openeuler-22.09-aarch64.cfg/etc/mock/openeuler-22.09-x86_64.cfg/etc/mock/openeuler-23.03-aarch64.cfg/etc/mock/openeuler-23.03-x86_64.cfg/etc/mock/openmandriva-4.1-aarch64.cfg/etc/mock/openmandriva-4.1-armv7hnl.cfg/etc/mock/openmandriva-4.1-i686.cfg/etc/mock/openmandriva-4.1-x86_64.cfg/etc/mock/openmandriva-cooker-aarch64.cfg/etc/mock/openmandriva-cooker-armv7hnl.cfg/etc/mock/openmandriva-cooker-i686.cfg/etc/mock/openmandriva-cooker-x86_64.cfg/etc/mock/openmandriva-rolling-aarch64.cfg/etc/mock/openmandriva-rolling-armv7hnl.cfg/etc/mock/openmandriva-rolling-i686.cfg/etc/mock/openmandriva-rolling-x86_64.cfg/etc/mock/opensuse-leap-15.3-aarch64.cfg/etc/mock/opensuse-leap-15.3-ppc64le.cfg/etc/mock/opensuse-leap-15.3-s390x.cfg/etc/mock/opensuse-leap-15.3-x86_64.cfg/etc/mock/opensuse-leap-15.4-aarch64.cfg/etc/mock/opensuse-leap-15.4-ppc64le.cfg/etc/mock/opensuse-leap-15.4-s390x.cfg/etc/mock/opensuse-leap-15.4-x86_64.cfg/etc/mock/opensuse-tumbleweed-aarch64.cfg/etc/mock/opensuse-tumbleweed-i586.cfg/etc/mock/opensuse-tumbleweed-ppc64.cfg/etc/mock/opensuse-tumbleweed-ppc64le.cfg/etc/mock/opensuse-tumbleweed-s390x.cfg/etc/mock/opensuse-tumbleweed-x86_64.cfg/etc/mock/oraclelinux+epel-7-aarch64.cfg/etc/mock/oraclelinux+epel-7-x86_64.cfg/etc/mock/oraclelinux+epel-8-aarch64.cfg/etc/mock/oraclelinux+epel-8-x86_64.cfg/etc/mock/oraclelinux+epel-9-aarch64.cfg/etc/mock/oraclelinux+epel-9-x86_64.cfg/etc/mock/oraclelinux-7-aarch64.cfg/etc/mock/oraclelinux-7-x86_64.cfg/etc/mock/oraclelinux-8-aarch64.cfg/etc/mock/oraclelinux-8-x86_64.cfg/etc/mock/oraclelinux-9-aarch64.cfg/etc/mock/oraclelinux-9-x86_64.cfg/etc/mock/rhel+epel-8-aarch64.cfg/etc/mock/rhel+epel-8-ppc64le.cfg/etc/mock/rhel+epel-8-s390x.cfg/etc/mock/rhel+epel-8-x86_64.cfg/etc/mock/rhel+epel-9-aarch64.cfg/etc/mock/rhel+epel-9-ppc64le.cfg/etc/mock/rhel+epel-9-s390x.cfg/etc/mock/rhel+epel-9-x86_64.cfg/etc/mock/rhel-7-aarch64.cfg/etc/mock/rhel-7-ppc64.cfg/etc/mock/rhel-7-ppc64le.cfg/etc/mock/rhel-7-s390x.cfg/etc/mock/rhel-7-x86_64.cfg/etc/mock/rhel-8-aarch64.cfg/etc/mock/rhel-8-ppc64le.cfg/etc/mock/rhel-8-s390x.cfg/etc/mock/rhel-8-x86_64.cfg/etc/mock/rhel-9-aarch64.cfg/etc/mock/rhel-9-ppc64le.cfg/etc/mock/rhel-9-s390x.cfg/etc/mock/rhel-9-x86_64.cfg/etc/mock/rocky+epel-8-aarch64.cfg/etc/mock/rocky+epel-8-x86_64.cfg/etc/mock/rocky+epel-9-aarch64.cfg/etc/mock/rocky+epel-9-ppc64le.cfg/etc/mock/rocky+epel-9-s390x.cfg/etc/mock/rocky+epel-9-x86_64.cfg/etc/mock/rocky-8-aarch64.cfg/etc/mock/rocky-8-x86_64.cfg/etc/mock/rocky-9-aarch64.cfg/etc/mock/rocky-9-ppc64le.cfg/etc/mock/rocky-9-s390x.cfg/etc/mock/rocky-9-x86_64.cfg/etc/mock/site-defaults.cfg/etc/mock/templates/etc/mock/templates/almalinux-8.tpl/etc/mock/templates/almalinux-9.tpl/etc/mock/templates/amazonlinux-2.tpl/etc/mock/templates/anolis-7.tpl/etc/mock/templates/anolis-8.tpl/etc/mock/templates/centos-7.tpl/etc/mock/templates/centos-stream-8.tpl/etc/mock/templates/centos-stream-9.tpl/etc/mock/templates/circlelinux-8.tpl/etc/mock/templates/custom-1.tpl/etc/mock/templates/epel-7.tpl/etc/mock/templates/epel-8.tpl/etc/mock/templates/epel-9.tpl/etc/mock/templates/epel-next-8.tpl/etc/mock/templates/epel-next-9.tpl/etc/mock/templates/eurolinux-8.tpl/etc/mock/templates/eurolinux-9.tpl/etc/mock/templates/fedora-branched.tpl/etc/mock/templates/fedora-eln.tpl/etc/mock/templates/fedora-rawhide.tpl/etc/mock/templates/mageia-7.tpl/etc/mock/templates/mageia-branched.tpl/etc/mock/templates/mageia-cauldron.tpl/etc/mock/templates/navy-8.tpl/etc/mock/templates/openeuler-20.03-sp1.tpl/etc/mock/templates/openeuler-20.03-sp2.tpl/etc/mock/templates/openeuler-20.03-sp3.tpl/etc/mock/templates/openeuler-20.03.tpl/etc/mock/templates/openeuler-20.09.tpl/etc/mock/templates/openeuler-21.03.tpl/etc/mock/templates/openeuler-21.09.tpl/etc/mock/templates/openeuler-22.03-sp1.tpl/etc/mock/templates/openeuler-22.03-sp2.tpl/etc/mock/templates/openeuler-22.03.tpl/etc/mock/templates/openeuler-22.09.tpl/etc/mock/templates/openeuler-23.03.tpl/etc/mock/templates/openmandriva-branched.tpl/etc/mock/templates/openmandriva-cooker.tpl/etc/mock/templates/openmandriva-rolling.tpl/etc/mock/templates/opensuse-leap-15.3.tpl/etc/mock/templates/opensuse-leap-15.4.tpl/etc/mock/templates/opensuse-tumbleweed.tpl/etc/mock/templates/oraclelinux-7.tpl/etc/mock/templates/oraclelinux-8.tpl/etc/mock/templates/oraclelinux-9.tpl/etc/mock/templates/oraclelinux-epel-7.tpl/etc/mock/templates/oraclelinux-epel-8.tpl/etc/mock/templates/oraclelinux-epel-9.tpl/etc/mock/templates/rhel-7.tpl/etc/mock/templates/rhel-8.tpl/etc/mock/templates/rhel-9.tpl/etc/mock/templates/rocky-8.tpl/etc/mock/templates/rocky-9.tplmock-core-configssrca861d98e6eab44361c0de3f61a06309af7271a9716c9fbd07b3569615c6e8248Mock core config files basic chrootsConfig files which allow you to create chroots for:
* Fedora
* Epel
* Mageia
* Custom chroot
* OpenSuse Tumbleweed and Leap
* openEulerhttps://github.com/rpm-software-management/mock/GPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-b273641b-2518-4c8d-97ea-30881b533ef6mock-filesystemnoarch6c056ee21e5dd05a6b140ba89c724dbf40fd9d12f1394837decca0c51c6b54c9Mock filesystem layoutFilesystem layout and group for Mock.https://github.com/rpm-software-management/mock/GPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-36990101-4763-400a-a605-019bd1d3c743mock-3.5-1.src.rpm/etc/mock/etc/mock/eol/etc/mock/eol/templates/etc/mock/templatesmock-lvmnoarch84bdaa156e84bb10da126a51818b9d1e6ed1953f1fc4c1b7c295f53dd7e10c16LVM plugin for mockMock plugin that enables using LVM as a backend and support creating snapshots
of the buildroot.https://github.com/rpm-software-management/mock/GPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-36990101-4763-400a-a605-019bd1d3c743mock-3.5-1.src.rpmmock-scmnoarch69fb6b56d2b932e4e8bf1aead5a0b794d2647dd0e19bf14c3d20b3073b3f5c65Mock SCM integration moduleMock SCM integration module.https://github.com/rpm-software-management/mock/GPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-36990101-4763-400a-a605-019bd1d3c743mock-3.5-1.src.rpmmodulemd-toolsnoarch9de5db4f67a145858edb7bd411450cee3309dcade0b7909cc6bd7edca2f654f4Collection of tools for parsing and generating modulemd YAML filesTools provided by this package:
repo2module - Takes a YUM repository on its input and creates modules.yaml
containing YAML module definitions generated for each package.
dir2module - Generates a module YAML definition based on essential module
information provided via command-line parameters. The packages provided by
the module are found in a specified directory or a text file containing
their list.
createrepo_mod - A small wrapper around createrepo_c and modifyrepo_c to provide
an easy tool for generating module repositories.
modulemd-add-platform - Add a new context configuration for a new platform
into a modulemd-packager file.
modulemd-merge - Merge several modules.yaml files into one. This is useful for
example if you have several yum repositories and want to merge them into one.
modulemd-generate-macros - Generate module-build-macros SRPM package, which is
a central piece for building modules. It should be present in the buildroot
before any other module packages are submitted to be built.
bld2repo - Simple tool for dowloading build required RPMs of a modular build from koji.https://github.com/rpm-software-management/modulemd-toolsMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-f2f438ee-ccdd-4cce-9b6f-e13b396e76d1modulemd-tools-0.13-1.src.rpm/usr/bin/bld2repo/usr/bin/createrepo_mod/usr/bin/dir2module/usr/bin/modulemd-add-platform/usr/bin/modulemd-generate-macros/usr/bin/modulemd-merge/usr/bin/repo2modulemodulemd-toolssrcabcfacc99e248790ee06a52e445158e923b5d46ced795eb346179472fa67577aCollection of tools for parsing and generating modulemd YAML filesTools provided by this package:
repo2module - Takes a YUM repository on its input and creates modules.yaml
containing YAML module definitions generated for each package.
dir2module - Generates a module YAML definition based on essential module
information provided via command-line parameters. The packages provided by
the module are found in a specified directory or a text file containing
their list.
createrepo_mod - A small wrapper around createrepo_c and modifyrepo_c to provide
an easy tool for generating module repositories.
modulemd-add-platform - Add a new context configuration for a new platform
into a modulemd-packager file.
modulemd-merge - Merge several modules.yaml files into one. This is useful for
example if you have several yum repositories and want to merge them into one.
modulemd-generate-macros - Generate module-build-macros SRPM package, which is
a central piece for building modules. It should be present in the buildroot
before any other module packages are submitted to be built.
bld2repo - Simple tool for dowloading build required RPMs of a modular build from koji.https://github.com/rpm-software-management/modulemd-toolsMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-f2f438ee-ccdd-4cce-9b6f-e13b396e76d1mysql-connector-pythonsrcd63f2cddf9ae3a870e696c535ae066b159dcb2aedc42cfe6f4dd2d5598feef18MySQL driver written in Python
MySQL driver written in Python which does not depend on MySQL C client
libraries and implements the DB API v2.0 specification (PEP-249).http://dev.mysql.com/doc/connector-python/en/index.htmlGNU GPLv2 (with FOSS License Exception)openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-8e36d370-c800-4421-96df-1d3be509660fmysql-connector-python-debuginfox86_64da1e1fe7f17ca1f5f32700e3d8587f04d1b234f396b23652ff1bf1afd8f3829eDebug information for package mysql-connector-pythonThis package provides debug information for package mysql-connector-python.
Debug information is useful when developing applications that use this
package or when debugging this package.http://dev.mysql.com/doc/connector-python/en/index.htmlGNU GPLv2 (with FOSS License Exception)openEuler Copr - user mywaaagh_adminDevelopment/Debugresalloc-8e36d370-c800-4421-96df-1d3be509660fmysql-connector-python-8.0.32-1.src.rpmmysql-connector-python-debugsourcex86_64c2bcdba1a0ee831f18bc4b7398d6b9ec2bd8d0dadac8b3262793666a7af53b11Debug sources for package mysql-connector-pythonThis package provides debug sources for package mysql-connector-python.
Debug sources are useful when developing applications that use this
package or when debugging this package.http://dev.mysql.com/doc/connector-python/en/index.htmlGNU GPLv2 (with FOSS License Exception)openEuler Copr - user mywaaagh_adminDevelopment/Debugresalloc-8e36d370-c800-4421-96df-1d3be509660fmysql-connector-python-8.0.32-1.src.rpmmysql-connector-python-helpx86_6429bf977419dbb5846777737f853a6875ed458ed2b400dfc93b0561d422433855Development documents and examples for mysql-connector-python
MySQL driver written in Python which does not depend on MySQL C client
libraries and implements the DB API v2.0 specification (PEP-249).http://dev.mysql.com/doc/connector-python/en/index.htmlGNU GPLv2 (with FOSS License Exception)openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-8e36d370-c800-4421-96df-1d3be509660fmysql-connector-python-8.0.32-1.src.rpmmysql-connector-python3x86_64ffb1dc5a8abc6f6e311461425e9229f1d316d70fa36d97209e22fee6a9a65afaMySQL driver written in Python
MySQL driver written in Python which does not depend on MySQL C client
libraries and implements the DB API v2.0 specification (PEP-249).http://dev.mysql.com/doc/connector-python/en/index.htmlGNU GPLv2 (with FOSS License Exception)openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-8e36d370-c800-4421-96df-1d3be509660fmysql-connector-python-8.0.32-1.src.rpmobs-signdsrca400258102e5f434dbe4116994c44a67680e91ba6fb066aa50896caf6fa113b0The OBS sign daemonThe OpenSUSE Build Service sign client and daemon.
This daemon can be used to sign anything via gpg by communicating
with a remote server to avoid the need to host the private key
on the same server.https://github.com/openSUSE/obs-signGPL-2.0-onlyopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-8252694f-aba7-4b28-81c1-c87ddd3c93dfobs-signdx86_64ab35640f3c5abd69b1a15fa69bbc560c18fb2af7b03854a1bd4e8a7a6c11a39eThe OBS sign daemonThe OpenSUSE Build Service sign client and daemon.
This daemon can be used to sign anything via gpg by communicating
with a remote server to avoid the need to host the private key
on the same server.https://github.com/openSUSE/obs-signGPL-2.0-onlyopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-8252694f-aba7-4b28-81c1-c87ddd3c93dfobs-signd-2.6.1-1.src.rpm/etc/sign.conf/usr/bin/sign/usr/sbin/signdobs-signd-debuginfox86_649e0736b5be03883ef70d89d4aee5c367698de520a8b1434e8f28265162c2fce8Debug information for package obs-signdThis package provides debug information for package obs-signd.
Debug information is useful when developing applications that use this
package or when debugging this package.https://github.com/openSUSE/obs-signGPL-2.0-onlyopenEuler Copr - user mywaaagh_adminDevelopment/Debugresalloc-8252694f-aba7-4b28-81c1-c87ddd3c93dfobs-signd-2.6.1-1.src.rpm/usr/lib/debug/usr/bin/sign-2.6.1-1.x86_64.debugobs-signd-debugsourcex86_64ead7ec30671b95108a731d28c6e6faee3cc293623c53eeae76ac050c26141e81Debug sources for package obs-signdThis package provides debug sources for package obs-signd.
Debug sources are useful when developing applications that use this
package or when debugging this package.https://github.com/openSUSE/obs-signGPL-2.0-onlyopenEuler Copr - user mywaaagh_adminDevelopment/Debugresalloc-8252694f-aba7-4b28-81c1-c87ddd3c93dfobs-signd-2.6.1-1.src.rpmpreprocnoarch879e8a842dbe883d58a32c58a71a7a92fbe63b7ab45717d3440419ce1c98e047Simple text preprocessorSimple text preprocessor implementing a very basic templating language.
You can use bash code enclosed in triple braces in a text file and
then pipe content of that file to preproc. preproc will replace each of
the tags with stdout of the executed code and print the final renderred
result to its own stdout.https://pagure.io/rpkg-util.gitGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-158cce37-a600-4f66-abde-b26a64340687preproc-0.5-1.src.rpm/usr/bin/preprocpreprocnoarch9245785bede273cd362478c0c3443574ca21ea4388f17c804c649513468db600Simple text preprocessorSimple text preprocessor implementing a very basic templating language.
You can use bash code enclosed in triple braces in a text file and
then pipe content of that file to preproc. preproc will replace each of
the tags with stdout of the executed code and print the final renderred
result to its own stdout.https://pagure.io/rpkg-util.gitGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-3a719ab7-b0b6-40e9-9aa2-8d7426c76f2apreproc-0.5-1.src.rpm/usr/bin/preprocpreprocsrcf7bc67d3797d1dcc50ac0c1832527f153c79a9f25af58e2284b4bfb09567ecc7Simple text preprocessorSimple text preprocessor implementing a very basic templating language.
You can use bash code enclosed in triple braces in a text file and
then pipe content of that file to preproc. preproc will replace each of
the tags with stdout of the executed code and print the final renderred
result to its own stdout.https://pagure.io/rpkg-util.gitGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-158cce37-a600-4f66-abde-b26a64340687preprocsrc823f5d5a1e3b5a16f8e1f29a80eee2e8ac63b99c0603a58e57682620c12264a1Simple text preprocessorSimple text preprocessor implementing a very basic templating language.
You can use bash code enclosed in triple braces in a text file and
then pipe content of that file to preproc. preproc will replace each of
the tags with stdout of the executed code and print the final renderred
result to its own stdout.https://pagure.io/rpkg-util.gitGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-3a719ab7-b0b6-40e9-9aa2-8d7426c76f2aprocenvsrc4e64d70f11724e4b2354860f9ef73e9bd16f7c3fee0f7ff7e91c7c12144bde0aUtility to show process environmentThis package contains a command-line tool that displays as much
detail about itself and its environment as possible. It can be
used as a test tool, to understand the type of environment a
process runs in, and for comparing system environments.https://github.com/jamesodhunt/procenvGPL-3.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-a6b551b4-e1fd-4c7b-bf07-d364974c6e74procenvsrcff5d074e39730c9f912d17b4c6cfb72abc71e71eaf71607611353a8b70cb9de2Utility to show process environmentThis package contains a command-line tool that displays as much
detail about itself and its environment as possible. It can be
used as a test tool, to understand the type of environment a
process runs in, and for comparing system environments.https://github.com/jamesodhunt/procenvGPL-3.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-1b3eeb02-8e16-412c-8504-72b35309878dprocenvsrc904ef003c2feb0b9ac03d2da71b8779b08198a7c5a9ea8e3aa165d203a05730fUtility to show process environmentThis package contains a command-line tool that displays as much
detail about itself and its environment as possible. It can be
used as a test tool, to understand the type of environment a
process runs in, and for comparing system environments.https://github.com/jamesodhunt/procenvGPL-3.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedeur-prod-workerlocal-x86-64-normal-prod-00210491-20240301-02525procenvx86_64596c0d0f7326c8ab3fbdc18e53f16e36249602f6080299a1b9399f9bb0d8dce4Utility to show process environmentThis package contains a command-line tool that displays as much
detail about itself and its environment as possible. It can be
used as a test tool, to understand the type of environment a
process runs in, and for comparing system environments.https://github.com/jamesodhunt/procenvGPL-3.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-a6b551b4-e1fd-4c7b-bf07-d364974c6e74procenv-0.60-1.src.rpm/usr/bin/procenvprocenvx86_6447ae23a3ae496d4d3c0b2ee5046cc3f8ebc9702a30024446d71e232e056733baUtility to show process environmentThis package contains a command-line tool that displays as much
detail about itself and its environment as possible. It can be
used as a test tool, to understand the type of environment a
process runs in, and for comparing system environments.https://github.com/jamesodhunt/procenvGPL-3.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-1b3eeb02-8e16-412c-8504-72b35309878dprocenv-0.60-1.src.rpm/usr/bin/procenvprocenvx86_6409988d5acee6a2e8156c0ca6546626507caab290922ad22c4dabbed4dd41e5dfUtility to show process environmentThis package contains a command-line tool that displays as much
detail about itself and its environment as possible. It can be
used as a test tool, to understand the type of environment a
process runs in, and for comparing system environments.https://github.com/jamesodhunt/procenvGPL-3.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedeur-prod-workerlocal-x86-64-normal-prod-00210491-20240301-02525procenv-0.60-1.src.rpm/usr/bin/procenvprocenv-debuginfox86_641f8572e6991ccdedfe02511d942cd33c1cedb87284361627acb3e973e163afdbDebug information for package procenvThis package provides debug information for package procenv.
Debug information is useful when developing applications that use this
package or when debugging this package.https://github.com/jamesodhunt/procenvGPL-3.0-or-lateropenEuler Copr - user mywaaagh_adminDevelopment/Debugresalloc-a6b551b4-e1fd-4c7b-bf07-d364974c6e74procenv-0.60-1.src.rpm/usr/lib/debug/usr/bin/procenv-0.60-1.x86_64.debugprocenv-debuginfox86_6438702c4c85e2c999fed3e22c844a1aec0a226db0894ad8c1f8d023469f461f55Debug information for package procenvThis package provides debug information for package procenv.
Debug information is useful when developing applications that use this
package or when debugging this package.https://github.com/jamesodhunt/procenvGPL-3.0-or-lateropenEuler Copr - user mywaaagh_adminDevelopment/Debugresalloc-1b3eeb02-8e16-412c-8504-72b35309878dprocenv-0.60-1.src.rpm/usr/lib/debug/usr/bin/procenv-0.60-1.x86_64.debugprocenv-debuginfox86_64f4262148de957f6b3d00db8eb183e67f87bd9dc1a0921de667e4ea3c256b6f27Debug information for package procenvThis package provides debug information for package procenv.
Debug information is useful when developing applications that use this
package or when debugging this package.https://github.com/jamesodhunt/procenvGPL-3.0-or-lateropenEuler Copr - user mywaaagh_adminDevelopment/Debugeur-prod-workerlocal-x86-64-normal-prod-00210491-20240301-02525procenv-0.60-1.src.rpm/usr/lib/debug/usr/bin/procenv-0.60-1.x86_64.debugprocenv-debugsourcex86_6416b8e4174d757829552a2ff9b30acce3373e2020e77f7bc2fbd20136067665d3Debug sources for package procenvThis package provides debug sources for package procenv.
Debug sources are useful when developing applications that use this
package or when debugging this package.https://github.com/jamesodhunt/procenvGPL-3.0-or-lateropenEuler Copr - user mywaaagh_adminDevelopment/Debugresalloc-a6b551b4-e1fd-4c7b-bf07-d364974c6e74procenv-0.60-1.src.rpmprocenv-debugsourcex86_6430c868603f0076131cc33d82236e1167098ca434fe5ea509426f2fc2ad62d0caDebug sources for package procenvThis package provides debug sources for package procenv.
Debug sources are useful when developing applications that use this
package or when debugging this package.https://github.com/jamesodhunt/procenvGPL-3.0-or-lateropenEuler Copr - user mywaaagh_adminDevelopment/Debugresalloc-1b3eeb02-8e16-412c-8504-72b35309878dprocenv-0.60-1.src.rpmprocenv-debugsourcex86_64f326e8beb2b02ac4fc21eb72986ff80b18d9c6a9ad9d678b82576e8d81789d46Debug sources for package procenvThis package provides debug sources for package procenv.
Debug sources are useful when developing applications that use this
package or when debugging this package.https://github.com/jamesodhunt/procenvGPL-3.0-or-lateropenEuler Copr - user mywaaagh_adminDevelopment/Debugeur-prod-workerlocal-x86-64-normal-prod-00210491-20240301-02525procenv-0.60-1.src.rpmprunereponoarch76d30349043391c73bd3a2ef35ec92eaef3463a54efd89203ee5db7818db43c9Remove old packages from rpm-md repositoryRPM packages that have newer version available in that same
repository are deleted from filesystem and the rpm-md metadata are
recreated afterwards. If there is a source rpm for a deleted rpm
(and they both share the same directory path), then the source rpm
will be deleted as well.
Support for specific repository structure (e.g. COPR) is also available
making it possible to additionally remove build logs and whole build
directories associated with a package.
After deletion of obsoleted packages, the command
"createrepo_c --database --update" is called
to recreate the repository metadata.https://pagure.io/prunerepoGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-bed41a8b-2b29-4ae1-9a80-ee503a22be41prunerepo-1.21-1.src.rpm/usr/bin/prunerepoprunereposrcbb4654e83638650e0be1341c243850abdd5d0d375cf5726b4d824f0149068db9Remove old packages from rpm-md repositoryRPM packages that have newer version available in that same
repository are deleted from filesystem and the rpm-md metadata are
recreated afterwards. If there is a source rpm for a deleted rpm
(and they both share the same directory path), then the source rpm
will be deleted as well.
Support for specific repository structure (e.g. COPR) is also available
making it possible to additionally remove build logs and whole build
directories associated with a package.
After deletion of obsoleted packages, the command
"createrepo_c --database --update" is called
to recreate the repository metadata.https://pagure.io/prunerepoGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-bed41a8b-2b29-4ae1-9a80-ee503a22be41pyproject-rpm-macrosnoarch27e3c0ba79369af574de205f466b5913953c0af665b2a29890dbeb30942fc607RPM macros for PEP 517 Python packagesThese macros allow projects that follow the Python packaging specifications
to be packaged as RPMs.
They work for:
* traditional Setuptools-based projects that use the setup.py file,
* newer Setuptools-based projects that have a setup.cfg file,
* general Python projects that use the PEP 517 pyproject.toml file
(which allows using any build system, such as setuptools, flit or poetry).
These macros replace %py3_build and %py3_install,
which only work with setup.py.https://src.fedoraproject.org/rpms/pyproject-rpm-macrosMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-e1ac07e6-74bd-4569-a098-87ba91162e6fpyproject-rpm-macros-1.4.0-1.src.rpmpyproject-rpm-macrossrc53b057dbfd14c967a746c8b877f1035e45bfe9c87f3cc575c848132a165292c6RPM macros for PEP 517 Python packagesThese macros allow projects that follow the Python packaging specifications
to be packaged as RPMs.
They work for:
* traditional Setuptools-based projects that use the setup.py file,
* newer Setuptools-based projects that have a setup.cfg file,
* general Python projects that use the PEP 517 pyproject.toml file
(which allows using any build system, such as setuptools, flit or poetry).
These macros replace %py3_build and %py3_install,
which only work with setup.py.https://src.fedoraproject.org/rpms/pyproject-rpm-macrosMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-e1ac07e6-74bd-4569-a098-87ba91162e6fpython-Authlibsrca2fb3d9da6d67f98e0fa0e7ded285f6f5e096a58aded46d3feaec37def0d9d26The ultimate Python library in building OAuth and OpenID Connect servers and clients.The ultimate Python library in building OAuth and OpenID Connect servers.
JWS, JWK, JWA, JWT are included.https://authlib.org/BSD 3-Clause LicenseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-c5a41d83-54dd-4344-aadc-e269cb329b77python-Authlib-helpnoarch904b5694ebbc818848fd0a6b5c2c7b9ed2583f68166780c7df14a883128dadbcDevelopment documents and examples for AuthlibThe ultimate Python library in building OAuth and OpenID Connect servers.
JWS, JWK, JWA, JWT are included.https://authlib.org/BSD 3-Clause LicenseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-c5a41d83-54dd-4344-aadc-e269cb329b77python-Authlib-1.2.0-1.src.rpmpython-CCColUtilssrcbf6b35fdeec8496bb18033f9b88577e91174cec7f0d546eb2fd4dacd6235b187Kerberos5 Credential Cache Collection UtilitiesKerberos5 Credential Cache Collection Utilities.https://pagure.io/cccolutilsGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-5b8e6dc8-f864-4cee-ac08-86006acc0181python-CCColUtilssrc1170874516ee8249534d59788f20b33c6cc0c705aab4c471bf0b9a2bb057d3d3Kerberos5 Credential Cache Collection UtilitiesKerberos5 Credential Cache Collection Utilities.https://pagure.io/cccolutilsGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-2ab5f99f-db9a-40a8-815d-fcef753b8678python-CCColUtils-debuginfox86_6462fe96c6d94c84912eba9f25103292664e3e6ac66af0da668e14c5a5b2047f8cDebug information for package python-CCColUtilsThis package provides debug information for package python-CCColUtils.
Debug information is useful when developing applications that use this
package or when debugging this package.https://pagure.io/cccolutilsGPLv2+openEuler Copr - user mywaaagh_adminDevelopment/Debugresalloc-5b8e6dc8-f864-4cee-ac08-86006acc0181python-CCColUtils-1.5-2.src.rpmpython-CCColUtils-debuginfox86_644bf814a37dc2c0f110041813187b6cf8d905e3f46642b7667e99397409838f2fDebug information for package python-CCColUtilsThis package provides debug information for package python-CCColUtils.
Debug information is useful when developing applications that use this
package or when debugging this package.https://pagure.io/cccolutilsGPLv2+openEuler Copr - user mywaaagh_adminDevelopment/Debugresalloc-2ab5f99f-db9a-40a8-815d-fcef753b8678python-CCColUtils-1.5-2.src.rpmpython-CCColUtils-debugsourcex86_64bea0011caf91af1e0bb59bc840e5e82e2be805044ca832ec808963508c0190edDebug sources for package python-CCColUtilsThis package provides debug sources for package python-CCColUtils.
Debug sources are useful when developing applications that use this
package or when debugging this package.https://pagure.io/cccolutilsGPLv2+openEuler Copr - user mywaaagh_adminDevelopment/Debugresalloc-5b8e6dc8-f864-4cee-ac08-86006acc0181python-CCColUtils-1.5-2.src.rpmpython-CCColUtils-debugsourcex86_64f84f6ef0a9989c147350f364b1022619bf14e2f3df8b5f28d2e78eae23cf9eb3Debug sources for package python-CCColUtilsThis package provides debug sources for package python-CCColUtils.
Debug sources are useful when developing applications that use this
package or when debugging this package.https://pagure.io/cccolutilsGPLv2+openEuler Copr - user mywaaagh_adminDevelopment/Debugresalloc-2ab5f99f-db9a-40a8-815d-fcef753b8678python-CCColUtils-1.5-2.src.rpmpython-Flask-Cachingsrc48d6ee2088e1b8dd5b81122406a9be95025cbbb3bd98b0040e042bb7a7f98dd2Adds caching support to Flask applications.A fork of the `Flask-cache`_ extension which adds easy cache support to Flask.https://github.com/pallets-eco/flask-cachingBSDopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-cc6881b1-b283-4aa7-8a55-facad512af8fpython-Flask-Caching-helpnoarch64e8814cf2efc2e91927144c1c6f38a0989f311dfd28ad5f80cb3e6a9d4f2765Development documents and examples for Flask-CachingA fork of the `Flask-cache`_ extension which adds easy cache support to Flask.https://github.com/pallets-eco/flask-cachingBSDopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-cc6881b1-b283-4aa7-8a55-facad512af8fpython-Flask-Caching-2.0.2-1.src.rpmpython-Flask-OpenIDsrc22bd717abd5bb79970eabb42015b00017384d8e4f8f4b6c973029abca2916dd7OpenID support for FlaskFlask-OpenID adds openid support to flask applicationshttp://github.com/mitsuhiko/flask-openid/BSDopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-1b7b3fab-7f39-40b7-a509-ab87de0c1fe6python-Flask-OpenID-helpnoarch04b4f5d7877b049c3c03371552945d00c5a9a826ee9c94c88c908fa9b060f8d7Development documents and examples for Flask-OpenIDFlask-OpenID adds openid support to flask applicationshttp://github.com/mitsuhiko/flask-openid/BSDopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-1b7b3fab-7f39-40b7-a509-ab87de0c1fe6python-Flask-OpenID-1.3.0-2.src.rpmpython-Flask-WTFsrc5db0389a695a226f594ccc914b6c48e621baf6f0b27709b4deb5af4d4e3d212cForm rendering, validation, and CSRF protection for Flask with WTForms.Simple integration of Flask and WTForms, including CSRF, file upload,
and reCAPTCHA.https://github.com/wtforms/flask-wtf/BSD-3-ClauseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-d888d7d0-8024-4288-9cae-6374bc69eb39python-Flask-WTF-helpnoarchaed2a59ecc1670097169af5cf71529a965727ebd5fd1e445817fd095101fd605Development documents and examples for Flask-WTFSimple integration of Flask and WTForms, including CSRF, file upload,
and reCAPTCHA.https://github.com/wtforms/flask-wtf/BSD-3-ClauseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-d888d7d0-8024-4288-9cae-6374bc69eb39python-Flask-WTF-1.1.1-1.src.rpmpython-WTFormssrc05a9a6964d6b0e4a1012f9feccebcd8f707b7b064d25bae2ca7bf5b3c113742eForm validation and rendering for Python web development.WTForms is a flexible forms validation and rendering library for Python
web development. It can work with whatever web framework and template
engine you choose. It supports data validation, CSRF protection,
internationalization (I18N), and more. There are various community
libraries that provide closer integration with popular frameworks.https://wtforms.readthedocs.io/BSD-3-ClauseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-8b3164b1-305b-4942-989f-9d3ed1feb2afpython-WTFormssrc7173a70de2f2fa1ef6993f17ee3f56190d69ed8c080751ca34697a5769f46bdcForm validation and rendering for Python web development.WTForms is a flexible forms validation and rendering library for Python
web development. It can work with whatever web framework and template
engine you choose. It supports data validation, CSRF protection,
internationalization (I18N), and more. There are various community
libraries that provide closer integration with popular frameworks.https://wtforms.readthedocs.io/BSD-3-ClauseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-2474d198-984e-4cb6-8bd6-6297fe53add0python-XStatic-Bootstrap-SCSSsrc9f7c34aebfd9b30e1b17e3939ba68ed574a11d0985dcf9e533a6f2196482c463Bootstrap-SCSS 3.4.1 (XStatic packaging standard)Bootstrap style library packaged for setuptools (easy_install) / pip.
This package is intended to be used by **any** project that needs these files.
It intentionally does **not** provide any extra code except some metadata
**nor** has any extra requirements. You MAY use some minimal support code from
the XStatic base package, if you like.
You can find more info about the xstatic packaging way in the package `XStatic`.https://github.com/twbs/bootstrap-sassMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-bb57607f-37c1-40f8-9644-3f9bf6760dd2python-XStatic-Bootstrap-SCSS-helpnoarch73baf2f1baf19387e78fc126359cd8818ea127528e5593c4f9e6980d33d26875Development documents and examples for XStatic-Bootstrap-SCSSBootstrap style library packaged for setuptools (easy_install) / pip.
This package is intended to be used by **any** project that needs these files.
It intentionally does **not** provide any extra code except some metadata
**nor** has any extra requirements. You MAY use some minimal support code from
the XStatic base package, if you like.
You can find more info about the xstatic packaging way in the package `XStatic`.https://github.com/twbs/bootstrap-sassMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-bb57607f-37c1-40f8-9644-3f9bf6760dd2python-XStatic-Bootstrap-SCSS-3.4.1.0-1.src.rpmpython-XStatic-DataTablessrcea55b32208fb6d4171d89b59f00d1766d6c2ff107f446e27b19763e6fd4021b0DataTables 1.10.15 (XStatic packaging standard)The DataTables plugin for jQuery packaged for setuptools (easy_install) / pip.
This package is intended to be used by **any** project that needs these files.
It intentionally does **not** provide any extra code except some metadata
**nor** has any extra requirements. You MAY use some minimal support code from
the XStatic base package, if you like.
You can find more info about the xstatic packaging way in the package `XStatic`.http://www.datatables.net(same as DataTables)openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-2211ae11-4a47-4de0-985f-8572bd272b91python-XStatic-DataTables-helpnoarch505daabc2d8630f8b39adba594963b28624986d9109a003e907f3ab181e4810eDevelopment documents and examples for XStatic-DataTablesThe DataTables plugin for jQuery packaged for setuptools (easy_install) / pip.
This package is intended to be used by **any** project that needs these files.
It intentionally does **not** provide any extra code except some metadata
**nor** has any extra requirements. You MAY use some minimal support code from
the XStatic base package, if you like.
You can find more info about the xstatic packaging way in the package `XStatic`.http://www.datatables.net(same as DataTables)openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-2211ae11-4a47-4de0-985f-8572bd272b91python-XStatic-DataTables-1.10.15.1-1.src.rpmpython-XStatic-Patternflysrc95aaf6b657e6d06911c6b3414ee23323df521a5e42e139ac32ee536d1c609d20Patternfly 3.21.0 (XStatic packaging standard)Patternfly style library packaged for setuptools (easy_install) / pip.
This package is intended to be used by **any** project that needs these files.
It intentionally does **not** provide any extra code except some metadata
**nor** has any extra requirements. You MAY use some minimal support code from
the XStatic base package, if you like.
You can find more info about the xstatic packaging way in the package `XStatic`.https://www.patternfly.org/Apache v2openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-0ffb227d-a611-49d0-aa31-de0cd5375e1fpython-XStatic-Patternfly-helpnoarch3eed94e0b0b467ec2e95012a4a04cdde45f6cea67211d22ddf58aa131a030472Development documents and examples for XStatic-PatternflyPatternfly style library packaged for setuptools (easy_install) / pip.
This package is intended to be used by **any** project that needs these files.
It intentionally does **not** provide any extra code except some metadata
**nor** has any extra requirements. You MAY use some minimal support code from
the XStatic base package, if you like.
You can find more info about the xstatic packaging way in the package `XStatic`.https://www.patternfly.org/Apache v2openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-0ffb227d-a611-49d0-aa31-de0cd5375e1fpython-XStatic-Patternfly-3.21.0.1-1.src.rpmpython-argparse-manpagesrcf0151361b64c0d856544edd413e264884a5dc5b8626a9ecd2a88dda4bfc710bfBuild manual page from python's ArgumentParser object.Automatically build manpage from argparsehttps://github.com/praiskup/argparse-manpageApache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-1a19585b-290d-4d93-920b-9c6a1f4fa8fapython-argparse-manpage-helpnoarchf7e09f5b3872529682dd2cdb84b3139d8278de7effc00db6ca359ebdbd5e06a6Development documents and examples for argparse-manpageAutomatically build manpage from argparsehttps://github.com/praiskup/argparse-manpageApache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-1a19585b-290d-4d93-920b-9c6a1f4fa8fapython-argparse-manpage-4.3-1.src.rpm/usr/share/doc/python-argparse-manpage/examples/argument_groups/bin/test/usr/share/doc/python-argparse-manpage/examples/raw-description/bin/dg/usr/share/doc/python-argparse-manpage/examples/resalloc/bin/resalloc/usr/share/doc/python-argparse-manpage/examples/resalloc/bin/resalloc-maintpython-asttokenssrc6642833973fe1f0e72783fddbce2588661e3847676ca09041b2ed5dceedd3223Module to annotate Python abstract syntax trees with source code positionsThe asttokens module annotates Python abstract syntax trees (ASTs)
with the positions of tokens and text in the source code that
generated them. This makes it possible for tools that work with
logical AST nodes to find the particular text that resulted in those
nodes, for example for automated refactoring or highlighting.https://github.com/gristlabs/asttokensApache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-190a7a62-f7fa-4620-978d-f70fb52fe6fcpython-backoffsrc45a53c31fd38d1b1f590dfe2c53d9bdc7bc995c6a27795d4b0347be24f964155Function decoration for backoff and retryThis module provides function decorators which can be used to wrap a\
function such that it will be retried until some condition is met. It\
is meant to be of use when accessing unreliable resources with the\
potential for intermittent failures i.e. network resources and external\
APIs. Somewhat more generally, it may also be of use for dynamically\
polling resources for externally generated content.https://github.com/litl/backoffMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-1089ddd3-e967-4d41-bb78-299c40669ec1python-backoff-helpnoarcha687459d9d0816136c3c3893377af52407faa90194e91d71b824c2c069c66f01Development documents and examples for backoffThis module provides function decorators which can be used to wrap a\
function such that it will be retried until some condition is met. It\
is meant to be of use when accessing unreliable resources with the\
potential for intermittent failures i.e. network resources and external\
APIs. Somewhat more generally, it may also be of use for dynamically\
polling resources for externally generated content.https://github.com/litl/backoffMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-1089ddd3-e967-4d41-bb78-299c40669ec1python-backoff-2.2.1-1.src.rpmpython-blessedsrc6fc08affad4a84b09ab4530b836288f255f4315e6d19260506ccfa23452cf8c1Easy, practical library for making terminal apps, by providing an elegant, well-documented interface to Colors, Keyboard input, and screen Positioning capabilities.Blessed is an easy, practical library for making python terminal appshttps://github.com/jquast/blessedMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-c34b2f0f-1c52-4ee3-941a-1dd5b742153epython-blessed-helpnoarch636790095268e081feb0e2d026e5c47069ed9a4521ab5b61f6ef179122d63424Development documents and examples for blessedBlessed is an easy, practical library for making python terminal appshttps://github.com/jquast/blessedMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-c34b2f0f-1c52-4ee3-941a-1dd5b742153epython-blessed-1.20.0-1.src.rpmpython-cachelibsrc53316c1179967f4810296d6ab7da5c1d6b10260c789783c72fb087e75dabba8cA collection of cache libraries in the same API interface.A collection of cache libraries in the same API interface. Extracted from werkzeug.https://github.com/pallets-eco/cachelibBSD-3-ClauseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-cba69d7f-b0df-442d-a912-c287598c80a6python-cachelib-helpnoarchdfe235ee500fcc285a946ffb1a4111e9ad19a874b728a29009cb638ba00f4567Development documents and examples for cachelibDevelopment documents and examples for cachelibhttps://github.com/pallets-eco/cachelibBSD-3-ClauseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-cba69d7f-b0df-442d-a912-c287598c80a6python-cachelib-0.9.0-1.src.rpmpython-coprsrc9b402d04f00ad16b6fdbc7d7a834701fd4d3f68ccbddd3f6d63f5c1d7862c545Python interface for CoprCOPR is lightweight build system. It allows you to create new project in WebUI,
and submit new builds and COPR will create yum repository from latest builds.
This package contains python interface to access Copr service. Mostly useful
for developers only.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-b9a2f1e3-3619-4fe6-8e14-028c385f8d31python-coprsrc433c4a2aa8f022284d782c6520d1cdd5d9bdc261e1abe3ac30f7dd48b854533dPython interface for CoprCOPR is lightweight build system. It allows you to create new project in WebUI,
and submit new builds and COPR will create yum repository from latest builds.
This package contains python interface to access Copr service. Mostly useful
for developers only.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-dcaab325-04a8-49f7-8dfa-e9905c01131fpython-coprsrc34d2aab7d9a18330efed8454e9313b8593b4801cc431345d60dc31390286853ePython interface for CoprCOPR is lightweight build system. It allows you to create new project in WebUI,
and submit new builds and COPR will create yum repository from latest builds.
This package contains python interface to access Copr service. Mostly useful
for developers only.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-c98356ca-9eb1-4b62-9358-718c961d5d43python-coprsrc4bd756fa769d0bdcc8b8bb6df108d04961f7f1f593be275eb94ed8284df0fd6cPython interface for CoprCOPR is lightweight build system. It allows you to create new project in WebUI,
and submit new builds and COPR will create yum repository from latest builds.
This package contains python interface to access Copr service. Mostly useful
for developers only.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-714aafb2-0ab8-4165-87c4-8ca87dbb7490python-coprsrc35e286e375408aae4f1478d47c989350d17a4c61c817d49c7f73e3c2d4f9b7a3Python interface for CoprCOPR is lightweight build system. It allows you to create new project in WebUI,
and submit new builds and COPR will create yum repository from latest builds.
This package contains python interface to access Copr service. Mostly useful
for developers only.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-4cdf4c03-aab1-4771-ad07-312a880c4196python-copr-commonsrc93b1dae6756c5bff8f660b962ac6657f75caf23c4fe0de41bdc7fe2c307a56d7Python code used by CoprCOPR is lightweight build system. It allows you to create new project in WebUI,
and submit new builds and COPR will create yum repository from latest builds.
This package contains python code used by other Copr packages. Mostly
useful for developers only.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-d9af21be-03f9-468a-bdc7-c951165162dapython-copr-commonsrc8f3eb65bb472d11c71cb49df9b463fb7fe79f2e6d758c307b6f42f5f50cddea9Python code used by CoprCOPR is lightweight build system. It allows you to create new project in WebUI,
and submit new builds and COPR will create yum repository from latest builds.
This package contains python code used by other Copr packages. Mostly
useful for developers only.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-1451da4a-8d87-4974-99ec-c09fed88cee8python-crudinisrcbf4b2cc0dddf014738bf516b67735e41baa9717873c4c4cf7e6627bef175af6dA utility for manipulating ini filescrudini A utility for manipulating ini fileshttp://github.com/pixelb/crudiniGPLv2openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-61b09c15-22be-47aa-8356-a904414e16f1python-crudini-helpnoarch4911fdde72160d899699395ee0378c282a6867cf3220b6f3cdff0ed9ac6f22a9A utility for manipulating ini filesUsage:
crudini --set [OPTION]... config_file section [param] [value]
or: crudini --get [OPTION]... config_file [section] [param]
or: crudini --del [OPTION]... config_file section [param] [list value]
or: crudini --merge [OPTION]... config_file [section]http://github.com/pixelb/crudiniGPLv2openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-61b09c15-22be-47aa-8356-a904414e16f1python-crudini-0.9.3-2.src.rpmpython-debtcollectorsrccf6ef3106a9bbad20e689b4df97dcbc05764104d21953757d705ffdba383aa2cA collection of Python deprecation patterns and strategies that help you collect your technical debt in a non-destructive manner.A collection of Python deprecation patterns and strategies that help you collect your technical debt in a non-destructive manner.https://docs.openstack.org/debtcollector/latestApache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-4d5d68d3-7dc5-4b0b-b618-fe636254f44epython-debtcollector-helpnoarch40873ede0cb390fa32df508b054958d5d4a8794d73cc0f666cb7267fabf7c7c0A collection of Python deprecation patterns and strategies that help you collect your technical debt in a non-destructive manner.A collection of Python deprecation patterns and strategies that help you collect your technical debt in a non-destructive manner.https://docs.openstack.org/debtcollector/latestApache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-4d5d68d3-7dc5-4b0b-b618-fe636254f44epython-debtcollector-2.5.0-1.src.rpmpython-email-validatorsrcfb5536f0be4b16e7dfe30fe9d78b690d5951c29cc2d9dba08f8f3b290b23b59bA robust email address syntax and deliverability validation library.A robust email address syntax and deliverability validation library for
Python by [Joshua Tauberer](https://joshdata.me).
This library validates that a string is of the form `name@example.com`. This is
the sort of validation you would want for an email-based login form on
a website.
Key features:
* Checks that an email address has the correct syntax --- good for
login forms or other uses related to identifying users.
* Gives friendly error messages when validation fails (appropriate to show
to end users).
* (optionally) Checks deliverability: Does the domain name resolve? And you can override the default DNS resolver.
* Supports internationalized domain names and (optionally)
internationalized local parts, but blocks unsafe characters.
* Normalizes email addresses (super important for internationalized
addresses! see below).
The library is NOT for validation of the To: line in an email message
(e.g. `My Name <my@address.com>`), which
[flanker](https://github.com/mailgun/flanker) is more appropriate for.
And this library does NOT permit obsolete forms of email addresses, so
if you need strict validation against the email specs exactly, use
[pyIsEmail](https://github.com/michaelherold/pyIsEmail).
This library is tested with Python 3.6+ but should work in earlier versions:
[![Build Status](https://app.travis-ci.com/JoshData/python-email-validator.svg?branch=main)](https://app.travis-ci.com/JoshData/python-email-validator)https://github.com/JoshData/python-email-validatorCC0 (copyright waived)openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-ade27af5-a995-4283-90c8-6e414d9ba245python-email-validator-helpnoarchc3366939e200e4669b180c19d0033706d3267a0c6679b059bd384e95accd8e2eDevelopment documents and examples for email-validatorA robust email address syntax and deliverability validation library for
Python by [Joshua Tauberer](https://joshdata.me).
This library validates that a string is of the form `name@example.com`. This is
the sort of validation you would want for an email-based login form on
a website.
Key features:
* Checks that an email address has the correct syntax --- good for
login forms or other uses related to identifying users.
* Gives friendly error messages when validation fails (appropriate to show
to end users).
* (optionally) Checks deliverability: Does the domain name resolve? And you can override the default DNS resolver.
* Supports internationalized domain names and (optionally)
internationalized local parts, but blocks unsafe characters.
* Normalizes email addresses (super important for internationalized
addresses! see below).
The library is NOT for validation of the To: line in an email message
(e.g. `My Name <my@address.com>`), which
[flanker](https://github.com/mailgun/flanker) is more appropriate for.
And this library does NOT permit obsolete forms of email addresses, so
if you need strict validation against the email specs exactly, use
[pyIsEmail](https://github.com/michaelherold/pyIsEmail).
This library is tested with Python 3.6+ but should work in earlier versions:
[![Build Status](https://app.travis-ci.com/JoshData/python-email-validator.svg?branch=main)](https://app.travis-ci.com/JoshData/python-email-validator)https://github.com/JoshData/python-email-validatorCC0 (copyright waived)openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-ade27af5-a995-4283-90c8-6e414d9ba245python-email-validator-1.3.1-1.src.rpmpython-executingsrcc25e44e3a243cc46fadc59487331608005f3bcfa5b936dd2140c7a3adbdb01d6Get the currently executing AST node of a frame, and other information
[![Build Status](https://github.com/alexmojaki/executing/workflows/Tests/badge.svg?branch=master)](https://github.com/alexmojaki/executing/actions) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/executing/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/executing?branch=master) [![Supports Python versions 2.7 and 3.5+, including PyPy](https://img.shields.io/pypi/pyversions/executing.svg)](https://pypi.python.org/pypi/executing)
This mini-package lets you get information about what a frame is currently doing, particularly the AST node being executed.
* [Usage](#usage)
* [Getting the AST node](#getting-the-ast-node)
* [Getting the source code of the node](#getting-the-source-code-of-the-node)
* [Getting the `__qualname__` of the current function](#getting-the-__qualname__-of-the-current-function)
* [The Source class](#the-source-class)
* [Installation](#installation)
* [How does it work?](#how-does-it-work)
* [Is it reliable?](#is-it-reliable)
* [Which nodes can it identify?](#which-nodes-can-it-identify)
* [Libraries that use this](#libraries-that-use-this)
```python
import executing
node = executing.Source.executing(frame).node
```
Then `node` will be an AST node (from the `ast` standard library module) or None if the node couldn't be identified (which may happen often and should always be checked).
`node` will always be the same instance for multiple calls with frames at the same point of execution.
If you have a traceback object, pass it directly to `Source.executing()` rather than the `tb_frame` attribute to get the correct node.
For this you will need to separately install the [`asttokens`](https://github.com/gristlabs/asttokens) library, then obtain an `ASTTokens` object:
```python
executing.Source.executing(frame).source.asttokens()
```
or:
```python
executing.Source.for_frame(frame).asttokens()
```
or use one of the convenience methods:
```python
executing.Source.executing(frame).text()
executing.Source.executing(frame).text_range()
```
```python
executing.Source.executing(frame).code_qualname()
```
or:
```python
executing.Source.for_frame(frame).code_qualname(frame.f_code)
```
Everything goes through the `Source` class. Only one instance of the class is created for each filename. Subclassing it to add more attributes on creation or methods is recommended. The classmethods such as `executing` will respect this. See the source code and docstrings for more detail.
pip install executing
If you don't like that you can just copy the file `executing.py`, there are no dependencies (but of course you won't get updates).
Suppose the frame is executing this line:
```python
self.foo(bar.x)
```
and in particular it's currently obtaining the attribute `self.foo`. Looking at the bytecode, specifically `frame.f_code.co_code[frame.f_lasti]`, we can tell that it's loading an attribute, but it's not obvious which one. We can narrow down the statement being executed using `frame.f_lineno` and find the two `ast.Attribute` nodes representing `self.foo` and `bar.x`. How do we find out which one it is, without recreating the entire compiler in Python?
The trick is to modify the AST slightly for each candidate expression and observe the changes in the bytecode instructions. We change the AST to this:
```python
(self.foo ** 'longuniqueconstant')(bar.x)
```
and compile it, and the bytecode will be almost the same but there will be two new instructions:
LOAD_CONST 'longuniqueconstant'
BINARY_POWER
and just before that will be a `LOAD_ATTR` instruction corresponding to `self.foo`. Seeing that it's in the same position as the original instruction lets us know we've found our match.
Yes - if it identifies a node, you can trust that it's identified the correct one. The tests are very thorough - in addition to unit tests which check various situations directly, there are property tests against a large number of files (see the filenames printed in [this build](https://travis-ci.org/alexmojaki/executing/jobs/557970457)) with real code. Specifically, for each file, the tests:
1. Identify as many nodes as possible from all the bytecode instructions in the file, and assert that they are all distinct
2. Find all the nodes that should be identifiable, and assert that they were indeed identified somewhere
In other words, it shows that there is a one-to-one mapping between the nodes and the instructions that can be handled. This leaves very little room for a bug to creep in.
Furthermore, `executing` checks that the instructions compiled from the modified AST exactly match the original code save for a few small known exceptions. This accounts for all the quirks and optimisations in the interpreter.
Currently it works in almost all cases for the following `ast` nodes:
- `Call`, e.g. `self.foo(bar)`
- `Attribute`, e.g. `point.x`
- `Subscript`, e.g. `lst[1]`
- `BinOp`, e.g. `x + y` (doesn't include `and` and `or`)
- `UnaryOp`, e.g. `-n` (includes `not` but only works sometimes)
- `Compare` e.g. `a < b` (not for chains such as `0 < p < 1`)
The plan is to extend to more operations in the future.
- **[`stack_data`](https://github.com/alexmojaki/stack_data)**: Extracts data from stack frames and tracebacks, particularly to display more useful tracebacks than the default. Also uses another related library of mine: **[`pure_eval`](https://github.com/alexmojaki/pure_eval)**.
- **[`futurecoder`](https://futurecoder.io/)**: Highlights the executing node in tracebacks using `executing` via `stack_data`, and provides debugging with `snoop`.
- **[`snoop`](https://github.com/alexmojaki/snoop)**: A feature-rich and convenient debugging library. Uses `executing` to show the operation which caused an exception and to allow the `pp` function to display the source of its arguments.
- **[`heartrate`](https://github.com/alexmojaki/heartrate)**: A simple real time visualisation of the execution of a Python program. Uses `executing` to highlight currently executing operations, particularly in each frame of the stack trace.
- **[`sorcery`](https://github.com/alexmojaki/sorcery)**: Dark magic delights in Python. Uses `executing` to let special callables called spells know where they're being called from.
- **[`IPython`](https://github.com/ipython/ipython/pull/12150)**: Highlights the executing node in tracebacks using `executing` via [`stack_data`](https://github.com/alexmojaki/stack_data).
- **[`icecream`](https://github.com/gruns/icecream)**: 🍦 Sweet and creamy print debugging. Uses `executing` to identify where `ic` is called and print its arguments.
- **[`friendly_traceback`](https://github.com/friendly-traceback/friendly-traceback)**: Uses `stack_data` and `executing` to pinpoint the cause of errors and provide helpful explanations.
- **[`python-devtools`](https://github.com/samuelcolvin/python-devtools)**: Uses `executing` for print debugging similar to `icecream`.
- **[`sentry_sdk`](https://github.com/getsentry/sentry-python)**: Add the integration `sentry_sdk.integrations.executingExecutingIntegration()` to show the function `__qualname__` in each frame in sentry events.
- **[`varname`](https://github.com/pwwang/python-varname)**: Dark magics about variable names in python. Uses `executing` to find where its various magical functions like `varname` and `nameof` are called from.https://github.com/alexmojaki/executingMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-7b327bb2-5ea6-4634-8121-b04075d1af97python-executingsrc6602dac4d73ce8e511cc094ea53e535d41c01438253d764814238831b2288ec7Get the currently executing AST node of a frame, and other information
[![Build Status](https://github.com/alexmojaki/executing/workflows/Tests/badge.svg?branch=master)](https://github.com/alexmojaki/executing/actions) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/executing/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/executing?branch=master) [![Supports Python versions 2.7 and 3.5+, including PyPy](https://img.shields.io/pypi/pyversions/executing.svg)](https://pypi.python.org/pypi/executing)
This mini-package lets you get information about what a frame is currently doing, particularly the AST node being executed.
* [Usage](#usage)
* [Getting the AST node](#getting-the-ast-node)
* [Getting the source code of the node](#getting-the-source-code-of-the-node)
* [Getting the `__qualname__` of the current function](#getting-the-__qualname__-of-the-current-function)
* [The Source class](#the-source-class)
* [Installation](#installation)
* [How does it work?](#how-does-it-work)
* [Is it reliable?](#is-it-reliable)
* [Which nodes can it identify?](#which-nodes-can-it-identify)
* [Libraries that use this](#libraries-that-use-this)
```python
import executing
node = executing.Source.executing(frame).node
```
Then `node` will be an AST node (from the `ast` standard library module) or None if the node couldn't be identified (which may happen often and should always be checked).
`node` will always be the same instance for multiple calls with frames at the same point of execution.
If you have a traceback object, pass it directly to `Source.executing()` rather than the `tb_frame` attribute to get the correct node.
For this you will need to separately install the [`asttokens`](https://github.com/gristlabs/asttokens) library, then obtain an `ASTTokens` object:
```python
executing.Source.executing(frame).source.asttokens()
```
or:
```python
executing.Source.for_frame(frame).asttokens()
```
or use one of the convenience methods:
```python
executing.Source.executing(frame).text()
executing.Source.executing(frame).text_range()
```
```python
executing.Source.executing(frame).code_qualname()
```
or:
```python
executing.Source.for_frame(frame).code_qualname(frame.f_code)
```
Everything goes through the `Source` class. Only one instance of the class is created for each filename. Subclassing it to add more attributes on creation or methods is recommended. The classmethods such as `executing` will respect this. See the source code and docstrings for more detail.
pip install executing
If you don't like that you can just copy the file `executing.py`, there are no dependencies (but of course you won't get updates).
Suppose the frame is executing this line:
```python
self.foo(bar.x)
```
and in particular it's currently obtaining the attribute `self.foo`. Looking at the bytecode, specifically `frame.f_code.co_code[frame.f_lasti]`, we can tell that it's loading an attribute, but it's not obvious which one. We can narrow down the statement being executed using `frame.f_lineno` and find the two `ast.Attribute` nodes representing `self.foo` and `bar.x`. How do we find out which one it is, without recreating the entire compiler in Python?
The trick is to modify the AST slightly for each candidate expression and observe the changes in the bytecode instructions. We change the AST to this:
```python
(self.foo ** 'longuniqueconstant')(bar.x)
```
and compile it, and the bytecode will be almost the same but there will be two new instructions:
LOAD_CONST 'longuniqueconstant'
BINARY_POWER
and just before that will be a `LOAD_ATTR` instruction corresponding to `self.foo`. Seeing that it's in the same position as the original instruction lets us know we've found our match.
Yes - if it identifies a node, you can trust that it's identified the correct one. The tests are very thorough - in addition to unit tests which check various situations directly, there are property tests against a large number of files (see the filenames printed in [this build](https://travis-ci.org/alexmojaki/executing/jobs/557970457)) with real code. Specifically, for each file, the tests:
1. Identify as many nodes as possible from all the bytecode instructions in the file, and assert that they are all distinct
2. Find all the nodes that should be identifiable, and assert that they were indeed identified somewhere
In other words, it shows that there is a one-to-one mapping between the nodes and the instructions that can be handled. This leaves very little room for a bug to creep in.
Furthermore, `executing` checks that the instructions compiled from the modified AST exactly match the original code save for a few small known exceptions. This accounts for all the quirks and optimisations in the interpreter.
Currently it works in almost all cases for the following `ast` nodes:
- `Call`, e.g. `self.foo(bar)`
- `Attribute`, e.g. `point.x`
- `Subscript`, e.g. `lst[1]`
- `BinOp`, e.g. `x + y` (doesn't include `and` and `or`)
- `UnaryOp`, e.g. `-n` (includes `not` but only works sometimes)
- `Compare` e.g. `a < b` (not for chains such as `0 < p < 1`)
The plan is to extend to more operations in the future.
- **[`stack_data`](https://github.com/alexmojaki/stack_data)**: Extracts data from stack frames and tracebacks, particularly to display more useful tracebacks than the default. Also uses another related library of mine: **[`pure_eval`](https://github.com/alexmojaki/pure_eval)**.
- **[`futurecoder`](https://futurecoder.io/)**: Highlights the executing node in tracebacks using `executing` via `stack_data`, and provides debugging with `snoop`.
- **[`snoop`](https://github.com/alexmojaki/snoop)**: A feature-rich and convenient debugging library. Uses `executing` to show the operation which caused an exception and to allow the `pp` function to display the source of its arguments.
- **[`heartrate`](https://github.com/alexmojaki/heartrate)**: A simple real time visualisation of the execution of a Python program. Uses `executing` to highlight currently executing operations, particularly in each frame of the stack trace.
- **[`sorcery`](https://github.com/alexmojaki/sorcery)**: Dark magic delights in Python. Uses `executing` to let special callables called spells know where they're being called from.
- **[`IPython`](https://github.com/ipython/ipython/pull/12150)**: Highlights the executing node in tracebacks using `executing` via [`stack_data`](https://github.com/alexmojaki/stack_data).
- **[`icecream`](https://github.com/gruns/icecream)**: 🍦 Sweet and creamy print debugging. Uses `executing` to identify where `ic` is called and print its arguments.
- **[`friendly_traceback`](https://github.com/friendly-traceback/friendly-traceback)**: Uses `stack_data` and `executing` to pinpoint the cause of errors and provide helpful explanations.
- **[`python-devtools`](https://github.com/samuelcolvin/python-devtools)**: Uses `executing` for print debugging similar to `icecream`.
- **[`sentry_sdk`](https://github.com/getsentry/sentry-python)**: Add the integration `sentry_sdk.integrations.executingExecutingIntegration()` to show the function `__qualname__` in each frame in sentry events.
- **[`varname`](https://github.com/pwwang/python-varname)**: Dark magics about variable names in python. Uses `executing` to find where its various magical functions like `varname` and `nameof` are called from.https://github.com/alexmojaki/executingMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-60bc1c7a-4894-43fe-9b60-9f04d074a251python-executingsrc96b92c427eac7b21193b0fe150b9ce916e12424793d2ecad655f76717434e54eGet the currently executing AST node of a frame, and other information
[![Build Status](https://github.com/alexmojaki/executing/workflows/Tests/badge.svg?branch=master)](https://github.com/alexmojaki/executing/actions) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/executing/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/executing?branch=master) [![Supports Python versions 2.7 and 3.5+, including PyPy](https://img.shields.io/pypi/pyversions/executing.svg)](https://pypi.python.org/pypi/executing)
This mini-package lets you get information about what a frame is currently doing, particularly the AST node being executed.
* [Usage](#usage)
* [Getting the AST node](#getting-the-ast-node)
* [Getting the source code of the node](#getting-the-source-code-of-the-node)
* [Getting the `__qualname__` of the current function](#getting-the-__qualname__-of-the-current-function)
* [The Source class](#the-source-class)
* [Installation](#installation)
* [How does it work?](#how-does-it-work)
* [Is it reliable?](#is-it-reliable)
* [Which nodes can it identify?](#which-nodes-can-it-identify)
* [Libraries that use this](#libraries-that-use-this)
```python
import executing
node = executing.Source.executing(frame).node
```
Then `node` will be an AST node (from the `ast` standard library module) or None if the node couldn't be identified (which may happen often and should always be checked).
`node` will always be the same instance for multiple calls with frames at the same point of execution.
If you have a traceback object, pass it directly to `Source.executing()` rather than the `tb_frame` attribute to get the correct node.
For this you will need to separately install the [`asttokens`](https://github.com/gristlabs/asttokens) library, then obtain an `ASTTokens` object:
```python
executing.Source.executing(frame).source.asttokens()
```
or:
```python
executing.Source.for_frame(frame).asttokens()
```
or use one of the convenience methods:
```python
executing.Source.executing(frame).text()
executing.Source.executing(frame).text_range()
```
```python
executing.Source.executing(frame).code_qualname()
```
or:
```python
executing.Source.for_frame(frame).code_qualname(frame.f_code)
```
Everything goes through the `Source` class. Only one instance of the class is created for each filename. Subclassing it to add more attributes on creation or methods is recommended. The classmethods such as `executing` will respect this. See the source code and docstrings for more detail.
pip install executing
If you don't like that you can just copy the file `executing.py`, there are no dependencies (but of course you won't get updates).
Suppose the frame is executing this line:
```python
self.foo(bar.x)
```
and in particular it's currently obtaining the attribute `self.foo`. Looking at the bytecode, specifically `frame.f_code.co_code[frame.f_lasti]`, we can tell that it's loading an attribute, but it's not obvious which one. We can narrow down the statement being executed using `frame.f_lineno` and find the two `ast.Attribute` nodes representing `self.foo` and `bar.x`. How do we find out which one it is, without recreating the entire compiler in Python?
The trick is to modify the AST slightly for each candidate expression and observe the changes in the bytecode instructions. We change the AST to this:
```python
(self.foo ** 'longuniqueconstant')(bar.x)
```
and compile it, and the bytecode will be almost the same but there will be two new instructions:
LOAD_CONST 'longuniqueconstant'
BINARY_POWER
and just before that will be a `LOAD_ATTR` instruction corresponding to `self.foo`. Seeing that it's in the same position as the original instruction lets us know we've found our match.
Yes - if it identifies a node, you can trust that it's identified the correct one. The tests are very thorough - in addition to unit tests which check various situations directly, there are property tests against a large number of files (see the filenames printed in [this build](https://travis-ci.org/alexmojaki/executing/jobs/557970457)) with real code. Specifically, for each file, the tests:
1. Identify as many nodes as possible from all the bytecode instructions in the file, and assert that they are all distinct
2. Find all the nodes that should be identifiable, and assert that they were indeed identified somewhere
In other words, it shows that there is a one-to-one mapping between the nodes and the instructions that can be handled. This leaves very little room for a bug to creep in.
Furthermore, `executing` checks that the instructions compiled from the modified AST exactly match the original code save for a few small known exceptions. This accounts for all the quirks and optimisations in the interpreter.
Currently it works in almost all cases for the following `ast` nodes:
- `Call`, e.g. `self.foo(bar)`
- `Attribute`, e.g. `point.x`
- `Subscript`, e.g. `lst[1]`
- `BinOp`, e.g. `x + y` (doesn't include `and` and `or`)
- `UnaryOp`, e.g. `-n` (includes `not` but only works sometimes)
- `Compare` e.g. `a < b` (not for chains such as `0 < p < 1`)
The plan is to extend to more operations in the future.
- **[`stack_data`](https://github.com/alexmojaki/stack_data)**: Extracts data from stack frames and tracebacks, particularly to display more useful tracebacks than the default. Also uses another related library of mine: **[`pure_eval`](https://github.com/alexmojaki/pure_eval)**.
- **[`futurecoder`](https://futurecoder.io/)**: Highlights the executing node in tracebacks using `executing` via `stack_data`, and provides debugging with `snoop`.
- **[`snoop`](https://github.com/alexmojaki/snoop)**: A feature-rich and convenient debugging library. Uses `executing` to show the operation which caused an exception and to allow the `pp` function to display the source of its arguments.
- **[`heartrate`](https://github.com/alexmojaki/heartrate)**: A simple real time visualisation of the execution of a Python program. Uses `executing` to highlight currently executing operations, particularly in each frame of the stack trace.
- **[`sorcery`](https://github.com/alexmojaki/sorcery)**: Dark magic delights in Python. Uses `executing` to let special callables called spells know where they're being called from.
- **[`IPython`](https://github.com/ipython/ipython/pull/12150)**: Highlights the executing node in tracebacks using `executing` via [`stack_data`](https://github.com/alexmojaki/stack_data).
- **[`icecream`](https://github.com/gruns/icecream)**: 🍦 Sweet and creamy print debugging. Uses `executing` to identify where `ic` is called and print its arguments.
- **[`friendly_traceback`](https://github.com/friendly-traceback/friendly-traceback)**: Uses `stack_data` and `executing` to pinpoint the cause of errors and provide helpful explanations.
- **[`python-devtools`](https://github.com/samuelcolvin/python-devtools)**: Uses `executing` for print debugging similar to `icecream`.
- **[`sentry_sdk`](https://github.com/getsentry/sentry-python)**: Add the integration `sentry_sdk.integrations.executingExecutingIntegration()` to show the function `__qualname__` in each frame in sentry events.
- **[`varname`](https://github.com/pwwang/python-varname)**: Dark magics about variable names in python. Uses `executing` to find where its various magical functions like `varname` and `nameof` are called from.https://github.com/alexmojaki/executingMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-751d7e10-5b0f-49e3-9853-f74315600071python-executingsrc87fad3f42a75a03de3600b3734c9d61a5668149b31d3c5e8574fa811fb43e76fGet the currently executing AST node of a frame, and other information
[![Build Status](https://github.com/alexmojaki/executing/workflows/Tests/badge.svg?branch=master)](https://github.com/alexmojaki/executing/actions) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/executing/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/executing?branch=master) [![Supports Python versions 2.7 and 3.5+, including PyPy](https://img.shields.io/pypi/pyversions/executing.svg)](https://pypi.python.org/pypi/executing)
This mini-package lets you get information about what a frame is currently doing, particularly the AST node being executed.
* [Usage](#usage)
* [Getting the AST node](#getting-the-ast-node)
* [Getting the source code of the node](#getting-the-source-code-of-the-node)
* [Getting the `__qualname__` of the current function](#getting-the-__qualname__-of-the-current-function)
* [The Source class](#the-source-class)
* [Installation](#installation)
* [How does it work?](#how-does-it-work)
* [Is it reliable?](#is-it-reliable)
* [Which nodes can it identify?](#which-nodes-can-it-identify)
* [Libraries that use this](#libraries-that-use-this)
```python
import executing
node = executing.Source.executing(frame).node
```
Then `node` will be an AST node (from the `ast` standard library module) or None if the node couldn't be identified (which may happen often and should always be checked).
`node` will always be the same instance for multiple calls with frames at the same point of execution.
If you have a traceback object, pass it directly to `Source.executing()` rather than the `tb_frame` attribute to get the correct node.
For this you will need to separately install the [`asttokens`](https://github.com/gristlabs/asttokens) library, then obtain an `ASTTokens` object:
```python
executing.Source.executing(frame).source.asttokens()
```
or:
```python
executing.Source.for_frame(frame).asttokens()
```
or use one of the convenience methods:
```python
executing.Source.executing(frame).text()
executing.Source.executing(frame).text_range()
```
```python
executing.Source.executing(frame).code_qualname()
```
or:
```python
executing.Source.for_frame(frame).code_qualname(frame.f_code)
```
Everything goes through the `Source` class. Only one instance of the class is created for each filename. Subclassing it to add more attributes on creation or methods is recommended. The classmethods such as `executing` will respect this. See the source code and docstrings for more detail.
pip install executing
If you don't like that you can just copy the file `executing.py`, there are no dependencies (but of course you won't get updates).
Suppose the frame is executing this line:
```python
self.foo(bar.x)
```
and in particular it's currently obtaining the attribute `self.foo`. Looking at the bytecode, specifically `frame.f_code.co_code[frame.f_lasti]`, we can tell that it's loading an attribute, but it's not obvious which one. We can narrow down the statement being executed using `frame.f_lineno` and find the two `ast.Attribute` nodes representing `self.foo` and `bar.x`. How do we find out which one it is, without recreating the entire compiler in Python?
The trick is to modify the AST slightly for each candidate expression and observe the changes in the bytecode instructions. We change the AST to this:
```python
(self.foo ** 'longuniqueconstant')(bar.x)
```
and compile it, and the bytecode will be almost the same but there will be two new instructions:
LOAD_CONST 'longuniqueconstant'
BINARY_POWER
and just before that will be a `LOAD_ATTR` instruction corresponding to `self.foo`. Seeing that it's in the same position as the original instruction lets us know we've found our match.
Yes - if it identifies a node, you can trust that it's identified the correct one. The tests are very thorough - in addition to unit tests which check various situations directly, there are property tests against a large number of files (see the filenames printed in [this build](https://travis-ci.org/alexmojaki/executing/jobs/557970457)) with real code. Specifically, for each file, the tests:
1. Identify as many nodes as possible from all the bytecode instructions in the file, and assert that they are all distinct
2. Find all the nodes that should be identifiable, and assert that they were indeed identified somewhere
In other words, it shows that there is a one-to-one mapping between the nodes and the instructions that can be handled. This leaves very little room for a bug to creep in.
Furthermore, `executing` checks that the instructions compiled from the modified AST exactly match the original code save for a few small known exceptions. This accounts for all the quirks and optimisations in the interpreter.
Currently it works in almost all cases for the following `ast` nodes:
- `Call`, e.g. `self.foo(bar)`
- `Attribute`, e.g. `point.x`
- `Subscript`, e.g. `lst[1]`
- `BinOp`, e.g. `x + y` (doesn't include `and` and `or`)
- `UnaryOp`, e.g. `-n` (includes `not` but only works sometimes)
- `Compare` e.g. `a < b` (not for chains such as `0 < p < 1`)
The plan is to extend to more operations in the future.
- **[`stack_data`](https://github.com/alexmojaki/stack_data)**: Extracts data from stack frames and tracebacks, particularly to display more useful tracebacks than the default. Also uses another related library of mine: **[`pure_eval`](https://github.com/alexmojaki/pure_eval)**.
- **[`futurecoder`](https://futurecoder.io/)**: Highlights the executing node in tracebacks using `executing` via `stack_data`, and provides debugging with `snoop`.
- **[`snoop`](https://github.com/alexmojaki/snoop)**: A feature-rich and convenient debugging library. Uses `executing` to show the operation which caused an exception and to allow the `pp` function to display the source of its arguments.
- **[`heartrate`](https://github.com/alexmojaki/heartrate)**: A simple real time visualisation of the execution of a Python program. Uses `executing` to highlight currently executing operations, particularly in each frame of the stack trace.
- **[`sorcery`](https://github.com/alexmojaki/sorcery)**: Dark magic delights in Python. Uses `executing` to let special callables called spells know where they're being called from.
- **[`IPython`](https://github.com/ipython/ipython/pull/12150)**: Highlights the executing node in tracebacks using `executing` via [`stack_data`](https://github.com/alexmojaki/stack_data).
- **[`icecream`](https://github.com/gruns/icecream)**: 🍦 Sweet and creamy print debugging. Uses `executing` to identify where `ic` is called and print its arguments.
- **[`friendly_traceback`](https://github.com/friendly-traceback/friendly-traceback)**: Uses `stack_data` and `executing` to pinpoint the cause of errors and provide helpful explanations.
- **[`python-devtools`](https://github.com/samuelcolvin/python-devtools)**: Uses `executing` for print debugging similar to `icecream`.
- **[`sentry_sdk`](https://github.com/getsentry/sentry-python)**: Add the integration `sentry_sdk.integrations.executingExecutingIntegration()` to show the function `__qualname__` in each frame in sentry events.
- **[`varname`](https://github.com/pwwang/python-varname)**: Dark magics about variable names in python. Uses `executing` to find where its various magical functions like `varname` and `nameof` are called from.https://github.com/alexmojaki/executingMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-50347f2f-5850-4e84-8da0-542753079d32python-executingsrc8f8885e867eeeeff3b6afdbaf205221766df303c9e2629b22f21bebbb91a54d8Get the currently executing AST node of a frame, and other information
[![Build Status](https://github.com/alexmojaki/executing/workflows/Tests/badge.svg?branch=master)](https://github.com/alexmojaki/executing/actions) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/executing/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/executing?branch=master) [![Supports Python versions 2.7 and 3.5+, including PyPy](https://img.shields.io/pypi/pyversions/executing.svg)](https://pypi.python.org/pypi/executing)
This mini-package lets you get information about what a frame is currently doing, particularly the AST node being executed.
* [Usage](#usage)
* [Getting the AST node](#getting-the-ast-node)
* [Getting the source code of the node](#getting-the-source-code-of-the-node)
* [Getting the `__qualname__` of the current function](#getting-the-__qualname__-of-the-current-function)
* [The Source class](#the-source-class)
* [Installation](#installation)
* [How does it work?](#how-does-it-work)
* [Is it reliable?](#is-it-reliable)
* [Which nodes can it identify?](#which-nodes-can-it-identify)
* [Libraries that use this](#libraries-that-use-this)
```python
import executing
node = executing.Source.executing(frame).node
```
Then `node` will be an AST node (from the `ast` standard library module) or None if the node couldn't be identified (which may happen often and should always be checked).
`node` will always be the same instance for multiple calls with frames at the same point of execution.
If you have a traceback object, pass it directly to `Source.executing()` rather than the `tb_frame` attribute to get the correct node.
For this you will need to separately install the [`asttokens`](https://github.com/gristlabs/asttokens) library, then obtain an `ASTTokens` object:
```python
executing.Source.executing(frame).source.asttokens()
```
or:
```python
executing.Source.for_frame(frame).asttokens()
```
or use one of the convenience methods:
```python
executing.Source.executing(frame).text()
executing.Source.executing(frame).text_range()
```
```python
executing.Source.executing(frame).code_qualname()
```
or:
```python
executing.Source.for_frame(frame).code_qualname(frame.f_code)
```
Everything goes through the `Source` class. Only one instance of the class is created for each filename. Subclassing it to add more attributes on creation or methods is recommended. The classmethods such as `executing` will respect this. See the source code and docstrings for more detail.
pip install executing
If you don't like that you can just copy the file `executing.py`, there are no dependencies (but of course you won't get updates).
Suppose the frame is executing this line:
```python
self.foo(bar.x)
```
and in particular it's currently obtaining the attribute `self.foo`. Looking at the bytecode, specifically `frame.f_code.co_code[frame.f_lasti]`, we can tell that it's loading an attribute, but it's not obvious which one. We can narrow down the statement being executed using `frame.f_lineno` and find the two `ast.Attribute` nodes representing `self.foo` and `bar.x`. How do we find out which one it is, without recreating the entire compiler in Python?
The trick is to modify the AST slightly for each candidate expression and observe the changes in the bytecode instructions. We change the AST to this:
```python
(self.foo ** 'longuniqueconstant')(bar.x)
```
and compile it, and the bytecode will be almost the same but there will be two new instructions:
LOAD_CONST 'longuniqueconstant'
BINARY_POWER
and just before that will be a `LOAD_ATTR` instruction corresponding to `self.foo`. Seeing that it's in the same position as the original instruction lets us know we've found our match.
Yes - if it identifies a node, you can trust that it's identified the correct one. The tests are very thorough - in addition to unit tests which check various situations directly, there are property tests against a large number of files (see the filenames printed in [this build](https://travis-ci.org/alexmojaki/executing/jobs/557970457)) with real code. Specifically, for each file, the tests:
1. Identify as many nodes as possible from all the bytecode instructions in the file, and assert that they are all distinct
2. Find all the nodes that should be identifiable, and assert that they were indeed identified somewhere
In other words, it shows that there is a one-to-one mapping between the nodes and the instructions that can be handled. This leaves very little room for a bug to creep in.
Furthermore, `executing` checks that the instructions compiled from the modified AST exactly match the original code save for a few small known exceptions. This accounts for all the quirks and optimisations in the interpreter.
Currently it works in almost all cases for the following `ast` nodes:
- `Call`, e.g. `self.foo(bar)`
- `Attribute`, e.g. `point.x`
- `Subscript`, e.g. `lst[1]`
- `BinOp`, e.g. `x + y` (doesn't include `and` and `or`)
- `UnaryOp`, e.g. `-n` (includes `not` but only works sometimes)
- `Compare` e.g. `a < b` (not for chains such as `0 < p < 1`)
The plan is to extend to more operations in the future.
- **[`stack_data`](https://github.com/alexmojaki/stack_data)**: Extracts data from stack frames and tracebacks, particularly to display more useful tracebacks than the default. Also uses another related library of mine: **[`pure_eval`](https://github.com/alexmojaki/pure_eval)**.
- **[`futurecoder`](https://futurecoder.io/)**: Highlights the executing node in tracebacks using `executing` via `stack_data`, and provides debugging with `snoop`.
- **[`snoop`](https://github.com/alexmojaki/snoop)**: A feature-rich and convenient debugging library. Uses `executing` to show the operation which caused an exception and to allow the `pp` function to display the source of its arguments.
- **[`heartrate`](https://github.com/alexmojaki/heartrate)**: A simple real time visualisation of the execution of a Python program. Uses `executing` to highlight currently executing operations, particularly in each frame of the stack trace.
- **[`sorcery`](https://github.com/alexmojaki/sorcery)**: Dark magic delights in Python. Uses `executing` to let special callables called spells know where they're being called from.
- **[`IPython`](https://github.com/ipython/ipython/pull/12150)**: Highlights the executing node in tracebacks using `executing` via [`stack_data`](https://github.com/alexmojaki/stack_data).
- **[`icecream`](https://github.com/gruns/icecream)**: 🍦 Sweet and creamy print debugging. Uses `executing` to identify where `ic` is called and print its arguments.
- **[`friendly_traceback`](https://github.com/friendly-traceback/friendly-traceback)**: Uses `stack_data` and `executing` to pinpoint the cause of errors and provide helpful explanations.
- **[`python-devtools`](https://github.com/samuelcolvin/python-devtools)**: Uses `executing` for print debugging similar to `icecream`.
- **[`sentry_sdk`](https://github.com/getsentry/sentry-python)**: Add the integration `sentry_sdk.integrations.executingExecutingIntegration()` to show the function `__qualname__` in each frame in sentry events.
- **[`varname`](https://github.com/pwwang/python-varname)**: Dark magics about variable names in python. Uses `executing` to find where its various magical functions like `varname` and `nameof` are called from.https://github.com/alexmojaki/executingMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-ade4eb6d-0a73-4a96-a819-cabb0769a54epython-executingsrc9d9cbd6e910091ad3ac0ef9cff34ed2d52387826528e2c82e5164f224a61ca58Get the currently executing AST node of a frame, and other information
[![Build Status](https://github.com/alexmojaki/executing/workflows/Tests/badge.svg?branch=master)](https://github.com/alexmojaki/executing/actions) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/executing/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/executing?branch=master) [![Supports Python versions 2.7 and 3.5+, including PyPy](https://img.shields.io/pypi/pyversions/executing.svg)](https://pypi.python.org/pypi/executing)
This mini-package lets you get information about what a frame is currently doing, particularly the AST node being executed.
* [Usage](#usage)
* [Getting the AST node](#getting-the-ast-node)
* [Getting the source code of the node](#getting-the-source-code-of-the-node)
* [Getting the `__qualname__` of the current function](#getting-the-__qualname__-of-the-current-function)
* [The Source class](#the-source-class)
* [Installation](#installation)
* [How does it work?](#how-does-it-work)
* [Is it reliable?](#is-it-reliable)
* [Which nodes can it identify?](#which-nodes-can-it-identify)
* [Libraries that use this](#libraries-that-use-this)
```python
import executing
node = executing.Source.executing(frame).node
```
Then `node` will be an AST node (from the `ast` standard library module) or None if the node couldn't be identified (which may happen often and should always be checked).
`node` will always be the same instance for multiple calls with frames at the same point of execution.
If you have a traceback object, pass it directly to `Source.executing()` rather than the `tb_frame` attribute to get the correct node.
For this you will need to separately install the [`asttokens`](https://github.com/gristlabs/asttokens) library, then obtain an `ASTTokens` object:
```python
executing.Source.executing(frame).source.asttokens()
```
or:
```python
executing.Source.for_frame(frame).asttokens()
```
or use one of the convenience methods:
```python
executing.Source.executing(frame).text()
executing.Source.executing(frame).text_range()
```
```python
executing.Source.executing(frame).code_qualname()
```
or:
```python
executing.Source.for_frame(frame).code_qualname(frame.f_code)
```
Everything goes through the `Source` class. Only one instance of the class is created for each filename. Subclassing it to add more attributes on creation or methods is recommended. The classmethods such as `executing` will respect this. See the source code and docstrings for more detail.
pip install executing
If you don't like that you can just copy the file `executing.py`, there are no dependencies (but of course you won't get updates).
Suppose the frame is executing this line:
```python
self.foo(bar.x)
```
and in particular it's currently obtaining the attribute `self.foo`. Looking at the bytecode, specifically `frame.f_code.co_code[frame.f_lasti]`, we can tell that it's loading an attribute, but it's not obvious which one. We can narrow down the statement being executed using `frame.f_lineno` and find the two `ast.Attribute` nodes representing `self.foo` and `bar.x`. How do we find out which one it is, without recreating the entire compiler in Python?
The trick is to modify the AST slightly for each candidate expression and observe the changes in the bytecode instructions. We change the AST to this:
```python
(self.foo ** 'longuniqueconstant')(bar.x)
```
and compile it, and the bytecode will be almost the same but there will be two new instructions:
LOAD_CONST 'longuniqueconstant'
BINARY_POWER
and just before that will be a `LOAD_ATTR` instruction corresponding to `self.foo`. Seeing that it's in the same position as the original instruction lets us know we've found our match.
Yes - if it identifies a node, you can trust that it's identified the correct one. The tests are very thorough - in addition to unit tests which check various situations directly, there are property tests against a large number of files (see the filenames printed in [this build](https://travis-ci.org/alexmojaki/executing/jobs/557970457)) with real code. Specifically, for each file, the tests:
1. Identify as many nodes as possible from all the bytecode instructions in the file, and assert that they are all distinct
2. Find all the nodes that should be identifiable, and assert that they were indeed identified somewhere
In other words, it shows that there is a one-to-one mapping between the nodes and the instructions that can be handled. This leaves very little room for a bug to creep in.
Furthermore, `executing` checks that the instructions compiled from the modified AST exactly match the original code save for a few small known exceptions. This accounts for all the quirks and optimisations in the interpreter.
Currently it works in almost all cases for the following `ast` nodes:
- `Call`, e.g. `self.foo(bar)`
- `Attribute`, e.g. `point.x`
- `Subscript`, e.g. `lst[1]`
- `BinOp`, e.g. `x + y` (doesn't include `and` and `or`)
- `UnaryOp`, e.g. `-n` (includes `not` but only works sometimes)
- `Compare` e.g. `a < b` (not for chains such as `0 < p < 1`)
The plan is to extend to more operations in the future.
- **[`stack_data`](https://github.com/alexmojaki/stack_data)**: Extracts data from stack frames and tracebacks, particularly to display more useful tracebacks than the default. Also uses another related library of mine: **[`pure_eval`](https://github.com/alexmojaki/pure_eval)**.
- **[`futurecoder`](https://futurecoder.io/)**: Highlights the executing node in tracebacks using `executing` via `stack_data`, and provides debugging with `snoop`.
- **[`snoop`](https://github.com/alexmojaki/snoop)**: A feature-rich and convenient debugging library. Uses `executing` to show the operation which caused an exception and to allow the `pp` function to display the source of its arguments.
- **[`heartrate`](https://github.com/alexmojaki/heartrate)**: A simple real time visualisation of the execution of a Python program. Uses `executing` to highlight currently executing operations, particularly in each frame of the stack trace.
- **[`sorcery`](https://github.com/alexmojaki/sorcery)**: Dark magic delights in Python. Uses `executing` to let special callables called spells know where they're being called from.
- **[`IPython`](https://github.com/ipython/ipython/pull/12150)**: Highlights the executing node in tracebacks using `executing` via [`stack_data`](https://github.com/alexmojaki/stack_data).
- **[`icecream`](https://github.com/gruns/icecream)**: 🍦 Sweet and creamy print debugging. Uses `executing` to identify where `ic` is called and print its arguments.
- **[`friendly_traceback`](https://github.com/friendly-traceback/friendly-traceback)**: Uses `stack_data` and `executing` to pinpoint the cause of errors and provide helpful explanations.
- **[`python-devtools`](https://github.com/samuelcolvin/python-devtools)**: Uses `executing` for print debugging similar to `icecream`.
- **[`sentry_sdk`](https://github.com/getsentry/sentry-python)**: Add the integration `sentry_sdk.integrations.executingExecutingIntegration()` to show the function `__qualname__` in each frame in sentry events.
- **[`varname`](https://github.com/pwwang/python-varname)**: Dark magics about variable names in python. Uses `executing` to find where its various magical functions like `varname` and `nameof` are called from.https://github.com/alexmojaki/executingMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-5be11934-1be7-4b03-920f-a310a3fca71fpython-executing-helpnoarchf5ae545c5558a8a1d541b0eeafdf97346fdad52756683d85ecacb2128c5d1740Development documents and examples for executing
[![Build Status](https://github.com/alexmojaki/executing/workflows/Tests/badge.svg?branch=master)](https://github.com/alexmojaki/executing/actions) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/executing/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/executing?branch=master) [![Supports Python versions 2.7 and 3.5+, including PyPy](https://img.shields.io/pypi/pyversions/executing.svg)](https://pypi.python.org/pypi/executing)
This mini-package lets you get information about what a frame is currently doing, particularly the AST node being executed.
* [Usage](#usage)
* [Getting the AST node](#getting-the-ast-node)
* [Getting the source code of the node](#getting-the-source-code-of-the-node)
* [Getting the `__qualname__` of the current function](#getting-the-__qualname__-of-the-current-function)
* [The Source class](#the-source-class)
* [Installation](#installation)
* [How does it work?](#how-does-it-work)
* [Is it reliable?](#is-it-reliable)
* [Which nodes can it identify?](#which-nodes-can-it-identify)
* [Libraries that use this](#libraries-that-use-this)
```python
import executing
node = executing.Source.executing(frame).node
```
Then `node` will be an AST node (from the `ast` standard library module) or None if the node couldn't be identified (which may happen often and should always be checked).
`node` will always be the same instance for multiple calls with frames at the same point of execution.
If you have a traceback object, pass it directly to `Source.executing()` rather than the `tb_frame` attribute to get the correct node.
For this you will need to separately install the [`asttokens`](https://github.com/gristlabs/asttokens) library, then obtain an `ASTTokens` object:
```python
executing.Source.executing(frame).source.asttokens()
```
or:
```python
executing.Source.for_frame(frame).asttokens()
```
or use one of the convenience methods:
```python
executing.Source.executing(frame).text()
executing.Source.executing(frame).text_range()
```
```python
executing.Source.executing(frame).code_qualname()
```
or:
```python
executing.Source.for_frame(frame).code_qualname(frame.f_code)
```
Everything goes through the `Source` class. Only one instance of the class is created for each filename. Subclassing it to add more attributes on creation or methods is recommended. The classmethods such as `executing` will respect this. See the source code and docstrings for more detail.
pip install executing
If you don't like that you can just copy the file `executing.py`, there are no dependencies (but of course you won't get updates).
Suppose the frame is executing this line:
```python
self.foo(bar.x)
```
and in particular it's currently obtaining the attribute `self.foo`. Looking at the bytecode, specifically `frame.f_code.co_code[frame.f_lasti]`, we can tell that it's loading an attribute, but it's not obvious which one. We can narrow down the statement being executed using `frame.f_lineno` and find the two `ast.Attribute` nodes representing `self.foo` and `bar.x`. How do we find out which one it is, without recreating the entire compiler in Python?
The trick is to modify the AST slightly for each candidate expression and observe the changes in the bytecode instructions. We change the AST to this:
```python
(self.foo ** 'longuniqueconstant')(bar.x)
```
and compile it, and the bytecode will be almost the same but there will be two new instructions:
LOAD_CONST 'longuniqueconstant'
BINARY_POWER
and just before that will be a `LOAD_ATTR` instruction corresponding to `self.foo`. Seeing that it's in the same position as the original instruction lets us know we've found our match.
Yes - if it identifies a node, you can trust that it's identified the correct one. The tests are very thorough - in addition to unit tests which check various situations directly, there are property tests against a large number of files (see the filenames printed in [this build](https://travis-ci.org/alexmojaki/executing/jobs/557970457)) with real code. Specifically, for each file, the tests:
1. Identify as many nodes as possible from all the bytecode instructions in the file, and assert that they are all distinct
2. Find all the nodes that should be identifiable, and assert that they were indeed identified somewhere
In other words, it shows that there is a one-to-one mapping between the nodes and the instructions that can be handled. This leaves very little room for a bug to creep in.
Furthermore, `executing` checks that the instructions compiled from the modified AST exactly match the original code save for a few small known exceptions. This accounts for all the quirks and optimisations in the interpreter.
Currently it works in almost all cases for the following `ast` nodes:
- `Call`, e.g. `self.foo(bar)`
- `Attribute`, e.g. `point.x`
- `Subscript`, e.g. `lst[1]`
- `BinOp`, e.g. `x + y` (doesn't include `and` and `or`)
- `UnaryOp`, e.g. `-n` (includes `not` but only works sometimes)
- `Compare` e.g. `a < b` (not for chains such as `0 < p < 1`)
The plan is to extend to more operations in the future.
- **[`stack_data`](https://github.com/alexmojaki/stack_data)**: Extracts data from stack frames and tracebacks, particularly to display more useful tracebacks than the default. Also uses another related library of mine: **[`pure_eval`](https://github.com/alexmojaki/pure_eval)**.
- **[`futurecoder`](https://futurecoder.io/)**: Highlights the executing node in tracebacks using `executing` via `stack_data`, and provides debugging with `snoop`.
- **[`snoop`](https://github.com/alexmojaki/snoop)**: A feature-rich and convenient debugging library. Uses `executing` to show the operation which caused an exception and to allow the `pp` function to display the source of its arguments.
- **[`heartrate`](https://github.com/alexmojaki/heartrate)**: A simple real time visualisation of the execution of a Python program. Uses `executing` to highlight currently executing operations, particularly in each frame of the stack trace.
- **[`sorcery`](https://github.com/alexmojaki/sorcery)**: Dark magic delights in Python. Uses `executing` to let special callables called spells know where they're being called from.
- **[`IPython`](https://github.com/ipython/ipython/pull/12150)**: Highlights the executing node in tracebacks using `executing` via [`stack_data`](https://github.com/alexmojaki/stack_data).
- **[`icecream`](https://github.com/gruns/icecream)**: 🍦 Sweet and creamy print debugging. Uses `executing` to identify where `ic` is called and print its arguments.
- **[`friendly_traceback`](https://github.com/friendly-traceback/friendly-traceback)**: Uses `stack_data` and `executing` to pinpoint the cause of errors and provide helpful explanations.
- **[`python-devtools`](https://github.com/samuelcolvin/python-devtools)**: Uses `executing` for print debugging similar to `icecream`.
- **[`sentry_sdk`](https://github.com/getsentry/sentry-python)**: Add the integration `sentry_sdk.integrations.executingExecutingIntegration()` to show the function `__qualname__` in each frame in sentry events.
- **[`varname`](https://github.com/pwwang/python-varname)**: Dark magics about variable names in python. Uses `executing` to find where its various magical functions like `varname` and `nameof` are called from.https://github.com/alexmojaki/executingMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-7b327bb2-5ea6-4634-8121-b04075d1af97python-executing-1.2.0-1.src.rpmpython-executing-helpnoarch91cff970ed7ca1e4a348de1e61811dc7c928fbcddf4ff01a84e272e4b468da0eDevelopment documents and examples for executing
[![Build Status](https://github.com/alexmojaki/executing/workflows/Tests/badge.svg?branch=master)](https://github.com/alexmojaki/executing/actions) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/executing/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/executing?branch=master) [![Supports Python versions 2.7 and 3.5+, including PyPy](https://img.shields.io/pypi/pyversions/executing.svg)](https://pypi.python.org/pypi/executing)
This mini-package lets you get information about what a frame is currently doing, particularly the AST node being executed.
* [Usage](#usage)
* [Getting the AST node](#getting-the-ast-node)
* [Getting the source code of the node](#getting-the-source-code-of-the-node)
* [Getting the `__qualname__` of the current function](#getting-the-__qualname__-of-the-current-function)
* [The Source class](#the-source-class)
* [Installation](#installation)
* [How does it work?](#how-does-it-work)
* [Is it reliable?](#is-it-reliable)
* [Which nodes can it identify?](#which-nodes-can-it-identify)
* [Libraries that use this](#libraries-that-use-this)
```python
import executing
node = executing.Source.executing(frame).node
```
Then `node` will be an AST node (from the `ast` standard library module) or None if the node couldn't be identified (which may happen often and should always be checked).
`node` will always be the same instance for multiple calls with frames at the same point of execution.
If you have a traceback object, pass it directly to `Source.executing()` rather than the `tb_frame` attribute to get the correct node.
For this you will need to separately install the [`asttokens`](https://github.com/gristlabs/asttokens) library, then obtain an `ASTTokens` object:
```python
executing.Source.executing(frame).source.asttokens()
```
or:
```python
executing.Source.for_frame(frame).asttokens()
```
or use one of the convenience methods:
```python
executing.Source.executing(frame).text()
executing.Source.executing(frame).text_range()
```
```python
executing.Source.executing(frame).code_qualname()
```
or:
```python
executing.Source.for_frame(frame).code_qualname(frame.f_code)
```
Everything goes through the `Source` class. Only one instance of the class is created for each filename. Subclassing it to add more attributes on creation or methods is recommended. The classmethods such as `executing` will respect this. See the source code and docstrings for more detail.
pip install executing
If you don't like that you can just copy the file `executing.py`, there are no dependencies (but of course you won't get updates).
Suppose the frame is executing this line:
```python
self.foo(bar.x)
```
and in particular it's currently obtaining the attribute `self.foo`. Looking at the bytecode, specifically `frame.f_code.co_code[frame.f_lasti]`, we can tell that it's loading an attribute, but it's not obvious which one. We can narrow down the statement being executed using `frame.f_lineno` and find the two `ast.Attribute` nodes representing `self.foo` and `bar.x`. How do we find out which one it is, without recreating the entire compiler in Python?
The trick is to modify the AST slightly for each candidate expression and observe the changes in the bytecode instructions. We change the AST to this:
```python
(self.foo ** 'longuniqueconstant')(bar.x)
```
and compile it, and the bytecode will be almost the same but there will be two new instructions:
LOAD_CONST 'longuniqueconstant'
BINARY_POWER
and just before that will be a `LOAD_ATTR` instruction corresponding to `self.foo`. Seeing that it's in the same position as the original instruction lets us know we've found our match.
Yes - if it identifies a node, you can trust that it's identified the correct one. The tests are very thorough - in addition to unit tests which check various situations directly, there are property tests against a large number of files (see the filenames printed in [this build](https://travis-ci.org/alexmojaki/executing/jobs/557970457)) with real code. Specifically, for each file, the tests:
1. Identify as many nodes as possible from all the bytecode instructions in the file, and assert that they are all distinct
2. Find all the nodes that should be identifiable, and assert that they were indeed identified somewhere
In other words, it shows that there is a one-to-one mapping between the nodes and the instructions that can be handled. This leaves very little room for a bug to creep in.
Furthermore, `executing` checks that the instructions compiled from the modified AST exactly match the original code save for a few small known exceptions. This accounts for all the quirks and optimisations in the interpreter.
Currently it works in almost all cases for the following `ast` nodes:
- `Call`, e.g. `self.foo(bar)`
- `Attribute`, e.g. `point.x`
- `Subscript`, e.g. `lst[1]`
- `BinOp`, e.g. `x + y` (doesn't include `and` and `or`)
- `UnaryOp`, e.g. `-n` (includes `not` but only works sometimes)
- `Compare` e.g. `a < b` (not for chains such as `0 < p < 1`)
The plan is to extend to more operations in the future.
- **[`stack_data`](https://github.com/alexmojaki/stack_data)**: Extracts data from stack frames and tracebacks, particularly to display more useful tracebacks than the default. Also uses another related library of mine: **[`pure_eval`](https://github.com/alexmojaki/pure_eval)**.
- **[`futurecoder`](https://futurecoder.io/)**: Highlights the executing node in tracebacks using `executing` via `stack_data`, and provides debugging with `snoop`.
- **[`snoop`](https://github.com/alexmojaki/snoop)**: A feature-rich and convenient debugging library. Uses `executing` to show the operation which caused an exception and to allow the `pp` function to display the source of its arguments.
- **[`heartrate`](https://github.com/alexmojaki/heartrate)**: A simple real time visualisation of the execution of a Python program. Uses `executing` to highlight currently executing operations, particularly in each frame of the stack trace.
- **[`sorcery`](https://github.com/alexmojaki/sorcery)**: Dark magic delights in Python. Uses `executing` to let special callables called spells know where they're being called from.
- **[`IPython`](https://github.com/ipython/ipython/pull/12150)**: Highlights the executing node in tracebacks using `executing` via [`stack_data`](https://github.com/alexmojaki/stack_data).
- **[`icecream`](https://github.com/gruns/icecream)**: 🍦 Sweet and creamy print debugging. Uses `executing` to identify where `ic` is called and print its arguments.
- **[`friendly_traceback`](https://github.com/friendly-traceback/friendly-traceback)**: Uses `stack_data` and `executing` to pinpoint the cause of errors and provide helpful explanations.
- **[`python-devtools`](https://github.com/samuelcolvin/python-devtools)**: Uses `executing` for print debugging similar to `icecream`.
- **[`sentry_sdk`](https://github.com/getsentry/sentry-python)**: Add the integration `sentry_sdk.integrations.executingExecutingIntegration()` to show the function `__qualname__` in each frame in sentry events.
- **[`varname`](https://github.com/pwwang/python-varname)**: Dark magics about variable names in python. Uses `executing` to find where its various magical functions like `varname` and `nameof` are called from.https://github.com/alexmojaki/executingMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-5be11934-1be7-4b03-920f-a310a3fca71fpython-executing-1.2.0-1.src.rpmpython-flask-whoosheesrce86209a5ccc25a8d7a7bdcafdadf381c4f983dd53b0cbbff315de81daca96fa1Flask-SQLAlchemy - Whoosh IntegrationCustomizable Flask - SQLAlchemy - Whoosh integrationhttps://github.com/bkabrda/flask-whoosheeBSD-3-ClauseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-18ad380e-e44e-4345-937f-780491a9623dpython-flask-whooshee-helpnoarch076844fd7a18acfabae6f5f4ec60fb7740b9ef1044ce25f201983f3abce4f69bDevelopment documents and examples for flask-whoosheeCustomizable Flask - SQLAlchemy - Whoosh integrationhttps://github.com/bkabrda/flask-whoosheeBSD-3-ClauseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-18ad380e-e44e-4345-937f-780491a9623dpython-flask-whooshee-0.8.2-1.src.rpmpython-html2textsrce6a44e48d879c7c31920e942f24f7d0b2d1faf07ae66b397d54fcfd4f03cc408Turn HTML into equivalent Markdown-structured text.Convert HTML to Markdown-formatted text.https://github.com/Alir3z4/html2text/GPL-3.0-onlyopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-97f67640-1dfa-4034-8755-117a7ee6ce59python-html2text-helpnoarchbfd050161ecb431321f4219ddd6460466976ae9600691787f7f32994cd292fe5Development documents and examples for html2textConvert HTML to Markdown-formatted text.https://github.com/Alir3z4/html2text/GPL-3.0-onlyopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-97f67640-1dfa-4034-8755-117a7ee6ce59python-html2text-2020.1.16-2.src.rpmpython-html5-parsersrcf4a9674801fc626495187c99d0b91b3682210877b8d974c141e1130df66479d6A fast, standards compliant, C based, HTML 5 parser for pythonA fast, standards compliant, C based, HTML 5 parser for pythonhttps://pypi.python.org/pypi/html5-parserASL 2.0 and MITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-17a66066-ef55-4a6e-9c9b-7fdb334c4d86python-html5-parsersrc0ab15da5ce6a282af9bddf56331f7da7fc5d1213d1cc1f32ee177adf26c4c510A fast, standards compliant, C based, HTML 5 parser for pythonA fast, standards compliant, C based, HTML 5 parser for pythonhttps://pypi.python.org/pypi/html5-parserASL 2.0 and MITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-e2ade63d-115f-4a23-bb61-702ae17aa694python-html5-parsersrcca93a552912f4e1fbed6aea7f628e303d3ee5f41c75bb47c9d5ad6e0f6b09500Fast C based HTML 5 parsing for pythonhttps://html5-parser.readthedocs.ioApache 2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-81e8daf0-6012-4b35-87a9-96641cc33b5epython-html5-parser-debuginfox86_641f9730322999f444f75cb5c07a31cc7fc2445cd3b177f5e49e212222ddf42f98Debug information for package python-html5-parserThis package provides debug information for package python-html5-parser.
Debug information is useful when developing applications that use this
package or when debugging this package.https://pypi.python.org/pypi/html5-parserASL 2.0 and MITopenEuler Copr - user mywaaagh_adminDevelopment/Debugresalloc-17a66066-ef55-4a6e-9c9b-7fdb334c4d86python-html5-parser-0.4.10-1.src.rpmpython-html5-parser-debuginfox86_64dc02a56859ab5b42531ee82ccd2121fa0baa8c2aaad722e66d3ba54a827c1ce4Debug information for package python-html5-parserThis package provides debug information for package python-html5-parser.
Debug information is useful when developing applications that use this
package or when debugging this package.https://pypi.python.org/pypi/html5-parserASL 2.0 and MITopenEuler Copr - user mywaaagh_adminDevelopment/Debugresalloc-e2ade63d-115f-4a23-bb61-702ae17aa694python-html5-parser-0.4.10-1.src.rpmpython-html5-parser-debugsourcex86_64fb561496d70c56e4e1d7b5e7b63851c65bc58fb0e94d36ed4babd91338888de9Debug sources for package python-html5-parserThis package provides debug sources for package python-html5-parser.
Debug sources are useful when developing applications that use this
package or when debugging this package.https://pypi.python.org/pypi/html5-parserASL 2.0 and MITopenEuler Copr - user mywaaagh_adminDevelopment/Debugresalloc-17a66066-ef55-4a6e-9c9b-7fdb334c4d86python-html5-parser-0.4.10-1.src.rpmpython-html5-parser-debugsourcex86_64dbbda36463588d3437c6a2b5381a0fdc2962a6e978762e1d0bf4c1ad5f485f06Debug sources for package python-html5-parserThis package provides debug sources for package python-html5-parser.
Debug sources are useful when developing applications that use this
package or when debugging this package.https://pypi.python.org/pypi/html5-parserASL 2.0 and MITopenEuler Copr - user mywaaagh_adminDevelopment/Debugresalloc-e2ade63d-115f-4a23-bb61-702ae17aa694python-html5-parser-0.4.10-1.src.rpmpython-ipdbsrc27765026b490edd6440f0e06b5af9389d70c2035b5c971fe7344f57bd6be920fIPython-enabled pdbhttps://github.com/gotcha/ipdbBSDopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-ae4ac1f8-4f54-4306-bd3d-5a7117bc0f25python-ipdb-helpnoarch2ed88bfb8c431ecd14afd9ad710ab2d222324568817ed49f96071bc26f7e9a13Development documents and examples for ipdbhttps://github.com/gotcha/ipdbBSDopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-ae4ac1f8-4f54-4306-bd3d-5a7117bc0f25python-ipdb-0.13.13-1.src.rpmpython-ipythonsrc678ac39b780a539981d7d6d014fcbedaa14d2575bb91f25c7415f4c251cd293dIPython: Productive Interactive ComputingIPython provides a rich toolkit to help you make the most out of using Python
interactively. Its main components are:
* A powerful interactive Python shell
* A `Jupyter <https://jupyter.org/>`_ kernel to work with Python code in Jupyter
notebooks and other interactive frontends.
The enhanced interactive Python shells have the following main features:
* Comprehensive object introspection.
* Input history, persistent across sessions.
* Caching of output results during a session with automatically generated
references.
* Extensible tab completion, with support by default for completion of python
variables and keywords, filenames and function keywords.
* Extensible system of 'magic' commands for controlling the environment and
performing many tasks related either to IPython or the operating system.
* A rich configuration system with easy switching between different setups
(simpler than changing $PYTHONSTARTUP environment variables every time).
* Session logging and reloading.
* Extensible syntax processing for special purpose situations.
* Access to the system shell with user-extensible alias system.
* Easily embeddable in other Python programs and GUIs.
* Integrated access to the pdb debugger and the Python profiler.
The latest development version is always available from IPython's `GitHub
site <http://github.com/ipython>`_.https://ipython.orgBSD-3-ClauseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-8a6d9528-c43b-40d0-8e33-220e5ce7b3c4python-ipythonsrce3e8ec02286cf02a201ce1c129f3c7e495336079d9d3ca9e7c98257c970a7f0dIPython: Productive Interactive ComputingIPython provides a rich toolkit to help you make the most out of using Python
interactively. Its main components are:
* A powerful interactive Python shell
* A `Jupyter <https://jupyter.org/>`_ kernel to work with Python code in Jupyter
notebooks and other interactive frontends.
The enhanced interactive Python shells have the following main features:
* Comprehensive object introspection.
* Input history, persistent across sessions.
* Caching of output results during a session with automatically generated
references.
* Extensible tab completion, with support by default for completion of python
variables and keywords, filenames and function keywords.
* Extensible system of 'magic' commands for controlling the environment and
performing many tasks related either to IPython or the operating system.
* A rich configuration system with easy switching between different setups
(simpler than changing $PYTHONSTARTUP environment variables every time).
* Session logging and reloading.
* Extensible syntax processing for special purpose situations.
* Access to the system shell with user-extensible alias system.
* Easily embeddable in other Python programs and GUIs.
* Integrated access to the pdb debugger and the Python profiler.
The latest development version is always available from IPython's `GitHub
site <http://github.com/ipython>`_.https://ipython.orgBSD-3-ClauseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-3b850d66-9d75-461a-9d6a-08feeef205aepython-ipython-helpnoarch91e456fb1a17ee81e69462f02b0f8bb43d8bbf0624dde192b3f35522ceda5b48Development documents and examples for ipythonIPython provides a rich toolkit to help you make the most out of using Python
interactively. Its main components are:
* A powerful interactive Python shell
* A `Jupyter <https://jupyter.org/>`_ kernel to work with Python code in Jupyter
notebooks and other interactive frontends.
The enhanced interactive Python shells have the following main features:
* Comprehensive object introspection.
* Input history, persistent across sessions.
* Caching of output results during a session with automatically generated
references.
* Extensible tab completion, with support by default for completion of python
variables and keywords, filenames and function keywords.
* Extensible system of 'magic' commands for controlling the environment and
performing many tasks related either to IPython or the operating system.
* A rich configuration system with easy switching between different setups
(simpler than changing $PYTHONSTARTUP environment variables every time).
* Session logging and reloading.
* Extensible syntax processing for special purpose situations.
* Access to the system shell with user-extensible alias system.
* Easily embeddable in other Python programs and GUIs.
* Integrated access to the pdb debugger and the Python profiler.
The latest development version is always available from IPython's `GitHub
site <http://github.com/ipython>`_.https://ipython.orgBSD-3-ClauseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-8a6d9528-c43b-40d0-8e33-220e5ce7b3c4python-ipython-8.14.0-1.src.rpmpython-ipython-helpnoarchdfbb8ec18a8bf62485aca5675bceadd8985ade0b08f8c74ba9c29a6766c51077Development documents and examples for ipythonIPython provides a rich toolkit to help you make the most out of using Python
interactively. Its main components are:
* A powerful interactive Python shell
* A `Jupyter <https://jupyter.org/>`_ kernel to work with Python code in Jupyter
notebooks and other interactive frontends.
The enhanced interactive Python shells have the following main features:
* Comprehensive object introspection.
* Input history, persistent across sessions.
* Caching of output results during a session with automatically generated
references.
* Extensible tab completion, with support by default for completion of python
variables and keywords, filenames and function keywords.
* Extensible system of 'magic' commands for controlling the environment and
performing many tasks related either to IPython or the operating system.
* A rich configuration system with easy switching between different setups
(simpler than changing $PYTHONSTARTUP environment variables every time).
* Session logging and reloading.
* Extensible syntax processing for special purpose situations.
* Access to the system shell with user-extensible alias system.
* Easily embeddable in other Python programs and GUIs.
* Integrated access to the pdb debugger and the Python profiler.
The latest development version is always available from IPython's `GitHub
site <http://github.com/ipython>`_.https://ipython.orgBSD-3-ClauseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-3b850d66-9d75-461a-9d6a-08feeef205aepython-ipython-8.14.0-1.src.rpmpython-jedisrcc19fdc1aadb98819d9a9e873e68e6f8fafe4be5ed7fecfe28426867c9ce17394A static analysis tool for Python that is typically used in IDEs/editors pluginsJedi is a static analysis tool for Python that is typically used in IDEs/editors plugins.
It has a focus on autocompletion and goto functionality.
Other features include refactoring, code search and finding references.https://github.com/davidhalter/jediMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-2b0db9b7-2274-4598-b032-8651c56348acpython-jedisrc296bde953e4e8584c620c68c00ef9b7202398cf4422465d251be3a6d0141e5c5A static analysis tool for Python that is typically used in IDEs/editors pluginsJedi is a static analysis tool for Python that is typically used in IDEs/editors plugins.
It has a focus on autocompletion and goto functionality.
Other features include refactoring, code search and finding references.https://github.com/davidhalter/jediMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-b3cdd0a3-db90-4694-b06d-a76e2096b9c0python-jedi-helpnoarch2f2dfa75fb729cf474369fd77a6cfec19dcc2035c5cc007320958f307849dc3bDevelopment documents and examples for jediJedi is a static analysis tool for Python that is typically used in IDEs/editors plugins.
It has a focus on autocompletion and goto functionality.
Other features include refactoring, code search and finding references.https://github.com/davidhalter/jediMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-2b0db9b7-2274-4598-b032-8651c56348acpython-jedi-0.18.1-1.src.rpmpython-jedi-helpnoarch555564a9aa74d581374319567b9f8ded3626fd244cb9024981e90dfc0a867b71Development documents and examples for jediJedi is a static analysis tool for Python that is typically used in IDEs/editors plugins.
It has a focus on autocompletion and goto functionality.
Other features include refactoring, code search and finding references.https://github.com/davidhalter/jediMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-b3cdd0a3-db90-4694-b06d-a76e2096b9c0python-jedi-0.18.1-1.src.rpmpython-keystoneauth1src3ab3ccddcb354704af0b96c30083790c9629ea7f88f0743d8ae2288146733e83Authentication Library for OpenStack IdentityKeystoneauth provides a standard way to do authentication and service requests \
within the OpenStack ecosystem. It is designed for use in conjunction with \
the existing OpenStack clients and for simplifying the process of writing \
new clients.https://docs.openstack.org/keystoneauth/latest/Apache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-dacb1bad-011f-4e7c-9671-862014732eabpython-littleutilssrc5070acb0fc148c0aa0b7b2e1fbc1bd1d0af6a61f19bcc9f163107b51b2163367Small collection of Python utilitiesSmall collection of Python utilities.https://pypi.org/pypi/littleutilsMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-e0b48d8b-3670-46af-ae10-af1a3550bbadpython-littleutilssrccf358a305524952cd8c3f7e5de1b217a7712e46154103932d62edb2231b6270aSmall collection of Python utilitiesSmall collection of Python utilities.https://pypi.org/pypi/littleutilsMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-995a0d73-034c-40fd-a588-8dbe7476c7a7python-matplotlib-inlinesrcde219083e83635a2c146ce8ce8bbf6f5fc823505acdbc26b10bc0461705aea90Inline Matplotlib backend for Jupyter
This package provides support for matplotlib to display figures directly inline in the Jupyter notebook and related clients, as shown below.
With conda:
```bash
conda install -c conda-forge matplotlib-inline
```
With pip:
```bash
pip install matplotlib-inline
```
Note that in current versions of JupyterLab and Jupyter Notebook, the explicit use of the `%matplotlib inline` directive is not needed anymore, though other third-party clients may still require it.
This will produce a figure immediately below:
```python
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 3*np.pi, 500)
plt.plot(x, np.sin(x**2))
plt.title('A simple chirp');
```
Licensed under the terms of the BSD 3-Clause License, by the IPython Development Team (see `LICENSE` file).
BSD 3-Clause License
Copyright (c) 2019-2022, IPython Development Team.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.https://github.com/ipython/matplotlib-inlineBSD 3-ClauseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-f722e95e-5f19-4b49-b3aa-75043886250fpython-matplotlib-inline-helpnoarch9782d0a39b3f67ebcae75079811cdcf59cc09c13cfe91ba3d8598ec36eafd1dfDevelopment documents and examples for matplotlib-inline
This package provides support for matplotlib to display figures directly inline in the Jupyter notebook and related clients, as shown below.
With conda:
```bash
conda install -c conda-forge matplotlib-inline
```
With pip:
```bash
pip install matplotlib-inline
```
Note that in current versions of JupyterLab and Jupyter Notebook, the explicit use of the `%matplotlib inline` directive is not needed anymore, though other third-party clients may still require it.
This will produce a figure immediately below:
```python
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 3*np.pi, 500)
plt.plot(x, np.sin(x**2))
plt.title('A simple chirp');
```
Licensed under the terms of the BSD 3-Clause License, by the IPython Development Team (see `LICENSE` file).
BSD 3-Clause License
Copyright (c) 2019-2022, IPython Development Team.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.https://github.com/ipython/matplotlib-inlineBSD 3-ClauseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-f722e95e-5f19-4b49-b3aa-75043886250fpython-matplotlib-inline-0.1.6-1.src.rpmpython-novaclientsrc647dac12712a05d4cde15fe6b5b4dd3df857834cbb7d10e5fa77ff830a7e410bClient library for OpenStack Compute APIThis is a client for the OpenStack Nova API. There's a Python API (the
novaclient module), and a command-line script (nova). Each implements 100% of
the OpenStack Nova API.https://docs.openstack.org/python-novaclient/latestApache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-d3d653b9-73cc-46ca-a605-4fa619838b93python-openid-teamssrc5dc25009c8ee3cf4bc0079b46a32db96f6a7f83e450314f3475edf474da240e2This is an implementation of the OpenID teams extension for python-openidUNKNOWNhttp://www.github.com/puiterwijk/python-openid-teams/BSDopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-61dbe87a-e7a7-43b4-ba46-63040509c770python-openid-teamssrc7a172af9202aad9e99de9422f40b68f2cb292cd52aee8f562a756c32e1e91b1fThis is an implementation of the OpenID teams extension for python-openidUNKNOWNhttp://www.github.com/puiterwijk/python-openid-teams/BSDopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-9e090f89-0247-4d1a-8d75-c2278b715dd3python-openid-teams-helpnoarch206e5a4e53b5f9dee6f17aef2f304c3185355de48842f59dc34de53764620f67Development documents and examples for python-openid-teamsUNKNOWNhttp://www.github.com/puiterwijk/python-openid-teams/BSDopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-61dbe87a-e7a7-43b4-ba46-63040509c770python-openid-teams-1.1-2.src.rpmpython-openid-teams-helpnoarchdd4655d766811326ab27cf63cdffdf242b043ddd5077cbefebc28009b0d6fb86Development documents and examples for python-openid-teamsUNKNOWNhttp://www.github.com/puiterwijk/python-openid-teams/BSDopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-9e090f89-0247-4d1a-8d75-c2278b715dd3python-openid-teams-1.1-2.src.rpmpython-openidc-clientsrc9adbf8219118041b86a454525c5658a80b5387a1f43678a09a3fbdab0d4a962bPython OpenID Connect client with token caching and managementPython OpenID Connect client with token caching and management.MITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-f3f390ee-6fe4-426e-a181-b4409f719372python-openidc-clientsrc9e56a31937fd75f683f20e93a36bd88869e99c050e20221faf0a4a999a32987aPython OpenID Connect client with token caching and managementPython OpenID Connect client with token caching and management.MITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-417c2a80-ef5f-4edd-863b-d3040f7a4575python-os-service-typessrcd6f6054dd3edeb15081995caa50fd6c2d2859d88b63b5c2cdcc222581c7ffefePython library for consuming OpenStack sevice-types-authority dataPython library for consuming OpenStack sevice-types-authority datahttps://pypi.org/project/os-service-types/Apache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-a5f6aa8d-7696-4065-bcc3-8f92d36579e8python-os-service-types-helpnoarchcda3b7ed19eff3837c3205c2542e19ae169345b5feb96d24a858ec681dd84b72Development documents and examples for os-service-typeshttps://pypi.org/project/os-service-types/Apache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-a5f6aa8d-7696-4065-bcc3-8f92d36579e8python-os-service-types-1.7.0-2.src.rpmpython-oslo-concurrencysrc1e2d0b6afd847755f25c95516e07d49f9974378535f1e0cfe0089988c574cd5aOslo Concurrency libraryOpenStack library for all concurrency-related codehttps://docs.openstack.org/oslo.concurrency/latest/Apache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-6d6e1390-3217-4e8b-82cb-0c57f99f5564python-oslo-concurrencysrc84a56746f4f83e5797e5b7bc9c02fbe9c9e209f87e3ef7c1b3de1b78d140109bOslo Concurrency libraryOpenStack library for all concurrency-related codehttps://docs.openstack.org/oslo.concurrency/latest/Apache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-4e8fb96d-0e83-412f-b90b-1c1e93b106a6python-oslo-concurrency-helpnoarch60e545cd2e4da99a91149bc4a37ebebfafad15dc363641dc38422927563e66ebOslo Concurrency libraryOpenStack library for all concurrency-related codehttps://docs.openstack.org/oslo.concurrency/latest/Apache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-6d6e1390-3217-4e8b-82cb-0c57f99f5564python-oslo-concurrency-4.5.0-1.src.rpmpython-oslo-configsrc35ca5e1ef7520384842c1dd81627ac6894e94d8f9fec1ba3e864433e5de283dbOslo Configuration APIThe Oslo configuration API supports parsing command line arguments and .ini style configuration files.https://docs.openstack.org/oslo.config/latest/Apache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-b40fadf4-4576-4235-b5e9-fbf3af4a8ae6python-oslo-configsrcba76be774e32ba6bbe56bb6db888b2273937c6c9dcac02bc61bdda5ab92f56c7Oslo Configuration APIThe Oslo configuration API supports parsing command line arguments and .ini style configuration files.https://docs.openstack.org/oslo.config/latest/Apache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-cf67d65b-0d6a-4cfe-beb3-c003d20bc721python-oslo-config-helpnoarcha3156715ac44a1859e39d58030d821946e1d2bf605f9585f24e9478fa3e396f1Oslo Configuration APIThe Oslo configuration API supports parsing command line arguments and .ini style configuration files.https://docs.openstack.org/oslo.config/latest/Apache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-b40fadf4-4576-4235-b5e9-fbf3af4a8ae6python-oslo-config-9.0.0-1.src.rpmpython-oslo-config-helpnoarch7c023c3520fe52736dcdd397606e574ac8ad07fc6635fa9e5298375c4806dfacOslo Configuration APIThe Oslo configuration API supports parsing command line arguments and .ini style configuration files.https://docs.openstack.org/oslo.config/latest/Apache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-cf67d65b-0d6a-4cfe-beb3-c003d20bc721python-oslo-config-9.1.0-1.src.rpmpython-oslo-i18nsrcdc625b5693447ef49429d213552690d06e61ba25c7b513dd7145e6c502518a56Oslo i18n libraryInternationalization and translation libraryhttps://docs.openstack.org/oslo.i18n/latestApache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-3a215e0b-61e9-409b-af79-c4304827e921python-oslo-i18nsrc150ba34f27a229b4e04a7a6a6117b7817cc48de236ef775cc2e776e84751162eOslo i18n libraryInternationalization and translation libraryhttps://docs.openstack.org/oslo.i18n/latestApache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-85a9621a-c7f4-4d70-8b45-66691feb532fpython-oslo-i18n-helpnoarch3bd1c5e59b329e760932869a32d71bbf825fc88d1bb0021149b5629b98c439b6Oslo i18n libraryInternationalization and translation libraryhttps://docs.openstack.org/oslo.i18n/latestApache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-3a215e0b-61e9-409b-af79-c4304827e921python-oslo-i18n-5.1.0-1.src.rpmpython-oslo-i18n-helpnoarch4d5a6bee6f1d14aebf2065e87340ad36cbc6503fdd8137122e805ed4ab6bdc4cOslo i18n libraryInternationalization and translation libraryhttps://docs.openstack.org/oslo.i18n/latestApache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-85a9621a-c7f4-4d70-8b45-66691feb532fpython-oslo-i18n-5.1.0-1.src.rpmpython-oslo-serializationsrc35d45373afe1c1718ce9741b070cc6c8b9c231d4f6bf2730567fc8962e5438b5Oslo Serialization libraryThe oslo.serialization library provides support for representing objects in
transmittable and storable formats, such as Base64, JSON and MessagePack.https://docs.openstack.org/oslo.serialization/latest/Apache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-d8cbaca8-13e6-4fe0-8de4-38338d7ac8f5python-oslo-serializationsrc38eec19d94c43a23b503cb803b5a7c471032a43b0a612911cb3815cc3be87625Oslo Serialization libraryThe oslo.serialization library provides support for representing objects in
transmittable and storable formats, such as Base64, JSON and MessagePack.https://docs.openstack.org/oslo.serialization/latest/Apache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-2d9c7c66-efee-411c-8fe5-34f9b831511apython-oslo-serialization-helpnoarch5d88cdd6d06adc22eecf9c01e1f6e689b19e624d9c24bf65cf126f4d666966f9Oslo Serialization libraryThe oslo.serialization library provides support for representing objects in
transmittable and storable formats, such as Base64, JSON and MessagePack.https://docs.openstack.org/oslo.serialization/latest/Apache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-d8cbaca8-13e6-4fe0-8de4-38338d7ac8f5python-oslo-serialization-4.3.0-1.src.rpmpython-oslo-utilssrce9bcf23f0654912a474afe7a6fcc0f45c94edbb4524c01d9205c1f9b01fe3682Oslo Utility libraryThe oslo.utils library provides support for common utility type functions,
such as encoding, exception handling, string manipulation, and time handling.https://docs.openstack.org/oslo.utils/latest/Apache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-751aca01-6356-40ea-a504-17cb9ad5cec4python-oslo-utilssrc9de3c5837b097b2a31d53a0ee18a6a514edc2ccc3c87dddc38c0594f2b455705Oslo Utility libraryThe oslo.utils library provides support for common utility type functions,
such as encoding, exception handling, string manipulation, and time handling.https://docs.openstack.org/oslo.utils/latest/Apache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-644b051f-ac99-4b66-a5d5-0b91767de35apython-oslo-utils-helpnoarch89fb73c543be88baf74b20858290a788b1a4d9a4299d4f0836953a621834b10fOslo Utility libraryThe oslo.utils library provides support for common utility type functions,
such as encoding, exception handling, string manipulation, and time handling.https://docs.openstack.org/oslo.utils/latest/Apache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-644b051f-ac99-4b66-a5d5-0b91767de35apython-oslo-utils-4.12.3-1.src.rpmpython-parsosrc670e827053b3a30ec16cb045f1d8afae15aa14a4b1c5ef229179356bc430803eA Python ParserParso is a Python parser that supports error recovery and round-trip parsing
for different Python versions. Parso consists of a small API to parse Python
and analyse the syntax tree.https://github.com/davidhalter/parsoMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-bd897c51-3491-463f-a3ce-75942e9df15bpython-parsosrcd6405d60af01d6ac59c6f8d8812f20aa26b118968f30f5113ea1948f54424f9aA Python ParserParso is a Python parser that supports error recovery and round-trip parsing
for different Python versions. Parso consists of a small API to parse Python
and analyse the syntax tree.https://github.com/davidhalter/parsoMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-9cc05245-60c9-4336-8732-08e0f59d08e0python-parso-helpnoarch83450a656588407b2875dce6ba6384010017cb34ef39680c5739304f4435b421Development documents and examples for parsoParso is a Python parser that supports error recovery and round-trip parsing
for different Python versions. Parso consists of a small API to parse Python
and analyse the syntax tree.https://github.com/davidhalter/parsoMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-bd897c51-3491-463f-a3ce-75942e9df15bpython-parso-0.8.3-1.src.rpmpython-parso-helpnoarcheeeaa9902381ff2a01974c5ebfded6286b44378eeaa04325e15d5182d1410e8cDevelopment documents and examples for parsoParso is a Python parser that supports error recovery and round-trip parsing
for different Python versions. Parso consists of a small API to parse Python
and analyse the syntax tree.https://github.com/davidhalter/parsoMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-9cc05245-60c9-4336-8732-08e0f59d08e0python-parso-0.8.3-1.src.rpmpython-picklesharesrc57ad3239004e751954ef82de14650d369aa4ada33d418e94d6071a533ef43930Tiny 'shelve'-like database with concurrency supportPickleShare - a small 'shelve' like datastore with concurrency support
Like shelve, a PickleShareDB object acts like a normal dictionary. Unlike shelve,
many processes can access the database simultaneously. Changing a value in
database is immediately visible to other processes accessing the same database.
Concurrency is possible because the values are stored in separate files. Hence
the "database" is a directory where *all* files are governed by PickleShare.
Example usage::
from pickleshare import *
db = PickleShareDB('~/testpickleshare')
db.clear()
print("Should be empty:",db.items())
db['hello'] = 15
db['aku ankka'] = [1,2,313]
db['paths/are/ok/key'] = [1,(5,46)]
print(db.keys())
This module is certainly not ZODB, but can be used for low-load
(non-mission-critical) situations where tiny code size trumps the
advanced features of a "real" object database.
Installation guide: pip install picklesharehttps://github.com/pickleshare/pickleshareMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-5e7cc4dd-b259-447b-85c8-0fd821d139a3python-pickleshare-helpnoarche8edcf2c0d6c669954b895e7fffd61a2c020c25dacbc3458fa0f55b804d25ef0Development documents and examples for picklesharePickleShare - a small 'shelve' like datastore with concurrency support
Like shelve, a PickleShareDB object acts like a normal dictionary. Unlike shelve,
many processes can access the database simultaneously. Changing a value in
database is immediately visible to other processes accessing the same database.
Concurrency is possible because the values are stored in separate files. Hence
the "database" is a directory where *all* files are governed by PickleShare.
Example usage::
from pickleshare import *
db = PickleShareDB('~/testpickleshare')
db.clear()
print("Should be empty:",db.items())
db['hello'] = 15
db['aku ankka'] = [1,2,313]
db['paths/are/ok/key'] = [1,(5,46)]
print(db.keys())
This module is certainly not ZODB, but can be used for low-load
(non-mission-critical) situations where tiny code size trumps the
advanced features of a "real" object database.
Installation guide: pip install picklesharehttps://github.com/pickleshare/pickleshareMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-5e7cc4dd-b259-447b-85c8-0fd821d139a3python-pickleshare-0.7.5-1.src.rpmpython-prompt-toolkitsrc7c4c025ae902f8ac1ebcb2284eefc8a2275777b60f0a4e7e26015c878986b2ecLibrary for building powerful interactive command lines in Pythonprompt_toolkit is a library for building powerful interactive command lines and
terminal applications in Python.https://github.com/prompt-toolkit/python-prompt-toolkitBSD-3-ClauseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-01b50073-cc6a-4c0f-9b13-4e72d09d5469python-prompt-toolkitsrce8df6f5328ba94b6cb35fc30bce4942040fe27f4b5ab6093031af8434a7e4f4cLibrary for building powerful interactive command lines in Pythonprompt_toolkit is a library for building powerful interactive command lines and
terminal applications in Python.https://github.com/prompt-toolkit/python-prompt-toolkitBSD-3-ClauseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-af81c92f-00f3-4261-be34-f6c29ea6ad5dpython-prompt-toolkit-helpnoarch26c315aa261857be1e1a8c4a5216f2daa6aab75f96885c9d822dfe0e4a83747cDevelopment documents and examples for prompt-toolkitprompt_toolkit is a library for building powerful interactive command lines and
terminal applications in Python.https://github.com/prompt-toolkit/python-prompt-toolkitBSD-3-ClauseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-01b50073-cc6a-4c0f-9b13-4e72d09d5469python-prompt-toolkit-3.0.38-1.src.rpmpython-prompt-toolkit-helpnoarch9cb384777acaafa9897a00488f1866a8a451f236a8699a447001cf3849e5481fDevelopment documents and examples for prompt-toolkitprompt_toolkit is a library for building powerful interactive command lines and
terminal applications in Python.https://github.com/prompt-toolkit/python-prompt-toolkitBSD-3-ClauseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-af81c92f-00f3-4261-be34-f6c29ea6ad5dpython-prompt-toolkit-3.0.38-1.src.rpmpython-pure-evalsrcb5ce1fd2bdb318eb5967d07edd20920557903f08ce7b8dce5f7738cf36f0b196Safely evaluate AST nodes without side effects
[![Build Status](https://travis-ci.org/alexmojaki/pure_eval.svg?branch=master)](https://travis-ci.org/alexmojaki/pure_eval) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/pure_eval/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/pure_eval?branch=master) [![Supports Python versions 3.5+](https://img.shields.io/pypi/pyversions/pure_eval.svg)](https://pypi.python.org/pypi/pure_eval)
This is a Python package that lets you safely evaluate certain AST nodes without triggering arbitrary code that may have unwanted side effects.
It can be installed from PyPI:
pip install pure_eval
To demonstrate usage, suppose we have an object defined as follows:
```python
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
@property
def area(self):
print("Calculating area...")
return self.width * self.height
rect = Rectangle(3, 5)
```
Given the `rect` object, we want to evaluate whatever expressions we can in this source code:
```python
source = "(rect.width, rect.height, rect.area)"
```
This library works with the AST, so let's parse the source code and peek inside:
```python
import ast
tree = ast.parse(source)
the_tuple = tree.body[0].value
for node in the_tuple.elts:
print(ast.dump(node))
```
Output:
```python
Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load())
Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load())
Attribute(value=Name(id='rect', ctx=Load()), attr='area', ctx=Load())
```
Now to actually use the library. First construct an Evaluator:
```python
from pure_eval import Evaluator
evaluator = Evaluator({"rect": rect})
```
The argument to `Evaluator` should be a mapping from variable names to their values. Or if you have access to the stack frame where `rect` is defined, you can instead use:
```python
evaluator = Evaluator.from_frame(frame)
```
Now to evaluate some nodes, using `evaluator[node]`:
```python
print("rect.width:", evaluator[the_tuple.elts[0]])
print("rect:", evaluator[the_tuple.elts[0].value])
```
Output:
```
rect.width: 3
rect: <__main__.Rectangle object at 0x105b0dd30>
```
OK, but you could have done the same thing with `eval`. The useful part is that it will refuse to evaluate the property `rect.area` because that would trigger unknown code. If we try, it'll raise a `CannotEval` exception.
```python
from pure_eval import CannotEval
try:
print("rect.area:", evaluator[the_tuple.elts[2]]) # fails
except CannotEval as e:
print(e) # prints CannotEval
```
To find all the expressions that can be evaluated in a tree:
```python
for node, value in evaluator.find_expressions(tree):
print(ast.dump(node), value)
```
Output:
```python
Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load()) 3
Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load()) 5
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
```
Note that this includes `rect` three times, once for each appearance in the source code. Since all these nodes are equivalent, we can group them together:
```python
from pure_eval import group_expressions
for nodes, values in group_expressions(evaluator.find_expressions(tree)):
print(len(nodes), "nodes with value:", values)
```
Output:
```
1 nodes with value: 3
1 nodes with value: 5
3 nodes with value: <__main__.Rectangle object at 0x10d374d30>
```
If we want to list all the expressions in a tree, we may want to filter out certain expressions whose values are obvious. For example, suppose we have a function `foo`:
```python
def foo():
pass
```
If we refer to `foo` by its name as usual, then that's not interesting:
```python
from pure_eval import is_expression_interesting
node = ast.parse('foo').body[0].value
print(ast.dump(node))
print(is_expression_interesting(node, foo))
```
Output:
```python
Name(id='foo', ctx=Load())
False
```
But if we refer to it by a different name, then it's interesting:
```python
node = ast.parse('bar').body[0].value
print(ast.dump(node))
print(is_expression_interesting(node, foo))
```
Output:
```python
Name(id='bar', ctx=Load())
True
```
In general `is_expression_interesting` returns False for the following values:
- Literals (e.g. `123`, `'abc'`, `[1, 2, 3]`, `{'a': (), 'b': ([1, 2], [3])}`)
- Variables or attributes whose name is equal to the value's `__name__`, such as `foo` above or `self.foo` if it was a method.
- Builtins (e.g. `len`) referred to by their usual name.
To make things easier, you can combine finding expressions, grouping them, and filtering out the obvious ones with:
```python
evaluator.interesting_expressions_grouped(root)
```
To get the source code of an AST node, I recommend [asttokens](https://github.com/gristlabs/asttokens).
Here's a complete example that brings it all together:
```python
from asttokens import ASTTokens
from pure_eval import Evaluator
source = """
x = 1
d = {x: 2}
y = d[x]
"""
names = {}
exec(source, names)
atok = ASTTokens(source, parse=True)
for nodes, value in Evaluator(names).interesting_expressions_grouped(atok.tree):
print(atok.get_text(nodes[0]), "=", value)
```
Output:
```python
x = 1
d = {1: 2}
y = 2
d[x] = 2
```http://github.com/alexmojaki/pure_evalMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-04450e90-e2e4-4e63-97fc-de5c531ebd5dpython-pure-evalsrca6ffe3a436edc591da7aee303d31d84fcc6bbdd5805f30818326e14c9e94f589Safely evaluate AST nodes without side effects
[![Build Status](https://travis-ci.org/alexmojaki/pure_eval.svg?branch=master)](https://travis-ci.org/alexmojaki/pure_eval) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/pure_eval/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/pure_eval?branch=master) [![Supports Python versions 3.5+](https://img.shields.io/pypi/pyversions/pure_eval.svg)](https://pypi.python.org/pypi/pure_eval)
This is a Python package that lets you safely evaluate certain AST nodes without triggering arbitrary code that may have unwanted side effects.
It can be installed from PyPI:
pip install pure_eval
To demonstrate usage, suppose we have an object defined as follows:
```python
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
@property
def area(self):
print("Calculating area...")
return self.width * self.height
rect = Rectangle(3, 5)
```
Given the `rect` object, we want to evaluate whatever expressions we can in this source code:
```python
source = "(rect.width, rect.height, rect.area)"
```
This library works with the AST, so let's parse the source code and peek inside:
```python
import ast
tree = ast.parse(source)
the_tuple = tree.body[0].value
for node in the_tuple.elts:
print(ast.dump(node))
```
Output:
```python
Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load())
Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load())
Attribute(value=Name(id='rect', ctx=Load()), attr='area', ctx=Load())
```
Now to actually use the library. First construct an Evaluator:
```python
from pure_eval import Evaluator
evaluator = Evaluator({"rect": rect})
```
The argument to `Evaluator` should be a mapping from variable names to their values. Or if you have access to the stack frame where `rect` is defined, you can instead use:
```python
evaluator = Evaluator.from_frame(frame)
```
Now to evaluate some nodes, using `evaluator[node]`:
```python
print("rect.width:", evaluator[the_tuple.elts[0]])
print("rect:", evaluator[the_tuple.elts[0].value])
```
Output:
```
rect.width: 3
rect: <__main__.Rectangle object at 0x105b0dd30>
```
OK, but you could have done the same thing with `eval`. The useful part is that it will refuse to evaluate the property `rect.area` because that would trigger unknown code. If we try, it'll raise a `CannotEval` exception.
```python
from pure_eval import CannotEval
try:
print("rect.area:", evaluator[the_tuple.elts[2]]) # fails
except CannotEval as e:
print(e) # prints CannotEval
```
To find all the expressions that can be evaluated in a tree:
```python
for node, value in evaluator.find_expressions(tree):
print(ast.dump(node), value)
```
Output:
```python
Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load()) 3
Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load()) 5
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
```
Note that this includes `rect` three times, once for each appearance in the source code. Since all these nodes are equivalent, we can group them together:
```python
from pure_eval import group_expressions
for nodes, values in group_expressions(evaluator.find_expressions(tree)):
print(len(nodes), "nodes with value:", values)
```
Output:
```
1 nodes with value: 3
1 nodes with value: 5
3 nodes with value: <__main__.Rectangle object at 0x10d374d30>
```
If we want to list all the expressions in a tree, we may want to filter out certain expressions whose values are obvious. For example, suppose we have a function `foo`:
```python
def foo():
pass
```
If we refer to `foo` by its name as usual, then that's not interesting:
```python
from pure_eval import is_expression_interesting
node = ast.parse('foo').body[0].value
print(ast.dump(node))
print(is_expression_interesting(node, foo))
```
Output:
```python
Name(id='foo', ctx=Load())
False
```
But if we refer to it by a different name, then it's interesting:
```python
node = ast.parse('bar').body[0].value
print(ast.dump(node))
print(is_expression_interesting(node, foo))
```
Output:
```python
Name(id='bar', ctx=Load())
True
```
In general `is_expression_interesting` returns False for the following values:
- Literals (e.g. `123`, `'abc'`, `[1, 2, 3]`, `{'a': (), 'b': ([1, 2], [3])}`)
- Variables or attributes whose name is equal to the value's `__name__`, such as `foo` above or `self.foo` if it was a method.
- Builtins (e.g. `len`) referred to by their usual name.
To make things easier, you can combine finding expressions, grouping them, and filtering out the obvious ones with:
```python
evaluator.interesting_expressions_grouped(root)
```
To get the source code of an AST node, I recommend [asttokens](https://github.com/gristlabs/asttokens).
Here's a complete example that brings it all together:
```python
from asttokens import ASTTokens
from pure_eval import Evaluator
source = """
x = 1
d = {x: 2}
y = d[x]
"""
names = {}
exec(source, names)
atok = ASTTokens(source, parse=True)
for nodes, value in Evaluator(names).interesting_expressions_grouped(atok.tree):
print(atok.get_text(nodes[0]), "=", value)
```
Output:
```python
x = 1
d = {1: 2}
y = 2
d[x] = 2
```http://github.com/alexmojaki/pure_evalMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-d6169a16-f26e-4aff-8ad9-07585da931d8python-pure-evalsrc4433436469cc826a82c2be5d9388e35043125fb526769a55fc93a657bceafc0bSafely evaluate AST nodes without side effects
[![Build Status](https://travis-ci.org/alexmojaki/pure_eval.svg?branch=master)](https://travis-ci.org/alexmojaki/pure_eval) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/pure_eval/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/pure_eval?branch=master) [![Supports Python versions 3.5+](https://img.shields.io/pypi/pyversions/pure_eval.svg)](https://pypi.python.org/pypi/pure_eval)
This is a Python package that lets you safely evaluate certain AST nodes without triggering arbitrary code that may have unwanted side effects.
It can be installed from PyPI:
pip install pure_eval
To demonstrate usage, suppose we have an object defined as follows:
```python
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
@property
def area(self):
print("Calculating area...")
return self.width * self.height
rect = Rectangle(3, 5)
```
Given the `rect` object, we want to evaluate whatever expressions we can in this source code:
```python
source = "(rect.width, rect.height, rect.area)"
```
This library works with the AST, so let's parse the source code and peek inside:
```python
import ast
tree = ast.parse(source)
the_tuple = tree.body[0].value
for node in the_tuple.elts:
print(ast.dump(node))
```
Output:
```python
Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load())
Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load())
Attribute(value=Name(id='rect', ctx=Load()), attr='area', ctx=Load())
```
Now to actually use the library. First construct an Evaluator:
```python
from pure_eval import Evaluator
evaluator = Evaluator({"rect": rect})
```
The argument to `Evaluator` should be a mapping from variable names to their values. Or if you have access to the stack frame where `rect` is defined, you can instead use:
```python
evaluator = Evaluator.from_frame(frame)
```
Now to evaluate some nodes, using `evaluator[node]`:
```python
print("rect.width:", evaluator[the_tuple.elts[0]])
print("rect:", evaluator[the_tuple.elts[0].value])
```
Output:
```
rect.width: 3
rect: <__main__.Rectangle object at 0x105b0dd30>
```
OK, but you could have done the same thing with `eval`. The useful part is that it will refuse to evaluate the property `rect.area` because that would trigger unknown code. If we try, it'll raise a `CannotEval` exception.
```python
from pure_eval import CannotEval
try:
print("rect.area:", evaluator[the_tuple.elts[2]]) # fails
except CannotEval as e:
print(e) # prints CannotEval
```
To find all the expressions that can be evaluated in a tree:
```python
for node, value in evaluator.find_expressions(tree):
print(ast.dump(node), value)
```
Output:
```python
Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load()) 3
Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load()) 5
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
```
Note that this includes `rect` three times, once for each appearance in the source code. Since all these nodes are equivalent, we can group them together:
```python
from pure_eval import group_expressions
for nodes, values in group_expressions(evaluator.find_expressions(tree)):
print(len(nodes), "nodes with value:", values)
```
Output:
```
1 nodes with value: 3
1 nodes with value: 5
3 nodes with value: <__main__.Rectangle object at 0x10d374d30>
```
If we want to list all the expressions in a tree, we may want to filter out certain expressions whose values are obvious. For example, suppose we have a function `foo`:
```python
def foo():
pass
```
If we refer to `foo` by its name as usual, then that's not interesting:
```python
from pure_eval import is_expression_interesting
node = ast.parse('foo').body[0].value
print(ast.dump(node))
print(is_expression_interesting(node, foo))
```
Output:
```python
Name(id='foo', ctx=Load())
False
```
But if we refer to it by a different name, then it's interesting:
```python
node = ast.parse('bar').body[0].value
print(ast.dump(node))
print(is_expression_interesting(node, foo))
```
Output:
```python
Name(id='bar', ctx=Load())
True
```
In general `is_expression_interesting` returns False for the following values:
- Literals (e.g. `123`, `'abc'`, `[1, 2, 3]`, `{'a': (), 'b': ([1, 2], [3])}`)
- Variables or attributes whose name is equal to the value's `__name__`, such as `foo` above or `self.foo` if it was a method.
- Builtins (e.g. `len`) referred to by their usual name.
To make things easier, you can combine finding expressions, grouping them, and filtering out the obvious ones with:
```python
evaluator.interesting_expressions_grouped(root)
```
To get the source code of an AST node, I recommend [asttokens](https://github.com/gristlabs/asttokens).
Here's a complete example that brings it all together:
```python
from asttokens import ASTTokens
from pure_eval import Evaluator
source = """
x = 1
d = {x: 2}
y = d[x]
"""
names = {}
exec(source, names)
atok = ASTTokens(source, parse=True)
for nodes, value in Evaluator(names).interesting_expressions_grouped(atok.tree):
print(atok.get_text(nodes[0]), "=", value)
```
Output:
```python
x = 1
d = {1: 2}
y = 2
d[x] = 2
```http://github.com/alexmojaki/pure_evalMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-bfd2efdb-39f3-4891-bdcb-a97c96937753python-pure-evalsrce6723529ca2d04269682894b9ec250f1641473e90f4f887a7c77f0f17a6c2cb7Safely evaluate AST nodes without side effects
[![Build Status](https://travis-ci.org/alexmojaki/pure_eval.svg?branch=master)](https://travis-ci.org/alexmojaki/pure_eval) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/pure_eval/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/pure_eval?branch=master) [![Supports Python versions 3.5+](https://img.shields.io/pypi/pyversions/pure_eval.svg)](https://pypi.python.org/pypi/pure_eval)
This is a Python package that lets you safely evaluate certain AST nodes without triggering arbitrary code that may have unwanted side effects.
It can be installed from PyPI:
pip install pure_eval
To demonstrate usage, suppose we have an object defined as follows:
```python
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
@property
def area(self):
print("Calculating area...")
return self.width * self.height
rect = Rectangle(3, 5)
```
Given the `rect` object, we want to evaluate whatever expressions we can in this source code:
```python
source = "(rect.width, rect.height, rect.area)"
```
This library works with the AST, so let's parse the source code and peek inside:
```python
import ast
tree = ast.parse(source)
the_tuple = tree.body[0].value
for node in the_tuple.elts:
print(ast.dump(node))
```
Output:
```python
Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load())
Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load())
Attribute(value=Name(id='rect', ctx=Load()), attr='area', ctx=Load())
```
Now to actually use the library. First construct an Evaluator:
```python
from pure_eval import Evaluator
evaluator = Evaluator({"rect": rect})
```
The argument to `Evaluator` should be a mapping from variable names to their values. Or if you have access to the stack frame where `rect` is defined, you can instead use:
```python
evaluator = Evaluator.from_frame(frame)
```
Now to evaluate some nodes, using `evaluator[node]`:
```python
print("rect.width:", evaluator[the_tuple.elts[0]])
print("rect:", evaluator[the_tuple.elts[0].value])
```
Output:
```
rect.width: 3
rect: <__main__.Rectangle object at 0x105b0dd30>
```
OK, but you could have done the same thing with `eval`. The useful part is that it will refuse to evaluate the property `rect.area` because that would trigger unknown code. If we try, it'll raise a `CannotEval` exception.
```python
from pure_eval import CannotEval
try:
print("rect.area:", evaluator[the_tuple.elts[2]]) # fails
except CannotEval as e:
print(e) # prints CannotEval
```
To find all the expressions that can be evaluated in a tree:
```python
for node, value in evaluator.find_expressions(tree):
print(ast.dump(node), value)
```
Output:
```python
Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load()) 3
Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load()) 5
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
```
Note that this includes `rect` three times, once for each appearance in the source code. Since all these nodes are equivalent, we can group them together:
```python
from pure_eval import group_expressions
for nodes, values in group_expressions(evaluator.find_expressions(tree)):
print(len(nodes), "nodes with value:", values)
```
Output:
```
1 nodes with value: 3
1 nodes with value: 5
3 nodes with value: <__main__.Rectangle object at 0x10d374d30>
```
If we want to list all the expressions in a tree, we may want to filter out certain expressions whose values are obvious. For example, suppose we have a function `foo`:
```python
def foo():
pass
```
If we refer to `foo` by its name as usual, then that's not interesting:
```python
from pure_eval import is_expression_interesting
node = ast.parse('foo').body[0].value
print(ast.dump(node))
print(is_expression_interesting(node, foo))
```
Output:
```python
Name(id='foo', ctx=Load())
False
```
But if we refer to it by a different name, then it's interesting:
```python
node = ast.parse('bar').body[0].value
print(ast.dump(node))
print(is_expression_interesting(node, foo))
```
Output:
```python
Name(id='bar', ctx=Load())
True
```
In general `is_expression_interesting` returns False for the following values:
- Literals (e.g. `123`, `'abc'`, `[1, 2, 3]`, `{'a': (), 'b': ([1, 2], [3])}`)
- Variables or attributes whose name is equal to the value's `__name__`, such as `foo` above or `self.foo` if it was a method.
- Builtins (e.g. `len`) referred to by their usual name.
To make things easier, you can combine finding expressions, grouping them, and filtering out the obvious ones with:
```python
evaluator.interesting_expressions_grouped(root)
```
To get the source code of an AST node, I recommend [asttokens](https://github.com/gristlabs/asttokens).
Here's a complete example that brings it all together:
```python
from asttokens import ASTTokens
from pure_eval import Evaluator
source = """
x = 1
d = {x: 2}
y = d[x]
"""
names = {}
exec(source, names)
atok = ASTTokens(source, parse=True)
for nodes, value in Evaluator(names).interesting_expressions_grouped(atok.tree):
print(atok.get_text(nodes[0]), "=", value)
```
Output:
```python
x = 1
d = {1: 2}
y = 2
d[x] = 2
```http://github.com/alexmojaki/pure_evalMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-28901d3c-6848-4905-aeee-d565a7a9b5fepython-pure-eval-helpnoarchf02e8e8e77552c0d0623204b9df4078d40903a3b5886c9f26365bdda7f3e39b6Development documents and examples for pure-eval
[![Build Status](https://travis-ci.org/alexmojaki/pure_eval.svg?branch=master)](https://travis-ci.org/alexmojaki/pure_eval) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/pure_eval/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/pure_eval?branch=master) [![Supports Python versions 3.5+](https://img.shields.io/pypi/pyversions/pure_eval.svg)](https://pypi.python.org/pypi/pure_eval)
This is a Python package that lets you safely evaluate certain AST nodes without triggering arbitrary code that may have unwanted side effects.
It can be installed from PyPI:
pip install pure_eval
To demonstrate usage, suppose we have an object defined as follows:
```python
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
@property
def area(self):
print("Calculating area...")
return self.width * self.height
rect = Rectangle(3, 5)
```
Given the `rect` object, we want to evaluate whatever expressions we can in this source code:
```python
source = "(rect.width, rect.height, rect.area)"
```
This library works with the AST, so let's parse the source code and peek inside:
```python
import ast
tree = ast.parse(source)
the_tuple = tree.body[0].value
for node in the_tuple.elts:
print(ast.dump(node))
```
Output:
```python
Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load())
Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load())
Attribute(value=Name(id='rect', ctx=Load()), attr='area', ctx=Load())
```
Now to actually use the library. First construct an Evaluator:
```python
from pure_eval import Evaluator
evaluator = Evaluator({"rect": rect})
```
The argument to `Evaluator` should be a mapping from variable names to their values. Or if you have access to the stack frame where `rect` is defined, you can instead use:
```python
evaluator = Evaluator.from_frame(frame)
```
Now to evaluate some nodes, using `evaluator[node]`:
```python
print("rect.width:", evaluator[the_tuple.elts[0]])
print("rect:", evaluator[the_tuple.elts[0].value])
```
Output:
```
rect.width: 3
rect: <__main__.Rectangle object at 0x105b0dd30>
```
OK, but you could have done the same thing with `eval`. The useful part is that it will refuse to evaluate the property `rect.area` because that would trigger unknown code. If we try, it'll raise a `CannotEval` exception.
```python
from pure_eval import CannotEval
try:
print("rect.area:", evaluator[the_tuple.elts[2]]) # fails
except CannotEval as e:
print(e) # prints CannotEval
```
To find all the expressions that can be evaluated in a tree:
```python
for node, value in evaluator.find_expressions(tree):
print(ast.dump(node), value)
```
Output:
```python
Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load()) 3
Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load()) 5
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
```
Note that this includes `rect` three times, once for each appearance in the source code. Since all these nodes are equivalent, we can group them together:
```python
from pure_eval import group_expressions
for nodes, values in group_expressions(evaluator.find_expressions(tree)):
print(len(nodes), "nodes with value:", values)
```
Output:
```
1 nodes with value: 3
1 nodes with value: 5
3 nodes with value: <__main__.Rectangle object at 0x10d374d30>
```
If we want to list all the expressions in a tree, we may want to filter out certain expressions whose values are obvious. For example, suppose we have a function `foo`:
```python
def foo():
pass
```
If we refer to `foo` by its name as usual, then that's not interesting:
```python
from pure_eval import is_expression_interesting
node = ast.parse('foo').body[0].value
print(ast.dump(node))
print(is_expression_interesting(node, foo))
```
Output:
```python
Name(id='foo', ctx=Load())
False
```
But if we refer to it by a different name, then it's interesting:
```python
node = ast.parse('bar').body[0].value
print(ast.dump(node))
print(is_expression_interesting(node, foo))
```
Output:
```python
Name(id='bar', ctx=Load())
True
```
In general `is_expression_interesting` returns False for the following values:
- Literals (e.g. `123`, `'abc'`, `[1, 2, 3]`, `{'a': (), 'b': ([1, 2], [3])}`)
- Variables or attributes whose name is equal to the value's `__name__`, such as `foo` above or `self.foo` if it was a method.
- Builtins (e.g. `len`) referred to by their usual name.
To make things easier, you can combine finding expressions, grouping them, and filtering out the obvious ones with:
```python
evaluator.interesting_expressions_grouped(root)
```
To get the source code of an AST node, I recommend [asttokens](https://github.com/gristlabs/asttokens).
Here's a complete example that brings it all together:
```python
from asttokens import ASTTokens
from pure_eval import Evaluator
source = """
x = 1
d = {x: 2}
y = d[x]
"""
names = {}
exec(source, names)
atok = ASTTokens(source, parse=True)
for nodes, value in Evaluator(names).interesting_expressions_grouped(atok.tree):
print(atok.get_text(nodes[0]), "=", value)
```
Output:
```python
x = 1
d = {1: 2}
y = 2
d[x] = 2
```http://github.com/alexmojaki/pure_evalMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-d6169a16-f26e-4aff-8ad9-07585da931d8python-pure-eval-0.2.2-1.src.rpmpython-pure-eval-helpnoarch07cc56ddc1203d462a6394563770e7e2c18c6aae44ad30d5b5fe39d7e0276569Development documents and examples for pure-eval
[![Build Status](https://travis-ci.org/alexmojaki/pure_eval.svg?branch=master)](https://travis-ci.org/alexmojaki/pure_eval) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/pure_eval/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/pure_eval?branch=master) [![Supports Python versions 3.5+](https://img.shields.io/pypi/pyversions/pure_eval.svg)](https://pypi.python.org/pypi/pure_eval)
This is a Python package that lets you safely evaluate certain AST nodes without triggering arbitrary code that may have unwanted side effects.
It can be installed from PyPI:
pip install pure_eval
To demonstrate usage, suppose we have an object defined as follows:
```python
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
@property
def area(self):
print("Calculating area...")
return self.width * self.height
rect = Rectangle(3, 5)
```
Given the `rect` object, we want to evaluate whatever expressions we can in this source code:
```python
source = "(rect.width, rect.height, rect.area)"
```
This library works with the AST, so let's parse the source code and peek inside:
```python
import ast
tree = ast.parse(source)
the_tuple = tree.body[0].value
for node in the_tuple.elts:
print(ast.dump(node))
```
Output:
```python
Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load())
Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load())
Attribute(value=Name(id='rect', ctx=Load()), attr='area', ctx=Load())
```
Now to actually use the library. First construct an Evaluator:
```python
from pure_eval import Evaluator
evaluator = Evaluator({"rect": rect})
```
The argument to `Evaluator` should be a mapping from variable names to their values. Or if you have access to the stack frame where `rect` is defined, you can instead use:
```python
evaluator = Evaluator.from_frame(frame)
```
Now to evaluate some nodes, using `evaluator[node]`:
```python
print("rect.width:", evaluator[the_tuple.elts[0]])
print("rect:", evaluator[the_tuple.elts[0].value])
```
Output:
```
rect.width: 3
rect: <__main__.Rectangle object at 0x105b0dd30>
```
OK, but you could have done the same thing with `eval`. The useful part is that it will refuse to evaluate the property `rect.area` because that would trigger unknown code. If we try, it'll raise a `CannotEval` exception.
```python
from pure_eval import CannotEval
try:
print("rect.area:", evaluator[the_tuple.elts[2]]) # fails
except CannotEval as e:
print(e) # prints CannotEval
```
To find all the expressions that can be evaluated in a tree:
```python
for node, value in evaluator.find_expressions(tree):
print(ast.dump(node), value)
```
Output:
```python
Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load()) 3
Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load()) 5
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
```
Note that this includes `rect` three times, once for each appearance in the source code. Since all these nodes are equivalent, we can group them together:
```python
from pure_eval import group_expressions
for nodes, values in group_expressions(evaluator.find_expressions(tree)):
print(len(nodes), "nodes with value:", values)
```
Output:
```
1 nodes with value: 3
1 nodes with value: 5
3 nodes with value: <__main__.Rectangle object at 0x10d374d30>
```
If we want to list all the expressions in a tree, we may want to filter out certain expressions whose values are obvious. For example, suppose we have a function `foo`:
```python
def foo():
pass
```
If we refer to `foo` by its name as usual, then that's not interesting:
```python
from pure_eval import is_expression_interesting
node = ast.parse('foo').body[0].value
print(ast.dump(node))
print(is_expression_interesting(node, foo))
```
Output:
```python
Name(id='foo', ctx=Load())
False
```
But if we refer to it by a different name, then it's interesting:
```python
node = ast.parse('bar').body[0].value
print(ast.dump(node))
print(is_expression_interesting(node, foo))
```
Output:
```python
Name(id='bar', ctx=Load())
True
```
In general `is_expression_interesting` returns False for the following values:
- Literals (e.g. `123`, `'abc'`, `[1, 2, 3]`, `{'a': (), 'b': ([1, 2], [3])}`)
- Variables or attributes whose name is equal to the value's `__name__`, such as `foo` above or `self.foo` if it was a method.
- Builtins (e.g. `len`) referred to by their usual name.
To make things easier, you can combine finding expressions, grouping them, and filtering out the obvious ones with:
```python
evaluator.interesting_expressions_grouped(root)
```
To get the source code of an AST node, I recommend [asttokens](https://github.com/gristlabs/asttokens).
Here's a complete example that brings it all together:
```python
from asttokens import ASTTokens
from pure_eval import Evaluator
source = """
x = 1
d = {x: 2}
y = d[x]
"""
names = {}
exec(source, names)
atok = ASTTokens(source, parse=True)
for nodes, value in Evaluator(names).interesting_expressions_grouped(atok.tree):
print(atok.get_text(nodes[0]), "=", value)
```
Output:
```python
x = 1
d = {1: 2}
y = 2
d[x] = 2
```http://github.com/alexmojaki/pure_evalMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-bfd2efdb-39f3-4891-bdcb-a97c96937753python-pure-eval-0.2.2-1.src.rpmpython-pure-eval-helpnoarch2800bdfab5d5b720dbe33b302451403c08977d6871e9da2b481db66557739661Development documents and examples for pure-eval
[![Build Status](https://travis-ci.org/alexmojaki/pure_eval.svg?branch=master)](https://travis-ci.org/alexmojaki/pure_eval) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/pure_eval/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/pure_eval?branch=master) [![Supports Python versions 3.5+](https://img.shields.io/pypi/pyversions/pure_eval.svg)](https://pypi.python.org/pypi/pure_eval)
This is a Python package that lets you safely evaluate certain AST nodes without triggering arbitrary code that may have unwanted side effects.
It can be installed from PyPI:
pip install pure_eval
To demonstrate usage, suppose we have an object defined as follows:
```python
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
@property
def area(self):
print("Calculating area...")
return self.width * self.height
rect = Rectangle(3, 5)
```
Given the `rect` object, we want to evaluate whatever expressions we can in this source code:
```python
source = "(rect.width, rect.height, rect.area)"
```
This library works with the AST, so let's parse the source code and peek inside:
```python
import ast
tree = ast.parse(source)
the_tuple = tree.body[0].value
for node in the_tuple.elts:
print(ast.dump(node))
```
Output:
```python
Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load())
Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load())
Attribute(value=Name(id='rect', ctx=Load()), attr='area', ctx=Load())
```
Now to actually use the library. First construct an Evaluator:
```python
from pure_eval import Evaluator
evaluator = Evaluator({"rect": rect})
```
The argument to `Evaluator` should be a mapping from variable names to their values. Or if you have access to the stack frame where `rect` is defined, you can instead use:
```python
evaluator = Evaluator.from_frame(frame)
```
Now to evaluate some nodes, using `evaluator[node]`:
```python
print("rect.width:", evaluator[the_tuple.elts[0]])
print("rect:", evaluator[the_tuple.elts[0].value])
```
Output:
```
rect.width: 3
rect: <__main__.Rectangle object at 0x105b0dd30>
```
OK, but you could have done the same thing with `eval`. The useful part is that it will refuse to evaluate the property `rect.area` because that would trigger unknown code. If we try, it'll raise a `CannotEval` exception.
```python
from pure_eval import CannotEval
try:
print("rect.area:", evaluator[the_tuple.elts[2]]) # fails
except CannotEval as e:
print(e) # prints CannotEval
```
To find all the expressions that can be evaluated in a tree:
```python
for node, value in evaluator.find_expressions(tree):
print(ast.dump(node), value)
```
Output:
```python
Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load()) 3
Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load()) 5
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
```
Note that this includes `rect` three times, once for each appearance in the source code. Since all these nodes are equivalent, we can group them together:
```python
from pure_eval import group_expressions
for nodes, values in group_expressions(evaluator.find_expressions(tree)):
print(len(nodes), "nodes with value:", values)
```
Output:
```
1 nodes with value: 3
1 nodes with value: 5
3 nodes with value: <__main__.Rectangle object at 0x10d374d30>
```
If we want to list all the expressions in a tree, we may want to filter out certain expressions whose values are obvious. For example, suppose we have a function `foo`:
```python
def foo():
pass
```
If we refer to `foo` by its name as usual, then that's not interesting:
```python
from pure_eval import is_expression_interesting
node = ast.parse('foo').body[0].value
print(ast.dump(node))
print(is_expression_interesting(node, foo))
```
Output:
```python
Name(id='foo', ctx=Load())
False
```
But if we refer to it by a different name, then it's interesting:
```python
node = ast.parse('bar').body[0].value
print(ast.dump(node))
print(is_expression_interesting(node, foo))
```
Output:
```python
Name(id='bar', ctx=Load())
True
```
In general `is_expression_interesting` returns False for the following values:
- Literals (e.g. `123`, `'abc'`, `[1, 2, 3]`, `{'a': (), 'b': ([1, 2], [3])}`)
- Variables or attributes whose name is equal to the value's `__name__`, such as `foo` above or `self.foo` if it was a method.
- Builtins (e.g. `len`) referred to by their usual name.
To make things easier, you can combine finding expressions, grouping them, and filtering out the obvious ones with:
```python
evaluator.interesting_expressions_grouped(root)
```
To get the source code of an AST node, I recommend [asttokens](https://github.com/gristlabs/asttokens).
Here's a complete example that brings it all together:
```python
from asttokens import ASTTokens
from pure_eval import Evaluator
source = """
x = 1
d = {x: 2}
y = d[x]
"""
names = {}
exec(source, names)
atok = ASTTokens(source, parse=True)
for nodes, value in Evaluator(names).interesting_expressions_grouped(atok.tree):
print(atok.get_text(nodes[0]), "=", value)
```
Output:
```python
x = 1
d = {1: 2}
y = 2
d[x] = 2
```http://github.com/alexmojaki/pure_evalMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-28901d3c-6848-4905-aeee-d565a7a9b5fepython-pure-eval-0.2.2-1.src.rpmpython-py3dnssrcabde532aae49c831461260caa4dfb8bb758b814ea61a548c5ae5a3ceb5ef6739Python 3 DNS libraryPython 3 DNS library:https://launchpad.net/py3dnsPython LicenseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-f77559c1-b12e-4852-a0dc-e078212b95ffpython-py3dnssrcb97026c49115232118e8a56ccaa54e38585be7d20ace55bffcf68a7a1a4b2f9ePython 3 DNS libraryPython 3 DNS library:https://launchpad.net/py3dnsPython LicenseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-9c02a247-0147-4ca0-919c-78dc30b480eepython-py3dns-helpnoarchaba16eafabdb28a71afba663d0e106e62ba6a39ce670de4387136e42c69126ebDevelopment documents and examples for py3dnsPython 3 DNS library:https://launchpad.net/py3dnsPython LicenseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-f77559c1-b12e-4852-a0dc-e078212b95ffpython-py3dns-3.2.1-1.src.rpmpython-py3dns-helpnoarch73ef5728590da9cf5547a42f8a49b9b835332816fea7ac52d0cfc513d170d725Development documents and examples for py3dnsPython 3 DNS library:https://launchpad.net/py3dnsPython LicenseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-9c02a247-0147-4ca0-919c-78dc30b480eepython-py3dns-3.2.1-1.src.rpmpython-pyLibravatarsrc9f17934eb4e3612831f65134b83b77613812f6139ec12bf3eb33eca80a4ca77fPython module for LibravatarPyLibravatar is an easy way to make use of the federated Libravatar_ avatar
hosting service from within your Python applications.https://launchpad.net/pylibravatarMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-00bc5c01-9806-42b7-a1b2-fff4e2cf988epython-pyLibravatarsrc78c9bfdf4e1116cb5e4604ad8e94439ad5787542296246d59b493d55a710d58ePython module for LibravatarPyLibravatar is an easy way to make use of the federated Libravatar_ avatar
hosting service from within your Python applications.https://launchpad.net/pylibravatarMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-5e08ea01-46cf-4044-aae1-042c308fbdeepython-pyLibravatarsrcd0ec7c784366bc571d0b4f4bd6535bf45b54e63d76172dcd232a0e6bdffa5e76Python module for LibravatarPyLibravatar is an easy way to make use of the federated Libravatar_ avatar
hosting service from within your Python applications.https://launchpad.net/pylibravatarMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-d3e51e38-580b-42c2-ad42-81a7d29fe97apython-pyLibravatarsrcc0c3a767dc749be5bd103d79060c52817627ddadc8d1e7e3f8f145a39a6b782fPython module for LibravatarPyLibravatar is an easy way to make use of the federated Libravatar_ avatar
hosting service from within your Python applications.https://launchpad.net/pylibravatarMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-87f0e2db-01d9-4996-a551-13de6dc2e200python-pygalsrc3e8ff12cb253bf3464999d53511b91a509501a3349467bae52af0c96df384199A Python svg graph plotting libraryA Python svg graph plotting library.https://www.pygal.org/LGPL-3.0+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-0800d4a9-d6af-4770-96e7-9ee55cf1965cpython-pygalsrcb37cd580c9ca8bcd537123aca433859e40b11324e44445d0eca9b189dc268ccbA Python svg graph plotting libraryA Python svg graph plotting library.https://www.pygal.org/LGPL-3.0+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-a73bcb1a-fbd3-44ba-8caa-c7e028a1ea8bpython-pygal-helpnoarcha61f39a723f5856bb70bf6405c4235bb5d43538179e2f93b373611484f4ee9beDevelopment documents and examples for pygalhttps://www.pygal.org/LGPL-3.0+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-0800d4a9-d6af-4770-96e7-9ee55cf1965cpython-pygal-3.0.0-1.src.rpmpython-pygal-helpnoarch01acf4adab253a079182c7917a5ba0c5b6c560631675adcb13767cbcf6a5a352Development documents and examples for pygalhttps://www.pygal.org/LGPL-3.0+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-a73bcb1a-fbd3-44ba-8caa-c7e028a1ea8bpython-pygal-3.0.0-1.src.rpmpython-pygit2srcc82489a96a6ba7854139d666ceb31ba0c100839160a5ef66dc432c0177dbe4d1Python bindings for libgit2.- Documentation - http://www.pygit2.org/
- Install - http://www.pygit2.org/install.html
- Download - https://pypi.python.org/pypi/pygit2
- Source code and issue tracker - https://github.com/libgit2/pygit2
- Changelog - https://github.com/libgit2/pygit2/blob/master/CHANGELOG.rst
- Authors - https://github.com/libgit2/pygit2/blob/master/AUTHORS.rsthttps://github.com/libgit2/pygit2GPLv2 with linking exceptionopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-4acce24f-a362-464e-8420-7a87eca38abfpython-pygit2srcbccd3087f7f49d56843d3f9ece1f124ffe711c04add34609601d5ddcb36ffbdcPython bindings for libgit2.- Documentation - http://www.pygit2.org/
- Install - http://www.pygit2.org/install.html
- Download - https://pypi.python.org/pypi/pygit2
- Source code and issue tracker - https://github.com/libgit2/pygit2
- Changelog - https://github.com/libgit2/pygit2/blob/master/CHANGELOG.rst
- Authors - https://github.com/libgit2/pygit2/blob/master/AUTHORS.rsthttps://github.com/libgit2/pygit2GPLv2 with linking exceptionopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-b1276125-1890-411d-880b-d8af2f7f5ed9python-pygit2-debuginfox86_649d042cd3ded6a75375b3bea004bdd60eea31ac96ab07d64762ad65df50e7bf2bDebug information for package python-pygit2This package provides debug information for package python-pygit2.
Debug information is useful when developing applications that use this
package or when debugging this package.https://github.com/libgit2/pygit2GPLv2 with linking exceptionopenEuler Copr - user mywaaagh_adminDevelopment/Debugresalloc-4acce24f-a362-464e-8420-7a87eca38abfpython-pygit2-1.7.1-1.src.rpmpython-pygit2-debuginfox86_64e4a7feeeb844328029ef6aa5b664bed47d5de69ef679bbc7904449d82cd19516Debug information for package python-pygit2This package provides debug information for package python-pygit2.
Debug information is useful when developing applications that use this
package or when debugging this package.https://github.com/libgit2/pygit2GPLv2 with linking exceptionopenEuler Copr - user mywaaagh_adminDevelopment/Debugresalloc-b1276125-1890-411d-880b-d8af2f7f5ed9python-pygit2-1.7.1-1.src.rpmpython-pygit2-debugsourcex86_641f136772e91776cd3fac232b05a778b09dea56cf6a7c959e9f5a55ef95c642a9Debug sources for package python-pygit2This package provides debug sources for package python-pygit2.
Debug sources are useful when developing applications that use this
package or when debugging this package.https://github.com/libgit2/pygit2GPLv2 with linking exceptionopenEuler Copr - user mywaaagh_adminDevelopment/Debugresalloc-4acce24f-a362-464e-8420-7a87eca38abfpython-pygit2-1.7.1-1.src.rpmpython-pygit2-debugsourcex86_64eed291ab62021df20f116dc23fdc98b24fcaa3b6a011ad5c7dbf3db86424fad9Debug sources for package python-pygit2This package provides debug sources for package python-pygit2.
Debug sources are useful when developing applications that use this
package or when debugging this package.https://github.com/libgit2/pygit2GPLv2 with linking exceptionopenEuler Copr - user mywaaagh_adminDevelopment/Debugresalloc-b1276125-1890-411d-880b-d8af2f7f5ed9python-pygit2-1.7.1-1.src.rpmpython-pygit2-helpx86_64e77bf6b3fd157a00a26a2f18f15c96409ba5621f603f8538d7f220ed68a697a4Development documents and examples for pygit2- Documentation - http://www.pygit2.org/
- Install - http://www.pygit2.org/install.html
- Download - https://pypi.python.org/pypi/pygit2
- Source code and issue tracker - https://github.com/libgit2/pygit2
- Changelog - https://github.com/libgit2/pygit2/blob/master/CHANGELOG.rst
- Authors - https://github.com/libgit2/pygit2/blob/master/AUTHORS.rsthttps://github.com/libgit2/pygit2GPLv2 with linking exceptionopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-4acce24f-a362-464e-8420-7a87eca38abfpython-pygit2-1.7.1-1.src.rpmpython-pygit2-helpx86_642db7467ae7a2a34fa381bcea42541182e0d41816e844adbd3ec3cb7d89dfe9a4Development documents and examples for pygit2- Documentation - http://www.pygit2.org/
- Install - http://www.pygit2.org/install.html
- Download - https://pypi.python.org/pypi/pygit2
- Source code and issue tracker - https://github.com/libgit2/pygit2
- Changelog - https://github.com/libgit2/pygit2/blob/master/CHANGELOG.rst
- Authors - https://github.com/libgit2/pygit2/blob/master/AUTHORS.rsthttps://github.com/libgit2/pygit2GPLv2 with linking exceptionopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-b1276125-1890-411d-880b-d8af2f7f5ed9python-pygit2-1.7.1-1.src.rpmpython-pytest-xdistsrcf5bb6a9a60fafbbbc116939f74422051c2b9a3ac74a0639471f8aed7641aa0e4pytest xdist plugin for distributed testing and loop-on-failing modespytest xdist plugin for distributed testing and loop-on-failing modes.https://github.com/pytest-dev/pytest-xdistMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-2d779b62-55d6-403f-b98d-cf7e210c1f62python-responsessrcf3826ceca20fa0a8e4bffb3c343da23ea11459d71e9a54448526bf8ed0f7b27fA utility library for mocking out the `requests` Python library.A utility library for mocking out the requests Python library.https://github.com/getsentry/responsesApache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-6ae81ef6-8052-4f25-882b-07766d63f014python-responses-helpnoarch25c190989de0bddeaaec3d1c149c4957dd710fbf582cd9207bcd462771c8e080A utility library for mocking out the `requests` Python library.A utility library for mocking out the requests Python library.https://github.com/getsentry/responsesApache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-6ae81ef6-8052-4f25-882b-07766d63f014python-responses-0.18.0-1.src.rpmpython-retasksrca2922d21d9f114411cef2b45e7f068d3d512c9b73c4124d132c3eb345f911da7Python module to create and manage distributed task queuesPython module to create and manage distributed task queues using redis.http://retask.readthedocs.org/en/latest/index.htmlMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-100e6971-a6f4-4810-979b-d8cf3f13bc08python-richsrc108b509e0a8a137181c0e9ec1727c85b6bb3ae1104a3c232f3211efe7766856dRender rich text, tables, progress bars, syntax highlighting, markdown and more to the terminalRich is a Python library for rich text and beautiful formatting in the terminalhttps://github.com/willmcgugan/richMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-fe180c04-616f-49e9-88bd-508b3843fbe3python-richsrcd3d3bb505f830ff46c9532d99b39769474a3573a4a9454f698cbdb5c0632fe4eRender rich text, tables, progress bars, syntax highlighting, markdown and more to the terminalRich is a Python library for rich text and beautiful formatting in the terminalhttps://github.com/willmcgugan/richMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-a2376eb7-ee08-44ac-a4a4-1d442fcd750cpython-rich-helpnoarch802469cd96e9973733c1f23d9724d938f86bd696948e2000c0d27509d44499a2Development documents and examples for richRich is a Python library for rich text and beautiful formatting in the terminalhttps://github.com/willmcgugan/richMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-fe180c04-616f-49e9-88bd-508b3843fbe3python-rich-12.6.0-1.src.rpmpython-rich-helpnoarch68224e4547f4f82a9240c222b96ef87333020fab6a57bcae1ad6a3498b21ada0Development documents and examples for richRich is a Python library for rich text and beautiful formatting in the terminalhttps://github.com/willmcgugan/richMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-a2376eb7-ee08-44ac-a4a4-1d442fcd750cpython-rich-12.6.0-1.src.rpmpython-rpmautospecsrc92281c631c4afa40f3aa6ebf806df24087de8dbc01fff6a7ba81b6f1962b260cPackage and CLI tool to generate release fields and changelogsA package and CLI tool to generate RPM release fields and changelogs.https://pagure.io/fedora-infra/rpmautospecMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-c193af30-d8cf-41b3-964b-b57181e178a6python-rpmautospecsrc948120113b22d9b947dac2d29590c268e84bed04bd3419101fa8293ce8075546Package and CLI tool to generate release fields and changelogsA package and CLI tool to generate RPM release fields and changelogs.https://pagure.io/fedora-infra/rpmautospecMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-f4072875-c26a-4cd8-abb4-0b60ae8fd4e9python-stack-datasrc5e537222e668cb75f43efc29b8c3584a0feb6ba567e97648d6549250cd4a7248Extract data from python stack frames and tracebacks for informative displays 6 | for i in range(5):
7 | row = []
8 | result.append(row)
--> 9 | print_stack()
10 | for j in range(5):
```
The code for `print_stack()` is fairly self-explanatory. If you want to learn more details about a particular class or method I suggest looking through some docstrings. `FrameInfo` is a class that accepts either a frame or a traceback object and provides a bunch of nice attributes and properties (which are cached so you don't need to worry about performance). In particular `frame_info.lines` is a list of `Line` objects. `line.render()` returns the source code of that line suitable for display. Without any arguments it simply strips any common leading indentation. Later on we'll see a more powerful use for it.
You can see that `frame_info.lines` includes some lines of surrounding context. By default it includes 3 pieces of context before the main line and 1 piece after. We can configure the amount of context by passing options:
```python
options = stack_data.Options(before=1, after=0)
frame_info = stack_data.FrameInfo(frame, options)
```
Then the output looks like:
```http://github.com/alexmojaki/stack_dataMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-6068844b-5720-4efc-8517-fc1f11eadcb6python-stack-datasrcc197cce6f14924ab8661848007f5a29a50604d06a913ea5d5d891414b9194245Extract data from python stack frames and tracebacks for informative displays 6 | for i in range(5):
7 | row = []
8 | result.append(row)
--> 9 | print_stack()
10 | for j in range(5):
```
The code for `print_stack()` is fairly self-explanatory. If you want to learn more details about a particular class or method I suggest looking through some docstrings. `FrameInfo` is a class that accepts either a frame or a traceback object and provides a bunch of nice attributes and properties (which are cached so you don't need to worry about performance). In particular `frame_info.lines` is a list of `Line` objects. `line.render()` returns the source code of that line suitable for display. Without any arguments it simply strips any common leading indentation. Later on we'll see a more powerful use for it.
You can see that `frame_info.lines` includes some lines of surrounding context. By default it includes 3 pieces of context before the main line and 1 piece after. We can configure the amount of context by passing options:
```python
options = stack_data.Options(before=1, after=0)
frame_info = stack_data.FrameInfo(frame, options)
```
Then the output looks like:
```http://github.com/alexmojaki/stack_dataMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-44fa049c-439e-4037-af41-f0f230cb78a2python-stack-datasrcfa52057c44ad422178dacb03a8d45a8984f17e22c5098fdfe5065902d32771b0Extract data from python stack frames and tracebacks for informative displays 6 | for i in range(5):
7 | row = []
8 | result.append(row)
--> 9 | print_stack()
10 | for j in range(5):
```
The code for `print_stack()` is fairly self-explanatory. If you want to learn more details about a particular class or method I suggest looking through some docstrings. `FrameInfo` is a class that accepts either a frame or a traceback object and provides a bunch of nice attributes and properties (which are cached so you don't need to worry about performance). In particular `frame_info.lines` is a list of `Line` objects. `line.render()` returns the source code of that line suitable for display. Without any arguments it simply strips any common leading indentation. Later on we'll see a more powerful use for it.
You can see that `frame_info.lines` includes some lines of surrounding context. By default it includes 3 pieces of context before the main line and 1 piece after. We can configure the amount of context by passing options:
```python
options = stack_data.Options(before=1, after=0)
frame_info = stack_data.FrameInfo(frame, options)
```
Then the output looks like:
```http://github.com/alexmojaki/stack_dataMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-62785097-dbd7-4d64-b4f4-7feaf3f3efb7python-stack-datasrc67ba13a32f490c9a71c3a0bdf3a2eb9c6fb3cd96d9ac86c7b73d5ddfc7151ec1Extract data from python stack frames and tracebacks for informative displays 6 | for i in range(5):
7 | row = []
8 | result.append(row)
--> 9 | print_stack()
10 | for j in range(5):
```
The code for `print_stack()` is fairly self-explanatory. If you want to learn more details about a particular class or method I suggest looking through some docstrings. `FrameInfo` is a class that accepts either a frame or a traceback object and provides a bunch of nice attributes and properties (which are cached so you don't need to worry about performance). In particular `frame_info.lines` is a list of `Line` objects. `line.render()` returns the source code of that line suitable for display. Without any arguments it simply strips any common leading indentation. Later on we'll see a more powerful use for it.
You can see that `frame_info.lines` includes some lines of surrounding context. By default it includes 3 pieces of context before the main line and 1 piece after. We can configure the amount of context by passing options:
```python
options = stack_data.Options(before=1, after=0)
frame_info = stack_data.FrameInfo(frame, options)
```
Then the output looks like:
```http://github.com/alexmojaki/stack_dataMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-ae8d7b52-e865-43b2-b6ef-ba1ad248b58dpython-stack-data-helpnoarchd3531c0c4b1739a832a653a953f7cec00b128a47e047d0e95257d709359d6be6Development documents and examples for stack-data 6 | for i in range(5):
7 | row = []
8 | result.append(row)
--> 9 | print_stack()
10 | for j in range(5):
```
The code for `print_stack()` is fairly self-explanatory. If you want to learn more details about a particular class or method I suggest looking through some docstrings. `FrameInfo` is a class that accepts either a frame or a traceback object and provides a bunch of nice attributes and properties (which are cached so you don't need to worry about performance). In particular `frame_info.lines` is a list of `Line` objects. `line.render()` returns the source code of that line suitable for display. Without any arguments it simply strips any common leading indentation. Later on we'll see a more powerful use for it.
You can see that `frame_info.lines` includes some lines of surrounding context. By default it includes 3 pieces of context before the main line and 1 piece after. We can configure the amount of context by passing options:
```python
options = stack_data.Options(before=1, after=0)
frame_info = stack_data.FrameInfo(frame, options)
```
Then the output looks like:
```http://github.com/alexmojaki/stack_dataMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-44fa049c-439e-4037-af41-f0f230cb78a2python-stack-data-0.6.2-1.src.rpmpython-stack-data-helpnoarchee2cf889856c6e74392d64b2bf35b7cbd081f818cd67be093f72aa2bdfb32e8dDevelopment documents and examples for stack-data 6 | for i in range(5):
7 | row = []
8 | result.append(row)
--> 9 | print_stack()
10 | for j in range(5):
```
The code for `print_stack()` is fairly self-explanatory. If you want to learn more details about a particular class or method I suggest looking through some docstrings. `FrameInfo` is a class that accepts either a frame or a traceback object and provides a bunch of nice attributes and properties (which are cached so you don't need to worry about performance). In particular `frame_info.lines` is a list of `Line` objects. `line.render()` returns the source code of that line suitable for display. Without any arguments it simply strips any common leading indentation. Later on we'll see a more powerful use for it.
You can see that `frame_info.lines` includes some lines of surrounding context. By default it includes 3 pieces of context before the main line and 1 piece after. We can configure the amount of context by passing options:
```python
options = stack_data.Options(before=1, after=0)
frame_info = stack_data.FrameInfo(frame, options)
```
Then the output looks like:
```http://github.com/alexmojaki/stack_dataMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-62785097-dbd7-4d64-b4f4-7feaf3f3efb7python-stack-data-0.6.2-1.src.rpmpython-stack-data-helpnoarchbed0c727e68b40e30f56bc8391d0999cc9e5f00d4c3f9c6506477406d62dfb18Development documents and examples for stack-data 6 | for i in range(5):
7 | row = []
8 | result.append(row)
--> 9 | print_stack()
10 | for j in range(5):
```
The code for `print_stack()` is fairly self-explanatory. If you want to learn more details about a particular class or method I suggest looking through some docstrings. `FrameInfo` is a class that accepts either a frame or a traceback object and provides a bunch of nice attributes and properties (which are cached so you don't need to worry about performance). In particular `frame_info.lines` is a list of `Line` objects. `line.render()` returns the source code of that line suitable for display. Without any arguments it simply strips any common leading indentation. Later on we'll see a more powerful use for it.
You can see that `frame_info.lines` includes some lines of surrounding context. By default it includes 3 pieces of context before the main line and 1 piece after. We can configure the amount of context by passing options:
```python
options = stack_data.Options(before=1, after=0)
frame_info = stack_data.FrameInfo(frame, options)
```
Then the output looks like:
```http://github.com/alexmojaki/stack_dataMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-ae8d7b52-e865-43b2-b6ef-ba1ad248b58dpython-stack-data-0.6.2-1.src.rpmpython-templated-dictionarysrcfbfddf971da3eb53b2b8f95868c3c362e9480f8edb0dc1f8f53c16a32e0c3e7cDictionary with Jinja2 expansionDictionary where __getitem__() is run through Jinja2 template.https://github.com/xsuchy/templated-dictionaryGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-491e1250-c171-4c4a-952b-8f6f33eca728python-templated-dictionary-helpnoarch25d562eb666c33e21f4e40ab49a8d8ae7b04d531b94bd9934c345075b169c531Development documents and examples for templated-dictionaryDictionary where __getitem__() is run through Jinja2 template.https://github.com/xsuchy/templated-dictionaryGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-491e1250-c171-4c4a-952b-8f6f33eca728python-templated-dictionary-1.2-1.src.rpmpython3-Authlibnoarch1709539342486e75bcda9d1312bbae7885a6287921e4c4d15e905e831994a5cfThe ultimate Python library in building OAuth and OpenID Connect servers and clients.The ultimate Python library in building OAuth and OpenID Connect servers.
JWS, JWK, JWA, JWT are included.https://authlib.org/BSD 3-Clause LicenseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-c5a41d83-54dd-4344-aadc-e269cb329b77python-Authlib-1.2.0-1.src.rpmpython3-CCColUtilsx86_6402384c6df4c129676de97a56ecf48451eb6703c4556b8ce1efb9cd2a86dc3e1eKerberos5 Credential Cache Collection UtilitiesKerberos5 Credential Cache Collection Utilities.https://pagure.io/cccolutilsGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-5b8e6dc8-f864-4cee-ac08-86006acc0181python-CCColUtils-1.5-2.src.rpmpython3-CCColUtilsx86_64e967a679b4c6df921e3df6402bb1a69261957c9791054963ff18f3a2b1a7db25Kerberos5 Credential Cache Collection UtilitiesKerberos5 Credential Cache Collection Utilities.https://pagure.io/cccolutilsGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-2ab5f99f-db9a-40a8-815d-fcef753b8678python-CCColUtils-1.5-2.src.rpmpython3-Flask-Cachingnoarch95a45cfc81c50078e516153b85a82654a947d2d07a9af57da932ba6080653977Adds caching support to Flask applications.A fork of the `Flask-cache`_ extension which adds easy cache support to Flask.https://github.com/pallets-eco/flask-cachingBSDopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-cc6881b1-b283-4aa7-8a55-facad512af8fpython-Flask-Caching-2.0.2-1.src.rpmpython3-Flask-OpenIDnoarch2ff15712ecb90de297795cccaedcfbdbc128b90cac2fc0bf8bbc1f71b536cd91OpenID support for FlaskFlask-OpenID adds openid support to flask applicationshttp://github.com/mitsuhiko/flask-openid/BSDopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-1b7b3fab-7f39-40b7-a509-ab87de0c1fe6python-Flask-OpenID-1.3.0-2.src.rpmpython3-Flask-WTFnoarch254f74fe15073f5a3521f5749464cef82b3ac8b08a7e30899cfb22f77b9ffdabForm rendering, validation, and CSRF protection for Flask with WTForms.Simple integration of Flask and WTForms, including CSRF, file upload,
and reCAPTCHA.https://github.com/wtforms/flask-wtf/BSD-3-ClauseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-d888d7d0-8024-4288-9cae-6374bc69eb39python-Flask-WTF-1.1.1-1.src.rpmpython3-XStatic-Bootstrap-SCSSnoarch2373a292ead2ce2798e7823d37dbd0cec9a748ef26f26f4fd1d27d84ce798768Bootstrap-SCSS 3.4.1 (XStatic packaging standard)Bootstrap style library packaged for setuptools (easy_install) / pip.
This package is intended to be used by **any** project that needs these files.
It intentionally does **not** provide any extra code except some metadata
**nor** has any extra requirements. You MAY use some minimal support code from
the XStatic base package, if you like.
You can find more info about the xstatic packaging way in the package `XStatic`.https://github.com/twbs/bootstrap-sassMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-bb57607f-37c1-40f8-9644-3f9bf6760dd2python-XStatic-Bootstrap-SCSS-3.4.1.0-1.src.rpmpython3-XStatic-DataTablesnoarch46e9671ba92b021e7f32766102ac9a6051f6fb8f65139daa03c932cc804b1cd7DataTables 1.10.15 (XStatic packaging standard)The DataTables plugin for jQuery packaged for setuptools (easy_install) / pip.
This package is intended to be used by **any** project that needs these files.
It intentionally does **not** provide any extra code except some metadata
**nor** has any extra requirements. You MAY use some minimal support code from
the XStatic base package, if you like.
You can find more info about the xstatic packaging way in the package `XStatic`.http://www.datatables.net(same as DataTables)openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-2211ae11-4a47-4de0-985f-8572bd272b91python-XStatic-DataTables-1.10.15.1-1.src.rpmpython3-XStatic-Patternflynoarchfa17bc663864c22d1d02b1ccfb129fa89188b1df629a97d78ffa41aaf6f67533Patternfly 3.21.0 (XStatic packaging standard)Patternfly style library packaged for setuptools (easy_install) / pip.
This package is intended to be used by **any** project that needs these files.
It intentionally does **not** provide any extra code except some metadata
**nor** has any extra requirements. You MAY use some minimal support code from
the XStatic base package, if you like.
You can find more info about the xstatic packaging way in the package `XStatic`.https://www.patternfly.org/Apache v2openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-0ffb227d-a611-49d0-aa31-de0cd5375e1fpython-XStatic-Patternfly-3.21.0.1-1.src.rpmpython3-argparse-manpagenoarch73e0daa0cca6a33d07425d1504cc16973478d06a96782a8b45071a838d27dcd5Build manual page from python's ArgumentParser object.Automatically build manpage from argparsehttps://github.com/praiskup/argparse-manpageApache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-1a19585b-290d-4d93-920b-9c6a1f4fa8fapython-argparse-manpage-4.3-1.src.rpm/usr/bin/argparse-manpagepython3-asttokensnoarchc25dd725b1e21783e0c3e6e77e985a700959d8abad27ca6d57acac2e9c1dc160Module to annotate Python abstract syntax trees with source code positionsThe asttokens module annotates Python abstract syntax trees (ASTs)
with the positions of tokens and text in the source code that
generated them. This makes it possible for tools that work with
logical AST nodes to find the particular text that resulted in those
nodes, for example for automated refactoring or highlighting.https://github.com/gristlabs/asttokensApache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-190a7a62-f7fa-4620-978d-f70fb52fe6fcpython-asttokens-2.2.1-1.src.rpmpython3-backoffnoarchff725232c0b471b36ed4103103227f59ca972204555a14e3711308a4d4025909Function decoration for backoff and retryThis module provides function decorators which can be used to wrap a\
function such that it will be retried until some condition is met. It\
is meant to be of use when accessing unreliable resources with the\
potential for intermittent failures i.e. network resources and external\
APIs. Somewhat more generally, it may also be of use for dynamically\
polling resources for externally generated content.https://github.com/litl/backoffMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-1089ddd3-e967-4d41-bb78-299c40669ec1python-backoff-2.2.1-1.src.rpmpython3-blessednoarcha36cf9935d31a72809ad6fdd8d884e9d735e8cdbb710941eeb7dc86003a3423cEasy, practical library for making terminal apps, by providing an elegant, well-documented interface to Colors, Keyboard input, and screen Positioning capabilities.Blessed is an easy, practical library for making python terminal appshttps://github.com/jquast/blessedMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-c34b2f0f-1c52-4ee3-941a-1dd5b742153epython-blessed-1.20.0-1.src.rpmpython3-cachelibnoarch08f646e891897df6803b8b5948aff07d4c4f0adfa02c12db1f3273f25aabee4cA collection of cache libraries in the same API interface.A collection of cache libraries in the same API interface. Extracted from werkzeug.https://github.com/pallets-eco/cachelibBSD-3-ClauseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-cba69d7f-b0df-442d-a912-c287598c80a6python-cachelib-0.9.0-1.src.rpmpython3-copr-commonnoarch3dbbb28630ce539884d44128b5f8837d8430a92bc3b38fa3bb624e94001d1ee9Python code used by CoprCOPR is lightweight build system. It allows you to create new project in WebUI,
and submit new builds and COPR will create yum repository from latest builds.
This package contains python code used by other Copr packages. Mostly
useful for developers only.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-d9af21be-03f9-468a-bdc7-c951165162dapython-copr-common-0.19-1.src.rpmpython3-copr-commonnoarch85b4165b39d7be94b5cfdd7b18a6ab1d72afe03f23d09ab1d0e91a117970320aPython code used by CoprCOPR is lightweight build system. It allows you to create new project in WebUI,
and submit new builds and COPR will create yum repository from latest builds.
This package contains python code used by other Copr packages. Mostly
useful for developers only.https://github.com/fedora-copr/coprGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-1451da4a-8d87-4974-99ec-c09fed88cee8python-copr-common-0.19-1.src.rpmpython3-crudininoarche632b258059c912c5ec23a4d9562922f02d3cdf11bc5380fb64acd6c2e36f93dA utility for manipulating ini filescrudini A utility for manipulating ini fileshttp://github.com/pixelb/crudiniGPLv2openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-61b09c15-22be-47aa-8356-a904414e16f1python-crudini-0.9.3-2.src.rpm/usr/bin/crudinipython3-debtcollectornoarchc6bed97bda4796aa41a46441c1e3ba8e95b2425addc4467451cc5518cfad6fe2A collection of Python deprecation patterns and strategies that help you collect your technical debt in a non-destructive manner.A collection of Python deprecation patterns and strategies that help you collect your technical debt in a non-destructive manner.https://docs.openstack.org/debtcollector/latestApache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-4d5d68d3-7dc5-4b0b-b618-fe636254f44epython-debtcollector-2.5.0-1.src.rpmpython3-email-validatornoarch10616812ebdcd920427b48632a20892cb5a79830980770a5bb349937c7bed118A robust email address syntax and deliverability validation library.A robust email address syntax and deliverability validation library for
Python by [Joshua Tauberer](https://joshdata.me).
This library validates that a string is of the form `name@example.com`. This is
the sort of validation you would want for an email-based login form on
a website.
Key features:
* Checks that an email address has the correct syntax --- good for
login forms or other uses related to identifying users.
* Gives friendly error messages when validation fails (appropriate to show
to end users).
* (optionally) Checks deliverability: Does the domain name resolve? And you can override the default DNS resolver.
* Supports internationalized domain names and (optionally)
internationalized local parts, but blocks unsafe characters.
* Normalizes email addresses (super important for internationalized
addresses! see below).
The library is NOT for validation of the To: line in an email message
(e.g. `My Name <my@address.com>`), which
[flanker](https://github.com/mailgun/flanker) is more appropriate for.
And this library does NOT permit obsolete forms of email addresses, so
if you need strict validation against the email specs exactly, use
[pyIsEmail](https://github.com/michaelherold/pyIsEmail).
This library is tested with Python 3.6+ but should work in earlier versions:
[![Build Status](https://app.travis-ci.com/JoshData/python-email-validator.svg?branch=main)](https://app.travis-ci.com/JoshData/python-email-validator)https://github.com/JoshData/python-email-validatorCC0 (copyright waived)openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-ade27af5-a995-4283-90c8-6e414d9ba245python-email-validator-1.3.1-1.src.rpm/usr/bin/email_validatorpython3-executingnoarche6dd221f9d17a071d48e2121786b4d9abf7e4c311cbb78b33185ceb33a8f5a0fGet the currently executing AST node of a frame, and other information
[![Build Status](https://github.com/alexmojaki/executing/workflows/Tests/badge.svg?branch=master)](https://github.com/alexmojaki/executing/actions) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/executing/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/executing?branch=master) [![Supports Python versions 2.7 and 3.5+, including PyPy](https://img.shields.io/pypi/pyversions/executing.svg)](https://pypi.python.org/pypi/executing)
This mini-package lets you get information about what a frame is currently doing, particularly the AST node being executed.
* [Usage](#usage)
* [Getting the AST node](#getting-the-ast-node)
* [Getting the source code of the node](#getting-the-source-code-of-the-node)
* [Getting the `__qualname__` of the current function](#getting-the-__qualname__-of-the-current-function)
* [The Source class](#the-source-class)
* [Installation](#installation)
* [How does it work?](#how-does-it-work)
* [Is it reliable?](#is-it-reliable)
* [Which nodes can it identify?](#which-nodes-can-it-identify)
* [Libraries that use this](#libraries-that-use-this)
```python
import executing
node = executing.Source.executing(frame).node
```
Then `node` will be an AST node (from the `ast` standard library module) or None if the node couldn't be identified (which may happen often and should always be checked).
`node` will always be the same instance for multiple calls with frames at the same point of execution.
If you have a traceback object, pass it directly to `Source.executing()` rather than the `tb_frame` attribute to get the correct node.
For this you will need to separately install the [`asttokens`](https://github.com/gristlabs/asttokens) library, then obtain an `ASTTokens` object:
```python
executing.Source.executing(frame).source.asttokens()
```
or:
```python
executing.Source.for_frame(frame).asttokens()
```
or use one of the convenience methods:
```python
executing.Source.executing(frame).text()
executing.Source.executing(frame).text_range()
```
```python
executing.Source.executing(frame).code_qualname()
```
or:
```python
executing.Source.for_frame(frame).code_qualname(frame.f_code)
```
Everything goes through the `Source` class. Only one instance of the class is created for each filename. Subclassing it to add more attributes on creation or methods is recommended. The classmethods such as `executing` will respect this. See the source code and docstrings for more detail.
pip install executing
If you don't like that you can just copy the file `executing.py`, there are no dependencies (but of course you won't get updates).
Suppose the frame is executing this line:
```python
self.foo(bar.x)
```
and in particular it's currently obtaining the attribute `self.foo`. Looking at the bytecode, specifically `frame.f_code.co_code[frame.f_lasti]`, we can tell that it's loading an attribute, but it's not obvious which one. We can narrow down the statement being executed using `frame.f_lineno` and find the two `ast.Attribute` nodes representing `self.foo` and `bar.x`. How do we find out which one it is, without recreating the entire compiler in Python?
The trick is to modify the AST slightly for each candidate expression and observe the changes in the bytecode instructions. We change the AST to this:
```python
(self.foo ** 'longuniqueconstant')(bar.x)
```
and compile it, and the bytecode will be almost the same but there will be two new instructions:
LOAD_CONST 'longuniqueconstant'
BINARY_POWER
and just before that will be a `LOAD_ATTR` instruction corresponding to `self.foo`. Seeing that it's in the same position as the original instruction lets us know we've found our match.
Yes - if it identifies a node, you can trust that it's identified the correct one. The tests are very thorough - in addition to unit tests which check various situations directly, there are property tests against a large number of files (see the filenames printed in [this build](https://travis-ci.org/alexmojaki/executing/jobs/557970457)) with real code. Specifically, for each file, the tests:
1. Identify as many nodes as possible from all the bytecode instructions in the file, and assert that they are all distinct
2. Find all the nodes that should be identifiable, and assert that they were indeed identified somewhere
In other words, it shows that there is a one-to-one mapping between the nodes and the instructions that can be handled. This leaves very little room for a bug to creep in.
Furthermore, `executing` checks that the instructions compiled from the modified AST exactly match the original code save for a few small known exceptions. This accounts for all the quirks and optimisations in the interpreter.
Currently it works in almost all cases for the following `ast` nodes:
- `Call`, e.g. `self.foo(bar)`
- `Attribute`, e.g. `point.x`
- `Subscript`, e.g. `lst[1]`
- `BinOp`, e.g. `x + y` (doesn't include `and` and `or`)
- `UnaryOp`, e.g. `-n` (includes `not` but only works sometimes)
- `Compare` e.g. `a < b` (not for chains such as `0 < p < 1`)
The plan is to extend to more operations in the future.
- **[`stack_data`](https://github.com/alexmojaki/stack_data)**: Extracts data from stack frames and tracebacks, particularly to display more useful tracebacks than the default. Also uses another related library of mine: **[`pure_eval`](https://github.com/alexmojaki/pure_eval)**.
- **[`futurecoder`](https://futurecoder.io/)**: Highlights the executing node in tracebacks using `executing` via `stack_data`, and provides debugging with `snoop`.
- **[`snoop`](https://github.com/alexmojaki/snoop)**: A feature-rich and convenient debugging library. Uses `executing` to show the operation which caused an exception and to allow the `pp` function to display the source of its arguments.
- **[`heartrate`](https://github.com/alexmojaki/heartrate)**: A simple real time visualisation of the execution of a Python program. Uses `executing` to highlight currently executing operations, particularly in each frame of the stack trace.
- **[`sorcery`](https://github.com/alexmojaki/sorcery)**: Dark magic delights in Python. Uses `executing` to let special callables called spells know where they're being called from.
- **[`IPython`](https://github.com/ipython/ipython/pull/12150)**: Highlights the executing node in tracebacks using `executing` via [`stack_data`](https://github.com/alexmojaki/stack_data).
- **[`icecream`](https://github.com/gruns/icecream)**: 🍦 Sweet and creamy print debugging. Uses `executing` to identify where `ic` is called and print its arguments.
- **[`friendly_traceback`](https://github.com/friendly-traceback/friendly-traceback)**: Uses `stack_data` and `executing` to pinpoint the cause of errors and provide helpful explanations.
- **[`python-devtools`](https://github.com/samuelcolvin/python-devtools)**: Uses `executing` for print debugging similar to `icecream`.
- **[`sentry_sdk`](https://github.com/getsentry/sentry-python)**: Add the integration `sentry_sdk.integrations.executingExecutingIntegration()` to show the function `__qualname__` in each frame in sentry events.
- **[`varname`](https://github.com/pwwang/python-varname)**: Dark magics about variable names in python. Uses `executing` to find where its various magical functions like `varname` and `nameof` are called from.https://github.com/alexmojaki/executingMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-7b327bb2-5ea6-4634-8121-b04075d1af97python-executing-1.2.0-1.src.rpmpython3-executingnoarch6fce725f8adb1db480669b071154c20c01d289040b6d0140e7ab631c1e4388ceGet the currently executing AST node of a frame, and other information
[![Build Status](https://github.com/alexmojaki/executing/workflows/Tests/badge.svg?branch=master)](https://github.com/alexmojaki/executing/actions) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/executing/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/executing?branch=master) [![Supports Python versions 2.7 and 3.5+, including PyPy](https://img.shields.io/pypi/pyversions/executing.svg)](https://pypi.python.org/pypi/executing)
This mini-package lets you get information about what a frame is currently doing, particularly the AST node being executed.
* [Usage](#usage)
* [Getting the AST node](#getting-the-ast-node)
* [Getting the source code of the node](#getting-the-source-code-of-the-node)
* [Getting the `__qualname__` of the current function](#getting-the-__qualname__-of-the-current-function)
* [The Source class](#the-source-class)
* [Installation](#installation)
* [How does it work?](#how-does-it-work)
* [Is it reliable?](#is-it-reliable)
* [Which nodes can it identify?](#which-nodes-can-it-identify)
* [Libraries that use this](#libraries-that-use-this)
```python
import executing
node = executing.Source.executing(frame).node
```
Then `node` will be an AST node (from the `ast` standard library module) or None if the node couldn't be identified (which may happen often and should always be checked).
`node` will always be the same instance for multiple calls with frames at the same point of execution.
If you have a traceback object, pass it directly to `Source.executing()` rather than the `tb_frame` attribute to get the correct node.
For this you will need to separately install the [`asttokens`](https://github.com/gristlabs/asttokens) library, then obtain an `ASTTokens` object:
```python
executing.Source.executing(frame).source.asttokens()
```
or:
```python
executing.Source.for_frame(frame).asttokens()
```
or use one of the convenience methods:
```python
executing.Source.executing(frame).text()
executing.Source.executing(frame).text_range()
```
```python
executing.Source.executing(frame).code_qualname()
```
or:
```python
executing.Source.for_frame(frame).code_qualname(frame.f_code)
```
Everything goes through the `Source` class. Only one instance of the class is created for each filename. Subclassing it to add more attributes on creation or methods is recommended. The classmethods such as `executing` will respect this. See the source code and docstrings for more detail.
pip install executing
If you don't like that you can just copy the file `executing.py`, there are no dependencies (but of course you won't get updates).
Suppose the frame is executing this line:
```python
self.foo(bar.x)
```
and in particular it's currently obtaining the attribute `self.foo`. Looking at the bytecode, specifically `frame.f_code.co_code[frame.f_lasti]`, we can tell that it's loading an attribute, but it's not obvious which one. We can narrow down the statement being executed using `frame.f_lineno` and find the two `ast.Attribute` nodes representing `self.foo` and `bar.x`. How do we find out which one it is, without recreating the entire compiler in Python?
The trick is to modify the AST slightly for each candidate expression and observe the changes in the bytecode instructions. We change the AST to this:
```python
(self.foo ** 'longuniqueconstant')(bar.x)
```
and compile it, and the bytecode will be almost the same but there will be two new instructions:
LOAD_CONST 'longuniqueconstant'
BINARY_POWER
and just before that will be a `LOAD_ATTR` instruction corresponding to `self.foo`. Seeing that it's in the same position as the original instruction lets us know we've found our match.
Yes - if it identifies a node, you can trust that it's identified the correct one. The tests are very thorough - in addition to unit tests which check various situations directly, there are property tests against a large number of files (see the filenames printed in [this build](https://travis-ci.org/alexmojaki/executing/jobs/557970457)) with real code. Specifically, for each file, the tests:
1. Identify as many nodes as possible from all the bytecode instructions in the file, and assert that they are all distinct
2. Find all the nodes that should be identifiable, and assert that they were indeed identified somewhere
In other words, it shows that there is a one-to-one mapping between the nodes and the instructions that can be handled. This leaves very little room for a bug to creep in.
Furthermore, `executing` checks that the instructions compiled from the modified AST exactly match the original code save for a few small known exceptions. This accounts for all the quirks and optimisations in the interpreter.
Currently it works in almost all cases for the following `ast` nodes:
- `Call`, e.g. `self.foo(bar)`
- `Attribute`, e.g. `point.x`
- `Subscript`, e.g. `lst[1]`
- `BinOp`, e.g. `x + y` (doesn't include `and` and `or`)
- `UnaryOp`, e.g. `-n` (includes `not` but only works sometimes)
- `Compare` e.g. `a < b` (not for chains such as `0 < p < 1`)
The plan is to extend to more operations in the future.
- **[`stack_data`](https://github.com/alexmojaki/stack_data)**: Extracts data from stack frames and tracebacks, particularly to display more useful tracebacks than the default. Also uses another related library of mine: **[`pure_eval`](https://github.com/alexmojaki/pure_eval)**.
- **[`futurecoder`](https://futurecoder.io/)**: Highlights the executing node in tracebacks using `executing` via `stack_data`, and provides debugging with `snoop`.
- **[`snoop`](https://github.com/alexmojaki/snoop)**: A feature-rich and convenient debugging library. Uses `executing` to show the operation which caused an exception and to allow the `pp` function to display the source of its arguments.
- **[`heartrate`](https://github.com/alexmojaki/heartrate)**: A simple real time visualisation of the execution of a Python program. Uses `executing` to highlight currently executing operations, particularly in each frame of the stack trace.
- **[`sorcery`](https://github.com/alexmojaki/sorcery)**: Dark magic delights in Python. Uses `executing` to let special callables called spells know where they're being called from.
- **[`IPython`](https://github.com/ipython/ipython/pull/12150)**: Highlights the executing node in tracebacks using `executing` via [`stack_data`](https://github.com/alexmojaki/stack_data).
- **[`icecream`](https://github.com/gruns/icecream)**: 🍦 Sweet and creamy print debugging. Uses `executing` to identify where `ic` is called and print its arguments.
- **[`friendly_traceback`](https://github.com/friendly-traceback/friendly-traceback)**: Uses `stack_data` and `executing` to pinpoint the cause of errors and provide helpful explanations.
- **[`python-devtools`](https://github.com/samuelcolvin/python-devtools)**: Uses `executing` for print debugging similar to `icecream`.
- **[`sentry_sdk`](https://github.com/getsentry/sentry-python)**: Add the integration `sentry_sdk.integrations.executingExecutingIntegration()` to show the function `__qualname__` in each frame in sentry events.
- **[`varname`](https://github.com/pwwang/python-varname)**: Dark magics about variable names in python. Uses `executing` to find where its various magical functions like `varname` and `nameof` are called from.https://github.com/alexmojaki/executingMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-5be11934-1be7-4b03-920f-a310a3fca71fpython-executing-1.2.0-1.src.rpmpython3-flask-whoosheenoarchf86e74113e069137f6e95f50d7cd82f73ef8a6ad71c3e3e32da4a2710bb69eddFlask-SQLAlchemy - Whoosh IntegrationCustomizable Flask - SQLAlchemy - Whoosh integrationhttps://github.com/bkabrda/flask-whoosheeBSD-3-ClauseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-18ad380e-e44e-4345-937f-780491a9623dpython-flask-whooshee-0.8.2-1.src.rpmpython3-html2textnoarchb983f44ae4cbf0bee26d600573444c5c59135c4837997f4288e3ae5d54dfb199Turn HTML into equivalent Markdown-structured text.Convert HTML to Markdown-formatted text.https://github.com/Alir3z4/html2text/GPL-3.0-onlyopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-97f67640-1dfa-4034-8755-117a7ee6ce59python-html2text-2020.1.16-2.src.rpm/usr/bin/html2textpython3-html5-parserx86_64ccf72d48fc7bc5c2672f7c99f5eb59ab90f079785434de21d916d2f23ee35ac8A fast, standards compliant, C based, HTML 5 parser for pythonA fast, standards compliant, C based, HTML 5 parser for pythonhttps://pypi.python.org/pypi/html5-parserASL 2.0 and MITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-17a66066-ef55-4a6e-9c9b-7fdb334c4d86python-html5-parser-0.4.10-1.src.rpmpython3-html5-parserx86_6497d5eabca28c9267126025348a2d863f0e9ee0ce95bd3a1648851339e08e1e2eA fast, standards compliant, C based, HTML 5 parser for pythonA fast, standards compliant, C based, HTML 5 parser for pythonhttps://pypi.python.org/pypi/html5-parserASL 2.0 and MITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-e2ade63d-115f-4a23-bb61-702ae17aa694python-html5-parser-0.4.10-1.src.rpmpython3-ipdbnoarch03f20e144fcce189dd437756c811b922bfadeb215145537a6b4ea1a23c699b14IPython-enabled pdbhttps://github.com/gotcha/ipdbBSDopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-ae4ac1f8-4f54-4306-bd3d-5a7117bc0f25python-ipdb-0.13.13-1.src.rpm/usr/bin/ipdb3python3-ipythonnoarch8017a4807d406a265de0f07cc5e7b184e9b6f3c401129dd60939419c9bb99560IPython: Productive Interactive ComputingIPython provides a rich toolkit to help you make the most out of using Python
interactively. Its main components are:
* A powerful interactive Python shell
* A `Jupyter <https://jupyter.org/>`_ kernel to work with Python code in Jupyter
notebooks and other interactive frontends.
The enhanced interactive Python shells have the following main features:
* Comprehensive object introspection.
* Input history, persistent across sessions.
* Caching of output results during a session with automatically generated
references.
* Extensible tab completion, with support by default for completion of python
variables and keywords, filenames and function keywords.
* Extensible system of 'magic' commands for controlling the environment and
performing many tasks related either to IPython or the operating system.
* A rich configuration system with easy switching between different setups
(simpler than changing $PYTHONSTARTUP environment variables every time).
* Session logging and reloading.
* Extensible syntax processing for special purpose situations.
* Access to the system shell with user-extensible alias system.
* Easily embeddable in other Python programs and GUIs.
* Integrated access to the pdb debugger and the Python profiler.
The latest development version is always available from IPython's `GitHub
site <http://github.com/ipython>`_.https://ipython.orgBSD-3-ClauseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-8a6d9528-c43b-40d0-8e33-220e5ce7b3c4python-ipython-8.14.0-1.src.rpm/usr/bin/ipython/usr/bin/ipython3python3-ipythonnoarchabd75b693a54e76bce5aa3715eda96c52412f0feb8204b5799454c2285839a92IPython: Productive Interactive ComputingIPython provides a rich toolkit to help you make the most out of using Python
interactively. Its main components are:
* A powerful interactive Python shell
* A `Jupyter <https://jupyter.org/>`_ kernel to work with Python code in Jupyter
notebooks and other interactive frontends.
The enhanced interactive Python shells have the following main features:
* Comprehensive object introspection.
* Input history, persistent across sessions.
* Caching of output results during a session with automatically generated
references.
* Extensible tab completion, with support by default for completion of python
variables and keywords, filenames and function keywords.
* Extensible system of 'magic' commands for controlling the environment and
performing many tasks related either to IPython or the operating system.
* A rich configuration system with easy switching between different setups
(simpler than changing $PYTHONSTARTUP environment variables every time).
* Session logging and reloading.
* Extensible syntax processing for special purpose situations.
* Access to the system shell with user-extensible alias system.
* Easily embeddable in other Python programs and GUIs.
* Integrated access to the pdb debugger and the Python profiler.
The latest development version is always available from IPython's `GitHub
site <http://github.com/ipython>`_.https://ipython.orgBSD-3-ClauseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-3b850d66-9d75-461a-9d6a-08feeef205aepython-ipython-8.14.0-1.src.rpm/usr/bin/ipython/usr/bin/ipython3python3-jedinoarch662ca3d49799b38c52850785234d012e97f740e44a198f5a35fe60ec7cab6b8aA static analysis tool for Python that is typically used in IDEs/editors pluginsJedi is a static analysis tool for Python that is typically used in IDEs/editors plugins.
It has a focus on autocompletion and goto functionality.
Other features include refactoring, code search and finding references.https://github.com/davidhalter/jediMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-2b0db9b7-2274-4598-b032-8651c56348acpython-jedi-0.18.1-1.src.rpmpython3-jedinoarchb8e64fa0b85f742d9a7da5547a0f04f9ba8468986b65b4bfa58fb9a81f2339acA static analysis tool for Python that is typically used in IDEs/editors pluginsJedi is a static analysis tool for Python that is typically used in IDEs/editors plugins.
It has a focus on autocompletion and goto functionality.
Other features include refactoring, code search and finding references.https://github.com/davidhalter/jediMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-b3cdd0a3-db90-4694-b06d-a76e2096b9c0python-jedi-0.18.1-1.src.rpmpython3-kojinoarch6df3693d7f16fbfe10b329487b0c75005133a4815f3d70449e2991d0a9b1a8c3Build system tools python libraryKoji is a system for building and tracking RPMS.
This subpackage provides python functions and libraries.https://pagure.io/koji/LGPLv2 and GPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-43d5e2df-66df-4fb1-b7e7-be8330c989c5koji-1.32.0-1.src.rpmpython3-kojinoarch25963465ead6f97f8b683ff4a1d918756ca6ed19620290a60eb89a0cb14d0e07Build system tools python libraryKoji is a system for building and tracking RPMS.
This subpackage provides python functions and libraries.https://pagure.io/koji/LGPLv2 and GPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-fb1e5b17-d116-44dd-88dd-e321152ce5e5koji-1.32.0-1.src.rpmpython3-littleutilsnoarchaf739b1ab4158ad98c624584d34799b4881cceeb20bf6cad566a3b6a285142ceSmall collection of Python utilitiesSmall collection of Python utilities.https://pypi.org/pypi/littleutilsMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-e0b48d8b-3670-46af-ae10-af1a3550bbadpython-littleutils-0.2.2-1.src.rpmpython3-littleutilsnoarch1ba9fac885bdd105b390980db89ae7dc081c1d8f9c073b21bbdb50cdcb8f6a34Small collection of Python utilitiesSmall collection of Python utilities.https://pypi.org/pypi/littleutilsMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-995a0d73-034c-40fd-a588-8dbe7476c7a7python-littleutils-0.2.2-1.src.rpmpython3-matplotlib-inlinenoarcha70c41da1d4f87d5e34c681509c0c79f7ee2ffddd2da71a7aba34cbb0146b100Inline Matplotlib backend for Jupyter
This package provides support for matplotlib to display figures directly inline in the Jupyter notebook and related clients, as shown below.
With conda:
```bash
conda install -c conda-forge matplotlib-inline
```
With pip:
```bash
pip install matplotlib-inline
```
Note that in current versions of JupyterLab and Jupyter Notebook, the explicit use of the `%matplotlib inline` directive is not needed anymore, though other third-party clients may still require it.
This will produce a figure immediately below:
```python
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 3*np.pi, 500)
plt.plot(x, np.sin(x**2))
plt.title('A simple chirp');
```
Licensed under the terms of the BSD 3-Clause License, by the IPython Development Team (see `LICENSE` file).
BSD 3-Clause License
Copyright (c) 2019-2022, IPython Development Team.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.https://github.com/ipython/matplotlib-inlineBSD 3-ClauseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-f722e95e-5f19-4b49-b3aa-75043886250fpython-matplotlib-inline-0.1.6-1.src.rpmpython3-openidnoarch7f4c7d262dfcf31774ee465ed7f89c8fae850ea9b9b09c126073eb20743cb844OpenID support for modern servers and consumers.This is a set of Python packages to support use of
the OpenID decentralized identity system in your application, update to Python
3. Want to enable single sign-on for your web site? Use the openid.consumer
package. Want to run your own OpenID server? Check out openid.server.
Includes example code and support for a variety of storage back-ends.http://github.com/necaris/python3-openidApache Software LicenseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-0b6ed2b8-cc4e-4b20-b9c9-cf90c0463502python3-openid-3.2.0-1.src.rpmpython3-openidnoarch9b36366bb054d0bcf16f6294167a982ce9f0fa588588b7707c2122427d569b14OpenID support for modern servers and consumers.This is a set of Python packages to support use of
the OpenID decentralized identity system in your application, update to Python
3. Want to enable single sign-on for your web site? Use the openid.consumer
package. Want to run your own OpenID server? Check out openid.server.
Includes example code and support for a variety of storage back-ends.http://github.com/necaris/python3-openidApache Software LicenseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-7942470d-bb58-4e0d-9074-e9740096ce13python3-openid-3.2.0-1.src.rpmpython3-openidsrc2b0065150fe8a2b0cf8860f8350cc9fb4914d8f6c72fee1ef6c9c209e7de3e26OpenID support for modern servers and consumers.This is a set of Python packages to support use of
the OpenID decentralized identity system in your application, update to Python
3. Want to enable single sign-on for your web site? Use the openid.consumer
package. Want to run your own OpenID server? Check out openid.server.
Includes example code and support for a variety of storage back-ends.http://github.com/necaris/python3-openidApache Software LicenseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-0b6ed2b8-cc4e-4b20-b9c9-cf90c0463502python3-openidsrccc60cafdf074f7d2aff5e0d433dd012a862827fb9ad26ebb4ffa31aec08c69d9OpenID support for modern servers and consumers.This is a set of Python packages to support use of
the OpenID decentralized identity system in your application, update to Python
3. Want to enable single sign-on for your web site? Use the openid.consumer
package. Want to run your own OpenID server? Check out openid.server.
Includes example code and support for a variety of storage back-ends.http://github.com/necaris/python3-openidApache Software LicenseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-7942470d-bb58-4e0d-9074-e9740096ce13python3-openid-helpnoarch32be695add6b4981db98127ea355fa21927eb2fe33ba6735b2a30adf5baf39f7Development documents and examples for python3-openidThis is a set of Python packages to support use of
the OpenID decentralized identity system in your application, update to Python
3. Want to enable single sign-on for your web site? Use the openid.consumer
package. Want to run your own OpenID server? Check out openid.server.
Includes example code and support for a variety of storage back-ends.http://github.com/necaris/python3-openidApache Software LicenseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-0b6ed2b8-cc4e-4b20-b9c9-cf90c0463502python3-openid-3.2.0-1.src.rpmpython3-openid-helpnoarchc228e30e904f8a90cba40a5d2a7ee986767c568f4f6fac1b5fdd7c247a267de7Development documents and examples for python3-openidThis is a set of Python packages to support use of
the OpenID decentralized identity system in your application, update to Python
3. Want to enable single sign-on for your web site? Use the openid.consumer
package. Want to run your own OpenID server? Check out openid.server.
Includes example code and support for a variety of storage back-ends.http://github.com/necaris/python3-openidApache Software LicenseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-7942470d-bb58-4e0d-9074-e9740096ce13python3-openid-3.2.0-1.src.rpmpython3-openid-teamsnoarch26e8039a325e4f93c709eaff8ce8d5261549b0a3177c0e9e8584a9391b9a9056This is an implementation of the OpenID teams extension for python-openidUNKNOWNhttp://www.github.com/puiterwijk/python-openid-teams/BSDopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-61dbe87a-e7a7-43b4-ba46-63040509c770python-openid-teams-1.1-2.src.rpmpython3-openid-teamsnoarch244fdbfe53f19180ac6b7fbb653932c73e2972658850a6459c356c9a68f7df97This is an implementation of the OpenID teams extension for python-openidUNKNOWNhttp://www.github.com/puiterwijk/python-openid-teams/BSDopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-9e090f89-0247-4d1a-8d75-c2278b715dd3python-openid-teams-1.1-2.src.rpmpython3-openidc-clientnoarch705a9f13b28277b991fa0e79223bb09b966720fbcf773cf87a08846bdcf293d0Python OpenID Connect client with token caching and managementPython OpenID Connect client with token caching and management.MITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-f3f390ee-6fe4-426e-a181-b4409f719372python-openidc-client-0.6.0-1.src.rpmpython3-openidc-clientnoarchfb4040264e6bc3b97ec9173aa67584edef3a427ba22fa3e3ba16e502e58fc71bPython OpenID Connect client with token caching and managementPython OpenID Connect client with token caching and management.MITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-417c2a80-ef5f-4edd-863b-d3040f7a4575python-openidc-client-0.6.0-1.src.rpmpython3-os-service-typesnoarch270c6b4a814057e4b2cefa73633396a3e7fca320bb87346abf592632f7da14cdPython library for consuming OpenStack sevice-types-authority datahttps://pypi.org/project/os-service-types/Apache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-a5f6aa8d-7696-4065-bcc3-8f92d36579e8python-os-service-types-1.7.0-2.src.rpmpython3-oslo-concurrencynoarch3caa0218a37b2a1cac4557608bea3d1444b56067c118fac2e03fb11cfec63fc1Oslo Concurrency libraryOpenStack library for all concurrency-related codehttps://docs.openstack.org/oslo.concurrency/latest/Apache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-6d6e1390-3217-4e8b-82cb-0c57f99f5564python-oslo-concurrency-4.5.0-1.src.rpm/usr/bin/lockutils-wrapperpython3-oslo-confignoarchb44a7157c1547deabdfc70d080970cdaf324393cb0bf7ba6f9f867cf2c5d4959Oslo Configuration APIThe Oslo configuration API supports parsing command line arguments and .ini style configuration files.https://docs.openstack.org/oslo.config/latest/Apache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-b40fadf4-4576-4235-b5e9-fbf3af4a8ae6python-oslo-config-9.0.0-1.src.rpm/usr/bin/oslo-config-generator/usr/bin/oslo-config-validatorpython3-oslo-confignoarche8eb222c7235d8579fc6ad2919c9fc52173417b2fb55e24367ba89dea4385960Oslo Configuration APIThe Oslo configuration API supports parsing command line arguments and .ini style configuration files.https://docs.openstack.org/oslo.config/latest/Apache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-cf67d65b-0d6a-4cfe-beb3-c003d20bc721python-oslo-config-9.1.0-1.src.rpm/usr/bin/oslo-config-generator/usr/bin/oslo-config-validatorpython3-oslo-i18nnoarchb6ebbda36abaaaed4acbb09640b0c15e56d5222c551bf70f5735da56d930651bOslo i18n libraryInternationalization and translation libraryhttps://docs.openstack.org/oslo.i18n/latestApache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-3a215e0b-61e9-409b-af79-c4304827e921python-oslo-i18n-5.1.0-1.src.rpmpython3-oslo-i18nnoarch23ff9fde1e80f96ae0bad303df3a379d273a041ac644fe23a86a3210b8b46e97Oslo i18n libraryInternationalization and translation libraryhttps://docs.openstack.org/oslo.i18n/latestApache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-85a9621a-c7f4-4d70-8b45-66691feb532fpython-oslo-i18n-5.1.0-1.src.rpmpython3-oslo-serializationnoarch1a53af28685da6bfaaa1e87c9a8a525077b85b0fb01f80aec28797e9af9893c9Oslo Serialization libraryThe oslo.serialization library provides support for representing objects in
transmittable and storable formats, such as Base64, JSON and MessagePack.https://docs.openstack.org/oslo.serialization/latest/Apache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-d8cbaca8-13e6-4fe0-8de4-38338d7ac8f5python-oslo-serialization-4.3.0-1.src.rpmpython3-oslo-utilsnoarchbcabb431efdb11c889b450ed312fdbe9f5fb38631637554f30fe1728ab82dbe1Oslo Utility libraryThe oslo.utils library provides support for common utility type functions,
such as encoding, exception handling, string manipulation, and time handling.https://docs.openstack.org/oslo.utils/latest/Apache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-644b051f-ac99-4b66-a5d5-0b91767de35apython-oslo-utils-4.12.3-1.src.rpmpython3-parsonoarchf668bd1e52d02d0e72b4af82c2b26b158dd757839c919983d10d77262a5c9bf5A Python ParserParso is a Python parser that supports error recovery and round-trip parsing
for different Python versions. Parso consists of a small API to parse Python
and analyse the syntax tree.https://github.com/davidhalter/parsoMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-bd897c51-3491-463f-a3ce-75942e9df15bpython-parso-0.8.3-1.src.rpmpython3-parsonoarch6c1a0c56f6ab9ec47bb324fe437c5d5692c6791d3c8c9a400cfdf543e456abe0A Python ParserParso is a Python parser that supports error recovery and round-trip parsing
for different Python versions. Parso consists of a small API to parse Python
and analyse the syntax tree.https://github.com/davidhalter/parsoMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-9cc05245-60c9-4336-8732-08e0f59d08e0python-parso-0.8.3-1.src.rpmpython3-picklesharenoarchac74210b1b7906fd81b9f820915c5e1d4c8525117fa614d4286a2d072672e7b4Tiny 'shelve'-like database with concurrency supportPickleShare - a small 'shelve' like datastore with concurrency support
Like shelve, a PickleShareDB object acts like a normal dictionary. Unlike shelve,
many processes can access the database simultaneously. Changing a value in
database is immediately visible to other processes accessing the same database.
Concurrency is possible because the values are stored in separate files. Hence
the "database" is a directory where *all* files are governed by PickleShare.
Example usage::
from pickleshare import *
db = PickleShareDB('~/testpickleshare')
db.clear()
print("Should be empty:",db.items())
db['hello'] = 15
db['aku ankka'] = [1,2,313]
db['paths/are/ok/key'] = [1,(5,46)]
print(db.keys())
This module is certainly not ZODB, but can be used for low-load
(non-mission-critical) situations where tiny code size trumps the
advanced features of a "real" object database.
Installation guide: pip install picklesharehttps://github.com/pickleshare/pickleshareMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-5e7cc4dd-b259-447b-85c8-0fd821d139a3python-pickleshare-0.7.5-1.src.rpmpython3-prompt-toolkitnoarch3f898d93bebb5dc8f4b2e306194f35cc8aafbba79c54409cf48e1e1316471a7fLibrary for building powerful interactive command lines in Pythonprompt_toolkit is a library for building powerful interactive command lines and
terminal applications in Python.https://github.com/prompt-toolkit/python-prompt-toolkitBSD-3-ClauseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-01b50073-cc6a-4c0f-9b13-4e72d09d5469python-prompt-toolkit-3.0.38-1.src.rpmpython3-prompt-toolkitnoarcha9f88349f726e6e00847b9d6fb6ecbc261f6caf3454d2c168e5b924f194aea72Library for building powerful interactive command lines in Pythonprompt_toolkit is a library for building powerful interactive command lines and
terminal applications in Python.https://github.com/prompt-toolkit/python-prompt-toolkitBSD-3-ClauseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-af81c92f-00f3-4261-be34-f6c29ea6ad5dpython-prompt-toolkit-3.0.38-1.src.rpmpython3-pure-evalnoarch05a432688574edd621b6b25b67f0b2e2a0f71b74ef3dc73610417f69db041e25Safely evaluate AST nodes without side effects
[![Build Status](https://travis-ci.org/alexmojaki/pure_eval.svg?branch=master)](https://travis-ci.org/alexmojaki/pure_eval) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/pure_eval/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/pure_eval?branch=master) [![Supports Python versions 3.5+](https://img.shields.io/pypi/pyversions/pure_eval.svg)](https://pypi.python.org/pypi/pure_eval)
This is a Python package that lets you safely evaluate certain AST nodes without triggering arbitrary code that may have unwanted side effects.
It can be installed from PyPI:
pip install pure_eval
To demonstrate usage, suppose we have an object defined as follows:
```python
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
@property
def area(self):
print("Calculating area...")
return self.width * self.height
rect = Rectangle(3, 5)
```
Given the `rect` object, we want to evaluate whatever expressions we can in this source code:
```python
source = "(rect.width, rect.height, rect.area)"
```
This library works with the AST, so let's parse the source code and peek inside:
```python
import ast
tree = ast.parse(source)
the_tuple = tree.body[0].value
for node in the_tuple.elts:
print(ast.dump(node))
```
Output:
```python
Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load())
Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load())
Attribute(value=Name(id='rect', ctx=Load()), attr='area', ctx=Load())
```
Now to actually use the library. First construct an Evaluator:
```python
from pure_eval import Evaluator
evaluator = Evaluator({"rect": rect})
```
The argument to `Evaluator` should be a mapping from variable names to their values. Or if you have access to the stack frame where `rect` is defined, you can instead use:
```python
evaluator = Evaluator.from_frame(frame)
```
Now to evaluate some nodes, using `evaluator[node]`:
```python
print("rect.width:", evaluator[the_tuple.elts[0]])
print("rect:", evaluator[the_tuple.elts[0].value])
```
Output:
```
rect.width: 3
rect: <__main__.Rectangle object at 0x105b0dd30>
```
OK, but you could have done the same thing with `eval`. The useful part is that it will refuse to evaluate the property `rect.area` because that would trigger unknown code. If we try, it'll raise a `CannotEval` exception.
```python
from pure_eval import CannotEval
try:
print("rect.area:", evaluator[the_tuple.elts[2]]) # fails
except CannotEval as e:
print(e) # prints CannotEval
```
To find all the expressions that can be evaluated in a tree:
```python
for node, value in evaluator.find_expressions(tree):
print(ast.dump(node), value)
```
Output:
```python
Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load()) 3
Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load()) 5
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
```
Note that this includes `rect` three times, once for each appearance in the source code. Since all these nodes are equivalent, we can group them together:
```python
from pure_eval import group_expressions
for nodes, values in group_expressions(evaluator.find_expressions(tree)):
print(len(nodes), "nodes with value:", values)
```
Output:
```
1 nodes with value: 3
1 nodes with value: 5
3 nodes with value: <__main__.Rectangle object at 0x10d374d30>
```
If we want to list all the expressions in a tree, we may want to filter out certain expressions whose values are obvious. For example, suppose we have a function `foo`:
```python
def foo():
pass
```
If we refer to `foo` by its name as usual, then that's not interesting:
```python
from pure_eval import is_expression_interesting
node = ast.parse('foo').body[0].value
print(ast.dump(node))
print(is_expression_interesting(node, foo))
```
Output:
```python
Name(id='foo', ctx=Load())
False
```
But if we refer to it by a different name, then it's interesting:
```python
node = ast.parse('bar').body[0].value
print(ast.dump(node))
print(is_expression_interesting(node, foo))
```
Output:
```python
Name(id='bar', ctx=Load())
True
```
In general `is_expression_interesting` returns False for the following values:
- Literals (e.g. `123`, `'abc'`, `[1, 2, 3]`, `{'a': (), 'b': ([1, 2], [3])}`)
- Variables or attributes whose name is equal to the value's `__name__`, such as `foo` above or `self.foo` if it was a method.
- Builtins (e.g. `len`) referred to by their usual name.
To make things easier, you can combine finding expressions, grouping them, and filtering out the obvious ones with:
```python
evaluator.interesting_expressions_grouped(root)
```
To get the source code of an AST node, I recommend [asttokens](https://github.com/gristlabs/asttokens).
Here's a complete example that brings it all together:
```python
from asttokens import ASTTokens
from pure_eval import Evaluator
source = """
x = 1
d = {x: 2}
y = d[x]
"""
names = {}
exec(source, names)
atok = ASTTokens(source, parse=True)
for nodes, value in Evaluator(names).interesting_expressions_grouped(atok.tree):
print(atok.get_text(nodes[0]), "=", value)
```
Output:
```python
x = 1
d = {1: 2}
y = 2
d[x] = 2
```http://github.com/alexmojaki/pure_evalMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-d6169a16-f26e-4aff-8ad9-07585da931d8python-pure-eval-0.2.2-1.src.rpmpython3-pure-evalnoarch16cdb159453c7ed39fe16a2459d3b0ac29de68026e837f1993d904b0dbb6e9dbSafely evaluate AST nodes without side effects
[![Build Status](https://travis-ci.org/alexmojaki/pure_eval.svg?branch=master)](https://travis-ci.org/alexmojaki/pure_eval) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/pure_eval/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/pure_eval?branch=master) [![Supports Python versions 3.5+](https://img.shields.io/pypi/pyversions/pure_eval.svg)](https://pypi.python.org/pypi/pure_eval)
This is a Python package that lets you safely evaluate certain AST nodes without triggering arbitrary code that may have unwanted side effects.
It can be installed from PyPI:
pip install pure_eval
To demonstrate usage, suppose we have an object defined as follows:
```python
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
@property
def area(self):
print("Calculating area...")
return self.width * self.height
rect = Rectangle(3, 5)
```
Given the `rect` object, we want to evaluate whatever expressions we can in this source code:
```python
source = "(rect.width, rect.height, rect.area)"
```
This library works with the AST, so let's parse the source code and peek inside:
```python
import ast
tree = ast.parse(source)
the_tuple = tree.body[0].value
for node in the_tuple.elts:
print(ast.dump(node))
```
Output:
```python
Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load())
Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load())
Attribute(value=Name(id='rect', ctx=Load()), attr='area', ctx=Load())
```
Now to actually use the library. First construct an Evaluator:
```python
from pure_eval import Evaluator
evaluator = Evaluator({"rect": rect})
```
The argument to `Evaluator` should be a mapping from variable names to their values. Or if you have access to the stack frame where `rect` is defined, you can instead use:
```python
evaluator = Evaluator.from_frame(frame)
```
Now to evaluate some nodes, using `evaluator[node]`:
```python
print("rect.width:", evaluator[the_tuple.elts[0]])
print("rect:", evaluator[the_tuple.elts[0].value])
```
Output:
```
rect.width: 3
rect: <__main__.Rectangle object at 0x105b0dd30>
```
OK, but you could have done the same thing with `eval`. The useful part is that it will refuse to evaluate the property `rect.area` because that would trigger unknown code. If we try, it'll raise a `CannotEval` exception.
```python
from pure_eval import CannotEval
try:
print("rect.area:", evaluator[the_tuple.elts[2]]) # fails
except CannotEval as e:
print(e) # prints CannotEval
```
To find all the expressions that can be evaluated in a tree:
```python
for node, value in evaluator.find_expressions(tree):
print(ast.dump(node), value)
```
Output:
```python
Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load()) 3
Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load()) 5
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
```
Note that this includes `rect` three times, once for each appearance in the source code. Since all these nodes are equivalent, we can group them together:
```python
from pure_eval import group_expressions
for nodes, values in group_expressions(evaluator.find_expressions(tree)):
print(len(nodes), "nodes with value:", values)
```
Output:
```
1 nodes with value: 3
1 nodes with value: 5
3 nodes with value: <__main__.Rectangle object at 0x10d374d30>
```
If we want to list all the expressions in a tree, we may want to filter out certain expressions whose values are obvious. For example, suppose we have a function `foo`:
```python
def foo():
pass
```
If we refer to `foo` by its name as usual, then that's not interesting:
```python
from pure_eval import is_expression_interesting
node = ast.parse('foo').body[0].value
print(ast.dump(node))
print(is_expression_interesting(node, foo))
```
Output:
```python
Name(id='foo', ctx=Load())
False
```
But if we refer to it by a different name, then it's interesting:
```python
node = ast.parse('bar').body[0].value
print(ast.dump(node))
print(is_expression_interesting(node, foo))
```
Output:
```python
Name(id='bar', ctx=Load())
True
```
In general `is_expression_interesting` returns False for the following values:
- Literals (e.g. `123`, `'abc'`, `[1, 2, 3]`, `{'a': (), 'b': ([1, 2], [3])}`)
- Variables or attributes whose name is equal to the value's `__name__`, such as `foo` above or `self.foo` if it was a method.
- Builtins (e.g. `len`) referred to by their usual name.
To make things easier, you can combine finding expressions, grouping them, and filtering out the obvious ones with:
```python
evaluator.interesting_expressions_grouped(root)
```
To get the source code of an AST node, I recommend [asttokens](https://github.com/gristlabs/asttokens).
Here's a complete example that brings it all together:
```python
from asttokens import ASTTokens
from pure_eval import Evaluator
source = """
x = 1
d = {x: 2}
y = d[x]
"""
names = {}
exec(source, names)
atok = ASTTokens(source, parse=True)
for nodes, value in Evaluator(names).interesting_expressions_grouped(atok.tree):
print(atok.get_text(nodes[0]), "=", value)
```
Output:
```python
x = 1
d = {1: 2}
y = 2
d[x] = 2
```http://github.com/alexmojaki/pure_evalMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-bfd2efdb-39f3-4891-bdcb-a97c96937753python-pure-eval-0.2.2-1.src.rpmpython3-pure-evalnoarch003ad7a45dc2b24fddc4a375d4e8f6e6b2efa78707cbc972e204c5c19812fb45Safely evaluate AST nodes without side effects
[![Build Status](https://travis-ci.org/alexmojaki/pure_eval.svg?branch=master)](https://travis-ci.org/alexmojaki/pure_eval) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/pure_eval/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/pure_eval?branch=master) [![Supports Python versions 3.5+](https://img.shields.io/pypi/pyversions/pure_eval.svg)](https://pypi.python.org/pypi/pure_eval)
This is a Python package that lets you safely evaluate certain AST nodes without triggering arbitrary code that may have unwanted side effects.
It can be installed from PyPI:
pip install pure_eval
To demonstrate usage, suppose we have an object defined as follows:
```python
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
@property
def area(self):
print("Calculating area...")
return self.width * self.height
rect = Rectangle(3, 5)
```
Given the `rect` object, we want to evaluate whatever expressions we can in this source code:
```python
source = "(rect.width, rect.height, rect.area)"
```
This library works with the AST, so let's parse the source code and peek inside:
```python
import ast
tree = ast.parse(source)
the_tuple = tree.body[0].value
for node in the_tuple.elts:
print(ast.dump(node))
```
Output:
```python
Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load())
Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load())
Attribute(value=Name(id='rect', ctx=Load()), attr='area', ctx=Load())
```
Now to actually use the library. First construct an Evaluator:
```python
from pure_eval import Evaluator
evaluator = Evaluator({"rect": rect})
```
The argument to `Evaluator` should be a mapping from variable names to their values. Or if you have access to the stack frame where `rect` is defined, you can instead use:
```python
evaluator = Evaluator.from_frame(frame)
```
Now to evaluate some nodes, using `evaluator[node]`:
```python
print("rect.width:", evaluator[the_tuple.elts[0]])
print("rect:", evaluator[the_tuple.elts[0].value])
```
Output:
```
rect.width: 3
rect: <__main__.Rectangle object at 0x105b0dd30>
```
OK, but you could have done the same thing with `eval`. The useful part is that it will refuse to evaluate the property `rect.area` because that would trigger unknown code. If we try, it'll raise a `CannotEval` exception.
```python
from pure_eval import CannotEval
try:
print("rect.area:", evaluator[the_tuple.elts[2]]) # fails
except CannotEval as e:
print(e) # prints CannotEval
```
To find all the expressions that can be evaluated in a tree:
```python
for node, value in evaluator.find_expressions(tree):
print(ast.dump(node), value)
```
Output:
```python
Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load()) 3
Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load()) 5
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30>
```
Note that this includes `rect` three times, once for each appearance in the source code. Since all these nodes are equivalent, we can group them together:
```python
from pure_eval import group_expressions
for nodes, values in group_expressions(evaluator.find_expressions(tree)):
print(len(nodes), "nodes with value:", values)
```
Output:
```
1 nodes with value: 3
1 nodes with value: 5
3 nodes with value: <__main__.Rectangle object at 0x10d374d30>
```
If we want to list all the expressions in a tree, we may want to filter out certain expressions whose values are obvious. For example, suppose we have a function `foo`:
```python
def foo():
pass
```
If we refer to `foo` by its name as usual, then that's not interesting:
```python
from pure_eval import is_expression_interesting
node = ast.parse('foo').body[0].value
print(ast.dump(node))
print(is_expression_interesting(node, foo))
```
Output:
```python
Name(id='foo', ctx=Load())
False
```
But if we refer to it by a different name, then it's interesting:
```python
node = ast.parse('bar').body[0].value
print(ast.dump(node))
print(is_expression_interesting(node, foo))
```
Output:
```python
Name(id='bar', ctx=Load())
True
```
In general `is_expression_interesting` returns False for the following values:
- Literals (e.g. `123`, `'abc'`, `[1, 2, 3]`, `{'a': (), 'b': ([1, 2], [3])}`)
- Variables or attributes whose name is equal to the value's `__name__`, such as `foo` above or `self.foo` if it was a method.
- Builtins (e.g. `len`) referred to by their usual name.
To make things easier, you can combine finding expressions, grouping them, and filtering out the obvious ones with:
```python
evaluator.interesting_expressions_grouped(root)
```
To get the source code of an AST node, I recommend [asttokens](https://github.com/gristlabs/asttokens).
Here's a complete example that brings it all together:
```python
from asttokens import ASTTokens
from pure_eval import Evaluator
source = """
x = 1
d = {x: 2}
y = d[x]
"""
names = {}
exec(source, names)
atok = ASTTokens(source, parse=True)
for nodes, value in Evaluator(names).interesting_expressions_grouped(atok.tree):
print(atok.get_text(nodes[0]), "=", value)
```
Output:
```python
x = 1
d = {1: 2}
y = 2
d[x] = 2
```http://github.com/alexmojaki/pure_evalMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-28901d3c-6848-4905-aeee-d565a7a9b5fepython-pure-eval-0.2.2-1.src.rpmpython3-py3dnsnoarch22ee30bdb45dd4e990287955545dab9f0d1005961de9ce45f3656f370d733c2fPython 3 DNS libraryPython 3 DNS library:https://launchpad.net/py3dnsPython LicenseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-f77559c1-b12e-4852-a0dc-e078212b95ffpython-py3dns-3.2.1-1.src.rpmpython3-py3dnsnoarchf6b5fb3178c7294a9fc7cdd0d9889d3f20993e5352a2a60a7e2b1687de994fb9Python 3 DNS libraryPython 3 DNS library:https://launchpad.net/py3dnsPython LicenseopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-9c02a247-0147-4ca0-919c-78dc30b480eepython-py3dns-3.2.1-1.src.rpmpython3-pyLibravatarnoarch7eb4293fbc9a710683f34ddb22055bf63b54ea89964554176c0be2490c12f182Python module for LibravatarPyLibravatar is an easy way to make use of the federated Libravatar_ avatar
hosting service from within your Python applications.https://launchpad.net/pylibravatarMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-00bc5c01-9806-42b7-a1b2-fff4e2cf988epython-pyLibravatar-1.7-1.src.rpmpython3-pyLibravatarnoarchf468d839b9ff510a699634915ccb359d5ea3700e9ef799141e3669b08c558ea0Python module for LibravatarPyLibravatar is an easy way to make use of the federated Libravatar_ avatar
hosting service from within your Python applications.https://launchpad.net/pylibravatarMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-5e08ea01-46cf-4044-aae1-042c308fbdeepython-pyLibravatar-1.7-2.src.rpmpython3-pyLibravatarnoarchf9de0bf0a7bf3165fe1f147096a0233ee781356ea858c7fb212b8d2d3a1758bbPython module for LibravatarPyLibravatar is an easy way to make use of the federated Libravatar_ avatar
hosting service from within your Python applications.https://launchpad.net/pylibravatarMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-d3e51e38-580b-42c2-ad42-81a7d29fe97apython-pyLibravatar-1.7-2.src.rpmpython3-pyLibravatarnoarchf6fc1b6661fa277154d57d42a2e8d0123e640b6898a99b6a438b7eeec6fac4c6Python module for LibravatarPyLibravatar is an easy way to make use of the federated Libravatar_ avatar
hosting service from within your Python applications.https://launchpad.net/pylibravatarMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-87f0e2db-01d9-4996-a551-13de6dc2e200python-pyLibravatar-1.7-2.src.rpmpython3-pygalnoarch04147959db5406036b181e804fbb86e52df7ba78a552b255060564aa615f6c8dA Python svg graph plotting libraryhttps://www.pygal.org/LGPL-3.0+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-0800d4a9-d6af-4770-96e7-9ee55cf1965cpython-pygal-3.0.0-1.src.rpm/usr/bin/pygal_gen.pypython3-pygalnoarch82c76ff8d5fea74aba1b38515e4590f8b65838156a24510e5f8cd5305f575252A Python svg graph plotting libraryhttps://www.pygal.org/LGPL-3.0+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-a73bcb1a-fbd3-44ba-8caa-c7e028a1ea8bpython-pygal-3.0.0-1.src.rpm/usr/bin/pygal_gen.pypython3-pygit2x86_64893a01873ecb4f88b9c6b4e2a4c235b7c73a1a2658c034df0cdb0bc95bdc466ePython bindings for libgit2.- Documentation - http://www.pygit2.org/
- Install - http://www.pygit2.org/install.html
- Download - https://pypi.python.org/pypi/pygit2
- Source code and issue tracker - https://github.com/libgit2/pygit2
- Changelog - https://github.com/libgit2/pygit2/blob/master/CHANGELOG.rst
- Authors - https://github.com/libgit2/pygit2/blob/master/AUTHORS.rsthttps://github.com/libgit2/pygit2GPLv2 with linking exceptionopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-4acce24f-a362-464e-8420-7a87eca38abfpython-pygit2-1.7.1-1.src.rpmpython3-pygit2x86_645c94e7c73e10996184ab71895ba7c5b68eb1aca3f2311500088ad423c28201afPython bindings for libgit2.- Documentation - http://www.pygit2.org/
- Install - http://www.pygit2.org/install.html
- Download - https://pypi.python.org/pypi/pygit2
- Source code and issue tracker - https://github.com/libgit2/pygit2
- Changelog - https://github.com/libgit2/pygit2/blob/master/CHANGELOG.rst
- Authors - https://github.com/libgit2/pygit2/blob/master/AUTHORS.rsthttps://github.com/libgit2/pygit2GPLv2 with linking exceptionopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-b1276125-1890-411d-880b-d8af2f7f5ed9python-pygit2-1.7.1-1.src.rpmpython3-resallocnoarch259a6a1e6d8653607139899944021ea1ef0b545408788b90ee603386e5405261Resource allocator for expensive resources - Python 3 client library
The resalloc project aims to help with taking care of dynamically
allocated resources, for example ephemeral virtual machines used for
the purposes of CI/CD tasks.
The python3-resalloc package provides Python 3 client library for talking
to the resalloc server.https://github.com/praiskup/resallocGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-658cca24-b5c4-4c9e-bba4-53a5467954beresalloc-4.9-1.src.rpmpython3-responsesnoarch27220fa1317c276d91d52a47aaed0a72aa474366589e206f26dc00e44643a83dA utility library for mocking out the `requests` Python library.A utility library for mocking out the requests Python library.https://github.com/getsentry/responsesApache-2.0openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-6ae81ef6-8052-4f25-882b-07766d63f014python-responses-0.18.0-1.src.rpmpython3-retasknoarche4c591781a5dd21197d149b1731d4d7888dca7cdbd2c8af632dbe3f5889020acPython module to create and manage distributed task queuesPython module to create and manage distributed task queues using redis.http://retask.readthedocs.org/en/latest/index.htmlMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-100e6971-a6f4-4810-979b-d8cf3f13bc08python-retask-0.4-1.src.rpmpython3-richnoarch13e4205a7f5e6c2fadfad206c5c987f4decdab9e1828dc7c66d301bd8276eea2Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminalRich is a Python library for rich text and beautiful formatting in the terminalhttps://github.com/willmcgugan/richMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-fe180c04-616f-49e9-88bd-508b3843fbe3python-rich-12.6.0-1.src.rpmpython3-richnoarch591e07eff789c6f1abcedfc596d3ffcd3b2b7a8f0862a9283702394de72fcd9eRender rich text, tables, progress bars, syntax highlighting, markdown and more to the terminalRich is a Python library for rich text and beautiful formatting in the terminalhttps://github.com/willmcgugan/richMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-a2376eb7-ee08-44ac-a4a4-1d442fcd750cpython-rich-12.6.0-1.src.rpmpython3-rpkgnoarchb1f011929ff3850787fdb8e7ed92272c5b36c98db1d1a214ac09cc0a807a9c4bPython library for interacting with rpm+gitA python library for managing RPM package sources in a git repository.https://pagure.io/rpkgGPLv2+ and LGPLv2openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-77515a83-31eb-48cd-afa0-c347818e46d3rpkg-1.65-1.src.rpmpython3-rpkgnoarch50dc39b0cd38db3d4527853e8e0759c43c50ddb52229df1b86d7c4b4e13b180bPython library for interacting with rpm+gitA python library for managing RPM package sources in a git repository.https://pagure.io/rpkgGPLv2+ and LGPLv2openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-fc4268c0-b123-4c53-b91c-aa7c8849a727rpkg-1.65-1.src.rpmpython3-rpkgnoarchae4790d1976a828da5e1965eceddfeca8d55944fa3dfb094968aeb9ce1282da5Python library for interacting with rpm+gitA python library for managing RPM package sources in a git repository.https://pagure.io/rpkgGPLv2+ and LGPLv2openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-3dc05d57-272c-497d-bbe7-c5a884e1c30crpkg-1.65-1.src.rpmpython3-rpmautospecnoarch94e6f1f7bafc913eb939ce0c94bb8e3955b43123d116c5f8cadced14cb57b810Package and CLI tool to generate release fields and changelogsA package and CLI tool to generate RPM release fields and changelogs.https://pagure.io/fedora-infra/rpmautospecMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-c193af30-d8cf-41b3-964b-b57181e178a6python-rpmautospec-0.3.5-1.src.rpmpython3-rpmautospecnoarch2eb01c7e7a8009fe1ca2b0d03253d1e2cab593598ee91e4ed2e2b8d5ccf951d9Package and CLI tool to generate release fields and changelogsA package and CLI tool to generate RPM release fields and changelogs.https://pagure.io/fedora-infra/rpmautospecMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-f4072875-c26a-4cd8-abb4-0b60ae8fd4e9python-rpmautospec-0.3.5-1.src.rpmpython3-stack-datanoarche01b1106ab1b2b04c0ec71dc4b0f65ed7b80a516ed3bc2aefe02ee5f7b15397fExtract data from python stack frames and tracebacks for informative displays 6 | for i in range(5):
7 | row = []
8 | result.append(row)
--> 9 | print_stack()
10 | for j in range(5):
```
The code for `print_stack()` is fairly self-explanatory. If you want to learn more details about a particular class or method I suggest looking through some docstrings. `FrameInfo` is a class that accepts either a frame or a traceback object and provides a bunch of nice attributes and properties (which are cached so you don't need to worry about performance). In particular `frame_info.lines` is a list of `Line` objects. `line.render()` returns the source code of that line suitable for display. Without any arguments it simply strips any common leading indentation. Later on we'll see a more powerful use for it.
You can see that `frame_info.lines` includes some lines of surrounding context. By default it includes 3 pieces of context before the main line and 1 piece after. We can configure the amount of context by passing options:
```python
options = stack_data.Options(before=1, after=0)
frame_info = stack_data.FrameInfo(frame, options)
```
Then the output looks like:
```http://github.com/alexmojaki/stack_dataMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-44fa049c-439e-4037-af41-f0f230cb78a2python-stack-data-0.6.2-1.src.rpmpython3-stack-datanoarch80524bf994882b692b4c19b6f1cd7e75e6865bf2c1ec61f12015c747e73cbed9Extract data from python stack frames and tracebacks for informative displays 6 | for i in range(5):
7 | row = []
8 | result.append(row)
--> 9 | print_stack()
10 | for j in range(5):
```
The code for `print_stack()` is fairly self-explanatory. If you want to learn more details about a particular class or method I suggest looking through some docstrings. `FrameInfo` is a class that accepts either a frame or a traceback object and provides a bunch of nice attributes and properties (which are cached so you don't need to worry about performance). In particular `frame_info.lines` is a list of `Line` objects. `line.render()` returns the source code of that line suitable for display. Without any arguments it simply strips any common leading indentation. Later on we'll see a more powerful use for it.
You can see that `frame_info.lines` includes some lines of surrounding context. By default it includes 3 pieces of context before the main line and 1 piece after. We can configure the amount of context by passing options:
```python
options = stack_data.Options(before=1, after=0)
frame_info = stack_data.FrameInfo(frame, options)
```
Then the output looks like:
```http://github.com/alexmojaki/stack_dataMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-62785097-dbd7-4d64-b4f4-7feaf3f3efb7python-stack-data-0.6.2-1.src.rpmpython3-stack-datanoarch4a5da9c9f870307a43564ca612e545cbe6ba668bad75f7e686b60f4019879a10Extract data from python stack frames and tracebacks for informative displays 6 | for i in range(5):
7 | row = []
8 | result.append(row)
--> 9 | print_stack()
10 | for j in range(5):
```
The code for `print_stack()` is fairly self-explanatory. If you want to learn more details about a particular class or method I suggest looking through some docstrings. `FrameInfo` is a class that accepts either a frame or a traceback object and provides a bunch of nice attributes and properties (which are cached so you don't need to worry about performance). In particular `frame_info.lines` is a list of `Line` objects. `line.render()` returns the source code of that line suitable for display. Without any arguments it simply strips any common leading indentation. Later on we'll see a more powerful use for it.
You can see that `frame_info.lines` includes some lines of surrounding context. By default it includes 3 pieces of context before the main line and 1 piece after. We can configure the amount of context by passing options:
```python
options = stack_data.Options(before=1, after=0)
frame_info = stack_data.FrameInfo(frame, options)
```
Then the output looks like:
```http://github.com/alexmojaki/stack_dataMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-ae8d7b52-e865-43b2-b6ef-ba1ad248b58dpython-stack-data-0.6.2-1.src.rpmpython3-templated-dictionarynoarch3792b55b78d3f3e9cea080173b864cb8bb7acde189ca2a4ded18d766adf03c3dDictionary with Jinja2 expansionDictionary where __getitem__() is run through Jinja2 template.https://github.com/xsuchy/templated-dictionaryGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-491e1250-c171-4c4a-952b-8f6f33eca728python-templated-dictionary-1.2-1.src.rpmresallocnoarch42e5cb312efca448829c7f78478205b9680b89e88a5d454671ae6bc1ba399a40Resource allocator for expensive resources - client tooling
The resalloc project aims to help with taking care of dynamically
allocated resources, for example ephemeral virtual machines used for
the purposes of CI/CD tasks.
The resalloc package provides the client-side tooling.https://github.com/praiskup/resallocGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-658cca24-b5c4-4c9e-bba4-53a5467954beresalloc-4.9-1.src.rpm/usr/bin/resallocresallocsrcb7cf721fcde5303691d3586017a4aa0cd242955a03a39f261f7c06754f1f1861Resource allocator for expensive resources - client tooling
The resalloc project aims to help with taking care of dynamically
allocated resources, for example ephemeral virtual machines used for
the purposes of CI/CD tasks.
The resalloc package provides the client-side tooling.https://github.com/praiskup/resallocGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-658cca24-b5c4-4c9e-bba4-53a5467954beresalloc-selinuxnoarch341283328df7dcef4a17de5b81e3479fb35cdda7933ab0df63986f69661f54daSELinux module for resalloc
The resalloc project aims to help with taking care of dynamically
allocated resources, for example ephemeral virtual machines used for
the purposes of CI/CD tasks.https://github.com/praiskup/resallocGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-658cca24-b5c4-4c9e-bba4-53a5467954beresalloc-4.9-1.src.rpmresalloc-servernoarch219a9bc415fbeb66c2a1168cd1e87f9a323c79522da9c1eb1962440c8c9a9fdfResource allocator for expensive resources - server part
The resalloc project aims to help with taking care of dynamically
allocated resources, for example ephemeral virtual machines used for
the purposes of CI/CD tasks.
The resalloc-server package provides the resalloc server, and
some tooling for resalloc administrators.https://github.com/praiskup/resallocGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-658cca24-b5c4-4c9e-bba4-53a5467954beresalloc-4.9-1.src.rpm/etc/cron.hourly/resalloc/etc/logrotate.d/resalloc-server/etc/resallocserver/etc/resallocserver/pools.yaml/etc/resallocserver/server.yaml/usr/bin/resalloc-check-vm-ip/usr/bin/resalloc-maint/usr/bin/resalloc-serverresalloc-webuinoarch27263109c549f7a2224c4ad6f2b3bb432d752a09a619472a07a3973427c8c274Resource allocator for expensive resources - webui part
The resalloc project aims to help with taking care of dynamically
allocated resources, for example ephemeral virtual machines used for
the purposes of CI/CD tasks.
The resalloc-webui package provides the resalloc webui,
it shows page with information about resalloc resources.https://github.com/praiskup/resallocGPL-2.0-or-lateropenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-658cca24-b5c4-4c9e-bba4-53a5467954beresalloc-4.9-1.src.rpmrpkgsrcffde9159d9dea6f146a131320980f61f021ac12162d63819212106ca1bc35269Python library for interacting with rpm+gitPython library for interacting with rpm+githttps://pagure.io/rpkgGPLv2+ and LGPLv2openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-65762e79-067e-4c5f-9516-ab2ce04c9dd9rpkgsrc6d5d3fe66e665dc83b8582054c1b745fd11ad97609f83dd80cf32fd44334becaPython library for interacting with rpm+gitPython library for interacting with rpm+githttps://pagure.io/rpkgGPLv2+ and LGPLv2openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-77515a83-31eb-48cd-afa0-c347818e46d3rpkgsrc3d31f261c4d529d49c2365bbce63cc215b8a3d5043e5aa1227afa658e7eca404Python library for interacting with rpm+gitPython library for interacting with rpm+githttps://pagure.io/rpkgGPLv2+ and LGPLv2openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-fc4268c0-b123-4c53-b91c-aa7c8849a727rpkgsrc9f89b4aa4408e2a682d1c4269a3c5e7b3cb2fba8e544bdf00301c2dc85b8dc61Python library for interacting with rpm+gitPython library for interacting with rpm+githttps://pagure.io/rpkgGPLv2+ and LGPLv2openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-3dc05d57-272c-497d-bbe7-c5a884e1c30crpkgsrc13d8c0510a19344340607af4286725ebd31002a864f9d4cc917ae07997aa0d4aPython library for interacting with rpm+gitPython library for interacting with rpm+githttps://pagure.io/rpkgGPLv2+ and LGPLv2openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-1c6457cf-cfa4-48c5-9819-57b0e53721adrpkgsrc84ab34c2a993548aae289b118f3cb2624ed8ecc2a0521bfb2054fd328c225f6aPython library for interacting with rpm+gitPython library for interacting with rpm+githttps://pagure.io/rpkgGPLv2+ and LGPLv2openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-cd6462bc-6275-4ec9-8f66-0c8520d2f1dbrpkgsrc0ae094f218943579718d57c3ed5a90aa1ea5427dc5ee95bd6fe010d54e9fbefbPython library for interacting with rpm+gitPython library for interacting with rpm+githttps://pagure.io/rpkgGPLv2+ and LGPLv2openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-be8a0cad-6742-488d-b04b-b2deec4769abrpkgnoarchafe189a6903406b05565fa6435d7f10d367ceb4e08a02e3b2d675d6f7ac2cc27RPM packaging utilityThis is an RPM packaging utility that can work with both DistGit
and standard Git repositories and handles packed directory content
as well as unpacked one.https://pagure.io/rpkg-util.gitGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-2cad18b6-0b9c-4145-b242-641bbc352851rpkg-util-3.2-1.src.rpm/etc/rpkg.conf/usr/bin/rpkgrpkgnoarch43d83f6a100b30c2d720e46fa5ff54a58bdbc6f4a02bb7d9fd40ecbb4dbd9ea4RPM packaging utilityThis is an RPM packaging utility that can work with both DistGit
and standard Git repositories and handles packed directory content
as well as unpacked one.https://pagure.io/rpkg-util.gitGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-6ed7d668-3966-4cd3-ba11-9539ec132f6erpkg-util-3.2-1.src.rpm/etc/rpkg.conf/usr/bin/rpkgrpkgnoarche0f0106a26cb8309e6f4e13856d39f3fc024b557ba6267b7c2757dea580bc85bRPM packaging utilityThis is an RPM packaging utility that can work with both DistGit
and standard Git repositories and handles packed directory content
as well as unpacked one.https://pagure.io/rpkg-util.gitGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-e30cd1bc-a86c-40b4-81f9-f212cb2b8d61rpkg-util-3.2-1.src.rpm/etc/rpkg.conf/usr/bin/rpkgrpkg-commonnoarch7c2cf0c7611a1156417d82f57dfe1bde024849efa085ce1f131eb140ab4c6878Common files for rpkgCommon files for python2-rpkg and python3-rpkg.https://pagure.io/rpkgGPLv2+ and LGPLv2openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-77515a83-31eb-48cd-afa0-c347818e46d3rpkg-1.65-1.src.rpm/etc/rpkg/usr/share/rpkg/examples/cli/usr/bin/rpkgrpkg-commonnoarchb7d5a448096eb7293b53901b957aa2c11bad2796751f275e862e518f59fcd382Common files for rpkgCommon files for python2-rpkg and python3-rpkg.https://pagure.io/rpkgGPLv2+ and LGPLv2openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-fc4268c0-b123-4c53-b91c-aa7c8849a727rpkg-1.65-1.src.rpm/etc/rpkg/usr/share/rpkg/examples/cli/usr/bin/rpkgrpkg-commonnoarch25bd240cd554d39eaa5fc953a532b201ef995ef86bbc31e85eba7d19cff57a9bCommon files for rpkgCommon files for python2-rpkg and python3-rpkg.https://pagure.io/rpkgGPLv2+ and LGPLv2openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-3dc05d57-272c-497d-bbe7-c5a884e1c30crpkg-1.65-1.src.rpm/etc/rpkg/usr/share/rpkg/examples/cli/usr/bin/rpkgrpkg-macrosnoarch19ced5826a50e0c186605de358e117363bd046e08f28c80d89411d7fd2f9581aSet of preproc macros for rpkg utilitySet of preproc macros to be used by rpkg utility. They
are designed to dynamically generate certain parts
of rpm spec files. You can use those macros also without
rpkg by:
$ cat <file_with_the_macros> | preproc -s /usr/lib/rpkg.macros.d/all.bash -e INPUT_PATH=<file_with_the_macros>
INPUT_PATH env variable is passed to preproc to inform
macros about the input file location. The variable is used
to derive INPUT_DIR_PATH variable which rpkg macros use.
If neither INPUT_PATH nor INPUT_DIR_PATH are specified,
INPUT_PATH will stay empty and INPUT_DIR_PATH will default
to '.' (the current working directory).
Another option to experiment with the macros is to source
/usr/lib/rpkg.macros.d/all.bash into your bash environment
Then you can directly invoke the macros on your command-line
as bash functions. See content in /usr/lib/rpkg.macros.d to
discover available macros.
Please, see man rpkg-macros for more information.https://pagure.io/rpkg-util.gitGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-96fcfb58-8252-43ae-9afa-2f7d1930e547rpkg-macros-2.0-1.src.rpm/usr/bin/pack_sourcesrpkg-macrosnoarchfc9492b974d8728340b121e200fdeb4f53a074caa5c65e4e90dc914954f09534Set of preproc macros for rpkg utilitySet of preproc macros to be used by rpkg utility. They
are designed to dynamically generate certain parts
of rpm spec files. You can use those macros also without
rpkg by:
$ cat <file_with_the_macros> | preproc -s /usr/lib/rpkg.macros.d/all.bash -e INPUT_PATH=<file_with_the_macros>
INPUT_PATH env variable is passed to preproc to inform
macros about the input file location. The variable is used
to derive INPUT_DIR_PATH variable which rpkg macros use.
If neither INPUT_PATH nor INPUT_DIR_PATH are specified,
INPUT_PATH will stay empty and INPUT_DIR_PATH will default
to '.' (the current working directory).
Another option to experiment with the macros is to source
/usr/lib/rpkg.macros.d/all.bash into your bash environment
Then you can directly invoke the macros on your command-line
as bash functions. See content in /usr/lib/rpkg.macros.d to
discover available macros.
Please, see man rpkg-macros for more information.https://pagure.io/rpkg-util.gitGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-9cdec38c-5ce1-4db8-9a76-afaa3afb7105rpkg-macros-2.0-1.src.rpm/usr/bin/pack_sourcesrpkg-macrossrc1622087d3bfbbe58f3ebb6d6e66c829b9107f84ed9303cbc9739223f86fa8f07Set of preproc macros for rpkg utilitySet of preproc macros to be used by rpkg utility. They
are designed to dynamically generate certain parts
of rpm spec files. You can use those macros also without
rpkg by:
$ cat <file_with_the_macros> | preproc -s /usr/lib/rpkg.macros.d/all.bash -e INPUT_PATH=<file_with_the_macros>
INPUT_PATH env variable is passed to preproc to inform
macros about the input file location. The variable is used
to derive INPUT_DIR_PATH variable which rpkg macros use.
If neither INPUT_PATH nor INPUT_DIR_PATH are specified,
INPUT_PATH will stay empty and INPUT_DIR_PATH will default
to '.' (the current working directory).
Another option to experiment with the macros is to source
/usr/lib/rpkg.macros.d/all.bash into your bash environment
Then you can directly invoke the macros on your command-line
as bash functions. See content in /usr/lib/rpkg.macros.d to
discover available macros.
Please, see man rpkg-macros for more information.https://pagure.io/rpkg-util.gitGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-96fcfb58-8252-43ae-9afa-2f7d1930e547rpkg-macrossrcc7977a80ad1646a5c8450d255422beb1e7506e8d7471443b0eddec6dcf1accf2Set of preproc macros for rpkg utilitySet of preproc macros to be used by rpkg utility. They
are designed to dynamically generate certain parts
of rpm spec files. You can use those macros also without
rpkg by:
$ cat <file_with_the_macros> | preproc -s /usr/lib/rpkg.macros.d/all.bash -e INPUT_PATH=<file_with_the_macros>
INPUT_PATH env variable is passed to preproc to inform
macros about the input file location. The variable is used
to derive INPUT_DIR_PATH variable which rpkg macros use.
If neither INPUT_PATH nor INPUT_DIR_PATH are specified,
INPUT_PATH will stay empty and INPUT_DIR_PATH will default
to '.' (the current working directory).
Another option to experiment with the macros is to source
/usr/lib/rpkg.macros.d/all.bash into your bash environment
Then you can directly invoke the macros on your command-line
as bash functions. See content in /usr/lib/rpkg.macros.d to
discover available macros.
Please, see man rpkg-macros for more information.https://pagure.io/rpkg-util.gitGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-9cdec38c-5ce1-4db8-9a76-afaa3afb7105rpkg-utilsrc6076c36c7bc35ad8fcbc42f79687fd26f22a1aee6b6fcbb43c7611e40f61c5afRPM packaging utilityThis package contains the rpkg utility. We are putting
the actual 'rpkg' package into a subpackage because there already
exists package https://src.fedoraproject.org/rpms/rpkg. That package,
however, does not actually produce rpkg rpm whereas rpkg-util does.https://pagure.io/rpkg-util.gitGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-c6629a23-f571-4377-b1d1-f5bdcd9ccb70rpkg-utilsrce16098036f82898e7ba4bb08946bcf741da9070838445a0840c3092e68e8b473RPM packaging utilityThis package contains the rpkg utility. We are putting
the actual 'rpkg' package into a subpackage because there already
exists package https://src.fedoraproject.org/rpms/rpkg. That package,
however, does not actually produce rpkg rpm whereas rpkg-util does.https://pagure.io/rpkg-util.gitGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-e7d4ca7b-162d-4fa2-86fb-f0cb0a1f4088rpkg-utilsrc82b602fc54e0fc694f3763b763da8684e652e0f80dbd935e7baeb0c0a7340036RPM packaging utilityThis package contains the rpkg utility. We are putting
the actual 'rpkg' package into a subpackage because there already
exists package https://src.fedoraproject.org/rpms/rpkg. That package,
however, does not actually produce rpkg rpm whereas rpkg-util does.https://pagure.io/rpkg-util.gitGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-2cad18b6-0b9c-4145-b242-641bbc352851rpkg-utilsrc50f1999386e17ebc504e997c292a3fe880ebbb98c949f594179a4b9983c1d675RPM packaging utilityThis package contains the rpkg utility. We are putting
the actual 'rpkg' package into a subpackage because there already
exists package https://src.fedoraproject.org/rpms/rpkg. That package,
however, does not actually produce rpkg rpm whereas rpkg-util does.https://pagure.io/rpkg-util.gitGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-6ed7d668-3966-4cd3-ba11-9539ec132f6erpkg-utilsrc1d9af1d51bb510a255e4085d421ddc7668b4a584d3a2ac5861d3b9210d03414dRPM packaging utilityThis package contains the rpkg utility. We are putting
the actual 'rpkg' package into a subpackage because there already
exists package https://src.fedoraproject.org/rpms/rpkg. That package,
however, does not actually produce rpkg rpm whereas rpkg-util does.https://pagure.io/rpkg-util.gitGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-e30cd1bc-a86c-40b4-81f9-f212cb2b8d61rpm-git-tag-sortsrcd5e3b607e5cf40a894d34e6c2e92afd697bbf4fac8ce0c9850b31dddc2bd4c9aSorts merged git annotated tags according to topology and rpm version sorting.Sorts git annotated tags of Name-Version-Release form
according to topology (primary criterion) and rpm
version sorting (secondary criterion). Outputs only
merged tags (i.e. those that reachable from the
current HEAD).https://pagure.io/rpm-git-tag-sortGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-e6cdad77-9911-45c8-8777-cf1d655a6de0rpm-git-tag-sortsrca4d269afd16243847516058d44472b3b0cb885298c6d1ec36a605f3b3f8dc7feSorts merged git annotated tags according to topology and rpm version sorting.Sorts git annotated tags of Name-Version-Release form
according to topology (primary criterion) and rpm
version sorting (secondary criterion). Outputs only
merged tags (i.e. those that reachable from the
current HEAD).https://pagure.io/rpm-git-tag-sortGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-88e9e813-9509-4e35-9603-ba79bacac921rpm-git-tag-sortsrc150b1eef459e9c5a628614437ec45e3805416a38c4a15d2ba0eab2a9568f0f05Sorts merged git annotated tags according to topology and rpm version sorting.Sorts git annotated tags of Name-Version-Release form
according to topology (primary criterion) and rpm
version sorting (secondary criterion). Outputs only
merged tags (i.e. those that reachable from the
current HEAD).https://pagure.io/rpm-git-tag-sortGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-9a10b6dc-5c69-47f6-a7f9-4da4c5998830rpm-git-tag-sortx86_64e8a4bcb41548d494755ab7dbd5a994c56e480d32124009d9ac439275c96fdb7aSorts merged git annotated tags according to topology and rpm version sorting.Sorts git annotated tags of Name-Version-Release form
according to topology (primary criterion) and rpm
version sorting (secondary criterion). Outputs only
merged tags (i.e. those that reachable from the
current HEAD).https://pagure.io/rpm-git-tag-sortGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-e6cdad77-9911-45c8-8777-cf1d655a6de0rpm-git-tag-sort-1.0-12.src.rpm/usr/bin/rpm-git-tag-sortrpm-git-tag-sortx86_6493dc3b8d13b6c6898c8b4fcb38ff6ae3259269d4420ab52abb68a31f732df240Sorts merged git annotated tags according to topology and rpm version sorting.Sorts git annotated tags of Name-Version-Release form
according to topology (primary criterion) and rpm
version sorting (secondary criterion). Outputs only
merged tags (i.e. those that reachable from the
current HEAD).https://pagure.io/rpm-git-tag-sortGPLv2+openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-9a10b6dc-5c69-47f6-a7f9-4da4c5998830rpm-git-tag-sort-1.0-12.src.rpm/usr/bin/rpm-git-tag-sortrpm-git-tag-sort-debuginfox86_6494fab9b9fe7b840435836f06e07de2fdf42c1766f6fcf18728532fbfd22e16ddDebug information for package rpm-git-tag-sortThis package provides debug information for package rpm-git-tag-sort.
Debug information is useful when developing applications that use this
package or when debugging this package.https://pagure.io/rpm-git-tag-sortGPLv2+openEuler Copr - user mywaaagh_adminDevelopment/Debugresalloc-e6cdad77-9911-45c8-8777-cf1d655a6de0rpm-git-tag-sort-1.0-12.src.rpm/usr/lib/debug/usr/bin/rpm-git-tag-sort-1.0-12.x86_64.debugrpm-git-tag-sort-debuginfox86_64a16002a2e8a9ac3a6ae299ba839b740706a5be841d5aa7d09d0942186af7ea25Debug information for package rpm-git-tag-sortThis package provides debug information for package rpm-git-tag-sort.
Debug information is useful when developing applications that use this
package or when debugging this package.https://pagure.io/rpm-git-tag-sortGPLv2+openEuler Copr - user mywaaagh_adminDevelopment/Debugresalloc-9a10b6dc-5c69-47f6-a7f9-4da4c5998830rpm-git-tag-sort-1.0-12.src.rpm/usr/lib/debug/usr/bin/rpm-git-tag-sort-1.0-12.x86_64.debugrpm-git-tag-sort-debugsourcex86_641632842463faca1710ba8dd5112754ada124ed976db154f76303b45e43d6b87cDebug sources for package rpm-git-tag-sortThis package provides debug sources for package rpm-git-tag-sort.
Debug sources are useful when developing applications that use this
package or when debugging this package.https://pagure.io/rpm-git-tag-sortGPLv2+openEuler Copr - user mywaaagh_adminDevelopment/Debugresalloc-e6cdad77-9911-45c8-8777-cf1d655a6de0rpm-git-tag-sort-1.0-12.src.rpmrpm-git-tag-sort-debugsourcex86_642116e741ac6712f97026ad2b35029ab5b493cec43bf4ebfff4cf9757c761c0b8Debug sources for package rpm-git-tag-sortThis package provides debug sources for package rpm-git-tag-sort.
Debug sources are useful when developing applications that use this
package or when debugging this package.https://pagure.io/rpm-git-tag-sortGPLv2+openEuler Copr - user mywaaagh_adminDevelopment/Debugresalloc-9a10b6dc-5c69-47f6-a7f9-4da4c5998830rpm-git-tag-sort-1.0-12.src.rpmrpmautospecnoarch809307c49889475217ed96f9d774af0340dd77475d3f8b3d10fb72d51e0812ddCLI tool for generating RPM releases and changelogsCLI tool for generating RPM releases and changelogshttps://pagure.io/fedora-infra/rpmautospecMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-c193af30-d8cf-41b3-964b-b57181e178a6python-rpmautospec-0.3.5-1.src.rpm/usr/bin/rpmautospecrpmautospecnoarche50ae6a8437e089422381468d7d0ed517df0b783f101c50289123c0b265f7262CLI tool for generating RPM releases and changelogsCLI tool for generating RPM releases and changelogshttps://pagure.io/fedora-infra/rpmautospecMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-f4072875-c26a-4cd8-abb4-0b60ae8fd4e9python-rpmautospec-0.3.5-1.src.rpm/usr/bin/rpmautospecrpmautospec-rpm-macrosnoarch94eb964010e9aa76b056206cff628e5e72345f8a12cba579f4332dee3adf009eRpmautospec RPM macros for local rpmbuildRPM macros with placeholders for building rpmautospec enabled packages localyhttps://pagure.io/fedora-infra/rpmautospecMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-c193af30-d8cf-41b3-964b-b57181e178a6python-rpmautospec-0.3.5-1.src.rpmrpmautospec-rpm-macrosnoarchbd534fe305089d634267cae995ea83a2602e1b56da7b2f9e41c677c5036f957bRpmautospec RPM macros for local rpmbuildRPM macros with placeholders for building rpmautospec enabled packages localyhttps://pagure.io/fedora-infra/rpmautospecMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-f4072875-c26a-4cd8-abb4-0b60ae8fd4e9python-rpmautospec-0.3.5-1.src.rpmtinisrc3e0754575f7632464d91c0d95a96af9e48628fd89d0e6fcfae63872b945dcc62A tiny but valid init for containersTini is the simplest init you could think of.
All Tini does is spawn a single child (Tini is meant to be run in a container),
and wait for it to exit all the while reaping zombies and performing signal
forwarding.https://github.com/krallin/tiniMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-0e55d371-871f-4a76-a04f-2c76ba8f9439tinix86_64a9f9bd717a4acb436f357b13f0e03d1d31915792d6c55d67930b8cc769c18ad2A tiny but valid init for containersTini is the simplest init you could think of.
All Tini does is spawn a single child (Tini is meant to be run in a container),
and wait for it to exit all the while reaping zombies and performing signal
forwarding.https://github.com/krallin/tiniMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-0e55d371-871f-4a76-a04f-2c76ba8f9439tini-0.19.0-1.src.rpm/usr/bin/tinitini-debuginfox86_64bdb577fed4b45803467d4be02b8b791130839127e0983f80222427495906463cDebug information for package tiniThis package provides debug information for package tini.
Debug information is useful when developing applications that use this
package or when debugging this package.https://github.com/krallin/tiniMITopenEuler Copr - user mywaaagh_adminDevelopment/Debugresalloc-0e55d371-871f-4a76-a04f-2c76ba8f9439tini-0.19.0-1.src.rpm/usr/lib/debug/usr/bin/tini-0.19.0-1.x86_64.debug/usr/lib/debug/usr/bin/tini-static-0.19.0-1.x86_64.debugtini-debugsourcex86_648c66c38c1e8969820284b7b6348f4a86c8ce1cfd57a99fafe1f291d671b26278Debug sources for package tiniThis package provides debug sources for package tini.
Debug sources are useful when developing applications that use this
package or when debugging this package.https://github.com/krallin/tiniMITopenEuler Copr - user mywaaagh_adminDevelopment/Debugresalloc-0e55d371-871f-4a76-a04f-2c76ba8f9439tini-0.19.0-1.src.rpmtini-staticx86_64ce74256a872f5b9362ea72bcb61896869fe483c74548e9ae20864d191e66e892Standalone static build of tiniThis package contains a standalone static build of tini, meant to be used
inside a container.https://github.com/krallin/tiniMITopenEuler Copr - user mywaaagh_adminUnspecifiedresalloc-0e55d371-871f-4a76-a04f-2c76ba8f9439tini-0.19.0-1.src.rpm/usr/bin/tini-statictitonoarch3b165425e78a66a977d3c5b26896d474082918153e233506c313a8bec851bf35A tool for managing rpm based git projectsTito is a tool for managing tarballs, rpms, and builds for projects using
git.https://github.com/rpm-software-management/titoGPLv2openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-5fe983d4-f064-40a4-a9c3-abdcc7e49028tito-0.6.21-1.src.rpm/usr/bin/generate-patches.pl/usr/bin/titotitosrc903fb54897bae1a3f595882cf3e480f4d9854d59a711b77d39aa6b90611ac7fcA tool for managing rpm based git projectsTito is a tool for managing tarballs, rpms, and builds for projects using
git.https://github.com/rpm-software-management/titoGPLv2openEuler Copr - user mywaaagh_adminUnspecifiedresalloc-5fe983d4-f064-40a4-a9c3-abdcc7e49028