hynek / pem

PEM file parsing in Python.
https://pem.readthedocs.io/
MIT License
159 stars 37 forks source link

pytest failed #76

Closed Misaka13514 closed 1 year ago

Misaka13514 commented 1 year ago
old log

``` $ git describe --long 23.1.0-2-g469d0f7 $ git reset --hard HEAD HEAD is now at 469d0f7 Collect subclasses less grossly $ python -m build --wheel * Creating virtualenv isolated environment... * Installing packages in isolated environment... (hatch-fancy-pypi-readme, hatch-vcs, hatchling) * Getting build dependencies for wheel... * Building wheel... Successfully built pem-23.1.1.dev2-py3-none-any.whl $ pytest =================================================================================== test session starts ==================================================================================== platform linux -- Python 3.11.3, pytest-7.3.2, pluggy-1.0.0 rootdir: /home/user/pem configfile: pyproject.toml testpaths: tests plugins: anyio-3.7.0 collected 86 items tests/test_core.py ......FFFFFF...........................F................F....FFFFFFF [ 79%] tests/test_packaging.py .FFFF [ 84%] tests/test_twisted.py ............. [100%] ========================================================================================= FAILURES ========================================================================================= _____________________________________________________________________________ TestPEMObjects.test_text_payload _____________________________________________________________________________ self = def test_text_payload(self): """ obj.text_payload is a base64-encoded payload as text. """ > payload = pem.parse(KEY_PEM_PKCS5_UNENCRYPTED)[0].text_payload E AttributeError: 'RSAPrivateKey' object has no attribute 'text_payload' tests/test_core.py:101: AttributeError _ TestPEMObjects.test_payload_with_headers[---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----\nComment: "rsa-key-20210120"\nP2/56wAAAUwAAAA3aWYtbW9kbntzaWdue3JzYS1wa2NzMS1zaGExfSxlbmNyeXB0e3JzYS\n1wa2NzMXYyLW9hZXB9fQAAAARub25lAAAA/QAAAPkAAAAGJQAAAf0VIAK0MvdpUXEG6obL\n3F5n0UimJWvwhJIb5AGyd++EdYvimCOg9iM2E75dDj89Ap7S5l4IS40fZO/5UjzYQxitAA\nACAMNoGQLXcI4xVX/5Xt22aUBP4ADaJnDKR4H9D7LVZ4lBDUP8RBTmowCv9p3Hz7KvVw3R\nTX8BNF72gEuSOvruUAUAAAD9Hs7Zn1KbFR29ujFEv+d50/7rjMU7Ox4tzDeTSE6PBhsAAA\nEA3m/0JWkf61807iZ7AV8umYJMmNQ35HadG53n9nitpFEAAAEA4OQI1Rrh8e1EZ5qJBV8o\ngGyxzt4OdoXzuOtxkbHUB3U=\n---- END SSH2 ENCRYPTED PRIVATE KEY ----\n-Comment:] _ self = bs = b'---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----\nComment: "rsa-key-20210120"\nP2/56wAAAUwAAAA3aWYtbW9kbntzaWdue3JzYS1wa2N...mYJMmNQ35HadG53n9nitpFEAAAEA4OQI1Rrh8e1EZ5qJBV8o\ngGyxzt4OdoXzuOtxkbHUB3U=\n---- END SSH2 ENCRYPTED PRIVATE KEY ----\n' forbidden = b'Comment:' @pytest.mark.parametrize( ("bs", "forbidden"), [ (KEY_PEM_SSHCOM_PRIVATE, b"Comment:"), (KEY_PEM_OPENPGP_PUBLIC, b"Version:"), (KEY_PEM_OPENPGP_PRIVATE, b"Comment:"), (KEY_PEM_PKCS5_ENCRYPTED, b"Proc-Type:"), ], ) def test_payload_with_headers(self, bs, forbidden): """ Headers are removed from the payload. """ assert forbidden in bs (cert,) = pem.parse(bs) > assert forbidden.decode() not in cert.text_payload E AttributeError: 'SSHCOMPrivateKey' object has no attribute 'text_payload' tests/test_core.py:126: AttributeError _ TestPEMObjects.test_payload_with_headers[-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: Encryption Desktop 10.4.2 (Build 289)\n\n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\nkss=\n=hCPU\n-----END PGP PUBLIC KEY BLOCK-----\n-Version:] _ self = bs = b'-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: Encryption Desktop 10.4.2 (Build 289)\n\nmQINBGLoNzcBEACXineYjpC9Am/q...c\n8+OnsR0t7fjotTjCAjiBcHIMCpFJjv+AsnXZEib9z206L4I6rieXTQoaazEgJcNm\nkss=\n=hCPU\n-----END PGP PUBLIC KEY BLOCK-----\n' forbidden = b'Version:' @pytest.mark.parametrize( ("bs", "forbidden"), [ (KEY_PEM_SSHCOM_PRIVATE, b"Comment:"), (KEY_PEM_OPENPGP_PUBLIC, b"Version:"), (KEY_PEM_OPENPGP_PRIVATE, b"Comment:"), (KEY_PEM_PKCS5_ENCRYPTED, b"Proc-Type:"), ], ) def test_payload_with_headers(self, bs, forbidden): """ Headers are removed from the payload. """ assert forbidden in bs > (cert,) = pem.parse(bs) E ValueError: not enough values to unpack (expected 1, got 0) tests/test_core.py:124: ValueError _ TestPEMObjects.test_payload_with_headers[-----BEGIN PGP PRIVATE KEY BLOCK-----\nComment: Alice's OpenPGP Transferable Secret Key\nComment: https://www.ietf.org/id/draft-bre-openpgp-samples-01.html\n\nlFgEXEcE6RYJKwYBBAHaRw8BAQdArjWwk3FAqyiFbFBKT4TzXcVBqPTB3gmzlC/U\nb7O1u10AAP9XBeW6lzGOLx7zHH9AsUDUTb2pggYGMzd0P3ulJ2AfvQ4RtCZBbGlj\nZSBMb3ZlbGFjZSA8YWxpY2VAb3BlbnBncC5leGFtcGxlPoiQBBMWCAA4AhsDBQsJ\nCAcCBhUKCQgLAgQWAgMBAh4BAheAFiEE64W7X6M6deFelE5j8jFVDE9H444FAl2l\nnzoACgkQ8jFVDE9H447pKwD6A5xwUqIDprBzrHfahrImaYEZzncqb25vkLV2arYf\na78A/R3AwtLQvjxwLDuzk4dUtUwvUYibL2sAHwj2kGaHnfICnF0EXEcE6RIKKwYB\nBAGXVQEFAQEHQEL/BiGtq0k84Km1wqQw2DIikVYrQrMttN8d7BPfnr4iAwEIBwAA\n/3/xFPG6U17rhTuq+07gmEvaFYKfxRB6sgAYiW6TMTpQEK6IeAQYFggAIBYhBOuF\nu1+jOnXhXpROY/IxVQxPR+OOBQJcRwTpAhsMAAoJEPIxVQxPR+OOWdABAMUdSzpM\nhzGs1O0RkWNQWbUzQ8nUOeD9wNbjE3zR+yfRAQDbYqvtWQKN4AQLTxVJN5X5AWyb\nPnn+We1aTBhaGa86AQ==\n=n8OM\n-----END PGP PRIVATE KEY BLOCK-----\n-Comment:] _ self = bs = b"-----BEGIN PGP PRIVATE KEY BLOCK-----\nComment: Alice's OpenPGP Transferable Secret Key\nComment: https://www.ietf.o...UzQ8nUOeD9wNbjE3zR+yfRAQDbYqvtWQKN4AQLTxVJN5X5AWyb\nPnn+We1aTBhaGa86AQ==\n=n8OM\n-----END PGP PRIVATE KEY BLOCK-----\n" forbidden = b'Comment:' @pytest.mark.parametrize( ("bs", "forbidden"), [ (KEY_PEM_SSHCOM_PRIVATE, b"Comment:"), (KEY_PEM_OPENPGP_PUBLIC, b"Version:"), (KEY_PEM_OPENPGP_PRIVATE, b"Comment:"), (KEY_PEM_PKCS5_ENCRYPTED, b"Proc-Type:"), ], ) def test_payload_with_headers(self, bs, forbidden): """ Headers are removed from the payload. """ assert forbidden in bs > (cert,) = pem.parse(bs) E ValueError: not enough values to unpack (expected 1, got 0) tests/test_core.py:124: ValueError _ TestPEMObjects.test_payload_with_headers[-----BEGIN RSA PRIVATE KEY-----\nProc-Type: 4,ENCRYPTED\nDEK-Info: DES-EDE3-CBC,8A72BD2DC1C9092F\n\n6LgvCNeXdcuTayEOKhQo2N4IveCP0S3t8xJCeihW9yizLeQFzSjqSfKtmRyImjfg\nfMl8IMDFozR+xVE9uWaIo98wKWpjyu6cytYyjL/8SP3jswBoSP5P9OekUSLifPWM\nghUEu6tGissqSs/8i2wzLIdho3DdUnUMPZIprENmK6HrYmdRtJT3qMgkFTCtCS9Q\nr9oPm7xKPsfKBhaUHK51JcsPkPjrny8Dl56W0IYf/dfvRPwSr5yFQFLk6Nbgnx0N\n32aT3ZMRCEvOTxhX1cO3f5JqYLxFAGKBFwvsulTisJ6rGYOEDSMBDwZc3sqLvt5g\nh0vKRPqSkylQ0W5shNg0bwbxySiRxJPBL8kWDAbJVfauArabLPuNkUNwmYhIjy7j\nlY0oYw2xeJ9hTUly/Zg3+DI8oYYY3z7WaxPHXEoicCE=\n-----END RSA PRIVATE KEY-----\n-Proc-Type:] _ self = bs = b'-----BEGIN RSA PRIVATE KEY-----\nProc-Type: 4,ENCRYPTED\nDEK-Info: DES-EDE3-CBC,8A72BD2DC1C9092F\n\n6LgvCNeXdcuTayEO...SiRxJPBL8kWDAbJVfauArabLPuNkUNwmYhIjy7j\nlY0oYw2xeJ9hTUly/Zg3+DI8oYYY3z7WaxPHXEoicCE=\n-----END RSA PRIVATE KEY-----\n' forbidden = b'Proc-Type:' @pytest.mark.parametrize( ("bs", "forbidden"), [ (KEY_PEM_SSHCOM_PRIVATE, b"Comment:"), (KEY_PEM_OPENPGP_PUBLIC, b"Version:"), (KEY_PEM_OPENPGP_PRIVATE, b"Comment:"), (KEY_PEM_PKCS5_ENCRYPTED, b"Proc-Type:"), ], ) def test_payload_with_headers(self, bs, forbidden): """ Headers are removed from the payload. """ assert forbidden in bs (cert,) = pem.parse(bs) > assert forbidden.decode() not in cert.text_payload E AttributeError: 'RSAPrivateKey' object has no attribute 'text_payload' tests/test_core.py:126: AttributeError ___________________________________________________________________________ TestPEMObjects.test_decoded_payload ____________________________________________________________________________ self = def test_decoded_payload(self): """ obj.decoded_payload is a base64-decoded payload as bytes. """ cert = """\ -----BEGIN EC PRIVATE KEY----- cGF5bG9hZF9kYXRhMQ== -----END EC PRIVATE KEY-----""" > payload_bytes = pem.Certificate(cert).decoded_payload E AttributeError: 'Certificate' object has no attribute 'decoded_payload' tests/test_core.py:138: AttributeError ___________________________________________________________________________ TestParse.test_key_pkcs5_unencrypted ___________________________________________________________________________ self = def test_key_pkcs5_unencrypted(self): """ It can load an unencrypted PKCS#5 RSA key as PEM string as an RSAPrivateKey. """ rv = pem.parse(KEY_PEM_PKCS5_UNENCRYPTED) (key,) = rv assert isinstance(key, pem.RSAPrivateKey) assert KEY_PEM_PKCS5_UNENCRYPTED == key.as_bytes() > assert KEY_PEM_PKCS5_UNENCRYPTED_PAYLOAD == key.bytes_payload E AttributeError: 'RSAPrivateKey' object has no attribute 'bytes_payload' tests/test_core.py:432: AttributeError _________________________________________________________________________________ TestParse.test_parse_str _________________________________________________________________________________ self = def test_parse_str(self): """ " parse() accepts str too. """ > assert pem.parse(KEY_PEM_EC_PRIVATE) == pem.parse( KEY_PEM_EC_PRIVATE.decode() ) tests/test_core.py:612: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pem_str = '-----BEGIN EC PRIVATE KEY-----\nMHQCAQEEIGTpm0NjJRU5dYDrRPh+C9agdudJvCGSBd1hah5jnMYPoAcGBSuBBAAK\noUQDQgAEyEVc22cgFbf0Ey4W7tNawHEW4o+4xNVznhP4et9g53Puw1KSVD/GOfl1\n95dwvaIyx2XZG8tn9DRsVyjy8fjgFA==\n-----END EC PRIVATE KEY-----' def parse(pem_str): # type: (bytes) -> List[AbstractPEMObject] """ Extract PEM-like objects from *pem_str*. :param pem_str: String to parse. :type pem_str: bytes :return: list of :ref:`pem-objects` """ return [ _PEM_TO_CLASS[match.group(1)](match.group(0)) > for match in _PEM_RE.finditer(pem_str) ] E TypeError: cannot use a bytes pattern on a string-like object /usr/lib/python3.11/site-packages/pem/_core.py:266: TypeError ____________________________________________________________________________ TestParse.test_openpgp_public_key _____________________________________________________________________________ self = def test_openpgp_public_key(self): """ Detects and loads OpenPGP public keys. """ > (key,) = pem.parse(KEY_PEM_OPENPGP_PUBLIC) E ValueError: not enough values to unpack (expected 1, got 0) tests/test_core.py:661: ValueError ____________________________________________________________________________ TestParse.test_openpgp_private_key ____________________________________________________________________________ self = def test_openpgp_private_key(self): """ Detects and loads OpenPGP private keys. """ > (key,) = pem.parse(KEY_PEM_OPENPGP_PRIVATE) E ValueError: not enough values to unpack (expected 1, got 0) tests/test_core.py:670: ValueError _ TestParse.test_headers[---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----\nComment: "rsa-key-20210120"\nP2/56wAAAUwAAAA3aWYtbW9kbntzaWdue3JzYS1wa2NzMS1zaGExfSxlbmNyeXB0e3JzYS\n1wa2NzMXYyLW9hZXB9fQAAAARub25lAAAA/QAAAPkAAAAGJQAAAf0VIAK0MvdpUXEG6obL\n3F5n0UimJWvwhJIb5AGyd++EdYvimCOg9iM2E75dDj89Ap7S5l4IS40fZO/5UjzYQxitAA\nACAMNoGQLXcI4xVX/5Xt22aUBP4ADaJnDKR4H9D7LVZ4lBDUP8RBTmowCv9p3Hz7KvVw3R\nTX8BNF72gEuSOvruUAUAAAD9Hs7Zn1KbFR29ujFEv+d50/7rjMU7Ox4tzDeTSE6PBhsAAA\nEA3m/0JWkf61807iZ7AV8umYJMmNQ35HadG53n9nitpFEAAAEA4OQI1Rrh8e1EZ5qJBV8o\ngGyxzt4OdoXzuOtxkbHUB3U=\n---- END SSH2 ENCRYPTED PRIVATE KEY ----\n-hdrs0] _ self = bs = b'---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----\nComment: "rsa-key-20210120"\nP2/56wAAAUwAAAA3aWYtbW9kbntzaWdue3JzYS1wa2N...mYJMmNQ35HadG53n9nitpFEAAAEA4OQI1Rrh8e1EZ5qJBV8o\ngGyxzt4OdoXzuOtxkbHUB3U=\n---- END SSH2 ENCRYPTED PRIVATE KEY ----\n' hdrs = {'Comment': 'rsa-key-20210120'} @pytest.mark.parametrize( ("bs", "hdrs"), [ (KEY_PEM_SSHCOM_PRIVATE, {"Comment": "rsa-key-20210120"}), ( KEY_PEM_OPENPGP_PUBLIC, {"Version": "Encryption Desktop 10.4.2 (Build 289)"}, ), ( KEY_PEM_OPENPGP_PRIVATE, { "Comment": "https://www.ietf.org/id/draft-bre-openpgp-samples-01.html" }, ), ( KEY_PEM_PKCS5_ENCRYPTED, { "DEK-Info": "DES-EDE3-CBC,8A72BD2DC1C9092F", "Proc-Type": "4,ENCRYPTED", }, ), ], ) def test_headers(self, bs, hdrs): """ Headers are preserved. """ > assert hdrs == pem.parse(bs)[0].meta_headers E AttributeError: 'SSHCOMPrivateKey' object has no attribute 'meta_headers' tests/test_core.py:702: AttributeError _ TestParse.test_headers[-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: Encryption Desktop 10.4.2 (Build 289)\n\n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\nkss=\n=hCPU\n-----END PGP PUBLIC KEY BLOCK-----\n-hdrs1] _ self = bs = b'-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: Encryption Desktop 10.4.2 (Build 289)\n\nmQINBGLoNzcBEACXineYjpC9Am/q...c\n8+OnsR0t7fjotTjCAjiBcHIMCpFJjv+AsnXZEib9z206L4I6rieXTQoaazEgJcNm\nkss=\n=hCPU\n-----END PGP PUBLIC KEY BLOCK-----\n' hdrs = {'Version': 'Encryption Desktop 10.4.2 (Build 289)'} @pytest.mark.parametrize( ("bs", "hdrs"), [ (KEY_PEM_SSHCOM_PRIVATE, {"Comment": "rsa-key-20210120"}), ( KEY_PEM_OPENPGP_PUBLIC, {"Version": "Encryption Desktop 10.4.2 (Build 289)"}, ), ( KEY_PEM_OPENPGP_PRIVATE, { "Comment": "https://www.ietf.org/id/draft-bre-openpgp-samples-01.html" }, ), ( KEY_PEM_PKCS5_ENCRYPTED, { "DEK-Info": "DES-EDE3-CBC,8A72BD2DC1C9092F", "Proc-Type": "4,ENCRYPTED", }, ), ], ) def test_headers(self, bs, hdrs): """ Headers are preserved. """ > assert hdrs == pem.parse(bs)[0].meta_headers E IndexError: list index out of range tests/test_core.py:702: IndexError _ TestParse.test_headers[-----BEGIN PGP PRIVATE KEY BLOCK-----\nComment: Alice's OpenPGP Transferable Secret Key\nComment: https://www.ietf.org/id/draft-bre-openpgp-samples-01.html\n\nlFgEXEcE6RYJKwYBBAHaRw8BAQdArjWwk3FAqyiFbFBKT4TzXcVBqPTB3gmzlC/U\nb7O1u10AAP9XBeW6lzGOLx7zHH9AsUDUTb2pggYGMzd0P3ulJ2AfvQ4RtCZBbGlj\nZSBMb3ZlbGFjZSA8YWxpY2VAb3BlbnBncC5leGFtcGxlPoiQBBMWCAA4AhsDBQsJ\nCAcCBhUKCQgLAgQWAgMBAh4BAheAFiEE64W7X6M6deFelE5j8jFVDE9H444FAl2l\nnzoACgkQ8jFVDE9H447pKwD6A5xwUqIDprBzrHfahrImaYEZzncqb25vkLV2arYf\na78A/R3AwtLQvjxwLDuzk4dUtUwvUYibL2sAHwj2kGaHnfICnF0EXEcE6RIKKwYB\nBAGXVQEFAQEHQEL/BiGtq0k84Km1wqQw2DIikVYrQrMttN8d7BPfnr4iAwEIBwAA\n/3/xFPG6U17rhTuq+07gmEvaFYKfxRB6sgAYiW6TMTpQEK6IeAQYFggAIBYhBOuF\nu1+jOnXhXpROY/IxVQxPR+OOBQJcRwTpAhsMAAoJEPIxVQxPR+OOWdABAMUdSzpM\nhzGs1O0RkWNQWbUzQ8nUOeD9wNbjE3zR+yfRAQDbYqvtWQKN4AQLTxVJN5X5AWyb\nPnn+We1aTBhaGa86AQ==\n=n8OM\n-----END PGP PRIVATE KEY BLOCK-----\n-hdrs2] _ self = bs = b"-----BEGIN PGP PRIVATE KEY BLOCK-----\nComment: Alice's OpenPGP Transferable Secret Key\nComment: https://www.ietf.o...UzQ8nUOeD9wNbjE3zR+yfRAQDbYqvtWQKN4AQLTxVJN5X5AWyb\nPnn+We1aTBhaGa86AQ==\n=n8OM\n-----END PGP PRIVATE KEY BLOCK-----\n" hdrs = {'Comment': 'https://www.ietf.org/id/draft-bre-openpgp-samples-01.html'} @pytest.mark.parametrize( ("bs", "hdrs"), [ (KEY_PEM_SSHCOM_PRIVATE, {"Comment": "rsa-key-20210120"}), ( KEY_PEM_OPENPGP_PUBLIC, {"Version": "Encryption Desktop 10.4.2 (Build 289)"}, ), ( KEY_PEM_OPENPGP_PRIVATE, { "Comment": "https://www.ietf.org/id/draft-bre-openpgp-samples-01.html" }, ), ( KEY_PEM_PKCS5_ENCRYPTED, { "DEK-Info": "DES-EDE3-CBC,8A72BD2DC1C9092F", "Proc-Type": "4,ENCRYPTED", }, ), ], ) def test_headers(self, bs, hdrs): """ Headers are preserved. """ > assert hdrs == pem.parse(bs)[0].meta_headers E IndexError: list index out of range tests/test_core.py:702: IndexError _ TestParse.test_headers[-----BEGIN RSA PRIVATE KEY-----\nProc-Type: 4,ENCRYPTED\nDEK-Info: DES-EDE3-CBC,8A72BD2DC1C9092F\n\n6LgvCNeXdcuTayEOKhQo2N4IveCP0S3t8xJCeihW9yizLeQFzSjqSfKtmRyImjfg\nfMl8IMDFozR+xVE9uWaIo98wKWpjyu6cytYyjL/8SP3jswBoSP5P9OekUSLifPWM\nghUEu6tGissqSs/8i2wzLIdho3DdUnUMPZIprENmK6HrYmdRtJT3qMgkFTCtCS9Q\nr9oPm7xKPsfKBhaUHK51JcsPkPjrny8Dl56W0IYf/dfvRPwSr5yFQFLk6Nbgnx0N\n32aT3ZMRCEvOTxhX1cO3f5JqYLxFAGKBFwvsulTisJ6rGYOEDSMBDwZc3sqLvt5g\nh0vKRPqSkylQ0W5shNg0bwbxySiRxJPBL8kWDAbJVfauArabLPuNkUNwmYhIjy7j\nlY0oYw2xeJ9hTUly/Zg3+DI8oYYY3z7WaxPHXEoicCE=\n-----END RSA PRIVATE KEY-----\n-hdrs3] _ self = bs = b'-----BEGIN RSA PRIVATE KEY-----\nProc-Type: 4,ENCRYPTED\nDEK-Info: DES-EDE3-CBC,8A72BD2DC1C9092F\n\n6LgvCNeXdcuTayEO...SiRxJPBL8kWDAbJVfauArabLPuNkUNwmYhIjy7j\nlY0oYw2xeJ9hTUly/Zg3+DI8oYYY3z7WaxPHXEoicCE=\n-----END RSA PRIVATE KEY-----\n' hdrs = {'DEK-Info': 'DES-EDE3-CBC,8A72BD2DC1C9092F', 'Proc-Type': '4,ENCRYPTED'} @pytest.mark.parametrize( ("bs", "hdrs"), [ (KEY_PEM_SSHCOM_PRIVATE, {"Comment": "rsa-key-20210120"}), ( KEY_PEM_OPENPGP_PUBLIC, {"Version": "Encryption Desktop 10.4.2 (Build 289)"}, ), ( KEY_PEM_OPENPGP_PRIVATE, { "Comment": "https://www.ietf.org/id/draft-bre-openpgp-samples-01.html" }, ), ( KEY_PEM_PKCS5_ENCRYPTED, { "DEK-Info": "DES-EDE3-CBC,8A72BD2DC1C9092F", "Proc-Type": "4,ENCRYPTED", }, ), ], ) def test_headers(self, bs, hdrs): """ Headers are preserved. """ > assert hdrs == pem.parse(bs)[0].meta_headers E AttributeError: 'RSAPrivateKey' object has no attribute 'meta_headers' tests/test_core.py:702: AttributeError ________________________________________________________________________________ TestParse.test_no_headers _________________________________________________________________________________ self = def test_no_headers(self): """ No headers, no problem. """ cert = pem.parse(CERT_PEM_OPENSSL_TRUSTED)[0] > assert {} == cert.meta_headers E AttributeError: 'OpenSSLTrustedCertificate' object has no attribute 'meta_headers' tests/test_core.py:710: AttributeError _________________________________________________________________________ TestLegacyMetadataHack.test_description __________________________________________________________________________ self = def test_description(self): """ pem.__description__ returns the correct description. """ with pytest.deprecated_call(): > assert "PEM file parsing in Python." == pem.__description__ E AssertionError: assert 'PEM file parsing in Python.' == 'Easy PEM fil...ng in Python.' E - Easy PEM file parsing in Python. E ? ----- E + PEM file parsing in Python. tests/test_packaging.py:25: AssertionError _____________________________________________________________________________ TestLegacyMetadataHack.test_uri ______________________________________________________________________________ self = def test_uri(self): """ pem.__uri__ returns the correct project URL. """ > with pytest.deprecated_call(): E Failed: DID NOT WARN. No warnings of type (, ) were emitted. E The list of emitted warnings is: []. tests/test_packaging.py:31: Failed ____________________________________________________________________________ TestLegacyMetadataHack.test_email _____________________________________________________________________________ self = def test_email(self): """ pem.__email__ returns Hynek's email address. """ > with pytest.deprecated_call(): E Failed: DID NOT WARN. No warnings of type (, ) were emitted. E The list of emitted warnings is: []. tests/test_packaging.py:38: Failed ________________________________________________________________________ TestLegacyMetadataHack.test_does_not_exist ________________________________________________________________________ self = def test_does_not_exist(self): """ Asking for unsupported dunders raises an AttributeError. """ with pytest.raises( AttributeError, match="module pem has no attribute __yolo__", ): > pem.__yolo__ # noqa: B018 E AttributeError: module 'pem' has no attribute '__yolo__' tests/test_packaging.py:49: AttributeError During handling of the above exception, another exception occurred: self = def test_does_not_exist(self): """ Asking for unsupported dunders raises an AttributeError. """ > with pytest.raises( AttributeError, match="module pem has no attribute __yolo__", ): E AssertionError: Regex pattern did not match. E Regex: 'module pem has no attribute __yolo__' E Input: "module 'pem' has no attribute '__yolo__'" tests/test_packaging.py:45: AssertionError ================================================================================= short test summary info ================================================================================== FAILED tests/test_core.py::TestPEMObjects::test_text_payload - AttributeError: 'RSAPrivateKey' object has no attribute 'text_payload' FAILED tests/test_core.py::TestPEMObjects::test_payload_with_headers[---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----\nComment: "rsa-key-20210120"\nP2/56wAAAUwAAAA3aWYtbW9kbntzaWdue3JzYS1wa2NzMS1zaGExfSxlbmNyeXB0e3JzYS\n1wa2NzMXYyLW9hZXB9fQAAAARub25lAAAA/QAAAPkAAAAGJQAAAf0VIAK0MvdpUXEG6obL\n3F5n0UimJWvwhJIb5AGyd++EdYvimCOg9iM2E75dDj89Ap7S5l4IS40fZO/5UjzYQxitAA\nACAMNoGQLXcI4xVX/5Xt22aUBP4ADaJnDKR4H9D7LVZ4lBDUP8RBTmowCv9p3Hz7KvVw3R\nTX8BNF72gEuSOvruUAUAAAD9Hs7Zn1KbFR29ujFEv+d50/7rjMU7Ox4tzDeTSE6PBhsAAA\nEA3m/0JWkf61807iZ7AV8umYJMmNQ35HadG53n9nitpFEAAAEA4OQI1Rrh8e1EZ5qJBV8o\ngGyxzt4OdoXzuOtxkbHUB3U=\n---- END SSH2 ENCRYPTED PRIVATE KEY ----\n-Comment:] - AttributeError: 'SSHCOMPrivateKey' object has no attribute 'text_payload' FAILED tests/test_core.py::TestPEMObjects::test_payload_with_headers[-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: Encryption Desktop 10.4.2 (Build 289)\n\n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\nkss=\n=hCPU\n-----END PGP PUBLIC KEY BLOCK-----\n-Version:] - ValueError: not enough values to unpack (expected 1, got 0) FAILED tests/test_core.py::TestPEMObjects::test_payload_with_headers[-----BEGIN PGP PRIVATE KEY BLOCK-----\nComment: Alice's OpenPGP Transferable Secret Key\nComment: https://www.ietf.org/id/draft-bre-openpgp-samples-01.html\n\nlFgEXEcE6RYJKwYBBAHaRw8BAQdArjWwk3FAqyiFbFBKT4TzXcVBqPTB3gmzlC/U\nb7O1u10AAP9XBeW6lzGOLx7zHH9AsUDUTb2pggYGMzd0P3ulJ2AfvQ4RtCZBbGlj\nZSBMb3ZlbGFjZSA8YWxpY2VAb3BlbnBncC5leGFtcGxlPoiQBBMWCAA4AhsDBQsJ\nCAcCBhUKCQgLAgQWAgMBAh4BAheAFiEE64W7X6M6deFelE5j8jFVDE9H444FAl2l\nnzoACgkQ8jFVDE9H447pKwD6A5xwUqIDprBzrHfahrImaYEZzncqb25vkLV2arYf\na78A/R3AwtLQvjxwLDuzk4dUtUwvUYibL2sAHwj2kGaHnfICnF0EXEcE6RIKKwYB\nBAGXVQEFAQEHQEL/BiGtq0k84Km1wqQw2DIikVYrQrMttN8d7BPfnr4iAwEIBwAA\n/3/xFPG6U17rhTuq+07gmEvaFYKfxRB6sgAYiW6TMTpQEK6IeAQYFggAIBYhBOuF\nu1+jOnXhXpROY/IxVQxPR+OOBQJcRwTpAhsMAAoJEPIxVQxPR+OOWdABAMUdSzpM\nhzGs1O0RkWNQWbUzQ8nUOeD9wNbjE3zR+yfRAQDbYqvtWQKN4AQLTxVJN5X5AWyb\nPnn+We1aTBhaGa86AQ==\n=n8OM\n-----END PGP PRIVATE KEY BLOCK-----\n-Comment:] - ValueError: not enough values to unpack (expected 1, got 0) FAILED tests/test_core.py::TestPEMObjects::test_payload_with_headers[-----BEGIN RSA PRIVATE KEY-----\nProc-Type: 4,ENCRYPTED\nDEK-Info: DES-EDE3-CBC,8A72BD2DC1C9092F\n\n6LgvCNeXdcuTayEOKhQo2N4IveCP0S3t8xJCeihW9yizLeQFzSjqSfKtmRyImjfg\nfMl8IMDFozR+xVE9uWaIo98wKWpjyu6cytYyjL/8SP3jswBoSP5P9OekUSLifPWM\nghUEu6tGissqSs/8i2wzLIdho3DdUnUMPZIprENmK6HrYmdRtJT3qMgkFTCtCS9Q\nr9oPm7xKPsfKBhaUHK51JcsPkPjrny8Dl56W0IYf/dfvRPwSr5yFQFLk6Nbgnx0N\n32aT3ZMRCEvOTxhX1cO3f5JqYLxFAGKBFwvsulTisJ6rGYOEDSMBDwZc3sqLvt5g\nh0vKRPqSkylQ0W5shNg0bwbxySiRxJPBL8kWDAbJVfauArabLPuNkUNwmYhIjy7j\nlY0oYw2xeJ9hTUly/Zg3+DI8oYYY3z7WaxPHXEoicCE=\n-----END RSA PRIVATE KEY-----\n-Proc-Type:] - AttributeError: 'RSAPrivateKey' object has no attribute 'text_payload' FAILED tests/test_core.py::TestPEMObjects::test_decoded_payload - AttributeError: 'Certificate' object has no attribute 'decoded_payload' FAILED tests/test_core.py::TestParse::test_key_pkcs5_unencrypted - AttributeError: 'RSAPrivateKey' object has no attribute 'bytes_payload' FAILED tests/test_core.py::TestParse::test_parse_str - TypeError: cannot use a bytes pattern on a string-like object FAILED tests/test_core.py::TestParse::test_openpgp_public_key - ValueError: not enough values to unpack (expected 1, got 0) FAILED tests/test_core.py::TestParse::test_openpgp_private_key - ValueError: not enough values to unpack (expected 1, got 0) FAILED tests/test_core.py::TestParse::test_headers[---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----\nComment: "rsa-key-20210120"\nP2/56wAAAUwAAAA3aWYtbW9kbntzaWdue3JzYS1wa2NzMS1zaGExfSxlbmNyeXB0e3JzYS\n1wa2NzMXYyLW9hZXB9fQAAAARub25lAAAA/QAAAPkAAAAGJQAAAf0VIAK0MvdpUXEG6obL\n3F5n0UimJWvwhJIb5AGyd++EdYvimCOg9iM2E75dDj89Ap7S5l4IS40fZO/5UjzYQxitAA\nACAMNoGQLXcI4xVX/5Xt22aUBP4ADaJnDKR4H9D7LVZ4lBDUP8RBTmowCv9p3Hz7KvVw3R\nTX8BNF72gEuSOvruUAUAAAD9Hs7Zn1KbFR29ujFEv+d50/7rjMU7Ox4tzDeTSE6PBhsAAA\nEA3m/0JWkf61807iZ7AV8umYJMmNQ35HadG53n9nitpFEAAAEA4OQI1Rrh8e1EZ5qJBV8o\ngGyxzt4OdoXzuOtxkbHUB3U=\n---- END SSH2 ENCRYPTED PRIVATE KEY ----\n-hdrs0] - AttributeError: 'SSHCOMPrivateKey' object has no attribute 'meta_headers' FAILED tests/test_core.py::TestParse::test_headers[-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: Encryption Desktop 10.4.2 (Build 289)\n\n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\nkss=\n=hCPU\n-----END PGP PUBLIC KEY BLOCK-----\n-hdrs1] - IndexError: list index out of range FAILED tests/test_core.py::TestParse::test_headers[-----BEGIN PGP PRIVATE KEY BLOCK-----\nComment: Alice's OpenPGP Transferable Secret Key\nComment: https://www.ietf.org/id/draft-bre-openpgp-samples-01.html\n\nlFgEXEcE6RYJKwYBBAHaRw8BAQdArjWwk3FAqyiFbFBKT4TzXcVBqPTB3gmzlC/U\nb7O1u10AAP9XBeW6lzGOLx7zHH9AsUDUTb2pggYGMzd0P3ulJ2AfvQ4RtCZBbGlj\nZSBMb3ZlbGFjZSA8YWxpY2VAb3BlbnBncC5leGFtcGxlPoiQBBMWCAA4AhsDBQsJ\nCAcCBhUKCQgLAgQWAgMBAh4BAheAFiEE64W7X6M6deFelE5j8jFVDE9H444FAl2l\nnzoACgkQ8jFVDE9H447pKwD6A5xwUqIDprBzrHfahrImaYEZzncqb25vkLV2arYf\na78A/R3AwtLQvjxwLDuzk4dUtUwvUYibL2sAHwj2kGaHnfICnF0EXEcE6RIKKwYB\nBAGXVQEFAQEHQEL/BiGtq0k84Km1wqQw2DIikVYrQrMttN8d7BPfnr4iAwEIBwAA\n/3/xFPG6U17rhTuq+07gmEvaFYKfxRB6sgAYiW6TMTpQEK6IeAQYFggAIBYhBOuF\nu1+jOnXhXpROY/IxVQxPR+OOBQJcRwTpAhsMAAoJEPIxVQxPR+OOWdABAMUdSzpM\nhzGs1O0RkWNQWbUzQ8nUOeD9wNbjE3zR+yfRAQDbYqvtWQKN4AQLTxVJN5X5AWyb\nPnn+We1aTBhaGa86AQ==\n=n8OM\n-----END PGP PRIVATE KEY BLOCK-----\n-hdrs2] - IndexError: list index out of range FAILED tests/test_core.py::TestParse::test_headers[-----BEGIN RSA PRIVATE KEY-----\nProc-Type: 4,ENCRYPTED\nDEK-Info: DES-EDE3-CBC,8A72BD2DC1C9092F\n\n6LgvCNeXdcuTayEOKhQo2N4IveCP0S3t8xJCeihW9yizLeQFzSjqSfKtmRyImjfg\nfMl8IMDFozR+xVE9uWaIo98wKWpjyu6cytYyjL/8SP3jswBoSP5P9OekUSLifPWM\nghUEu6tGissqSs/8i2wzLIdho3DdUnUMPZIprENmK6HrYmdRtJT3qMgkFTCtCS9Q\nr9oPm7xKPsfKBhaUHK51JcsPkPjrny8Dl56W0IYf/dfvRPwSr5yFQFLk6Nbgnx0N\n32aT3ZMRCEvOTxhX1cO3f5JqYLxFAGKBFwvsulTisJ6rGYOEDSMBDwZc3sqLvt5g\nh0vKRPqSkylQ0W5shNg0bwbxySiRxJPBL8kWDAbJVfauArabLPuNkUNwmYhIjy7j\nlY0oYw2xeJ9hTUly/Zg3+DI8oYYY3z7WaxPHXEoicCE=\n-----END RSA PRIVATE KEY-----\n-hdrs3] - AttributeError: 'RSAPrivateKey' object has no attribute 'meta_headers' FAILED tests/test_core.py::TestParse::test_no_headers - AttributeError: 'OpenSSLTrustedCertificate' object has no attribute 'meta_headers' FAILED tests/test_packaging.py::TestLegacyMetadataHack::test_description - AssertionError: assert 'PEM file parsing in Python.' == 'Easy PEM fil...ng in Python.' FAILED tests/test_packaging.py::TestLegacyMetadataHack::test_uri - Failed: DID NOT WARN. No warnings of type (, ) were emitted. FAILED tests/test_packaging.py::TestLegacyMetadataHack::test_email - Failed: DID NOT WARN. No warnings of type (, ) were emitted. FAILED tests/test_packaging.py::TestLegacyMetadataHack::test_does_not_exist - AssertionError: Regex pattern did not match. ============================================================================== 19 failed, 67 passed in 0.29s =============================================================================== ```

hynek commented 1 year ago

Just building the wheel doesn't install it.

Try python -c 'import pem; print(pem.__version__)' (I hope that works, I'm on my phone, sorry)

Either install the built wheel or 'pip install -e .[dev]'

Misaka13514 commented 1 year ago

Thank you for the reply. Pytest succeeded after I install the built wheel.

But I wonder how can I test it before installation. I tried:

$ PYTHONPATH=./src pytest
=================================================================================== test session starts ====================================================================================
platform linux -- Python 3.11.3, pytest-7.3.2, pluggy-1.0.0
rootdir: /home/user/pem
configfile: pyproject.toml
testpaths: tests
plugins: anyio-3.7.0
collected 86 items                                                                                                                                                                         

tests/test_core.py ....................................................................                                                                                              [ 79%]
tests/test_packaging.py FFFF.                                                                                                                                                        [ 84%]
tests/test_twisted.py .............                                                                                                                                                  [100%]

========================================================================================= FAILURES =========================================================================================
___________________________________________________________________________ TestLegacyMetadataHack.test_version ____________________________________________________________________________

cls = <class 'importlib.metadata.Distribution'>, name = 'pem'

    @classmethod
    def from_name(cls, name: str):
        """Return the Distribution for the given package name.

        :param name: The name of the distribution package to search for.
        :return: The Distribution instance (or subclass thereof) for the named
            package, if found.
        :raises PackageNotFoundError: When the named package's distribution
            metadata cannot be found.
        :raises ValueError: When an invalid value is supplied for name.
        """
        if not name:
            raise ValueError("A distribution name is required.")
        try:
>           return next(cls.discover(name=name))
E           StopIteration

/usr/lib/python3.11/importlib/metadata/__init__.py:563: StopIteration

During handling of the above exception, another exception occurred:

self = <tests.test_packaging.TestLegacyMetadataHack object at 0x7fdcc00e7950>, recwarn = WarningsRecorder(record=True)

    def test_version(self, recwarn):
        """
        pem.__version__ returns the correct version and doesn't warn.
        """
>       assert metadata.version("pem") == pem.__version__

tests/test_packaging.py:17: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/usr/lib/python3.11/importlib/metadata/__init__.py:1008: in version
    return distribution(distribution_name).version
/usr/lib/python3.11/importlib/metadata/__init__.py:981: in distribution
    return Distribution.from_name(distribution_name)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

cls = <class 'importlib.metadata.Distribution'>, name = 'pem'

    @classmethod
    def from_name(cls, name: str):
        """Return the Distribution for the given package name.

        :param name: The name of the distribution package to search for.
        :return: The Distribution instance (or subclass thereof) for the named
            package, if found.
        :raises PackageNotFoundError: When the named package's distribution
            metadata cannot be found.
        :raises ValueError: When an invalid value is supplied for name.
        """
        if not name:
            raise ValueError("A distribution name is required.")
        try:
            return next(cls.discover(name=name))
        except StopIteration:
>           raise PackageNotFoundError(name)
E           importlib.metadata.PackageNotFoundError: No package metadata was found for pem

/usr/lib/python3.11/importlib/metadata/__init__.py:565: PackageNotFoundError
_________________________________________________________________________ TestLegacyMetadataHack.test_description __________________________________________________________________________

cls = <class 'importlib.metadata.Distribution'>, name = 'pem'

    @classmethod
    def from_name(cls, name: str):
        """Return the Distribution for the given package name.

        :param name: The name of the distribution package to search for.
        :return: The Distribution instance (or subclass thereof) for the named
            package, if found.
        :raises PackageNotFoundError: When the named package's distribution
            metadata cannot be found.
        :raises ValueError: When an invalid value is supplied for name.
        """
        if not name:
            raise ValueError("A distribution name is required.")
        try:
>           return next(cls.discover(name=name))
E           StopIteration

/usr/lib/python3.11/importlib/metadata/__init__.py:563: StopIteration

During handling of the above exception, another exception occurred:

self = <tests.test_packaging.TestLegacyMetadataHack object at 0x7fdcc00f8090>

    def test_description(self):
        """
        pem.__description__ returns the correct description.
        """
        with pytest.deprecated_call():
>           assert "PEM file parsing in Python." == pem.__description__

tests/test_packaging.py:25: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
src/pem/__init__.py:86: in __getattr__
    meta = metadata("pem")
/usr/lib/python3.11/importlib/metadata/__init__.py:998: in metadata
    return Distribution.from_name(distribution_name).metadata
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

cls = <class 'importlib.metadata.Distribution'>, name = 'pem'

    @classmethod
    def from_name(cls, name: str):
        """Return the Distribution for the given package name.

        :param name: The name of the distribution package to search for.
        :return: The Distribution instance (or subclass thereof) for the named
            package, if found.
        :raises PackageNotFoundError: When the named package's distribution
            metadata cannot be found.
        :raises ValueError: When an invalid value is supplied for name.
        """
        if not name:
            raise ValueError("A distribution name is required.")
        try:
            return next(cls.discover(name=name))
        except StopIteration:
>           raise PackageNotFoundError(name)
E           importlib.metadata.PackageNotFoundError: No package metadata was found for pem

/usr/lib/python3.11/importlib/metadata/__init__.py:565: PackageNotFoundError
_____________________________________________________________________________ TestLegacyMetadataHack.test_uri ______________________________________________________________________________

cls = <class 'importlib.metadata.Distribution'>, name = 'pem'

    @classmethod
    def from_name(cls, name: str):
        """Return the Distribution for the given package name.

        :param name: The name of the distribution package to search for.
        :return: The Distribution instance (or subclass thereof) for the named
            package, if found.
        :raises PackageNotFoundError: When the named package's distribution
            metadata cannot be found.
        :raises ValueError: When an invalid value is supplied for name.
        """
        if not name:
            raise ValueError("A distribution name is required.")
        try:
>           return next(cls.discover(name=name))
E           StopIteration

/usr/lib/python3.11/importlib/metadata/__init__.py:563: StopIteration

During handling of the above exception, another exception occurred:

self = <tests.test_packaging.TestLegacyMetadataHack object at 0x7fdcc00f8790>

    def test_uri(self):
        """
        pem.__uri__ returns the correct project URL.
        """
        with pytest.deprecated_call():
>           assert "https://pem.readthedocs.io/" == pem.__uri__

tests/test_packaging.py:32: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
src/pem/__init__.py:86: in __getattr__
    meta = metadata("pem")
/usr/lib/python3.11/importlib/metadata/__init__.py:998: in metadata
    return Distribution.from_name(distribution_name).metadata
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

cls = <class 'importlib.metadata.Distribution'>, name = 'pem'

    @classmethod
    def from_name(cls, name: str):
        """Return the Distribution for the given package name.

        :param name: The name of the distribution package to search for.
        :return: The Distribution instance (or subclass thereof) for the named
            package, if found.
        :raises PackageNotFoundError: When the named package's distribution
            metadata cannot be found.
        :raises ValueError: When an invalid value is supplied for name.
        """
        if not name:
            raise ValueError("A distribution name is required.")
        try:
            return next(cls.discover(name=name))
        except StopIteration:
>           raise PackageNotFoundError(name)
E           importlib.metadata.PackageNotFoundError: No package metadata was found for pem

/usr/lib/python3.11/importlib/metadata/__init__.py:565: PackageNotFoundError
____________________________________________________________________________ TestLegacyMetadataHack.test_email _____________________________________________________________________________

cls = <class 'importlib.metadata.Distribution'>, name = 'pem'

    @classmethod
    def from_name(cls, name: str):
        """Return the Distribution for the given package name.

        :param name: The name of the distribution package to search for.
        :return: The Distribution instance (or subclass thereof) for the named
            package, if found.
        :raises PackageNotFoundError: When the named package's distribution
            metadata cannot be found.
        :raises ValueError: When an invalid value is supplied for name.
        """
        if not name:
            raise ValueError("A distribution name is required.")
        try:
>           return next(cls.discover(name=name))
E           StopIteration

/usr/lib/python3.11/importlib/metadata/__init__.py:563: StopIteration

During handling of the above exception, another exception occurred:

self = <tests.test_packaging.TestLegacyMetadataHack object at 0x7fdcc00f8ed0>

    def test_email(self):
        """
        pem.__email__ returns Hynek's email address.
        """
        with pytest.deprecated_call():
>           assert "hs@ox.cx" == pem.__email__

tests/test_packaging.py:39: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
src/pem/__init__.py:86: in __getattr__
    meta = metadata("pem")
/usr/lib/python3.11/importlib/metadata/__init__.py:998: in metadata
    return Distribution.from_name(distribution_name).metadata
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

cls = <class 'importlib.metadata.Distribution'>, name = 'pem'

    @classmethod
    def from_name(cls, name: str):
        """Return the Distribution for the given package name.

        :param name: The name of the distribution package to search for.
        :return: The Distribution instance (or subclass thereof) for the named
            package, if found.
        :raises PackageNotFoundError: When the named package's distribution
            metadata cannot be found.
        :raises ValueError: When an invalid value is supplied for name.
        """
        if not name:
            raise ValueError("A distribution name is required.")
        try:
            return next(cls.discover(name=name))
        except StopIteration:
>           raise PackageNotFoundError(name)
E           importlib.metadata.PackageNotFoundError: No package metadata was found for pem

/usr/lib/python3.11/importlib/metadata/__init__.py:565: PackageNotFoundError
================================================================================= short test summary info ==================================================================================
FAILED tests/test_packaging.py::TestLegacyMetadataHack::test_version - importlib.metadata.PackageNotFoundError: No package metadata was found for pem
FAILED tests/test_packaging.py::TestLegacyMetadataHack::test_description - importlib.metadata.PackageNotFoundError: No package metadata was found for pem
FAILED tests/test_packaging.py::TestLegacyMetadataHack::test_uri - importlib.metadata.PackageNotFoundError: No package metadata was found for pem
FAILED tests/test_packaging.py::TestLegacyMetadataHack::test_email - importlib.metadata.PackageNotFoundError: No package metadata was found for pem
=============================================================================== 4 failed, 82 passed in 0.25s ===============================================================================
hynek commented 1 year ago

You can't. The reason is that the packaging tests access packaging metadata to deliver consistent information like the package version (pem.__version__).

You can work around it using pytest -k 'not test_packaging'

Misaka13514 commented 1 year ago

Thank you. I have applied the work around in the PKGBUILD of python-pem on AUR.