pyfilesystem2
pyfilesystem2 copied to clipboard
Opening absolute paths to folders containing exclamation marks fails
I know that using special characters in path names is asking for trouble, but I like to prefix active projects with an exclamation mark (!) because it makes them show up at the top when ordered alphabetically. This is incredibly useful when you have a lot of projects.
As a result, I found this by accident while playing with a downstream library:
>>> import fs
>>> fs.__version__
'2.4.16'
>>> weird_path = 'C:\\Users\\Sebastian\\Documents\\Coding-Projects\\!deploy_test\\foo'
>>> fs.open_fs(weird_path)
OSFS('C:\\Users\\Sebastian\\Documents\\Coding-Projects')
However, running the same using a relative path resolves as expected:
>>> import os
>>> os.getcwd()
'C:\\Users\\Sebastian\\Documents\\Coding-Projects\\!deploy_test'
>>> fs.open_fs("./foo")
OSFS('C:\\Users\\Sebastian\\Documents\\Coding-Projects\\!deploy_test\\foo')
Is there a workaround for this behavior? I'm eager to have this fixed quickly, so if there is no workaround I could attempt a PR assuming this would lead to a reasonably fast release of the bugfix :)
https://github.com/PyFilesystem/pyfilesystem2/blob/8ed9dc495d8ba2f83fbb2a1145d34d92e13644be/fs/opener/parse.py#L41-L57
This is why the above breaks. Why are we testing for ! to separate url2 and path in line 53?
A current workaround is to percent-encode the !
>>> import fs
>>> weird_path = 'C:\\Users\\Sebastian\\Documents\\Coding-Projects\\%21deploy_test\\foo'
>>> fs.open_fs(weird_path)
OSFS('C:\\Users\\Sebastian\\Documents\\Coding-Projects\\!deploy_test\\foo')
Coincidentally, the comments in #561 seem relevant here too!
I believe if you just used the regular OSFS constructor, rather than the open_fs helper-method, then that would stop the ! from being treated specially?
(EDIT: open_fs expects FS URLs, rather than FS paths, which explains why you need to percent-encode the !)
(EDIT: open_fs expects FS URLs, rather than FS paths, which explains why you need to percent-encode the !)
Fair point. If this is expected behavior, could we add a note in the docs? It took me some time to figure out, so I'd expect to not be the only one who trips over this behavior.
I believe if you just used the regular OSFS constructor, rather than the open_fs helper-method, then that would stop the ! from being treated specially?
This would limit us to OSFS only, right? The open_fs helper parses the schema so you could have non-local storage types, too. For my personal use case, that doesn't matter and local-only is fine. In the general case, I think it won't hold.