From f37a9a5436775dc1acddb6d7c3ef4220747eda04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herman=20Zvonimir=20Do=C5=A1ilovi=C4=87?= Date: Mon, 11 Nov 2024 21:25:33 +0100 Subject: [PATCH 1/3] Load implicit and preview clients only when needed. --- src/judge0/__init__.py | 43 ++++++++++++++++++++++-------------------- src/judge0/api.py | 30 +++++++---------------------- src/judge0/clients.py | 8 ++++---- 3 files changed, 34 insertions(+), 47 deletions(-) diff --git a/src/judge0/__init__.py b/src/judge0/__init__.py index 19bebad..00d5c7b 100644 --- a/src/judge0/__init__.py +++ b/src/judge0/__init__.py @@ -43,11 +43,18 @@ "wait", ] +JUDGE0_IMPLICIT_CE_CLIENT = None +JUDGE0_IMPLICIT_EXTRA_CE_CLIENT = None + + +def _get_implicit_client(flavor: Flavor) -> Optional[Client]: + global JUDGE0_IMPLICIT_CE_CLIENT, JUDGE0_IMPLICIT_EXTRA_CE_CLIENT + + if flavor == Flavor.CE and JUDGE0_IMPLICIT_CE_CLIENT is not None: + return JUDGE0_IMPLICIT_CE_CLIENT + if flavor == Flavor.EXTRA_CE and JUDGE0_IMPLICIT_EXTRA_CE_CLIENT is not None: + return JUDGE0_IMPLICIT_EXTRA_CE_CLIENT -def _create_default_client( - flavor: Flavor, - preview_client_class: Union[SuluJudge0CE, SuluJudge0ExtraCE], -) -> Optional[Client]: from .clients import CE, EXTRA_CE try: @@ -66,27 +73,23 @@ def _create_default_client( for client_class in client_classes: api_key = os.getenv(client_class.API_KEY_ENV) if api_key is not None: - # It is possible for a client to be subscribed to one flavor with - # API key. - try: - client = client_class(api_key) - break - except Exception as e: - warnings.warn(f"Failed to initialize client: {e}") + client = client_class(api_key) + break + + if client is None: + if flavor == Flavor.CE: + client = SuluJudge0CE() + else: + client = SuluJudge0ExtraCE() + + if flavor == Flavor.CE: + JUDGE0_IMPLICIT_CE_CLIENT = client else: - try: - client = preview_client_class("") - except Exception as e: - warnings.warn(f"Failed to initialize preview client: {e}") + JUDGE0_IMPLICIT_EXTRA_CE_CLIENT = client return client -JUDGE0_IMPLICIT_CE_CLIENT = _create_default_client(Flavor.CE, SuluJudge0CE) -JUDGE0_IMPLICIT_EXTRA_CE_CLIENT = _create_default_client( - Flavor.EXTRA_CE, SuluJudge0ExtraCE -) - CE = Flavor.CE EXTRA_CE = Flavor.EXTRA_CE diff --git a/src/judge0/api.py b/src/judge0/api.py index a892b57..a8370cb 100644 --- a/src/judge0/api.py +++ b/src/judge0/api.py @@ -10,18 +10,15 @@ def resolve_client( client: Optional[Union[Client, Flavor]] = None, submissions: Optional[Union[Submission, list[Submission]]] = None, ) -> Union[Client, None]: - from . import JUDGE0_IMPLICIT_CE_CLIENT, JUDGE0_IMPLICIT_EXTRA_CE_CLIENT - # User explicitly passed a client. if isinstance(client, Client): return client + from . import _get_implicit_client + # User explicitly choose the flavor of the client. if isinstance(client, Flavor): - if client == Flavor.CE: - return JUDGE0_IMPLICIT_CE_CLIENT - else: - return JUDGE0_IMPLICIT_EXTRA_CE_CLIENT + return _get_implicit_client(flavor=client) # client is None and we have to determine a flavor of the client from the # submissions and the languages. @@ -31,23 +28,10 @@ def resolve_client( # Check which client supports all languages from the provided submissions. languages = [submission.language_id for submission in submissions] - if JUDGE0_IMPLICIT_CE_CLIENT is not None: - if all( - ( - JUDGE0_IMPLICIT_CE_CLIENT.is_language_supported(lang) - for lang in languages - ) - ): - return JUDGE0_IMPLICIT_CE_CLIENT - - if JUDGE0_IMPLICIT_EXTRA_CE_CLIENT is not None: - if all( - ( - JUDGE0_IMPLICIT_EXTRA_CE_CLIENT.is_language_supported(lang) - for lang in languages - ) - ): - return JUDGE0_IMPLICIT_EXTRA_CE_CLIENT + for flavor in Flavor: + client = _get_implicit_client(flavor) + if client is not None and all((client.is_language_supported(lang) for lang in languages)): + return client raise RuntimeError( "Failed to resolve the client from submissions argument." diff --git a/src/judge0/clients.py b/src/judge0/clients.py index a9f25ce..b115e51 100644 --- a/src/judge0/clients.py +++ b/src/judge0/clients.py @@ -402,16 +402,16 @@ def __init__(self, api_key): class Sulu(Client): API_KEY_ENV = "JUDGE0_SULU_API_KEY" - def __init__(self, endpoint, api_key): + def __init__(self, endpoint, *, api_key = None): self.api_key = api_key - super().__init__(endpoint, {"Authorization": f"Bearer {api_key}"}) + super().__init__(endpoint, {"Authorization": f"Bearer {api_key}"} if api_key else None) class SuluJudge0CE(Sulu): DEFAULT_ENDPOINT: str = "https://judge0-ce.p.sulu.sh" HOME_URL: str = "https://sparkhub.sulu.sh/apis/judge0/judge0-ce/readme" - def __init__(self, api_key): + def __init__(self, *, api_key = None): super().__init__(self.DEFAULT_ENDPOINT, api_key=api_key) @@ -419,7 +419,7 @@ class SuluJudge0ExtraCE(Sulu): DEFAULT_ENDPOINT: str = "https://judge0-extra-ce.p.sulu.sh" HOME_URL: str = "https://sparkhub.sulu.sh/apis/judge0/judge0-extra-ce/readme" - def __init__(self, api_key): + def __init__(self, *, api_key = None): super().__init__(self.DEFAULT_ENDPOINT, api_key=api_key) From 7a0e23a9cdf8515666045722fc2b5b888240e2b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Karlo=20Do=C5=A1ilovi=C4=87?= Date: Tue, 12 Nov 2024 21:10:00 +0100 Subject: [PATCH 2/3] Add comments. Make api_key for Sulu clients positional and keyword argument with default value. --- src/judge0/__init__.py | 5 +++++ src/judge0/clients.py | 15 +++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/judge0/__init__.py b/src/judge0/__init__.py index 00d5c7b..68001a2 100644 --- a/src/judge0/__init__.py +++ b/src/judge0/__init__.py @@ -50,6 +50,7 @@ def _get_implicit_client(flavor: Flavor) -> Optional[Client]: global JUDGE0_IMPLICIT_CE_CLIENT, JUDGE0_IMPLICIT_EXTRA_CE_CLIENT + # Implicit clients are already set. if flavor == Flavor.CE and JUDGE0_IMPLICIT_CE_CLIENT is not None: return JUDGE0_IMPLICIT_CE_CLIENT if flavor == Flavor.EXTRA_CE and JUDGE0_IMPLICIT_EXTRA_CE_CLIENT is not None: @@ -69,6 +70,8 @@ def _get_implicit_client(flavor: Flavor) -> Optional[Client]: else: client_classes = EXTRA_CE + # Try to find one of the predefined keys JUDGE0_{SULU,RAPID,ATD}_API_KEY + # in environment variables. client = None for client_class in client_classes: api_key = os.getenv(client_class.API_KEY_ENV) @@ -76,6 +79,8 @@ def _get_implicit_client(flavor: Flavor) -> Optional[Client]: client = client_class(api_key) break + # If we didn't find any of the possible predefined keys, initialize + # the preview Sulu client based on the flavor. if client is None: if flavor == Flavor.CE: client = SuluJudge0CE() diff --git a/src/judge0/clients.py b/src/judge0/clients.py index b115e51..65dd141 100644 --- a/src/judge0/clients.py +++ b/src/judge0/clients.py @@ -402,25 +402,28 @@ def __init__(self, api_key): class Sulu(Client): API_KEY_ENV = "JUDGE0_SULU_API_KEY" - def __init__(self, endpoint, *, api_key = None): + def __init__(self, endpoint, api_key=None): self.api_key = api_key - super().__init__(endpoint, {"Authorization": f"Bearer {api_key}"} if api_key else None) + super().__init__( + endpoint, + {"Authorization": f"Bearer {api_key}"} if api_key else None, + ) class SuluJudge0CE(Sulu): DEFAULT_ENDPOINT: str = "https://judge0-ce.p.sulu.sh" HOME_URL: str = "https://sparkhub.sulu.sh/apis/judge0/judge0-ce/readme" - def __init__(self, *, api_key = None): - super().__init__(self.DEFAULT_ENDPOINT, api_key=api_key) + def __init__(self, api_key=None): + super().__init__(self.DEFAULT_ENDPOINT, api_key) class SuluJudge0ExtraCE(Sulu): DEFAULT_ENDPOINT: str = "https://judge0-extra-ce.p.sulu.sh" HOME_URL: str = "https://sparkhub.sulu.sh/apis/judge0/judge0-extra-ce/readme" - def __init__(self, *, api_key = None): - super().__init__(self.DEFAULT_ENDPOINT, api_key=api_key) + def __init__(self, api_key=None): + super().__init__(self.DEFAULT_ENDPOINT, api_key) CE = [RapidJudge0CE, SuluJudge0CE, ATDJudge0CE] From 852bb659ba6c4f34973634dea188eb7d666507c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Karlo=20Do=C5=A1ilovi=C4=87?= Date: Tue, 12 Nov 2024 21:15:28 +0100 Subject: [PATCH 3/3] Run formatter and minor refactor of api module. --- src/judge0/api.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/judge0/api.py b/src/judge0/api.py index a8370cb..b8bc255 100644 --- a/src/judge0/api.py +++ b/src/judge0/api.py @@ -26,16 +26,18 @@ def resolve_client( submissions = [submissions] # Check which client supports all languages from the provided submissions. - languages = [submission.language_id for submission in submissions] + languages = (submission.language_id for submission in submissions) for flavor in Flavor: client = _get_implicit_client(flavor) - if client is not None and all((client.is_language_supported(lang) for lang in languages)): + if client is not None and all( + (client.is_language_supported(lang) for lang in languages) + ): return client raise RuntimeError( - "Failed to resolve the client from submissions argument." - "None of the implicit clients supports all languages from the submissions." + "Failed to resolve the client from submissions argument. " + "None of the implicit clients supports all languages from the submissions. " "Please explicitly provide the client argument." ) @@ -49,13 +51,13 @@ def wait( if retry_mechanism is None: retry_mechanism = RegularPeriodRetry() - if not isinstance(submissions, (list, tuple)): + if isinstance(submissions, (list, tuple)): submissions_to_check = { - submission.token: submission for submission in [submissions] + submission.token: submission for submission in submissions } else: submissions_to_check = { - submission.token: submission for submission in submissions + submission.token: submission for submission in [submissions] } while len(submissions_to_check) > 0 and not retry_mechanism.is_done(): pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy