[Git][debian-gis-team/remotezip][master] 8 commits: New upstream version 0.12.6
Antonio Valentino (@antonio.valentino)
gitlab at salsa.debian.org
Sun Aug 30 08:14:05 BST 2026
Antonio Valentino pushed to branch master at Debian GIS Project / remotezip
Commits:
c4c83be2 by Antonio Valentino at 2026-08-30T06:58:51+00:00
New upstream version 0.12.6
- - - - -
f823414b by Antonio Valentino at 2026-08-30T06:58:51+00:00
Update upstream source from tag 'upstream/0.12.6'
Update to upstream version '0.12.6'
with Debian dir a5c73542adc22d4537a40ffa8a7452901ca2b710
- - - - -
50d1753a by Antonio Valentino at 2026-08-30T06:59:29+00:00
New upstream release
- - - - -
7d07a418 by Antonio Valentino at 2026-08-30T07:02:43+00:00
Update dates in d/copyright
- - - - -
72023485 by Antonio Valentino at 2026-08-30T07:05:38+00:00
Refresh all patches
- - - - -
85c53c87 by Antonio Valentino at 2026-08-30T07:09:06+00:00
Add dependency on python3-requests-mock
- - - - -
97e6737a by Antonio Valentino at 2026-08-30T07:12:30+00:00
Add d/python3-remotezip.lintian-overrides
- - - - -
9d4c432b by Antonio Valentino at 2026-08-30T07:12:30+00:00
Set distribution to unstable
- - - - -
15 changed files:
- PKG-INFO
- README.md
- debian/changelog
- debian/control
- debian/copyright
- − debian/patches/pep517.patch
- − debian/patches/series
- + debian/python3-remotezip.lintian-overrides
- + pyproject.toml
- remotezip.egg-info/PKG-INFO
- remotezip.egg-info/SOURCES.txt
- remotezip.egg-info/entry_points.txt
- remotezip.egg-info/requires.txt
- remotezip.py
- − setup.py
Changes:
=====================================
PKG-INFO
=====================================
@@ -1,15 +1,12 @@
-Metadata-Version: 2.1
+Metadata-Version: 2.4
Name: remotezip
-Version: 0.12.3
+Version: 0.12.6
Summary: Access zip file content hosted remotely without downloading the full file.
-Home-page: https://github.com/gtsystem/python-remotezip
-Author: Giuseppe Tribulato
-Author-email: gtsystem at gmail.com
+Author-email: Giuseppe Tribulato <gtsystem at gmail.com>
License: MIT
-Platform: UNKNOWN
+Project-URL: Homepage, https://github.com/gtsystem/python-remotezip
Classifier: Intended Audience :: Developers
Classifier: Development Status :: 5 - Production/Stable
-Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
@@ -21,9 +18,15 @@ Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
+Classifier: Programming Language :: Python :: 3.14
+Requires-Python: >=2.7
Description-Content-Type: text/markdown
-Provides-Extra: test
License-File: LICENSE
+Requires-Dist: requests
+Dynamic: license-file
# remotezip
@@ -43,13 +46,13 @@ This module provides a way to access single members of a zip file archive withou
To download the content, this library rely on the `requests` module. The constructor interface matches the function `requests.get` module.
-* **url**: Url where the zip file is located *(required)*.
+* **url**: URL where the zip file is located *(required)*.
* **auth**: authentication credentials.
* **headers**: headers to pass to the request.
* **timeout**: timeout for the request.
* **verify**: enable/disable certificate verification or set custom certificates location.
-* ... Please look at the [requests](http://docs.python-requests.org/en/master/user/quickstart/#make-a-request) documentation for futher usage details.
-* **initial\_buffer\_size**: How much data (in bytes) to fetch during the first connection to download the zip file central directory. If your zip file conteins a lot of files, would be a good idea to increase this parameter in order to avoid the need for further remote requests. *Default: 64kb*.
+* ... Please look at the [requests](http://docs.python-requests.org/en/master/user/quickstart/#make-a-request) documentation for further usage details.
+* **initial\_buffer\_size**: How much data (in bytes) to fetch during the first connection to download the zip file central directory. If your zip file contains a lot of files, would be a good idea to increase this parameter in order to avoid the need for further remote requests. *Default: 64kb*.
* **session**: a custom session object to use for the request.
* **support_suffix_range**: You can set this attribute to `False` if the remote server doesn't support suffix range
(negative offset). Notice that this option will use one more HEAD request to fetch the content length.
@@ -95,7 +98,7 @@ with RemoteZip('http://.../myfile.zip') as zip:
#### Download a member
-The following example will extract the file `somefile.txt` from the archive stored at the url `http://.../myfile.zip`.
+The following example will extract the file `somefile.txt` from the archive stored at the URL `http://.../myfile.zip`.
```python
from remotezip import RemoteZip
@@ -134,7 +137,7 @@ usage: remotezip [-h] [-l] [-d DIR] url [filename [filename ...]]
Unzip remote files
positional arguments:
- url Url of the zip archive
+ url URL of the zip archive
filename File to extract
optional arguments:
@@ -172,8 +175,6 @@ How many requests will this module perform to download a member?
* If the central directory is bigger than **initial\_buffer\_size**, a third request will be required.
* If negative seek operations are used in `ZipExtFile`, each of them will result in a new request.
-## Alternative modules
+## Alternative module
There is a similar module available for python [pyremotezip](https://github.com/fcvarela/pyremotezip).
-
-
=====================================
README.md
=====================================
@@ -16,13 +16,13 @@ This module provides a way to access single members of a zip file archive withou
To download the content, this library rely on the `requests` module. The constructor interface matches the function `requests.get` module.
-* **url**: Url where the zip file is located *(required)*.
+* **url**: URL where the zip file is located *(required)*.
* **auth**: authentication credentials.
* **headers**: headers to pass to the request.
* **timeout**: timeout for the request.
* **verify**: enable/disable certificate verification or set custom certificates location.
-* ... Please look at the [requests](http://docs.python-requests.org/en/master/user/quickstart/#make-a-request) documentation for futher usage details.
-* **initial\_buffer\_size**: How much data (in bytes) to fetch during the first connection to download the zip file central directory. If your zip file conteins a lot of files, would be a good idea to increase this parameter in order to avoid the need for further remote requests. *Default: 64kb*.
+* ... Please look at the [requests](http://docs.python-requests.org/en/master/user/quickstart/#make-a-request) documentation for further usage details.
+* **initial\_buffer\_size**: How much data (in bytes) to fetch during the first connection to download the zip file central directory. If your zip file contains a lot of files, would be a good idea to increase this parameter in order to avoid the need for further remote requests. *Default: 64kb*.
* **session**: a custom session object to use for the request.
* **support_suffix_range**: You can set this attribute to `False` if the remote server doesn't support suffix range
(negative offset). Notice that this option will use one more HEAD request to fetch the content length.
@@ -68,7 +68,7 @@ with RemoteZip('http://.../myfile.zip') as zip:
#### Download a member
-The following example will extract the file `somefile.txt` from the archive stored at the url `http://.../myfile.zip`.
+The following example will extract the file `somefile.txt` from the archive stored at the URL `http://.../myfile.zip`.
```python
from remotezip import RemoteZip
@@ -107,7 +107,7 @@ usage: remotezip [-h] [-l] [-d DIR] url [filename [filename ...]]
Unzip remote files
positional arguments:
- url Url of the zip archive
+ url URL of the zip archive
filename File to extract
optional arguments:
@@ -145,6 +145,6 @@ How many requests will this module perform to download a member?
* If the central directory is bigger than **initial\_buffer\_size**, a third request will be required.
* If negative seek operations are used in `ZipExtFile`, each of them will result in a new request.
-## Alternative modules
+## Alternative module
There is a similar module available for python [pyremotezip](https://github.com/fcvarela/pyremotezip).
=====================================
debian/changelog
=====================================
@@ -1,13 +1,22 @@
-remotezip (0.12.3-4) UNRELEASED; urgency=medium
+remotezip (0.12.6-1) unstable; urgency=medium
- * Team upload.
+ [ Bas Couwenberg ]
* Use test-build-validate-cleanup instead of test-build-twice.
* Drop Priority: optional, default since dpkg 1.22.13.
* Bump Standards-Version to 4.7.4, changes: priority.
* Update lintian overrides.
* Use pybuild-plugin-pyproject instead of python3-setuptools.
- -- Bas Couwenberg <sebastic at debian.org> Sat, 25 Oct 2025 13:07:17 +0200
+ [ Antonio Valentino ]
+ * New upstream release.
+ * Update dates in d/copyright.
+ * debian/patches:
+ - Refresh all patches.
+ * debian/control:
+ - Add dependency on python3-requests-mock.
+ * Add d/python3-remotezip.lintian-overrides.
+
+ -- Antonio Valentino <antonio.valentino at tiscali.it> Sun, 30 Aug 2026 07:09:21 +0000
remotezip (0.12.3-3) unstable; urgency=medium
=====================================
debian/control
=====================================
@@ -7,6 +7,7 @@ Build-Depends: debhelper-compat (= 13),
dh-sequence-python3,
pybuild-plugin-pyproject,
python3-all,
+ python3-requests-mock <!nocheck>,
python3-requests,
python3-setuptools
Standards-Version: 4.7.4
=====================================
debian/copyright
=====================================
@@ -8,7 +8,7 @@ Copyright: 2018, Giuseppe Tribulato
License: Expat
Files: debian/*
-Copyright: 2023-2025, Antonio Valentino <antonio.valentino at tiscali.it>
+Copyright: 2023-2026, Antonio Valentino <antonio.valentino at tiscali.it>
License: Expat
License: Expat
=====================================
debian/patches/pep517.patch deleted
=====================================
@@ -1,10 +0,0 @@
-Description: Add support for PEP 517.
-Author: Bas Couwenberg <sebastic at debian.org>
-Forwarded: https://github.com/gtsystem/python-remotezip/pull/33
-
---- /dev/null
-+++ b/pyproject.toml
-@@ -0,0 +1,3 @@
-+[build-system]
-+requires = ["setuptools"]
-+build-backend = "setuptools.build_meta"
=====================================
debian/patches/series deleted
=====================================
@@ -1 +0,0 @@
-pep517.patch
=====================================
debian/python3-remotezip.lintian-overrides
=====================================
@@ -0,0 +1,2 @@
+# False positive
+package-contains-documentation-outside-usr-share-doc [usr/lib/python3/*-packages/remotezip-*.*-info/*.txt]
=====================================
pyproject.toml
=====================================
@@ -0,0 +1,48 @@
+[build-system]
+requires = ["setuptools>=61.0"]
+build-backend = "setuptools.build_meta"
+
+[project]
+name = "remotezip"
+version = "0.12.6"
+description = "Access zip file content hosted remotely without downloading the full file."
+readme = "README.md"
+requires-python = ">=2.7"
+authors = [
+ {name = "Giuseppe Tribulato", email = "gtsystem at gmail.com"},
+]
+license = {text = "MIT"}
+dependencies = [
+ "requests",
+]
+classifiers = [
+ "Intended Audience :: Developers",
+ "Development Status :: 5 - Production/Stable",
+ "Programming Language :: Python",
+ "Programming Language :: Python :: 2.7",
+ "Programming Language :: Python :: 3",
+ "Programming Language :: Python :: 3.3",
+ "Programming Language :: Python :: 3.4",
+ "Programming Language :: Python :: 3.5",
+ "Programming Language :: Python :: 3.6",
+ "Programming Language :: Python :: 3.7",
+ "Programming Language :: Python :: 3.8",
+ "Programming Language :: Python :: 3.9",
+ "Programming Language :: Python :: 3.10",
+ "Programming Language :: Python :: 3.11",
+ "Programming Language :: Python :: 3.12",
+ "Programming Language :: Python :: 3.13",
+ "Programming Language :: Python :: 3.14",
+]
+
+[dependency-groups]
+test = ["requests-mock"]
+
+[project.urls]
+Homepage = "https://github.com/gtsystem/python-remotezip"
+
+[project.scripts]
+remotezip = "remotezip:main"
+
+[tool.setuptools]
+py-modules = ["remotezip"]
=====================================
remotezip.egg-info/PKG-INFO
=====================================
@@ -1,15 +1,12 @@
-Metadata-Version: 2.1
+Metadata-Version: 2.4
Name: remotezip
-Version: 0.12.3
+Version: 0.12.6
Summary: Access zip file content hosted remotely without downloading the full file.
-Home-page: https://github.com/gtsystem/python-remotezip
-Author: Giuseppe Tribulato
-Author-email: gtsystem at gmail.com
+Author-email: Giuseppe Tribulato <gtsystem at gmail.com>
License: MIT
-Platform: UNKNOWN
+Project-URL: Homepage, https://github.com/gtsystem/python-remotezip
Classifier: Intended Audience :: Developers
Classifier: Development Status :: 5 - Production/Stable
-Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
@@ -21,9 +18,15 @@ Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
+Classifier: Programming Language :: Python :: 3.14
+Requires-Python: >=2.7
Description-Content-Type: text/markdown
-Provides-Extra: test
License-File: LICENSE
+Requires-Dist: requests
+Dynamic: license-file
# remotezip
@@ -43,13 +46,13 @@ This module provides a way to access single members of a zip file archive withou
To download the content, this library rely on the `requests` module. The constructor interface matches the function `requests.get` module.
-* **url**: Url where the zip file is located *(required)*.
+* **url**: URL where the zip file is located *(required)*.
* **auth**: authentication credentials.
* **headers**: headers to pass to the request.
* **timeout**: timeout for the request.
* **verify**: enable/disable certificate verification or set custom certificates location.
-* ... Please look at the [requests](http://docs.python-requests.org/en/master/user/quickstart/#make-a-request) documentation for futher usage details.
-* **initial\_buffer\_size**: How much data (in bytes) to fetch during the first connection to download the zip file central directory. If your zip file conteins a lot of files, would be a good idea to increase this parameter in order to avoid the need for further remote requests. *Default: 64kb*.
+* ... Please look at the [requests](http://docs.python-requests.org/en/master/user/quickstart/#make-a-request) documentation for further usage details.
+* **initial\_buffer\_size**: How much data (in bytes) to fetch during the first connection to download the zip file central directory. If your zip file contains a lot of files, would be a good idea to increase this parameter in order to avoid the need for further remote requests. *Default: 64kb*.
* **session**: a custom session object to use for the request.
* **support_suffix_range**: You can set this attribute to `False` if the remote server doesn't support suffix range
(negative offset). Notice that this option will use one more HEAD request to fetch the content length.
@@ -95,7 +98,7 @@ with RemoteZip('http://.../myfile.zip') as zip:
#### Download a member
-The following example will extract the file `somefile.txt` from the archive stored at the url `http://.../myfile.zip`.
+The following example will extract the file `somefile.txt` from the archive stored at the URL `http://.../myfile.zip`.
```python
from remotezip import RemoteZip
@@ -134,7 +137,7 @@ usage: remotezip [-h] [-l] [-d DIR] url [filename [filename ...]]
Unzip remote files
positional arguments:
- url Url of the zip archive
+ url URL of the zip archive
filename File to extract
optional arguments:
@@ -172,8 +175,6 @@ How many requests will this module perform to download a member?
* If the central directory is bigger than **initial\_buffer\_size**, a third request will be required.
* If negative seek operations are used in `ZipExtFile`, each of them will result in a new request.
-## Alternative modules
+## Alternative module
There is a similar module available for python [pyremotezip](https://github.com/fcvarela/pyremotezip).
-
-
=====================================
remotezip.egg-info/SOURCES.txt
=====================================
@@ -1,7 +1,7 @@
LICENSE
README.md
+pyproject.toml
remotezip.py
-setup.py
remotezip.egg-info/PKG-INFO
remotezip.egg-info/SOURCES.txt
remotezip.egg-info/dependency_links.txt
=====================================
remotezip.egg-info/entry_points.txt
=====================================
@@ -1,3 +1,2 @@
[console_scripts]
remotezip = remotezip:main
-
=====================================
remotezip.egg-info/requires.txt
=====================================
@@ -1,4 +1 @@
requests
-
-[test]
-requests_mock
=====================================
remotezip.py
=====================================
@@ -1,7 +1,6 @@
#!/usr/bin/env python
import io
import zipfile
-from datetime import datetime
from itertools import tee
import requests
@@ -31,8 +30,45 @@ class PartialBuffer:
however, any attempt to read data outside the partial data is going to fail
with OutOfBound error.
"""
+ @staticmethod
+ def _read_up_to(buffer, size):
+ """Read at most `size` bytes into a new buffer.
+
+ A single read() is not enough: a socket-backed response can return
+ fewer bytes than requested while more are still coming. Data is written
+ straight into the result so that no intermediate copy of the whole
+ range is held.
+ """
+ result = io.BytesIO()
+ remaining = size
+ while remaining > 0:
+ chunk = buffer.read(remaining)
+ if not chunk:
+ break
+ result.write(chunk)
+ remaining -= len(chunk)
+ result.seek(0)
+ return result
+
+ @staticmethod
+ def _close_buffer(buffer):
+ """Close a response buffer and release its connection, if any."""
+ try:
+ buffer.close()
+ finally:
+ if hasattr(buffer, 'release_conn'):
+ buffer.release_conn()
+
def __init__(self, buffer, offset, size, stream):
- self.buffer = buffer if stream else io.BytesIO(buffer.read())
+ # Read at most `size` bytes: the declared range is what this buffer
+ # represents, and a server may send more than it announced.
+ if stream:
+ self.buffer = buffer
+ else:
+ try:
+ self.buffer = self._read_up_to(buffer, size)
+ finally:
+ self._close_buffer(buffer)
self._offset = offset
self._size = size
self._position = offset
@@ -57,9 +93,7 @@ class PartialBuffer:
def close(self):
"""Ensure memory and connections are closed"""
if not self.buffer.closed:
- self.buffer.close()
- if hasattr(self.buffer, 'release_conn'):
- self.buffer.release_conn()
+ self._close_buffer(self.buffer)
def tell(self):
"""Returns the current position on the virtual buffer"""
@@ -224,7 +258,18 @@ class RemoteFetcher:
kwargs = self.prepare_request(data_range)
try:
res, range_header = self._request(kwargs)
- range_min, range_max = self.parse_range_header(range_header)
+ try:
+ try:
+ range_min, range_max = self.parse_range_header(range_header)
+ except ValueError:
+ raise RemoteZipError(
+ "Malformed Content-Range returned by the server: %s" % range_header)
+ if range_max is None or range_max < range_min:
+ raise RemoteZipError(
+ "Invalid Content-Range returned by the server: %s" % range_header)
+ except RemoteZipError:
+ PartialBuffer._close_buffer(res)
+ raise
return PartialBuffer(res, range_min, range_max - range_min + 1, stream)
except IOError as e:
raise RemoteIOError(str(e))
@@ -264,8 +309,8 @@ def _list_files(url, support_suffix_range, filenames):
data = []
for fname in filenames:
zinfo = zip.getinfo(fname)
- dt = datetime(*zinfo.date_time)
- data.append((zinfo.file_size, dt.strftime('%Y-%m-%d %H:%M:%S'), zinfo.filename))
+ Y, m, d, H, M, S = zinfo.date_time
+ data.append((zinfo.file_size, f"{Y:04d}-{m:02d}-{d:02d} {H:02d}:{M:02d}:{S:02d}", zinfo.filename))
_printTable(data, ('Length', 'DateTime', 'Name'), '><<')
@@ -298,7 +343,7 @@ def main():
import os
parser = argparse.ArgumentParser(description="Unzip remote files")
- parser.add_argument('url', help='Url of the zip archive')
+ parser.add_argument('url', help='URL of the zip archive')
parser.add_argument('filename', nargs='*', help='File to extract')
parser.add_argument('-l', '--list', action='store_true', help='List files in the archive')
parser.add_argument('-d', '--dir', default=os.getcwd(), help='Extract directory, default current directory')
=====================================
setup.py deleted
=====================================
@@ -1,41 +0,0 @@
-from setuptools import setup
-
-with open("README.md") as f:
- description = f.read()
-
-setup(
- name='remotezip',
- version='0.12.3',
- author='Giuseppe Tribulato',
- author_email='gtsystem at gmail.com',
- py_modules=['remotezip'],
- url='https://github.com/gtsystem/python-remotezip',
- license='MIT',
- description='Access zip file content hosted remotely without downloading the full file.',
- long_description=description,
- long_description_content_type="text/markdown",
- install_requires=["requests"],
- extras_require={
- "test": ["requests_mock"],
- },
- entry_points={
- 'console_scripts': ['remotezip = remotezip:main']
- },
- test_suite='test_remotezip',
- classifiers=[
- 'Intended Audience :: Developers',
- 'Development Status :: 5 - Production/Stable',
- 'License :: OSI Approved :: MIT License',
- 'Programming Language :: Python',
- 'Programming Language :: Python :: 2.7',
- 'Programming Language :: Python :: 3',
- 'Programming Language :: Python :: 3.3',
- 'Programming Language :: Python :: 3.4',
- 'Programming Language :: Python :: 3.5',
- 'Programming Language :: Python :: 3.6',
- 'Programming Language :: Python :: 3.7',
- 'Programming Language :: Python :: 3.8',
- 'Programming Language :: Python :: 3.9',
- 'Programming Language :: Python :: 3.10'
- ]
-)
View it on GitLab: https://salsa.debian.org/debian-gis-team/remotezip/-/compare/9acba435af71d51e3dbb7dfd1f0b222ce45155f4...9d4c432b4ef2a8fb5b44bdef8cb4f8a930d43daf
--
View it on GitLab: https://salsa.debian.org/debian-gis-team/remotezip/-/compare/9acba435af71d51e3dbb7dfd1f0b222ce45155f4...9d4c432b4ef2a8fb5b44bdef8cb4f8a930d43daf
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260830/7147f4e2/attachment-0001.htm>
More information about the Pkg-grass-devel
mailing list