Michael Merickel
2017-03-28 50cebd7dea8a11188c383200f81e63a0b8b377ae
require "open_url" setting in order to know what browser to open

Parsing the port from the server section could be brought back but it
would be a fallback that depends on finding a "port" variable in the
[server:server_name] section of the config.
2 files modified
53 ■■■■■ changed files
pyramid/scripts/pserve.py 49 ●●●●● patch | view | raw | blame | history
pyramid/tests/test_scripts/test_pserve.py 4 ●●●● patch | view | raw | blame | history
pyramid/scripts/pserve.py
@@ -22,10 +22,6 @@
    loadapp,
    loadserver,
)
from paste.deploy.loadwsgi import (
    SERVER,
    loadcontext,
)
from pyramid.compat import PY2
from pyramid.compat import configparser
@@ -87,7 +83,9 @@
        '-b', '--browser',
        dest='browser',
        action='store_true',
        help="Open a web browser to server url")
        help=("Open a web browser to the server url. The server url is "
              "determined from the 'open_url' setting in the 'pserve' "
              "section of the configuration file."))
    parser.add_argument(
        '-v', '--verbose',
        default=default_verbosity,
@@ -119,6 +117,8 @@
    loadapp = staticmethod(loadapp)  # testing
    loadserver = staticmethod(loadserver)  # testing
    open_url = None
    _scheme_re = re.compile(r'^[a-z][a-z]+:', re.I)
    def __init__(self, argv, quiet=False):
@@ -127,7 +127,7 @@
            self.args.verbose = 0
        if self.args.reload:
            self.worker_kwargs = {'argv': argv, "quiet": quiet}
        self.watch_files = []
        self.watch_files = set()
    def out(self, msg):  # pragma: no cover
        if self.args.verbose > 0:
@@ -150,7 +150,7 @@
        try:
            items = dict(config.items('pserve'))
        except configparser.NoSectionError:
            return
            items = {}
        watch_files = aslist(items.get('watch_files', ''), flatten=False)
@@ -161,7 +161,11 @@
                file = resolver.resolve(file).abspath()
            elif not os.path.isabs(file):
                file = os.path.join(here, file)
            self.watch_files.append(os.path.abspath(file))
            self.watch_files.add(os.path.abspath(file))
        open_url = items.get('open_url')
        if open_url:
            self.open_url = open_url
    def run(self):  # pragma: no cover
        if not self.args.config_uri:
@@ -188,16 +192,21 @@
        # do not open the browser on each reload so check hupper first
        if self.args.browser and not hupper.is_active():
            def open_browser():
                context = loadcontext(
                    SERVER, app_spec, name=server_name, relative_to=base,
                    global_conf=vars)
                url = 'http://127.0.0.1:{port}/'.format(**context.config())
                time.sleep(1)
                webbrowser.open(url)
            t = threading.Thread(target=open_browser)
            t.setDaemon(True)
            t.start()
            self.pserve_file_config(config_path, global_conf=vars)
            url = self.open_url
            if not url:
                self.out('WARNING: could not determine the server\'s url to '
                         'open the browser. To fix this set the "open_url" '
                         'setting in the [pserve] section of the '
                         'configuration file.')
            else:
                def open_browser():
                    time.sleep(1)
                    webbrowser.open(url)
                t = threading.Thread(target=open_browser)
                t.setDaemon(True)
                t.start()
        if self.args.reload and not hupper.is_active():
            if self.args.verbose > 1:
@@ -213,11 +222,11 @@
        if config_path:
            setup_logging(config_path, global_conf=vars)
            self.pserve_file_config(config_path, global_conf=vars)
            self.watch_files.append(config_path)
            self.watch_files.add(config_path)
        if hupper.is_active():
            reloader = hupper.get_reloader()
            reloader.watch_files(self.watch_files)
            reloader.watch_files(list(self.watch_files))
        server = self.loadserver(
            server_spec, name=server_name, relative_to=base, global_conf=vars)
pyramid/tests/test_scripts/test_pserve.py
@@ -74,11 +74,11 @@
            'a': '1',
            'here': os.path.abspath('/base'),
        })
        self.assertEqual(inst.watch_files, [
        self.assertEqual(inst.watch_files, set([
            os.path.abspath('/base/foo'),
            os.path.abspath('/baz'),
            os.path.abspath(os.path.join(here, '*.py')),
        ])
        ]))
    def test_reload_call_hupper_with_correct_args(self):
        from pyramid.scripts import pserve