1
1
from __future__ import unicode_literals
2
2
3
- import sys
4
-
5
3
import os
6
- import pkg_resources
7
4
import shutil
8
5
import tempfile
9
6
import unittest
13
10
from fs .memoryfs import MemoryFS
14
11
from fs .opener import errors , registry
15
12
from fs .opener .parse import ParseResult
16
- from fs .opener .registry import Registry
13
+ from fs .opener .registry import Registry , importlib_metadata
17
14
from fs .osfs import OSFS
18
15
19
16
try :
20
17
from unittest import mock
21
18
except ImportError :
22
19
import mock
23
20
21
+ try :
22
+ from pytest import MonkeyPatch
23
+ except ImportError :
24
+ from _pytest .monkeypatch import MonkeyPatch
25
+
24
26
25
27
class TestParse (unittest .TestCase ):
26
28
def test_registry_repr (self ):
@@ -106,34 +108,44 @@ def test_parse_params_decode(self):
106
108
107
109
108
110
class TestRegistry (unittest .TestCase ):
111
+ def setUp (self ):
112
+ self .monkeypatch = MonkeyPatch ()
113
+
109
114
def test_protocols (self ):
110
115
self .assertIsInstance (opener .registry .protocols , list )
111
116
112
117
def test_registry_protocols (self ):
113
118
# Check registry.protocols list the names of all available extension
114
- extensions = [
115
- pkg_resources .EntryPoint ("proto1" , "mod1" ),
116
- pkg_resources .EntryPoint ("proto2" , "mod2" ),
117
- ]
118
- m = mock .MagicMock (return_value = extensions )
119
- with mock .patch .object (
120
- sys .modules ["pkg_resources" ], "iter_entry_points" , new = m
121
- ):
119
+ class EntryPoint (object ):
120
+ def __init__ (self , name ):
121
+ self .name = name
122
+
123
+ def _my_entry_points ():
124
+ return {"fs.opener" : [EntryPoint ("proto1" ), EntryPoint ("proto2" )]}
125
+
126
+ with self .monkeypatch .context () as m :
127
+ m .setattr (importlib_metadata , "entry_points" , _my_entry_points )
122
128
self .assertIn ("proto1" , opener .registry .protocols )
123
129
self .assertIn ("proto2" , opener .registry .protocols )
130
+ self .assertNotIn ("wheel" , opener .registry .protocols )
124
131
125
132
def test_unknown_protocol (self ):
126
133
with self .assertRaises (errors .UnsupportedProtocol ):
127
134
opener .open_fs ("unknown://" )
128
135
129
136
def test_entry_point_load_error (self ):
137
+ class EntryPoint (object ):
138
+ def __init__ (self , name ):
139
+ self .name = name
130
140
131
- entry_point = mock . MagicMock ()
132
- entry_point . load . side_effect = ValueError ("some error" )
141
+ def load ( self ):
142
+ raise ValueError ("some error" )
133
143
134
- iter_entry_points = mock .MagicMock (return_value = iter ([entry_point ]))
144
+ def _my_entry_points ():
145
+ return {"fs.opener" : [EntryPoint ("test" )]}
135
146
136
- with mock .patch ("pkg_resources.iter_entry_points" , iter_entry_points ):
147
+ with self .monkeypatch .context () as m :
148
+ m .setattr (importlib_metadata , "entry_points" , _my_entry_points )
137
149
with self .assertRaises (errors .EntryPointError ) as ctx :
138
150
opener .open_fs ("test://" )
139
151
self .assertEqual (
@@ -144,11 +156,18 @@ def test_entry_point_type_error(self):
144
156
class NotAnOpener (object ):
145
157
pass
146
158
147
- entry_point = mock .MagicMock ()
148
- entry_point .load = mock .MagicMock (return_value = NotAnOpener )
149
- iter_entry_points = mock .MagicMock (return_value = iter ([entry_point ]))
159
+ class EntryPoint (object ):
160
+ def __init__ (self , name ):
161
+ self .name = name
162
+
163
+ def load (self ):
164
+ return NotAnOpener
150
165
151
- with mock .patch ("pkg_resources.iter_entry_points" , iter_entry_points ):
166
+ def _my_entry_points ():
167
+ return {"fs.opener" : [EntryPoint ("test" )]}
168
+
169
+ with self .monkeypatch .context () as m :
170
+ m .setattr (importlib_metadata , "entry_points" , _my_entry_points )
152
171
with self .assertRaises (errors .EntryPointError ) as ctx :
153
172
opener .open_fs ("test://" )
154
173
self .assertEqual ("entry point did not return an opener" , str (ctx .exception ))
@@ -161,11 +180,18 @@ def __init__(self, *args, **kwargs):
161
180
def open_fs (self , * args , ** kwargs ):
162
181
pass
163
182
164
- entry_point = mock .MagicMock ()
165
- entry_point .load = mock .MagicMock (return_value = BadOpener )
166
- iter_entry_points = mock .MagicMock (return_value = iter ([entry_point ]))
183
+ class EntryPoint (object ):
184
+ def __init__ (self , name ):
185
+ self .name = name
186
+
187
+ def load (self ):
188
+ return BadOpener
189
+
190
+ def _my_entry_points ():
191
+ return {"fs.opener" : [EntryPoint ("test" )]}
167
192
168
- with mock .patch ("pkg_resources.iter_entry_points" , iter_entry_points ):
193
+ with self .monkeypatch .context () as m :
194
+ m .setattr (importlib_metadata , "entry_points" , _my_entry_points )
169
195
with self .assertRaises (errors .EntryPointError ) as ctx :
170
196
opener .open_fs ("test://" )
171
197
self .assertEqual (
@@ -217,7 +243,7 @@ def tearDown(self):
217
243
218
244
def test_repr (self ):
219
245
# Check __repr__ works
220
- for entry_point in pkg_resources . iter_entry_points ( "fs.opener" ):
246
+ for entry_point in importlib_metadata . entry_points (). get ( "fs.opener" , [] ):
221
247
_opener = entry_point .load ()
222
248
repr (_opener ())
223
249
0 commit comments