Archives: zip:, tar:, archive:
pathlib_next.uri.schemes.archive._base.ArchiveUri(*uris, **options)
Bases: UriPath
Common base for zip:/tar:/archive: archive paths:
<scheme>:<archive-uri>!/<inner-path> (Java-style separator; the
<archive-uri> half is itself any absolute URI with an explicit scheme
-- file:, http:, sftp:, ftp:, ... -- so archives are readable
straight off any existing backend). segments/name/parent/glob/
... all operate on the inner path; the outer archive handle is the
backend (_ZipBackend/_TarBackend), propagated through the normal
backend machinery to every path derived from this one.
Also registered directly as the archive: catch-all scheme (see
__SCHEMES below): zip:/tar: (via ZipUri/TarUri, which just
pin _backend_cls) fix the format; plain archive: auto-detects it
per-instance in _init when _backend_cls is left at its None
sentinel. Write methods below are format-agnostic -- gated on
self.backend.writable, which only _ZipBackend (and only for a
local file: outer) ever reports True -- so a tar-backed instance,
whether reached via tar: or auto-detected via archive:, correctly
raises NotImplementedError on any write attempt rather than
silently misbehaving.
Source code in src/pathlib_next/uri/__init__.py
157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 | |
pathlib_next.uri.schemes.archive.zip.ZipUri(*uris, **options)
Bases: ArchiveUri
zip: scheme. Read/write: write support (new entries, overwriting
existing entries, unlink/rmdir/rename) works when the outer
archive is a local file: URI; every other outer scheme is read-only
(fetched fully into memory first). Every mutation replaces the archive
atomically (temp file + os.replace): a new entry is appended to a
byte copy of the archive (nothing recompressed); overwriting/deleting/
renaming an existing entry rewrites the whole archive
(_ZipBackend._rewrite), since zipfile has no in-place entry
mutation, keeping every other entry's metadata. Write methods (_open write
modes, _mkdir, unlink, rmdir, rename) live on the shared
ArchiveUri base -- they're generic, gated on self.backend.writable,
which only this backend ever reports True.
Source code in src/pathlib_next/uri/__init__.py
157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 | |
pathlib_next.uri.schemes.archive.tar.TarUri(*uris, **options)
Bases: ArchiveUri
tar: scheme (also handles .tar.gz/.tar.bz2/.tar.xz via
tarfile's auto-detected "r:*" mode). Read-only. Members stored with a
./ prefix are addressed without it.
Source code in src/pathlib_next/uri/__init__.py
157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 | |
pathlib_next.uri.schemes.archive.ArchiveZipUri(*uris, **options)
Bases: ZipUri
archive+zip: explicit-format scheme: same as zip:, registered
under a second scheme name so archive+zip: always wins over
archive:'s auto-detection regardless of the outer archive's
extension/content.
Named without a leading underscore on purpose: UriPath._schemes()
looks up __SCHEMES via getattr(cls, f"_{cls.__name__}__SCHEMES"),
which assumes cls.__name__ has no leading underscore of its own --
Python's real name-mangling strips a leading underscore from the class
name before mangling, so a class named e.g. _ArchiveZipUri mangles
__SCHEMES to _ArchiveZipUri__SCHEMES while this lookup instead
computes __ArchiveZipUri__SCHEMES, silently finding nothing (caught
by _schemes()'s bare except AttributeError: return ()) and falling
back to the generic UriPath stub. Every __SCHEMES-registered class
in this codebase must have a name with no leading underscore.
Source code in src/pathlib_next/uri/__init__.py
157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 | |
pathlib_next.uri.schemes.archive.ArchiveTarUri(*uris, **options)
Bases: TarUri
archive+tar: explicit-format scheme: same as tar:, registered
under a second scheme name so archive+tar: always wins over
archive:'s auto-detection. See ArchiveZipUri for why this can't be
named with a leading underscore.
Source code in src/pathlib_next/uri/__init__.py
157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 | |