Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix deprecation warning on Python 3.11 #199

Merged
merged 4 commits into from Jul 15, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
19 changes: 12 additions & 7 deletions .github/workflows/ci.yml
Expand Up @@ -10,9 +10,9 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v2
uses: actions/setup-python@v4
- name: Install dependencies
run: pip install mypy
- name: Run mypy
Expand All @@ -22,12 +22,17 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.6", "3.7", "3.8", "3.9", "3.10"]

python-version:
- "3.6"
- "3.7"
- "3.8"
- "3.9"
- "3.10"
- "3.11-dev"
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v2
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- name: Install test dependencies
Expand All @@ -36,4 +41,4 @@ jobs:
python -m pip install pytest
- name: Test with pytest
run: |
pytest
python -W error -m pytest
58 changes: 49 additions & 9 deletions certifi/core.py
Expand Up @@ -4,12 +4,12 @@

This module returns the installation location of cacert.pem or its contents.
"""
import os
import types
from typing import Union
import sys

try:
from importlib.resources import path as get_path, read_text

if sys.version_info >= (3, 9):

from importlib.resources import as_file, files

_CACERT_CTX = None
_CACERT_PATH = None
Expand All @@ -33,13 +33,54 @@ def where() -> str:
# We also have to hold onto the actual context manager, because
# it will do the cleanup whenever it gets garbage collected, so
# we will also store that at the global level as well.
_CACERT_CTX = as_file(files("certifi").joinpath("cacert.pem"))
_CACERT_PATH = str(_CACERT_CTX.__enter__())

return _CACERT_PATH

def contents() -> str:
return files("certifi").joinpath("cacert.pem").read_text(encoding="ascii")

elif sys.version_info >= (3, 7):

from importlib.resources import path as get_path, read_text

_CACERT_CTX = None
_CACERT_PATH = None

def where() -> str:
# This is slightly terrible, but we want to delay extracting the
# file in cases where we're inside of a zipimport situation until
# someone actually calls where(), but we don't want to re-extract
# the file on every call of where(), so we'll do it once then store
# it in a global variable.
global _CACERT_CTX
global _CACERT_PATH
if _CACERT_PATH is None:
# This is slightly janky, the importlib.resources API wants you
# to manage the cleanup of this file, so it doesn't actually
# return a path, it returns a context manager that will give
# you the path when you enter it and will do any cleanup when
# you leave it. In the common case of not needing a temporary
# file, it will just return the file system location and the
# __exit__() is a no-op.
#
# We also have to hold onto the actual context manager, because
# it will do the cleanup whenever it gets garbage collected, so
# we will also store that at the global level as well.
_CACERT_CTX = get_path("certifi", "cacert.pem")
_CACERT_PATH = str(_CACERT_CTX.__enter__())

return _CACERT_PATH

def contents() -> str:
return read_text("certifi", "cacert.pem", encoding="ascii")

else:
import os
import types
from typing import Union

except ImportError:
Package = Union[types.ModuleType, str]
Resource = Union[str, "os.PathLike"]

Expand All @@ -63,6 +104,5 @@ def where() -> str:

return os.path.join(f, "cacert.pem")


def contents() -> str:
return read_text("certifi", "cacert.pem", encoding="ascii")
def contents() -> str:
return read_text("certifi", "cacert.pem", encoding="ascii")
2 changes: 2 additions & 0 deletions setup.py
Expand Up @@ -54,11 +54,13 @@
'Natural Language :: English',
'Programming Language :: Python',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3 :: Only',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10',
'Programming Language :: Python :: 3.11',
],
project_urls={
'Source': 'https://github.com/certifi/python-certifi',
Expand Down