From ac89492d7c1b33b5036c40fb3323a690328dd0ab Mon Sep 17 00:00:00 2001 From: Ahmed Ilyas <ahmed.ilyas@hu-berlin.de> Date: Tue, 11 Mar 2025 09:00:17 +0000 Subject: [PATCH] Revert "Merge branch 'ruff-isort' into 'develop'" --- nomad/app/dcat/common.py | 6 +- nomad/app/dcat/main.py | 6 +- nomad/app/dcat/mapping.py | 6 +- nomad/app/dcat/routers/dcat.py | 10 +- nomad/app/h5grove_app.py | 20 ++- nomad/app/main.py | 10 +- nomad/app/optimade/common.py | 3 +- nomad/app/optimade/elasticsearch.py | 16 +-- nomad/app/optimade/filterparser.py | 6 +- nomad/app/resources/common.py | 1 + nomad/app/resources/main.py | 8 +- nomad/app/resources/routers/resources.py | 29 +++-- nomad/app/v1/main.py | 23 ++-- nomad/app/v1/models/graph/graph_models.py | 38 +++--- nomad/app/v1/models/graph/utils.py | 27 ++--- nomad/app/v1/models/groups.py | 7 +- nomad/app/v1/models/models.py | 14 ++- nomad/app/v1/models/pagination.py | 9 +- nomad/app/v1/routers/auth.py | 29 +++-- nomad/app/v1/routers/datasets.py | 41 ++++--- nomad/app/v1/routers/entries.py | 92 ++++++++------ nomad/app/v1/routers/federation.py | 2 +- nomad/app/v1/routers/graph.py | 11 +- nomad/app/v1/routers/groups.py | 3 + nomad/app/v1/routers/info.py | 12 +- nomad/app/v1/routers/materials.py | 30 ++--- nomad/app/v1/routers/metainfo.py | 10 +- nomad/app/v1/routers/north.py | 20 +-- nomad/app/v1/routers/suggestions.py | 10 +- nomad/app/v1/routers/systems.py | 24 ++-- nomad/app/v1/routers/uploads.py | 83 +++++++------ nomad/app/v1/routers/users.py | 8 +- nomad/app/v1/utils.py | 22 ++-- nomad/archive/converter.py | 9 +- nomad/archive/partial.py | 8 +- nomad/archive/query.py | 4 +- nomad/archive/required.py | 19 ++- nomad/archive/storage.py | 14 ++- nomad/archive/storage_v2.py | 2 +- nomad/atomutils.py | 8 +- nomad/bundles.py | 31 +++-- nomad/cli/admin/admin.py | 13 +- nomad/cli/admin/clean.py | 6 +- nomad/cli/admin/entries.py | 3 +- nomad/cli/admin/migrate.py | 8 +- nomad/cli/admin/run.py | 12 +- nomad/cli/admin/springer.py | 11 +- nomad/cli/admin/uploads.py | 32 ++--- nomad/cli/admin/users.py | 4 +- nomad/cli/aflow.py | 19 ++- nomad/cli/cli.py | 3 +- nomad/cli/client/integrationtests.py | 4 +- nomad/cli/dev.py | 20 ++- nomad/cli/parse.py | 4 +- nomad/client/api.py | 3 +- nomad/client/archive.py | 8 +- nomad/client/processing.py | 7 +- nomad/client/upload.py | 2 +- nomad/common.py | 5 +- nomad/config/models/common.py | 5 +- nomad/config/models/config.py | 15 ++- nomad/config/models/plugins.py | 16 ++- nomad/config/models/ui.py | 16 +-- nomad/datamodel/context.py | 17 ++- nomad/datamodel/data.py | 13 +- nomad/datamodel/datamodel.py | 27 ++--- nomad/datamodel/hdf5.py | 6 +- nomad/datamodel/metainfo/action.py | 2 +- nomad/datamodel/metainfo/annotations.py | 13 +- nomad/datamodel/metainfo/basesections/v1.py | 14 ++- nomad/datamodel/metainfo/basesections/v2.py | 62 +++++++--- nomad/datamodel/metainfo/common.py | 3 +- nomad/datamodel/metainfo/downloads.py | 7 +- nomad/datamodel/metainfo/measurements.py | 5 +- nomad/datamodel/metainfo/plot.py | 12 +- .../metainfo/simulation/calculation.py | 20 +-- .../metainfo/simulation/legacy_workflows.py | 26 ++-- nomad/datamodel/metainfo/simulation/method.py | 17 ++- nomad/datamodel/metainfo/simulation/run.py | 18 +-- nomad/datamodel/metainfo/simulation/system.py | 18 ++- .../datamodel/metainfo/simulation/workflow.py | 65 +++++----- nomad/datamodel/metainfo/system.py | 4 +- nomad/datamodel/metainfo/tabulartree.py | 1 + nomad/datamodel/metainfo/workflow.py | 3 +- nomad/datamodel/optimade.py | 10 +- nomad/datamodel/results.py | 37 +++--- nomad/datamodel/util.py | 8 +- nomad/doi.py | 13 +- nomad/files.py | 37 +++--- nomad/graph/graph_reader.py | 26 +++- nomad/graph/lazy_wrapper.py | 1 - nomad/graph/model.py | 6 +- nomad/infrastructure.py | 27 ++--- nomad/logtransfer.py | 8 +- nomad/metainfo/annotation.py | 2 +- nomad/metainfo/data_frames.py | 16 ++- nomad/metainfo/data_type.py | 8 +- nomad/metainfo/elasticsearch_extension.py | 10 +- nomad/metainfo/example.py | 15 ++- nomad/metainfo/metainfo.py | 17 +-- nomad/metainfo/mongoengine_extension.py | 7 +- nomad/metainfo/pydantic_extension.py | 11 +- nomad/metainfo/util.py | 1 - nomad/mkdocs/metainfo.py | 2 +- nomad/mkdocs/pydantic.py | 11 +- nomad/normalizing/common.py | 22 ++-- nomad/normalizing/material.py | 10 +- nomad/normalizing/metainfo.py | 2 +- nomad/normalizing/method.py | 30 ++--- nomad/normalizing/normalizer.py | 4 +- nomad/normalizing/optimade.py | 9 +- nomad/normalizing/results.py | 85 +++++++------ nomad/normalizing/topology.py | 33 ++--- nomad/parsing/artificial.py | 11 +- nomad/parsing/file_parser/file_parser.py | 15 ++- nomad/parsing/file_parser/mapping_parser.py | 3 +- nomad/parsing/file_parser/text_parser.py | 9 +- nomad/parsing/file_parser/xml_parser.py | 3 +- nomad/parsing/parser.py | 17 ++- nomad/parsing/parsers.py | 18 ++- nomad/parsing/tabular.py | 23 ++-- nomad/processing/base.py | 34 +++--- nomad/processing/data.py | 114 ++++++++++-------- nomad/search.py | 15 ++- nomad/utils/exampledata.py | 16 +-- nomad/utils/json_transformer.py | 2 +- nomad/utils/structlogging.py | 15 ++- pyproject.toml | 4 +- tests/app/test_app.py | 3 +- tests/app/test_dcat.py | 5 +- tests/app/test_h5grove.py | 7 +- tests/app/test_optimade.py | 6 +- tests/app/test_resources.py | 13 +- tests/app/v1/routers/common.py | 9 +- tests/app/v1/routers/test_auth.py | 3 +- tests/app/v1/routers/test_datasets.py | 10 +- tests/app/v1/routers/test_entries.py | 30 ++--- .../v1/routers/test_entries_archive_edit.py | 1 - tests/app/v1/routers/test_entries_edit.py | 14 +-- tests/app/v1/routers/test_federation.py | 7 +- tests/app/v1/routers/test_graph.py | 4 +- tests/app/v1/routers/test_materials.py | 18 +-- tests/app/v1/routers/test_metainfo.py | 8 +- tests/app/v1/routers/test_suggestions.py | 2 - tests/app/v1/routers/test_systems.py | 14 +-- .../v1/routers/uploads/test_basic_uploads.py | 12 +- tests/app/v1/test_models.py | 8 +- tests/app/v1/test_utils.py | 1 - tests/archive/test_archive.py | 48 ++++---- tests/archive/test_storage.py | 5 +- tests/config/models/test_plugins.py | 5 +- tests/config/models/test_ui.py | 6 +- tests/conftest.py | 18 +-- .../data/schemas/nomadschemaexample/schema.py | 17 ++- tests/datamodel/metainfo/test_annotations.py | 4 +- tests/datamodel/metainfo/test_plotly.py | 1 - tests/datamodel/metainfo/test_substance.py | 5 +- tests/datamodel/test_context.py | 14 +-- tests/datamodel/test_datamodel.py | 9 +- tests/datamodel/test_hdf5.py | 11 +- tests/datamodel/test_metadata.py | 11 +- tests/datamodel/test_schema.py | 10 +- tests/examples/test_archive_query.py | 5 +- tests/examples/test_docs.py | 6 +- tests/examples/test_metainfo.py | 4 +- tests/fixtures/data.py | 2 +- tests/fixtures/group_uploads.py | 1 - tests/graph/test_definition_reader.py | 2 +- tests/graph/test_graph_reader.py | 8 +- tests/metainfo/test_attributes.py | 10 +- tests/metainfo/test_data_frames.py | 15 ++- .../metainfo/test_elasticsearch_extension.py | 18 +-- tests/metainfo/test_full_storage_quantity.py | 6 +- tests/metainfo/test_hash_id.py | 2 +- tests/metainfo/test_metainfo.py | 39 +++--- tests/metainfo/test_mongodb_extension.py | 6 +- tests/metainfo/test_package.py | 2 +- tests/metainfo/test_quantities.py | 4 +- tests/metainfo/test_references.py | 23 ++-- tests/metainfo/test_sections.py | 4 +- tests/metainfo/test_to_dict.py | 6 +- tests/metainfo/test_yaml_schema.py | 12 +- tests/mkdocs/test_mkdocs_metainfo.py | 2 +- tests/mkdocs/test_mkdocs_pydantic.py | 11 +- tests/normalizing/conftest.py | 62 +++++----- tests/normalizing/test_entry_type_and_name.py | 2 - tests/normalizing/test_material.py | 8 +- tests/normalizing/test_metainfo.py | 4 +- tests/normalizing/test_method.py | 3 +- tests/normalizing/test_properties.py | 12 +- tests/normalizing/test_topology.py | 33 +++-- tests/parsing/test_archive_parser.py | 5 +- tests/parsing/test_file_parser.py | 11 +- tests/parsing/test_mapping_parser.py | 31 ++--- tests/parsing/test_parsing.py | 4 +- tests/parsing/test_tabular.py | 14 +-- tests/processing/test_base.py | 8 +- tests/processing/test_data.py | 30 ++--- tests/processing/test_edit_metadata.py | 5 +- tests/processing/test_rfc3161.py | 4 +- tests/states/archives/create_archives.py | 1 - tests/states/entry.py | 6 +- tests/states/search.py | 5 +- tests/states/uploads.py | 5 +- tests/test_atomutils.py | 3 +- tests/test_cli.py | 18 ++- tests/test_client.py | 13 +- tests/test_common.py | 3 +- tests/test_config.py | 3 +- tests/test_doi.py | 6 +- tests/test_files.py | 24 ++-- tests/test_logtransfer.py | 7 +- tests/test_search.py | 13 +- tests/test_test.py | 3 +- tests/test_utils.py | 20 +-- tests/utils.py | 1 - 216 files changed, 1533 insertions(+), 1428 deletions(-) diff --git a/nomad/app/dcat/common.py b/nomad/app/dcat/common.py index 90e6fc4876..3d782dad88 100644 --- a/nomad/app/dcat/common.py +++ b/nomad/app/dcat/common.py @@ -16,14 +16,14 @@ # limitations under the License. # +from fastapi import Response, Query, Header import urllib.parse -from enum import Enum - -from fastapi import Header, Query, Response from rdflib import Graph +from enum import Enum from nomad.config import config + root_path = f'{config.services.api_base_path}/dcat' base_url = config.api_url(api='dcat') diff --git a/nomad/app/dcat/main.py b/nomad/app/dcat/main.py index 0fbfa0d4f6..49d4d68d50 100644 --- a/nomad/app/dcat/main.py +++ b/nomad/app/dcat/main.py @@ -16,11 +16,10 @@ # limitations under the License. # -import traceback - -from fastapi import FastAPI, Request, status +from fastapi import FastAPI, status, Request from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import JSONResponse, RedirectResponse +import traceback from nomad import utils from nomad.config import config @@ -28,6 +27,7 @@ from nomad.config import config from .common import root_path from .routers import dcat + logger = utils.get_logger(__name__) diff --git a/nomad/app/dcat/mapping.py b/nomad/app/dcat/mapping.py index c15ec0a876..d22399a762 100644 --- a/nomad/app/dcat/mapping.py +++ b/nomad/app/dcat/mapping.py @@ -16,15 +16,15 @@ # limitations under the License. # -from rdflib import RDF, BNode, Graph, Literal, URIRef -from rdflib.namespace import DCAT, FOAF, RDF, Namespace -from rdflib.namespace import DCTERMS as DCT +from rdflib import Graph, Literal, RDF, URIRef, BNode +from rdflib.namespace import Namespace, DCAT, DCTERMS as DCT, FOAF, RDF from nomad.config import config from nomad.datamodel import User from .common import url + VCARD = Namespace('http://www.w3.org/2006/vcard/ns#') HYDRA = Namespace('http://www.w3.org/ns/hydra/core#') diff --git a/nomad/app/dcat/routers/dcat.py b/nomad/app/dcat/routers/dcat.py index 0aa5b6b6ec..99a2f0256a 100644 --- a/nomad/app/dcat/routers/dcat.py +++ b/nomad/app/dcat/routers/dcat.py @@ -16,17 +16,17 @@ # limitations under the License. # -from datetime import date, datetime from enum import Enum +from fastapi import APIRouter, Query, Path, HTTPException, status, Depends +from datetime import datetime, date from elasticsearch_dsl import Q -from fastapi import APIRouter, Depends, HTTPException, Path, Query, status from nomad import utils -from nomad.app.v1.models import HTTPExceptionModel, MetadataPagination -from nomad.app.v1.utils import create_responses -from nomad.search import search from nomad.utils import strip +from nomad.search import search +from nomad.app.v1.models import MetadataPagination, HTTPExceptionModel +from nomad.app.v1.utils import create_responses from ..common import rdf_response from ..mapping import Mapping diff --git a/nomad/app/h5grove_app.py b/nomad/app/h5grove_app.py index 8e01225ff4..d409e01ee9 100644 --- a/nomad/app/h5grove_app.py +++ b/nomad/app/h5grove_app.py @@ -17,24 +17,23 @@ # from __future__ import annotations -import re +from fastapi import FastAPI, status, Request, Depends +from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import JSONResponse import traceback +import re import urllib.parse +import h5py +from typing import Any, IO from collections.abc import Callable -from typing import IO, Any -import h5py -from fastapi import Depends, FastAPI, Request, status -from fastapi.middleware.cors import CORSMiddleware -from fastapi.responses import JSONResponse -from h5grove import fastapi_utils as h5grove_router -from h5grove import utils as h5grove_utils +from h5grove import fastapi_utils as h5grove_router, utils as h5grove_utils from nomad import utils +from nomad.files import UploadFiles, PublicUploadFiles from nomad.app.v1.models import User from nomad.app.v1.routers.auth import create_user_dependency from nomad.app.v1.routers.uploads import get_upload_with_read_access -from nomad.files import PublicUploadFiles, UploadFiles logger = utils.get_logger(__name__) @@ -44,9 +43,8 @@ def open_zipped_h5_file( create_error: Callable[[int, str], Exception], h5py_options: dict[str, Any] = {}, ) -> h5py.File: - import io import re - + import io from nomad import files """ diff --git a/nomad/app/main.py b/nomad/app/main.py index 29829f997a..2168e5fd96 100644 --- a/nomad/app/main.py +++ b/nomad/app/main.py @@ -23,17 +23,16 @@ from fastapi import FastAPI, Response, status from fastapi.exception_handlers import ( http_exception_handler as default_http_exception_handler, ) -from fastapi.responses import HTMLResponse, JSONResponse from starlette.exceptions import HTTPException as StarletteHTTPException +from fastapi.responses import HTMLResponse, JSONResponse from starlette.middleware.base import BaseHTTPMiddleware from nomad import infrastructure from nomad.config import config from nomad.config.models.plugins import APIEntryPoint -from .static import GuiFiles -from .static import app as static_files_app from .v1.main import app as v1_app +from .static import app as static_files_app, GuiFiles class OasisAuthenticationMiddleware(BaseHTTPMiddleware): @@ -165,10 +164,11 @@ async def http_exception_handler(request, exc): @app.on_event('startup') async def startup_event(): + from nomad.cli.dev import get_gui_artifacts_js + from nomad.cli.dev import get_gui_config + from nomad.parsing.parsers import import_all_parsers from nomad import infrastructure - from nomad.cli.dev import get_gui_artifacts_js, get_gui_config from nomad.metainfo.elasticsearch_extension import entry_type - from nomad.parsing.parsers import import_all_parsers import_all_parsers() diff --git a/nomad/app/optimade/common.py b/nomad/app/optimade/common.py index 45824ef06b..fb0df1cc85 100644 --- a/nomad/app/optimade/common.py +++ b/nomad/app/optimade/common.py @@ -19,8 +19,9 @@ from typing import cast from nomad.metainfo.data_type import Datatype, to_optimade_type -from nomad.metainfo.elasticsearch_extension import SearchQuantity, entry_type from nomad.metainfo.metainfo import Quantity, Reference +from nomad.metainfo.elasticsearch_extension import SearchQuantity, entry_type + _provider_specific_fields: dict[str, SearchQuantity] = None diff --git a/nomad/app/optimade/elasticsearch.py b/nomad/app/optimade/elasticsearch.py index d966f7d7cc..d90607b339 100644 --- a/nomad/app/optimade/elasticsearch.py +++ b/nomad/app/optimade/elasticsearch.py @@ -1,23 +1,23 @@ from typing import Any - from elasticsearch_dsl import Q + from optimade.filterparser import LarkParser -from optimade.models import StructureResource from optimade.server.entry_collections import EntryCollection from optimade.server.exceptions import BadRequest from optimade.server.mappers import StructureMapper from optimade.server.mappers.entries import classproperty +from optimade.models import StructureResource -from nomad import datamodel, files, utils -from nomad.app.v1.models import MetadataPagination, MetadataRequired +from nomad.units import ureg from nomad.atomutils import Formula -from nomad.config import config from nomad.search import search -from nomad.units import ureg +from nomad.app.v1.models import MetadataPagination, MetadataRequired +from nomad.config import config +from nomad import datamodel, files, utils -from ...archive import to_json -from .common import provider_specific_fields from .filterparser import _get_transformer as get_transformer +from .common import provider_specific_fields +from ...archive import to_json logger = utils.get_logger(__name__) diff --git a/nomad/app/optimade/filterparser.py b/nomad/app/optimade/filterparser.py index 11caebaf9e..6ff5b0e26a 100644 --- a/nomad/app/optimade/filterparser.py +++ b/nomad/app/optimade/filterparser.py @@ -16,16 +16,18 @@ # limitations under the License. # -from cachetools import cached from elasticsearch_dsl import Q +from cachetools import cached + from optimade.filterparser import LarkParser -from optimade.filtertransformers.elasticsearch import ElasticsearchQuantity as Quantity from optimade.filtertransformers.elasticsearch import ( + ElasticsearchQuantity as Quantity, ElasticTransformer as OPTElasticTransformer, ) from .common import provider_specific_fields + _parser = LarkParser(version=(1, 0, 1)) diff --git a/nomad/app/resources/common.py b/nomad/app/resources/common.py index 96a0e9c977..f0cedfb72b 100644 --- a/nomad/app/resources/common.py +++ b/nomad/app/resources/common.py @@ -18,5 +18,6 @@ from nomad.config import config + root_path = f'{config.services.api_base_path}/resources' base_url = config.api_url(api='resources') diff --git a/nomad/app/resources/main.py b/nomad/app/resources/main.py index ab6e17d11d..e5c4b6992d 100644 --- a/nomad/app/resources/main.py +++ b/nomad/app/resources/main.py @@ -16,18 +16,18 @@ # limitations under the License. # -import traceback - -from celery.signals import worker_process_init -from fastapi import FastAPI, Request, status +from fastapi import FastAPI, status, Request from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import JSONResponse +import traceback +from celery.signals import worker_process_init from nomad import utils from nomad.config import config from .routers import resources + logger = utils.get_logger(__name__) mongo_client_resources = None diff --git a/nomad/app/resources/routers/resources.py b/nomad/app/resources/routers/resources.py index 45f4f9559b..242e82950d 100644 --- a/nomad/app/resources/routers/resources.py +++ b/nomad/app/resources/routers/resources.py @@ -16,36 +16,35 @@ # limitations under the License. # -import asyncio -import io -import os import re -from datetime import datetime +import os +import io +import bs4 +import asyncio +import httpx from enum import Enum +from fastapi import APIRouter, Query as FastApiQuery +from pydantic import BaseModel, Field from typing import Any - +from datetime import datetime import ase.io -import bs4 -import httpx -from asgiref.sync import async_to_sync -from fastapi import APIRouter -from fastapi import Query as FastApiQuery from mongoengine import ( - BooleanField, - DateTimeField, Document, + StringField, + DateTimeField, IntField, ListField, - StringField, + BooleanField, ) from mongoengine.queryset.visitor import Q -from pydantic import BaseModel, Field +from asgiref.sync import async_to_sync from nomad import utils -from nomad.atomutils import Formula from nomad.config import config +from nomad.atomutils import Formula from nomad.processing.base import app + logger = utils.get_logger(__name__) router = APIRouter() diff --git a/nomad/app/v1/main.py b/nomad/app/v1/main.py index af4def9247..2c3e7b6606 100644 --- a/nomad/app/v1/main.py +++ b/nomad/app/v1/main.py @@ -18,9 +18,9 @@ import traceback -from fastapi import FastAPI, Request, status +from fastapi import FastAPI, status, Request from fastapi.middleware.cors import CORSMiddleware -from fastapi.responses import JSONResponse, ORJSONResponse, RedirectResponse +from fastapi.responses import JSONResponse, RedirectResponse, ORJSONResponse from pyinstrument import Profiler from starlette.middleware import Middleware from starlette.middleware.base import BaseHTTPMiddleware @@ -29,23 +29,22 @@ from starlette.types import ASGIApp, Receive, Scope, Send from nomad import utils from nomad.config import config - from .common import root_path from .routers import ( - auth, - datasets, + users, entries, - federation, - graph, - groups, - info, materials, + auth, + info, + datasets, + uploads, + suggestions, metainfo, north, - suggestions, systems, - uploads, - users, + federation, + graph, + groups, ) logger = utils.get_logger(__name__) diff --git a/nomad/app/v1/models/graph/graph_models.py b/nomad/app/v1/models/graph/graph_models.py index dff9d7d42b..480221c93f 100644 --- a/nomad/app/v1/models/graph/graph_models.py +++ b/nomad/app/v1/models/graph/graph_models.py @@ -17,37 +17,35 @@ # from __future__ import annotations - from typing import Any, Literal +from pydantic import BaseModel, ConfigDict, Field, Extra -from pydantic import BaseModel, ConfigDict, Extra, Field +from ..groups import UserGroup, UserGroupPagination, UserGroupQuery -from nomad.app.v1.models.graph.utils import ( - generate_request_model, - generate_response_model, - mapped, +from nomad.graph.model import ( + RequestConfig, + DatasetQuery, + MetainfoQuery, + MetainfoPagination, ) +from nomad.metainfo.pydantic_extension import PydanticModel +from nomad.datamodel.data import User as UserModel from nomad.app.v1.models.models import Metadata, MetadataResponse -from nomad.app.v1.routers.datasets import Dataset as DatasetV1 -from nomad.app.v1.routers.datasets import DatasetPagination +from nomad.app.v1.routers.datasets import Dataset as DatasetV1, DatasetPagination from nomad.app.v1.routers.uploads import ( - EntryProcData, - EntryProcDataPagination, - PaginationResponse, UploadProcData, UploadProcDataPagination, UploadProcDataQuery, + PaginationResponse, + EntryProcData, + EntryProcDataPagination, ) -from nomad.datamodel.data import User as UserModel -from nomad.graph.model import ( - DatasetQuery, - MetainfoPagination, - MetainfoQuery, - RequestConfig, -) -from nomad.metainfo.pydantic_extension import PydanticModel -from ..groups import UserGroup, UserGroupPagination, UserGroupQuery +from nomad.app.v1.models.graph.utils import ( + generate_request_model, + generate_response_model, + mapped, +) class Error(BaseModel): diff --git a/nomad/app/v1/models/graph/utils.py b/nomad/app/v1/models/graph/utils.py index 6c871c5547..6d420a6e10 100644 --- a/nomad/app/v1/models/graph/utils.py +++ b/nomad/app/v1/models/graph/utils.py @@ -17,33 +17,32 @@ # from __future__ import annotations - -import sys -from collections.abc import Callable -from datetime import datetime -from types import UnionType from typing import ( - Any, - ForwardRef, - Literal, Optional, + Literal, Union, - cast, - get_args, - get_origin, + Any, + ForwardRef, get_type_hints, + get_origin, + get_args, + cast, ) - +from collections.abc import Callable +from types import UnionType +from datetime import datetime from pydantic import ( BaseModel, ConfigDict, - Field, TypeAdapter, - ValidationError, create_model, + Field, model_validator, + ValidationError, ) from pydantic.config import ConfigDict as BaseConfigDict +import sys + ref_prefix = '#/components/schemas' request_suffix = 'Request' diff --git a/nomad/app/v1/models/groups.py b/nomad/app/v1/models/groups.py index dbdae164fb..3a83a81818 100644 --- a/nomad/app/v1/models/groups.py +++ b/nomad/app/v1/models/groups.py @@ -1,4 +1,9 @@ -from pydantic import BaseModel, ConfigDict, Field, field_validator +from pydantic import ( + BaseModel, + ConfigDict, + Field, + field_validator, +) from pydantic_core import PydanticCustomError from .pagination import Direction, Pagination, PaginationResponse diff --git a/nomad/app/v1/models/models.py b/nomad/app/v1/models/models.py index 7dab17d0f8..32841a8832 100644 --- a/nomad/app/v1/models/models.py +++ b/nomad/app/v1/models/models.py @@ -16,25 +16,25 @@ # limitations under the License. # import datetime +from enum import Enum import fnmatch import json import re +from typing import Any from collections.abc import Mapping -from enum import Enum -from typing import Annotated, Any from fastapi import Body, HTTPException, Request from fastapi import Query as FastApiQuery from pydantic import ( # noqa: F401 - BaseModel, + field_validator, + model_validator, + StringConstraints, ConfigDict, + BaseModel, Field, StrictBool, StrictFloat, StrictInt, - StringConstraints, - field_validator, - model_validator, ) from pydantic.main import create_model from pydantic_core import PydanticCustomError @@ -49,6 +49,8 @@ from nomad.metainfo.elasticsearch_extension import ( from nomad.utils import strip from .pagination import Pagination, PaginationResponse +from typing import Annotated + User: Any = datamodel.User.m_def.a_pydantic.model # It is important that datetime.datetime comes last. Otherwise, number valued strings diff --git a/nomad/app/v1/models/pagination.py b/nomad/app/v1/models/pagination.py index c3fba17369..6cb92b5c54 100644 --- a/nomad/app/v1/models/pagination.py +++ b/nomad/app/v1/models/pagination.py @@ -1,7 +1,12 @@ from enum import Enum - from fastapi import HTTPException, Request -from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator +from pydantic import ( + BaseModel, + ConfigDict, + Field, + field_validator, + model_validator, +) from pydantic_core import PydanticCustomError from nomad.app.v1.utils import update_url_query_arguments diff --git a/nomad/app/v1/routers/auth.py b/nomad/app/v1/routers/auth.py index 01740cda39..d64981f471 100644 --- a/nomad/app/v1/routers/auth.py +++ b/nomad/app/v1/routers/auth.py @@ -16,29 +16,34 @@ # limitations under the License. # -import datetime -import hashlib import hmac +import hashlib import uuid -from collections.abc import Callable +import requests from enum import Enum -from functools import wraps -from inspect import Parameter, signature from typing import cast - -import jwt -import requests -from fastapi import APIRouter, Depends, HTTPException, Request, status -from fastapi import Query as FastApiQuery +from collections.abc import Callable +from inspect import Parameter, signature +from functools import wraps +from fastapi import ( + APIRouter, + Depends, + Query as FastApiQuery, + Request, + HTTPException, + status, +) from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm from pydantic import BaseModel +import jwt +import datetime -from nomad import datamodel, infrastructure, utils +from nomad import utils, infrastructure, datamodel from nomad.config import config from nomad.utils import get_logger, strip from ..common import root_path -from ..models import HTTPExceptionModel, User +from ..models import User, HTTPExceptionModel from ..utils import create_responses logger = get_logger(__name__) diff --git a/nomad/app/v1/routers/datasets.py b/nomad/app/v1/routers/datasets.py index 6038f44f98..34eec59747 100644 --- a/nomad/app/v1/routers/datasets.py +++ b/nomad/app/v1/routers/datasets.py @@ -17,37 +17,44 @@ # import re -from datetime import datetime from enum import Enum from typing import cast +from fastapi import ( + APIRouter, + Request, + Depends, + Query as FastApiQuery, + Path, + HTTPException, + status, +) +from pydantic import field_validator, BaseModel, Field +from datetime import datetime -from fastapi import APIRouter, Depends, HTTPException, Path, Request, status -from fastapi import Query as FastApiQuery -from pydantic import BaseModel, Field, field_validator - -from nomad import datamodel, processing, utils +from nomad import utils, datamodel, processing from nomad.config import config +from nomad.metainfo.elasticsearch_extension import entry_type +from nomad.utils import strip, create_uuid from nomad.datamodel import Dataset as DatasetDefinitionCls from nomad.doi import DOI, DOIException -from nomad.metainfo.elasticsearch_extension import entry_type from nomad.search import search, update_by_query -from nomad.utils import create_uuid, strip +from .auth import create_user_dependency +from .entries import _do_exhaustive_search +from ..utils import create_responses, parameter_dependency_from_model from ..models import ( - Any_, - Direction, - HTTPExceptionModel, - MetadataPagination, - MetadataRequired, - Owner, Pagination, PaginationResponse, + MetadataPagination, Query, + HTTPExceptionModel, User, + Direction, + Owner, + Any_, + MetadataRequired, ) -from ..utils import create_responses, parameter_dependency_from_model -from .auth import create_user_dependency -from .entries import _do_exhaustive_search + router = APIRouter() diff --git a/nomad/app/v1/routers/entries.py b/nomad/app/v1/routers/entries.py index f974e15421..7f25c97581 100644 --- a/nomad/app/v1/routers/entries.py +++ b/nomad/app/v1/routers/entries.py @@ -15,75 +15,89 @@ # See the License for the specific language governing permissions and # limitations under the License. # -import io -import json -import os.path -from collections.abc import Iterator from datetime import datetime + from enum import Enum from typing import Any - -import orjson -import yaml -from fastapi import APIRouter, Body, Depends, HTTPException, Path, Request, status -from fastapi import Query as QueryParameter +from collections.abc import Iterator +from fastapi import ( + APIRouter, + Depends, + Path, + status, + HTTPException, + Request, + Query as QueryParameter, + Body, +) +from fastapi.responses import StreamingResponse, ORJSONResponse from fastapi.exceptions import RequestValidationError -from fastapi.responses import ORJSONResponse, StreamingResponse -from pydantic import BaseModel, ConfigDict, Field, field_validator +from pydantic import ( + ConfigDict, + field_validator, + BaseModel, + Field, +) +import os.path +import io +import json +import orjson from pydantic.main import create_model from starlette.responses import Response +import yaml -from nomad import datamodel, files, metainfo, utils -from nomad import processing as proc -from nomad.archive import ArchiveQueryError, RequiredReader, RequiredValidationError +from nomad import files, utils, metainfo, processing as proc +from nomad import datamodel from nomad.config import config from nomad.config.models.config import Reprocess from nomad.datamodel import EditableUserMetadata from nomad.datamodel.context import ServerContext from nomad.files import StreamedFile, create_zipstream_async -from nomad.groups import get_group_ids -from nomad.metainfo.elasticsearch_extension import entry_type from nomad.processing.data import Upload +from nomad.utils import strip +from nomad.archive import RequiredReader, RequiredValidationError, ArchiveQueryError +from nomad.groups import get_group_ids from nomad.search import ( AuthenticationRequiredError, QueryValidationError, SearchError, search, + update_metadata as es_update_metadata, ) -from nomad.search import update_metadata as es_update_metadata -from nomad.utils import strip +from nomad.metainfo.elasticsearch_extension import entry_type +from .auth import create_user_dependency +from ..utils import ( + create_download_stream_zipped, + create_download_stream_raw_file, + browser_download_headers, + DownloadItem, + create_responses, + log_query, +) from ..models import ( Aggregation, - Files, - HTTPExceptionModel, - Metadata, - MetadataEditRequest, - MetadataPagination, - MetadataRequired, - MetadataResponse, - Owner, Pagination, PaginationResponse, - Query, - QueryParameters, + MetadataPagination, TermsAggregation, - User, WithQuery, WithQueryAndPagination, + MetadataRequired, + MetadataResponse, + Metadata, + MetadataEditRequest, + Files, + Query, + User, + Owner, + QueryParameters, + metadata_required_parameters, files_parameters, metadata_pagination_parameters, - metadata_required_parameters, -) -from ..utils import ( - DownloadItem, - browser_download_headers, - create_download_stream_raw_file, - create_download_stream_zipped, - create_responses, - log_query, + HTTPExceptionModel, ) -from .auth import create_user_dependency + router = APIRouter() diff --git a/nomad/app/v1/routers/federation.py b/nomad/app/v1/routers/federation.py index c554228d0b..11c7ff4eb5 100644 --- a/nomad/app/v1/routers/federation.py +++ b/nomad/app/v1/routers/federation.py @@ -24,7 +24,7 @@ import socket import zlib from enum import Enum -from fastapi import HTTPException, Request +from fastapi import Request, HTTPException from fastapi.routing import APIRouter from nomad import utils diff --git a/nomad/app/v1/routers/graph.py b/nomad/app/v1/routers/graph.py index 1d1006c53c..c3715787c6 100644 --- a/nomad/app/v1/routers/graph.py +++ b/nomad/app/v1/routers/graph.py @@ -18,22 +18,21 @@ from enum import Enum -from fastapi import APIRouter, Body, Depends, HTTPException +from fastapi import Depends, APIRouter, Body, HTTPException from fastapi.responses import ORJSONResponse -from nomad.app.v1.models.graph import GraphRequest, GraphResponse from nomad.graph.graph_reader import ( + MongoReader, ConfigError, GeneralReader, - MongoReader, - Token, UserReader, + Token, ) from nomad.graph.lazy_wrapper import LazyWrapper - -from ..models import User from .auth import create_user_dependency from .entries import EntriesArchive +from ..models import User +from nomad.app.v1.models.graph import GraphRequest, GraphResponse router = APIRouter() diff --git a/nomad/app/v1/routers/groups.py b/nomad/app/v1/routers/groups.py index 945b95f757..a41342eb46 100644 --- a/nomad/app/v1/routers/groups.py +++ b/nomad/app/v1/routers/groups.py @@ -29,6 +29,9 @@ from nomad.app.v1.models.groups import ( ) from nomad.app.v1.models.pagination import PaginationResponse from nomad.app.v1.utils import parameter_dependency_from_model + +from fastapi import APIRouter, Depends, HTTPException, status + from nomad.datamodel import User as UserDataModel from nomad.groups import MongoUserGroup from nomad.groups import create_user_group as create_mongo_user_group diff --git a/nomad/app/v1/routers/info.py b/nomad/app/v1/routers/info.py index 0e63c57788..1efa9a15fc 100644 --- a/nomad/app/v1/routers/info.py +++ b/nomad/app/v1/routers/info.py @@ -20,22 +20,22 @@ API endpoint that deliver backend configuration details. """ -from datetime import datetime from enum import Enum from typing import Any - +from datetime import datetime from fastapi.routing import APIRouter from pydantic.fields import Field from pydantic.main import BaseModel from nomad import normalizing -from nomad.app.v1.models import Aggregation, StatisticsAggregation from nomad.config import config -from nomad.metainfo.elasticsearch_extension import entry_type +from nomad.utils import strip +from nomad.search import search from nomad.parsing import parsers from nomad.parsing.parsers import code_metadata -from nomad.search import search -from nomad.utils import strip +from nomad.app.v1.models import Aggregation, StatisticsAggregation +from nomad.metainfo.elasticsearch_extension import entry_type + router = APIRouter() diff --git a/nomad/app/v1/routers/materials.py b/nomad/app/v1/routers/materials.py index 70c6ef56b6..579342c5fb 100644 --- a/nomad/app/v1/routers/materials.py +++ b/nomad/app/v1/routers/materials.py @@ -17,36 +17,32 @@ # from typing import Any - -from fastapi import APIRouter, Depends, HTTPException, Path, Request, status +from fastapi import APIRouter, Depends, Path, status, HTTPException, Request from fastapi.exception_handlers import RequestValidationError from pydantic import BaseModel, Field from nomad import utils -from nomad.metainfo.elasticsearch_extension import material_index, material_type -from nomad.search import ( - AuthenticationRequiredError, - QueryValidationError, - SearchError, - search, -) from nomad.utils import strip +from nomad.search import AuthenticationRequiredError, SearchError +from nomad.search import search, QueryValidationError +from nomad.metainfo.elasticsearch_extension import material_type, material_index +from .auth import create_user_dependency +from ..utils import create_responses from ..models import ( - HTTPExceptionModel, + User, + Owner, + WithQuery, + MetadataResponse, Metadata, MetadataPagination, MetadataRequired, - MetadataResponse, - Owner, - QueryParameters, - User, - WithQuery, metadata_pagination_parameters, metadata_required_parameters, + QueryParameters, + HTTPExceptionModel, ) -from ..utils import create_responses -from .auth import create_user_dependency + router = APIRouter() diff --git a/nomad/app/v1/routers/metainfo.py b/nomad/app/v1/routers/metainfo.py index a92fccbb52..882e21b6d2 100644 --- a/nomad/app/v1/routers/metainfo.py +++ b/nomad/app/v1/routers/metainfo.py @@ -19,16 +19,16 @@ import copy import datetime from typing import Any -from fastapi import APIRouter, HTTPException, Path, status +from fastapi import APIRouter, Path, status, HTTPException from pydantic import BaseModel, Field from nomad.app.v1.models import HTTPExceptionModel from nomad.app.v1.utils import create_responses -from nomad.config import config from nomad.metainfo import Package -from nomad.metainfo.metainfo import JSON, Datetime, MSection, Quantity, Section -from nomad.metainfo.mongoengine_extension import Mongo, MongoDocument -from nomad.utils import get_logger, strip +from nomad.metainfo.metainfo import MSection, Section, Quantity, Datetime, JSON +from nomad.metainfo.mongoengine_extension import MongoDocument, Mongo +from nomad.utils import strip, get_logger +from nomad.config import config logger = get_logger(__name__) diff --git a/nomad/app/v1/routers/north.py b/nomad/app/v1/routers/north.py index 73c795bcf9..c026348e6e 100644 --- a/nomad/app/v1/routers/north.py +++ b/nomad/app/v1/routers/north.py @@ -17,23 +17,23 @@ # import os -from enum import Enum - import requests -from fastapi import APIRouter, Depends, HTTPException, status -from mongoengine.queryset.visitor import Q + +from enum import Enum +from nomad.groups import get_group_ids from pydantic import BaseModel +from fastapi import APIRouter, Depends, status, HTTPException +from mongoengine.queryset.visitor import Q -from nomad.app.v1.routers.auth import generate_simple_token from nomad.config import config from nomad.config.models.north import NORTHTool -from nomad.groups import get_group_ids +from nomad.utils import strip, get_logger, slugify from nomad.processing import Upload -from nomad.utils import get_logger, slugify, strip - -from ..models import HTTPExceptionModel, User -from ..utils import create_responses +from nomad.app.v1.routers.auth import generate_simple_token from .auth import create_user_dependency +from ..models import User, HTTPExceptionModel +from ..utils import create_responses + TOOLS = {k: v for k, v in config.north.tools.filtered_items()} diff --git a/nomad/app/v1/routers/suggestions.py b/nomad/app/v1/routers/suggestions.py index 2bd6e515e3..0d0b68229f 100644 --- a/nomad/app/v1/routers/suggestions.py +++ b/nomad/app/v1/routers/suggestions.py @@ -17,17 +17,17 @@ # from collections import defaultdict - -from elasticsearch.exceptions import RequestError +from pydantic import BaseModel, Field +from fastapi import APIRouter, Depends, Request, HTTPException, status from elasticsearch_dsl import Search from elasticsearch_dsl.utils import AttrList -from fastapi import APIRouter, Depends, HTTPException, Request, status -from pydantic import BaseModel, Field +from elasticsearch.exceptions import RequestError from nomad.metainfo.elasticsearch_extension import entry_index, entry_type -from ..models import User from .auth import create_user_dependency +from ..models import User + router = APIRouter() diff --git a/nomad/app/v1/routers/systems.py b/nomad/app/v1/routers/systems.py index c92e1c44f4..6d56d61d2c 100644 --- a/nomad/app/v1/routers/systems.py +++ b/nomad/app/v1/routers/systems.py @@ -15,27 +15,29 @@ # See the License for the specific language governing permissions and # limitations under the License. # +from io import StringIO, BytesIO import sys from collections import OrderedDict from enum import Enum -from io import BytesIO, StringIO -import ase.build -import ase.io import numpy as np -from fastapi import APIRouter, Depends, HTTPException, Path, Query, status +from fastapi import APIRouter, Depends, Path, Query, status, HTTPException from fastapi.responses import Response +import ase.io +import ase.build -from nomad.atomutils import Formula, unwrap_positions, wrap_positions -from nomad.datamodel.metainfo.system import Atoms as NOMADAtoms -from nomad.normalizing.common import ase_atoms_from_nomad_atoms from nomad.units import ureg -from nomad.utils import deep_get, query_list_to_dict, strip +from nomad.utils import strip, deep_get, query_list_to_dict +from nomad.atomutils import Formula, wrap_positions, unwrap_positions +from nomad.normalizing.common import ( + ase_atoms_from_nomad_atoms, +) +from nomad.datamodel.metainfo.system import Atoms as NOMADAtoms +from .entries import answer_entry_archive_request -from ..models import HTTPExceptionModel, User -from ..utils import create_responses from .auth import create_user_dependency -from .entries import answer_entry_archive_request +from ..utils import create_responses +from ..models import User, HTTPExceptionModel router = APIRouter() diff --git a/nomad/app/v1/routers/uploads.py b/nomad/app/v1/routers/uploads.py index fa6ff235ca..5c54007014 100644 --- a/nomad/app/v1/routers/uploads.py +++ b/nomad/app/v1/routers/uploads.py @@ -15,79 +15,92 @@ # See the License for the specific language governing permissions and # limitations under the License. # -import io import os +import io import shutil -import tarfile import zipfile -from datetime import datetime +import tarfile from enum import Enum +from datetime import datetime from typing import Any, cast +from pydantic import ( + field_validator, + ConfigDict, + BaseModel, + Field, + model_validator, +) +from mongoengine.queryset.visitor import Q from urllib.parse import unquote - from fastapi import ( APIRouter, - Body, - Depends, - File, - HTTPException, - Path, Request, + File, UploadFile, status, + Depends, + Body, + Path, + Query as FastApiQuery, + HTTPException, ) -from fastapi import Query as FastApiQuery +from fastapi.responses import StreamingResponse, FileResponse from fastapi.exceptions import RequestValidationError -from fastapi.responses import FileResponse, StreamingResponse -from mongoengine.queryset.visitor import Q -from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator from pydantic_core import PydanticCustomError -from nomad import files, utils -from nomad.bundles import BundleExporter, BundleImporter -from nomad.common import get_compression_format, is_safe_basename, is_safe_relative_path +from nomad import utils, files +from nomad.common import is_safe_relative_path, is_safe_basename from nomad.config import config -from nomad.config.models.config import Reprocess from nomad.config.models.plugins import ExampleUploadEntryPoint -from nomad.files import PublicUploadFiles, StagingUploadFiles +from nomad.files import ( + StagingUploadFiles, + PublicUploadFiles, +) +from nomad.bundles import BundleExporter, BundleImporter +from nomad.config.models.config import Reprocess from nomad.groups import get_group_ids from nomad.processing import ( + Upload, Entry, - MetadataEditRequestHandler, ProcessAlreadyRunning, ProcessStatus, - Upload, + MetadataEditRequestHandler, ) -from nomad.search import QueryValidationError, search, search_iterator -from nomad.search import refresh as search_refresh +from nomad.common import get_compression_format from nomad.utils import strip +from nomad.search import ( + search, + search_iterator, + refresh as search_refresh, + QueryValidationError, +) +from .auth import create_user_dependency, generate_upload_token from ..models import ( - Direction, - Files, - HTTPExceptionModel, - MetadataEditRequest, MetadataPagination, - MetadataRequired, - Owner, + User, + Direction, Pagination, PaginationResponse, - User, - WithQuery, + HTTPExceptionModel, + Files, files_parameters, + Owner, + WithQuery, + MetadataRequired, + MetadataEditRequest, restrict_query_to_upload, ) +from .entries import EntryArchiveResponse, answer_entry_archive_request from ..utils import ( + parameter_dependency_from_model, + create_responses, DownloadItem, browser_download_headers, - create_download_stream_raw_file, create_download_stream_zipped, - create_responses, + create_download_stream_raw_file, create_stream_from_string, - parameter_dependency_from_model, ) -from .auth import create_user_dependency, generate_upload_token -from .entries import EntryArchiveResponse, answer_entry_archive_request router = APIRouter() diff --git a/nomad/app/v1/routers/users.py b/nomad/app/v1/routers/users.py index 3e48ee8995..50c003e806 100644 --- a/nomad/app/v1/routers/users.py +++ b/nomad/app/v1/routers/users.py @@ -18,16 +18,16 @@ from enum import Enum -from fastapi import APIRouter, Depends, HTTPException, Query, status +from fastapi import Depends, APIRouter, status, HTTPException, Query from pydantic.main import BaseModel -from nomad import datamodel, infrastructure +from nomad import infrastructure, datamodel from nomad.config import config from nomad.utils import strip -from ..models import HTTPExceptionModel, User -from ..utils import create_responses from .auth import create_user_dependency +from ..models import User, HTTPExceptionModel +from ..utils import create_responses router = APIRouter() diff --git a/nomad/app/v1/utils.py b/nomad/app/v1/utils.py index c62316fe4e..1a6b04574c 100644 --- a/nomad/app/v1/utils.py +++ b/nomad/app/v1/utils.py @@ -16,21 +16,19 @@ # limitations under the License. # -import gzip -import inspect +from typing import Any +from collections.abc import Iterator +from types import FunctionType +import urllib import io import json -import lzma import os -import urllib -from collections.abc import Iterator -from types import FunctionType -from typing import Any - -from fastapi import HTTPException, Query, Request, status # noqa: F401 -from pydantic import BaseModel, ValidationError # noqa: F401 - -from nomad.files import StreamedFile, UploadFiles, create_zipstream +import inspect +from fastapi import Request, Query, HTTPException, status # noqa: F401 +from pydantic import ValidationError, BaseModel # noqa: F401 +import gzip +import lzma +from nomad.files import UploadFiles, StreamedFile, create_zipstream def parameter_dependency_from_model( diff --git a/nomad/archive/converter.py b/nomad/archive/converter.py index 96b6e494fd..b72233f3ff 100644 --- a/nomad/archive/converter.py +++ b/nomad/archive/converter.py @@ -21,14 +21,15 @@ import functools import hashlib import os.path import signal -from collections.abc import Callable, Iterable from concurrent.futures import ProcessPoolExecutor from multiprocessing import Manager +from collections.abc import Callable +from collections.abc import Iterable -from nomad.archive import read_archive, to_json -from nomad.archive.storage_v2 import ArchiveWriter as ArchiveWriterNew from nomad.config import config -from nomad.files import PublicUploadFiles, StagingUploadFiles +from nomad.archive import to_json, read_archive +from nomad.archive.storage_v2 import ArchiveWriter as ArchiveWriterNew +from nomad.files import StagingUploadFiles, PublicUploadFiles from nomad.infrastructure import setup from nomad.processing import Upload diff --git a/nomad/archive/partial.py b/nomad/archive/partial.py index 6d0f4012f0..0f503dbd06 100644 --- a/nomad/archive/partial.py +++ b/nomad/archive/partial.py @@ -20,16 +20,16 @@ from typing import Any from nomad import infrastructure from nomad.config import config -from nomad.datamodel import EntryArchive -from nomad.datamodel.metainfo.common import FastAccess from nomad.metainfo import ( - Definition, MSection, + Definition, Quantity, Reference, - Section, SubSection, + Section, ) +from nomad.datamodel import EntryArchive +from nomad.datamodel.metainfo.common import FastAccess def create_partial_archive(archive: EntryArchive) -> dict: diff --git a/nomad/archive/query.py b/nomad/archive/query.py index 09696fcdbc..2097a2f7ba 100644 --- a/nomad/archive/query.py +++ b/nomad/archive/query.py @@ -18,13 +18,13 @@ import functools import re +from typing import Any from collections.abc import Callable from io import BytesIO -from typing import Any from nomad import utils -from .storage import ArchiveDict, ArchiveList, ArchiveReader, read_archive, to_json +from .storage import ArchiveReader, ArchiveList, ArchiveDict, to_json, read_archive _query_archive_key_pattern = re.compile(r'^([\s\w\-]+)(\[([-?0-9]*)(:([-?0-9]*))?])?$') diff --git a/nomad/archive/required.py b/nomad/archive/required.py index 402e116ad6..df5fa96f51 100644 --- a/nomad/archive/required.py +++ b/nomad/archive/required.py @@ -28,25 +28,24 @@ from fastapi import HTTPException from nomad import utils from nomad.metainfo import ( Definition, - Package, + Section, Quantity, - QuantityReference, + SubSection, Reference, - Section, + QuantityReference, SectionReference, - SubSection, + Package, ) - -from ..datamodel.context import ServerContext, parse_path from .query import ( ArchiveQueryError, - _extract_child, - _extract_key_and_index, - _query_archive_key_pattern, to_json, + _query_archive_key_pattern, + _extract_key_and_index, + _extract_child, ) -from .storage import ArchiveDict, ArchiveError, ArchiveList, ArchiveReader +from .storage import ArchiveReader, ArchiveList, ArchiveError, ArchiveDict from .storage_v2 import ArchiveDict as NewArchiveDict +from ..datamodel.context import parse_path, ServerContext class RequiredValidationError(Exception): diff --git a/nomad/archive/storage.py b/nomad/archive/storage.py index 29102e1eae..fa90306564 100644 --- a/nomad/archive/storage.py +++ b/nomad/archive/storage.py @@ -17,10 +17,12 @@ # from __future__ import annotations -import struct -from collections.abc import Generator, Mapping, Sequence -from io import BufferedReader, BytesIO from typing import Any, cast +from collections.abc import Generator +from io import BytesIO, BufferedReader +from collections.abc import Mapping, Sequence + +import struct import msgspec @@ -326,8 +328,10 @@ def read_archive(file_or_path: str | BytesIO, **kwargs) -> ArchiveReader: will lazily load data as it is used. The mapping needs to be closed or used within a 'with' statement to free the underlying file resource after use. """ - from .storage_v2 import ArchiveReader as ArchiveReaderNew - from .storage_v2 import ArchiveWriter as ArchiveWriterNew + from .storage_v2 import ( + ArchiveWriter as ArchiveWriterNew, + ArchiveReader as ArchiveReaderNew, + ) # todo: replace implementation to enable automatic conversion # if isinstance(file_or_path, str): diff --git a/nomad/archive/storage_v2.py b/nomad/archive/storage_v2.py index ffb8fdaf6f..6a5d1e59af 100644 --- a/nomad/archive/storage_v2.py +++ b/nomad/archive/storage_v2.py @@ -27,8 +27,8 @@ from bitarray import bitarray from msgpack import Unpacker from nomad import utils -from nomad.archive import ArchiveError from nomad.config import config +from nomad.archive import ArchiveError _packer = msgpack.Packer(autoreset=True, use_bin_type=True) diff --git a/nomad/atomutils.py b/nomad/atomutils.py index d0deb7ded1..3b7a6f5cc1 100644 --- a/nomad/atomutils.py +++ b/nomad/atomutils.py @@ -23,10 +23,14 @@ import itertools import logging import math import re -from collections.abc import Iterable from functools import reduce from string import ascii_uppercase -from typing import TYPE_CHECKING, Any, cast +from typing import ( + TYPE_CHECKING, + Any, + cast, +) +from collections.abc import Iterable import ase.data import ase.geometry diff --git a/nomad/bundles.py b/nomad/bundles.py index 93c45612e1..9ed5ef6316 100644 --- a/nomad/bundles.py +++ b/nomad/bundles.py @@ -8,36 +8,35 @@ # See the License for the specific language governing permissions and # limitations under the License. # -import json -import os +from typing import cast, Any from collections.abc import Iterable +import os +import json from datetime import datetime, timedelta -from typing import Any, cast - -from fastapi import HTTPException, status from packaging import version -from nomad import datamodel, search, utils +from nomad import utils, datamodel, search from nomad.config import config -from nomad.config.models.config import BundleExportSettings, BundleImportSettings +from nomad.config.models.config import BundleImportSettings, BundleExportSettings from nomad.files import ( - BrowsableFileSource, - CombinedFileSource, - DiskFileSource, - FileSource, + zipfile, PathObject, + UploadFiles, PublicUploadFiles, StagingUploadFiles, - StandardJSONDecoder, + FileSource, + BrowsableFileSource, + CombinedFileSource, StreamedFileSource, - UploadFiles, + DiskFileSource, ZipFileSource, - bundle_info_filename, json_to_streamed_file, - zipfile, + bundle_info_filename, + StandardJSONDecoder, ) from nomad.processing.base import ProcessStatus -from nomad.processing.data import Entry, Upload, mongo_entry_metadata +from nomad.processing.data import Upload, Entry, mongo_entry_metadata +from fastapi import HTTPException, status class BundleExporter: diff --git a/nomad/cli/admin/admin.py b/nomad/cli/admin/admin.py index 75f5cc8817..7c02a16cdd 100644 --- a/nomad/cli/admin/admin.py +++ b/nomad/cli/admin/admin.py @@ -18,8 +18,8 @@ import click -from nomad.cli.cli import cli from nomad.config import config +from nomad.cli.cli import cli @cli.group( @@ -68,8 +68,7 @@ def reset(remove, i_am_really_sure): def reset_processing(zero_complete_time): from datetime import datetime - from nomad import infrastructure - from nomad import processing as proc + from nomad import infrastructure, processing as proc infrastructure.setup_mongo() @@ -110,11 +109,9 @@ def reset_processing(zero_complete_time): ) def lift_embargo(dry, parallel): from datetime import datetime - from dateutil.relativedelta import relativedelta - from nomad import infrastructure - from nomad import processing as proc + from nomad import infrastructure, processing as proc from nomad.search import quantity_values infrastructure.setup_mongo() @@ -418,7 +415,6 @@ def migrate_mongo( import sys from pymongo.database import Database - from nomad import infrastructure from nomad.cli.admin import migrate @@ -494,10 +490,9 @@ def migrate_mongo( ) def rewrite_doi_urls(dois, dry, save_existing_records): import json - import requests - from nomad.doi import _create_dataset_url, edit_doi_url + from nomad.doi import edit_doi_url, _create_dataset_url existing_records = [] diff --git a/nomad/cli/admin/clean.py b/nomad/cli/admin/clean.py index 2522466c06..6ca3d6c7ca 100644 --- a/nomad/cli/admin/clean.py +++ b/nomad/cli/admin/clean.py @@ -39,13 +39,13 @@ from .admin import admin def clean(dry, skip_entries, skip_fs, skip_es, staging_too, force): import os import shutil - - import elasticsearch_dsl import tabulate + import elasticsearch_dsl from nomad import infrastructure, processing from nomad.config import config as nomad_config - from nomad.search import delete_by_query, quantity_values + from nomad.search import delete_by_query + from nomad.search import quantity_values mongo_client = infrastructure.setup_mongo() infrastructure.setup_elastic() diff --git a/nomad/cli/admin/entries.py b/nomad/cli/admin/entries.py index 91728ae86d..54ac693eed 100644 --- a/nomad/cli/admin/entries.py +++ b/nomad/cli/admin/entries.py @@ -33,8 +33,7 @@ def entries(): ) @click.option('--skip-mongo', help='Keep uploads and entries in mongo.', is_flag=True) def rm(entries, skip_es, skip_mongo): - from nomad import infrastructure, search - from nomad import processing as proc + from nomad import processing as proc, infrastructure, search infrastructure.setup_mongo() infrastructure.setup_elastic() diff --git a/nomad/cli/admin/migrate.py b/nomad/cli/admin/migrate.py index 5f28df89b1..495423de7c 100644 --- a/nomad/cli/admin/migrate.py +++ b/nomad/cli/admin/migrate.py @@ -19,15 +19,15 @@ import time from datetime import datetime from typing import Any - from pydantic import BaseModel -from pymongo import ReplaceOne -from pymongo.database import Collection, Database +from pymongo import ReplaceOne +from pymongo.database import Database, Collection from nomad import utils +from nomad.processing import ProcessStatus, Upload, Entry from nomad.datamodel import Dataset from nomad.parsing.parsers import parser_dict -from nomad.processing import Entry, ProcessStatus, Upload + _upload_keys_to_remove_v0 = ( 'published', diff --git a/nomad/cli/admin/run.py b/nomad/cli/admin/run.py index 1739b89c1e..ab846f3e0e 100644 --- a/nomad/cli/admin/run.py +++ b/nomad/cli/admin/run.py @@ -75,9 +75,9 @@ def run_app( # port = port or config.services.api_port if with_gui: - import glob import os import os.path + import glob import shutil gui_folder = os.path.abspath( @@ -122,9 +122,8 @@ def run_app( from nomad.utils import get_logger if gunicorn: - import logging.config - from gunicorn.app.wsgiapp import WSGIApplication + import logging.config if log_config: logging.config.fileConfig(log_config) @@ -153,7 +152,7 @@ def run_app( get_logger(__name__).info('created gunicorn server', data=str(gunicorn_app.cfg)) gunicorn_app.run() else: - from uvicorn import Config, Server + from uvicorn import Server, Config kwargs['log_config'] = log_config @@ -183,11 +182,10 @@ def run_worker(*, workers=None): def run_hub(): + from jupyterhub.app import main + import sys import os import subprocess - import sys - - from jupyterhub.app import main if 'JUPYTERHUB_CRYPT_KEY' not in os.environ: crypt_key = config.north.jupyterhub_crypt_key diff --git a/nomad/cli/admin/springer.py b/nomad/cli/admin/springer.py index dec3b88fdc..23b3c59e33 100644 --- a/nomad/cli/admin/springer.py +++ b/nomad/cli/admin/springer.py @@ -23,18 +23,17 @@ http://materials.springer.com. The database is stuctured as space_group_number : normalized_formula : springer_id : entry """ -import os.path -import re -import time from typing import Any - -import bs4 import requests +import re +import bs4 +import time +import os.path import nomad.archive.storage_v2 from nomad import archive -from nomad.archive import read_archive from nomad.config import config +from nomad.archive import read_archive required_items = { 'Alphabetic Formula:': 'alphabetic_formula', diff --git a/nomad/cli/admin/uploads.py b/nomad/cli/admin/uploads.py index c55c64948f..cd1cd9eb7a 100644 --- a/nomad/cli/admin/uploads.py +++ b/nomad/cli/admin/uploads.py @@ -25,7 +25,6 @@ import click from orjson import dumps from nomad.config import config - from .admin import admin @@ -35,8 +34,7 @@ def _run_parallel( import threading import time - from nomad import processing as proc - from nomad import utils + from nomad import utils, processing as proc if isinstance(uploads, tuple | list): uploads_count = len(uploads) @@ -239,13 +237,11 @@ def _query_uploads( list of upoad ids and further filter parameters. """ - import json from typing import cast - + import json from mongoengine import Q - from nomad import infrastructure, search - from nomad import processing as proc + from nomad import infrastructure, processing as proc, search from nomad.app.v1 import models infrastructure.setup_mongo() @@ -355,13 +351,12 @@ def _query_uploads( @click.pass_context def export(ctx, uploads, required, output: str): import sys - import time - import zipfile - - from nomad.archive import ArchiveQueryError, RequiredReader - from nomad.files import UploadFiles from nomad.processing import Entry from nomad.utils import get_logger + from nomad.files import UploadFiles + from nomad.archive import ArchiveQueryError, RequiredReader + import time + import zipfile logger = get_logger(__name__) @@ -634,8 +629,7 @@ def index(ctx, uploads, parallel, transformer, skip_materials, print_progress): def delete_upload( upload, skip_es: bool = False, skip_files: bool = False, skip_mongo: bool = False ): - from nomad import files, search, utils - from nomad import processing as proc + from nomad import search, files, utils, processing as proc # delete elastic if not skip_es: @@ -788,8 +782,7 @@ def re_pack(ctx, uploads): def stop(ctx, uploads, entries: bool, kill: bool, no_celery: bool): import mongoengine - from nomad import processing as proc - from nomad import utils + from nomad import utils, processing as proc query, _ = _query_uploads(uploads, **ctx.obj.uploads_kwargs) @@ -918,8 +911,9 @@ def integrity( ): from nomad.app.v1.models import MetadataPagination, MetadataRequired from nomad.archive.storage_v2 import ArchiveWriter - from nomad.files import PublicUploadFiles, StagingUploadFiles - from nomad.processing import Entry, Upload + from nomad.files import StagingUploadFiles, PublicUploadFiles + from nomad.processing import Entry + from nomad.processing import Upload from nomad.search import search def search_params(upload_id: str): @@ -1306,8 +1300,8 @@ def export_bundle( def import_bundle( ctx, input_path, multi, settings, embargo_length, use_celery, ignore_errors ): - from nomad import infrastructure from nomad.bundles import BundleImporter + from nomad import infrastructure for key, value in ctx.obj.uploads_kwargs.items(): if value: diff --git a/nomad/cli/admin/users.py b/nomad/cli/admin/users.py index 7752903f29..21253fb313 100644 --- a/nomad/cli/admin/users.py +++ b/nomad/cli/admin/users.py @@ -29,10 +29,10 @@ def users(): @users.command(help='Import users to keycloak from a JSON file.', name='import') @click.argument('PATH_TO_USERS_FILE', type=str, nargs=1) def import_command(path_to_users_file): - import datetime import json + import datetime - from nomad import datamodel, infrastructure, utils + from nomad import infrastructure, datamodel, utils with open(path_to_users_file) as f: users = json.load(f) diff --git a/nomad/cli/aflow.py b/nomad/cli/aflow.py index eec1729ad7..501b5f3764 100644 --- a/nomad/cli/aflow.py +++ b/nomad/cli/aflow.py @@ -20,27 +20,26 @@ # code will fail. # TODO The metadata should not be set via API, but added to the uploads as nomad.json. -import io -import json -import os +import requests import re import subprocess +from urllib import parse as urllib_parse +import os import tarfile import threading import time +import io +import re import uuid -from urllib import parse as urllib_parse - +import json +import numpy as np import ase import bs4 import matid # pylint: disable=import-error -import numpy as np -import requests -from nomad import atomutils, client -from nomad import processing as proc -from nomad.client import api, upload_file +from nomad import atomutils, client, processing as proc from nomad.config import config +from nomad.client import api, upload_file class DbUpdater: diff --git a/nomad/cli/cli.py b/nomad/cli/cli.py index 316293d1cb..4120b883cc 100644 --- a/nomad/cli/cli.py +++ b/nomad/cli/cli.py @@ -16,11 +16,10 @@ # limitations under the License. # +import click import logging import os -import click - from nomad import utils from nomad.config import config diff --git a/nomad/cli/client/integrationtests.py b/nomad/cli/client/integrationtests.py index 0f99ca2327..744cba59c8 100644 --- a/nomad/cli/client/integrationtests.py +++ b/nomad/cli/client/integrationtests.py @@ -21,9 +21,9 @@ A command that runs some example operations on a working nomad@FAIRDI installati as a final integration test. """ -import json -import os import time +import os +import json from nomad.client import api diff --git a/nomad/cli/dev.py b/nomad/cli/dev.py index 4491c228e9..7a3b4a11ad 100644 --- a/nomad/cli/dev.py +++ b/nomad/cli/dev.py @@ -15,18 +15,17 @@ # limitations under the License. # +from typing import Any +import sys import json import os -import sys -from typing import Any - import click + from pint import Unit from pint.errors import UndefinedUnitError from nomad.config import config from nomad.metainfo.elasticsearch_extension import schema_separator - from .cli import cli @@ -81,8 +80,8 @@ def gui_qa(skip_tests: bool): @dev.command(help='Export an API model in JSON schema.') @click.argument('model') def api_model(model): - import importlib import json + import importlib def remove_null_types(data): """ @@ -124,11 +123,11 @@ def api_model(model): 'nomad.app.v1.models.graph.GraphRequest', 'nomad.app.v1.models.graph.GraphResponse', ]: - from nomad.app.v1.models.graph.graph_models import Graph from nomad.app.v1.models.graph.utils import ( generate_request_model, generate_response_model, ) + from nomad.app.v1.models.graph.graph_models import Graph sys.modules['nomad.app.v1.models.graph.utils'].ref_prefix = '#/definitions' sys.modules['nomad.app.v1.models.graph.utils'].graph_model_export = True @@ -189,8 +188,8 @@ def metainfo(): def _generate_search_quantities(): # Currently only quantities with "entry_type" are included. + from nomad.metainfo.elasticsearch_extension import entry_type, Elasticsearch from nomad.datamodel import EntryArchive - from nomad.metainfo.elasticsearch_extension import Elasticsearch, entry_type def to_dict(search_quantity, section=False, repeats=False): if section: @@ -350,9 +349,8 @@ def gui_config(): '--parser', help='Only updated the README of the given parsers subdirctory.' ) def update_parser_readmes(parser): - import re from glob import glob - + import re import yaml os.chdir(os.path.join(os.path.dirname(__file__), '../..')) @@ -491,10 +489,8 @@ def example_data(username: str): def _generate_units_json() -> tuple[Any, Any]: - from collections import defaultdict - from pint.converters import ScaleConverter - + from collections import defaultdict from nomad.units import ureg # TODO: Check that all units are unambiguously defined, and that there are diff --git a/nomad/cli/parse.py b/nomad/cli/parse.py index 275cdf80ce..723796dfba 100644 --- a/nomad/cli/parse.py +++ b/nomad/cli/parse.py @@ -84,12 +84,12 @@ def _parse( save_plot_dir, ): import json - import os import sys + import os - from nomad import utils from nomad.client import normalize_all, parse from nomad.datamodel.metainfo.plot import resolve_plot_references + from nomad import utils kwargs = dict( strict=not not_strict, diff --git a/nomad/client/api.py b/nomad/client/api.py index fe85171217..414eb02a03 100644 --- a/nomad/client/api.py +++ b/nomad/client/api.py @@ -16,10 +16,9 @@ # limitations under the License. # -import time - import requests from keycloak import KeycloakOpenID +import time from nomad.config import config diff --git a/nomad/client/archive.py b/nomad/client/archive.py index 1c0f496e09..971d87ef06 100644 --- a/nomad/client/archive.py +++ b/nomad/client/archive.py @@ -18,19 +18,19 @@ from __future__ import annotations import asyncio -import threading from asyncio import Semaphore from itertools import islice -from time import monotonic from typing import Any +from time import monotonic +import threading from click import progressbar -from httpx import AsyncClient, Timeout +from httpx import Timeout, AsyncClient from keycloak import KeycloakOpenID from nomad import metainfo as mi from nomad.config import config -from nomad.datamodel import ClientContext, EntryArchive +from nomad.datamodel import EntryArchive, ClientContext from nomad.utils import dict_to_dataframe diff --git a/nomad/client/processing.py b/nomad/client/processing.py index 03d54ba78c..3445fc8871 100644 --- a/nomad/client/processing.py +++ b/nomad/client/processing.py @@ -16,14 +16,15 @@ # limitations under the License. # -import io import os -import sys +import io import typing +import sys -from nomad import datamodel, utils +from nomad import utils, datamodel from nomad.config import config + from .api import Auth diff --git a/nomad/client/upload.py b/nomad/client/upload.py index 8b2c6f4c38..e800b8da04 100644 --- a/nomad/client/upload.py +++ b/nomad/client/upload.py @@ -41,8 +41,8 @@ def upload_file( Returns: The upload_id if successful or None if not. """ - from nomad.client import api from nomad.processing import ProcessStatus + from nomad.client import api if local_path: response = api.post( diff --git a/nomad/common.py b/nomad/common.py index 181c232cbe..e3f7bc67a3 100644 --- a/nomad/common.py +++ b/nomad/common.py @@ -24,11 +24,10 @@ source code without circular imports. import os import pkgutil import shutil -import tarfile import zipfile -from tempfile import TemporaryDirectory +import tarfile from typing import Literal - +from tempfile import TemporaryDirectory import httpx diff --git a/nomad/config/models/common.py b/nomad/config/models/common.py index 02f68c3814..576c4aa03d 100644 --- a/nomad/config/models/common.py +++ b/nomad/config/models/common.py @@ -16,9 +16,8 @@ # limitations under the License. # -from typing import Any, TypeVar, cast - -from pydantic import BaseModel, ConfigDict, Field, model_validator # noqa: F401 +from typing import Any, cast, TypeVar +from pydantic import ConfigDict, model_validator, BaseModel, Field # noqa: F401 ConfigBaseModelBound = TypeVar('ConfigBaseModelBound', bound='ConfigBaseModel') diff --git a/nomad/config/models/config.py b/nomad/config/models/config.py index 385f0d8ba6..ffba90ddc9 100644 --- a/nomad/config/models/config.py +++ b/nomad/config/models/config.py @@ -23,7 +23,13 @@ from importlib.metadata import version from typing import Any import yaml -from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator +from pydantic import ( + BaseModel, + field_validator, + model_validator, + Field, + ConfigDict, +) try: __version__ = version('nomad-lab') @@ -33,12 +39,15 @@ except Exception: # noqa from importlib.metadata import entry_points -from nomad.common import get_package_path -from .common import ConfigBaseModel, Options +from .common import ( + ConfigBaseModel, + Options, +) from .north import NORTH from .plugins import EntryPointType, PluginPackage, Plugins from .ui import UI +from nomad.common import get_package_path warnings.filterwarnings('ignore', message='numpy.dtype size changed') warnings.filterwarnings('ignore', message='numpy.ufunc size changed') diff --git a/nomad/config/models/plugins.py b/nomad/config/models/plugins.py index 6ab4180329..d0fe2af9f0 100644 --- a/nomad/config/models/plugins.py +++ b/nomad/config/models/plugins.py @@ -16,16 +16,15 @@ # limitations under the License. # -import importlib import os -import shutil import sys +import shutil from abc import ABCMeta, abstractmethod -from typing import TYPE_CHECKING, Literal, Union, cast - -from pydantic import BaseModel, Field, model_validator +import importlib +from typing import Union, Literal, cast, TYPE_CHECKING +from pydantic import model_validator, BaseModel, Field -from nomad.common import download_file, get_package_path, is_safe_relative_path, is_url +from nomad.common import get_package_path, download_file, is_url, is_safe_relative_path from .common import Options from .ui import App @@ -33,11 +32,10 @@ from .ui import App example_prefix = '__examples__' if TYPE_CHECKING: - from fastapi import FastAPI - from nomad.metainfo import SchemaPackage from nomad.normalizing import Normalizer as NormalizerBaseClass from nomad.parsing import Parser as ParserBaseClass + from fastapi import FastAPI class EntryPoint(BaseModel): @@ -764,8 +762,8 @@ def add_plugin(plugin: Schema) -> None: def remove_plugin(plugin) -> None: """Function for removing a plugin.""" from nomad.config import config - from nomad.metainfo import Package from nomad.metainfo.elasticsearch_extension import entry_type + from nomad.metainfo import Package # Remove from path try: diff --git a/nomad/config/models/ui.py b/nomad/config/models/ui.py index ed171ebd81..3e42990c93 100644 --- a/nomad/config/models/ui.py +++ b/nomad/config/models/ui.py @@ -17,17 +17,18 @@ # from enum import Enum -from typing import Annotated, Literal, Union - -from pydantic import BaseModel, ConfigDict, Field, model_validator +from typing import Union +from typing import Literal +from typing import Annotated +from pydantic import BaseModel, ConfigDict, model_validator, Field from .common import ( ConfigBaseModel, Options, - OptionsBase, - OptionsGlob, - OptionsMulti, OptionsSingle, + OptionsMulti, + OptionsGlob, + OptionsBase, ) @@ -115,9 +116,8 @@ class UnitSystem(ConfigBaseModel): values = values.model_dump(exclude_none=True) """Adds SI defaults for dimensions that are missing a unit.""" units = values.get('units', {}) - from pint import UndefinedUnitError - from nomad.units import ureg + from pint import UndefinedUnitError # Check that only supported dimensions and units are used for key in units.keys(): diff --git a/nomad/datamodel/context.py b/nomad/datamodel/context.py index 3c4529c903..e9ca61a9ee 100644 --- a/nomad/datamodel/context.py +++ b/nomad/datamodel/context.py @@ -16,19 +16,24 @@ # limitations under the License. # -import os.path -import re from urllib.parse import urlsplit, urlunsplit +import re +import os.path import requests from nomad import utils from nomad.config import config -from nomad.datamodel import EntryArchive -from nomad.datamodel.datamodel import EntryMetadata from nomad.datamodel.util import parse_path -from nomad.metainfo import Context as MetainfoContext -from nomad.metainfo import MetainfoReferenceError, MSection, Package, Quantity +from nomad.datamodel.datamodel import EntryMetadata +from nomad.metainfo import ( + Context as MetainfoContext, + MSection, + Quantity, + MetainfoReferenceError, + Package, +) +from nomad.datamodel import EntryArchive class Context(MetainfoContext): diff --git a/nomad/datamodel/data.py b/nomad/datamodel/data.py index ca029f8963..595156644c 100644 --- a/nomad/datamodel/data.py +++ b/nomad/datamodel/data.py @@ -17,23 +17,24 @@ # import os.path -from typing import Any from cachetools import TTLCache, cached + +from typing import Any from pydantic import Field from nomad.config import config from nomad.metainfo.elasticsearch_extension import Elasticsearch, material_entry_type from nomad.metainfo.metainfo import ( - JSON, - Capitalized, Category, - Datetime, MCategory, MSection, Quantity, - Reference, + Capitalized, Section, + Datetime, + Reference, + JSON, ) from nomad.metainfo.pydantic_extension import PydanticModel @@ -95,8 +96,8 @@ class EntryData(ArchiveSection): def normalize(self, archive, logger): super().normalize(archive, logger) - from nomad.datamodel import EntryArchive from nomad.datamodel.results import Results + from nomad.datamodel import EntryArchive # TODO entry_type should only be assigned if not already defined (done to pass eln test) if archive.metadata: diff --git a/nomad/datamodel/datamodel.py b/nomad/datamodel/datamodel.py index 3b048eec51..f32012bc14 100644 --- a/nomad/datamodel/datamodel.py +++ b/nomad/datamodel/datamodel.py @@ -18,40 +18,39 @@ """All generic entry metadata and related classes.""" -import os.path -from enum import Enum from typing import Any +from enum import Enum +import os.path import rfc3161ng from elasticsearch_dsl import analyzer, tokenizer from nomad import utils from nomad.datamodel.metainfo.common import FastAccess +from nomad.metainfo.mongoengine_extension import Mongo, MongoDocument +from nomad.metainfo.pydantic_extension import PydanticModel from nomad.metainfo.elasticsearch_extension import ( Elasticsearch, - create_searchable_quantity, material_entry_type, + entry_type as es_entry_type, + create_searchable_quantity, ) -from nomad.metainfo.elasticsearch_extension import entry_type as es_entry_type -from nomad.metainfo.mongoengine_extension import Mongo, MongoDocument -from nomad.metainfo.pydantic_extension import PydanticModel - +from .util import parse_path from ..metainfo import ( - JSON, Bytes, - Datetime, + Package, Definition, - MCategory, - MEnum, MSection, - Package, - Quantity, + MCategory, Section, SubSection, + Quantity, + MEnum, + Datetime, + JSON, ) from ..metainfo.data_type import m_str from ..metainfo.metainfo import Reference -from .util import parse_path # This is usually defined automatically when the first metainfo definition is evaluated, but # due to the next imports requiring the m_package already, this would be too late. diff --git a/nomad/datamodel/hdf5.py b/nomad/datamodel/hdf5.py index daf56c68ad..fa04a76f94 100644 --- a/nomad/datamodel/hdf5.py +++ b/nomad/datamodel/hdf5.py @@ -17,16 +17,16 @@ # from __future__ import annotations -import re from typing import Any - import h5py +import re + import numpy as np import pint from h5py import File -from nomad.datamodel.metainfo.annotations import H5WebAnnotation from nomad.metainfo.data_type import NonPrimitive +from nomad.datamodel.metainfo.annotations import H5WebAnnotation from nomad.utils import get_logger LOGGER = get_logger(__name__) diff --git a/nomad/datamodel/metainfo/action.py b/nomad/datamodel/metainfo/action.py index 8f219878de..a4c73d3de5 100644 --- a/nomad/datamodel/metainfo/action.py +++ b/nomad/datamodel/metainfo/action.py @@ -16,7 +16,7 @@ # limitations under the License. # from nomad.datamodel.data import ArchiveSection -from nomad.metainfo import Package, Quantity +from nomad.metainfo import Quantity, Package m_package = Package() diff --git a/nomad/datamodel/metainfo/annotations.py b/nomad/datamodel/metainfo/annotations.py index ed177b2541..fb9fc11324 100644 --- a/nomad/datamodel/metainfo/annotations.py +++ b/nomad/datamodel/metainfo/annotations.py @@ -16,19 +16,18 @@ # limitations under the License. # -import re -from enum import Enum from typing import Any +from enum import Enum +from pydantic import field_validator, ConfigDict, Field, model_validator +import re -from pydantic import ConfigDict, Field, field_validator, model_validator from pydantic.main import BaseModel -from nomad.metainfo import AnnotationModel, Datetime, MEnum, Quantity, Reference from nomad.utils import strip - -from ...metainfo.data_type import Datatype -from ..data import Query +from nomad.metainfo import AnnotationModel, MEnum, Datetime, Reference, Quantity from .plot import PlotlyError +from ..data import Query +from ...metainfo.data_type import Datatype class ELNComponentEnum(str, Enum): diff --git a/nomad/datamodel/metainfo/basesections/v1.py b/nomad/datamodel/metainfo/basesections/v1.py index eacde4ab5e..69cebd02de 100644 --- a/nomad/datamodel/metainfo/basesections/v1.py +++ b/nomad/datamodel/metainfo/basesections/v1.py @@ -20,8 +20,8 @@ import os import random import re import time -from collections.abc import Iterable from typing import TYPE_CHECKING +from collections.abc import Iterable import h5py import numpy as np @@ -29,17 +29,22 @@ import requests from ase.data import atomic_masses, atomic_numbers, chemical_symbols from unidecode import unidecode -from nomad.datamodel.metainfo.workflow import Link, Task, TaskReference, Workflow from nomad.metainfo import SchemaPackage +from nomad.datamodel.metainfo.workflow import Link, Task, TaskReference, Workflow from nomad.metainfo.data_type import m_str if TYPE_CHECKING: - from structlog.stdlib import BoundLogger + from structlog.stdlib import ( + BoundLogger, + ) from nomad import utils from nomad.atomutils import Formula from nomad.datamodel.data import ArchiveSection, EntryData -from nomad.datamodel.metainfo.annotations import ELNAnnotation, HDF5Annotation +from nomad.datamodel.metainfo.annotations import ( + ELNAnnotation, + HDF5Annotation, +) from nomad.datamodel.results import ELN, Material, Results from nomad.datamodel.results import ElementalComposition as ResultsElementalComposition from nomad.datamodel.util import create_custom_mapping @@ -2034,7 +2039,6 @@ class PublicationReference(ArchiveSection): super().normalize(archive, logger) import dateutil.parser import requests - from nomad.datamodel.datamodel import EntryMetadata # Parse journal name, lead author and publication date from crossref diff --git a/nomad/datamodel/metainfo/basesections/v2.py b/nomad/datamodel/metainfo/basesections/v2.py index 1ad7e401f7..01aad791e1 100644 --- a/nomad/datamodel/metainfo/basesections/v2.py +++ b/nomad/datamodel/metainfo/basesections/v2.py @@ -15,39 +15,62 @@ # See the License for the specific language governing permissions and # limitations under the License. # -import datetime import os +from typing import TYPE_CHECKING +from collections.abc import Iterable import random -import re import time -from collections.abc import Iterable -from typing import TYPE_CHECKING +import datetime +import re -import h5py +from unidecode import unidecode import numpy as np +import h5py +from ase.data import ( + chemical_symbols, + atomic_numbers, + atomic_masses, +) import requests -from ase.data import atomic_masses, atomic_numbers, chemical_symbols -from unidecode import unidecode from nomad.datamodel.metainfo.workflow import Link, Task, Workflow from nomad.metainfo.data_type import m_str if TYPE_CHECKING: - from structlog.stdlib import BoundLogger -from nomad import utils -from nomad.datamodel.data import ArchiveSection + from structlog.stdlib import ( + BoundLogger, + ) +from nomad import ( + utils, +) +from nomad.units import ( + ureg, +) +from nomad.metainfo import ( + Quantity, + Datetime, + Section, + SectionProxy, + SubSection, +) +from nomad.metainfo.util import MEnum +from nomad.datamodel.util import create_custom_mapping +from nomad.datamodel.data import ( + ArchiveSection, +) +from nomad.datamodel.results import ( + Results, + ELN, + ElementalComposition as ResultsElementalComposition, + Material, +) from nomad.datamodel.metainfo.annotations import ( ELNAnnotation, Filter, - HDF5Annotation, SectionProperties, + HDF5Annotation, ) -from nomad.datamodel.results import ELN, Material, Results -from nomad.datamodel.results import ElementalComposition as ResultsElementalComposition -from nomad.datamodel.util import create_custom_mapping -from nomad.metainfo import Datetime, Quantity, Section, SectionProxy, SubSection -from nomad.metainfo.util import MEnum -from nomad.units import ureg + PUB_CHEM_PUG_PATH = 'https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound' CAS_API_PATH = 'https://commonchemistry.cas.org/api' @@ -385,7 +408,7 @@ class EntityReference(SectionReference): """ super().normalize(archive, logger) if self.reference is None and self.lab_id is not None: - from nomad.search import MetadataPagination, search + from nomad.search import search, MetadataPagination query = {'results.eln.lab_ids': self.lab_id} search_result = search( @@ -1572,11 +1595,10 @@ class PublicationReference(ArchiveSection): logger ('BoundLogger'): A structlog logger. """ super().normalize(archive, logger) + from nomad.datamodel.datamodel import EntryMetadata import dateutil.parser import requests - from nomad.datamodel.datamodel import EntryMetadata - # Parse journal name, lead author and publication date from crossref if self.DOI_number: try: diff --git a/nomad/datamodel/metainfo/common.py b/nomad/datamodel/metainfo/common.py index beeb755d6d..14bc1024ec 100644 --- a/nomad/datamodel/metainfo/common.py +++ b/nomad/datamodel/metainfo/common.py @@ -16,7 +16,8 @@ # limitations under the License. # -from nomad.metainfo import Category, MCategory, MSection, Quantity, Section, SubSection +from nomad.metainfo import MCategory, Category +from nomad.metainfo import MSection, Section, SubSection, Quantity from nomad.metainfo.elasticsearch_extension import Elasticsearch, material_entry_type diff --git a/nomad/datamodel/metainfo/downloads.py b/nomad/datamodel/metainfo/downloads.py index 8ada69e13b..9ff64389d7 100644 --- a/nomad/datamodel/metainfo/downloads.py +++ b/nomad/datamodel/metainfo/downloads.py @@ -18,9 +18,11 @@ import os.path -from nomad.datamodel.data import ArchiveSection from nomad.metainfo import MSection, Package, Quantity, SubSection +from nomad.datamodel.data import ArchiveSection + + m_package = Package(name='downloads') @@ -135,8 +137,7 @@ class Downloads(ArchiveSection): import pathlib import urllib.request - - from nomad.common import extract_file, get_compression_format + from nomad.common import get_compression_format, extract_file # download and extract files skip_download = True diff --git a/nomad/datamodel/metainfo/measurements.py b/nomad/datamodel/metainfo/measurements.py index a6bb1fca5c..c10787470c 100644 --- a/nomad/datamodel/metainfo/measurements.py +++ b/nomad/datamodel/metainfo/measurements.py @@ -18,9 +18,10 @@ import numpy as np -from nomad.datamodel import Author -from nomad.metainfo import Datetime, MSection, Package, Quantity, SubSection +from nomad.metainfo import MSection, Package, Quantity, SubSection, Datetime from nomad.metainfo.metainfo import Reference, SectionProxy +from nomad.datamodel import Author + m_package = Package(name='measurements') diff --git a/nomad/datamodel/metainfo/plot.py b/nomad/datamodel/metainfo/plot.py index caaf30037f..3618263f8e 100644 --- a/nomad/datamodel/metainfo/plot.py +++ b/nomad/datamodel/metainfo/plot.py @@ -15,16 +15,14 @@ # See the License for the specific language governing permissions and # limitations under the License. # -from copy import deepcopy -from datetime import datetime - -import numpy as np +from nomad.datamodel.data import ArchiveSection +from nomad.metainfo import Quantity, SubSection, Package, MSection, JSON, Section import plotly.express as px import plotly.graph_objs as go from plotly.subplots import make_subplots - -from nomad.datamodel.data import ArchiveSection -from nomad.metainfo import JSON, MSection, Package, Quantity, Section, SubSection +import numpy as np +from copy import deepcopy +from datetime import datetime class PlotlyError(Exception): diff --git a/nomad/datamodel/metainfo/simulation/calculation.py b/nomad/datamodel/metainfo/simulation/calculation.py index a4ecc90954..1dc907a8ee 100644 --- a/nomad/datamodel/metainfo/simulation/calculation.py +++ b/nomad/datamodel/metainfo/simulation/calculation.py @@ -21,27 +21,27 @@ # https://github.com/nomad-coe/nomad-schema-plugin-run.git import numpy as np # noqa: F401 - -from nomad.datamodel.data import ArchiveSection -from nomad.datamodel.metainfo.common import PropertySection, ProvenanceTracker -from nomad.datamodel.metainfo.simulation.method import HoppingMatrix, Method -from nomad.datamodel.metainfo.simulation.system import AtomsGroup, System from nomad.metainfo import ( # noqa: F401 - Category, - MCategory, - MEnum, MSection, + MCategory, + Category, Package, Quantity, - Reference, Section, - SectionProxy, SubSection, + SectionProxy, + Reference, + MEnum, derived, ) +from nomad.datamodel.metainfo.common import ProvenanceTracker, PropertySection +from nomad.datamodel.metainfo.simulation.system import System, AtomsGroup +from nomad.datamodel.metainfo.simulation.method import Method, HoppingMatrix +from nomad.datamodel.data import ArchiveSection from ..common import FastAccess + m_package = Package() diff --git a/nomad/datamodel/metainfo/simulation/legacy_workflows.py b/nomad/datamodel/metainfo/simulation/legacy_workflows.py index 7a4eef3e5d..52a62e4a1f 100644 --- a/nomad/datamodel/metainfo/simulation/legacy_workflows.py +++ b/nomad/datamodel/metainfo/simulation/legacy_workflows.py @@ -22,26 +22,26 @@ import numpy as np from nptyping import NDArray - -from nomad.datamodel.metainfo.common import FastAccess -from nomad.datamodel.metainfo.simulation.calculation import ( - BandStructure, - Calculation, - Dos, -) -from nomad.datamodel.metainfo.simulation.run import Run -from nomad.datamodel.metainfo.simulation.system import Atoms, AtomsGroup, System from nomad.metainfo import ( - MEnum, MSection, - Package, + MEnum, Quantity, - Reference, Section, - SectionProxy, SubSection, + SectionProxy, + Reference, + Package, derived, ) +from nomad.datamodel.metainfo.simulation.calculation import ( + Calculation, + Dos, + BandStructure, +) +from nomad.datamodel.metainfo.simulation.run import Run +from nomad.datamodel.metainfo.simulation.system import System, Atoms, AtomsGroup +from nomad.datamodel.metainfo.common import FastAccess + m_package = Package() diff --git a/nomad/datamodel/metainfo/simulation/method.py b/nomad/datamodel/metainfo/simulation/method.py index 0d88668563..165fdfa0ae 100644 --- a/nomad/datamodel/metainfo/simulation/method.py +++ b/nomad/datamodel/metainfo/simulation/method.py @@ -20,29 +20,28 @@ # Only for purpose of compatibility. Use run schema plugin. # https://github.com/nomad-coe/nomad-schema-plugin-run.git -import typing from logging import Logger - import numpy as np # noqa: F401 -from pint.util import SharedRegistryObject # noqa: F401 +import typing +from pint.util import SharedRegistryObject # noqa: F401 from nomad.datamodel.data import ArchiveSection from nomad.metainfo import ( # noqa: F401 - Category, - MCategory, - MEnum, MSection, + MCategory, + Category, Package, Quantity, - Reference, Section, - SectionProxy, SubSection, + SectionProxy, + Reference, + MEnum, ) from nomad.quantum_states import RussellSaundersState - from ..common import FastAccess + m_package = Package() diff --git a/nomad/datamodel/metainfo/simulation/run.py b/nomad/datamodel/metainfo/simulation/run.py index 2dd64bf266..93cca85f6a 100644 --- a/nomad/datamodel/metainfo/simulation/run.py +++ b/nomad/datamodel/metainfo/simulation/run.py @@ -22,22 +22,22 @@ import numpy as np # noqa: F401 -from nomad.datamodel.data import ArchiveSection -from nomad.datamodel.metainfo.common import FastAccess -from nomad.datamodel.metainfo.simulation.calculation import Calculation -from nomad.datamodel.metainfo.simulation.method import Method -from nomad.datamodel.metainfo.simulation.system import System from nomad.metainfo import ( # noqa: F401 - Category, - MCategory, MSection, + MCategory, + Category, Package, Quantity, - Reference, Section, - SectionProxy, SubSection, + SectionProxy, + Reference, ) +from nomad.datamodel.metainfo.simulation.method import Method +from nomad.datamodel.metainfo.simulation.system import System +from nomad.datamodel.metainfo.simulation.calculation import Calculation +from nomad.datamodel.metainfo.common import FastAccess +from nomad.datamodel.data import ArchiveSection m_package = Package() diff --git a/nomad/datamodel/metainfo/simulation/system.py b/nomad/datamodel/metainfo/simulation/system.py index c5645aebbf..fe4a73deab 100644 --- a/nomad/datamodel/metainfo/simulation/system.py +++ b/nomad/datamodel/metainfo/simulation/system.py @@ -20,28 +20,26 @@ # Only for purpose of compatibility. Use run schema plugin. # https://github.com/nomad-coe/nomad-schema-plugin-run.git -import typing # noqa: F401 - import numpy as np # noqa: F401 - -from nomad.datamodel.data import ArchiveSection +import typing # noqa: F401 from nomad.metainfo import ( # noqa: F401 - Category, - MCategory, - MEnum, MSection, + MCategory, + Category, Package, Quantity, - Reference, Section, - SectionProxy, SubSection, + SectionProxy, + Reference, + MEnum, derived, ) +from nomad.datamodel.data import ArchiveSection from nomad.metainfo.data_type import m_float64 -from nomad.units import ureg from ..common import FastAccess +from nomad.units import ureg m_package = Package() diff --git a/nomad/datamodel/metainfo/simulation/workflow.py b/nomad/datamodel/metainfo/simulation/workflow.py index aa77ddb2d0..ae5dde4f1b 100644 --- a/nomad/datamodel/metainfo/simulation/workflow.py +++ b/nomad/datamodel/metainfo/simulation/workflow.py @@ -27,48 +27,45 @@ from nptyping import NDArray from nomad.atomutils import get_volume from nomad.datamodel.data import ArchiveSection +from nomad.units import ureg +from nomad.metainfo import ( + MSection, + SubSection, + Section, + Quantity, + MEnum, + Reference, + Package, + derived, +) from nomad.datamodel.metainfo.common import FastAccess +from nomad.datamodel.metainfo.workflow import Workflow, Link, Task +from nomad.datamodel.metainfo.simulation.system import System, AtomsGroup +from nomad.datamodel.metainfo.simulation.method import ( + Method, + XCFunctional, + BasisSetContainer, + GW as GWMethodology, + TB as TBMethodology, + DMFT as DMFTMethodology, + BSE as BSEMethodology, +) from nomad.datamodel.metainfo.simulation.calculation import ( - BandEnergies, + Calculation, BandGap, + Dos, BandStructure, - Calculation, + BandEnergies, Density, - Dos, - ElectronicStructureProvenance, - EnergyEntry, - GreensFunctions, Potential, Spectra, -) -from nomad.datamodel.metainfo.simulation.calculation import ( + ElectronicStructureProvenance, + GreensFunctions, RadiusOfGyration as RadiusOfGyrationCalculation, -) -from nomad.datamodel.metainfo.simulation.calculation import ( RadiusOfGyrationValues as RadiusOfGyrationValuesCalculation, + EnergyEntry, ) -from nomad.datamodel.metainfo.simulation.method import BSE as BSEMethodology -from nomad.datamodel.metainfo.simulation.method import DMFT as DMFTMethodology -from nomad.datamodel.metainfo.simulation.method import GW as GWMethodology -from nomad.datamodel.metainfo.simulation.method import TB as TBMethodology -from nomad.datamodel.metainfo.simulation.method import ( - BasisSetContainer, - Method, - XCFunctional, -) -from nomad.datamodel.metainfo.simulation.system import AtomsGroup, System -from nomad.datamodel.metainfo.workflow import Link, Task, Workflow -from nomad.metainfo import ( - MEnum, - MSection, - Package, - Quantity, - Reference, - Section, - SubSection, - derived, -) -from nomad.units import ureg + # TODO remove this after reprocessing with the new schema defined in # simulationworkflowschema plug in https://github.com/nomad-coe/nomad-schema-plugin-simulation-workflow.git @@ -2205,11 +2202,11 @@ class MolecularDynamicsResults(ThermodynamicsResults): super().normalize(archive, logger) try: + from simulationworkflowschema.molecular_dynamics import archive_to_universe from simulationworkflowschema.molecular_dynamics import ( - archive_to_universe, + calc_molecular_rdf, calc_molecular_mean_squared_displacements, calc_molecular_radius_of_gyration, - calc_molecular_rdf, ) universe = archive_to_universe(archive) diff --git a/nomad/datamodel/metainfo/system.py b/nomad/datamodel/metainfo/system.py index 05fce8c21c..bcff5a8172 100644 --- a/nomad/datamodel/metainfo/system.py +++ b/nomad/datamodel/metainfo/system.py @@ -15,11 +15,11 @@ # See the License for the specific language governing permissions and # limitations under the License. # -import ase import numpy as np +import ase +from nomad.metainfo import Package, Quantity, Section, SubSection, SectionProxy from nomad.datamodel.data import ArchiveSection -from nomad.metainfo import Package, Quantity, Section, SectionProxy, SubSection from nomad.units import ureg # TODO System should be redefined from base section diff --git a/nomad/datamodel/metainfo/tabulartree.py b/nomad/datamodel/metainfo/tabulartree.py index 4960906235..806be1c2c6 100644 --- a/nomad/datamodel/metainfo/tabulartree.py +++ b/nomad/datamodel/metainfo/tabulartree.py @@ -20,6 +20,7 @@ import typing from nomad.metainfo import MSection, Package, Quantity, SubSection + m_package = Package(name='tabulartree') diff --git a/nomad/datamodel/metainfo/workflow.py b/nomad/datamodel/metainfo/workflow.py index a1c3fe137a..2f446ebaee 100644 --- a/nomad/datamodel/metainfo/workflow.py +++ b/nomad/datamodel/metainfo/workflow.py @@ -16,8 +16,9 @@ # limitations under the License. # +from nomad.metainfo import Quantity, SubSection, Section + from nomad.datamodel.data import ArchiveSection, EntryData, WorkflowsElnCategory -from nomad.metainfo import Quantity, Section, SubSection class Link(ArchiveSection): diff --git a/nomad/datamodel/optimade.py b/nomad/datamodel/optimade.py index 5dfea49688..f72fa69cbf 100644 --- a/nomad/datamodel/optimade.py +++ b/nomad/datamodel/optimade.py @@ -16,19 +16,19 @@ # limitations under the License. # -import numpy as np from ase.data import chemical_symbols +import numpy as np +from nomad.units import ureg from nomad.metainfo import ( - DefinitionAnnotation, - MEnum, MSection, - Quantity, Section, + Quantity, SubSection, + MEnum, + DefinitionAnnotation, ) from nomad.metainfo.elasticsearch_extension import Elasticsearch -from nomad.units import ureg def optimade_links(section: str): diff --git a/nomad/datamodel/results.py b/nomad/datamodel/results.py index 2942b4bd44..f4f090d2ba 100644 --- a/nomad/datamodel/results.py +++ b/nomad/datamodel/results.py @@ -18,40 +18,43 @@ from logging import Logger from typing import TYPE_CHECKING - import numpy as np -from ase.data import chemical_symbols from elasticsearch_dsl import Text +from ase.data import chemical_symbols + from nomad.config import config -from nomad.datamodel.metainfo.annotations import H5WebAnnotation -from nomad.datamodel.metainfo.common import PropertySection, ProvenanceTracker +from nomad.datamodel.metainfo.common import ProvenanceTracker, PropertySection from nomad.datamodel.metainfo.simulation.method import CoreHole as CoreHoleRun -from nomad.datamodel.optimade import Species as OptimadeSpecies # noqa +from nomad.metainfo.elasticsearch_extension import ( + Elasticsearch, + material_type, + material_entry_type, + get_tokenizer, +) + from nomad.metainfo import ( - Datetime, - MEnum, MSection, - Package, - Quantity, - Reference, Section, SubSection, + Quantity, + MEnum, + Package, + Datetime, + Reference, ) -from nomad.metainfo.elasticsearch_extension import ( - Elasticsearch, - get_tokenizer, - material_entry_type, - material_type, -) +from nomad.datamodel.metainfo.common import ProvenanceTracker, PropertySection +from nomad.datamodel.optimade import Species as OptimadeSpecies # noqa +from nomad.datamodel.metainfo.annotations import H5WebAnnotation try: import runschema runschema.run_schema_entry_point.load() - import runschema.calculation import runschema.method + import runschema.calculation import runschema.system + import simulationworkflowschema simulationworkflowschema.simulationworkflow_schema_entry_point.load() diff --git a/nomad/datamodel/util.py b/nomad/datamodel/util.py index 6078033824..63ab9e0c48 100644 --- a/nomad/datamodel/util.py +++ b/nomad/datamodel/util.py @@ -17,19 +17,19 @@ # import math import re -from collections.abc import Callable from typing import Any +from collections.abc import Callable import numpy as np from nomad import utils from nomad.metainfo import ( + Section, AnnotationModel, - MetainfoError, MSection, - Property, - Section, SubSection, + Property, + MetainfoError, ) from nomad.units import ureg diff --git a/nomad/doi.py b/nomad/doi.py index fe1df5f049..a755e19c31 100644 --- a/nomad/doi.py +++ b/nomad/doi.py @@ -21,18 +21,17 @@ This module contains all functions necessary to manage DOI via datacite.org and MDS API (https://support.datacite.org/docs/mds-api-guide). """ -import datetime import xml.etree.ElementTree as ET - +import datetime import requests -from fastapi import HTTPException -from mongoengine import DateTimeField, Document, StringField -from mongoengine.errors import NotUniqueError from requests.auth import HTTPBasicAuth +from mongoengine import Document, StringField, DateTimeField +from mongoengine.errors import NotUniqueError -from nomad import utils -from nomad.config import config from nomad.datamodel import User +from nomad.config import config +from nomad import utils +from fastapi import HTTPException class DOIException(Exception): diff --git a/nomad/files.py b/nomad/files.py index d40bf0e102..fdf0f0b8ee 100644 --- a/nomad/files.py +++ b/nomad/files.py @@ -45,35 +45,40 @@ original mainfile, and vice versa. from __future__ import annotations +from abc import ABCMeta +from typing import ( + IO, + Any, + NamedTuple, +) +from collections.abc import Callable +from collections.abc import Iterable, Iterator +from pydantic import BaseModel +from datetime import datetime +import os.path +import os +import shutil +import zipstream import hashlib import io import json -import os -import os.path -import shutil +import yaml +import magic import tarfile # noqa: F401 import zipfile -from abc import ABCMeta -from collections.abc import Callable, Iterable, Iterator -from datetime import datetime -from typing import IO, Any, NamedTuple -import magic -import yaml -import zipstream -from pydantic import BaseModel -from nomad import datamodel, utils -from nomad.archive import ArchiveReader, read_archive, to_json, write_archive -from nomad.archive.storage_v2 import combine_archive +from nomad import utils, datamodel from nomad.common import ( - extract_file, get_compression_format, + extract_file, is_safe_basename, is_safe_relative_path, ) from nomad.config import config -from nomad.config.models.config import BundleExportSettings, BundleImportSettings +from nomad.archive.storage_v2 import combine_archive +from nomad.config.models.config import BundleImportSettings, BundleExportSettings +from nomad.archive import write_archive, read_archive, ArchiveReader, to_json bundle_info_filename = 'bundle_info.json' diff --git a/nomad/graph/graph_reader.py b/nomad/graph/graph_reader.py index 24139f7714..d813a8f375 100644 --- a/nomad/graph/graph_reader.py +++ b/nomad/graph/graph_reader.py @@ -24,10 +24,11 @@ import functools import itertools import os import re -from collections.abc import AsyncIterator, Callable, Iterator +from collections.abc import AsyncIterator, Iterator from contextlib import contextmanager from threading import Lock from typing import Any +from collections.abc import Callable import orjson from cachetools import TTLCache @@ -54,10 +55,23 @@ from nomad.app.v1.routers.uploads import ( get_upload_with_read_access, upload_to_pydantic, ) -from nomad.archive import ArchiveDict, ArchiveList, to_json -from nomad.archive.storage_v2 import ArchiveDict as ArchiveDictNew -from nomad.archive.storage_v2 import ArchiveList as ArchiveListNew -from nomad.datamodel import Dataset, EntryArchive, ServerContext, User +from nomad.archive import ( + ArchiveDict, + ArchiveList, + to_json, +) +from nomad.archive.storage_v2 import ( + ArchiveDict as ArchiveDictNew, +) +from nomad.archive.storage_v2 import ( + ArchiveList as ArchiveListNew, +) +from nomad.datamodel import ( + Dataset, + EntryArchive, + ServerContext, + User, +) from nomad.datamodel.util import parse_path from nomad.files import RawPathInfo, UploadFiles from nomad.graph.lazy_wrapper import ( @@ -88,8 +102,8 @@ from nomad.metainfo import ( SectionReference, SubSection, ) -from nomad.metainfo.data_type import JSON, Datatype from nomad.metainfo.data_type import Any as AnyType +from nomad.metainfo.data_type import JSON, Datatype from nomad.metainfo.util import MSubSectionList, split_python_definition from nomad.processing import Entry, ProcessStatus, Upload from nomad.utils import timer diff --git a/nomad/graph/lazy_wrapper.py b/nomad/graph/lazy_wrapper.py index 148a6c079d..87b777b483 100644 --- a/nomad/graph/lazy_wrapper.py +++ b/nomad/graph/lazy_wrapper.py @@ -26,7 +26,6 @@ Different wrappers are catered for different types of objects/operations. """ from __future__ import annotations - from functools import cached_property from nomad.datamodel import User diff --git a/nomad/graph/model.py b/nomad/graph/model.py index 669d7f1276..f8bf6f1c38 100644 --- a/nomad/graph/model.py +++ b/nomad/graph/model.py @@ -25,15 +25,14 @@ from typing import Annotated, Union from pydantic import ( AfterValidator, - BaseModel, + field_validator, ConfigDict, + BaseModel, Field, ValidationError, - field_validator, ) from nomad.app.v1.models import Direction, Metadata, MetadataPagination, Pagination -from nomad.app.v1.models.groups import UserGroupPagination, UserGroupQuery from nomad.app.v1.routers.datasets import DatasetPagination from nomad.app.v1.routers.uploads import ( EntryProcDataPagination, @@ -41,6 +40,7 @@ from nomad.app.v1.routers.uploads import ( UploadProcDataPagination, UploadProcDataQuery, ) +from nomad.app.v1.models.groups import UserGroupQuery, UserGroupPagination class DatasetQuery(BaseModel): diff --git a/nomad/infrastructure.py b/nomad/infrastructure.py index 0d98646a16..5adbf9f90b 100644 --- a/nomad/infrastructure.py +++ b/nomad/infrastructure.py @@ -23,34 +23,33 @@ is run once for each *api* and *worker* process. Individual functions for partia exist to facilitate testing, aspects of :py:mod:`nomad.cli`, etc. """ -import json -import os import os.path -import re +import os import shutil +from elasticsearch_dsl import connections +from mongoengine import connect, disconnect +from mongoengine.connection import ConnectionFailure import smtplib - -# TODO put somemore thought into warnings -import warnings -from datetime import datetime from email.mime.text import MIMEText - +from keycloak import KeycloakOpenID, KeycloakAdmin +from keycloak.exceptions import KeycloakAuthenticationError, KeycloakGetError +import json import jwt +from datetime import datetime +import re import unidecode -from elasticsearch_dsl import connections -from keycloak import KeycloakAdmin, KeycloakOpenID -from keycloak.exceptions import KeycloakAuthenticationError, KeycloakGetError -from mongoengine import connect, disconnect -from mongoengine.connection import ConnectionFailure from nomad import utils from nomad.config import config +from nomad.utils.structlogging import get_logger # The metainfo is defined and used during imports. This is problematic. # We import all parsers very early in the infrastructure setup. This will populate # the metainfo with parser specific definitions, before the metainfo might be used. from nomad.parsing import parsers # noqa: F401 -from nomad.utils.structlogging import get_logger + +# TODO put somemore thought into warnings +import warnings warnings.filterwarnings('ignore') diff --git a/nomad/logtransfer.py b/nomad/logtransfer.py index f85170d8bd..6c884540c2 100644 --- a/nomad/logtransfer.py +++ b/nomad/logtransfer.py @@ -16,15 +16,15 @@ # limitations under the License. # -import os +import requests +import zlib import os.path +import os import time -import zlib -import requests -from nomad import utils from nomad.config import config +from nomad import utils logger = utils.get_logger(__name__) diff --git a/nomad/metainfo/annotation.py b/nomad/metainfo/annotation.py index 6ee540abe9..b3bec23d57 100644 --- a/nomad/metainfo/annotation.py +++ b/nomad/metainfo/annotation.py @@ -20,7 +20,7 @@ from __future__ import annotations from typing import Any, ClassVar, ForwardRef -from pydantic import BaseModel, ConfigDict, Field +from pydantic import ConfigDict, BaseModel, Field class Annotation: diff --git a/nomad/metainfo/data_frames.py b/nomad/metainfo/data_frames.py index 4f2f1fc7d1..94f510e9b6 100644 --- a/nomad/metainfo/data_frames.py +++ b/nomad/metainfo/data_frames.py @@ -1,13 +1,19 @@ -import inspect import types -from collections.abc import Iterable from typing import Union, cast - +from collections.abc import Iterable import numpy as np -import xarray as xr +import inspect from pydantic import BaseModel +import xarray as xr -from nomad.metainfo import MSection, Package, Quantity, Section, SubSection, constraint +from nomad.metainfo import ( + MSection, + Section, + Quantity, + SubSection, + Package, + constraint, +) from nomad.metainfo.metainfo import _placeholder_quantity from nomad.units import ureg diff --git a/nomad/metainfo/data_type.py b/nomad/metainfo/data_type.py index 6f9b89f798..04b4c72465 100644 --- a/nomad/metainfo/data_type.py +++ b/nomad/metainfo/data_type.py @@ -22,7 +22,7 @@ import importlib import re import typing from base64 import b64decode, b64encode -from datetime import date, datetime +from datetime import datetime, date from functools import reduce from inspect import isclass from typing import Any as TypingAny @@ -1248,12 +1248,12 @@ def to_optimade_type(in_type: Datatype): def to_mongo_type(in_type: Datatype): from mongoengine import ( + IntField, + FloatField, BooleanField, + StringField, DateTimeField, DictField, - FloatField, - IntField, - StringField, ) standard_type = in_type.standard_type() diff --git a/nomad/metainfo/elasticsearch_extension.py b/nomad/metainfo/elasticsearch_extension.py index 9d386d4329..f45f5ece73 100644 --- a/nomad/metainfo/elasticsearch_extension.py +++ b/nomad/metainfo/elasticsearch_extension.py @@ -159,15 +159,19 @@ sub-sections as if they were direct sub-sections. import math import re from collections import defaultdict +from typing import ( + TYPE_CHECKING, + Any, + Optional, + cast, +) from collections.abc import Callable -from typing import TYPE_CHECKING, Any, Optional, cast from elasticsearch_dsl import Q -from pint import Quantity as PintQuantity - from nomad import utils from nomad.config import config from nomad.config.models.plugins import Parser, Schema, SchemaPackageEntryPoint +from pint import Quantity as PintQuantity from . import DefinitionAnnotation from .data_type import Datatype, to_elastic_type diff --git a/nomad/metainfo/example.py b/nomad/metainfo/example.py index d7acce8ee9..3e7f7443b4 100644 --- a/nomad/metainfo/example.py +++ b/nomad/metainfo/example.py @@ -18,22 +18,21 @@ """An example metainfo package.""" -from datetime import datetime - import numpy as np +from datetime import datetime +from nomad.units import ureg from nomad.metainfo import ( - Datetime, - MCategory, - MEnum, MSection, - Package, - Quantity, + MCategory, Section, + Quantity, + Package, SubSection, + MEnum, + Datetime, constraint, ) -from nomad.units import ureg m_package = Package(links=['https://nomad-lab.eu/prod/rae/docs/metainfo.html']) diff --git a/nomad/metainfo/metainfo.py b/nomad/metainfo/metainfo.py index 67072e835d..1532e571e3 100644 --- a/nomad/metainfo/metainfo.py +++ b/nomad/metainfo/metainfo.py @@ -34,7 +34,7 @@ from urllib.parse import urlsplit, urlunsplit import docstring_parser import jmespath import pint -from pydantic import BaseModel, TypeAdapter, ValidationError +from pydantic import TypeAdapter, ValidationError, BaseModel from nomad.config import config from nomad.metainfo.data_type import JSON as JSONType @@ -43,20 +43,14 @@ from nomad.metainfo.data_type import Any as AnyType from nomad.metainfo.data_type import Bytes as BytesType from nomad.metainfo.data_type import Callable as CallableType from nomad.metainfo.data_type import Capitalized as CapitalizedType -from nomad.metainfo.data_type import ( - Datatype, - Enum, - ExactNumber, - InexactNumber, - Number, - check_dimensionality, - m_str, - normalize_type, -) +from nomad.metainfo.data_type import Datatype from nomad.metainfo.data_type import Datetime as DatetimeType from nomad.metainfo.data_type import Dimension as DimensionType +from nomad.metainfo.data_type import Enum, ExactNumber from nomad.metainfo.data_type import File as FileType +from nomad.metainfo.data_type import InexactNumber, Number from nomad.metainfo.data_type import Unit as UnitType +from nomad.metainfo.data_type import check_dimensionality, m_str, normalize_type from nomad.metainfo.util import ( MQuantity, MSubSectionList, @@ -68,6 +62,7 @@ from nomad.metainfo.util import ( to_dict, ) from nomad.units import ureg as units +from pydantic import TypeAdapter, ValidationError from .annotation import ( Annotation, diff --git a/nomad/metainfo/mongoengine_extension.py b/nomad/metainfo/mongoengine_extension.py index c7dd4baa97..34c43289bf 100644 --- a/nomad/metainfo/mongoengine_extension.py +++ b/nomad/metainfo/mongoengine_extension.py @@ -35,9 +35,12 @@ sections from mongoengine. The annotation key is 'mongo'. from typing import Any -from . import Annotation, DefinitionAnnotation, SectionAnnotation from .data_type import Datatype, to_mongo_type -from .metainfo import MSection, Quantity +from .metainfo import ( + MSection, + Quantity, +) +from . import Annotation, DefinitionAnnotation, SectionAnnotation class Mongo(DefinitionAnnotation): diff --git a/nomad/metainfo/pydantic_extension.py b/nomad/metainfo/pydantic_extension.py index 155140406d..f556768aef 100644 --- a/nomad/metainfo/pydantic_extension.py +++ b/nomad/metainfo/pydantic_extension.py @@ -33,12 +33,15 @@ Allows to create pydantic models from section definitions. """ from typing import cast +from pydantic import create_model, Field, BaseModel -from pydantic import BaseModel, Field, create_model - -from . import DefinitionAnnotation from .data_type import to_pydantic_type -from .metainfo import Definition, Quantity, Section +from .metainfo import ( + Definition, + Section, + Quantity, +) +from . import DefinitionAnnotation class PydanticModel(DefinitionAnnotation): diff --git a/nomad/metainfo/util.py b/nomad/metainfo/util.py index a46e70d43c..cbaf0eb3c6 100644 --- a/nomad/metainfo/util.py +++ b/nomad/metainfo/util.py @@ -22,7 +22,6 @@ import re from typing import Any import pint - from nomad.metainfo.data_type import Enum from nomad.units import ureg diff --git a/nomad/mkdocs/metainfo.py b/nomad/mkdocs/metainfo.py index 710a6383dc..52c4ea2e3b 100644 --- a/nomad/mkdocs/metainfo.py +++ b/nomad/mkdocs/metainfo.py @@ -15,8 +15,8 @@ # from nomad import utils +from nomad.metainfo import Property, Quantity, Datatype, Reference, SubSection from nomad.datamodel.data import ArchiveSection -from nomad.metainfo import Datatype, Property, Quantity, Reference, SubSection def get_reference(section_def, pkg) -> str: diff --git a/nomad/mkdocs/pydantic.py b/nomad/mkdocs/pydantic.py index 774843aa3d..eb55aa89b7 100644 --- a/nomad/mkdocs/pydantic.py +++ b/nomad/mkdocs/pydantic.py @@ -20,16 +20,19 @@ Definitions that are used in the documentation via mkdocs-macro-plugin. """ -from enum import Enum -from inspect import isclass from types import UnionType -from typing import Annotated, Any, Literal, Union, get_args, get_origin +from pydantic.fields import FieldInfo +from enum import Enum from pydantic import BaseModel -from pydantic.fields import FieldInfo + +from typing import Annotated, Any, Union, get_args, get_origin +from typing import Literal +from inspect import isclass from nomad import utils + exported_config_models = set() # type: ignore diff --git a/nomad/normalizing/common.py b/nomad/normalizing/common.py index f03185579d..9075f97a70 100644 --- a/nomad/normalizing/common.py +++ b/nomad/normalizing/common.py @@ -15,24 +15,26 @@ # See the License for the specific language governing permissions and # limitations under the License. # -from typing import Any - -import matid.geometry # pylint: disable=import-error import numpy as np from ase import Atoms -from matid import SymmetryAnalyzer # pylint: disable=import-error -from matid.symmetry.wyckoffset import ( - WyckoffSet as WyckoffSetMatID, # pylint: disable=import-error -) +from typing import Any from nptyping import NDArray +from matid import SymmetryAnalyzer # pylint: disable=import-error +from matid.symmetry.wyckoffset import WyckoffSet as WyckoffSetMatID # pylint: disable=import-error +import matid.geometry # pylint: disable=import-error from nomad import atomutils from nomad.config import config +from nomad.utils import hash +from nomad.units import ureg from nomad.datamodel.metainfo.system import Atoms as NOMADAtoms from nomad.datamodel.optimade import Species -from nomad.datamodel.results import Cell, LatticeParameters, Structure, WyckoffSet -from nomad.units import ureg -from nomad.utils import hash +from nomad.datamodel.results import ( + Cell, + Structure, + LatticeParameters, + WyckoffSet, +) def wyckoff_sets_from_matid(wyckoff_sets: list[WyckoffSetMatID]) -> list[WyckoffSet]: diff --git a/nomad/normalizing/material.py b/nomad/normalizing/material.py index 9192162c68..f5eed863aa 100644 --- a/nomad/normalizing/material.py +++ b/nomad/normalizing/material.py @@ -16,24 +16,24 @@ # import re +from nptyping import NDArray import ase.data from matid.classification.classifications import ( - Atom, Class0D, + Atom, Class1D, Class2D, - Class3D, Material2D, Surface, + Class3D, ) -from nptyping import NDArray from nomad import atomutils from nomad.atomutils import Formula -from nomad.datamodel.results import Material, Symmetry, structure_name_map -from nomad.normalizing.common import material_id_1d, material_id_2d, material_id_bulk +from nomad.normalizing.common import material_id_bulk, material_id_2d, material_id_1d from nomad.normalizing.topology import TopologyNormalizer +from nomad.datamodel.results import Symmetry, Material, structure_name_map class MaterialNormalizer: diff --git a/nomad/normalizing/metainfo.py b/nomad/normalizing/metainfo.py index 73e3ddd018..11238e9224 100644 --- a/nomad/normalizing/metainfo.py +++ b/nomad/normalizing/metainfo.py @@ -18,7 +18,7 @@ from nomad.datamodel import EntryArchive from nomad.datamodel.data import ArchiveSection - +from nomad.datamodel import EntryArchive from . import Normalizer diff --git a/nomad/normalizing/method.py b/nomad/normalizing/method.py index 2a3355f8b1..0fc961ec59 100644 --- a/nomad/normalizing/method.py +++ b/nomad/normalizing/method.py @@ -15,33 +15,33 @@ # See the License for the specific language governing permissions and # limitations under the License. # -import re from abc import ABC, abstractmethod +from ase.dft.kpoints import monkhorst_pack, get_monkhorst_pack_size_and_offset from collections import OrderedDict - +import re import numpy as np -from ase.dft.kpoints import get_monkhorst_pack_size_and_offset, monkhorst_pack +from nomad.datamodel import EntryArchive, ArchiveSection +from nomad.metainfo import MSection +from nomad.metainfo.data_type import Number +from nomad.units import ureg +from nomad.metainfo import Section +from nomad.utils import RestrictedDict from nomad.config import config -from nomad.datamodel import ArchiveSection, EntryArchive from nomad.datamodel.results import ( - BSE, + Method, + Simulation, + HubbardKanamoriModel, DFT, - DMFT, - GW, TB, - HubbardKanamoriModel, - Material, - Method, + GW, + BSE, + DMFT, Precision, - Simulation, + Material, xc_treatments, xc_treatments_extended, ) -from nomad.metainfo import MSection, Section -from nomad.metainfo.data_type import Number -from nomad.units import ureg -from nomad.utils import RestrictedDict class MethodNormalizer: # TODO: add normalizer for atom_parameters.label diff --git a/nomad/normalizing/normalizer.py b/nomad/normalizing/normalizer.py index 0c3976f297..320571ccba 100644 --- a/nomad/normalizing/normalizer.py +++ b/nomad/normalizing/normalizer.py @@ -18,9 +18,9 @@ from abc import ABCMeta, abstractmethod -from nomad.datamodel import EntryArchive -from nomad.metainfo import MSection from nomad.utils import get_logger +from nomad.metainfo import MSection +from nomad.datamodel import EntryArchive class Normalizer(metaclass=ABCMeta): diff --git a/nomad/normalizing/optimade.py b/nomad/normalizing/optimade.py index 3c78ab4ca5..f6e1913e46 100644 --- a/nomad/normalizing/optimade.py +++ b/nomad/normalizing/optimade.py @@ -16,18 +16,19 @@ # limitations under the License. # -import re from typing import Any - +import numpy as np +import re import ase.data import ase.formula -import numpy as np import pint.quantity +from nomad.datamodel import EntryArchive from nomad.atomutils import Formula -from nomad.datamodel import EntryArchive, EntryMetadata, OptimadeEntry, Species from nomad.normalizing.normalizer import SystemBasedNormalizer from nomad.units import ureg +from nomad.datamodel import OptimadeEntry, Species, EntryMetadata + species_re = re.compile(r'^([A-Z][a-z]?)(\d*)$') atom_label_re = re.compile( diff --git a/nomad/normalizing/results.py b/nomad/normalizing/results.py index 2316cb4510..85657aa406 100644 --- a/nomad/normalizing/results.py +++ b/nomad/normalizing/results.py @@ -17,78 +17,77 @@ # import re +import numpy as np from typing import Any - import ase.data -import matid.geometry # pylint: disable=import-error -import numpy as np from matid import SymmetryAnalyzer # pylint: disable=import-error +import matid.geometry # pylint: disable=import-error from nomad import atomutils -from nomad.atomutils import Formula from nomad.config import config +from nomad.utils import traverse_reversed, extract_section +from nomad.atomutils import Formula +from nomad.normalizing.normalizer import Normalizer +from nomad.normalizing.method import MethodNormalizer +from nomad.normalizing.material import MaterialNormalizer from nomad.datamodel import EntryArchive -from nomad.datamodel.data import ArchiveSection from nomad.datamodel.metainfo.workflow import Workflow +from nomad.datamodel.data import ArchiveSection +from nomad.normalizing.common import structures_2d from nomad.datamodel.results import ( BandGap, BandGapDeprecated, + RadialDistributionFunction, + RadiusOfGyration, + MeanSquaredDisplacement, + Results, + Material, + Method, + GeometryOptimization, + Trajectory, + MolecularDynamics, + MDProvenance, + TemperatureDynamic, + VolumeDynamic, + PressureDynamic, + EnergyDynamic, + Properties, + StructuralProperties, + DynamicalProperties, + EnergyVolumeCurve, + BulkModulus, + ShearModulus, + MechanicalProperties, + ElectronicProperties, + VibrationalProperties, + ThermodynamicProperties, BandStructureElectronic, BandStructurePhonon, - BulkModulus, - DensityCharge, DOSElectronic, - DOSElectronicNew, DOSNew, + DOSElectronicNew, DOSPhonon, - DynamicalProperties, - EELSMethodology, - ElectricFieldGradient, - ElectronicProperties, - EnergyDynamic, - EnergyFreeHelmholtz, - EnergyVolumeCurve, - GeometryOptimization, GreensFunctionsElectronic, + EnergyFreeHelmholtz, HeatCapacityConstantVolume, + SpectroscopicProperties, + EELSMethodology, + SpectraProvenance, + Spectra, MagneticProperties, MagneticShielding, MagneticSusceptibility, - Material, - MDProvenance, - MeanSquaredDisplacement, - MechanicalProperties, - Method, - MolecularDynamics, - PressureDynamic, - Properties, - RadialDistributionFunction, - RadiusOfGyration, - Results, - ShearModulus, - Spectra, - SpectraProvenance, - SpectroscopicProperties, + ElectricFieldGradient, SpinSpinCoupling, - StructuralProperties, - TemperatureDynamic, - ThermodynamicProperties, - Trajectory, - VibrationalProperties, - VolumeDynamic, + DensityCharge, ) -from nomad.normalizing.common import structures_2d -from nomad.normalizing.material import MaterialNormalizer -from nomad.normalizing.method import MethodNormalizer -from nomad.normalizing.normalizer import Normalizer -from nomad.utils import extract_section, traverse_reversed try: import runschema runschema.run_schema_entry_point.load() - import runschema.calculation import runschema.method + import runschema.calculation import runschema.system except Exception as e: runschema, simulationworkflowschema = None, None diff --git a/nomad/normalizing/topology.py b/nomad/normalizing/topology.py index 2477f91ad6..3a6f4a22e4 100644 --- a/nomad/normalizing/topology.py +++ b/nomad/normalizing/topology.py @@ -16,45 +16,46 @@ # limitations under the License. # -import json -import pathlib from collections import defaultdict +import pathlib +import json -import numpy as np from ase import Atoms from ase.data import chemical_symbols +import numpy as np +from matid.clustering import SBC, Cluster +from matid.symmetry.symmetryanalyzer import SymmetryAnalyzer from matid.classification.classifications import ( - Atom, Class0D, + Atom, Class1D, Class2D, - Class3D, Material2D, Surface, + Class3D, ) -from matid.clustering import SBC, Cluster -from matid.symmetry.symmetryanalyzer import SymmetryAnalyzer -from nomad import atomutils, utils +from nomad import utils from nomad.config import config -from nomad.datamodel.datamodel import EntryArchive +from nomad import atomutils from nomad.datamodel.results import ( CoreHole, + SymmetryNew as Symmetry, Material, - Relation, System, + Relation, structure_name_map, ) -from nomad.datamodel.results import SymmetryNew as Symmetry +from nomad.datamodel.datamodel import EntryArchive from nomad.normalizing.common import ( - ase_atoms_from_nomad_atoms, cell_from_ase_atoms, - material_id_1d, - material_id_2d, - material_id_bulk, + ase_atoms_from_nomad_atoms, nomad_atoms_from_ase_atoms, - structures_2d, wyckoff_sets_from_matid, + structures_2d, + material_id_bulk, + material_id_2d, + material_id_1d, ) conventional_description = 'The conventional cell of the material from which the subsystem is constructed from.' diff --git a/nomad/parsing/artificial.py b/nomad/parsing/artificial.py index ae4f1b74b1..6302b72dde 100644 --- a/nomad/parsing/artificial.py +++ b/nomad/parsing/artificial.py @@ -21,20 +21,19 @@ Parser for creating artificial test, brenchmark, and demonstration data. """ import json -import os import os.path import random -import signal +from ase.data import chemical_symbols +import numpy import sys import time - -import numpy -from ase.data import chemical_symbols +import os +import signal from nomad.datamodel import EntryArchive from nomad.datamodel.metainfo import runschema -from .parser import MatchingParser, Parser +from .parser import Parser, MatchingParser class EmptyParser(MatchingParser): diff --git a/nomad/parsing/file_parser/file_parser.py b/nomad/parsing/file_parser/file_parser.py index b9bef40299..f66274b69b 100644 --- a/nomad/parsing/file_parser/file_parser.py +++ b/nomad/parsing/file_parser/file_parser.py @@ -12,21 +12,20 @@ # See the License for the specific language governing permissions and # limitations under the License. -import bz2 +from abc import ABC, abstractmethod +import os +import pint +from typing import Any, IO +from collections.abc import Callable import gzip +import bz2 import lzma -import os import tarfile -from abc import ABC, abstractmethod -from collections.abc import Callable from contextlib import contextmanager -from typing import IO, Any - -import pint -from nomad.datamodel import EntryArchive from nomad.metainfo import MSection, SubSection from nomad.utils import get_logger +from nomad.datamodel import EntryArchive class FileParser(ABC): diff --git a/nomad/parsing/file_parser/mapping_parser.py b/nomad/parsing/file_parser/mapping_parser.py index 5d0be33bca..d443d93fc0 100644 --- a/nomad/parsing/file_parser/mapping_parser.py +++ b/nomad/parsing/file_parser/mapping_parser.py @@ -11,8 +11,6 @@ import jmespath.visitor import numpy as np from jsonpath_ng.parser import JsonPathParser from lxml import etree -from pydantic import BaseModel, Field, model_validator - from nomad.datamodel import EntryArchive from nomad.datamodel.metainfo.annotations import Mapper as MapperAnnotation from nomad.metainfo import MSection, SubSection @@ -20,6 +18,7 @@ from nomad.parsing.file_parser import TextParser as TextFileParser from nomad.parsing.parser import ArchiveParser from nomad.units import ureg from nomad.utils import get_logger +from pydantic import BaseModel, Field, model_validator MAPPING_ANNOTATION_KEY = 'mapping' diff --git a/nomad/parsing/file_parser/text_parser.py b/nomad/parsing/file_parser/text_parser.py index a742e171eb..5010ee1673 100644 --- a/nomad/parsing/file_parser/text_parser.py +++ b/nomad/parsing/file_parser/text_parser.py @@ -13,17 +13,16 @@ # limitations under the License. -import io import mmap +import io import re -from collections.abc import Callable -from typing import Any - import numpy as np import pint +from typing import Any +from collections.abc import Callable -from nomad.metainfo import Quantity as mQuantity from nomad.parsing.file_parser import FileParser +from nomad.metainfo import Quantity as mQuantity from nomad.utils import get_logger diff --git a/nomad/parsing/file_parser/xml_parser.py b/nomad/parsing/file_parser/xml_parser.py index 5739ec9bf3..e1fecc6b3f 100644 --- a/nomad/parsing/file_parser/xml_parser.py +++ b/nomad/parsing/file_parser/xml_parser.py @@ -15,9 +15,8 @@ import os import re -from xml.etree import ElementTree - import numpy as np +from xml.etree import ElementTree from lxml import etree from nomad.parsing.file_parser import FileParser diff --git a/nomad/parsing/parser.py b/nomad/parsing/parser.py index 9dd04e06fd..b888236299 100644 --- a/nomad/parsing/parser.py +++ b/nomad/parsing/parser.py @@ -16,20 +16,19 @@ # limitations under the License. # -import importlib -import json +from typing import Any, IO +from collections.abc import Iterable +from abc import ABCMeta, abstractmethod +import re import os import os.path -import re -from abc import ABCMeta, abstractmethod -from collections.abc import Iterable from functools import lru_cache -from typing import IO, Any - +import importlib +from pydantic import BaseModel, Extra # noqa: F401 +import yaml import h5py import numpy as np -import yaml -from pydantic import BaseModel, Extra # noqa: F401 +import json from nomad import utils from nomad.config import config diff --git a/nomad/parsing/parsers.py b/nomad/parsing/parsers.py index 47b3653da3..f6b5acdd54 100644 --- a/nomad/parsing/parsers.py +++ b/nomad/parsing/parsers.py @@ -20,30 +20,28 @@ import os.path from collections.abc import Iterable from nomad.config import config -from nomad.config.models.plugins import Parser as ParserPlugin -from nomad.config.models.plugins import ParserEntryPoint +from nomad.config.models.plugins import Parser as ParserPlugin, ParserEntryPoint from nomad.datamodel import EntryArchive, EntryMetadata, results -from nomad.datamodel.context import ClientContext, Context +from nomad.datamodel.context import Context, ClientContext -from .artificial import ChaosParser, EmptyParser, GenerateRandomParser, TemplateParser from .parser import ( - ArchiveParser, - BrokenParser, - MatchingParserInterface, MissingParser, + BrokenParser, Parser, + ArchiveParser, + MatchingParserInterface, ) +from .artificial import EmptyParser, GenerateRandomParser, TemplateParser, ChaosParser from .tabular import TabularDataParser try: # these packages are not available without parsing extra, which is ok, if the # parsers are only initialized to load their metainfo definitions - import bz2 + import magic import gzip + import bz2 import lzma - import magic - _compressions = { b'\x1f\x8b\x08': ('gz', gzip.open), b'\x42\x5a\x68': ('bz2', bz2.open), diff --git a/nomad/parsing/tabular.py b/nomad/parsing/tabular.py index 38082a6d81..ebfd2a873d 100644 --- a/nomad/parsing/tabular.py +++ b/nomad/parsing/tabular.py @@ -15,31 +15,32 @@ # See the License for the specific language governing permissions and # limitations under the License. # -import json -import math import os -import re -from collections.abc import Callable, Iterable, Iterator from typing import Any +from collections.abc import Callable +from collections.abc import Iterator, Iterable -import numpy as np import pandas as pd +import re +import math +import numpy as np +import json import yaml -from cachetools import LRUCache, cached +from cachetools import cached, LRUCache from nomad import utils +from nomad.parsing import MatchingParser +from nomad.units import ureg from nomad.datamodel.data import ArchiveSection +from nomad.metainfo import Section, Quantity, Package, Reference, MSection, Property +from nomad.metainfo.metainfo import MetainfoError, SubSection, MProxy from nomad.datamodel.metainfo.annotations import ( TabularAnnotation, + TabularParserAnnotation, TabularFileModeEnum, TabularMode, - TabularParserAnnotation, ) -from nomad.metainfo import MSection, Package, Property, Quantity, Reference, Section -from nomad.metainfo.metainfo import MetainfoError, MProxy, SubSection from nomad.metainfo.util import MSubSectionList -from nomad.parsing import MatchingParser -from nomad.units import ureg from nomad.utils import generate_entry_id # We define a simple base schema for tabular data. The parser will then generate more diff --git a/nomad/processing/base.py b/nomad/processing/base.py index 40a93ce18e..17a6d7d682 100644 --- a/nomad/processing/base.py +++ b/nomad/processing/base.py @@ -16,42 +16,42 @@ # limitations under the License. # -import functools +from typing import Any, NamedTuple import logging -import os import time +import os from collections import defaultdict -from datetime import datetime -from typing import Any, NamedTuple - -import billiard -from billiard.exceptions import WorkerLostError from celery import Celery, Task -from celery.exceptions import SoftTimeLimitExceeded +from celery.worker.request import Request from celery.signals import ( - after_setup_logger, after_setup_task_logger, - celeryd_after_setup, + after_setup_logger, worker_process_init, + celeryd_after_setup, worker_process_shutdown, ) from celery.utils import worker_direct -from celery.worker.request import Request +from celery.exceptions import SoftTimeLimitExceeded +import billiard +from billiard.exceptions import WorkerLostError from mongoengine import ( - DateTimeField, Document, - IntField, - ListField, StringField, + ListField, + DateTimeField, + IntField, ValidationError, ) from mongoengine.connection import ConnectionFailure +from datetime import datetime +import functools -import nomad.patch # noqa: F401 -from nomad import infrastructure, utils -from nomad.app.v1.routers.info import statistics +from nomad import utils, infrastructure from nomad.config import config from nomad.config.models.config import CELERY_WORKER_ROUTING +from nomad.app.v1.routers.info import statistics +import nomad.patch # noqa: F401 + if config.logstash.enabled: from nomad.utils import structlogging diff --git a/nomad/processing/data.py b/nomad/processing/data.py index 706ebd80eb..b75902e2c3 100644 --- a/nomad/processing/data.py +++ b/nomad/processing/data.py @@ -29,84 +29,96 @@ entries, and files """ import base64 -import copy -import hashlib -import os.path -from collections.abc import Iterable, Iterator, Sequence -from contextlib import contextmanager -from datetime import datetime -from typing import Any, Union, cast - -import requests +from typing import ( + cast, + Any, + Union, +) +from collections.abc import Iterator, Iterable, Sequence import rfc3161ng -import validators -from fastapi.exceptions import RequestValidationError from mongoengine import ( - BooleanField, + StringField, DateTimeField, + BooleanField, + IntField, + ListField, DictField, EmbeddedDocument, EmbeddedDocumentField, - IntField, - ListField, - StringField, ) from pymongo import UpdateOne from structlog import wrap_logger -from structlog.processors import StackInfoRenderer, TimeStamper, format_exc_info +from contextlib import contextmanager +import copy +import os.path +from datetime import datetime +import hashlib +from structlog.processors import StackInfoRenderer, format_exc_info, TimeStamper +import requests +from fastapi.exceptions import RequestValidationError +import validators -from nomad import client, datamodel, infrastructure, metainfo, parsing, search, utils -from nomad.app.v1.models import ( - Aggregation, - MetadataEditRequest, - MetadataPagination, - MetadataRequired, - TermsAggregation, - restrict_query_to_upload, +from nomad import ( + utils, + infrastructure, + search, + datamodel, + metainfo, + parsing, + client, ) -from nomad.app.v1.routers.metainfo import store_package_definition -from nomad.archive import ( - delete_partial_archives_from_mongo, - to_json, - write_partial_archive_to_mongo, -) -from nomad.common import is_safe_relative_path from nomad.config import config -from nomad.config.models.config import Reprocess +from nomad.common import is_safe_relative_path from nomad.config.models.plugins import ExampleUploadEntryPoint -from nomad.datamodel import ( - AuthLevel, - EditableUserMetadata, - EntryArchive, - EntryMetadata, - MongoEntryMetadata, - MongoSystemMetadata, - MongoUploadMetadata, - ServerContext, -) + from nomad.datamodel.datamodel import RFC3161Timestamp from nomad.files import ( + RawPathInfo, PathObject, + UploadFiles, PublicUploadFiles, - RawPathInfo, StagingUploadFiles, - UploadFiles, create_tmp_dir, ) -from nomad.groups import get_group_ids, user_group_exists +from nomad.groups import user_group_exists, get_group_ids from nomad.metainfo.data_type import Datatype, Datetime -from nomad.normalizing import normalizers -from nomad.parsing import Parser -from nomad.parsing.parsers import match_parser, parser_dict from nomad.processing.base import ( Proc, - ProcessAlreadyRunning, - ProcessFailure, - ProcessStatus, process, process_local, + ProcessStatus, + ProcessFailure, + ProcessAlreadyRunning, +) +from nomad.parsing import Parser +from nomad.parsing.parsers import parser_dict, match_parser +from nomad.normalizing import normalizers +from nomad.datamodel import ( + EntryArchive, + EntryMetadata, + MongoUploadMetadata, + MongoEntryMetadata, + MongoSystemMetadata, + EditableUserMetadata, + AuthLevel, + ServerContext, ) +from nomad.archive import ( + write_partial_archive_to_mongo, + delete_partial_archives_from_mongo, + to_json, +) +from nomad.app.v1.models import ( + MetadataEditRequest, + Aggregation, + TermsAggregation, + MetadataPagination, + MetadataRequired, + restrict_query_to_upload, +) +from nomad.app.v1.routers.metainfo import store_package_definition from nomad.search import update_metadata as es_update_metadata +from nomad.config.models.config import Reprocess from nomad.utils.pydantic import CustomErrorWrapper section_metadata = datamodel.EntryArchive.metadata.name diff --git a/nomad/search.py b/nomad/search.py index 0a3785622d..52b8a21d85 100644 --- a/nomad/search.py +++ b/nomad/search.py @@ -34,9 +34,13 @@ partially implemented. import json import math -from collections.abc import Callable, Generator, Iterable, Iterator from enum import Enum -from typing import Any, cast +from typing import ( + Any, + cast, +) +from collections.abc import Callable +from collections.abc import Generator, Iterable, Iterator import elasticsearch.helpers from elasticsearch.exceptions import RequestError, TransportError @@ -76,7 +80,12 @@ from nomad.app.v1.models.models import ( Value, ) from nomad.config import config -from nomad.datamodel import AuthorReference, EntryArchive, EntryMetadata, UserReference +from nomad.datamodel import ( + EntryArchive, + EntryMetadata, + AuthorReference, + UserReference, +) from nomad.groups import MongoUserGroup from nomad.metainfo import Datetime, Package, Quantity from nomad.metainfo.elasticsearch_extension import ( diff --git a/nomad/utils/exampledata.py b/nomad/utils/exampledata.py index 4603a39b65..7846e8f9fe 100644 --- a/nomad/utils/exampledata.py +++ b/nomad/utils/exampledata.py @@ -16,16 +16,16 @@ # limitations under the License. # -import os -from datetime import datetime, timedelta from typing import Any +from datetime import datetime, timedelta +import os -from nomad import files, search -from nomad.datamodel import EntryArchive, EntryMetadata, Results -from nomad.datamodel.metainfo import runschema +from nomad import search, files +from nomad.datamodel import EntryMetadata, EntryArchive, Results from nomad.datamodel.metainfo.workflow import Workflow -from nomad.normalizing import normalizers from nomad.processing.data import mongo_upload_metadata +from nomad.normalizing import normalizers +from nomad.datamodel.metainfo import runschema class ExampleData: @@ -61,8 +61,8 @@ class ExampleData: es_nomad_version: str = None, archive_nomad_version: str = None, ): - from nomad import processing as proc from tests.test_files import create_test_upload_files + from nomad import processing as proc errors = None @@ -145,8 +145,8 @@ class ExampleData: parser_name: str | None = None, ): """Creates an entry from a mainfile which then gets parsed and normalized.""" - from nomad import parsing from nomad.parsing import parsers + from nomad import parsing assert upload_id in self.uploads, 'Must create the upload first' diff --git a/nomad/utils/json_transformer.py b/nomad/utils/json_transformer.py index 1a59ace792..4d07d68537 100644 --- a/nomad/utils/json_transformer.py +++ b/nomad/utils/json_transformer.py @@ -20,7 +20,7 @@ from typing import Any import jmespath -from nomad.datamodel.metainfo.annotations import Condition, Rule, Rules +from nomad.datamodel.metainfo.annotations import Rules, Rule, Condition class Transformer: diff --git a/nomad/utils/structlogging.py b/nomad/utils/structlogging.py index 3cd4d85ba4..f0303ee1b5 100644 --- a/nomad/utils/structlogging.py +++ b/nomad/utils/structlogging.py @@ -25,22 +25,21 @@ take keyword arguments for structured data. Otherwise `get_logger` can be used similar to the standard `logging.getLogger`. """ -import json +from typing import cast, Any import logging -import os.path -import re from logging.handlers import WatchedFileHandler -from typing import Any, cast - -import logstash import structlog from structlog.processors import ( - JSONRenderer, StackInfoRenderer, - TimeStamper, format_exc_info, + TimeStamper, + JSONRenderer, ) from structlog.stdlib import LoggerFactory +import logstash +import json +import re +import os.path from nomad import utils from nomad.config import config diff --git a/pyproject.toml b/pyproject.toml index a51ecf825c..698b09fa88 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -154,7 +154,6 @@ indent-width = 4 select = [ "E", # pycodestyle "F401", # remove unused import - "I001", # sort imports "PL", # pylint "UP", # pyupgrade "W", # pycodestyle @@ -175,10 +174,9 @@ ignore = [ "PLR5501", # else-if-used ] fixable = ["ALL"] -isort.split-on-trailing-comma = false [tool.ruff.lint.extend-per-file-ignores] -"__init__.py" = ["F401", "I001"] +"__init__.py" = ["F401"] "nomad/app/v1/models/graph/utils.py" = [ "UP007", ] # causes pydantic model building errors diff --git a/tests/app/test_app.py b/tests/app/test_app.py index 6140f085b9..12a36607c0 100644 --- a/tests/app/test_app.py +++ b/tests/app/test_app.py @@ -16,9 +16,8 @@ # limitations under the License. # -import os - import pytest +import os from nomad.config import config diff --git a/tests/app/test_dcat.py b/tests/app/test_dcat.py index 1f0ecd7111..4f08b698f2 100644 --- a/tests/app/test_dcat.py +++ b/tests/app/test_dcat.py @@ -16,15 +16,14 @@ # limitations under the License. # -from datetime import datetime - import pytest +from datetime import datetime from fastapi.testclient import TestClient from nomad.app.dcat.main import app from nomad.app.dcat.mapping import Mapping -from nomad.datamodel import Dataset from nomad.datamodel.results import Material, Results +from nomad.datamodel import Dataset from nomad.utils.exampledata import ExampleData diff --git a/tests/app/test_h5grove.py b/tests/app/test_h5grove.py index a5b7446b38..592cb623ec 100644 --- a/tests/app/test_h5grove.py +++ b/tests/app/test_h5grove.py @@ -15,16 +15,15 @@ # See the License for the specific language governing permissions and # limitations under the License. # +import pytest import os - import h5py -import pytest from fastapi.testclient import TestClient from nomad.app import h5grove_app -from nomad.config import config -from nomad.files import StagingUploadFiles from nomad.utils.exampledata import ExampleData +from nomad.files import StagingUploadFiles +from nomad.config import config @pytest.fixture diff --git a/tests/app/test_optimade.py b/tests/app/test_optimade.py index 3b95f9173b..a7841ff89a 100644 --- a/tests/app/test_optimade.py +++ b/tests/app/test_optimade.py @@ -17,15 +17,15 @@ # import json - import pytest +from nomad.processing import Upload from nomad import utils +from nomad.search import search from nomad.app.optimade import parse_filter from nomad.app.optimade.common import provider_specific_fields -from nomad.processing import Upload -from nomad.search import search from nomad.utils.exampledata import ExampleData + from tests.fixtures.infrastructure import clear_elastic, clear_raw_files diff --git a/tests/app/test_resources.py b/tests/app/test_resources.py index 4f1b3929fa..e76d787079 100644 --- a/tests/app/test_resources.py +++ b/tests/app/test_resources.py @@ -15,22 +15,21 @@ # See the License for the specific language governing permissions and # limitations under the License. # +import pytest import json -import time +from fastapi.testclient import TestClient +import httpx from urllib.parse import urlencode - +import time import dateutil.parser -import httpx -import pytest -from fastapi.testclient import TestClient +from nomad.config import config from nomad.app.resources.main import app, remove_mongo from nomad.app.resources.routers.resources import ( aflow_prototypes_db, - optimade_providers, springer_materials_db, + optimade_providers, ) -from nomad.config import config def _to_datetime(datetime_str): diff --git a/tests/app/v1/routers/common.py b/tests/app/v1/routers/common.py index 20f17289dd..55a522a635 100644 --- a/tests/app/v1/routers/common.py +++ b/tests/app/v1/routers/common.py @@ -16,16 +16,17 @@ # limitations under the License. # +import pytest +from typing import Literal, Any import json import re -from typing import Any, Literal +from devtools import debug from urllib.parse import urlencode -import pytest -from devtools import debug +from nomad.utils import deep_get from nomad.datamodel import results -from nomad.utils import deep_get + from tests.utils import assert_at_least, assert_url_query_args, build_url n_code_names = results.Simulation.program_name.a_elasticsearch[ diff --git a/tests/app/v1/routers/test_auth.py b/tests/app/v1/routers/test_auth.py index 2c5e3e67c8..c814260a3c 100644 --- a/tests/app/v1/routers/test_auth.py +++ b/tests/app/v1/routers/test_auth.py @@ -16,9 +16,8 @@ # limitations under the License. # -from urllib.parse import urlencode - import pytest +from urllib.parse import urlencode def perform_get_token_test(client, http_method, status_code, username, password): diff --git a/tests/app/v1/routers/test_datasets.py b/tests/app/v1/routers/test_datasets.py index 7153ee770a..36cd3de91c 100644 --- a/tests/app/v1/routers/test_datasets.py +++ b/tests/app/v1/routers/test_datasets.py @@ -16,16 +16,16 @@ # limitations under the License. # -from datetime import datetime -from urllib.parse import urlencode - import pytest +from urllib.parse import urlencode +from datetime import datetime -from nomad import processing -from nomad.app.v1.models import Any_, Query from nomad.datamodel import Dataset +from nomad import processing from nomad.search import search +from nomad.app.v1.models import Query, Any_ from nomad.utils.exampledata import ExampleData + from tests.fixtures.users import admin_user_id from .common import assert_response diff --git a/tests/app/v1/routers/test_entries.py b/tests/app/v1/routers/test_entries.py index 36985eb08f..fbdfaaae17 100644 --- a/tests/app/v1/routers/test_entries.py +++ b/tests/app/v1/routers/test_entries.py @@ -16,37 +16,37 @@ # limitations under the License. # +import pytest +from urllib.parse import urlencode +import zipfile import io import json -import zipfile -from urllib.parse import urlencode - -import pytest from nomad.metainfo.elasticsearch_extension import entry_type, schema_separator from nomad.utils.exampledata import ExampleData -from tests.test_files import append_raw_files, example_mainfile_contents # noqa: F401 + +from tests.test_files import example_mainfile_contents, append_raw_files # noqa: F401 from tests.variables import python_schema_name from .common import ( aggregation_exclude_from_search_test_parameters, - aggregation_test_parameters, - aggregation_test_parameters_default, - assert_aggregation_response, - assert_aggregations, + assert_response, assert_base_metadata_response, - assert_browser_download_headers, - assert_metadata_response, - assert_pagination, assert_query_response, + assert_metadata_response, assert_required, - assert_response, + assert_aggregations, + assert_pagination, + assert_browser_download_headers, + post_query_test_parameters, get_query_test_parameters, + perform_owner_test, owner_test_parameters, pagination_test_parameters, + aggregation_test_parameters, + aggregation_test_parameters_default, + assert_aggregation_response, perform_entries_metadata_test, - perform_owner_test, - post_query_test_parameters, ) """ diff --git a/tests/app/v1/routers/test_entries_archive_edit.py b/tests/app/v1/routers/test_entries_archive_edit.py index ba9903ebde..8a2e90107d 100644 --- a/tests/app/v1/routers/test_entries_archive_edit.py +++ b/tests/app/v1/routers/test_entries_archive_edit.py @@ -17,7 +17,6 @@ # import json - import pytest from nomad.datamodel.datamodel import EntryArchive, EntryMetadata diff --git a/tests/app/v1/routers/test_entries_edit.py b/tests/app/v1/routers/test_entries_edit.py index 1d3db4a4df..cd793d3fb4 100644 --- a/tests/app/v1/routers/test_entries_edit.py +++ b/tests/app/v1/routers/test_entries_edit.py @@ -16,22 +16,22 @@ # limitations under the License. # -from datetime import datetime - import pytest +from datetime import datetime -from nomad import processing as proc -from nomad import utils -from nomad.datamodel import Dataset from nomad.search import search +from nomad.datamodel import Dataset +from nomad import processing as proc, utils from nomad.utils.exampledata import ExampleData + from tests.app.v1.routers.common import assert_response from tests.processing.test_edit_metadata import ( - all_admin_entry_metadata, - all_coauthor_entry_metadata, assert_metadata_edited, + all_coauthor_entry_metadata, + all_admin_entry_metadata, ) + logger = utils.get_logger(__name__) diff --git a/tests/app/v1/routers/test_federation.py b/tests/app/v1/routers/test_federation.py index 3b8d8284b5..cb990557fa 100644 --- a/tests/app/v1/routers/test_federation.py +++ b/tests/app/v1/routers/test_federation.py @@ -1,10 +1,9 @@ +import requests import json +import pytest +from copy import deepcopy import logging import zlib -from copy import deepcopy - -import pytest -import requests from nomad.config import config from nomad.utils.structlogging import LogstashFormatter diff --git a/tests/app/v1/routers/test_graph.py b/tests/app/v1/routers/test_graph.py index 5a12924f66..38f0670da8 100644 --- a/tests/app/v1/routers/test_graph.py +++ b/tests/app/v1/routers/test_graph.py @@ -18,11 +18,11 @@ import pytest -from nomad.datamodel import EntryArchive -from nomad.datamodel.metainfo import SCHEMA_IMPORT_ERROR, simulationworkflowschema from nomad.graph.graph_reader import EntryReader, Token +from nomad.datamodel import EntryArchive from nomad.utils.exampledata import ExampleData from tests.archive.test_archive import assert_dict +from nomad.datamodel.metainfo import simulationworkflowschema, SCHEMA_IMPORT_ERROR # try: # from rich.pretty import pprint diff --git a/tests/app/v1/routers/test_materials.py b/tests/app/v1/routers/test_materials.py index a1e998720b..8490f39724 100644 --- a/tests/app/v1/routers/test_materials.py +++ b/tests/app/v1/routers/test_materials.py @@ -16,27 +16,27 @@ # limitations under the License. # -from urllib.parse import urlencode - import pytest +from urllib.parse import urlencode -from nomad.datamodel import results from nomad.metainfo.elasticsearch_extension import material_entry_type +from nomad.datamodel import results + from tests.test_files import example_mainfile_contents # noqa: F401 from .common import ( aggregation_exclude_from_search_test_parameters, - aggregation_test_parameters_default, - assert_aggregation_response, - assert_metadata_response, assert_pagination, + assert_metadata_response, assert_required, - get_query_test_parameters, - owner_test_parameters, - pagination_test_parameters, perform_metadata_test, perform_owner_test, + owner_test_parameters, post_query_test_parameters, + get_query_test_parameters, + pagination_test_parameters, + aggregation_test_parameters_default, + assert_aggregation_response, ) """ diff --git a/tests/app/v1/routers/test_metainfo.py b/tests/app/v1/routers/test_metainfo.py index a34cb5be58..8d4e2e78a4 100644 --- a/tests/app/v1/routers/test_metainfo.py +++ b/tests/app/v1/routers/test_metainfo.py @@ -21,11 +21,11 @@ from zipfile import ZipFile import pytest -from nomad.app.v1.routers.metainfo import store_package_definition from nomad.config import config -from nomad.datamodel import ClientContext, EntryArchive -from nomad.metainfo import MetainfoReferenceError, MSection -from nomad.utils import create_uuid, generate_entry_id +from nomad.app.v1.routers.metainfo import store_package_definition +from nomad.datamodel import EntryArchive, ClientContext +from nomad.metainfo import MSection, MetainfoReferenceError +from nomad.utils import generate_entry_id, create_uuid from tests.processing.test_data import run_processing diff --git a/tests/app/v1/routers/test_suggestions.py b/tests/app/v1/routers/test_suggestions.py index 093c20ed7e..937aad115a 100644 --- a/tests/app/v1/routers/test_suggestions.py +++ b/tests/app/v1/routers/test_suggestions.py @@ -27,10 +27,8 @@ to assert for certain aspects in the responses. """ import pytest - from nomad.metainfo.elasticsearch_extension import entry_type from nomad.utils.exampledata import ExampleData - from .common import assert_response diff --git a/tests/app/v1/routers/test_systems.py b/tests/app/v1/routers/test_systems.py index 6b76eb777c..debb8bdef0 100644 --- a/tests/app/v1/routers/test_systems.py +++ b/tests/app/v1/routers/test_systems.py @@ -19,21 +19,21 @@ import re from io import BytesIO, StringIO -import ase.io -import numpy as np import pytest +import numpy as np +import ase.io from ase import Atoms as ASEAtoms -from nomad.app.v1.routers.systems import FormatFeature, WrapModeEnum, format_map +from nomad.units import ureg +from nomad.normalizing.common import ase_atoms_from_nomad_atoms from nomad.datamodel.datamodel import EntryArchive +from nomad.datamodel.results import Results, Material, System from nomad.datamodel.metainfo import runschema from nomad.datamodel.metainfo.system import Atoms -from nomad.datamodel.results import Material, Results, System -from nomad.normalizing.common import ase_atoms_from_nomad_atoms -from nomad.units import ureg from nomad.utils.exampledata import ExampleData +from nomad.app.v1.routers.systems import format_map, FormatFeature, WrapModeEnum -from .common import assert_browser_download_headers, assert_response +from .common import assert_response, assert_browser_download_headers def ase_atoms(content, format): diff --git a/tests/app/v1/routers/uploads/test_basic_uploads.py b/tests/app/v1/routers/uploads/test_basic_uploads.py index a31f7ca2c2..6546dd8b7d 100644 --- a/tests/app/v1/routers/uploads/test_basic_uploads.py +++ b/tests/app/v1/routers/uploads/test_basic_uploads.py @@ -18,12 +18,12 @@ import io import os -import tempfile import time import zipfile -from collections.abc import Iterable from datetime import datetime +import tempfile from typing import Any +from collections.abc import Iterable import pytest import requests @@ -41,15 +41,15 @@ from tests.app.v1.routers.common import ( assert_response, perform_get, ) -from tests.config.models.test_plugins import ( - mock_example_upload_entry_point, - mock_plugin_package, -) from tests.processing.test_edit_metadata import ( all_admin_metadata, all_coauthor_metadata, assert_metadata_edited, ) +from tests.config.models.test_plugins import ( + mock_plugin_package, + mock_example_upload_entry_point, +) from tests.test_files import ( assert_upload_files, empty_file, diff --git a/tests/app/v1/test_models.py b/tests/app/v1/test_models.py index 9210f75d21..7328abd093 100644 --- a/tests/app/v1/test_models.py +++ b/tests/app/v1/test_models.py @@ -17,16 +17,14 @@ # from __future__ import annotations - -import sys - import pytest -import yaml from pydantic import BaseModel, Field, ValidationError +import yaml +import sys +from nomad.utils import strip from nomad.app.v1.models.graph import GraphRequest from nomad.app.v1.models.graph.utils import generate_request_model, mapped -from nomad.utils import strip @pytest.fixture() diff --git a/tests/app/v1/test_utils.py b/tests/app/v1/test_utils.py index 5ed2c55176..ba6fd19fcf 100644 --- a/tests/app/v1/test_utils.py +++ b/tests/app/v1/test_utils.py @@ -1,5 +1,4 @@ import pytest - from nomad.app.v1.utils import get_query_keys diff --git a/tests/archive/test_archive.py b/tests/archive/test_archive.py index 0c35c9b5b0..84e133d29a 100644 --- a/tests/archive/test_archive.py +++ b/tests/archive/test_archive.py @@ -15,42 +15,42 @@ # See the License for the specific language governing permissions and # limitations under the License. # -import json -import os.path from datetime import datetime -from io import BytesIO from typing import Any - -import msgpack import pytest +import msgpack +from io import BytesIO +import os.path +import json + import yaml from nomad import utils -from nomad.archive import ( - ArchiveQueryError, - RequiredReader, - compute_required_with_referenced, - create_partial_archive, - query_archive, - read_archive, - read_partial_archive_from_mongo, - read_partial_archives_from_mongo, - write_archive, - write_partial_archive_to_mongo, -) -from nomad.archive.converter import convert_archive -from nomad.archive.storage import _decode, _entries_per_block, to_json from nomad.config import config -from nomad.datamodel import ClientContext, EntryArchive +from nomad.archive.converter import convert_archive from nomad.metainfo import ( - Context, - MetainfoError, - MProxy, MSection, Quantity, - QuantityReference, Reference, SubSection, + QuantityReference, + MetainfoError, + Context, + MProxy, +) +from nomad.datamodel import EntryArchive, ClientContext +from nomad.archive.storage import _decode, _entries_per_block, to_json +from nomad.archive import ( + write_archive, + read_archive, + ArchiveQueryError, + query_archive, + write_partial_archive_to_mongo, + read_partial_archive_from_mongo, + read_partial_archives_from_mongo, + create_partial_archive, + compute_required_with_referenced, + RequiredReader, ) from nomad.utils.exampledata import ExampleData diff --git a/tests/archive/test_storage.py b/tests/archive/test_storage.py index 6ce614b53e..4a2de3dbf6 100644 --- a/tests/archive/test_storage.py +++ b/tests/archive/test_storage.py @@ -5,7 +5,10 @@ import msgpack import msgspec.msgpack import pytest -from nomad.archive.storage_v2 import ArchiveDict, ArchiveList +from nomad.archive.storage_v2 import ( + ArchiveList, + ArchiveDict, +) def generate_random_json(depth=10, width=4, simple=False): diff --git a/tests/config/models/test_plugins.py b/tests/config/models/test_plugins.py index 7d702f33e7..a7d2f42ebb 100644 --- a/tests/config/models/test_plugins.py +++ b/tests/config/models/test_plugins.py @@ -18,13 +18,12 @@ import os import tempfile - import pytest - from nomad.config import Config + from nomad.config.models.plugins import ( - APIEntryPoint, ExampleUploadEntryPoint, + APIEntryPoint, UploadResource, ) diff --git a/tests/config/models/test_ui.py b/tests/config/models/test_ui.py index 606e9af0fb..ce0626c7c8 100644 --- a/tests/config/models/test_ui.py +++ b/tests/config/models/test_ui.py @@ -22,13 +22,13 @@ from nomad.config.models.ui import ( App, Axis, AxisQuantity, - Column, Columns, + Column, + Rows, RowActions, - RowActionURL, RowDetails, - Rows, RowSelection, + RowActionURL, ) diff --git a/tests/conftest.py b/tests/conftest.py index a72d3e2687..66c1faa36e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -16,17 +16,17 @@ # limitations under the License. # import builtins -import logging -import os -import socketserver -import tempfile +from pathlib import Path +from io import StringIO +import pytest import time +import os +import logging import warnings -from io import StringIO -from pathlib import Path +import tempfile -import pytest from fastapi.testclient import TestClient +import socketserver from nomad.config import config from nomad.config.models.plugins import Schema, add_plugin, remove_plugin @@ -35,8 +35,8 @@ from nomad.config.models.plugins import Schema, add_plugin, remove_plugin config.logstash.enabled = False # noqa: E402 # this must be set *before* the other modules are imported from nomad import utils -from nomad.app.main import app from nomad.utils import structlogging +from nomad.app.main import app # Set up pytest to pass control to the debugger on an exception. if os.getenv('_PYTEST_RAISE', '0') != '0': @@ -68,8 +68,8 @@ pytest_plugins = ( ) -import structlog from structlog.testing import LogCapture +import structlog @pytest.fixture(scope='function') diff --git a/tests/data/schemas/nomadschemaexample/schema.py b/tests/data/schemas/nomadschemaexample/schema.py index 2f076b6d57..2bf501f006 100644 --- a/tests/data/schemas/nomadschemaexample/schema.py +++ b/tests/data/schemas/nomadschemaexample/schema.py @@ -1,17 +1,16 @@ -import numpy as np - -from nomad.datamodel.data import EntryData -from nomad.datamodel.metainfo.annotations import ELNAnnotation, ELNComponentEnum from nomad.metainfo import ( - Datetime, - MEnum, - MSection, - Package, Quantity, + Package, Section, - SectionProxy, + MEnum, + Datetime, + MSection, SubSection, + SectionProxy, ) +from nomad.datamodel.data import EntryData +from nomad.datamodel.metainfo.annotations import ELNAnnotation, ELNComponentEnum +import numpy as np m_package = Package() diff --git a/tests/datamodel/metainfo/test_annotations.py b/tests/datamodel/metainfo/test_annotations.py index fb1208394b..2d0f472f42 100644 --- a/tests/datamodel/metainfo/test_annotations.py +++ b/tests/datamodel/metainfo/test_annotations.py @@ -19,13 +19,13 @@ import pytest from pydantic import ValidationError +from nomad.metainfo import Quantity from nomad.datamodel.metainfo.annotations import ( - ELNAnnotation, PlotAnnotation, + ELNAnnotation, PlotlyGraphObjectAnnotation, ) from nomad.datamodel.metainfo.plot import PlotlyError -from nomad.metainfo import Quantity @pytest.mark.parametrize( diff --git a/tests/datamodel/metainfo/test_plotly.py b/tests/datamodel/metainfo/test_plotly.py index 038cffbd0e..63d6daf217 100644 --- a/tests/datamodel/metainfo/test_plotly.py +++ b/tests/datamodel/metainfo/test_plotly.py @@ -1,5 +1,4 @@ import json - from tests.normalizing.conftest import run_processing diff --git a/tests/datamodel/metainfo/test_substance.py b/tests/datamodel/metainfo/test_substance.py index 6b30e54d32..78c63e39a5 100644 --- a/tests/datamodel/metainfo/test_substance.py +++ b/tests/datamodel/metainfo/test_substance.py @@ -16,13 +16,12 @@ # limitations under the License. # -import json from collections.abc import Iterable - import pytest +import json -from nomad.datamodel.metainfo.basesections import v1 as basesections from tests.normalizing.conftest import run_processing +from nomad.datamodel.metainfo.basesections import v1 as basesections class MockResponse: diff --git a/tests/datamodel/test_context.py b/tests/datamodel/test_context.py index f8250df5fb..189753fec5 100644 --- a/tests/datamodel/test_context.py +++ b/tests/datamodel/test_context.py @@ -16,20 +16,20 @@ # limitations under the License. # -import json import os -import re import pytest +import json +import re -from nomad import files, processing, utils +from nomad import utils, files, processing +from nomad.metainfo.metainfo import MSection +from nomad.parsing.parser import ArchiveParser from nomad.datamodel import Context -from nomad.datamodel.context import ClientContext, ServerContext, parse_path +from nomad.datamodel.context import ServerContext, ClientContext, parse_path from nomad.datamodel.datamodel import EntryArchive, EntryMetadata +from nomad.processing import Upload, Entry, ProcessStatus from nomad.datamodel.metainfo import runschema -from nomad.metainfo.metainfo import MSection -from nomad.parsing.parser import ArchiveParser -from nomad.processing import Entry, ProcessStatus, Upload @pytest.fixture(scope='module') diff --git a/tests/datamodel/test_datamodel.py b/tests/datamodel/test_datamodel.py index e0b263d41e..306f2ad7c9 100644 --- a/tests/datamodel/test_datamodel.py +++ b/tests/datamodel/test_datamodel.py @@ -21,12 +21,11 @@ A generator for random test calculations. """ import random - -import pytest from essential_generators import DocumentGenerator +import pytest -from nomad.datamodel.metainfo import SCHEMA_IMPORT_ERROR, runschema from nomad.parsing.parsers import parser_dict +from nomad.datamodel.metainfo import runschema, SCHEMA_IMPORT_ERROR number_of = 20 @@ -73,7 +72,7 @@ low_numbers_for_geometries = [1, 2, 2, 3, 3, 4, 4] @pytest.mark.skipif(runschema is None, reason=SCHEMA_IMPORT_ERROR) def test_common_metainfo(): from runschema.run import Run - from runschema.system import Atoms, System + from runschema.system import System, Atoms run = Run() system = run.m_create(System) @@ -84,8 +83,8 @@ def test_common_metainfo(): @pytest.mark.skipif(runschema is None, reason=SCHEMA_IMPORT_ERROR) def test_vasp_metainfo(): - from electronicparsers.vasp.metainfo import vasp # noqa: F401 from runschema.run import Run + from electronicparsers.vasp.metainfo import vasp # noqa: F401 run = Run() assert 'vasp_src_date' in run.m_def.all_quantities diff --git a/tests/datamodel/test_hdf5.py b/tests/datamodel/test_hdf5.py index 427b20ccd2..bbdb88e143 100644 --- a/tests/datamodel/test_hdf5.py +++ b/tests/datamodel/test_hdf5.py @@ -16,18 +16,19 @@ # limitations under the License. # +import pytest +import numpy as np import os - import h5py -import numpy as np -import pytest from nomad import files, processing -from nomad.datamodel import EntryArchive, EntryData, EntryMetadata +from nomad.datamodel import EntryData, EntryArchive, EntryMetadata from nomad.datamodel.context import ServerContext -from nomad.datamodel.hdf5 import HDF5Dataset, HDF5Reference from nomad.metainfo import Quantity +from nomad.datamodel.hdf5 import HDF5Reference, HDF5Dataset + + external_file = 'tests/data/datamodel/context.h5' diff --git a/tests/datamodel/test_metadata.py b/tests/datamodel/test_metadata.py index 0d6c40fd9f..09cc397ba5 100644 --- a/tests/datamodel/test_metadata.py +++ b/tests/datamodel/test_metadata.py @@ -16,16 +16,15 @@ # limitations under the License. # -from datetime import datetime - -import numpy as np import pytest +import numpy as np +from datetime import datetime import pytz -from nomad.datamodel import EntryData -from nomad.datamodel.datamodel import EntryArchive, EntryMetadata, SearchableQuantity -from nomad.metainfo import Datetime, MEnum, MSection, Quantity, SubSection +from nomad.metainfo import Quantity, MSection, SubSection, Datetime, MEnum +from nomad.datamodel.datamodel import EntryMetadata, SearchableQuantity, EntryArchive from nomad.metainfo.elasticsearch_extension import schema_separator +from nomad.datamodel import EntryData from tests.variables import python_schema_name diff --git a/tests/datamodel/test_schema.py b/tests/datamodel/test_schema.py index c06f260122..17ccdea3ab 100644 --- a/tests/datamodel/test_schema.py +++ b/tests/datamodel/test_schema.py @@ -17,21 +17,21 @@ # import os.path - import pytest +from nomad.metainfo import MetainfoError from nomad.datamodel.context import ServerContext -from nomad.datamodel.data import AuthorReference, Query, UserReference from nomad.datamodel.datamodel import EntryArchive, EntryMetadata -from nomad.datamodel.metainfo.annotations import valid_eln_components, valid_eln_types -from nomad.metainfo import MetainfoError +from nomad.datamodel.data import UserReference, AuthorReference, Query +from nomad.datamodel.metainfo.annotations import valid_eln_types, valid_eln_components from nomad.metainfo.data_type import Datatype from nomad.parsing.parser import ArchiveParser from nomad.processing.data import Upload from nomad.utils import get_logger, strip -from tests.metainfo.test_yaml_schema import yaml_to_package + from tests.normalizing.conftest import run_normalize from tests.test_files import create_test_upload_files +from tests.metainfo.test_yaml_schema import yaml_to_package def test_schema_processing(raw_files_function, no_warn): diff --git a/tests/examples/test_archive_query.py b/tests/examples/test_archive_query.py index 5cad68b2d0..86c0eaf844 100644 --- a/tests/examples/test_archive_query.py +++ b/tests/examples/test_archive_query.py @@ -16,13 +16,14 @@ # limitations under the License. # -import importlib import os.path +import importlib import sys from nomad.utils.exampledata import ExampleData -from tests.normalizing.conftest import run_normalize + from tests.parsing.test_parsing import run_singular_parser +from tests.normalizing.conftest import run_normalize from tests.test_client import async_api_v1 # noqa: F401 diff --git a/tests/examples/test_docs.py b/tests/examples/test_docs.py index ef1a43720d..e8b737a9fb 100644 --- a/tests/examples/test_docs.py +++ b/tests/examples/test_docs.py @@ -1,12 +1,12 @@ +import yaml import json import os.path -import yaml - from nomad.metainfo import Package from nomad.units import ureg -from tests.normalizing.conftest import run_normalize + from tests.parsing.test_parsing import run_singular_parser +from tests.normalizing.conftest import run_normalize def _file(path): diff --git a/tests/examples/test_metainfo.py b/tests/examples/test_metainfo.py index 7392808678..3c42051e03 100644 --- a/tests/examples/test_metainfo.py +++ b/tests/examples/test_metainfo.py @@ -1,7 +1,7 @@ -import os import runpy - import pytest +import os + prefix = os.path.join(__file__, '../../../examples/metainfo') diff --git a/tests/fixtures/data.py b/tests/fixtures/data.py index d5000b0c38..a041704c35 100644 --- a/tests/fixtures/data.py +++ b/tests/fixtures/data.py @@ -17,6 +17,7 @@ from nomad.datamodel.datamodel import SearchableQuantity from nomad.metainfo.elasticsearch_extension import schema_separator from nomad.processing import ProcessStatus from nomad.utils.exampledata import ExampleData +from tests.variables import python_schema_name, yaml_schema_name, yaml_schema_root from tests.normalizing.conftest import run_normalize from tests.parsing import test_parsing from tests.processing import test_data as test_processing @@ -26,7 +27,6 @@ from tests.utils import ( create_template_upload_file, set_upload_entry_metadata, ) -from tests.variables import python_schema_name, yaml_schema_name, yaml_schema_root @pytest.fixture(scope='session') diff --git a/tests/fixtures/group_uploads.py b/tests/fixtures/group_uploads.py index 290b2b6d0b..b0d8109c89 100644 --- a/tests/fixtures/group_uploads.py +++ b/tests/fixtures/group_uploads.py @@ -11,7 +11,6 @@ Values: """ from collections.abc import Sequence - import pytest from nomad.utils.exampledata import ExampleData diff --git a/tests/graph/test_definition_reader.py b/tests/graph/test_definition_reader.py index 354f9fc00e..f67385897f 100644 --- a/tests/graph/test_definition_reader.py +++ b/tests/graph/test_definition_reader.py @@ -21,8 +21,8 @@ import pytest from nomad.graph.graph_reader import DefinitionReader from nomad.metainfo import ( - MSection, Package, + MSection, Quantity, Reference, SectionProxy, diff --git a/tests/graph/test_graph_reader.py b/tests/graph/test_graph_reader.py index d6f9d75cd2..ebcdc887ca 100644 --- a/tests/graph/test_graph_reader.py +++ b/tests/graph/test_graph_reader.py @@ -22,17 +22,17 @@ from datetime import datetime import pytest import yaml -from nomad.datamodel import EntryArchive from nomad.graph.graph_reader import ( EntryReader, + UploadReader, + UserReader, FileSystemReader, - GeneralReader, MongoReader, + GeneralReader, Token, - UploadReader, - UserReader, ) from nomad.graph.lazy_wrapper import LazyWrapper +from nomad.datamodel import EntryArchive from nomad.utils.exampledata import ExampleData from tests.normalizing.conftest import simulationworkflowschema diff --git a/tests/metainfo/test_attributes.py b/tests/metainfo/test_attributes.py index 32db3438de..13edf2b9d0 100644 --- a/tests/metainfo/test_attributes.py +++ b/tests/metainfo/test_attributes.py @@ -18,20 +18,20 @@ import datetime -import numpy as np import pytest +import numpy as np import pytz from nomad.metainfo import ( - Attribute, - Datetime, - MEnum, MSection, Quantity, + Attribute, + MEnum, Reference, + Datetime, Section, ) -from nomad.metainfo.metainfo import Definition, MQuantity +from nomad.metainfo.metainfo import MQuantity, Definition from nomad.metainfo.util import validate_allowable_unit from nomad.units import ureg diff --git a/tests/metainfo/test_data_frames.py b/tests/metainfo/test_data_frames.py index 9f1ee88851..b32aff0867 100644 --- a/tests/metainfo/test_data_frames.py +++ b/tests/metainfo/test_data_frames.py @@ -2,13 +2,22 @@ import datetime import numpy as np import pandas as pd -import pytest import xarray as xr +import pytest -from nomad.metainfo.data_frames import DataFrameTemplate, ValuesTemplate -from nomad.metainfo.metainfo import Datetime, MEnum, MSection, Package +from nomad.metainfo.metainfo import ( + MSection, + Package, + MEnum, + Datetime, +) +from nomad.metainfo.data_frames import ( + ValuesTemplate, + DataFrameTemplate, +) from nomad.units import ureg + m_package = Package() # Values diff --git a/tests/metainfo/test_elasticsearch_extension.py b/tests/metainfo/test_elasticsearch_extension.py index e9aafb1575..6001560fb8 100644 --- a/tests/metainfo/test_elasticsearch_extension.py +++ b/tests/metainfo/test_elasticsearch_extension.py @@ -17,28 +17,28 @@ # from datetime import date - -import numpy as np import pytest +import numpy as np from elasticsearch_dsl import Keyword from nomad.config import config +from nomad.utils.exampledata import ExampleData from nomad.datamodel.datamodel import SearchableQuantity -from nomad.metainfo import Datetime, MEnum, MSection, Quantity, SubSection, Unit +from nomad.metainfo import MSection, Quantity, SubSection, Datetime, Unit, MEnum from nomad.metainfo.elasticsearch_extension import ( Elasticsearch, create_indices, - create_searchable_quantity, - entry_index, - entry_type, index_entries_with_materials, + entry_type, + material_type, material_entry_type, + entry_index, material_index, - material_type, + create_searchable_quantity, ) -from nomad.utils.exampledata import ExampleData -from tests.app.v1.routers.common import perform_quantity_search_test + from tests.fixtures.infrastructure import clear_elastic_infra +from tests.app.v1.routers.common import perform_quantity_search_test @pytest.fixture(scope='module') diff --git a/tests/metainfo/test_full_storage_quantity.py b/tests/metainfo/test_full_storage_quantity.py index e08520aad6..9acb42dcf1 100644 --- a/tests/metainfo/test_full_storage_quantity.py +++ b/tests/metainfo/test_full_storage_quantity.py @@ -18,12 +18,12 @@ import pytest from nomad.metainfo import ( - Attribute, - MetainfoError, MSection, Quantity, - Section, + Attribute, SubSection, + MetainfoError, + Section, ) from nomad.metainfo.util import MQuantity from nomad.units import ureg diff --git a/tests/metainfo/test_hash_id.py b/tests/metainfo/test_hash_id.py index 6e2b678431..3c3e44bb2e 100644 --- a/tests/metainfo/test_hash_id.py +++ b/tests/metainfo/test_hash_id.py @@ -1,4 +1,4 @@ -from nomad.metainfo import MEnum, MSection, Quantity +from nomad.metainfo import Quantity, MSection, MEnum def simple_quantity(): diff --git a/tests/metainfo/test_metainfo.py b/tests/metainfo/test_metainfo.py index 394d44b588..ea08bba6ca 100644 --- a/tests/metainfo/test_metainfo.py +++ b/tests/metainfo/test_metainfo.py @@ -20,33 +20,40 @@ # in-depth tests in test_* files of the same module. from math import isnan - +import pytest import numpy as np import pandas as pd import pint.quantity -import pytest -from nomad.metainfo import ( - Annotation, - AnnotationModel, - DefinitionAnnotation, - SectionAnnotation, -) -from nomad.metainfo.example import SCC, Parsing, Run, System, SystemHash, VaspRun -from nomad.metainfo.example import m_package as example_package from nomad.metainfo.metainfo import ( - Definition, - DeriveError, - MCategory, - MetainfoError, MSection, - Package, - Quantity, + MCategory, Section, + Quantity, SubSection, + Definition, + Package, + DeriveError, + MetainfoError, derived, ) +from nomad.metainfo import ( + Annotation, + DefinitionAnnotation, + SectionAnnotation, + AnnotationModel, +) +from nomad.metainfo.example import ( + Run, + VaspRun, + System, + SystemHash, + Parsing, + SCC, + m_package as example_package, +) from nomad.units import ureg + from tests.metainfo import MTypes diff --git a/tests/metainfo/test_mongodb_extension.py b/tests/metainfo/test_mongodb_extension.py index ff1687b766..3f03c65a6d 100644 --- a/tests/metainfo/test_mongodb_extension.py +++ b/tests/metainfo/test_mongodb_extension.py @@ -17,11 +17,9 @@ # import json - import numpy as np - -from nomad.metainfo import MSection, Quantity, Section, SubSection -from nomad.metainfo.mongoengine_extension import Mongo, MongoDocument +from nomad.metainfo import MSection, Section, Quantity, SubSection +from nomad.metainfo.mongoengine_extension import MongoDocument, Mongo class B(MSection): diff --git a/tests/metainfo/test_package.py b/tests/metainfo/test_package.py index 583ccb35e6..75d70c3d2c 100644 --- a/tests/metainfo/test_package.py +++ b/tests/metainfo/test_package.py @@ -16,7 +16,7 @@ # limitations under the License. # -from nomad.metainfo import MSection, Package +from nomad.metainfo import Package, MSection m_package = Package(aliases=['nomad.datamodel.test_package']) diff --git a/tests/metainfo/test_quantities.py b/tests/metainfo/test_quantities.py index 0e6842b2d3..ad39b0e063 100644 --- a/tests/metainfo/test_quantities.py +++ b/tests/metainfo/test_quantities.py @@ -24,14 +24,14 @@ import pytest import pytz from nomad.metainfo.metainfo import ( - JSON, - URL, Bytes, Capitalized, Datetime, Dimension, + JSON, MSection, Quantity, + URL, Unit, units, ) diff --git a/tests/metainfo/test_references.py b/tests/metainfo/test_references.py index 8a7f14a00a..c9f20fcc98 100644 --- a/tests/metainfo/test_references.py +++ b/tests/metainfo/test_references.py @@ -16,26 +16,25 @@ # limitations under the License. # -import os.path from typing import cast - import pytest +import os.path -from nomad.datamodel import AuthorReference, UserReference +from nomad.datamodel import UserReference, AuthorReference from nomad.metainfo import ( - Context, - File, - MetainfoReferenceError, - MProxy, MSection, - Package, Quantity, - QuantityReference, - Reference, Section, SubSection, + MProxy, + Reference, + QuantityReference, + File, + MetainfoReferenceError, + Package as MetainfoPackage, + Context, + Package, ) -from nomad.metainfo import Package as MetainfoPackage class Referenced(MSection): @@ -384,7 +383,7 @@ def test_def_reference(): @pytest.mark.parametrize('mainfile', ['intra-entry', 'inter-entry']) def test_parse_with_references(mainfile): - from nomad.client import normalize_all, parse + from nomad.client import parse, normalize_all entry_archive = parse( os.path.join( diff --git a/tests/metainfo/test_sections.py b/tests/metainfo/test_sections.py index 7ed0276321..04de671f98 100644 --- a/tests/metainfo/test_sections.py +++ b/tests/metainfo/test_sections.py @@ -22,7 +22,7 @@ import pytest from nomad.metainfo import MSection -from nomad.metainfo.metainfo import Package, Quantity, Section, SubSection +from nomad.metainfo.metainfo import Package, Quantity, SubSection, Section def test_base_section(): @@ -251,7 +251,7 @@ def test_path(): assert SubSection.used_sections[ChildSection.m_def] == [EntryArchive.child] assert ChildSection.m_def.path == 'child' - from nomad.datamodel.metainfo.workflow import Task, Workflow + from nomad.datamodel.metainfo.workflow import Workflow, Task assert Workflow.m_def.path == 'workflow2' assert Task.m_def.path == '__no_archive_path__' diff --git a/tests/metainfo/test_to_dict.py b/tests/metainfo/test_to_dict.py index 8c296a8868..91e2288fab 100644 --- a/tests/metainfo/test_to_dict.py +++ b/tests/metainfo/test_to_dict.py @@ -16,16 +16,16 @@ # limitations under the License. # -import numpy as np import pytest +import numpy as np import yaml from nomad.app.v1.routers.metainfo import ( get_package_by_section_definition_id, store_package_definition, ) -from nomad.metainfo import MCategory, MSection, Quantity, SubSection -from nomad.metainfo.metainfo import Definition, MEnum, Package, Reference +from nomad.metainfo import MSection, MCategory, Quantity, SubSection +from nomad.metainfo.metainfo import Package, MEnum, Reference, Definition # resolve_references are tested in .test_references # type specific serialization is tested in .test_quantities diff --git a/tests/metainfo/test_yaml_schema.py b/tests/metainfo/test_yaml_schema.py index 950d8927c6..67df990850 100644 --- a/tests/metainfo/test_yaml_schema.py +++ b/tests/metainfo/test_yaml_schema.py @@ -20,18 +20,18 @@ import numpy as np import pytest import yaml +from nomad.utils import strip from nomad.metainfo import ( - Context, - MetainfoError, - MProxy, - MSection, Package, + MSection, Quantity, Reference, - Section, SubSection, + Section, + MProxy, + MetainfoError, + Context, ) -from nomad.utils import strip m_package = Package() diff --git a/tests/mkdocs/test_mkdocs_metainfo.py b/tests/mkdocs/test_mkdocs_metainfo.py index 368288ff1c..0ddda157da 100644 --- a/tests/mkdocs/test_mkdocs_metainfo.py +++ b/tests/mkdocs/test_mkdocs_metainfo.py @@ -19,7 +19,7 @@ import pytest -from nomad.metainfo import Datetime, MSection, Package, Quantity, Reference +from nomad.metainfo import MSection, Quantity, Datetime, Reference, Package from nomad.mkdocs.metainfo import ( get_property_description, get_property_type_info, diff --git a/tests/mkdocs/test_mkdocs_pydantic.py b/tests/mkdocs/test_mkdocs_pydantic.py index 15a9bda32e..1183cde07a 100644 --- a/tests/mkdocs/test_mkdocs_pydantic.py +++ b/tests/mkdocs/test_mkdocs_pydantic.py @@ -17,18 +17,17 @@ # from enum import Enum -from typing import Annotated, Literal, Optional, Union # type: ignore - import pytest +from typing import Union, Optional +from typing import Literal, Annotated # type: ignore from pydantic import BaseModel, Field - from nomad.config.models.ui import WidgetHistogram, WidgetTerms from nomad.mkdocs.pydantic import ( - get_field_default, - get_field_deprecated, + get_field_type_info, get_field_description, + get_field_default, get_field_options, - get_field_type_info, + get_field_deprecated, ) diff --git a/tests/normalizing/conftest.py b/tests/normalizing/conftest.py index c9c926b861..eac8d840ec 100644 --- a/tests/normalizing/conftest.py +++ b/tests/normalizing/conftest.py @@ -15,47 +15,53 @@ # See the License for the specific language governing permissions and # limitations under the License. # -import re from collections import defaultdict -from typing import Any -from warnings import warn - -import ase.build import numpy as np +from typing import Any import pytest from ase import Atoms +import ase.build +import re +from warnings import warn -from nomad.datamodel import ArchiveSection, EntryArchive -from nomad.datamodel.context import ServerContext -from nomad.datamodel.datamodel import EntryArchive, EntryMetadata -from nomad.datamodel.metainfo import runschema, simulationworkflowschema +from nomad.units import ureg +from nomad.utils import get_logger +from nomad.normalizing import normalizers +from nomad.metainfo import SubSection, Quantity +from nomad.datamodel import EntryArchive, ArchiveSection +from nomad.datamodel.results import ( + Relation, + SymmetryNew as Symmetry, + Cell, + WyckoffSet, + System as ResultSystem, +) +from nomad.datamodel.optimade import Species +from nomad.normalizing.common import cell_from_ase_atoms, nomad_atoms_from_ase_atoms +from nomad.datamodel.metainfo.simulation.method import CoreHole +from nomad.datamodel.metainfo.workflow import Workflow from nomad.datamodel.metainfo.measurements import ( - EELSMeasurement, - Instrument, Measurement, Sample, + EELSMeasurement, Spectrum, + Instrument, ) -from nomad.datamodel.metainfo.simulation.method import CoreHole -from nomad.datamodel.metainfo.workflow import Workflow -from nomad.datamodel.optimade import Species -from nomad.datamodel.results import Cell, EELSInstrument, Relation, WyckoffSet -from nomad.datamodel.results import SymmetryNew as Symmetry -from nomad.datamodel.results import System as ResultSystem -from nomad.metainfo import Quantity, SubSection -from nomad.normalizing import normalizers -from nomad.normalizing.common import cell_from_ase_atoms, nomad_atoms_from_ase_atoms +from nomad.datamodel.results import EELSInstrument + +from nomad.datamodel.context import ServerContext +from nomad.datamodel.datamodel import EntryArchive, EntryMetadata from nomad.parsing.parser import ArchiveParser from nomad.processing.data import Upload -from nomad.units import ureg -from nomad.utils import get_logger -from tests.parsing.test_parsing import ( - parse_file, - parsed_example, # noqa: F401 - parsed_template_example, # noqa: F401 - parsed_vasp_example, # noqa: F401 -) +from tests.parsing.test_parsing import parsed_vasp_example # noqa: F401 +from tests.parsing.test_parsing import parsed_template_example # noqa: F401 +from tests.parsing.test_parsing import parsed_example # noqa: F401 +from tests.parsing.test_parsing import parse_file from tests.test_files import create_test_upload_files +from nomad.datamodel.metainfo import ( + simulationworkflowschema, + runschema, +) def run_normalize(entry_archive: EntryArchive) -> EntryArchive: diff --git a/tests/normalizing/test_entry_type_and_name.py b/tests/normalizing/test_entry_type_and_name.py index dffa84450d..c0b4ba6a32 100644 --- a/tests/normalizing/test_entry_type_and_name.py +++ b/tests/normalizing/test_entry_type_and_name.py @@ -16,9 +16,7 @@ # limitations under the License. # import pytest - import tests - from .conftest import run_normalize diff --git a/tests/normalizing/test_material.py b/tests/normalizing/test_material.py index ab422266ef..c2b9289da2 100644 --- a/tests/normalizing/test_material.py +++ b/tests/normalizing/test_material.py @@ -16,18 +16,18 @@ # limitations under the License. # -import ase.build import numpy as np import pytest from ase import Atoms +import ase.build from matid.symmetry.wyckoffset import WyckoffSet # pylint: disable=import-error +from nomad.units import ureg from nomad import atomutils from nomad.config import config -from nomad.datamodel.results import ElementalComposition -from nomad.normalizing.common import ase_atoms_from_nomad_atoms -from nomad.units import ureg from nomad.utils import hash +from nomad.normalizing.common import ase_atoms_from_nomad_atoms +from nomad.datamodel.results import ElementalComposition from tests.normalizing.conftest import get_template_for_structure diff --git a/tests/normalizing/test_metainfo.py b/tests/normalizing/test_metainfo.py index 815ad7df3a..6fc097c053 100644 --- a/tests/normalizing/test_metainfo.py +++ b/tests/normalizing/test_metainfo.py @@ -17,9 +17,9 @@ # import numpy as np -from nomad.client import normalize_all -from nomad.datamodel import EntryArchive, EntryData +from nomad.datamodel import EntryData, EntryArchive from nomad.metainfo import Quantity, SubSection +from nomad.client import normalize_all def test_normalizer_level(): diff --git a/tests/normalizing/test_method.py b/tests/normalizing/test_method.py index 1f9992a15b..483753d8e6 100644 --- a/tests/normalizing/test_method.py +++ b/tests/normalizing/test_method.py @@ -17,9 +17,8 @@ # import numpy as np -import pytest - from nomad.units import ureg +import pytest def approx(value, abs=0, rel=1e-6): diff --git a/tests/normalizing/test_properties.py b/tests/normalizing/test_properties.py index 9ad5ae24b2..ad82111b39 100644 --- a/tests/normalizing/test_properties.py +++ b/tests/normalizing/test_properties.py @@ -19,20 +19,20 @@ import numpy as np import pytest -from nomad.datamodel.metainfo import SCHEMA_IMPORT_ERROR, simulationworkflowschema from nomad.units import ureg from .conftest import ( - add_template_band_structure, + get_template_dft, add_template_dos, + get_template_dos, + add_template_band_structure, + get_template_band_structure, add_template_magnetic_shielding, - add_template_magnetic_susceptibility, add_template_spin_spin_coupling, - get_template_band_structure, - get_template_dft, - get_template_dos, + add_template_magnetic_susceptibility, run_normalize, ) +from nomad.datamodel.metainfo import simulationworkflowschema, SCHEMA_IMPORT_ERROR def test_eels(eels): diff --git a/tests/normalizing/test_topology.py b/tests/normalizing/test_topology.py index 5940d8e8e9..552949f140 100644 --- a/tests/normalizing/test_topology.py +++ b/tests/normalizing/test_topology.py @@ -16,35 +16,34 @@ # limitations under the License. # -from collections import defaultdict - import numpy as np +from collections import defaultdict import pytest - from nomad.datamodel.metainfo import runschema + from nomad.units import ureg from tests.normalizing.conftest import ( # noqa: F401 - boron_nitride, - boron_nitride_topology, - check_template_active_orbitals, - conv_bcc, - conv_fcc, - get_template_active_orbitals, - get_template_computation, get_template_for_structure, get_template_topology, - graphene, - graphene_topology, - mos2, - mos2_topology, + conv_bcc, + conv_fcc, rattle, run_normalize, - single_cr_surface_topology, - single_cu_surface_topology, stack, + surf, + single_cu_surface_topology, + single_cr_surface_topology, stacked_cu_ni_surface_topology, + graphene, + graphene_topology, + boron_nitride, + boron_nitride_topology, + mos2, + mos2_topology, stacked_graphene_boron_nitride_topology, - surf, + get_template_active_orbitals, + check_template_active_orbitals, + get_template_computation, ) diff --git a/tests/parsing/test_archive_parser.py b/tests/parsing/test_archive_parser.py index e577bbb068..b9666aa564 100644 --- a/tests/parsing/test_archive_parser.py +++ b/tests/parsing/test_archive_parser.py @@ -16,15 +16,14 @@ # limitations under the License. # +import pytest import json import os import os.path -import pytest - from nomad.config import config -from nomad.datamodel import Context, EntryArchive from nomad.parsing.parser import ArchiveParser +from nomad.datamodel import EntryArchive, Context def test_archive_parser(raw_files_function): diff --git a/tests/parsing/test_file_parser.py b/tests/parsing/test_file_parser.py index d3a6e0a32c..b9ffdb65d3 100644 --- a/tests/parsing/test_file_parser.py +++ b/tests/parsing/test_file_parser.py @@ -1,15 +1,14 @@ +import pytest import numpy as np import pint -import pytest - -from nomad.datamodel.metainfo.system import Atoms from nomad.parsing.file_parser import ( - FileParser, - ParsePattern, - Quantity, TextParser, + Quantity, + ParsePattern, XMLParser, + FileParser, ) +from nomad.datamodel.metainfo.system import Atoms class TestFileParser: diff --git a/tests/parsing/test_mapping_parser.py b/tests/parsing/test_mapping_parser.py index a772a8b08c..555587fab2 100644 --- a/tests/parsing/test_mapping_parser.py +++ b/tests/parsing/test_mapping_parser.py @@ -1,27 +1,28 @@ -from copy import deepcopy -from typing import Any - -import numpy as np import pytest +import numpy as np +from typing import Any +from copy import deepcopy -from nomad.datamodel import ArchiveSection -from nomad.datamodel.metainfo.annotations import Mapper as MapperAnnotation from nomad.metainfo import Quantity, SubSection +from nomad.datamodel.metainfo.annotations import Mapper as MapperAnnotation from nomad.parsing.file_parser.mapping_parser import ( - MAPPING_ANNOTATION_KEY, - Data, - HDF5Parser, - Mapper, MappingParser, + XMLParser, MetainfoParser, - Path, - PathParser, + HDF5Parser, TextParser, + Path, Transformer, - XMLParser, + Data, + Mapper, + PathParser, + MAPPING_ANNOTATION_KEY, +) +from nomad.parsing.file_parser.text_parser import ( + TextParser as TextFileParser, + Quantity as TextQuantity, ) -from nomad.parsing.file_parser.text_parser import Quantity as TextQuantity -from nomad.parsing.file_parser.text_parser import TextParser as TextFileParser +from nomad.datamodel import ArchiveSection class BSection(ArchiveSection): diff --git a/tests/parsing/test_parsing.py b/tests/parsing/test_parsing.py index 176679775b..adfbece737 100644 --- a/tests/parsing/test_parsing.py +++ b/tests/parsing/test_parsing.py @@ -19,13 +19,13 @@ import json import os from shutil import copyfile -from unittest.mock import MagicMock, patch +from unittest.mock import patch, MagicMock import pytest from nomad import files, utils from nomad.datamodel import EntryArchive -from nomad.parsing import BrokenParser, MatchingParser, MatchingParserInterface +from nomad.parsing import BrokenParser, MatchingParserInterface, MatchingParser from nomad.parsing.parsers import match_parser, parser_dict, parsers, run_parser from nomad.utils import dump_json diff --git a/tests/parsing/test_tabular.py b/tests/parsing/test_tabular.py index 7acf5017b8..50572e427e 100644 --- a/tests/parsing/test_tabular.py +++ b/tests/parsing/test_tabular.py @@ -16,23 +16,23 @@ # limitations under the License. # -import datetime +import pytest import os import os.path import re - -import pytest +import datetime import yaml -from nomad import files from nomad.config import config -from nomad.datamodel.context import ClientContext from nomad.datamodel.datamodel import EntryArchive, EntryMetadata -from nomad.parsing.parser import ArchiveParser +from nomad.datamodel.context import ClientContext from nomad.parsing.tabular import read_table_data -from nomad.processing import Entry, ProcessStatus, Upload from nomad.utils import generate_entry_id, strip +from nomad.parsing.parser import ArchiveParser from tests.normalizing.conftest import run_normalize +from nomad.processing import Upload, Entry +from nomad.processing import ProcessStatus +from nomad import files def quantity_generator(quantity_name, header_name, shape, to_dict=False): diff --git a/tests/processing/test_base.py b/tests/processing/test_base.py index 45fbe45603..d1e2cf8ca3 100644 --- a/tests/processing/test_base.py +++ b/tests/processing/test_base.py @@ -15,20 +15,20 @@ # See the License for the specific language governing permissions and # limitations under the License. # +import pytest import random -import threading import time +import threading from typing import Any -import pytest -from mongoengine import IntField, ListField, StringField +from mongoengine import StringField, IntField, ListField from nomad.processing.base import ( Proc, ProcessAlreadyRunning, - ProcessStatus, process, process_local, + ProcessStatus, ) random.seed(0) diff --git a/tests/processing/test_data.py b/tests/processing/test_data.py index d538f39a91..f32e0f1469 100644 --- a/tests/processing/test_data.py +++ b/tests/processing/test_data.py @@ -16,39 +16,39 @@ # limitations under the License. # -import json +from collections.abc import Generator +import pytest import os.path import re import shutil import zipfile -from collections.abc import Generator - -import pytest +import json import yaml -from nomad import infrastructure, utils -from nomad.archive import read_partial_archive_from_mongo, to_json +from nomad import utils, infrastructure from nomad.config import config from nomad.config.models.config import BundleImportSettings +from nomad.archive import read_partial_archive_from_mongo, to_json +from nomad.files import UploadFiles, StagingUploadFiles, PublicUploadFiles +from nomad.parsing.parser import Parser +from nomad.parsing import parsers from nomad.datamodel import ServerContext from nomad.datamodel.data import EntryData -from nomad.datamodel.datamodel import ArchiveSection, EntryArchive, EntryData -from nomad.files import PublicUploadFiles, StagingUploadFiles, UploadFiles from nomad.metainfo import Package, Quantity, Reference, SubSection -from nomad.parsing import parsers -from nomad.parsing.parser import Parser -from nomad.processing import Entry, ProcessStatus, Upload -from nomad.search import refresh as search_refresh -from nomad.search import search +from nomad.processing import Upload, Entry, ProcessStatus +from nomad.search import search, refresh as search_refresh from nomad.utils.exampledata import ExampleData +from nomad.datamodel.datamodel import EntryArchive, EntryData, ArchiveSection + +from tests.test_search import assert_search_upload from tests.test_files import ( assert_upload_files, - example_file_aux, example_file_mainfile, + example_file_aux, ) -from tests.test_search import assert_search_upload from tests.utils import create_template_upload_file, set_upload_entry_metadata + # Package with some metainfo schemas used only for testing. m_package = Package(name='test_schemas') diff --git a/tests/processing/test_edit_metadata.py b/tests/processing/test_edit_metadata.py index 96963944b8..6d53da2b89 100644 --- a/tests/processing/test_edit_metadata.py +++ b/tests/processing/test_edit_metadata.py @@ -15,17 +15,18 @@ # See the License for the specific language governing permissions and # limitations under the License. # +import pytest from datetime import datetime -import pytest from fastapi.exceptions import RequestValidationError from nomad import datamodel, metainfo from nomad.metainfo.data_type import Datatype -from nomad.processing import MetadataEditRequestHandler, Upload +from nomad.processing import Upload, MetadataEditRequestHandler from nomad.processing.data import editable_metadata, mongo_upload_metadata from nomad.search import search + all_coauthor_metadata = dict( # All attributes which a coauthor+ can edit upload_name='a humble upload name', diff --git a/tests/processing/test_rfc3161.py b/tests/processing/test_rfc3161.py index 28f1bcc80b..e559a53246 100644 --- a/tests/processing/test_rfc3161.py +++ b/tests/processing/test_rfc3161.py @@ -23,9 +23,9 @@ import httpx import pytest import rfc3161ng -from nomad.archive import read_archive, to_json, write_archive +from nomad.archive import write_archive, read_archive, to_json from nomad.datamodel.datamodel import RFC3161Timestamp -from nomad.processing.data import Entry, get_rfc3161_token +from nomad.processing.data import get_rfc3161_token, Entry @pytest.mark.parametrize( diff --git a/tests/states/archives/create_archives.py b/tests/states/archives/create_archives.py index 0b53682f6d..bcee46b0a3 100644 --- a/tests/states/archives/create_archives.py +++ b/tests/states/archives/create_archives.py @@ -17,7 +17,6 @@ # import math - from nomad.utils.exampledata import create_entry_archive diff --git a/tests/states/entry.py b/tests/states/entry.py index bbd97182e0..767a77b370 100644 --- a/tests/states/entry.py +++ b/tests/states/entry.py @@ -17,12 +17,10 @@ # import json - -from nomad import files, infrastructure -from nomad.processing import Upload +from nomad import infrastructure, files from nomad.utils.exampledata import ExampleData, create_entry_archive - from .archives.create_archives import archive_dft_bulk +from nomad.processing import Upload def dft(): diff --git a/tests/states/search.py b/tests/states/search.py index 6a53a211cc..e3ef1fc19c 100644 --- a/tests/states/search.py +++ b/tests/states/search.py @@ -16,11 +16,10 @@ # limitations under the License. # from datetime import datetime, timedelta - from nomad import infrastructure -from nomad.atomutils import chemical_symbols -from nomad.units import ureg from nomad.utils import create_uuid +from nomad.units import ureg +from nomad.atomutils import chemical_symbols from nomad.utils.exampledata import ExampleData material_h2o = { diff --git a/tests/states/uploads.py b/tests/states/uploads.py index a79aa893b8..52ae1ed4e9 100644 --- a/tests/states/uploads.py +++ b/tests/states/uploads.py @@ -16,12 +16,11 @@ # limitations under the License. # -from nomad import files, infrastructure +from nomad import infrastructure, files from nomad.processing import Upload from nomad.utils.exampledata import ExampleData - from .archives.create_archives import archive_dft_bulk -from .groups import delete_group, init_gui_test_groups +from .groups import init_gui_test_groups, delete_group default_access = {'coauthors': ['scooper'], 'reviewers': ['ttester']} twin_access = { diff --git a/tests/test_atomutils.py b/tests/test_atomutils.py index e9dc5f5561..97655c0ede 100644 --- a/tests/test_atomutils.py +++ b/tests/test_atomutils.py @@ -16,9 +16,8 @@ # limitations under the License. # import pytest - from nomad.atomutils import Formula -from nomad.datamodel.results import ElementalComposition, Material +from nomad.datamodel.results import Material, ElementalComposition @pytest.mark.parametrize( diff --git a/tests/test_cli.py b/tests/test_cli.py index 1350894136..3ee028698b 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -16,22 +16,20 @@ # limitations under the License. # -import datetime +import pytest +import click.testing import json import os -import tempfile +import datetime import time +import tempfile -import click.testing -import pytest - -from nomad import files -from nomad import processing as proc -from nomad.cli import cli -from nomad.cli.cli import POPO +from nomad import processing as proc, files from nomad.config import config -from nomad.processing import Entry, ProcessStatus, Upload from nomad.search import search +from nomad.cli import cli +from nomad.cli.cli import POPO +from nomad.processing import Upload, Entry, ProcessStatus from nomad.utils.exampledata import ExampleData # TODO there is much more to test diff --git a/tests/test_client.py b/tests/test_client.py index 35211bf701..ce2f246cf5 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -15,23 +15,28 @@ # See the License for the specific language governing permissions and # limitations under the License. # -import json import os -import pytest from httpx import AsyncClient +import pytest +import json + from pydantic import ValidationError from nomad.app.main import app from nomad.client.archive import ArchiveQuery from nomad.datamodel import EntryArchive, User -from nomad.datamodel.metainfo import SCHEMA_IMPORT_ERROR, runschema -from nomad.datamodel.metainfo.annotations import Rule, Rules +from nomad.datamodel.metainfo import runschema, SCHEMA_IMPORT_ERROR +from nomad.datamodel.metainfo.annotations import ( + Rule, + Rules, +) from nomad.metainfo import MSection, SubSection from nomad.utils.json_transformer import Transformer from tests.fixtures.users import users from tests.processing import test_data as test_processing + # TODO: more tests diff --git a/tests/test_common.py b/tests/test_common.py index 432be865b7..919538e69e 100644 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -17,8 +17,7 @@ # import pytest - -from nomad.common import is_safe_path, is_safe_relative_path +from nomad.common import is_safe_relative_path, is_safe_path @pytest.mark.parametrize( diff --git a/tests/test_config.py b/tests/test_config.py index 20fbe5d18f..7cc0f50705 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -18,13 +18,12 @@ import os import re - import pytest import yaml from pydantic import ValidationError from nomad.config import load_config -from nomad.config.models.plugins import Parser, ParserEntryPoint, Schema +from nomad.config.models.plugins import Parser, Schema, ParserEntryPoint from nomad.utils import flatten_dict from .utils import assert_log diff --git a/tests/test_doi.py b/tests/test_doi.py index bcb4e61df0..60498040f7 100644 --- a/tests/test_doi.py +++ b/tests/test_doi.py @@ -15,12 +15,10 @@ # See the License for the specific language governing permissions and # limitations under the License. # -from unittest.mock import MagicMock - -import pytest - from nomad.config import config from nomad.doi import DOI, DOIException +import pytest +from unittest.mock import MagicMock def test_create(mongo_function, user1, no_warn): diff --git a/tests/test_files.py b/tests/test_files.py index e2ca1d432f..519be1ec04 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -16,33 +16,31 @@ # limitations under the License. # -import itertools +from typing import Any +from collections.abc import Generator, Iterable +from datetime import datetime import os import os.path -import pathlib -import re import shutil -import zipfile -from collections.abc import Generator, Iterable -from datetime import datetime -from typing import Any - import pytest +import itertools +import zipfile +import re +import pathlib from nomad import datamodel, utils -from nomad.archive import to_json from nomad.config import config +from nomad.archive import to_json from nomad.files import ( DirectoryObject, PathObject, - PublicUploadFiles, - StagingUploadFiles, - UploadFiles, - empty_archive_file_size, empty_zip_file_size, + empty_archive_file_size, ) +from nomad.files import StagingUploadFiles, PublicUploadFiles, UploadFiles from nomad.processing import Upload + EntryWithFiles = tuple[datamodel.EntryMetadata, str] UploadWithFiles = tuple[str, list[datamodel.EntryMetadata], UploadFiles] StagingUploadWithFiles = tuple[str, list[datamodel.EntryMetadata], StagingUploadFiles] diff --git a/tests/test_logtransfer.py b/tests/test_logtransfer.py index 122c727b07..b67262fbee 100644 --- a/tests/test_logtransfer.py +++ b/tests/test_logtransfer.py @@ -1,12 +1,11 @@ -import json import logging -import os.path - +import json import pytest +import os.path from nomad import config, utils -from nomad.logtransfer import transfer_logs from nomad.utils import structlogging +from nomad.logtransfer import transfer_logs @pytest.fixture(scope='function') diff --git a/tests/test_search.py b/tests/test_search.py index 0e6eeb1f70..319dcbac43 100644 --- a/tests/test_search.py +++ b/tests/test_search.py @@ -17,9 +17,9 @@ # import json -from collections.abc import Iterable from datetime import datetime from typing import Any +from collections.abc import Iterable import pytest @@ -41,8 +41,15 @@ from nomad.metainfo.elasticsearch_extension import ( ) from nomad.metainfo.metainfo import Datetime, Quantity from nomad.metainfo.util import MEnum -from nomad.search import AuthenticationRequiredError as ARE -from nomad.search import quantity_values, refresh, search, update_by_query +from nomad.search import ( + AuthenticationRequiredError as ARE, +) +from nomad.search import ( + quantity_values, + refresh, + search, + update_by_query, +) from nomad.utils import deep_get from nomad.utils.exampledata import ExampleData from tests.variables import python_schema_name, yaml_schema_name diff --git a/tests/test_test.py b/tests/test_test.py index ef2353b7ac..bbca3fb469 100644 --- a/tests/test_test.py +++ b/tests/test_test.py @@ -16,9 +16,8 @@ # limitations under the License. # -import logging - import pytest +import logging @pytest.fixture() diff --git a/tests/test_utils.py b/tests/test_utils.py index 11f38f65f1..5d7339d68e 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -16,24 +16,24 @@ # limitations under the License. # -import time from importlib.metadata import PackageNotFoundError - -import pandas as pd +import time import pytest +import pandas as pd -from nomad import files, utils +from nomad import utils from nomad.metainfo.metainfo import MSection, Quantity, SubSection +from nomad import files from nomad.processing import Upload from nomad.utils import ( - dataframe_to_dict, - deep_get, - dict_to_dataframe, - flatten_dict, nomad_distro_metadata, - prune_dict, - rebuild_dict, structlogging, + flatten_dict, + rebuild_dict, + prune_dict, + deep_get, + dict_to_dataframe, + dataframe_to_dict, ) diff --git a/tests/utils.py b/tests/utils.py index c24fe47595..253200de91 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -23,7 +23,6 @@ import urllib.parse import zipfile from logging import LogRecord from typing import Any - import pytest -- GitLab