44
55This module returns the installation location of cacert.pem or its contents. 
66""" 
7- import  os 
8- import  types 
9- from  typing  import  Union 
7+ import  sys 
108
11- try :
12-     from  importlib .resources  import  path  as  get_path , read_text 
9+ 
10+ if  sys .version_info  >=  (3 , 9 ):
11+ 
12+     from  importlib .resources  import  as_file , files 
1313
1414    _CACERT_CTX  =  None 
1515    _CACERT_PATH  =  None 
@@ -33,13 +33,54 @@ def where() -> str:
3333            # We also have to hold onto the actual context manager, because 
3434            # it will do the cleanup whenever it gets garbage collected, so 
3535            # we will also store that at the global level as well. 
36+             _CACERT_CTX  =  as_file (files ("certifi" ).joinpath ("cacert.pem" ))
37+             _CACERT_PATH  =  str (_CACERT_CTX .__enter__ ())
38+ 
39+         return  _CACERT_PATH 
40+ 
41+     def  contents () ->  str :
42+         return  files ("certifi" ).joinpath ("cacert.pem" ).read_text (encoding = "ascii" )
43+ 
44+ elif  sys .version_info  >=  (3 , 7 ):
45+ 
46+     from  importlib .resources  import  path  as  get_path , read_text 
47+ 
48+     _CACERT_CTX  =  None 
49+     _CACERT_PATH  =  None 
50+ 
51+     def  where () ->  str :
52+         # This is slightly terrible, but we want to delay extracting the 
53+         # file in cases where we're inside of a zipimport situation until 
54+         # someone actually calls where(), but we don't want to re-extract 
55+         # the file on every call of where(), so we'll do it once then store 
56+         # it in a global variable. 
57+         global  _CACERT_CTX 
58+         global  _CACERT_PATH 
59+         if  _CACERT_PATH  is  None :
60+             # This is slightly janky, the importlib.resources API wants you 
61+             # to manage the cleanup of this file, so it doesn't actually 
62+             # return a path, it returns a context manager that will give 
63+             # you the path when you enter it and will do any cleanup when 
64+             # you leave it. In the common case of not needing a temporary 
65+             # file, it will just return the file system location and the 
66+             # __exit__() is a no-op. 
67+             # 
68+             # We also have to hold onto the actual context manager, because 
69+             # it will do the cleanup whenever it gets garbage collected, so 
70+             # we will also store that at the global level as well. 
3671            _CACERT_CTX  =  get_path ("certifi" , "cacert.pem" )
3772            _CACERT_PATH  =  str (_CACERT_CTX .__enter__ ())
3873
3974        return  _CACERT_PATH 
4075
76+     def  contents () ->  str :
77+         return  read_text ("certifi" , "cacert.pem" , encoding = "ascii" )
78+ 
79+ else :
80+     import  os 
81+     import  types 
82+     from  typing  import  Union 
4183
42- except  ImportError :
4384    Package  =  Union [types .ModuleType , str ]
4485    Resource  =  Union [str , "os.PathLike" ]
4586
@@ -63,6 +104,5 @@ def where() -> str:
63104
64105        return  os .path .join (f , "cacert.pem" )
65106
66- 
67- def  contents () ->  str :
68-     return  read_text ("certifi" , "cacert.pem" , encoding = "ascii" )
107+     def  contents () ->  str :
108+         return  read_text ("certifi" , "cacert.pem" , encoding = "ascii" )
0 commit comments