summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Schadt <kingdread@gmx.de>2025-12-27 10:44:28 +0100
committerDaniel Schadt <kingdread@gmx.de>2025-12-27 10:44:28 +0100
commita836b77a04c898600ac208185d476062646488d3 (patch)
treeef89cff9ea8d4cd99967f95d4664649a007eb99a
parent8b025bad44dcdf4d373b8202780fb1847d83240f (diff)
parent73593a0d318121662de1ec56bfa838a390d45f96 (diff)
downloadpyramid-a836b77a04c898600ac208185d476062646488d3.tar.gz
pyramid-a836b77a04c898600ac208185d476062646488d3.tar.bz2
pyramid-a836b77a04c898600ac208185d476062646488d3.zip
Merge remote-tracking branch 'luhn/override-get-spec'
-rw-r--r--src/pyramid/config/assets.py14
-rw-r--r--src/pyramid/config/views.py10
-rw-r--r--src/pyramid/interfaces.py8
-rw-r--r--tests/test_config/pkgs/cachebust/__init__.py0
-rw-r--r--tests/test_config/pkgs/cachebust/override/foo.pngbin0 -> 72 bytes
-rw-r--r--tests/test_config/pkgs/cachebust/path/foo.pngbin0 -> 72 bytes
-rw-r--r--tests/test_config/test_assets.py61
-rw-r--r--tests/test_config/test_views.py25
8 files changed, 104 insertions, 14 deletions
diff --git a/src/pyramid/config/assets.py b/src/pyramid/config/assets.py
index 6f2ddbe4a..3c6a8d360 100644
--- a/src/pyramid/config/assets.py
+++ b/src/pyramid/config/assets.py
@@ -122,6 +122,12 @@ class PackageOverrides:
if o is not None:
yield o
+ def get_spec(self, resource_name):
+ for source, path in self.filtered_sources(resource_name):
+ result = source.get_spec(path)
+ if result is not None:
+ return result
+
def get_filename(self, resource_name):
for source, path in self.filtered_sources(resource_name):
result = source.get_filename(path)
@@ -223,6 +229,11 @@ class PackageAssetSource:
def get_path(self, resource_name):
return f'{self.prefix}{resource_name}'
+ def get_spec(self, resource_name):
+ path = self.get_path(resource_name)
+ if pkg_resources.resource_exists(self.pkg_name, path):
+ return f'{self.pkg_name}:{path}'
+
def get_filename(self, resource_name):
path = self.get_path(resource_name)
if pkg_resources.resource_exists(self.pkg_name, path):
@@ -270,6 +281,9 @@ class FSAssetSource:
path = self.prefix
return path
+ def get_spec(self, resource_name):
+ return self.get_filename(resource_name)
+
def get_filename(self, resource_name):
path = self.get_path(resource_name)
if os.path.exists(path):
diff --git a/src/pyramid/config/views.py b/src/pyramid/config/views.py
index fababf542..302704c3e 100644
--- a/src/pyramid/config/views.py
+++ b/src/pyramid/config/views.py
@@ -2338,14 +2338,7 @@ class StaticURLInfo:
pathspec = f'{pkg_name}:{pkg_subpath}{subpath}'
overrides = registry.queryUtility(IPackageOverrides, name=pkg_name)
if overrides is not None:
- resource_name = posixpath.join(pkg_subpath, subpath)
- sources = overrides.filtered_sources(resource_name)
- for source, filtered_path in sources:
- rawspec = source.get_path(filtered_path)
- if hasattr(source, 'pkg_name'):
- rawspec = f'{source.pkg_name}:{rawspec}'
- break
-
+ rawspec = overrides.get_spec(f'{pkg_subpath}{subpath}')
else:
pathspec = pkg_subpath + subpath
@@ -2354,6 +2347,7 @@ class StaticURLInfo:
kw['pathspec'] = pathspec
kw['rawspec'] = rawspec
+ print(kw)
for spec_, cachebust, explicit in reversed(self.cache_busters):
if (explicit and rawspec.startswith(spec_)) or (
not explicit and pathspec.startswith(spec_)
diff --git a/src/pyramid/interfaces.py b/src/pyramid/interfaces.py
index 4ee294189..063b0385e 100644
--- a/src/pyramid/interfaces.py
+++ b/src/pyramid/interfaces.py
@@ -1079,6 +1079,14 @@ class IPEP302Loader(Interface):
class IPackageOverrides(IPEP302Loader):
"""Utility for pkg_resources overrides"""
+ def get_spec(resource_name):
+ """Return a specifier for the resource.
+
+ The specifier may be a dotted Python name or an absolute path on the
+ filesystem.
+
+ """
+
# VH_ROOT_KEY is an interface; its imported from other packages (e.g.
# traversalwrapper)
diff --git a/tests/test_config/pkgs/cachebust/__init__.py b/tests/test_config/pkgs/cachebust/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/test_config/pkgs/cachebust/__init__.py
diff --git a/tests/test_config/pkgs/cachebust/override/foo.png b/tests/test_config/pkgs/cachebust/override/foo.png
new file mode 100644
index 000000000..1cc2f763c
--- /dev/null
+++ b/tests/test_config/pkgs/cachebust/override/foo.png
Binary files differ
diff --git a/tests/test_config/pkgs/cachebust/path/foo.png b/tests/test_config/pkgs/cachebust/path/foo.png
new file mode 100644
index 000000000..43440f881
--- /dev/null
+++ b/tests/test_config/pkgs/cachebust/path/foo.png
Binary files differ
diff --git a/tests/test_config/test_assets.py b/tests/test_config/test_assets.py
index 1d2cfcd5c..ea2fff741 100644
--- a/tests/test_config/test_assets.py
+++ b/tests/test_config/test_assets.py
@@ -638,6 +638,28 @@ class TestPackageOverrides(unittest.TestCase):
po.overrides = overrides
self.assertEqual(list(po.filtered_sources('whatever')), ['foo'])
+ def test_get_spec(self):
+ source = DummyAssetSource(spec='test:foo.pt')
+ overrides = [DummyOverride(None), DummyOverride((source, ''))]
+ package = DummyPackage('package')
+ po = self._makeOne(package)
+ po.overrides = overrides
+ result = po.get_spec('whatever')
+ self.assertEqual(result, 'test:foo.pt')
+ self.assertEqual(source.resource_name, '')
+
+ def test_get_spec_file_doesnt_exist(self):
+ source = DummyAssetSource(spec=None)
+ overrides = [
+ DummyOverride(None),
+ DummyOverride((source, 'wont_exist')),
+ ]
+ package = DummyPackage('package')
+ po = self._makeOne(package)
+ po.overrides = overrides
+ self.assertEqual(po.get_spec('whatever'), None)
+ self.assertEqual(source.resource_name, 'wont_exist')
+
def test_get_filename(self):
source = DummyAssetSource(filename='foo.pt')
overrides = [DummyOverride(None), DummyOverride((source, ''))]
@@ -916,6 +938,24 @@ class TestPackageAssetSource(AssetSourceIntegrationTests, unittest.TestCase):
klass = self._getTargetClass()
return klass(package, prefix)
+ def test_get_spec(self):
+ source = self._makeOne('')
+ self.assertEqual(
+ source.get_spec('test_assets.py'),
+ 'tests.test_config:test_assets.py',
+ )
+
+ def test_get_spec_with_prefix(self):
+ source = self._makeOne('test_assets.py')
+ self.assertEqual(
+ source.get_spec(''),
+ 'tests.test_config:test_assets.py',
+ )
+
+ def test_get_spec_file_doesnt_exist(self):
+ source = self._makeOne('')
+ self.assertIsNone(source.get_spec('wont_exist'))
+
class TestFSAssetSource(AssetSourceIntegrationTests, unittest.TestCase):
def _getTargetClass(self):
@@ -927,6 +967,23 @@ class TestFSAssetSource(AssetSourceIntegrationTests, unittest.TestCase):
klass = self._getTargetClass()
return klass(os.path.join(base_prefix, prefix))
+ def test_get_spec(self):
+ source = self._makeOne('')
+ self.assertEqual(
+ source.get_spec('test_assets.py'),
+ os.path.join(here, 'test_assets.py'),
+ )
+
+ def test_get_spec_with_prefix(self):
+ source = self._makeOne('test_assets.py')
+ self.assertEqual(
+ source.get_spec(''), os.path.join(here, 'test_assets.py')
+ )
+
+ def test_get_spec_file_doesnt_exist(self):
+ source = self._makeOne('')
+ self.assertEqual(source.get_spec('wont_exist'), None)
+
class TestDirectoryOverride(unittest.TestCase):
def _getTargetClass(self):
@@ -1018,6 +1075,10 @@ class DummyAssetSource:
def __init__(self, **kw):
self.kw = kw
+ def get_spec(self, resource_name):
+ self.resource_name = resource_name
+ return self.kw['spec']
+
def get_filename(self, resource_name):
self.resource_name = resource_name
return self.kw['filename']
diff --git a/tests/test_config/test_views.py b/tests/test_config/test_views.py
index 2018e61f2..ce7038b5d 100644
--- a/tests/test_config/test_views.py
+++ b/tests/test_config/test_views.py
@@ -4065,9 +4065,12 @@ class TestStaticURLInfo(unittest.TestCase):
config = testing.setUp()
try:
request = testing.DummyRequest()
- config.add_static_view('static', 'path')
+ config.add_static_view(
+ 'static', 'tests.test_config.pkgs.cachebust:path/'
+ )
config.override_asset(
- 'tests.test_config:path/', 'tests.test_config:other_path/'
+ 'tests.test_config.pkgs.cachebust:path/',
+ 'tests.test_config.pkgs.cachebust:override/',
)
def cb(val):
@@ -4077,11 +4080,21 @@ class TestStaticURLInfo(unittest.TestCase):
return cb_
- config.add_cache_buster('path', cb('foo'))
- result = request.static_url('path/foo.png')
+ config.add_cache_buster(
+ 'tests.test_config.pkgs.cachebust:path/', cb('foo')
+ )
+ result = request.static_url(
+ 'tests.test_config.pkgs.cachebust:path/foo.png'
+ )
self.assertEqual(result, 'http://example.com/static/foo.png?x=foo')
- config.add_cache_buster('other_path', cb('bar'), explicit=True)
- result = request.static_url('path/foo.png')
+ config.add_cache_buster(
+ 'tests.test_config.pkgs.cachebust:override/',
+ cb('bar'),
+ explicit=True,
+ )
+ result = request.static_url(
+ 'tests.test_config.pkgs.cachebust:path/foo.png'
+ )
self.assertEqual(result, 'http://example.com/static/foo.png?x=bar')
finally:
testing.tearDown()