megfile 3.1.0.post1__py3-none-any.whl → 3.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -47,8 +47,15 @@ class BasePrefetchReader(Readable[bytes], Seekable, ABC):
47
47
  if block_forward is None:
48
48
  block_forward = max(block_capacity - 1, 1)
49
49
 
50
- assert block_capacity > block_forward, 'block_capacity should greater than block_forward, got: block_capacity=%s, block_forward=%s' % (
51
- block_capacity, block_forward)
50
+ if block_capacity <= block_forward:
51
+ # TODO: replace AssertionError with ValueError in 4.0.0
52
+ raise AssertionError(
53
+ 'block_capacity should greater than block_forward, '
54
+ 'got: block_capacity=%s, block_forward=%s' %
55
+ (block_capacity, block_forward))
56
+
57
+ # user maybe put block_size with 'numpy.uint64' type
58
+ block_size = int(block_size)
52
59
 
53
60
  self._max_retries = max_retries
54
61
  self._block_size = block_size
@@ -123,9 +130,9 @@ class BasePrefetchReader(Readable[bytes], Seekable, ABC):
123
130
 
124
131
  Returns the new absolute position.
125
132
  '''
133
+ offset = int(offset) # user maybe put offset with 'numpy.uint64' type
126
134
  if self.closed:
127
135
  raise IOError('file already closed: %r' % self.name)
128
-
129
136
  if whence == os.SEEK_CUR:
130
137
  target_offset = self._offset + offset
131
138
  elif whence == os.SEEK_END:
@@ -159,10 +166,9 @@ class BasePrefetchReader(Readable[bytes], Seekable, ABC):
159
166
  if self._offset >= self._content_size:
160
167
  return b''
161
168
 
162
- if size is None:
169
+ if size is None or size < 0:
163
170
  size = self._content_size - self._offset
164
171
  else:
165
- assert size >= 0, 'size should greater than 0, got: %r' % size
166
172
  size = min(size, self._content_size - self._offset)
167
173
 
168
174
  if self._block_forward == 1:
@@ -196,6 +202,7 @@ class BasePrefetchReader(Readable[bytes], Seekable, ABC):
196
202
 
197
203
  Retain newline. A non-negative size argument limits the maximum
198
204
  number of bytes to return (an incomplete line may be returned then).
205
+ If the size argument is negative, read until EOF is reached.
199
206
  Return an empty bytes object at EOF.
200
207
  '''
201
208
  if self.closed:
@@ -206,10 +213,9 @@ class BasePrefetchReader(Readable[bytes], Seekable, ABC):
206
213
  if self._offset >= self._content_size:
207
214
  return b''
208
215
 
209
- if size is None:
216
+ if size is None or size < 0:
210
217
  size = self._content_size - self._offset
211
218
  else:
212
- assert size >= 0, 'size should greater than 0, got: %r' % size
213
219
  size = min(size, self._content_size - self._offset)
214
220
 
215
221
  data = self._buffer.readline(size)
@@ -99,6 +99,7 @@ class CombineReader(Readable, Seekable):
99
99
  return buffer.getvalue() # pyre-ignore[7]
100
100
 
101
101
  def seek(self, offset: int, whence: int = os.SEEK_SET) -> int:
102
+ offset = int(offset) # user maybe put offset with 'numpy.uint64' type
102
103
  if whence == os.SEEK_SET:
103
104
  target_offset = offset
104
105
  elif whence == os.SEEK_CUR:
megfile/lib/glob.py CHANGED
@@ -74,7 +74,9 @@ def iglob(
74
74
  it = _iglob(pathname, recursive, False, fs)
75
75
  if recursive and _isrecursive(pathname):
76
76
  s = next(it) # skip empty string
77
- assert not s
77
+ if s:
78
+ # TODO: replace AssertionError with OSError in 4.0.0
79
+ raise AssertionError("iglob with recursive=True error")
78
80
  return it
79
81
 
80
82
 
@@ -88,7 +90,10 @@ def _iglob(pathname: str, recursive: bool, dironly: bool,
88
90
  if protocol:
89
91
  dirname = "://".join([protocol, dirname])
90
92
  if not has_magic(pathname):
91
- assert not dironly
93
+ if dironly:
94
+ # TODO: replace AssertionError with OSError in 4.0.0
95
+ raise AssertionError(
96
+ "can't use dironly with non-magic patterns in _iglob")
92
97
  if basename:
93
98
  if fs.exists(pathname):
94
99
  yield pathname
@@ -150,7 +155,9 @@ def _glob0(dirname: str, basename: str, dironly: bool, fs: FSFunc) -> List[str]:
150
155
  # directory.
151
156
  def _glob2(dirname: str, pattern: str, dironly: bool,
152
157
  fs: FSFunc) -> Iterator[str]:
153
- assert _isrecursive(pattern)
158
+ if not _isrecursive(pattern):
159
+ # TODO: replace AssertionError with OSError in 4.0.0
160
+ raise AssertionError("error call '_glob2' with non-glob pattern")
154
161
  yield pattern[:0]
155
162
  yield from _rlistdir(dirname, dironly, fs)
156
163
 
@@ -53,7 +53,9 @@ class S3BufferedWriter(Writable[bytes]):
53
53
  self._client = s3_client
54
54
  self._profile_name = profile_name
55
55
 
56
- self._block_size = block_size
56
+ # user maybe put block_size with 'numpy.uint64' type
57
+ self._block_size = int(block_size)
58
+
57
59
  self._max_block_size = max_block_size
58
60
  self._max_buffer_size = max_buffer_size
59
61
  self._total_buffer_size = 0
@@ -19,7 +19,9 @@ class S3CachedHandler(S3MemoryHandler):
19
19
  remove_cache_when_open: bool = True,
20
20
  profile_name: Optional[str] = None):
21
21
 
22
- assert mode in ('rb', 'wb', 'ab', 'rb+', 'wb+', 'ab+')
22
+ if mode not in ('rb', 'wb', 'ab', 'rb+', 'wb+', 'ab+'):
23
+ # TODO: replace AssertionError with ValueError in 4.0.0
24
+ raise AssertionError('unacceptable mode: %r' % mode)
23
25
 
24
26
  self._bucket = bucket
25
27
  self._key = key
@@ -63,6 +63,7 @@ class S3LimitedSeekableWriter(S3BufferedWriter, Seekable):
63
63
  if self.closed:
64
64
  raise IOError('file already closed: %r' % self.name)
65
65
 
66
+ offset = int(offset) # user maybe put offset with 'numpy.uint64' type
66
67
  if whence == os.SEEK_SET:
67
68
  target_offset = offset
68
69
  elif whence == os.SEEK_CUR:
@@ -17,7 +17,9 @@ class S3MemoryHandler(Readable[bytes], Seekable, Writable[bytes]):
17
17
  s3_client,
18
18
  profile_name: Optional[str] = None):
19
19
 
20
- assert mode in ('rb', 'wb', 'ab', 'rb+', 'wb+', 'ab+')
20
+ if mode not in ('rb', 'wb', 'ab', 'rb+', 'wb+', 'ab+'):
21
+ # TODO: replace AssertionError with ValueError in 4.0.0
22
+ raise AssertionError('unacceptable mode: %r' % mode)
21
23
 
22
24
  self._bucket = bucket
23
25
  self._key = key
@@ -36,7 +36,9 @@ class S3PipeHandler(Readable[bytes], Writable[bytes]):
36
36
  join_thread: bool = True,
37
37
  profile_name: Optional[str] = None):
38
38
 
39
- assert mode in ('rb', 'wb')
39
+ if mode not in ('rb', 'wb'):
40
+ # TODO: replace AssertionError with ValueError in 4.0.0
41
+ raise AssertionError('unacceptable mode: %r' % mode)
40
42
 
41
43
  self._bucket = bucket
42
44
  self._key = key
@@ -44,6 +44,7 @@ class ShadowHandler(Readable, Seekable, Writable, BaseShadowHandler):
44
44
  return get_content_size(self._file_object, intrusive=self._intrusive)
45
45
 
46
46
  def seek(self, offset: int, whence: int = os.SEEK_SET) -> int:
47
+ offset = int(offset) # user maybe put offset with 'numpy.uint64' type
47
48
  if whence == os.SEEK_SET:
48
49
  self._offset = offset
49
50
  elif whence == os.SEEK_CUR:
megfile/s3_path.py CHANGED
@@ -779,12 +779,12 @@ def s3_buffered_open(
779
779
  max_concurrency: Optional[int] = None,
780
780
  max_buffer_size: int = DEFAULT_MAX_BUFFER_SIZE,
781
781
  forward_ratio: Optional[float] = None,
782
- block_size: int = DEFAULT_BLOCK_SIZE,
782
+ block_size: Optional[int] = None,
783
783
  limited_seekable: bool = False,
784
784
  buffered: bool = False,
785
785
  share_cache_key: Optional[str] = None,
786
786
  cache_path: Optional[str] = None,
787
- min_block_size: int = DEFAULT_MIN_BLOCK_SIZE,
787
+ min_block_size: Optional[int] = None,
788
788
  max_block_size: int = DEFAULT_MAX_BLOCK_SIZE) -> IO:
789
789
  '''Open an asynchronous prefetch reader, to support fast sequential read
790
790
 
@@ -814,6 +814,8 @@ def s3_buffered_open(
814
814
  s3_url = s3_url.readlink()
815
815
  except S3NotALinkError:
816
816
  pass
817
+ min_block_size = min_block_size or block_size or DEFAULT_MIN_BLOCK_SIZE
818
+ block_size = block_size or DEFAULT_BLOCK_SIZE
817
819
 
818
820
  bucket, key = parse_s3_url(s3_url.path_with_protocol)
819
821
  config = botocore.config.Config(max_pool_connections=max_pool_connections)
@@ -1124,9 +1126,9 @@ class S3Cacher(FileCacher):
1124
1126
  self, path: str, cache_path: Optional[str] = None, mode: str = 'r'):
1125
1127
  if mode not in ('r', 'w', 'a'):
1126
1128
  raise ValueError('unacceptable mode: %r' % mode)
1129
+ if cache_path is None:
1130
+ cache_path = generate_cache_path(path)
1127
1131
  if mode in ('r', 'a'):
1128
- if cache_path is None:
1129
- cache_path = generate_cache_path(path)
1130
1132
  s3_download(path, cache_path)
1131
1133
  self.name = path
1132
1134
  self.mode = mode
megfile/smart.py CHANGED
@@ -966,9 +966,9 @@ class SmartCacher(FileCacher):
966
966
  self, path: str, cache_path: Optional[str] = None, mode: str = 'r'):
967
967
  if mode not in ('r', 'w', 'a'):
968
968
  raise ValueError('unacceptable mode: %r' % mode)
969
+ if cache_path is None:
970
+ cache_path = generate_cache_path(path)
969
971
  if mode in ('r', 'a'):
970
- if cache_path is None:
971
- cache_path = generate_cache_path(path)
972
972
  smart_copy(path, cache_path)
973
973
  self.name = path
974
974
  self.mode = mode
megfile/utils/__init__.py CHANGED
@@ -190,7 +190,9 @@ def binary_open(open_func):
190
190
 
191
191
  def get_human_size(size_bytes: float) -> str:
192
192
  '''Get human-readable size, e.g. `100MB`'''
193
- assert size_bytes >= 0, 'negative size: %r' % size_bytes
193
+ if size_bytes < 0:
194
+ # TODO: replace AssertionError with ValueError in 4.0.0
195
+ raise AssertionError('negative size: %r' % size_bytes)
194
196
  if size_bytes == 0:
195
197
  return '0 B'
196
198
  size_name = ('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB')
megfile/version.py CHANGED
@@ -1 +1 @@
1
- VERSION = "3.1.0.post1"
1
+ VERSION = "3.1.1"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: megfile
3
- Version: 3.1.0.post1
3
+ Version: 3.1.1
4
4
  Summary: Megvii file operation library
5
5
  Author-email: megvii <megfile@megvii.com>
6
6
  Project-URL: Homepage, https://github.com/megvii-research/megfile
@@ -12,44 +12,44 @@ megfile/http_path.py,sha256=mnoN5hHJro23cLny1r5ePMJ28r2gnBrzqA0S-grpwrE,16215
12
12
  megfile/interfaces.py,sha256=PLNv0hDBTrTFJGTwT5mbDKYTsCjNryrHHMJCYhL9Wp0,8522
13
13
  megfile/pathlike.py,sha256=FjY88X1IA4-ue5jcekwlIO740D0oT_wNo95y3eo6vNA,30685
14
14
  megfile/s3.py,sha256=JfYWFHNJrBAoncB5RPDMyhjrIwVYGZ2lh8prGst-L_M,12874
15
- megfile/s3_path.py,sha256=WvP6AsFpS0bR11ABbOYSMUOVm3H2ffYcKrBbXxZJdrI,93001
15
+ megfile/s3_path.py,sha256=UV-rOV-j1uWhTjsClqNmYbqpPrrBd0CZldo717pd63o,93107
16
16
  megfile/sftp.py,sha256=cXS1LZh4gtJgDCmR9p2_uM1wlycV34ebuTJGaceatVE,12984
17
17
  megfile/sftp_path.py,sha256=QcV4DK192c5GL2CeK07JgpELpBXpGVAKswQ1JtZ2DZQ,53336
18
- megfile/smart.py,sha256=3Rm-nI3HCLdljdo3mGn1JWFnw1qGwuxUunb1MIEJK0I,36032
18
+ megfile/smart.py,sha256=jOTBBbDKpLuRbob9-Omj_GRsk66Vpql7LPJX4xCm5fs,36024
19
19
  megfile/smart_path.py,sha256=OMTM9JeowIa6j2Yn8XEH-HS4gWD3gBkKgSj8GBD08Bk,6734
20
20
  megfile/stdio.py,sha256=rsBMGr4LaFYOQjL-6k4GE_WznLsa8cPzMhSVNEEDh5o,671
21
21
  megfile/stdio_path.py,sha256=2n3gTEN1-7d8cCRsQJ7zj8rdP1VPlgr78oSClYndxXI,2806
22
- megfile/version.py,sha256=HgxsH8zUeKbwsczoAuIOhPyGbI_oqu-LqLFys9BLbJQ,25
22
+ megfile/version.py,sha256=_DO4G2zWDcG7gSWIzdTDMHAx4XjUc5Vq4U89Oj2xeWY,19
23
23
  megfile/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
- megfile/lib/base_prefetch_reader.py,sha256=iTHdWvpERMELgv2sEAsf9tiiJFDYp2mHzodszFrB9T4,13213
25
- megfile/lib/combine_reader.py,sha256=dV1AblB8LTHK2a4aM03w1eBEcTpxMBWln9g_fuz0v7Y,4561
24
+ megfile/lib/base_prefetch_reader.py,sha256=Di2xCkf-Pci7BvJs5sosymKT8sJfdgYY8fTHIk_LEBc,13471
25
+ megfile/lib/combine_reader.py,sha256=ePUMwDxdL1oPqgZLAj7RvHeJ5NROcjPWNwLMuiv7Z5M,4641
26
26
  megfile/lib/compare.py,sha256=yG2fZve_gMg32rQVCdwixBdqgYRsjn-24TqhALQaOrA,2233
27
27
  megfile/lib/compat.py,sha256=0wt3_atcYhSLCxUj_WuDlQa3E1atjZfwJQ12thiFh5Q,234
28
28
  megfile/lib/fnmatch.py,sha256=qtlTdOoowgUvQuZNDrzvEl7hA4Sdtifa9eXd47LEJZY,4082
29
- megfile/lib/glob.py,sha256=bqJ13xIBTbgS1mnqUZcI1Tga2M6TvJrWZP9vmFL2P0U,9724
29
+ megfile/lib/glob.py,sha256=imsjV_lgCLteEacrId0uJU7w77A0tpRrAcKtWfUrzDU,10149
30
30
  megfile/lib/hdfs_prefetch_reader.py,sha256=ytp0td83M8NheMCBtQjrQpvGaBvConpRqgd8xSqdi-E,2092
31
31
  megfile/lib/hdfs_tools.py,sha256=t4GeoBxO0HPahIQDrsK17WBsLZtcfAaNwWfappzZ5q8,442
32
32
  megfile/lib/http_prefetch_reader.py,sha256=Owc_eaDGS752QnzatOnZ3zp19DuuftxWPS8kTXidi1A,4359
33
33
  megfile/lib/joinpath.py,sha256=D4Px6-lnDDpYs1LMUHkTIGqMPJQ0oCBGfTzREs373iU,929
34
34
  megfile/lib/lazy_handler.py,sha256=V_dQR2ac7LXJ6u__R5_VauvmxqQVdjydNIKwJjYUBeQ,1862
35
- megfile/lib/s3_buffered_writer.py,sha256=i1cmUePalrhVXIzT_H-vS1mmhh4Bh_9QDrLJs8UwA1s,7060
36
- megfile/lib/s3_cached_handler.py,sha256=7VmDgMjv9PlL_gBoCkEMJx2PQxUoo_dEPQLOTVNu1Bk,1396
37
- megfile/lib/s3_limited_seekable_writer.py,sha256=_uDEtfWluurqULAtsWa6HbexKH3xcJG-ukhQUgfPryk,6239
38
- megfile/lib/s3_memory_handler.py,sha256=HaQMzjtbhFHsjpymQ9lAXHQo7drSj7-q-Amo5Z2j_bw,4091
39
- megfile/lib/s3_pipe_handler.py,sha256=BicJ0EyOwBDWIpvpSWk-ZWDrUAd2QZlTR3LVHl4_pPs,3571
35
+ megfile/lib/s3_buffered_writer.py,sha256=UW_C6dtvzIEydapsHnPYWMn2xmz0Ah0jD7hrdUxqcoM,7127
36
+ megfile/lib/s3_cached_handler.py,sha256=1laCBQxG_PMp7Tk9_wY9XXDF-Ev4EREt1LPojetiA6A,1530
37
+ megfile/lib/s3_limited_seekable_writer.py,sha256=6Hzy8sdiRDQMQ0os175weu5vYUfcEP-L4ztknCQETf8,6318
38
+ megfile/lib/s3_memory_handler.py,sha256=02yivynhVWLKWtdf0_3N1-ipYOSGgFEmutYkpXzrXUU,4225
39
+ megfile/lib/s3_pipe_handler.py,sha256=9dcW0WKmjETLjK-m6QW4EvuvaEjCqUI9BavOeWmuB6Y,3705
40
40
  megfile/lib/s3_prefetch_reader.py,sha256=ofzSn_MC6INAZY83oA3Dq1QNI0SS2b-NP6Ov8ajjLos,4283
41
41
  megfile/lib/s3_share_cache_reader.py,sha256=AFwpyFQq4y-PXTnbFoXxLMQOJFIcJXUgVTrDMCuAMUg,3629
42
- megfile/lib/shadow_handler.py,sha256=w0K2g31598DPonJORa-wTB5B34hKq2Zt7IIYDZsuhOY,2643
42
+ megfile/lib/shadow_handler.py,sha256=Kb4CcfoMBdp822A5teSjNVG_6waAy5AUUHrW1qaRqEI,2722
43
43
  megfile/lib/stdio_handler.py,sha256=t2hxBE1vo25-kS6QQRMiDEG95rdMVx2z6wTnwuN6NUc,1968
44
44
  megfile/lib/url.py,sha256=VbQLjo0s4AaV0iSk66BcjI68aUTcN9zBZ5x6-cM4Qvs,103
45
- megfile/utils/__init__.py,sha256=QFDDhVAmptdMzYE91O6GRARHTalj_ZfSKZNF71uCj7w,8857
45
+ megfile/utils/__init__.py,sha256=5gf_KfoqCvX6sVNLLZYUsGJL_zzesuQPj0znGC-HG8I,8946
46
46
  megfile/utils/mutex.py,sha256=-2KH3bNovKRd9zvsXq9n3bWM7rQdoG9hO7tUPxVG_Po,2538
47
47
  scripts/convert_results_to_sarif.py,sha256=SI0vw4TrpJ9gAZ2pH8ywu-lXMYeZ-TYW2dLEHw5Rx84,4218
48
48
  scripts/generate_file.py,sha256=OLAH9iZKQlHTjuV8zpC6exCXLS6bNdu4Njoc3IKO9Sc,10173
49
- megfile-3.1.0.post1.dist-info/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
50
- megfile-3.1.0.post1.dist-info/LICENSE.pyre,sha256=9lf5nT-5ZH25JijpYAequ0bl8E8z5JmZB1qrjiUMp84,1080
51
- megfile-3.1.0.post1.dist-info/METADATA,sha256=0Q1RFftQQ8ewo_hz4GleF1x5ucyCzIPbMseirlbX6ls,9112
52
- megfile-3.1.0.post1.dist-info/WHEEL,sha256=Z4pYXqR_rTB7OWNDYFOm1qRk0RX6GFP2o8LgvP453Hk,91
53
- megfile-3.1.0.post1.dist-info/entry_points.txt,sha256=M6ZWSSv5_5_QtIpZafy3vq7WuOJ_5dSGQQnEZbByt2Q,49
54
- megfile-3.1.0.post1.dist-info/top_level.txt,sha256=oTnYXo1Z3V61qSWAKtnY9RkDgRSHvfRN38FQae6E0W0,50
55
- megfile-3.1.0.post1.dist-info/RECORD,,
49
+ megfile-3.1.1.dist-info/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
50
+ megfile-3.1.1.dist-info/LICENSE.pyre,sha256=9lf5nT-5ZH25JijpYAequ0bl8E8z5JmZB1qrjiUMp84,1080
51
+ megfile-3.1.1.dist-info/METADATA,sha256=honpFcwkQykVvHhlx_PQlEfOh6TgkPgk2FbdspMjc64,9106
52
+ megfile-3.1.1.dist-info/WHEEL,sha256=Wyh-_nZ0DJYolHNn1_hMa4lM7uDedD_RGVwbmTjyItk,91
53
+ megfile-3.1.1.dist-info/entry_points.txt,sha256=M6ZWSSv5_5_QtIpZafy3vq7WuOJ_5dSGQQnEZbByt2Q,49
54
+ megfile-3.1.1.dist-info/top_level.txt,sha256=oTnYXo1Z3V61qSWAKtnY9RkDgRSHvfRN38FQae6E0W0,50
55
+ megfile-3.1.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (70.3.0)
2
+ Generator: setuptools (71.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5