diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 6b82a2db0..9ae63ecc9 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 6.6.0 +current_version = 6.6.2 commit = True tag = False parse = (?P\d+)\.(?P\d+)\.(?P[A-z0-9-]+) diff --git a/api/graphql/schema.py b/api/graphql/schema.py index 730c2d61a..2bb445ecf 100644 --- a/api/graphql/schema.py +++ b/api/graphql/schema.py @@ -484,7 +484,7 @@ class GraphQLSequencingGroup: technology: str platform: str meta: strawberry.scalars.JSON - external_ids: strawberry.scalars.JSON | None + external_ids: strawberry.scalars.JSON internal_id: strawberry.Private[int] sample_id: strawberry.Private[int] @@ -498,7 +498,7 @@ def from_internal(internal: SequencingGroupInternal) -> 'GraphQLSequencingGroup' technology=internal.technology, platform=internal.platform, meta=internal.meta, - external_ids=internal.external_ids, + external_ids=internal.external_ids or {}, # internal internal_id=internal.id, sample_id=internal.sample_id, @@ -575,7 +575,7 @@ def from_internal(internal: AssayInternal) -> 'GraphQLAssay': id=internal.id, type=internal.type, meta=internal.meta, - external_ids=internal.external_ids, + external_ids=internal.external_ids or {}, # internal sample_id=internal.sample_id, ) diff --git a/api/server.py b/api/server.py index 8e035c97e..3460ec285 100644 --- a/api/server.py +++ b/api/server.py @@ -20,7 +20,7 @@ from api.settings import PROFILE_REQUESTS, SKIP_DATABASE_CONNECTION # This tag is automatically updated by bump2version -_VERSION = '6.6.0' +_VERSION = '6.6.2' logger = get_logger() diff --git a/deploy/python/version.txt b/deploy/python/version.txt index 826f5ce03..28179fc1f 100644 --- a/deploy/python/version.txt +++ b/deploy/python/version.txt @@ -1 +1 @@ -6.6.0 +6.6.2 diff --git a/metamist/graphql/__init__.py b/metamist/graphql/__init__.py index 44b16ba7b..2cd00b996 100644 --- a/metamist/graphql/__init__.py +++ b/metamist/graphql/__init__.py @@ -9,7 +9,9 @@ from gql import Client, gql as gql_constructor from gql.transport.aiohttp import AIOHTTPTransport +from gql.transport.aiohttp import log as aiohttp_logger from gql.transport.requests import RequestsHTTPTransport +from gql.transport.requests import log as requests_logger from cpg_utils.cloud import get_google_identity_token @@ -54,13 +56,18 @@ def configure_sync_client( if _sync_client and not force_recreate: return _sync_client - token = auth_token or get_google_identity_token( - target_audience=metamist.configuration.sm_url - ) - transport = RequestsHTTPTransport( - url=url or get_sm_url(), - headers={'Authorization': f'Bearer {token}'}, - ) + env = os.getenv('SM_ENVIRONMENT', 'PRODUCTION').lower() + if env == 'local': + transport = RequestsHTTPTransport(url=url or get_sm_url()) + else: + token = auth_token or get_google_identity_token( + target_audience=metamist.configuration.sm_url + ) + transport = RequestsHTTPTransport( + url=url or get_sm_url(), + headers={'Authorization': f'Bearer {token}'}, + ) + _sync_client = Client( transport=transport, schema=schema, fetch_schema_from_transport=schema is None ) @@ -78,13 +85,18 @@ async def configure_async_client( if _async_client and not force_recreate: return _async_client - token = auth_token or get_google_identity_token( - target_audience=metamist.configuration.sm_url - ) - transport = AIOHTTPTransport( - url=url or get_sm_url(), - headers={'Authorization': f'Bearer {token}'}, - ) + env = os.getenv('SM_ENVIRONMENT', 'PRODUCTION').lower() + if env == 'local': + transport = AIOHTTPTransport(url=url or get_sm_url()) + else: + token = auth_token or get_google_identity_token( + target_audience=metamist.configuration.sm_url + ) + transport = AIOHTTPTransport( + url=url or get_sm_url(), + headers={'Authorization': f'Bearer {token}'}, + ) + _async_client = Client( transport=transport, schema=schema, fetch_schema_from_transport=schema is None ) @@ -126,26 +138,39 @@ def validate(doc: DocumentNode, client=None, use_local_schema=False): # use older style typing to broaden supported Python versions def query( - _query: str | DocumentNode, variables: Dict = None, client: Client = None + _query: str | DocumentNode, variables: Dict = None, client: Client = None, log_response: bool = False ) -> Dict[str, Any]: """Query the metamist GraphQL API""" if variables is None: variables = {} + # disable logging for gql + current_level = aiohttp_logger.level + if not log_response: + requests_logger.setLevel('WARNING') + response = (client or configure_sync_client()).execute_sync( _query if isinstance(_query, DocumentNode) else gql(_query), variable_values=variables, ) + + if not log_response: + requests_logger.setLevel(current_level) return response async def query_async( - _query: str | DocumentNode, variables: Dict = None, client: Client = None + _query: str | DocumentNode, variables: Dict = None, client: Client = None, log_response: bool = False ) -> Dict[str, Any]: """Asynchronously query the Metamist GraphQL API""" if variables is None: variables = {} + # disable logging for gql + current_level = aiohttp_logger.level + if log_response: + aiohttp_logger.setLevel('WARNING') + if not client: client = await configure_async_client() @@ -153,4 +178,8 @@ async def query_async( _query if isinstance(_query, DocumentNode) else gql(_query), variable_values=variables, ) + + if log_response: + aiohttp_logger.setLevel(current_level) + return response diff --git a/models/models/assay.py b/models/models/assay.py index 04658ad44..139d60327 100644 --- a/models/models/assay.py +++ b/models/models/assay.py @@ -12,7 +12,7 @@ class AssayInternal(SMBase): sample_id: int meta: dict[str, Any] | None type: str - external_ids: dict[str, str] | None = None + external_ids: dict[str, str] | None = {} def __repr__(self): return ', '.join(f'{k}={v}' for k, v in vars(self).items()) diff --git a/models/models/sequencing_group.py b/models/models/sequencing_group.py index b1b493c8c..1ccd1a991 100644 --- a/models/models/sequencing_group.py +++ b/models/models/sequencing_group.py @@ -37,7 +37,7 @@ class SequencingGroupInternal(SMBase): platform: str | None = None meta: dict[str, str] | None = None sample_id: int | None = None - external_ids: dict[str, str] | None = None + external_ids: dict[str, str] | None = {} archived: bool | None = None project: int | None = None diff --git a/openapi-templates/configuration.mustache b/openapi-templates/configuration.mustache index b1aafc2ac..609dea623 100644 --- a/openapi-templates/configuration.mustache +++ b/openapi-templates/configuration.mustache @@ -24,10 +24,10 @@ JSON_SCHEMA_VALIDATION_KEYWORDS = { sm_url = getenv('SM_URL') if not sm_url: - env = getenv('SM_ENVIRONMENT', 'PRODUCTION') - if 'local' in env.lower(): + env = getenv('SM_ENVIRONMENT', 'PRODUCTION').lower() + if 'local' in env: sm_url = "http://localhost:8000" - elif 'dev' in env.lower(): + elif 'dev' in env: sm_url = 'https://sample-metadata-api-dev-mnrpw3mdza-ts.a.run.app' else: sm_url = 'https://sample-metadata-api-mnrpw3mdza-ts.a.run.app' @@ -192,7 +192,7 @@ conf = {{{packageName}}}.Configuration( ): """Constructor """ - env = getenv('SM_ENVIRONMENT', 'PRODUCTION') + self.env = getenv('SM_ENVIRONMENT', 'PRODUCTION').lower() self._base_path = host or sm_url """Default Base url @@ -491,6 +491,9 @@ conf = {{{packageName}}}.Configuration( :return: The Auth Settings information dict. """ + if self.env == 'local': + return {} + auth = { 'HTTPBearer': { 'type': 'bearer', diff --git a/setup.py b/setup.py index 652b5093f..0b812b931 100644 --- a/setup.py +++ b/setup.py @@ -19,7 +19,7 @@ setup( name=PKG, # This tag is automatically updated by bump2version - version='6.6.0', + version='6.6.2', description='Python API for interacting with the Sample API system', long_description=readme, long_description_content_type='text/markdown', diff --git a/web/package.json b/web/package.json index afeaa739b..69ffc33f6 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "metamist", - "version": "6.6.0", + "version": "6.6.2", "private": true, "dependencies": { "@apollo/client": "^3.7.3",