本文整理汇总了Python中twisted.python.filepath.FilePath.listdir方法的典型用法代码示例。如果您正苦于以下问题:Python FilePath.listdir方法的具体用法?Python FilePath.listdir怎么用?Python FilePath.listdir使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类twisted.python.filepath.FilePath
的用法示例。
在下文中一共展示了FilePath.listdir方法的12个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: test_basic
# 需要导入模块: from twisted.python.filepath import FilePath [as 别名]
# 或者: from twisted.python.filepath.FilePath import listdir [as 别名]
def test_basic(self):
"""
Upload a basic file using the FileUploadResource, in just a single chunk.
"""
upload_dir = FilePath(self.mktemp())
upload_dir.makedirs()
temp_dir = FilePath(self.mktemp())
temp_dir.makedirs()
fields = {
"file_name": "resumableFilename",
"mime_type": "resumableType",
"total_size": "resumableTotalSize",
"chunk_number": "resumableChunkNumber",
"chunk_size": "resumableChunkSize",
"total_chunks": "resumableTotalChunks",
"content": "file",
"on_progress": "on_progress",
"session": "session"
}
mock_session = Mock()
resource = FileUploadResource(upload_dir.path, temp_dir.path, fields, mock_session)
multipart_body = b"""-----------------------------478904261175205671481632460\r\nContent-Disposition: form-data; name="resumableChunkNumber"\r\n\r\n1\r\n-----------------------------478904261175205671481632460\r\nContent-Disposition: form-data; name="resumableChunkSize"\r\n\r\n1048576\r\n-----------------------------478904261175205671481632460\r\nContent-Disposition: form-data; name="resumableCurrentChunkSize"\r\n\r\n16\r\n-----------------------------478904261175205671481632460\r\nContent-Disposition: form-data; name="resumableTotalSize"\r\n\r\n16\r\n-----------------------------478904261175205671481632460\r\nContent-Disposition: form-data; name="resumableType"\r\n\r\ntext/plain\r\n-----------------------------478904261175205671481632460\r\nContent-Disposition: form-data; name="resumableIdentifier"\r\n\r\n16-examplefiletxt\r\n-----------------------------478904261175205671481632460\r\nContent-Disposition: form-data; name="resumableFilename"\r\n\r\nexamplefile.txt\r\n-----------------------------478904261175205671481632460\r\nContent-Disposition: form-data; name="resumableRelativePath"\r\n\r\nexamplefile.txt\r\n-----------------------------478904261175205671481632460\r\nContent-Disposition: form-data; name="resumableTotalChunks"\r\n\r\n1\r\n-----------------------------478904261175205671481632460\r\nContent-Disposition: form-data; name="on_progress"\r\n\r\ncom.example.upload.on_progress\r\n-----------------------------478904261175205671481632460\r\nContent-Disposition: form-data; name="session"\r\n\r\n6891276359801283\r\n-----------------------------478904261175205671481632460\r\nContent-Disposition: form-data; name="file"; filename="blob"\r\nContent-Type: application/octet-stream\r\n\r\nhello Crossbar!\n\r\n-----------------------------478904261175205671481632460--\r\n"""
d = renderResource(
resource, b"/", method="POST",
headers={
b"content-type": [b"multipart/form-data; boundary=---------------------------478904261175205671481632460"],
b"Content-Length": [b"1678"]
},
body=multipart_body
)
res = self.successResultOf(d)
res.setResponseCode.assert_called_once_with(200)
self.assertEqual(len(mock_session.method_calls), 2)
# Starting the upload
self.assertEqual(mock_session.method_calls[0][1][0], u"com.example.upload.on_progress")
self.assertEqual(mock_session.method_calls[0][1][1]["status"], "started")
self.assertEqual(mock_session.method_calls[0][1][1]["id"], "examplefile.txt")
# Upload complete
self.assertEqual(mock_session.method_calls[1][1][0], u"com.example.upload.on_progress")
self.assertEqual(mock_session.method_calls[1][1][1]["status"], "finished")
self.assertEqual(mock_session.method_calls[1][1][1]["id"], "examplefile.txt")
# Nothing in the temp dir, one file in the upload
self.assertEqual(len(temp_dir.listdir()), 0)
self.assertEqual(len(upload_dir.listdir()), 1)
with upload_dir.child("examplefile.txt").open("rb") as f:
self.assertEqual(f.read(), b"hello Crossbar!\n")
示例2: Fs
# 需要导入模块: from twisted.python.filepath import FilePath [as 别名]
# 或者: from twisted.python.filepath.FilePath import listdir [as 别名]
class Fs(CrawlJob):
def __init__(self, cfg, db_pool, data):
super(Fs, self).__init__(cfg, db_pool, data)
self.cfg = cfg
self.data = data
self.protocol = 'filesystem'
self.creator = None
self.fs = None
self.connection_closed = False
def create(self, path=None):
self.fs = FilePath(path)
try:
return self.fs.getPermissions()
except:
return False
@defer.inlineCallbacks
def getDirectory(self, path='/'):
self.fs = yield FilePath(path)
if not self.fs.getPermissions():
defer.returnValue(False)
files = []
for f in self.fs.listdir():
if f == '/':
continue
fp = path+f
fs = FilePath(fp)
# dont follow symlinks
if fs.realpath().path != fp:
continue
perm = None
isdir = fs.isdir()
size = fs.getsize()
modified = datetime.utcfromtimestamp(fs.getModificationTime())
df = DiscoveredFile(
resource_id=self.data['resource_id'],
file_path=path,
file_name=f,
file_isdir=isdir,
file_size=size,
file_modified=modified,
file_perm=perm
)
print '[%s] LIST %s.' % (self.data['resource_name'], fp if not fp.endswith('.') else fp)
files.append(df)
defer.returnValue(files)
示例3: _setupTheme
# 需要导入模块: from twisted.python.filepath import FilePath [as 别名]
# 或者: from twisted.python.filepath.FilePath import listdir [as 别名]
def _setupTheme(self):
"""
Download and setup the theme.
"""
logging.info("\tBuilding theme...")
try:
tarball = urlopen(self.theme_url).read()
except HTTPError:
print("Error downloading theme from %s" % self.theme_url)
sys.exit(1)
workPath = FilePath(mkdtemp())
sourceFile = workPath.child("theme.tar.gz")
# change dir to fix issue with sphinx & themes
os.chdir(self.docPath.path)
o = open(sourceFile.path , "w")
o.write(tarball)
o.close()
tar = opentar(sourceFile.path, mode='r:*')
tar.extractall(workPath.path)
theme = None
for d in workPath.listdir():
theme = workPath.child(d)
if theme.isdir():
theme = theme.child("source").child("themes")
dest = self.docPath.child("themes")
theme.moveTo(dest)
break
示例4: __init__
# 需要导入模块: from twisted.python.filepath import FilePath [as 别名]
# 或者: from twisted.python.filepath.FilePath import listdir [as 别名]
def __init__(self, static_path, templates_path):
resource.Resource.__init__(self)
self.log = logging.getLogger('webui.core')
for action in 'online', 'offline', 'scan':
self.putChild(action, WebUIAction(self, 'nm_{}'.format(action)))
if not isinstance(static_path, FilePath):
static_path = FilePath(static_path)
for p in static_path.listdir():
self.putChild(p, File(static_path.child(p).path))
if not isinstance(templates_path, FilePath):
templates_path = FilePath(templates_path)
self.templates = jinja2.Environment(
loader=jinja2.FileSystemLoader(templates_path.path) )
self.templates.filters['json'] = self.jinja2_json
self.templates.filters['unless_false'] = self.jinja2_unless_false
self.events = ClientEvents(self.handle_command)
self.putChild('events', SockJSResource(self.events))
示例5: BuildScriptsTests
# 需要导入模块: from twisted.python.filepath import FilePath [as 别名]
# 或者: from twisted.python.filepath.FilePath import listdir [as 别名]
class BuildScriptsTests(TestCase):
"""
Tests for L{dist.build_scripts_twisted}.
"""
def setUp(self):
self.source = FilePath(self.mktemp())
self.target = FilePath(self.mktemp())
self.source.makedirs()
self.addCleanup(os.chdir, os.getcwd())
os.chdir(self.source.path)
def buildScripts(self):
"""
Write 3 types of scripts and run the L{build_scripts_twisted}
command.
"""
self.writeScript(self.source, "script1",
("#! /usr/bin/env python2.7\n"
"# bogus script w/ Python sh-bang\n"
"pass\n"))
self.writeScript(self.source, "script2.py",
("#!/usr/bin/python\n"
"# bogus script w/ Python sh-bang\n"
"pass\n"))
self.writeScript(self.source, "shell.sh",
("#!/bin/sh\n"
"# bogus shell script w/ sh-bang\n"
"exit 0\n"))
expected = ['script1', 'script2.py', 'shell.sh']
cmd = self.getBuildScriptsCmd(self.target,
[self.source.child(fn).path
for fn in expected])
cmd.finalize_options()
cmd.run()
return self.target.listdir()
def getBuildScriptsCmd(self, target, scripts):
"""
Create a distutils L{Distribution} with a L{DummyCommand} and wrap it
in L{build_scripts_twisted}.
@type target: L{FilePath}
"""
dist = Distribution()
dist.scripts = scripts
dist.command_obj["build"] = DummyCommand(
build_scripts = target.path,
force = 1,
executable = sys.executable
)
return build_scripts_twisted(dist)
def writeScript(self, dir, name, text):
"""
Write the script to disk.
"""
with open(dir.child(name).path, "w") as f:
f.write(text)
def test_notWindows(self):
"""
L{build_scripts_twisted} does not rename scripts on non-Windows
platforms.
"""
self.patch(os, "name", "twisted")
built = self.buildScripts()
for name in ['script1', 'script2.py', 'shell.sh']:
self.assertTrue(name in built)
def test_windows(self):
"""
L{build_scripts_twisted} renames scripts so they end with '.py' on
the Windows platform.
"""
self.patch(os, "name", "nt")
built = self.buildScripts()
for name in ['script1.py', 'script2.py', 'shell.sh.py']:
self.assertTrue(name in built)
示例6: test_basic
# 需要导入模块: from twisted.python.filepath import FilePath [as 别名]
# 或者: from twisted.python.filepath.FilePath import listdir [as 别名]
def test_basic(self):
"""
Upload a basic file using the FileUploadResource, in just a single chunk.
"""
upload_dir = FilePath(self.mktemp())
upload_dir.makedirs()
temp_dir = FilePath(self.mktemp())
temp_dir.makedirs()
fields = {
"file_name": "resumableFilename",
"mime_type": "resumableType",
"total_size": "resumableTotalSize",
"chunk_number": "resumableChunkNumber",
"chunk_size": "resumableChunkSize",
"total_chunks": "resumableTotalChunks",
"content": "file",
"on_progress": "on_progress",
"session": "session",
}
mock_session = Mock()
resource = FileUploadResource(upload_dir.path, temp_dir.path, fields, mock_session)
mp = Multipart()
mp.add_part(b"resumableChunkNumber", b"1")
mp.add_part(b"resumableChunkSize", b"1048576")
mp.add_part(b"resumableCurrentChunkSize", b"16")
mp.add_part(b"resumableTotalSize", b"16")
mp.add_part(b"resumableType", b"text/plain")
mp.add_part(b"resumableIdentifier", b"16-examplefiletxt")
mp.add_part(b"resumableFilename", b"examplefile.txt")
mp.add_part(b"resumableRelativePath", b"examplefile.txt")
mp.add_part(b"resumableTotalChunks", b"1")
mp.add_part(b"on_progress", b"com.example.upload.on_progress")
mp.add_part(b"session", b"6891276359801283")
mp.add_part(b"file", b"hello Crossbar!\n", content_type=b"application/octet-stream", filename=b"blob")
body, headers = mp.render()
d = renderResource(resource, b"/", method="POST", headers=headers, body=body)
res = self.successResultOf(d)
self.assertEqual(res.code, 200)
self.assertEqual(len(mock_session.method_calls), 2)
# Starting the upload
self.assertEqual(mock_session.method_calls[0][1][0], u"com.example.upload.on_progress")
self.assertEqual(mock_session.method_calls[0][1][1]["status"], "started")
self.assertEqual(mock_session.method_calls[0][1][1]["id"], "examplefile.txt")
# Upload complete
self.assertEqual(mock_session.method_calls[1][1][0], u"com.example.upload.on_progress")
self.assertEqual(mock_session.method_calls[1][1][1]["status"], "finished")
self.assertEqual(mock_session.method_calls[1][1][1]["id"], "examplefile.txt")
# Nothing in the temp dir, one file in the upload
self.assertEqual(len(temp_dir.listdir()), 0)
self.assertEqual(len(upload_dir.listdir()), 1)
with upload_dir.child("examplefile.txt").open("rb") as f:
self.assertEqual(f.read(), b"hello Crossbar!\n")
示例7: test_multichunk_shuffle
# 需要导入模块: from twisted.python.filepath import FilePath [as 别名]
# 或者: from twisted.python.filepath.FilePath import listdir [as 别名]
def test_multichunk_shuffle(self):
"""
Uploading files that are in multiple chunks and are uploaded in different order works.
"""
upload_dir = FilePath(self.mktemp())
upload_dir.makedirs()
temp_dir = FilePath(self.mktemp())
temp_dir.makedirs()
fields = {
"file_name": "resumableFilename",
"mime_type": "resumableType",
"total_size": "resumableTotalSize",
"chunk_number": "resumableChunkNumber",
"chunk_size": "resumableChunkSize",
"total_chunks": "resumableTotalChunks",
"content": "file",
"on_progress": "on_progress",
"session": "session",
}
mock_session = Mock()
resource = FileUploadResource(upload_dir.path, temp_dir.path, fields, mock_session)
#
# Chunk 2
multipart_body = b"""-----------------------------42560029919436807832069165364\r\nContent-Disposition: form-data; name="resumableChunkNumber"\r\n\r\n2\r\n-----------------------------42560029919436807832069165364\r\nContent-Disposition: form-data; name="resumableChunkSize"\r\n\r\n10\r\n-----------------------------42560029919436807832069165364\r\nContent-Disposition: form-data; name="resumableCurrentChunkSize"\r\n\r\n6\r\n-----------------------------42560029919436807832069165364\r\nContent-Disposition: form-data; name="resumableTotalSize"\r\n\r\n16\r\n-----------------------------42560029919436807832069165364\r\nContent-Disposition: form-data; name="resumableType"\r\n\r\ntext/plain\r\n-----------------------------42560029919436807832069165364\r\nContent-Disposition: form-data; name="resumableIdentifier"\r\n\r\n16-examplefiletxt\r\n-----------------------------42560029919436807832069165364\r\nContent-Disposition: form-data; name="resumableFilename"\r\n\r\nexamplefile.txt\r\n-----------------------------42560029919436807832069165364\r\nContent-Disposition: form-data; name="resumableRelativePath"\r\n\r\nexamplefile.txt\r\n-----------------------------42560029919436807832069165364\r\nContent-Disposition: form-data; name="resumableTotalChunks"\r\n\r\n2\r\n-----------------------------42560029919436807832069165364\r\nContent-Disposition: form-data; name="on_progress"\r\n\r\ncom.example.upload.on_progress\r\n-----------------------------42560029919436807832069165364\r\nContent-Disposition: form-data; name="session"\r\n\r\n8887465641628580\r\n-----------------------------42560029919436807832069165364\r\nContent-Disposition: form-data; name="file"; filename="blob"\r\nContent-Type: application/octet-stream\r\n\r\nsbar!\n\r\n-----------------------------42560029919436807832069165364--\r\n"""
d = renderResource(
resource,
b"/",
method="POST",
headers={
b"content-type": [
b"multipart/form-data; boundary=---------------------------42560029919436807832069165364"
],
b"Content-Length": [b"1688"],
},
body=multipart_body,
)
res = self.successResultOf(d)
self.assertEqual(res.code, 200)
# One directory in the temp dir, nothing in the upload dir, temp dir
# contains one chunk
self.assertEqual(len(temp_dir.listdir()), 1)
self.assertEqual(len(temp_dir.child("examplefile.txt").listdir()), 1)
with temp_dir.child("examplefile.txt").child("chunk_2").open("rb") as f:
self.assertEqual(f.read(), b"sbar!\n")
self.assertEqual(len(upload_dir.listdir()), 0)
#
# Chunk 1
multipart_body = b"""-----------------------------1311987731215707521443909311\r\nContent-Disposition: form-data; name="resumableChunkNumber"\r\n\r\n1\r\n-----------------------------1311987731215707521443909311\r\nContent-Disposition: form-data; name="resumableChunkSize"\r\n\r\n10\r\n-----------------------------1311987731215707521443909311\r\nContent-Disposition: form-data; name="resumableCurrentChunkSize"\r\n\r\n10\r\n-----------------------------1311987731215707521443909311\r\nContent-Disposition: form-data; name="resumableTotalSize"\r\n\r\n16\r\n-----------------------------1311987731215707521443909311\r\nContent-Disposition: form-data; name="resumableType"\r\n\r\ntext/plain\r\n-----------------------------1311987731215707521443909311\r\nContent-Disposition: form-data; name="resumableIdentifier"\r\n\r\n16-examplefiletxt\r\n-----------------------------1311987731215707521443909311\r\nContent-Disposition: form-data; name="resumableFilename"\r\n\r\nexamplefile.txt\r\n-----------------------------1311987731215707521443909311\r\nContent-Disposition: form-data; name="resumableRelativePath"\r\n\r\nexamplefile.txt\r\n-----------------------------1311987731215707521443909311\r\nContent-Disposition: form-data; name="resumableTotalChunks"\r\n\r\n2\r\n-----------------------------1311987731215707521443909311\r\nContent-Disposition: form-data; name="on_progress"\r\n\r\ncom.example.upload.on_progress\r\n-----------------------------1311987731215707521443909311\r\nContent-Disposition: form-data; name="session"\r\n\r\n8887465641628580\r\n-----------------------------1311987731215707521443909311\r\nContent-Disposition: form-data; name="file"; filename="blob"\r\nContent-Type: application/octet-stream\r\n\r\nhello Cros\r\n-----------------------------1311987731215707521443909311--\r\n"""
d = renderResource(
resource,
b"/",
method="POST",
headers={
b"content-type": [
b"multipart/form-data; boundary=---------------------------1311987731215707521443909311"
],
b"Content-Length": [b"1680"],
},
body=multipart_body,
)
res = self.successResultOf(d)
self.assertEqual(res.code, 200)
self.assertEqual(len(mock_session.method_calls), 4)
# Starting the upload
self.assertEqual(mock_session.method_calls[0][1][0], u"com.example.upload.on_progress")
self.assertEqual(mock_session.method_calls[0][1][1]["status"], "started")
self.assertEqual(mock_session.method_calls[0][1][1]["id"], "examplefile.txt")
self.assertEqual(mock_session.method_calls[0][1][1]["chunk"], 2)
# Progress, first chunk done
self.assertEqual(mock_session.method_calls[1][1][0], u"com.example.upload.on_progress")
self.assertEqual(mock_session.method_calls[1][1][1]["status"], "progress")
self.assertEqual(mock_session.method_calls[1][1][1]["id"], "examplefile.txt")
self.assertEqual(mock_session.method_calls[1][1][1]["chunk"], 2)
# Progress, second chunk done
self.assertEqual(mock_session.method_calls[2][1][0], u"com.example.upload.on_progress")
self.assertEqual(mock_session.method_calls[2][1][1]["status"], "progress")
self.assertEqual(mock_session.method_calls[2][1][1]["id"], "examplefile.txt")
self.assertEqual(mock_session.method_calls[2][1][1]["chunk"], 1)
# Upload complete
self.assertEqual(mock_session.method_calls[3][1][0], u"com.example.upload.on_progress")
self.assertEqual(mock_session.method_calls[3][1][1]["status"], "finished")
self.assertEqual(mock_session.method_calls[3][1][1]["id"], "examplefile.txt")
self.assertEqual(mock_session.method_calls[3][1][1]["chunk"], 1)
#.........这里部分代码省略.........
示例8: test_resumed_upload
# 需要导入模块: from twisted.python.filepath import FilePath [as 别名]
# 或者: from twisted.python.filepath.FilePath import listdir [as 别名]
def test_resumed_upload(self):
"""
Uploading part of a file, simulating a Crossbar restart, and continuing
to upload works.
"""
upload_dir = FilePath(self.mktemp())
upload_dir.makedirs()
temp_dir = FilePath(self.mktemp())
temp_dir.makedirs()
fields = {
"file_name": "resumableFilename",
"mime_type": "resumableType",
"total_size": "resumableTotalSize",
"chunk_number": "resumableChunkNumber",
"chunk_size": "resumableChunkSize",
"total_chunks": "resumableTotalChunks",
"content": "file",
"on_progress": "on_progress",
"session": "session",
}
mock_session = Mock()
resource = FileUploadResource(upload_dir.path, temp_dir.path, fields, mock_session)
# Make some stuff in the temp dir that wasn't there when it started but
# is put there before a file upload
temp_dir.child("otherjunk").makedirs()
#
# Chunk 1
mp = Multipart()
mp.add_part(b"resumableChunkNumber", b"1")
mp.add_part(b"resumableChunkSize", b"10")
mp.add_part(b"resumableCurrentChunkSize", b"10")
mp.add_part(b"resumableTotalSize", b"16")
mp.add_part(b"resumableType", b"text/plain")
mp.add_part(b"resumableIdentifier", b"16-examplefiletxt")
mp.add_part(b"resumableFilename", b"examplefile.txt")
mp.add_part(b"resumableRelativePath", b"examplefile.txt")
mp.add_part(b"resumableTotalChunks", b"2")
mp.add_part(b"on_progress", b"com.example.upload.on_progress")
mp.add_part(b"session", b"6891276359801283")
mp.add_part(b"file", b"hello Cros", content_type=b"application/octet-stream", filename=b"blob")
body, headers = mp.render()
d = renderResource(resource, b"/", method="POST", headers=headers, body=body)
res = self.successResultOf(d)
self.assertEqual(res.code, 200)
# One directory in the temp dir, nothing in the upload dir, temp dir
# contains one chunk
self.assertEqual(len(temp_dir.listdir()), 1)
self.assertEqual(len(temp_dir.child("examplefile.txt").listdir()), 1)
with temp_dir.child("examplefile.txt").child("chunk_1").open("rb") as f:
self.assertEqual(f.read(), b"hello Cros")
self.assertEqual(len(upload_dir.listdir()), 0)
del resource
# Add some random junk in there that Crossbar isn't expecting
temp_dir.child("junk").setContent(b"just some junk")
temp_dir.child("examplefile.txt").child("hi").setContent(b"what")
# Simulate restarting Crossbar by reinitialising the FileUploadResource
resource = FileUploadResource(upload_dir.path, temp_dir.path, fields, mock_session)
#
# Chunk 2
mp = Multipart()
mp.add_part(b"resumableChunkNumber", b"2")
mp.add_part(b"resumableChunkSize", b"10")
mp.add_part(b"resumableCurrentChunkSize", b"6")
mp.add_part(b"resumableTotalSize", b"16")
mp.add_part(b"resumableType", b"text/plain")
mp.add_part(b"resumableIdentifier", b"16-examplefiletxt")
mp.add_part(b"resumableFilename", b"examplefile.txt")
mp.add_part(b"resumableRelativePath", b"examplefile.txt")
mp.add_part(b"resumableTotalChunks", b"2")
mp.add_part(b"on_progress", b"com.example.upload.on_progress")
mp.add_part(b"session", b"6891276359801283")
mp.add_part(b"file", b"sbar!\n", content_type=b"application/octet-stream", filename=b"blob")
body, headers = mp.render()
d = renderResource(resource, b"/", method="POST", headers=headers, body=body)
res = self.successResultOf(d)
self.assertEqual(res.code, 200)
self.assertEqual(len(mock_session.method_calls), 4)
# Starting the upload
self.assertEqual(mock_session.method_calls[0][1][0], u"com.example.upload.on_progress")
self.assertEqual(mock_session.method_calls[0][1][1]["status"], "started")
self.assertEqual(mock_session.method_calls[0][1][1]["id"], "examplefile.txt")
#.........这里部分代码省略.........
示例9: test_multichunk
# 需要导入模块: from twisted.python.filepath import FilePath [as 别名]
# 或者: from twisted.python.filepath.FilePath import listdir [as 别名]
def test_multichunk(self):
"""
Uploading files that are in multiple chunks works.
"""
upload_dir = FilePath(self.mktemp())
upload_dir.makedirs()
temp_dir = FilePath(self.mktemp())
temp_dir.makedirs()
fields = {
"file_name": "resumableFilename",
"mime_type": "resumableType",
"total_size": "resumableTotalSize",
"chunk_number": "resumableChunkNumber",
"chunk_size": "resumableChunkSize",
"total_chunks": "resumableTotalChunks",
"content": "file",
"on_progress": "on_progress",
"session": "session"
}
mock_session = Mock()
resource = FileUploadResource(upload_dir.path, temp_dir.path, fields, mock_session)
#
# Chunk 1
mp = Multipart()
mp.add_part(b"resumableChunkNumber", b"1")
mp.add_part(b"resumableChunkSize", b"10")
mp.add_part(b"resumableCurrentChunkSize", b"10")
mp.add_part(b"resumableTotalSize", b"16")
mp.add_part(b"resumableType", b"text/plain")
mp.add_part(b"resumableIdentifier", b"16-examplefiletxt")
mp.add_part(b"resumableFilename", b"examplefile.txt")
mp.add_part(b"resumableRelativePath", b"examplefile.txt")
mp.add_part(b"resumableTotalChunks", b"2")
mp.add_part(b"on_progress", b"com.example.upload.on_progress")
mp.add_part(b"session", b"6891276359801283")
mp.add_part(b"file", b"hello Cros",
content_type=b"application/octet-stream",
filename=b"blob")
body, headers = mp.render()
d = renderResource(
resource, b"/", method="POST",
headers=headers,
body=body
)
res = self.successResultOf(d)
res.setResponseCode.assert_called_once_with(200)
# One directory in the temp dir, nothing in the upload dir, temp dir
# contains one chunk
self.assertEqual(len(temp_dir.listdir()), 1)
self.assertEqual(len(temp_dir.child("examplefile.txt").listdir()), 1)
with temp_dir.child("examplefile.txt").child("chunk_1").open("rb") as f:
self.assertEqual(f.read(), b"hello Cros")
self.assertEqual(len(upload_dir.listdir()), 0)
#
# Chunk 2
mp = Multipart()
mp.add_part(b"resumableChunkNumber", b"2")
mp.add_part(b"resumableChunkSize", b"10")
mp.add_part(b"resumableCurrentChunkSize", b"6")
mp.add_part(b"resumableTotalSize", b"16")
mp.add_part(b"resumableType", b"text/plain")
mp.add_part(b"resumableIdentifier", b"16-examplefiletxt")
mp.add_part(b"resumableFilename", b"examplefile.txt")
mp.add_part(b"resumableRelativePath", b"examplefile.txt")
mp.add_part(b"resumableTotalChunks", b"2")
mp.add_part(b"on_progress", b"com.example.upload.on_progress")
mp.add_part(b"session", b"6891276359801283")
mp.add_part(b"file", b"sbar!\n",
content_type=b"application/octet-stream",
filename=b"blob")
body, headers = mp.render()
d = renderResource(
resource, b"/", method="POST",
headers=headers,
body=body
)
res = self.successResultOf(d)
res.setResponseCode.assert_called_once_with(200)
self.assertEqual(len(mock_session.method_calls), 4)
# Starting the upload
self.assertEqual(mock_session.method_calls[0][1][0], u"com.example.upload.on_progress")
self.assertEqual(mock_session.method_calls[0][1][1]["status"], "started")
self.assertEqual(mock_session.method_calls[0][1][1]["id"], "examplefile.txt")
self.assertEqual(mock_session.method_calls[0][1][1]["chunk"], 1)
# Progress, first chunk done
#.........这里部分代码省略.........
示例10: DeckStore
# 需要导入模块: from twisted.python.filepath import FilePath [as 别名]
# 或者: from twisted.python.filepath.FilePath import listdir [as 别名]
class DeckStore(object):
def __init__(self, enabled_directory=config.decks_enabled_directory,
available_directory=config.decks_available_directory):
self.enabled_directory = FilePath(enabled_directory)
self.available_directory = FilePath(available_directory)
self._cache = {}
self._cache_stale = True
def _list(self):
if self._cache_stale:
self._update_cache()
for deck_id, deck in self._cache.iteritems():
yield (deck_id, deck)
def list(self):
decks = []
for deck_id, deck in self._list():
decks.append((deck_id, deck))
return decks
def list_enabled(self):
decks = []
for deck_id, deck in self._list():
if not self.is_enabled(deck_id):
continue
decks.append((deck_id, deck))
return decks
def is_enabled(self, deck_id):
return self.enabled_directory.child(deck_id + '.yaml').exists()
def enable(self, deck_id):
deck_path = self.available_directory.child(deck_id + '.yaml')
if not deck_path.exists():
raise DeckNotFound(deck_id)
deck_enabled_path = self.enabled_directory.child(deck_id + '.yaml')
try:
deck_path.linkTo(deck_enabled_path)
except OSError as ose:
if ose.errno != errno.EEXIST:
raise
def disable(self, deck_id):
deck_enabled_path = self.enabled_directory.child(deck_id + '.yaml')
if not deck_enabled_path.exists():
raise DeckNotFound(deck_id)
deck_enabled_path.remove()
def _update_cache(self):
new_cache = {}
for deck_path in self.available_directory.listdir():
if not deck_path.endswith('.yaml'):
continue
deck = NGDeck(
deck_path=self.available_directory.child(deck_path).path
)
new_cache[deck.id] = deck
self._cache = new_cache
self._cache_stale = False
def get(self, deck_id):
if self._cache_stale:
self._update_cache()
try:
return deepcopy(self._cache[deck_id])
except KeyError:
raise DeckNotFound(deck_id)
示例11: FileUploadResource
# 需要导入模块: from twisted.python.filepath import FilePath [as 别名]
# 或者: from twisted.python.filepath.FilePath import listdir [as 别名]
class FileUploadResource(Resource):
"""
Twisted Web resource that handles file uploads over `HTTP/POST` requests.
"""
log = make_logger()
def __init__(self,
upload_directory,
temp_directory,
form_fields,
upload_session,
options=None):
"""
:param upload_directory: The target directory where uploaded files will be stored.
:type upload_directory: str
:param temp_directory: A temporary directory where chunks of a file being uploaded are stored.
:type temp_directory: str
:param form_fields: Names of HTML form fields used for uploading.
:type form_fields: dict
:param upload_session: An instance of `ApplicationSession` used for publishing progress events.
:type upload_session: obj
:param options: Options for file upload.
:type options: dict or None
"""
Resource.__init__(self)
self._dir = FilePath(upload_directory)
self._tempDir = FilePath(temp_directory)
self._form_fields = form_fields
self._fileupload_session = upload_session
self._options = options or {}
self._max_file_size = self._options.get('max_file_size', 10 * 1024 * 1024)
self._fileTypes = self._options.get('file_types', None)
self._file_permissions = self._options.get('file_permissions', None)
# track uploaded files / chunks
self._uploads = {}
# scan the temp dir for uploaded chunks and fill the _uploads dict with it
# so existing uploads can be resumed
for fileTempDir in self._tempDir.listdir():
ft = self._tempDir.child(fileTempDir)
if ft.isdir():
self._uploads[fileTempDir] = {'chunk_list': {}, 'origin': 'startup'}
for chunk in ft.listdir():
if chunk[:6] == 'chunk_':
self._uploads[fileTempDir]['chunk_list'][int(chunk[6:])] = True
self.log.debug("Scanned pending uploads: {uploads}", uploads=self._uploads)
def render_POST(self, request):
headers = {x.decode('iso-8859-1'): y.decode('iso-8859-1')
for x, y in request.getAllHeaders().items()}
origin = headers['host']
content = cgi.FieldStorage(
fp=request.content,
headers=headers,
environ={"REQUEST_METHOD": "POST"})
f = self._form_fields
filename = content[f['file_name']].value
totalSize = int(content[f['total_size']].value)
totalChunks = int(content[f['total_chunks']].value)
chunkSize = int(content[f['chunk_size']].value)
chunkNumber = int(content[f['chunk_number']].value)
fileContent = content[f['content']].value
fileId = filename
# # prepare user specific upload areas
# # NOT YET IMPLEMENTED
# #
# if 'auth_id' in f and f['auth_id'] in content:
# auth_id = content[f['auth_id']].value
# mydir = os.path.join(self._dir, auth_id)
# my_temp_dir = os.path.join(self._tempDir, auth_id)
#
# # check if auth_id is a valid directory_name
# #
# if auth_id != auth_id.encode('ascii', 'ignore'):
# msg = "The requestor auth_id must be an ascii string."
# if self._debug:
# log.msg(msg)
# # 415 Unsupported Media Type
# request.setResponseCode(415, msg)
# return msg
# else:
# auth_id = 'anonymous'
# create user specific folder
# mydir = self._dir
# my_temp_dir = self._tempDir
#.........这里部分代码省略.........
示例12: __init__
# 需要导入模块: from twisted.python.filepath import FilePath [as 别名]
# 或者: from twisted.python.filepath.FilePath import listdir [as 别名]
class DirDBM:
"""
A directory with a DBM interface.
This class presents a hash-like interface to a directory of small,
flat files. It can only use strings as keys or values.
"""
def __init__(self, name):
"""
@type name: str
@param name: Base path to use for the directory storage.
"""
self.dname = os.path.abspath(name)
self._dnamePath = FilePath(name)
if not self._dnamePath.isdir():
self._dnamePath.createDirectory()
else:
# Run recovery, in case we crashed. we delete all files ending
# with ".new". Then we find all files who end with ".rpl". If a
# corresponding file exists without ".rpl", we assume the write
# failed and delete the ".rpl" file. If only a ".rpl" exist we
# assume the program crashed right after deleting the old entry
# but before renaming the replacement entry.
#
# NOTE: '.' is NOT in the base64 alphabet!
for f in glob.glob(self._dnamePath.child("*.new").path):
os.remove(f)
replacements = glob.glob(self._dnamePath.child("*.rpl").path)
for f in replacements:
old = f[:-4]
if os.path.exists(old):
os.remove(f)
else:
os.rename(f, old)
def _encode(self, k):
"""
Encode a key so it can be used as a filename.
"""
# NOTE: '_' is NOT in the base64 alphabet!
return base64.encodestring(k).replace(b'\n', b'_').replace(b"/", b"-")
def _decode(self, k):
"""
Decode a filename to get the key.
"""
return base64.decodestring(k.replace(b'_', b'\n').replace(b"-", b"/"))
def _readFile(self, path):
"""
Read in the contents of a file.
Override in subclasses to e.g. provide transparently encrypted dirdbm.
"""
with _open(path.path, "rb") as f:
s = f.read()
return s
def _writeFile(self, path, data):
"""
Write data to a file.
Override in subclasses to e.g. provide transparently encrypted dirdbm.
"""
with _open(path.path, "wb") as f:
f.write(data)
f.flush()
def __len__(self):
"""
@return: The number of key/value pairs in this Shelf
"""
return len(self._dnamePath.listdir())
def __setitem__(self, k, v):
"""
C{dirdbm[k] = v}
Create or modify a textfile in this directory
@type k: bytes
@param k: key to set
@type v: bytes
@param v: value to associate with C{k}
"""
if not type(k) == bytes:
raise TypeError("DirDBM key must be bytes")
if not type(v) == bytes:
raise TypeError("DirDBM value must be bytes")
k = self._encode(k)
# We create a new file with extension .new, write the data to it, and
# if the write succeeds delete the old file and rename the new one.
#.........这里部分代码省略.........