Skip to content

Commit ae1717e

Browse files
zmej-serowwillmcgugan
authored andcommitted
Added support for user/passwd in ftp_url(). (#297)
* Modified tests for ftp_url() and geturl() methods. Now they should support user/passwd in URL. * Added test class for anonymous ftp-user testing. ftp_url() and geturl() methods need special handling for anonymous input. * Changed hard-coded 127.0.0.1 to self.server.host Should now pass CI... * Added support for user/passwd in ftp_url() * Changed assertTrue() to assertEqual() assertEqual provides more information than assertTrue. * Added port to test_ftp_url(), replaced assertTrue to assertEqual. * Update CHANGELOG.md * Update CONTRIBUTORS.md
1 parent 62dd888 commit ae1717e

File tree

4 files changed

+80
-10
lines changed

4 files changed

+80
-10
lines changed

CHANGELOG.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](http://keepachangelog.com/)
66
and this project adheres to [Semantic Versioning](http://semver.org/).
77

8+
## [2.4.8] - 2019-06-11
9+
10+
### Changed
11+
12+
- `geturl` will return URL with user/password if needed @zmej-serow
13+
814
## [2.4.7] - 2019-06-08
915

1016
### Added
@@ -15,7 +21,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
1521

1622
### Added
1723

18-
- Implemented geturl in FTPFS @zmej-serow
24+
- Implemented `geturl` in FTPFS @zmej-serow
1925

2026
### Fixed
2127

CONTRIBUTORS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ Many thanks to the following developers for contributing to this project:
66
- [Giampaolo](https://github.com/gpcimino)
77
- [Martin Larralde](https://github.com/althonos)
88
- [Will McGugan](https://github.com/willmcgugan)
9+
- [Zmej Serow](https://github.com/zmej-serow)

fs/ftpfs.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -440,11 +440,9 @@ def _manage_ftp(self):
440440
def ftp_url(self):
441441
# type: () -> Text
442442
"""Get the FTP url this filesystem will open."""
443-
url = (
444-
"ftp://{}".format(self.host)
445-
if self.port == 21
446-
else "ftp://{}:{}".format(self.host, self.port)
447-
)
443+
_host_part = self.host if self.port == 21 else "{}:{}".format(self.host, self.port)
444+
_user_part = "" if self.user == "anonymous" or self.user is None else "{}:{}@".format(self.user, self.passwd)
445+
url = "ftp://{}{}".format(_user_part, _host_part)
448446
return url
449447

450448
@property

tests/test_ftpfs.py

Lines changed: 69 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -166,15 +166,21 @@ def tearDown(self):
166166
super(TestFTPFS, self).tearDown()
167167

168168
def test_ftp_url(self):
169-
self.assertTrue(self.fs.ftp_url.startswith("ftp://127.0.0.1"))
169+
self.assertEqual(self.fs.ftp_url, "ftp://{}:{}@{}:{}".format(self.user, self.pasw, self.server.host, self.server.port))
170170

171171
def test_geturl(self):
172172
self.fs.makedir("foo")
173173
self.fs.create("bar")
174174
self.fs.create("foo/bar")
175-
self.assertTrue(self.fs.geturl('foo') == "ftp://127.0.0.1:{}/foo".format(self.server.port))
176-
self.assertTrue(self.fs.geturl('bar') == "ftp://127.0.0.1:{}/bar".format(self.server.port))
177-
self.assertTrue(self.fs.geturl('foo/bar') == "ftp://127.0.0.1:{}/foo/bar".format(self.server.port))
175+
self.assertEqual(
176+
self.fs.geturl('foo'), "ftp://{}:{}@{}:{}/foo".format(self.user, self.pasw, self.server.host, self.server.port)
177+
)
178+
self.assertEqual(
179+
self.fs.geturl('bar'), "ftp://{}:{}@{}:{}/bar".format(self.user, self.pasw, self.server.host, self.server.port)
180+
)
181+
self.assertEqual(
182+
self.fs.geturl('foo/bar'), "ftp://{}:{}@{}:{}/foo/bar".format(self.user, self.pasw, self.server.host, self.server.port)
183+
)
178184

179185
def test_host(self):
180186
self.assertEqual(self.fs.host, self.server.host)
@@ -244,3 +250,62 @@ def make_fs(self):
244250

245251
def test_features(self):
246252
pass
253+
254+
255+
@attr("slow")
256+
class TestAnonFTPFS(FSTestCases, unittest.TestCase):
257+
258+
user = "anonymous"
259+
pasw = ""
260+
261+
@classmethod
262+
def setUpClass(cls):
263+
from pyftpdlib.test import ThreadedTestFTPd
264+
265+
super(TestAnonFTPFS, cls).setUpClass()
266+
267+
cls._temp_dir = tempfile.mkdtemp("ftpfs2tests")
268+
cls._temp_path = os.path.join(cls._temp_dir, text_type(uuid.uuid4()))
269+
os.mkdir(cls._temp_path)
270+
271+
cls.server = ThreadedTestFTPd()
272+
cls.server.shutdown_after = -1
273+
cls.server.handler.authorizer = DummyAuthorizer()
274+
cls.server.handler.authorizer.add_anonymous(cls._temp_path, perm="elradfmw")
275+
cls.server.start()
276+
277+
# Don't know why this is necessary on Windows
278+
if platform.system() == "Windows":
279+
time.sleep(0.1)
280+
# Poll until a connection can be made
281+
if not cls.server.is_alive():
282+
raise RuntimeError("could not start FTP server.")
283+
284+
@classmethod
285+
def tearDownClass(cls):
286+
cls.server.stop()
287+
shutil.rmtree(cls._temp_dir)
288+
super(TestAnonFTPFS, cls).tearDownClass()
289+
290+
def make_fs(self):
291+
return open_fs(
292+
"ftp://{}:{}".format(
293+
self.server.host, self.server.port
294+
)
295+
)
296+
297+
def tearDown(self):
298+
shutil.rmtree(self._temp_path)
299+
os.mkdir(self._temp_path)
300+
super(TestAnonFTPFS, self).tearDown()
301+
302+
def test_ftp_url(self):
303+
self.assertEqual(self.fs.ftp_url, "ftp://{}:{}".format(self.server.host, self.server.port))
304+
305+
def test_geturl(self):
306+
self.fs.makedir("foo")
307+
self.fs.create("bar")
308+
self.fs.create("foo/bar")
309+
self.assertEqual(self.fs.geturl('foo'), "ftp://{}:{}/foo".format(self.server.host, self.server.port))
310+
self.assertEqual(self.fs.geturl('bar'), "ftp://{}:{}/bar".format(self.server.host, self.server.port))
311+
self.assertEqual(self.fs.geturl('foo/bar'), "ftp://{}:{}/foo/bar".format(self.server.host, self.server.port))

0 commit comments

Comments
 (0)