From e48ab08892003250f47948222eeb69dee657aaa8 Mon Sep 17 00:00:00 2001 From: SafetyQuincyF Date: Wed, 30 Oct 2024 16:39:06 -0700 Subject: [PATCH] fix:jupyter notebook rich format removal --- .vscode/launch.json | 10 ++++++++++ safety/auth/server.py | 30 +++++++++++++----------------- safety/auth/utils.py | 11 +++++++++++ 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index c3d91a7c..18caeb25 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -11,6 +11,16 @@ ], "console": "integratedTerminal" }, + { + "name": "Safety Auth Login --headless", + "type": "debugpy", + "request": "launch", + "module": "safety", + "args": [ + "auth","login","--headless" + ], + "console": "integratedTerminal" + }, { "name": "Safety Auth Logout", "type": "debugpy", diff --git a/safety/auth/server.py b/safety/auth/server.py index 9003df9a..75fc47a8 100644 --- a/safety/auth/server.py +++ b/safety/auth/server.py @@ -10,6 +10,7 @@ import click from safety.auth.cli_utils import load_auth_session +from safety.auth.utils import is_jupyter_notebook from safety.console import main_console as console from safety.auth.constants import AUTH_SERVER_URL, CLI_AUTH_SUCCESS, CLI_LOGOUT_SUCCESS, HOST @@ -191,7 +192,6 @@ class ThreadedHTTPServer(http.server.HTTPServer): def __init__(self, server_address: Tuple, RequestHandlerClass: Any) -> None: """ Initialize the ThreadedHTTPServer. - Args: server_address (Tuple): The server address as a tuple (host, port). RequestHandlerClass (Any): The request handler class. @@ -222,7 +222,6 @@ def handle_timeout(self) -> None: message = "Copy and paste this url into your browser:" - if not headless: # Start a threaded HTTP server to handle the callback server = ThreadedHTTPServer((HOST, PORT), CallbackHandler) @@ -231,15 +230,16 @@ def handle_timeout(self) -> None: server.ctx = ctx server_thread = threading.Thread(target=server.handle_request) server_thread.start() - message = f"If the browser does not automatically open in 5 seconds, " \ - "copy and paste this url into your browser:" + message = f"If the browser does not automatically open in 5 seconds, copy and paste this url into your browser:" target = uri if headless else f"{uri}&port={PORT}" - console.print(f"{message} [link={target}]{target}[/link]") - console.print() + + if is_jupyter_notebook(): + console.print(f"{message} {target}") + else: + console.print(f"{message} [link={target}]{target}[/link]") if headless: - # Handle the headless mode where user manually provides the response exchange_data = None while not exchange_data: auth_code_text = Prompt.ask("Paste the response here", default=None, console=console) @@ -247,18 +247,17 @@ def handle_timeout(self) -> None: exchange_data = json.loads(auth_code_text) state = exchange_data["state"] code = exchange_data["code"] - except Exception as e: + except Exception: code = state = None return auth_process(code=code, - state=state, - initial_state=initial_state, - code_verifier=ctx.obj.auth.code_verifier, - client=ctx.obj.auth.client) + state=state, + initial_state=initial_state, + code_verifier=ctx.obj.auth.code_verifier, + client=ctx.obj.auth.client) else: # Wait for the browser authentication in non-headless mode wait_msg = "waiting for browser authentication" - with console.status(wait_msg, spinner="bouncingBar"): time.sleep(2) click.launch(target) @@ -266,10 +265,7 @@ def handle_timeout(self) -> None: except OSError as e: if e.errno == socket.errno.EADDRINUSE: - reason = f"The port {HOST}:{PORT} is currently being used by another" \ - "application or process. Please choose a different port or " \ - "terminate the conflicting application/process to free up " \ - "the port." + reason = f"The port {HOST}:{PORT} is currently being used by another application or process. Please choose a different port or terminate the conflicting application/process to free up the port." else: reason = "An error occurred while performing this operation." diff --git a/safety/auth/utils.py b/safety/auth/utils.py index 922d949a..7925e365 100644 --- a/safety/auth/utils.py +++ b/safety/auth/utils.py @@ -425,3 +425,14 @@ def send(self, request: requests.PreparedRequest, **kwargs: Any) -> requests.Res """ request.headers.pop("Authorization", None) return super().send(request, **kwargs) + + +def is_jupyter_notebook() -> bool: + """Check if the code is being executed inside a Jupyter Notebook.""" + try: + from IPython import get_ipython + if 'IPKernelApp' not in get_ipython().config: + return False + except Exception: + return False + return True