diff options
| -rw-r--r-- | CONTRIBUTORS.txt | 2 | ||||
| -rw-r--r-- | setup.py | 2 | ||||
| -rw-r--r-- | src/pyramid/scripts/pserve.py | 24 | ||||
| -rw-r--r-- | tests/test_scripts/test_pserve.py | 32 |
4 files changed, 54 insertions, 6 deletions
diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 3c92d1d91..96ddcefc7 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -337,4 +337,6 @@ Contributors - Alexandre Yukio Harano, 2018/10/05 +- Eric Atkin, 2019/02/15 + - Arijit Basu, 2019/02/19 @@ -26,7 +26,7 @@ CHANGES = readfile('CHANGES.rst') VERSION = '2.0.dev0' install_requires = [ - 'hupper', + 'hupper >= 1.5', # ignore_files support 'plaster', 'plaster_pastedeploy', 'setuptools', diff --git a/src/pyramid/scripts/pserve.py b/src/pyramid/scripts/pserve.py index bf5662a19..350ab4d6d 100644 --- a/src/pyramid/scripts/pserve.py +++ b/src/pyramid/scripts/pserve.py @@ -25,8 +25,10 @@ from pyramid.path import AssetResolver from pyramid.settings import aslist -def main(argv=sys.argv, quiet=False): - command = PServeCommand(argv, quiet=quiet) +def main(argv=sys.argv, quiet=False, original_ignore_files=None): + command = PServeCommand( + argv, quiet=quiet, original_ignore_files=original_ignore_files + ) return command.run() @@ -131,13 +133,15 @@ class PServeCommand(object): _scheme_re = re.compile(r'^[a-z][a-z]+:', re.I) - def __init__(self, argv, quiet=False): + def __init__(self, argv, quiet=False, original_ignore_files=None): self.args = self.parser.parse_args(argv[1:]) if quiet: self.args.verbose = 0 if self.args.reload: self.worker_kwargs = {'argv': argv, "quiet": quiet} self.watch_files = set() + self.ignore_files = set() + self.original_ignore_files = original_ignore_files def out(self, msg): # pragma: no cover if self.args.verbose > 0: @@ -151,6 +155,9 @@ class PServeCommand(object): config_path = self.get_config_path(loader) here = os.path.dirname(config_path) watch_files = aslist(settings.get('watch_files', ''), flatten=False) + self.ignore_files = set( + aslist(settings.get('ignore_files', ''), flatten=False) + ) # track file paths relative to the ini file resolver = AssetResolver(package=None) @@ -232,11 +239,13 @@ class PServeCommand(object): if self.args.reload and not hupper.is_active(): if self.args.verbose > 1: self.out('Running reloading file monitor') + self.worker_kwargs['original_ignore_files'] = self.ignore_files hupper.start_reloader( 'pyramid.scripts.pserve.main', reload_interval=int(self.args.reload_interval), verbose=self.args.verbose, worker_kwargs=self.worker_kwargs, + ignore_files=self.ignore_files, ) return 0 @@ -250,6 +259,15 @@ class PServeCommand(object): reloader = hupper.get_reloader() reloader.watch_files(list(self.watch_files)) + if ( + self.original_ignore_files is not None + and self.original_ignore_files != self.ignore_files + ): + self.out( + 'A change to "ignore_files" was detected but it will not take' + ' effect until pserve is restarted.' + ) + server = server_loader.get_wsgi_server(server_name, config_vars) app = loader.get_wsgi_app(app_name, config_vars) diff --git a/tests/test_scripts/test_pserve.py b/tests/test_scripts/test_pserve.py index a573f2e5b..f19ba81df 100644 --- a/tests/test_scripts/test_pserve.py +++ b/tests/test_scripts/test_pserve.py @@ -19,10 +19,10 @@ class TestPServeCommand(unittest.TestCase): return PServeCommand - def _makeOne(self, *args): + def _makeOne(self, *args, **kwargs): effargs = ['pserve'] effargs.extend(args) - cmd = self._getTargetClass()(effargs) + cmd = self._getTargetClass()(effargs, **kwargs) cmd.out = self.out self.loader = dummy.DummyLoader() cmd._get_config_loader = self.loader @@ -49,6 +49,32 @@ class TestPServeCommand(unittest.TestCase): inst.run() self.assertEqual(app.global_conf, {'a': '1', 'b': '2'}) + def test_original_ignore_files(self): + msg = 'A change to "ignore_files" was detected' + + def get_app(name, global_conf): + app.name = name + app.global_conf = global_conf + return app + + inst = self._makeOne('development.ini') + app = dummy.DummyApp() + self.loader.get_wsgi_app = get_app + self.loader.server = lambda x: x + self.loader.settings = {'pserve': {'ignore_files': '*.txt'}} + inst.run() + self.assertNotIn(msg, self.out_.getvalue()) + + inst = self._makeOne( + 'development.ini', original_ignore_files={'*.txt'} + ) + app = dummy.DummyApp() + self.loader.get_wsgi_app = get_app + self.loader.server = lambda x: x + self.loader.settings = {'pserve': {'ignore_files': 'foo/*.txt'}} + inst.run() + self.assertIn(msg, self.out_.getvalue()) + def test_parse_vars_bad(self): inst = self._makeOne('development.ini', 'a') self.assertRaises(ValueError, inst.run) @@ -122,7 +148,9 @@ class TestPServeCommand(unittest.TestCase): 'worker_kwargs': { 'argv': ['pserve', '--reload', 'development.ini'], 'quiet': False, + 'original_ignore_files': set(), }, + 'ignore_files': set(), }, ) |
