8
8
import fsspec
9
9
from fsspec .compression import compr
10
10
from fsspec .exceptions import BlocksizeMismatchError
11
- from fsspec .implementations .cache_mapper import create_cache_mapper
11
+ from fsspec .implementations .cache_mapper import (
12
+ BasenameCacheMapper ,
13
+ HashCacheMapper ,
14
+ create_cache_mapper ,
15
+ )
12
16
from fsspec .implementations .cached import CachingFileSystem , LocalTempFile
13
17
from fsspec .implementations .local import make_path_posix
14
18
@@ -36,10 +40,20 @@ def local_filecache():
36
40
37
41
def test_mapper ():
38
42
mapper0 = create_cache_mapper (True )
43
+ assert mapper0 ("somefile" ) == "somefile"
44
+ assert mapper0 ("/somefile" ) == "somefile"
39
45
assert mapper0 ("/somedir/somefile" ) == "somefile"
40
46
assert mapper0 ("/otherdir/somefile" ) == "somefile"
41
47
42
48
mapper1 = create_cache_mapper (False )
49
+ assert (
50
+ mapper1 ("somefile" )
51
+ == "dd00b9487898b02555b6a2d90a070586d63f93e80c70aaa60c992fa9e81a72fe"
52
+ )
53
+ assert (
54
+ mapper1 ("/somefile" )
55
+ == "884c07bc2efe65c60fb9d280a620e7f180488718fb5d97736521b7f9cf5c8b37"
56
+ )
43
57
assert (
44
58
mapper1 ("/somedir/somefile" )
45
59
== "67a6956e5a5f95231263f03758c1fd9254fdb1c564d311674cec56b0372d2056"
@@ -57,9 +71,47 @@ def test_mapper():
57
71
assert hash (create_cache_mapper (True )) == hash (mapper0 )
58
72
assert hash (create_cache_mapper (False )) == hash (mapper1 )
59
73
60
-
61
- @pytest .mark .parametrize ("same_names" , [False , True ])
62
- def test_metadata (tmpdir , same_names ):
74
+ with pytest .raises (
75
+ ValueError ,
76
+ match = "BasenameCacheMapper requires zero or positive directory_levels" ,
77
+ ):
78
+ BasenameCacheMapper (- 1 )
79
+
80
+ mapper2 = BasenameCacheMapper (1 )
81
+ assert mapper2 ("/somefile" ) == "somefile"
82
+ assert mapper2 ("/somedir/somefile" ) == "somedir_@_somefile"
83
+ assert mapper2 ("/otherdir/somefile" ) == "otherdir_@_somefile"
84
+ assert mapper2 ("/dir1/dir2/dir3/somefile" ) == "dir3_@_somefile"
85
+
86
+ assert mapper2 != mapper0
87
+ assert mapper2 != mapper1
88
+ assert BasenameCacheMapper (1 ) == mapper2
89
+
90
+ assert hash (mapper2 ) != hash (mapper0 )
91
+ assert hash (mapper2 ) != hash (mapper1 )
92
+ assert hash (BasenameCacheMapper (1 )) == hash (mapper2 )
93
+
94
+ mapper3 = BasenameCacheMapper (2 )
95
+ assert mapper3 ("/somefile" ) == "somefile"
96
+ assert mapper3 ("/somedir/somefile" ) == "somedir_@_somefile"
97
+ assert mapper3 ("/otherdir/somefile" ) == "otherdir_@_somefile"
98
+ assert mapper3 ("/dir1/dir2/dir3/somefile" ) == "dir2_@_dir3_@_somefile"
99
+
100
+ assert mapper3 != mapper0
101
+ assert mapper3 != mapper1
102
+ assert mapper3 != mapper2
103
+ assert BasenameCacheMapper (2 ) == mapper3
104
+
105
+ assert hash (mapper3 ) != hash (mapper0 )
106
+ assert hash (mapper3 ) != hash (mapper1 )
107
+ assert hash (mapper3 ) != hash (mapper2 )
108
+ assert hash (BasenameCacheMapper (2 )) == hash (mapper3 )
109
+
110
+
111
+ @pytest .mark .parametrize (
112
+ "cache_mapper" , [BasenameCacheMapper (), BasenameCacheMapper (1 ), HashCacheMapper ()]
113
+ )
114
+ def test_metadata (tmpdir , cache_mapper ):
63
115
source = os .path .join (tmpdir , "source" )
64
116
afile = os .path .join (source , "afile" )
65
117
os .mkdir (source )
@@ -69,7 +121,7 @@ def test_metadata(tmpdir, same_names):
69
121
"filecache" ,
70
122
target_protocol = "file" ,
71
123
cache_storage = os .path .join (tmpdir , "cache" ),
72
- same_names = same_names ,
124
+ cache_mapper = cache_mapper ,
73
125
)
74
126
75
127
with fs .open (afile , "rb" ) as f :
@@ -85,8 +137,33 @@ def test_metadata(tmpdir, same_names):
85
137
86
138
assert detail ["original" ] == afile_posix
87
139
assert detail ["fn" ] == fs ._mapper (afile_posix )
88
- if same_names :
89
- assert detail ["fn" ] == "afile"
140
+
141
+ if isinstance (cache_mapper , BasenameCacheMapper ):
142
+ if cache_mapper .directory_levels == 0 :
143
+ assert detail ["fn" ] == "afile"
144
+ else :
145
+ assert detail ["fn" ] == "source_@_afile"
146
+
147
+
148
+ def test_constructor_kwargs (tmpdir ):
149
+ fs = fsspec .filesystem ("filecache" , target_protocol = "file" , same_names = True )
150
+ assert isinstance (fs ._mapper , BasenameCacheMapper )
151
+
152
+ fs = fsspec .filesystem ("filecache" , target_protocol = "file" , same_names = False )
153
+ assert isinstance (fs ._mapper , HashCacheMapper )
154
+
155
+ fs = fsspec .filesystem ("filecache" , target_protocol = "file" )
156
+ assert isinstance (fs ._mapper , HashCacheMapper )
157
+
158
+ with pytest .raises (
159
+ ValueError , match = "Cannot specify both same_names and cache_mapper"
160
+ ):
161
+ fs = fsspec .filesystem (
162
+ "filecache" ,
163
+ target_protocol = "file" ,
164
+ cache_mapper = HashCacheMapper (),
165
+ same_names = True ,
166
+ )
90
167
91
168
92
169
def test_idempotent ():
0 commit comments