From ab003dbd92bf7980157da84ccb4b910d06081db6 Mon Sep 17 00:00:00 2001 From: Zsailer Date: Thu, 1 Aug 2019 16:10:35 -0400 Subject: [PATCH 1/7] allow server standalone mode --- jupyter_server/extension/application.py | 9 +++------ jupyter_server/extension/handler.py | 4 ++++ jupyter_server/serverapp.py | 14 +++++++++++++- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/jupyter_server/extension/application.py b/jupyter_server/extension/application.py index 791bc9fca..db9909c60 100644 --- a/jupyter_server/extension/application.py +++ b/jupyter_server/extension/application.py @@ -152,8 +152,8 @@ def _prepare_config(self): the object to the webapp's settings as `_config`. """ traits = self.class_own_traits().keys() - self.config = Config({t: getattr(self, t) for t in traits}) - self.settings['{}_config'.format(self.extension_name)] = self.config + self.extension_config = Config({t: getattr(self, t) for t in traits}) + self.settings['{}_config'.format(self.extension_name)] = self.extension_config def _prepare_settings(self): # Make webapp settings accessible to initialize_settings method @@ -279,7 +279,6 @@ def load_jupyter_server_extension(cls, serverapp, argv=[], **kwargs): # Configure and initialize extension. extension = cls() extension.initialize(serverapp, argv=argv) - return extension @classmethod @@ -290,7 +289,6 @@ def _prepare_launch(cls, serverapp, argv=[], **kwargs): """ # Load the extension extension = cls.load_jupyter_server_extension(serverapp, argv=argv, **kwargs) - # Start the browser at this extensions default_url, unless user # configures ServerApp.default_url on command line. try: @@ -313,11 +311,10 @@ def launch_instance(cls, argv=None, **kwargs): # arguments trigger actions from the extension not the server. _preparse_command_line(cls) # Handle arguments. - if argv is not None: + if argv is None: args = sys.argv[1:] # slice out extension config. else: args = [] - # Get a jupyter server instance. serverapp = cls.initialize_server(argv=args) extension = cls._prepare_launch(serverapp, argv=args, **kwargs) diff --git a/jupyter_server/extension/handler.py b/jupyter_server/extension/handler.py index ea6f8ba5d..22737ed3b 100644 --- a/jupyter_server/extension/handler.py +++ b/jupyter_server/extension/handler.py @@ -19,6 +19,10 @@ def initialize(self, extension_name): def config(self): return self.settings["{}_config".format(self.extension_name)] + @property + def server_config(self): + return self.settings["config"] + @property def static_url_prefix(self): return "/static/{extension_name}/".format( diff --git a/jupyter_server/serverapp.py b/jupyter_server/serverapp.py index 801ec7b22..2f6826dc7 100755 --- a/jupyter_server/serverapp.py +++ b/jupyter_server/serverapp.py @@ -492,6 +492,11 @@ def start(self): _("Allow the server to be run from root user.") ) +flags['standalone']=( + {'ServerApp' : {'standalone' : True}}, + _("Run the server without enabling extensions.") +) + # Add notebook manager flags flags.update(boolean_flag('script', 'FileContentsManager.save_script', 'DEPRECATED, IGNORED', @@ -1138,6 +1143,12 @@ def _update_server_extensions(self, change): is not available. """)) + standalone = Bool( + False, + config=True, + help="Run the server without enabling extensions." + ) + def parse_command_line(self, argv=None): super(ServerApp, self).parse_command_line(argv) @@ -1469,7 +1480,8 @@ def initialize(self, argv=None): self.init_webapp() self.init_terminals() self.init_signal() - self.init_server_extensions() + if self.standalone is False: + self.init_server_extensions() self.init_mime_overrides() self.init_shutdown_no_activity() From fd621c4fba7fa3fff8151ceb3ef69f4952b1bf07 Mon Sep 17 00:00:00 2001 From: Zsailer Date: Thu, 15 Aug 2019 08:56:21 -0700 Subject: [PATCH 2/7] make standalone mode a hidden attribute and not configurable --- jupyter_server/extension/application.py | 3 +++ jupyter_server/serverapp.py | 14 ++------------ 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/jupyter_server/extension/application.py b/jupyter_server/extension/application.py index db9909c60..700083158 100644 --- a/jupyter_server/extension/application.py +++ b/jupyter_server/extension/application.py @@ -72,6 +72,8 @@ class ExtensionApp(JupyterApp): class method. This method can be set as a entry_point in the extensions setup.py """ + _standalone_only = False + # Name of the extension extension_name = Unicode( "", @@ -224,6 +226,7 @@ def initialize_server(argv=[], **kwargs): """Get an instance of the Jupyter Server.""" # Get a jupyter server instance serverapp = ServerApp(**kwargs) + serverapp._standalone_only = self._standalone_only # Initialize ServerApp config. # Parses the command line looking for # ServerApp configuration. diff --git a/jupyter_server/serverapp.py b/jupyter_server/serverapp.py index 2f6826dc7..bd58ca3db 100755 --- a/jupyter_server/serverapp.py +++ b/jupyter_server/serverapp.py @@ -492,11 +492,6 @@ def start(self): _("Allow the server to be run from root user.") ) -flags['standalone']=( - {'ServerApp' : {'standalone' : True}}, - _("Run the server without enabling extensions.") -) - # Add notebook manager flags flags.update(boolean_flag('script', 'FileContentsManager.save_script', 'DEPRECATED, IGNORED', @@ -547,6 +542,7 @@ class ServerApp(JupyterApp): ) _log_formatter_cls = LogFormatter + _standalone_only = False @default('log_level') def _default_log_level(self): @@ -1143,12 +1139,6 @@ def _update_server_extensions(self, change): is not available. """)) - standalone = Bool( - False, - config=True, - help="Run the server without enabling extensions." - ) - def parse_command_line(self, argv=None): super(ServerApp, self).parse_command_line(argv) @@ -1480,7 +1470,7 @@ def initialize(self, argv=None): self.init_webapp() self.init_terminals() self.init_signal() - if self.standalone is False: + if self._standalone_only is False: self.init_server_extensions() self.init_mime_overrides() self.init_shutdown_no_activity() From 5bc87f181795eef0d1c2956352bcf59b0a143090 Mon Sep 17 00:00:00 2001 From: Zsailer Date: Thu, 15 Aug 2019 15:13:01 -0700 Subject: [PATCH 3/7] make load_extensions an arg to ServerApp --- jupyter_server/extension/application.py | 5 ++--- jupyter_server/serverapp.py | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/jupyter_server/extension/application.py b/jupyter_server/extension/application.py index 700083158..a25155900 100644 --- a/jupyter_server/extension/application.py +++ b/jupyter_server/extension/application.py @@ -72,7 +72,7 @@ class ExtensionApp(JupyterApp): class method. This method can be set as a entry_point in the extensions setup.py """ - _standalone_only = False + load_other_extensions = True # Name of the extension extension_name = Unicode( @@ -226,11 +226,10 @@ def initialize_server(argv=[], **kwargs): """Get an instance of the Jupyter Server.""" # Get a jupyter server instance serverapp = ServerApp(**kwargs) - serverapp._standalone_only = self._standalone_only # Initialize ServerApp config. # Parses the command line looking for # ServerApp configuration. - serverapp.initialize(argv=argv) + serverapp.initialize(argv=argv, load_extensions=self.load_other_extensions) return serverapp def initialize(self, serverapp, argv=[]): diff --git a/jupyter_server/serverapp.py b/jupyter_server/serverapp.py index bd58ca3db..b151044f8 100755 --- a/jupyter_server/serverapp.py +++ b/jupyter_server/serverapp.py @@ -542,7 +542,6 @@ class ServerApp(JupyterApp): ) _log_formatter_cls = LogFormatter - _standalone_only = False @default('log_level') def _default_log_level(self): @@ -1460,7 +1459,7 @@ def init_shutdown_no_activity(self): pc.start() @catch_config_error - def initialize(self, argv=None): + def initialize(self, argv=None, load_extensions=True): super(ServerApp, self).initialize(argv) self.init_logging() if self._dispatching: @@ -1470,7 +1469,7 @@ def initialize(self, argv=None): self.init_webapp() self.init_terminals() self.init_signal() - if self._standalone_only is False: + if load_extensions: self.init_server_extensions() self.init_mime_overrides() self.init_shutdown_no_activity() From e416c74322689f75d63ffc81696b83c003b71464 Mon Sep 17 00:00:00 2001 From: Zsailer Date: Thu, 15 Aug 2019 15:20:26 -0700 Subject: [PATCH 4/7] fix instance argument in a static method --- jupyter_server/extension/application.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/jupyter_server/extension/application.py b/jupyter_server/extension/application.py index a25155900..266984219 100644 --- a/jupyter_server/extension/application.py +++ b/jupyter_server/extension/application.py @@ -222,14 +222,14 @@ def _prepare_templates(self): self.initialize_templates() @staticmethod - def initialize_server(argv=[], **kwargs): + def initialize_server(argv=[], load_other_extensions=True, **kwargs): """Get an instance of the Jupyter Server.""" # Get a jupyter server instance serverapp = ServerApp(**kwargs) # Initialize ServerApp config. # Parses the command line looking for # ServerApp configuration. - serverapp.initialize(argv=argv, load_extensions=self.load_other_extensions) + serverapp.initialize(argv=argv, load_extensions=load_other_extensions) return serverapp def initialize(self, serverapp, argv=[]): @@ -318,7 +318,7 @@ def launch_instance(cls, argv=None, **kwargs): else: args = [] # Get a jupyter server instance. - serverapp = cls.initialize_server(argv=args) + serverapp = cls.initialize_server(argv=args, load_other_extensions=cls.load_other_extensions) extension = cls._prepare_launch(serverapp, argv=args, **kwargs) # Start the ioloop. extension.start_server() From d7b70e7b63968907d580e5698367d615530ccf13 Mon Sep 17 00:00:00 2001 From: Zsailer Date: Thu, 15 Aug 2019 15:50:54 -0700 Subject: [PATCH 5/7] add logging messages --- jupyter_server/extension/application.py | 12 +++++++++++- jupyter_server/serverapp.py | 2 ++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/jupyter_server/extension/application.py b/jupyter_server/extension/application.py index 266984219..3473c4016 100644 --- a/jupyter_server/extension/application.py +++ b/jupyter_server/extension/application.py @@ -318,7 +318,17 @@ def launch_instance(cls, argv=None, **kwargs): else: args = [] # Get a jupyter server instance. - serverapp = cls.initialize_server(argv=args, load_other_extensions=cls.load_other_extensions) + serverapp = cls.initialize_server( + argv=args, + load_other_extensions=cls.load_other_extensions + ) + # Log if extension is blocking other extensions from loading. + if cls.load_other_extensions: + serverapp.log.info( + "{ext_name} is running without loading " + "other extensions.".format(ext_name=cls.extension_name) + ) + extension = cls._prepare_launch(serverapp, argv=args, **kwargs) # Start the ioloop. extension.start_server() diff --git a/jupyter_server/serverapp.py b/jupyter_server/serverapp.py index b151044f8..a3fefabfd 100755 --- a/jupyter_server/serverapp.py +++ b/jupyter_server/serverapp.py @@ -1415,6 +1415,8 @@ def init_server_extensions(self): func = getattr(mod, 'load_jupyter_server_extension', None) if func is not None: func(self) + # Add debug log for loaded extensions. + self.log.debug("%s is enabled and loaded." % modulename) except Exception: if self.reraise_server_extension_failures: raise From 89c184cdd02cc5a0265be790feeea7599a168a44 Mon Sep 17 00:00:00 2001 From: Zsailer Date: Thu, 15 Aug 2019 16:31:26 -0700 Subject: [PATCH 6/7] add warning if no extension funciton is found --- jupyter_server/serverapp.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/jupyter_server/serverapp.py b/jupyter_server/serverapp.py index a3fefabfd..ce723443c 100755 --- a/jupyter_server/serverapp.py +++ b/jupyter_server/serverapp.py @@ -1415,8 +1415,10 @@ def init_server_extensions(self): func = getattr(mod, 'load_jupyter_server_extension', None) if func is not None: func(self) - # Add debug log for loaded extensions. - self.log.debug("%s is enabled and loaded." % modulename) + # Add debug log for loaded extensions. + self.log.debug("%s is enabled and loaded." % modulename) + else: + self.log.warning("%s is enabled but no `load_jupyter_server_extension` function was found") except Exception: if self.reraise_server_extension_failures: raise From 9e4448e3ebce11532ac037640df8c2d8fc599e1f Mon Sep 17 00:00:00 2001 From: Zsailer Date: Fri, 16 Aug 2019 08:18:19 -0700 Subject: [PATCH 7/7] flip conditional statement bug --- jupyter_server/extension/application.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jupyter_server/extension/application.py b/jupyter_server/extension/application.py index 3473c4016..b244da76a 100644 --- a/jupyter_server/extension/application.py +++ b/jupyter_server/extension/application.py @@ -323,7 +323,7 @@ def launch_instance(cls, argv=None, **kwargs): load_other_extensions=cls.load_other_extensions ) # Log if extension is blocking other extensions from loading. - if cls.load_other_extensions: + if not cls.load_other_extensions: serverapp.log.info( "{ext_name} is running without loading " "other extensions.".format(ext_name=cls.extension_name)