Commit be42d2e9 by willmcgugan

Added an simple httpfs, and sorted out command installation

parent 64e80d49
#!/usr/bin/env python
import sys
from fs.commands.fscat import run
sys.exit(run())
#!/usr/bin/env python
import sys
from fs.commands.fscp import run
sys.exit(run())
#!/usr/bin/env python
from fs.opener import opener from fs.opener import opener
from fs.utils import copyfile, copyfile_non_atomic, copystructure from fs.utils import copyfile, copyfile_non_atomic, copystructure
from fs.path import pathjoin, iswildcard from fs.path import pathjoin, iswildcard
......
#!/usr/bin/env python
import sys
from fs.commands.fsinfo import run
sys.exit(run())
#!/usr/bin/env python
import sys
from fs.commands.fsls import run
sys.exit(run())
#!/usr/bin/env python
import sys
from fs.commands.fsmkdir import run
sys.exit(run())
#!/usr/bin/env python
import sys
from fs.commands.fsmount import run
sys.exit(run())
...@@ -10,7 +10,7 @@ import time ...@@ -10,7 +10,7 @@ import time
class FSMount(Command): class FSMount(Command):
usage = """fsmount [SYSTEM PATH] [FS] usage = """fsmount [FS] [SYSTEM PATH]
or fsmount -u [SYSTEM PATH] or fsmount -u [SYSTEM PATH]
Mounts a file system on a system path""" Mounts a file system on a system path"""
...@@ -41,14 +41,15 @@ Mounts a file system on a system path""" ...@@ -41,14 +41,15 @@ Mounts a file system on a system path"""
return return
try: try:
mount_path = args[0] fs_url = args[0]
except IndexError: except IndexError:
self.error('Mount path required\n') self.error('FS required\n')
return 1 return 1
try: try:
fs_url = args[1] mount_path = args[1]
except IndexError: except IndexError:
self.error('FS required\n') self.error('Mount path required\n')
return 1 return 1
if platform.system() == 'Windows': if platform.system() == 'Windows':
......
#!/usr/bin/env python
import sys
from fs.commands.fsmv import run
sys.exit(run())
#!/usr/bin/env python
from fs.utils import movefile, movefile_non_atomic, contains_files from fs.utils import movefile, movefile_non_atomic, contains_files
from fs.commands import fscp from fs.commands import fscp
import sys import sys
......
#!/usr/bin/env python
import sys
from fs.commands.fsrm import run
sys.exit(run())
#!/usr/bin/env python
import sys
from fs.commands.fsserve import run
sys.exit(run())
#!/usr/bin/env python #!/usr/bin/env python
import sys import sys
from fs.opener import opener from fs.opener import opener
......
#!/usr/bin/env python
import sys
from fs.commands.fstree import run
sys.exit(run())
"""
fs.httpfs
=========
"""
from fs.base import FS
from fs.path import normpath
from fs.errors import ResourceNotFoundError
from urlparse import urlparse
from urllib2 import urlopen, URLError
class HTTPFS(FS):
"""Can barely be called a filesystem, but this enables the opener system
to open http files"""
def __init__(self, url):
self.root_url = url
def _make_url(self, path):
path = normpath(path)
url = '%s/%s' % (self.root_url.rstrip('/'), path.lstrip('/'))
return url
def open(self, path, mode="r"):
if '+' in mode or 'w' in mode or 'a' in mode:
raise UnsuportedError('write access')
url = self._make_url(path)
try:
f = urlopen(url)
except URLError, e:
raise ResourceNotFoundError(path)
except OSError, e:
raise ResourceNotFoundError(path)
return f
def exists(self, path):
return self.isfile(path)
def isdir(self, path):
return False
def isfile(self, path):
url = self._make_url(path)
f = None
try:
try:
f = urlopen(url)
except (URLError, OSError):
return False
finally:
if f is not None:
f.close()
return True
def listdir(self, path="./",
wildcard=None,
full=False,
absolute=False,
dirs_only=False,
files_only=False):
return []
\ No newline at end of file
...@@ -6,7 +6,23 @@ ...@@ -6,7 +6,23 @@
__all__ = ['OpenerError', __all__ = ['OpenerError',
'NoOpenerError', 'NoOpenerError',
'OpenerRegistry', 'OpenerRegistry',
'opener'] 'opener',
'fsopen',
'fsopendir',
'OpenerRegistry',
'Opener',
'OSFSOpener',
'ZipOpener',
'RPCOpener',
'FTPOpener',
'SFTPOpener',
'MemOpener',
'DebugOpener',
'TempOpener',
'S3Opener',
'TahoeOpener',
'DavOpener',
'HTTPOpener']
import sys import sys
from fs.osfs import OSFS from fs.osfs import OSFS
...@@ -27,18 +43,8 @@ def _expand_syspath(path): ...@@ -27,18 +43,8 @@ def _expand_syspath(path):
return path return path
path = os.path.expanduser(os.path.expandvars(path)) path = os.path.expanduser(os.path.expandvars(path))
path = normpath(path) path = normpath(path)
#path = os.path.normpath(os.path.abspath(path))
#if sys.platform == "win32":
# if not path.startswith("\\\\?\\"):
# path = u"\\\\?\\" + path
# # If it points at the root of a drive, it needs a trailing slash.
# if len(path) == 6:
# path = path + "\\"
return path return path
def _parse_credentials(url): def _parse_credentials(url):
scheme = None scheme = None
if '://' in url: if '://' in url:
...@@ -591,7 +597,23 @@ example: ...@@ -591,7 +597,23 @@ example:
return fs, '' return fs, ''
class HTTPOpener(Opener):
names = ['http']
desc = """HTTP file opener. HTTP only supports reading files, and not much else.
example:
* http://www.example.org/index.html"""
@classmethod
def get_fs(cls, registry, fs_name, fs_name_params, fs_path, writeable, create_dir):
from fs.httpfs import HTTPFS
if '/' in fs_path:
dirname, resourcename = fs_path.rsplit('/')
else:
dirname = fs_path
resourcename = ''
fs = HTTPFS('http://' + dirname)
return fs, resourcename
opener = OpenerRegistry([OSFSOpener, opener = OpenerRegistry([OSFSOpener,
...@@ -605,17 +627,10 @@ opener = OpenerRegistry([OSFSOpener, ...@@ -605,17 +627,10 @@ opener = OpenerRegistry([OSFSOpener,
S3Opener, S3Opener,
TahoeOpener, TahoeOpener,
DavOpener, DavOpener,
HTTPOpener,
]) ])
fsopen = opener.open
fsopendir = opener.opendir
def main():
#fs, path = opener.parse('zip:zip://~/zips.zip!t.zip!')
fs, path = opener.parse('ftp://releases.mozilla.org/welcome.msg')
print fs, path
if __name__ == "__main__":
main()
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment