Skip to content

Commit 23b275e

Browse files
authored
Allow '=' in URLs, which is a valid character in HDFS path (#1428)
1 parent 405406f commit 23b275e

File tree

2 files changed

+61
-1
lines changed

2 files changed

+61
-1
lines changed

fsspec/implementations/tests/test_webhdfs.py

+60
Original file line numberDiff line numberDiff line change
@@ -135,3 +135,63 @@ def test_webhdfs_cp_file(hdfs_cluster):
135135
assert fs.exists(src)
136136
assert fs.exists(dst)
137137
assert fs.cat(src) == fs.cat(dst)
138+
139+
140+
def test_path_with_equals(hdfs_cluster):
141+
fs = WebHDFS(
142+
hdfs_cluster, user="testuser", data_proxy={"worker.example.com": "localhost"}
143+
)
144+
path_with_equals = "/user/testuser/some_table/datestamp=2023-11-11"
145+
146+
fs.mkdir(path_with_equals)
147+
148+
result = fs.ls(path_with_equals)
149+
assert result is not None
150+
assert fs.exists(path_with_equals)
151+
152+
153+
def test_error_handling_with_equals_in_path(hdfs_cluster):
154+
fs = WebHDFS(hdfs_cluster, user="testuser")
155+
invalid_path_with_equals = (
156+
"/user/testuser/some_table/invalid_path=datestamp=2023-11-11"
157+
)
158+
159+
with pytest.raises(FileNotFoundError):
160+
fs.ls(invalid_path_with_equals)
161+
162+
163+
def test_create_and_touch_file_with_equals(hdfs_cluster):
164+
fs = WebHDFS(
165+
hdfs_cluster,
166+
user="testuser",
167+
data_proxy={"worker.example.com": "localhost"},
168+
)
169+
base_path = "/user/testuser/some_table/datestamp=2023-11-11"
170+
file_path = f"{base_path}/testfile.txt"
171+
172+
fs.mkdir(base_path)
173+
fs.touch(file_path, "wb")
174+
assert fs.exists(file_path)
175+
176+
177+
def test_write_read_verify_file_with_equals(hdfs_cluster):
178+
fs = WebHDFS(
179+
hdfs_cluster,
180+
user="testuser",
181+
data_proxy={"worker.example.com": "localhost"},
182+
)
183+
base_path = "/user/testuser/some_table/datestamp=2023-11-11"
184+
file_path = f"{base_path}/testfile.txt"
185+
content = b"This is some content!"
186+
187+
fs.mkdir(base_path)
188+
with fs.open(file_path, "wb") as f:
189+
f.write(content)
190+
191+
with fs.open(file_path, "rb") as f:
192+
assert f.read() == content
193+
194+
file_info = fs.ls(base_path, detail=True)
195+
assert len(file_info) == 1
196+
assert file_info[0]["name"] == file_path
197+
assert file_info[0]["size"] == len(content)

fsspec/implementations/webhdfs.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ def _connect(self):
149149
self.session.auth = HTTPBasicAuth(self.user, self.password)
150150

151151
def _call(self, op, method="get", path=None, data=None, redirect=True, **kwargs):
152-
url = self._apply_proxy(self.url + quote(path or ""))
152+
url = self._apply_proxy(self.url + quote(path or "", safe="/="))
153153
args = kwargs.copy()
154154
args.update(self.pars)
155155
args["op"] = op.upper()

0 commit comments

Comments
 (0)