Michael Merickel
2018-10-15 0c29cf2df41600d3906d521c72991c7686018b71
commit | author | age
407b33 1 import os.path
6da017 2 import unittest
CM 3 from pyramid.testing import cleanUp
407b33 4
MM 5 # we use this folder
6 here = os.path.dirname(os.path.abspath(__file__))
6da017 7
0c29cf 8
9ee830 9 class TestAssetsConfiguratorMixin(unittest.TestCase):
CM 10     def _makeOne(self, *arg, **kw):
11         from pyramid.config import Configurator
0c29cf 12
9ee830 13         config = Configurator(*arg, **kw)
CM 14         return config
15
16     def test_override_asset_samename(self):
17         from pyramid.exceptions import ConfigurationError
0c29cf 18
9ee830 19         config = self._makeOne()
407b33 20         self.assertRaises(ConfigurationError, config.override_asset, 'a', 'a')
9ee830 21
CM 22     def test_override_asset_directory_with_file(self):
23         from pyramid.exceptions import ConfigurationError
0c29cf 24
9ee830 25         config = self._makeOne()
0c29cf 26         self.assertRaises(
MM 27             ConfigurationError,
28             config.override_asset,
29             'a:foo/',
30             'tests.test_config.pkgs.asset:foo.pt',
31         )
9ee830 32
CM 33     def test_override_asset_file_with_directory(self):
34         from pyramid.exceptions import ConfigurationError
0c29cf 35
9ee830 36         config = self._makeOne()
0c29cf 37         self.assertRaises(
MM 38             ConfigurationError,
39             config.override_asset,
40             'a:foo.pt',
41             'tests.test_config.pkgs.asset:templates/',
42         )
9ee830 43
CM 44     def test_override_asset_file_with_package(self):
45         from pyramid.exceptions import ConfigurationError
0c29cf 46
9ee830 47         config = self._makeOne()
0c29cf 48         self.assertRaises(
MM 49             ConfigurationError,
50             config.override_asset,
51             'a:foo.pt',
52             'tests.test_config.pkgs.asset',
53         )
9ee830 54
CM 55     def test_override_asset_file_with_file(self):
407b33 56         from pyramid.config.assets import PackageAssetSource
0c29cf 57
9ee830 58         config = self._makeOne(autocommit=True)
CM 59         override = DummyUnderOverride()
60         config.override_asset(
dd3cc8 61             'tests.test_config.pkgs.asset:templates/foo.pt',
MM 62             'tests.test_config.pkgs.asset.subpackage:templates/bar.pt',
0c29cf 63             _override=override,
MM 64         )
dd3cc8 65         from tests.test_config.pkgs import asset
MM 66         from tests.test_config.pkgs.asset import subpackage
0c29cf 67
9ee830 68         self.assertEqual(override.package, asset)
CM 69         self.assertEqual(override.path, 'templates/foo.pt')
407b33 70         source = override.source
MM 71         self.assertTrue(isinstance(source, PackageAssetSource))
72         self.assertEqual(source.package, subpackage)
73         self.assertEqual(source.prefix, 'templates/bar.pt')
9ee830 74
5ace65 75         resource_name = ''
0c29cf 76         expected = os.path.join(
MM 77             here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'
78         )
79         self.assertEqual(override.source.get_filename(resource_name), expected)
5ace65 80
9ee830 81     def test_override_asset_package_with_package(self):
407b33 82         from pyramid.config.assets import PackageAssetSource
0c29cf 83
9ee830 84         config = self._makeOne(autocommit=True)
CM 85         override = DummyUnderOverride()
86         config.override_asset(
dd3cc8 87             'tests.test_config.pkgs.asset',
MM 88             'tests.test_config.pkgs.asset.subpackage',
0c29cf 89             _override=override,
MM 90         )
dd3cc8 91         from tests.test_config.pkgs import asset
MM 92         from tests.test_config.pkgs.asset import subpackage
0c29cf 93
9ee830 94         self.assertEqual(override.package, asset)
CM 95         self.assertEqual(override.path, '')
407b33 96         source = override.source
MM 97         self.assertTrue(isinstance(source, PackageAssetSource))
98         self.assertEqual(source.package, subpackage)
99         self.assertEqual(source.prefix, '')
5ace65 100
MA 101         resource_name = 'templates/bar.pt'
0c29cf 102         expected = os.path.join(
MM 103             here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'
104         )
105         self.assertEqual(override.source.get_filename(resource_name), expected)
9ee830 106
CM 107     def test_override_asset_directory_with_directory(self):
407b33 108         from pyramid.config.assets import PackageAssetSource
0c29cf 109
9ee830 110         config = self._makeOne(autocommit=True)
CM 111         override = DummyUnderOverride()
112         config.override_asset(
dd3cc8 113             'tests.test_config.pkgs.asset:templates/',
MM 114             'tests.test_config.pkgs.asset.subpackage:templates/',
0c29cf 115             _override=override,
MM 116         )
dd3cc8 117         from tests.test_config.pkgs import asset
MM 118         from tests.test_config.pkgs.asset import subpackage
0c29cf 119
9ee830 120         self.assertEqual(override.package, asset)
CM 121         self.assertEqual(override.path, 'templates/')
407b33 122         source = override.source
MM 123         self.assertTrue(isinstance(source, PackageAssetSource))
124         self.assertEqual(source.package, subpackage)
125         self.assertEqual(source.prefix, 'templates/')
9ee830 126
5ace65 127         resource_name = 'bar.pt'
0c29cf 128         expected = os.path.join(
MM 129             here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'
130         )
131         self.assertEqual(override.source.get_filename(resource_name), expected)
5ace65 132
9ee830 133     def test_override_asset_directory_with_package(self):
407b33 134         from pyramid.config.assets import PackageAssetSource
0c29cf 135
9ee830 136         config = self._makeOne(autocommit=True)
CM 137         override = DummyUnderOverride()
138         config.override_asset(
dd3cc8 139             'tests.test_config.pkgs.asset:templates/',
MM 140             'tests.test_config.pkgs.asset.subpackage',
0c29cf 141             _override=override,
MM 142         )
dd3cc8 143         from tests.test_config.pkgs import asset
MM 144         from tests.test_config.pkgs.asset import subpackage
0c29cf 145
9ee830 146         self.assertEqual(override.package, asset)
CM 147         self.assertEqual(override.path, 'templates/')
407b33 148         source = override.source
MM 149         self.assertTrue(isinstance(source, PackageAssetSource))
150         self.assertEqual(source.package, subpackage)
151         self.assertEqual(source.prefix, '')
9ee830 152
5ace65 153         resource_name = 'templates/bar.pt'
0c29cf 154         expected = os.path.join(
MM 155             here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'
156         )
157         self.assertEqual(override.source.get_filename(resource_name), expected)
5ace65 158
9ee830 159     def test_override_asset_package_with_directory(self):
407b33 160         from pyramid.config.assets import PackageAssetSource
0c29cf 161
9ee830 162         config = self._makeOne(autocommit=True)
CM 163         override = DummyUnderOverride()
164         config.override_asset(
dd3cc8 165             'tests.test_config.pkgs.asset',
MM 166             'tests.test_config.pkgs.asset.subpackage:templates/',
0c29cf 167             _override=override,
MM 168         )
dd3cc8 169         from tests.test_config.pkgs import asset
MM 170         from tests.test_config.pkgs.asset import subpackage
0c29cf 171
9ee830 172         self.assertEqual(override.package, asset)
CM 173         self.assertEqual(override.path, '')
407b33 174         source = override.source
MM 175         self.assertTrue(isinstance(source, PackageAssetSource))
176         self.assertEqual(source.package, subpackage)
177         self.assertEqual(source.prefix, 'templates/')
5ace65 178
MA 179         resource_name = 'bar.pt'
0c29cf 180         expected = os.path.join(
MM 181             here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'
182         )
183         self.assertEqual(override.source.get_filename(resource_name), expected)
407b33 184
MM 185     def test_override_asset_directory_with_absfile(self):
186         from pyramid.exceptions import ConfigurationError
0c29cf 187
407b33 188         config = self._makeOne()
0c29cf 189         self.assertRaises(
MM 190             ConfigurationError,
191             config.override_asset,
192             'a:foo/',
193             os.path.join(here, 'pkgs', 'asset', 'foo.pt'),
194         )
407b33 195
MM 196     def test_override_asset_file_with_absdirectory(self):
197         from pyramid.exceptions import ConfigurationError
0c29cf 198
407b33 199         config = self._makeOne()
0c29cf 200         abspath = os.path.join(
MM 201             here, 'pkgs', 'asset', 'subpackage', 'templates'
202         )
203         self.assertRaises(
204             ConfigurationError, config.override_asset, 'a:foo.pt', abspath
205         )
407b33 206
MM 207     def test_override_asset_file_with_missing_abspath(self):
208         from pyramid.exceptions import ConfigurationError
0c29cf 209
407b33 210         config = self._makeOne()
0c29cf 211         self.assertRaises(
MM 212             ConfigurationError,
213             config.override_asset,
214             'a:foo.pt',
215             os.path.join(here, 'wont_exist'),
216         )
407b33 217
MM 218     def test_override_asset_file_with_absfile(self):
219         from pyramid.config.assets import FSAssetSource
0c29cf 220
407b33 221         config = self._makeOne(autocommit=True)
MM 222         override = DummyUnderOverride()
0c29cf 223         abspath = os.path.join(
MM 224             here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'
225         )
407b33 226         config.override_asset(
dd3cc8 227             'tests.test_config.pkgs.asset:templates/foo.pt',
407b33 228             abspath,
0c29cf 229             _override=override,
MM 230         )
dd3cc8 231         from tests.test_config.pkgs import asset
0c29cf 232
407b33 233         self.assertEqual(override.package, asset)
MM 234         self.assertEqual(override.path, 'templates/foo.pt')
235         source = override.source
236         self.assertTrue(isinstance(source, FSAssetSource))
237         self.assertEqual(source.prefix, abspath)
238
5ace65 239         resource_name = ''
0c29cf 240         expected = os.path.join(
MM 241             here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'
242         )
243         self.assertEqual(override.source.get_filename(resource_name), expected)
5ace65 244
407b33 245     def test_override_asset_directory_with_absdirectory(self):
MM 246         from pyramid.config.assets import FSAssetSource
0c29cf 247
407b33 248         config = self._makeOne(autocommit=True)
MM 249         override = DummyUnderOverride()
0c29cf 250         abspath = os.path.join(
MM 251             here, 'pkgs', 'asset', 'subpackage', 'templates'
252         )
407b33 253         config.override_asset(
dd3cc8 254             'tests.test_config.pkgs.asset:templates/',
407b33 255             abspath,
0c29cf 256             _override=override,
MM 257         )
dd3cc8 258         from tests.test_config.pkgs import asset
0c29cf 259
407b33 260         self.assertEqual(override.package, asset)
MM 261         self.assertEqual(override.path, 'templates/')
262         source = override.source
263         self.assertTrue(isinstance(source, FSAssetSource))
264         self.assertEqual(source.prefix, abspath)
265
5ace65 266         resource_name = 'bar.pt'
0c29cf 267         expected = os.path.join(
MM 268             here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'
269         )
270         self.assertEqual(override.source.get_filename(resource_name), expected)
5ace65 271
407b33 272     def test_override_asset_package_with_absdirectory(self):
MM 273         from pyramid.config.assets import FSAssetSource
0c29cf 274
407b33 275         config = self._makeOne(autocommit=True)
MM 276         override = DummyUnderOverride()
0c29cf 277         abspath = os.path.join(
MM 278             here, 'pkgs', 'asset', 'subpackage', 'templates'
279         )
407b33 280         config.override_asset(
0c29cf 281             'tests.test_config.pkgs.asset', abspath, _override=override
MM 282         )
dd3cc8 283         from tests.test_config.pkgs import asset
0c29cf 284
407b33 285         self.assertEqual(override.package, asset)
MM 286         self.assertEqual(override.path, '')
287         source = override.source
288         self.assertTrue(isinstance(source, FSAssetSource))
289         self.assertEqual(source.prefix, abspath)
9ee830 290
5ace65 291         resource_name = 'bar.pt'
0c29cf 292         expected = os.path.join(
MM 293             here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'
294         )
295         self.assertEqual(override.source.get_filename(resource_name), expected)
5ace65 296
2deac8 297     def test__override_not_yet_registered(self):
CM 298         from pyramid.interfaces import IPackageOverrides
0c29cf 299
2deac8 300         package = DummyPackage('package')
407b33 301         source = DummyAssetSource()
2deac8 302         config = self._makeOne()
0c29cf 303         config._override(
MM 304             package, 'path', source, PackageOverrides=DummyPackageOverrides
305         )
306         overrides = config.registry.queryUtility(
307             IPackageOverrides, name='package'
308         )
407b33 309         self.assertEqual(overrides.inserted, [('path', source)])
2deac8 310         self.assertEqual(overrides.package, package)
CM 311
312     def test__override_already_registered(self):
313         from pyramid.interfaces import IPackageOverrides
0c29cf 314
2deac8 315         package = DummyPackage('package')
407b33 316         source = DummyAssetSource()
2deac8 317         overrides = DummyPackageOverrides(package)
CM 318         config = self._makeOne()
0c29cf 319         config.registry.registerUtility(
MM 320             overrides, IPackageOverrides, name='package'
321         )
322         config._override(
323             package, 'path', source, PackageOverrides=DummyPackageOverrides
324         )
407b33 325         self.assertEqual(overrides.inserted, [('path', source)])
2deac8 326         self.assertEqual(overrides.package, package)
CM 327
328
6da017 329 class TestOverrideProvider(unittest.TestCase):
CM 330     def setUp(self):
331         cleanUp()
332
333     def tearDown(self):
334         cleanUp()
335
336     def _getTargetClass(self):
337         from pyramid.config.assets import OverrideProvider
0c29cf 338
6da017 339         return OverrideProvider
CM 340
341     def _makeOne(self, module):
342         klass = self._getTargetClass()
343         return klass(module)
344
dd3cc8 345     def _registerOverrides(self, overrides, name='tests.test_config'):
6da017 346         from pyramid.interfaces import IPackageOverrides
CM 347         from pyramid.threadlocal import get_current_registry
0c29cf 348
6da017 349         reg = get_current_registry()
CM 350         reg.registerUtility(overrides, IPackageOverrides, name=name)
351
352     def test_get_resource_filename_no_overrides(self):
353         resource_name = 'test_assets.py'
dd3cc8 354         import tests.test_config
0c29cf 355
dd3cc8 356         provider = self._makeOne(tests.test_config)
6da017 357         expected = os.path.join(here, resource_name)
CM 358         result = provider.get_resource_filename(None, resource_name)
359         self.assertEqual(result, expected)
360
361     def test_get_resource_stream_no_overrides(self):
362         resource_name = 'test_assets.py'
dd3cc8 363         import tests.test_config
0c29cf 364
dd3cc8 365         provider = self._makeOne(tests.test_config)
a83e10 366         with provider.get_resource_stream(None, resource_name) as result:
e6d802 367             _assertBody(result.read(), os.path.join(here, resource_name))
6da017 368
CM 369     def test_get_resource_string_no_overrides(self):
370         resource_name = 'test_assets.py'
dd3cc8 371         import tests.test_config
0c29cf 372
dd3cc8 373         provider = self._makeOne(tests.test_config)
6da017 374         result = provider.get_resource_string(None, resource_name)
e6d802 375         _assertBody(result, os.path.join(here, resource_name))
6da017 376
CM 377     def test_has_resource_no_overrides(self):
378         resource_name = 'test_assets.py'
dd3cc8 379         import tests.test_config
0c29cf 380
dd3cc8 381         provider = self._makeOne(tests.test_config)
6da017 382         result = provider.has_resource(resource_name)
CM 383         self.assertEqual(result, True)
384
385     def test_resource_isdir_no_overrides(self):
386         file_resource_name = 'test_assets.py'
1aeae3 387         directory_resource_name = 'files'
dd3cc8 388         import tests.test_config
0c29cf 389
dd3cc8 390         provider = self._makeOne(tests.test_config)
6da017 391         result = provider.resource_isdir(file_resource_name)
CM 392         self.assertEqual(result, False)
393         result = provider.resource_isdir(directory_resource_name)
394         self.assertEqual(result, True)
395
396     def test_resource_listdir_no_overrides(self):
1aeae3 397         resource_name = 'files'
dd3cc8 398         import tests.test_config
0c29cf 399
dd3cc8 400         provider = self._makeOne(tests.test_config)
6da017 401         result = provider.resource_listdir(resource_name)
CM 402         self.assertTrue(result)
403
404     def test_get_resource_filename_override_returns_None(self):
405         overrides = DummyOverrides(None)
406         self._registerOverrides(overrides)
407         resource_name = 'test_assets.py'
dd3cc8 408         import tests.test_config
0c29cf 409
dd3cc8 410         provider = self._makeOne(tests.test_config)
6da017 411         expected = os.path.join(here, resource_name)
CM 412         result = provider.get_resource_filename(None, resource_name)
413         self.assertEqual(result, expected)
0c29cf 414
6da017 415     def test_get_resource_stream_override_returns_None(self):
CM 416         overrides = DummyOverrides(None)
417         self._registerOverrides(overrides)
418         resource_name = 'test_assets.py'
dd3cc8 419         import tests.test_config
0c29cf 420
dd3cc8 421         provider = self._makeOne(tests.test_config)
a83e10 422         with provider.get_resource_stream(None, resource_name) as result:
e6d802 423             _assertBody(result.read(), os.path.join(here, resource_name))
6da017 424
CM 425     def test_get_resource_string_override_returns_None(self):
426         overrides = DummyOverrides(None)
427         self._registerOverrides(overrides)
428         resource_name = 'test_assets.py'
dd3cc8 429         import tests.test_config
0c29cf 430
dd3cc8 431         provider = self._makeOne(tests.test_config)
6da017 432         result = provider.get_resource_string(None, resource_name)
956b99 433         _assertBody(result, os.path.join(here, resource_name))
6da017 434
CM 435     def test_has_resource_override_returns_None(self):
436         overrides = DummyOverrides(None)
437         self._registerOverrides(overrides)
438         resource_name = 'test_assets.py'
dd3cc8 439         import tests.test_config
0c29cf 440
dd3cc8 441         provider = self._makeOne(tests.test_config)
6da017 442         result = provider.has_resource(resource_name)
CM 443         self.assertEqual(result, True)
444
445     def test_resource_isdir_override_returns_None(self):
446         overrides = DummyOverrides(None)
447         self._registerOverrides(overrides)
1aeae3 448         resource_name = 'files'
dd3cc8 449         import tests.test_config
0c29cf 450
dd3cc8 451         provider = self._makeOne(tests.test_config)
6da017 452         result = provider.resource_isdir(resource_name)
CM 453         self.assertEqual(result, True)
454
455     def test_resource_listdir_override_returns_None(self):
456         overrides = DummyOverrides(None)
457         self._registerOverrides(overrides)
1aeae3 458         resource_name = 'files'
dd3cc8 459         import tests.test_config
0c29cf 460
dd3cc8 461         provider = self._makeOne(tests.test_config)
6da017 462         result = provider.resource_listdir(resource_name)
CM 463         self.assertTrue(result)
464
465     def test_get_resource_filename_override_returns_value(self):
466         overrides = DummyOverrides('value')
dd3cc8 467         import tests.test_config
0c29cf 468
6da017 469         self._registerOverrides(overrides)
dd3cc8 470         provider = self._makeOne(tests.test_config)
6da017 471         result = provider.get_resource_filename(None, 'test_assets.py')
CM 472         self.assertEqual(result, 'value')
473
474     def test_get_resource_stream_override_returns_value(self):
9d7eea 475         from io import BytesIO
0c29cf 476
9d7eea 477         overrides = DummyOverrides(BytesIO(b'value'))
dd3cc8 478         import tests.test_config
0c29cf 479
6da017 480         self._registerOverrides(overrides)
dd3cc8 481         provider = self._makeOne(tests.test_config)
2029b2 482         with provider.get_resource_stream(None, 'test_assets.py') as stream:
9d7eea 483             self.assertEqual(stream.getvalue(), b'value')
6da017 484
CM 485     def test_get_resource_string_override_returns_value(self):
486         overrides = DummyOverrides('value')
dd3cc8 487         import tests.test_config
0c29cf 488
6da017 489         self._registerOverrides(overrides)
dd3cc8 490         provider = self._makeOne(tests.test_config)
6da017 491         result = provider.get_resource_string(None, 'test_assets.py')
CM 492         self.assertEqual(result, 'value')
493
494     def test_has_resource_override_returns_True(self):
495         overrides = DummyOverrides(True)
dd3cc8 496         import tests.test_config
0c29cf 497
6da017 498         self._registerOverrides(overrides)
dd3cc8 499         provider = self._makeOne(tests.test_config)
6da017 500         result = provider.has_resource('test_assets.py')
CM 501         self.assertEqual(result, True)
502
503     def test_resource_isdir_override_returns_False(self):
504         overrides = DummyOverrides(False)
dd3cc8 505         import tests.test_config
0c29cf 506
6da017 507         self._registerOverrides(overrides)
dd3cc8 508         provider = self._makeOne(tests.test_config)
1aeae3 509         result = provider.resource_isdir('files')
6da017 510         self.assertEqual(result, False)
CM 511
512     def test_resource_listdir_override_returns_values(self):
513         overrides = DummyOverrides(['a'])
dd3cc8 514         import tests.test_config
0c29cf 515
6da017 516         self._registerOverrides(overrides)
dd3cc8 517         provider = self._makeOne(tests.test_config)
1aeae3 518         result = provider.resource_listdir('files')
6da017 519         self.assertEqual(result, ['a'])
CM 520
0c29cf 521
6da017 522 class TestPackageOverrides(unittest.TestCase):
CM 523     def _getTargetClass(self):
524         from pyramid.config.assets import PackageOverrides
0c29cf 525
6da017 526         return PackageOverrides
CM 527
bea48e 528     def _makeOne(self, package=None, pkg_resources=None):
TS 529         if package is None:
530             package = DummyPackage('package')
6da017 531         klass = self._getTargetClass()
CM 532         if pkg_resources is None:
533             pkg_resources = DummyPkgResources()
534         return klass(package, pkg_resources=pkg_resources)
535
bea48e 536     def test_class_conforms_to_IPackageOverrides(self):
TS 537         from zope.interface.verify import verifyClass
538         from pyramid.interfaces import IPackageOverrides
0c29cf 539
bea48e 540         verifyClass(IPackageOverrides, self._getTargetClass())
TS 541
542     def test_instance_conforms_to_IPackageOverrides(self):
543         from zope.interface.verify import verifyObject
544         from pyramid.interfaces import IPackageOverrides
0c29cf 545
bea48e 546         verifyObject(IPackageOverrides, self._makeOne())
TS 547
548     def test_class_conforms_to_IPEP302Loader(self):
549         from zope.interface.verify import verifyClass
550         from pyramid.interfaces import IPEP302Loader
0c29cf 551
bea48e 552         verifyClass(IPEP302Loader, self._getTargetClass())
TS 553
554     def test_instance_conforms_to_IPEP302Loader(self):
555         from zope.interface.verify import verifyObject
556         from pyramid.interfaces import IPEP302Loader
0c29cf 557
bea48e 558         verifyObject(IPEP302Loader, self._makeOne())
TS 559
6da017 560     def test_ctor_package_already_has_loader_of_different_type(self):
CM 561         package = DummyPackage('package')
bea48e 562         loader = package.__loader__ = DummyLoader()
TS 563         po = self._makeOne(package)
564         self.assertTrue(package.__loader__ is po)
565         self.assertTrue(po.real_loader is loader)
6da017 566
CM 567     def test_ctor_package_already_has_loader_of_same_type(self):
568         package = DummyPackage('package')
569         package.__loader__ = self._makeOne(package)
570         po = self._makeOne(package)
571         self.assertEqual(package.__loader__, po)
572
573     def test_ctor_sets_loader(self):
574         package = DummyPackage('package')
575         po = self._makeOne(package)
576         self.assertEqual(package.__loader__, po)
577
578     def test_ctor_registers_loader_type(self):
579         from pyramid.config.assets import OverrideProvider
0c29cf 580
6da017 581         dummy_pkg_resources = DummyPkgResources()
CM 582         package = DummyPackage('package')
583         po = self._makeOne(package, dummy_pkg_resources)
0c29cf 584         self.assertEqual(
MM 585             dummy_pkg_resources.registered, [(po.__class__, OverrideProvider)]
586         )
6da017 587
CM 588     def test_ctor_sets_local_state(self):
589         package = DummyPackage('package')
590         po = self._makeOne(package)
591         self.assertEqual(po.overrides, [])
592         self.assertEqual(po.overridden_package_name, 'package')
593
594     def test_insert_directory(self):
595         from pyramid.config.assets import DirectoryOverride
0c29cf 596
6da017 597         package = DummyPackage('package')
CM 598         po = self._makeOne(package)
407b33 599         po.overrides = [None]
MM 600         po.insert('foo/', DummyAssetSource())
6da017 601         self.assertEqual(len(po.overrides), 2)
CM 602         override = po.overrides[0]
603         self.assertEqual(override.__class__, DirectoryOverride)
604
605     def test_insert_file(self):
606         from pyramid.config.assets import FileOverride
0c29cf 607
6da017 608         package = DummyPackage('package')
CM 609         po = self._makeOne(package)
407b33 610         po.overrides = [None]
MM 611         po.insert('foo.pt', DummyAssetSource())
6da017 612         self.assertEqual(len(po.overrides), 2)
CM 613         override = po.overrides[0]
614         self.assertEqual(override.__class__, FileOverride)
615
616     def test_insert_emptystring(self):
617         # XXX is this a valid case for a directory?
618         from pyramid.config.assets import DirectoryOverride
0c29cf 619
6da017 620         package = DummyPackage('package')
CM 621         po = self._makeOne(package)
407b33 622         po.overrides = [None]
MM 623         source = DummyAssetSource()
624         po.insert('', source)
6da017 625         self.assertEqual(len(po.overrides), 2)
CM 626         override = po.overrides[0]
627         self.assertEqual(override.__class__, DirectoryOverride)
628
407b33 629     def test_filtered_sources(self):
0c29cf 630         overrides = [DummyOverride(None), DummyOverride('foo')]
6da017 631         package = DummyPackage('package')
CM 632         po = self._makeOne(package)
407b33 633         po.overrides = overrides
MM 634         self.assertEqual(list(po.filtered_sources('whatever')), ['foo'])
6da017 635
CM 636     def test_get_filename(self):
407b33 637         source = DummyAssetSource(filename='foo.pt')
0c29cf 638         overrides = [DummyOverride(None), DummyOverride((source, ''))]
6da017 639         package = DummyPackage('package')
CM 640         po = self._makeOne(package)
407b33 641         po.overrides = overrides
MM 642         result = po.get_filename('whatever')
643         self.assertEqual(result, 'foo.pt')
644         self.assertEqual(source.resource_name, '')
6da017 645
CM 646     def test_get_filename_file_doesnt_exist(self):
407b33 647         source = DummyAssetSource(filename=None)
0c29cf 648         overrides = [
MM 649             DummyOverride(None),
650             DummyOverride((source, 'wont_exist')),
651         ]
6da017 652         package = DummyPackage('package')
CM 653         po = self._makeOne(package)
407b33 654         po.overrides = overrides
6da017 655         self.assertEqual(po.get_filename('whatever'), None)
407b33 656         self.assertEqual(source.resource_name, 'wont_exist')
MM 657
d3a27e 658     def test_get_stream(self):
407b33 659         source = DummyAssetSource(stream='a stream?')
MM 660         overrides = [DummyOverride(None), DummyOverride((source, 'foo.pt'))]
d3a27e 661         package = DummyPackage('package')
CM 662         po = self._makeOne(package)
407b33 663         po.overrides = overrides
MM 664         self.assertEqual(po.get_stream('whatever'), 'a stream?')
665         self.assertEqual(source.resource_name, 'foo.pt')
0c29cf 666
6da017 667     def test_get_stream_file_doesnt_exist(self):
407b33 668         source = DummyAssetSource(stream=None)
0c29cf 669         overrides = [
MM 670             DummyOverride(None),
671             DummyOverride((source, 'wont_exist')),
672         ]
6da017 673         package = DummyPackage('package')
CM 674         po = self._makeOne(package)
407b33 675         po.overrides = overrides
6da017 676         self.assertEqual(po.get_stream('whatever'), None)
407b33 677         self.assertEqual(source.resource_name, 'wont_exist')
6da017 678
CM 679     def test_get_string(self):
407b33 680         source = DummyAssetSource(string='a string')
MM 681         overrides = [DummyOverride(None), DummyOverride((source, 'foo.pt'))]
6da017 682         package = DummyPackage('package')
CM 683         po = self._makeOne(package)
407b33 684         po.overrides = overrides
MM 685         self.assertEqual(po.get_string('whatever'), 'a string')
686         self.assertEqual(source.resource_name, 'foo.pt')
0c29cf 687
6da017 688     def test_get_string_file_doesnt_exist(self):
407b33 689         source = DummyAssetSource(string=None)
0c29cf 690         overrides = [
MM 691             DummyOverride(None),
692             DummyOverride((source, 'wont_exist')),
693         ]
6da017 694         package = DummyPackage('package')
CM 695         po = self._makeOne(package)
407b33 696         po.overrides = overrides
6da017 697         self.assertEqual(po.get_string('whatever'), None)
407b33 698         self.assertEqual(source.resource_name, 'wont_exist')
6da017 699
CM 700     def test_has_resource(self):
407b33 701         source = DummyAssetSource(exists=True)
MM 702         overrides = [DummyOverride(None), DummyOverride((source, 'foo.pt'))]
6da017 703         package = DummyPackage('package')
CM 704         po = self._makeOne(package)
407b33 705         po.overrides = overrides
6da017 706         self.assertEqual(po.has_resource('whatever'), True)
407b33 707         self.assertEqual(source.resource_name, 'foo.pt')
6da017 708
CM 709     def test_has_resource_file_doesnt_exist(self):
407b33 710         source = DummyAssetSource(exists=None)
0c29cf 711         overrides = [
MM 712             DummyOverride(None),
713             DummyOverride((source, 'wont_exist')),
714         ]
6da017 715         package = DummyPackage('package')
CM 716         po = self._makeOne(package)
407b33 717         po.overrides = overrides
6da017 718         self.assertEqual(po.has_resource('whatever'), None)
407b33 719         self.assertEqual(source.resource_name, 'wont_exist')
6da017 720
CM 721     def test_isdir_false(self):
407b33 722         source = DummyAssetSource(isdir=False)
MM 723         overrides = [DummyOverride(None), DummyOverride((source, 'foo.pt'))]
6da017 724         package = DummyPackage('package')
CM 725         po = self._makeOne(package)
407b33 726         po.overrides = overrides
6da017 727         self.assertEqual(po.isdir('whatever'), False)
407b33 728         self.assertEqual(source.resource_name, 'foo.pt')
MM 729
6da017 730     def test_isdir_true(self):
407b33 731         source = DummyAssetSource(isdir=True)
MM 732         overrides = [DummyOverride(None), DummyOverride((source, 'foo.pt'))]
6da017 733         package = DummyPackage('package')
CM 734         po = self._makeOne(package)
407b33 735         po.overrides = overrides
6da017 736         self.assertEqual(po.isdir('whatever'), True)
407b33 737         self.assertEqual(source.resource_name, 'foo.pt')
6da017 738
CM 739     def test_isdir_doesnt_exist(self):
407b33 740         source = DummyAssetSource(isdir=None)
0c29cf 741         overrides = [
MM 742             DummyOverride(None),
743             DummyOverride((source, 'wont_exist')),
744         ]
6da017 745         package = DummyPackage('package')
CM 746         po = self._makeOne(package)
407b33 747         po.overrides = overrides
6da017 748         self.assertEqual(po.isdir('whatever'), None)
407b33 749         self.assertEqual(source.resource_name, 'wont_exist')
6da017 750
CM 751     def test_listdir(self):
407b33 752         source = DummyAssetSource(listdir=True)
MM 753         overrides = [DummyOverride(None), DummyOverride((source, 'foo.pt'))]
6da017 754         package = DummyPackage('package')
CM 755         po = self._makeOne(package)
407b33 756         po.overrides = overrides
MM 757         self.assertEqual(po.listdir('whatever'), True)
758         self.assertEqual(source.resource_name, 'foo.pt')
6da017 759
CM 760     def test_listdir_doesnt_exist(self):
407b33 761         source = DummyAssetSource(listdir=None)
0c29cf 762         overrides = [
MM 763             DummyOverride(None),
764             DummyOverride((source, 'wont_exist')),
765         ]
6da017 766         package = DummyPackage('package')
CM 767         po = self._makeOne(package)
407b33 768         po.overrides = overrides
6da017 769         self.assertEqual(po.listdir('whatever'), None)
407b33 770         self.assertEqual(source.resource_name, 'wont_exist')
6da017 771
bea48e 772     # PEP 302 __loader__ extensions:  use the "real" __loader__, if present.
TS 773     def test_get_data_pkg_has_no___loader__(self):
774         package = DummyPackage('package')
775         po = self._makeOne(package)
776         self.assertRaises(NotImplementedError, po.get_data, 'whatever')
777
778     def test_get_data_pkg_has___loader__(self):
779         package = DummyPackage('package')
0c29cf 780         loader = package.__loader__ = DummyLoader()
bea48e 781         po = self._makeOne(package)
TS 782         self.assertEqual(po.get_data('whatever'), b'DEADBEEF')
783         self.assertEqual(loader._got_data, 'whatever')
784
785     def test_is_package_pkg_has_no___loader__(self):
786         package = DummyPackage('package')
787         po = self._makeOne(package)
788         self.assertRaises(NotImplementedError, po.is_package, 'whatever')
789
790     def test_is_package_pkg_has___loader__(self):
791         package = DummyPackage('package')
0c29cf 792         loader = package.__loader__ = DummyLoader()
bea48e 793         po = self._makeOne(package)
TS 794         self.assertTrue(po.is_package('whatever'))
795         self.assertEqual(loader._is_package, 'whatever')
796
797     def test_get_code_pkg_has_no___loader__(self):
798         package = DummyPackage('package')
799         po = self._makeOne(package)
800         self.assertRaises(NotImplementedError, po.get_code, 'whatever')
801
802     def test_get_code_pkg_has___loader__(self):
803         package = DummyPackage('package')
0c29cf 804         loader = package.__loader__ = DummyLoader()
bea48e 805         po = self._makeOne(package)
TS 806         self.assertEqual(po.get_code('whatever'), b'DEADBEEF')
807         self.assertEqual(loader._got_code, 'whatever')
808
809     def test_get_source_pkg_has_no___loader__(self):
810         package = DummyPackage('package')
811         po = self._makeOne(package)
812         self.assertRaises(NotImplementedError, po.get_source, 'whatever')
813
814     def test_get_source_pkg_has___loader__(self):
815         package = DummyPackage('package')
407b33 816         loader = package.__loader__ = DummyLoader()
bea48e 817         po = self._makeOne(package)
TS 818         self.assertEqual(po.get_source('whatever'), 'def foo():\n    pass')
819         self.assertEqual(loader._got_source, 'whatever')
407b33 820
MM 821
0c29cf 822 class AssetSourceIntegrationTests(object):
407b33 823     def test_get_filename(self):
MM 824         source = self._makeOne('')
0c29cf 825         self.assertEqual(
MM 826             source.get_filename('test_assets.py'),
827             os.path.join(here, 'test_assets.py'),
828         )
407b33 829
MM 830     def test_get_filename_with_prefix(self):
831         source = self._makeOne('test_assets.py')
0c29cf 832         self.assertEqual(
MM 833             source.get_filename(''), os.path.join(here, 'test_assets.py')
834         )
407b33 835
MM 836     def test_get_filename_file_doesnt_exist(self):
837         source = self._makeOne('')
838         self.assertEqual(source.get_filename('wont_exist'), None)
839
840     def test_get_stream(self):
841         source = self._makeOne('')
842         with source.get_stream('test_assets.py') as stream:
843             _assertBody(stream.read(), os.path.join(here, 'test_assets.py'))
844
845     def test_get_stream_with_prefix(self):
846         source = self._makeOne('test_assets.py')
847         with source.get_stream('') as stream:
848             _assertBody(stream.read(), os.path.join(here, 'test_assets.py'))
849
850     def test_get_stream_file_doesnt_exist(self):
851         source = self._makeOne('')
852         self.assertEqual(source.get_stream('wont_exist'), None)
853
854     def test_get_string(self):
855         source = self._makeOne('')
0c29cf 856         _assertBody(
MM 857             source.get_string('test_assets.py'),
858             os.path.join(here, 'test_assets.py'),
859         )
407b33 860
MM 861     def test_get_string_with_prefix(self):
862         source = self._makeOne('test_assets.py')
0c29cf 863         _assertBody(
MM 864             source.get_string(''), os.path.join(here, 'test_assets.py')
865         )
407b33 866
MM 867     def test_get_string_file_doesnt_exist(self):
868         source = self._makeOne('')
869         self.assertEqual(source.get_string('wont_exist'), None)
870
871     def test_exists(self):
872         source = self._makeOne('')
873         self.assertEqual(source.exists('test_assets.py'), True)
874
875     def test_exists_with_prefix(self):
876         source = self._makeOne('test_assets.py')
877         self.assertEqual(source.exists(''), True)
878
879     def test_exists_file_doesnt_exist(self):
880         source = self._makeOne('')
881         self.assertEqual(source.exists('wont_exist'), None)
882
883     def test_isdir_false(self):
884         source = self._makeOne('')
885         self.assertEqual(source.isdir('test_assets.py'), False)
886
887     def test_isdir_true(self):
888         source = self._makeOne('')
889         self.assertEqual(source.isdir('files'), True)
890
891     def test_isdir_doesnt_exist(self):
892         source = self._makeOne('')
893         self.assertEqual(source.isdir('wont_exist'), None)
894
895     def test_listdir(self):
896         source = self._makeOne('')
897         self.assertTrue(source.listdir('files'))
898
899     def test_listdir_doesnt_exist(self):
900         source = self._makeOne('')
901         self.assertEqual(source.listdir('wont_exist'), None)
902
903
0c29cf 904 class TestPackageAssetSource(AssetSourceIntegrationTests, unittest.TestCase):
407b33 905     def _getTargetClass(self):
MM 906         from pyramid.config.assets import PackageAssetSource
0c29cf 907
407b33 908         return PackageAssetSource
MM 909
dd3cc8 910     def _makeOne(self, prefix, package='tests.test_config'):
407b33 911         klass = self._getTargetClass()
MM 912         return klass(package, prefix)
913
0c29cf 914
407b33 915 class TestFSAssetSource(AssetSourceIntegrationTests, unittest.TestCase):
MM 916     def _getTargetClass(self):
917         from pyramid.config.assets import FSAssetSource
0c29cf 918
407b33 919         return FSAssetSource
MM 920
921     def _makeOne(self, prefix, base_prefix=here):
922         klass = self._getTargetClass()
923         return klass(os.path.join(base_prefix, prefix))
bea48e 924
0c29cf 925
6da017 926 class TestDirectoryOverride(unittest.TestCase):
CM 927     def _getTargetClass(self):
928         from pyramid.config.assets import DirectoryOverride
0c29cf 929
6da017 930         return DirectoryOverride
CM 931
407b33 932     def _makeOne(self, path, source):
6da017 933         klass = self._getTargetClass()
407b33 934         return klass(path, source)
6da017 935
CM 936     def test_it_match(self):
407b33 937         source = DummyAssetSource()
MM 938         o = self._makeOne('foo/', source)
6da017 939         result = o('foo/something.pt')
407b33 940         self.assertEqual(result, (source, 'something.pt'))
0c29cf 941
6da017 942     def test_it_no_match(self):
407b33 943         source = DummyAssetSource()
MM 944         o = self._makeOne('foo/', source)
6da017 945         result = o('baz/notfound.pt')
CM 946         self.assertEqual(result, None)
947
0c29cf 948
6da017 949 class TestFileOverride(unittest.TestCase):
CM 950     def _getTargetClass(self):
951         from pyramid.config.assets import FileOverride
0c29cf 952
6da017 953         return FileOverride
CM 954
407b33 955     def _makeOne(self, path, source):
6da017 956         klass = self._getTargetClass()
407b33 957         return klass(path, source)
6da017 958
CM 959     def test_it_match(self):
407b33 960         source = DummyAssetSource()
MM 961         o = self._makeOne('foo.pt', source)
6da017 962         result = o('foo.pt')
407b33 963         self.assertEqual(result, (source, ''))
0c29cf 964
6da017 965     def test_it_no_match(self):
407b33 966         source = DummyAssetSource()
MM 967         o = self._makeOne('foo.pt', source)
6da017 968         result = o('notfound.pt')
CM 969         self.assertEqual(result, None)
0c29cf 970
6da017 971
CM 972 class DummyOverride:
973     def __init__(self, result):
974         self.result = result
975
976     def __call__(self, resource_name):
977         return self.result
0c29cf 978
6da017 979
CM 980 class DummyOverrides:
981     def __init__(self, result):
982         self.result = result
983
984     def get_filename(self, resource_name):
985         return self.result
986
987     listdir = isdir = has_resource = get_stream = get_string = get_filename
2deac8 988
0c29cf 989
2deac8 990 class DummyPackageOverrides:
CM 991     def __init__(self, package):
992         self.package = package
993         self.inserted = []
994
407b33 995     def insert(self, path, source):
MM 996         self.inserted.append((path, source))
0c29cf 997
MM 998
6da017 999 class DummyPkgResources:
CM 1000     def __init__(self):
1001         self.registered = []
1002
1003     def register_loader_type(self, typ, inst):
1004         self.registered.append((typ, inst))
bea48e 1005
0c29cf 1006
6da017 1007 class DummyPackage:
CM 1008     def __init__(self, name):
1009         self.__name__ = name
0c29cf 1010
407b33 1011
MM 1012 class DummyAssetSource:
1013     def __init__(self, **kw):
1014         self.kw = kw
1015
1016     def get_filename(self, resource_name):
1017         self.resource_name = resource_name
1018         return self.kw['filename']
1019
1020     def get_stream(self, resource_name):
1021         self.resource_name = resource_name
1022         return self.kw['stream']
1023
1024     def get_string(self, resource_name):
1025         self.resource_name = resource_name
1026         return self.kw['string']
1027
1028     def exists(self, resource_name):
1029         self.resource_name = resource_name
1030         return self.kw['exists']
1031
1032     def isdir(self, resource_name):
1033         self.resource_name = resource_name
1034         return self.kw['isdir']
1035
1036     def listdir(self, resource_name):
1037         self.resource_name = resource_name
1038         return self.kw['listdir']
0c29cf 1039
MM 1040
bea48e 1041 class DummyLoader:
TS 1042     _got_data = _is_package = None
0c29cf 1043
bea48e 1044     def get_data(self, path):
TS 1045         self._got_data = path
1046         return b'DEADBEEF'
0c29cf 1047
bea48e 1048     def is_package(self, fullname):
TS 1049         self._is_package = fullname
1050         return True
0c29cf 1051
bea48e 1052     def get_code(self, fullname):
TS 1053         self._got_code = fullname
1054         return b'DEADBEEF'
0c29cf 1055
bea48e 1056     def get_source(self, fullname):
TS 1057         self._got_source = fullname
1058         return 'def foo():\n    pass'
0c29cf 1059
9ee830 1060
CM 1061 class DummyUnderOverride:
407b33 1062     def __call__(self, package, path, source, _info=''):
9ee830 1063         self.package = package
CM 1064         self.path = path
407b33 1065         self.source = source
9ee830 1066
0c29cf 1067
2544cf 1068 def read_(src):
MM 1069     with open(src, 'rb') as f:
1070         contents = f.read()
1071     return contents
0c29cf 1072
2544cf 1073
e6d802 1074 def _assertBody(body, filename):
CM 1075     # strip both \n and \r for windows
956b99 1076     body = body.replace(b'\r', b'')
CM 1077     body = body.replace(b'\n', b'')
e6d802 1078     data = read_(filename)
956b99 1079     data = data.replace(b'\r', b'')
CM 1080     data = data.replace(b'\n', b'')
0c29cf 1081     assert body == data