Mercurial > repos > shellac > sam_consensus_v3
comparison env/lib/python3.9/site-packages/zipstream_new-1.1.8.dist-info/METADATA @ 0:4f3585e2f14b draft default tip
"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author | shellac |
---|---|
date | Mon, 22 Mar 2021 18:12:50 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4f3585e2f14b |
---|---|
1 Metadata-Version: 2.1 | |
2 Name: zipstream-new | |
3 Version: 1.1.8 | |
4 Summary: Zipfile generator that takes input files as well as streams | |
5 Home-page: https://github.com/arjan-s/python-zipstream | |
6 Author: arjan5 | |
7 Author-email: arjan@anymore.nl | |
8 License: UNKNOWN | |
9 Keywords: zip streaming | |
10 Platform: UNKNOWN | |
11 Classifier: Programming Language :: Python | |
12 Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3) | |
13 Classifier: Operating System :: OS Independent | |
14 Classifier: Topic :: System :: Archiving :: Compression | |
15 Description-Content-Type: text/markdown | |
16 | |
17 | |
18 # python-zipstream | |
19 | |
20 zipstream.py is a zip archive generator based on python 3.3's zipfile.py. It was created to | |
21 generate a zip file generator for streaming (ie web apps). This is beneficial for when you | |
22 want to provide a downloadable archive of a large collection of regular files, which would be infeasible to | |
23 generate the archive prior to downloading or of a very large file that you do not want to store entirely on disk or on memory. | |
24 | |
25 The archive is generated as an iterator of strings, which, when joined, form | |
26 the zip archive. For example, the following code snippet would write a zip | |
27 archive containing files from 'path' to a normal file: | |
28 | |
29 ```python | |
30 import zipstream | |
31 | |
32 z = zipstream.ZipFile() | |
33 z.write('path/to/files') | |
34 | |
35 with open('zipfile.zip', 'wb') as f: | |
36 for data in z: | |
37 f.write(data) | |
38 ``` | |
39 | |
40 zipstream also allows to take as input a byte string iterable and to generate | |
41 the archive as an iterator. | |
42 This avoids storing large files on disk or in memory. | |
43 To do so you could use something like this snippet: | |
44 | |
45 ```python | |
46 def iterable(): | |
47 for _ in xrange(10): | |
48 yield b'this is a byte string\x01\n' | |
49 | |
50 z = zipstream.ZipFile() | |
51 z.write_iter('my_archive_iter', iterable()) | |
52 | |
53 with open('zipfile.zip', 'wb') as f: | |
54 for data in z: | |
55 f.write(data) | |
56 ``` | |
57 | |
58 Of course both approach can be combined: | |
59 | |
60 ```python | |
61 def iterable(): | |
62 for _ in xrange(10): | |
63 yield b'this is a byte string\x01\n' | |
64 | |
65 z = zipstream.ZipFile() | |
66 z.write('path/to/files', 'my_archive_files') | |
67 z.write_iter('my_archive_iter', iterable()) | |
68 | |
69 with open('zipfile.zip', 'wb') as f: | |
70 for data in z: | |
71 f.write(data) | |
72 ``` | |
73 | |
74 Since recent versions of web.py support returning iterators of strings to be | |
75 sent to the browser, to download a dynamically generated archive, you could | |
76 use something like this snippet: | |
77 | |
78 ```python | |
79 def GET(self): | |
80 path = '/path/to/dir/of/files' | |
81 zip_filename = 'files.zip' | |
82 web.header('Content-type' , 'application/zip') | |
83 web.header('Content-Disposition', 'attachment; filename="%s"' % ( | |
84 zip_filename,)) | |
85 return zipstream.ZipFile(path) | |
86 ``` | |
87 | |
88 If the zlib module is available, zipstream.ZipFile can generate compressed zip | |
89 archives. | |
90 | |
91 ## Installation | |
92 | |
93 ``` | |
94 pip install zipstream-new | |
95 ``` | |
96 | |
97 ## Requirements | |
98 | |
99 * Python 2.6+, 3.2+, pypy | |
100 | |
101 ## Examples | |
102 | |
103 ### flask | |
104 | |
105 ```python | |
106 from flask import Response | |
107 | |
108 @app.route('/package.zip', methods=['GET'], endpoint='zipball') | |
109 def zipball(): | |
110 def generator(): | |
111 z = zipstream.ZipFile(mode='w', compression=zipstream.ZIP_DEFLATED) | |
112 | |
113 z.write('/path/to/file') | |
114 | |
115 for chunk in z: | |
116 yield chunk | |
117 | |
118 response = Response(generator(), mimetype='application/zip') | |
119 response.headers['Content-Disposition'] = 'attachment; filename={}'.format('files.zip') | |
120 return response | |
121 | |
122 # or | |
123 | |
124 @app.route('/package.zip', methods=['GET'], endpoint='zipball') | |
125 def zipball(): | |
126 z = zipstream.ZipFile(mode='w', compression=zipstream.ZIP_DEFLATED) | |
127 z.write('/path/to/file') | |
128 | |
129 response = Response(z, mimetype='application/zip') | |
130 response.headers['Content-Disposition'] = 'attachment; filename={}'.format('files.zip') | |
131 return response | |
132 | |
133 # Partial flushing of the zip before closing | |
134 | |
135 @app.route('/package.zip', methods=['GET'], endpoint='zipball') | |
136 def zipball(): | |
137 def generate_zip_with_manifest(): | |
138 z = zipstream.ZipFile(mode='w', compression=zipstream.ZIP_DEFLATED) | |
139 | |
140 manifest = [] | |
141 for filename in os.listdir('/path/to/files'): | |
142 z.write(os.path.join('/path/to/files', filename), arcname=filename) | |
143 yield from z.flush() | |
144 manifest.append(filename) | |
145 | |
146 z.write_str('manifest.json', json.dumps(manifest).encode()) | |
147 | |
148 yield from z | |
149 | |
150 response = Response(z, mimetype='application/zip') | |
151 response.headers['Content-Disposition'] = 'attachment; filename={}'.format('files.zip') | |
152 return response | |
153 ``` | |
154 | |
155 ### django 1.5+ | |
156 | |
157 ```python | |
158 from django.http import StreamingHttpResponse | |
159 | |
160 def zipball(request): | |
161 z = zipstream.ZipFile(mode='w', compression=zipstream.ZIP_DEFLATED) | |
162 z.write('/path/to/file') | |
163 | |
164 response = StreamingHttpResponse(z, content_type='application/zip') | |
165 response['Content-Disposition'] = 'attachment; filename={}'.format('files.zip') | |
166 return response | |
167 ``` | |
168 | |
169 ### webpy | |
170 | |
171 ```python | |
172 def GET(self): | |
173 path = '/path/to/dir/of/files' | |
174 zip_filename = 'files.zip' | |
175 web.header('Content-type' , 'application/zip') | |
176 web.header('Content-Disposition', 'attachment; filename="%s"' % ( | |
177 zip_filename,)) | |
178 return zipstream.ZipFile(path) | |
179 ``` | |
180 | |
181 ## Running tests | |
182 | |
183 With python version > 2.6, just run the following command: `python -m unittest discover` | |
184 | |
185 Alternatively, you can use `nose`. | |
186 | |
187 If you want to run the tests on all supported Python versions, run `tox`. | |
188 | |
189 |