From 248669dbaedc4848e627c449e4e43928628b86be Mon Sep 17 00:00:00 2001 From: Michael Merickel Date: Tue, 28 Mar 2017 02:48:52 -0500 Subject: support opening the browser via pserve.open_url config setting --- pyramid/scripts/pserve.py | 29 ++++++++++++++++++++++++++++- pyramid/tests/test_scripts/test_pserve.py | 26 ++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/pyramid/scripts/pserve.py b/pyramid/scripts/pserve.py index caa73704a..c469dde04 100644 --- a/pyramid/scripts/pserve.py +++ b/pyramid/scripts/pserve.py @@ -150,7 +150,7 @@ class PServeCommand(object): try: items = dict(config.items('pserve')) except configparser.NoSectionError: - items = {} + return watch_files = aslist(items.get('watch_files', ''), flatten=False) @@ -163,10 +163,31 @@ class PServeCommand(object): file = os.path.join(here, file) self.watch_files.add(os.path.abspath(file)) + # attempt to determine the url of the server open_url = items.get('open_url') if open_url: self.open_url = open_url + def _guess_server_url(self, filename, server_name, + global_conf=None): # pragma: no cover + server_name = server_name or 'main' + here = os.path.abspath(os.path.dirname(filename)) + defaults = {} + if global_conf: + defaults.update(global_conf) + defaults['here'] = here + + config = self.ConfigParser(defaults=defaults) + config.optionxform = str + config.read(filename) + try: + items = dict(config.items('server:' + server_name)) + except configparser.NoSectionError: + return + + if 'port' in items: + return 'http://127.0.0.1:{port}'.format(**items) + def run(self): # pragma: no cover if not self.args.config_uri: self.out('You must give a config file') @@ -194,6 +215,12 @@ class PServeCommand(object): if self.args.browser and not hupper.is_active(): self.pserve_file_config(config_path, global_conf=vars) url = self.open_url + + # do not guess the url if the server is sourced from a different + # location than the config_path + if not url and server_spec == app_spec: + url = self._guess_server_url(config_path, server_name, vars) + if not url: self.out('WARNING: could not determine the server\'s url to ' 'open the browser. To fix this set the "open_url" ' diff --git a/pyramid/tests/test_scripts/test_pserve.py b/pyramid/tests/test_scripts/test_pserve.py index bb3303a10..d5578b3ea 100644 --- a/pyramid/tests/test_scripts/test_pserve.py +++ b/pyramid/tests/test_scripts/test_pserve.py @@ -80,6 +80,32 @@ class TestPServeCommand(unittest.TestCase): os.path.abspath(os.path.join(here, '*.py')), ])) + def test_config_file_finds_open_url(self): + inst = self._makeOne('development.ini') + self.config_factory.items = [( + 'open_url', 'http://127.0.0.1:8080/', + )] + inst.pserve_file_config('/base/path.ini', global_conf={'a': '1'}) + self.assertEqual(self.config_factory.defaults, { + 'a': '1', + 'here': os.path.abspath('/base'), + }) + self.assertEqual(inst.open_url, 'http://127.0.0.1:8080/') + + def test__guess_server_url(self): + inst = self._makeOne('development.ini') + self.config_factory.items = [( + 'port', '8080', + )] + url = inst._guess_server_url( + '/base/path.ini', 'main', global_conf={'a': '1'}) + self.assertEqual(self.config_factory.defaults, { + 'a': '1', + 'here': os.path.abspath('/base'), + }) + self.assertEqual(self.config_factory.parser.section, 'server:main') + self.assertEqual(url, 'http://127.0.0.1:8080') + def test_reload_call_hupper_with_correct_args(self): from pyramid.scripts import pserve -- cgit v1.2.3