summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTheron Luhn <theron@luhn.com>2025-06-29 21:37:51 -0700
committerTheron Luhn <theron@luhn.com>2025-06-29 21:37:51 -0700
commitdd6821dca4d123bb0767ad97e1110a063dcb34b9 (patch)
tree16c049d06ad27643fd67bfa20d0cb7bb3e98ca21
parenteb0e01a0fd7aff84c345b1c43bd4fa9d2fe04441 (diff)
downloadpyramid-dd6821dca4d123bb0767ad97e1110a063dcb34b9.tar.gz
pyramid-dd6821dca4d123bb0767ad97e1110a063dcb34b9.tar.bz2
pyramid-dd6821dca4d123bb0767ad97e1110a063dcb34b9.zip
Sketch of new asset resolver.
-rw-r--r--src/pyramid/path.py45
1 files changed, 39 insertions, 6 deletions
diff --git a/src/pyramid/path.py b/src/pyramid/path.py
index 160d97abe..a8e45eec1 100644
--- a/src/pyramid/path.py
+++ b/src/pyramid/path.py
@@ -6,7 +6,7 @@ import pkg_resources
import sys
from zope.interface import implementer
-from pyramid.interfaces import IAssetDescriptor
+from pyramid.interfaces import IAssetDescriptor, IPackageOverrides
init_names = ['__init__%s' % x for x in SOURCE_SUFFIXES]
@@ -171,6 +171,10 @@ class AssetResolver(Resolver):
absolute asset spec would be ``xml.minidom:template.pt``.
"""
+ def __init__(self, package=CALLER_PACKAGE, registry=None):
+ self.registry = registry
+ super().__init__(package=package)
+
def resolve(self, spec):
"""
Resolve the asset spec named as ``spec`` to an object that has the
@@ -213,7 +217,12 @@ class AssetResolver(Resolver):
raise ValueError(
f'relative spec {spec!r} irresolveable without package'
)
- return PkgResourcesAssetDescriptor(package_name, path)
+
+ from pyramid.threadlocal import get_current_registry
+
+ registry = self.registry or get_current_registry()
+ overrides = registry.queryUtility(IPackageOverrides, package_name)
+ return PkgResourcesAssetDescriptor(package_name, path, overrides)
class DottedNameResolver(Resolver):
@@ -402,28 +411,52 @@ class DottedNameResolver(Resolver):
class PkgResourcesAssetDescriptor:
pkg_resources = pkg_resources
- def __init__(self, pkg_name, path):
+ def __init__(self, pkg_name, path, overrides=None):
self.pkg_name = pkg_name
self.path = path
+ self.overrides = overrides
def absspec(self):
return f'{self.pkg_name}:{self.path}'
def abspath(self):
- return os.path.abspath(
- self.pkg_resources.resource_filename(self.pkg_name, self.path)
- )
+ if self.overrides is not None:
+ filename = self.overrides.get_filename(self.path)
+ else:
+ filename = None
+ if filename is None:
+ filename = self.pkg_resources.resource_filename(
+ self.pkg_name,
+ self.path,
+ )
+ return os.path.abspath(filename)
def stream(self):
+ if self.overrides is not None:
+ stream = self.overrides.get_stream(self.path)
+ if stream is not None:
+ return stream
return self.pkg_resources.resource_stream(self.pkg_name, self.path)
def isdir(self):
+ if self.overrides is not None:
+ result = self.overrides.isdir(self.path)
+ if result is not None:
+ return result
return self.pkg_resources.resource_isdir(self.pkg_name, self.path)
def listdir(self):
+ if self.overrides is not None:
+ result = self.overrides.listdir(self.path)
+ if result is not None:
+ return result
return self.pkg_resources.resource_listdir(self.pkg_name, self.path)
def exists(self):
+ if self.overrides is not None:
+ result = self.overrides.exists(self.path)
+ if result is not None:
+ return result
return self.pkg_resources.resource_exists(self.pkg_name, self.path)