From 88ecfc8f6eadb854dc0b00c4171a5d77d32dd014 Mon Sep 17 00:00:00 2001 From: Daniel Ellis Date: Thu, 3 Jul 2025 12:51:36 +0100 Subject: [PATCH] generating an importmap --- .DS_Store | Bin 8196 -> 8196 bytes data_request_api/.DS_Store | Bin 8196 -> 8196 bytes data_request_api/version.py | 21 +++ generate_importmap.ipynb | 363 ++++++++++++++++++++++++++++++++++++ import_graph.dot | 122 ++++++++++++ importmap.pdf | Bin 0 -> 34716 bytes 6 files changed, 506 insertions(+) create mode 100644 data_request_api/version.py create mode 100644 generate_importmap.ipynb create mode 100644 import_graph.dot create mode 100644 importmap.pdf diff --git a/.DS_Store b/.DS_Store index 23d10cc0e4d814a01fd0d1eefa452150f014b282..daf051f8b19c2724e35156e425c50ec52945be17 100644 GIT binary patch delta 426 zcmZp1XmOa}&nUGqU^hRb)Mg%mW=3x|h9rhehCGH8hE#?k&z$_^q@4UD1_lNJAYRYF zz{vL>41hca23DZjQlRP_h7?qljItn=lUoGKg|{XZ%u>yulpt>YfH!!86xmEy0cRbK^khuj689*~qfM%AU>UUsp p1R79>0pVv49%^vj-UV R1e1Lbz_ZvEF9ETD7y(*l6ixsD diff --git a/data_request_api/.DS_Store b/data_request_api/.DS_Store index 4883c520c34f1fbd47d07200caf07e3f05088268..6372abf4d40281f5608135e9d4f51be9f4bcac82 100644 GIT binary patch delta 153 zcmZp1XmOa}FUrrrz`)4BAi%(o%#aAg84Rfm@f!=Lu}^H^-OSFx!okSD*-79QBcs6N z4grP9Y69{QmRwSKaY0f}eiBgs)}(@*%;FLQgKLaT%q*;I?Ck85`-G!;I6315M60U} wbQH`CCqEF9W^A8)QBa<>1E>XT+Gbv%3Z{+4$xNHsCBCstz9+nVV{rl#02~k~M*si- delta 99 zcmZp1XmOa}FUrfnz`)4BAi%(o$xy-&4}^LQ1se;eu}^H^-OSFx!XXV(!3~zlWXMBS n#ZWn!T}Xa2zrc0I&DO%1Oq2U$@;6opGjC>>_{Oraf}I%v_;eP; diff --git a/data_request_api/version.py b/data_request_api/version.py new file mode 100644 index 00000000..f00ea493 --- /dev/null +++ b/data_request_api/version.py @@ -0,0 +1,21 @@ +# file generated by setuptools-scm +# don't change, don't track in version control + +__all__ = ["__version__", "__version_tuple__", "version", "version_tuple"] + +TYPE_CHECKING = False +if TYPE_CHECKING: + from typing import Tuple + from typing import Union + + VERSION_TUPLE = Tuple[Union[int, str], ...] +else: + VERSION_TUPLE = object + +version: str +__version__: str +__version_tuple__: VERSION_TUPLE +version_tuple: VERSION_TUPLE + +__version__ = version = '1.1.3.dev19+g38e0b48.d20250407' +__version_tuple__ = version_tuple = (1, 1, 3, 'dev19', 'g38e0b48.d20250407') diff --git a/generate_importmap.ipynb b/generate_importmap.ipynb new file mode 100644 index 00000000..4d2622c7 --- /dev/null +++ b/generate_importmap.ipynb @@ -0,0 +1,363 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# !pip install python-scalpel\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from scalpel.import_graph.import_graph import ImportGraph, Tree" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Current working directory: /Users/daniel.ellis/WIPwork/CMIP7_DReq_Software\n", + "Target directory: /Users/daniel.ellis/WIPwork/CMIP7_DReq_Software/data_request_api\n" + ] + } + ], + "source": [ + "import os\n", + "print(\"Current working directory:\", os.getcwd())\n", + "target_dir = os.getcwd()+'/data_request_api' # Use the current working directory as the target directory\n", + "print(\"Target directory:\", target_dir)\n", + "import_graph = ImportGraph(target_dir)\n", + "import_graph.build_dir_tree()\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'data_request_api.version': {'typing': ['Tuple', 'Union']},\n", + " 'data_request_api.data_request_api.__init__.py': {'version': ['*']},\n", + " 'data_request_api.data_request_api.tests.test_dreq_content': {'data_request_api.content': ['dreq_content'],\n", + " 'data_request_api.utilities.logger': ['change_log_file',\n", + " 'change_log_level']},\n", + " 'data_request_api.data_request_api.tests.test_config_cli': {'pathlib': ['Path']},\n", + " 'data_request_api.data_request_api.tests.test_optimize': {'__future__': ['print_function',\n", + " 'division',\n", + " 'unicode_literals',\n", + " 'absolute_import'],\n", + " 'data_request_api.query.data_request': ['DataRequest'],\n", + " 'data_request_api.content.dreq_content': ['_dreq_res'],\n", + " 'data_request_api.utilities.tools': ['read_json_input_file_content'],\n", + " 'data_request_api.content.dump_transformation': ['correct_dictionaries',\n", + " 'transform_content_inner',\n", + " 'get_transformed_content',\n", + " 'get_transform_settings'],\n", + " 'data_request_api.tests': ['filepath']},\n", + " 'data_request_api.data_request_api.tests.test_dump_transformation': {'__future__': ['print_function',\n", + " 'division',\n", + " 'unicode_literals',\n", + " 'absolute_import'],\n", + " 'data_request_api.utilities.tools': ['read_json_file'],\n", + " 'data_request_api.content.dump_transformation': ['correct_key_string',\n", + " 'correct_dictionaries',\n", + " 'transform_content_inner',\n", + " 'transform_content',\n", + " 'split_content_one_base',\n", + " 'get_transform_settings'],\n", + " 'data_request_api.tests': ['filepath']},\n", + " 'data_request_api.data_request_api.tests.test_consolidation': {'data_request_api.content': ['dreq_content'],\n", + " 'data_request_api.content.consolidate_export': ['_apply_consistency_fixes',\n", + " '_filter_references',\n", + " '_map_attribute',\n", + " '_map_record_id',\n", + " 'map_data'],\n", + " 'data_request_api.content.mapping_table': ['version_consistency_drop_fields',\n", + " 'version_consistency_fields'],\n", + " 'data_request_api.tests': ['filepath'],\n", + " 'data_request_api.utilities.logger': ['change_log_file', 'change_log_level'],\n", + " 'data_request_api.utilities.tools': ['read_json_file',\n", + " 'write_json_output_file_content']},\n", + " 'data_request_api.data_request_api.tests.__init__.py': {},\n", + " 'data_request_api.data_request_api.tests.test_data_request': {'__future__': ['print_function',\n", + " 'division',\n", + " 'unicode_literals',\n", + " 'absolute_import'],\n", + " 'data_request_api.utilities.tools': ['read_json_input_file_content'],\n", + " 'data_request_api.query.data_request': ['DRObjects',\n", + " 'ExperimentsGroup',\n", + " 'VariablesGroup',\n", + " 'Opportunity',\n", + " 'DataRequest',\n", + " 'version'],\n", + " 'data_request_api.query.vocabulary_server': ['VocabularyServer',\n", + " 'ConstantValueObj'],\n", + " 'data_request_api.tests': ['filepath']},\n", + " 'data_request_api.data_request_api.tests.test_vocabulary_server': {'__future__': ['print_function',\n", + " 'division',\n", + " 'unicode_literals',\n", + " 'absolute_import'],\n", + " 'data_request_api.utilities.tools': ['read_json_input_file_content'],\n", + " 'data_request_api.query.vocabulary_server': ['VocabularyServer',\n", + " 'is_link_id_or_value',\n", + " 'build_link_from_id',\n", + " 'to_plural',\n", + " 'to_singular'],\n", + " 'data_request_api.tests': ['filepath']},\n", + " 'data_request_api.data_request_api.tests.test_config': {'pathlib': ['Path'],\n", + " 'data_request_api.utilities.config': ['DEFAULT_CONFIG',\n", + " '_sanity_check',\n", + " 'load_config',\n", + " 'update_config']},\n", + " 'data_request_api.data_request_api.tests.test_cli': {'pathlib': ['Path']},\n", + " 'data_request_api.data_request_api.tests.test_decorator': {'data_request_api.utilities.decorators': ['append_kwargs_from_config'],\n", + " 'data_request_api.utilities.logger': ['change_log_file',\n", + " 'change_log_level']},\n", + " 'data_request_api.data_request_api.content.dump_transformation': {'__future__': ['division',\n", + " 'print_function',\n", + " 'unicode_literals',\n", + " 'absolute_import'],\n", + " 'collections': ['defaultdict'],\n", + " 'data_request_api.utilities.decorators': ['append_kwargs_from_config'],\n", + " 'data_request_api.utilities.logger': ['get_logger',\n", + " 'change_log_level',\n", + " 'change_log_file'],\n", + " 'data_request_api.utilities.tools': ['read_json_input_file_content',\n", + " 'write_json_output_file_content'],\n", + " 'data_request_api.content': ['dreq_content']},\n", + " 'data_request_api.data_request_api.content.consolidate_export': {'collections': ['defaultdict'],\n", + " 'data_request_api.utilities.logger': ['get_logger'],\n", + " 'mapping_table': ['version_consistency',\n", + " 'version_consistency_drop_fields',\n", + " 'version_consistency_drop_tables',\n", + " 'version_consistency_fields']},\n", + " 'data_request_api.data_request_api.content.__init__.py': {},\n", + " 'data_request_api.data_request_api.content.mapping_table': {},\n", + " 'data_request_api.data_request_api.content.dreq_content': {'filecmp': ['cmp'],\n", + " 'shutil': ['move'],\n", + " 'bs4': ['BeautifulSoup'],\n", + " 'data_request_api.content': ['consolidate_export'],\n", + " 'data_request_api.content.mapping_table': ['mapping_table'],\n", + " 'data_request_api.utilities.decorators': ['append_kwargs_from_config'],\n", + " 'data_request_api.utilities.logger': ['get_logger']},\n", + " 'data_request_api.data_request_api.utilities.config': {'importlib.metadata': ['version',\n", + " 'PackageNotFoundError'],\n", + " 'pathlib': ['Path']},\n", + " 'data_request_api.data_request_api.utilities.tools': {'__future__': ['division',\n", + " 'absolute_import',\n", + " 'print_function',\n", + " 'unicode_literals'],\n", + " 'data_request_api.utilities.logger': ['get_logger']},\n", + " 'data_request_api.data_request_api.utilities.__init__.py': {},\n", + " 'data_request_api.data_request_api.utilities.logger': {'__future__': ['unicode_literals',\n", + " 'print_function',\n", + " 'absolute_import',\n", + " 'division']},\n", + " 'data_request_api.data_request_api.utilities.parser': {},\n", + " 'data_request_api.data_request_api.utilities.decorators': {'data_request_api.utilities.config': ['_sanity_check'],\n", + " 'data_request_api.utilities.logger': ['get_logger']},\n", + " 'data_request_api.data_request_api.query.vocabulary_server': {'__future__': ['division',\n", + " 'print_function',\n", + " 'unicode_literals',\n", + " 'absolute_import'],\n", + " 'collections': ['defaultdict'],\n", + " 'data_request_api.utilities.logger': ['get_logger'],\n", + " 'data_request_api.utilities.tools': ['read_json_file']},\n", + " 'data_request_api.data_request_api.query.data_request': {'__future__': ['division',\n", + " 'print_function',\n", + " 'unicode_literals',\n", + " 'absolute_import'],\n", + " 'collections': ['defaultdict', 'namedtuple'],\n", + " 'itertools': ['product', 'chain'],\n", + " 'data_request_api.utilities.logger': ['get_logger',\n", + " 'change_log_file',\n", + " 'change_log_level'],\n", + " 'data_request_api.content.dump_transformation': ['transform_content'],\n", + " 'data_request_api.utilities.tools': ['read_json_file',\n", + " 'write_csv_output_file_content'],\n", + " 'data_request_api.query.vocabulary_server': ['VocabularyServer',\n", + " 'is_link_id_or_value',\n", + " 'build_link_from_id',\n", + " 'to_singular',\n", + " 'ConstantValueObj',\n", + " 'to_plural'],\n", + " 'data_request_api': ['version']},\n", + " 'data_request_api.data_request_api.query.__init__.py': {},\n", + " 'data_request_api.data_request_api.query.dreq_query': {'collections': ['OrderedDict'],\n", + " 'data_request_api.query.dreq_classes': ['DreqTable',\n", + " 'ExptRequest',\n", + " 'UNIQUE_VAR_NAME',\n", + " 'PRIORITY_LEVELS',\n", + " 'format_attribute_name'],\n", + " 'data_request_api.utilities.decorators': ['append_kwargs_from_config'],\n", + " 'data_request_api.utilities.tools': ['write_csv_output_file_content'],\n", + " 'data_request_api': ['version']},\n", + " 'data_request_api.data_request_api.query.dreq_classes': {'dataclasses': ['dataclass',\n", + " 'field'],\n", + " 'typing': ['Set']},\n", + " 'data_request_api.data_request_api.command_line.get_variables_metadata': {'data_request_api': ['version']},\n", + " 'data_request_api.data_request_api.command_line.config': {'data_request_api.utilities': ['config']},\n", + " 'data_request_api.data_request_api.command_line.__init__.py': {},\n", + " 'data_request_api.data_request_api.command_line.export_dreq_lists_json': {'collections': ['OrderedDict']},\n", + " 'data_request_api.data_request_api.command_line.compare_variables': {'collections': ['OrderedDict',\n", + " 'defaultdict']},\n", + " 'data_request_api.data_request_api.command_line.estimate_dreq_volume': {'collections': ['OrderedDict',\n", + " 'defaultdict']}}" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "all_leaf_nodes = import_graph.get_leaf_nodes()\n", + "\n", + "module_imports = {}\n", + "for node in all_leaf_nodes:\n", + " module_dict = import_graph.parse_import(node.ast)\n", + " module_imports[import_graph.leaf2root(node)] = module_dict\n", + "\n", + "module_imports" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Warning: using box for unknown shape rhombus\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Graph written to import_graph.dot and rendered to import_graph.pdf\n" + ] + } + ], + "source": [ + "import json\n", + "from graphviz import Digraph\n", + "import os\n", + "\n", + "# Your import data\n", + "import_data = module_imports # replace with your dict\n", + "\n", + "# Setup dot path\n", + "dot_path = \"/Users/daniel.ellis/customlib/homebrew/Caskroom/mambaforge/base/bin/\"\n", + "os.environ[\"PATH\"] = dot_path + os.pathsep + os.environ[\"PATH\"]\n", + "\n", + "dot = Digraph(comment=\"CMIPLD Module Import Graph\", engine=\"sfdp\")\n", + "dot.attr(rankdir='TB')\n", + "dot.attr(compound='true', splines='true', overlap='false', concentrate='true')\n", + "\n", + "def categorize_node(name):\n", + " if name.endswith(\".py\"):\n", + " return \"pyfile\"\n", + " if name.startswith(\"cmipld.\"):\n", + " level = name.count('.')\n", + " if level == 1:\n", + " return \"top-level\"\n", + " else:\n", + " return \"nested\"\n", + " else:\n", + " return \"external\"\n", + "\n", + "all_nodes = set()\n", + "target_nodes = set()\n", + "\n", + "for module, imports in import_data.items():\n", + " all_nodes.add(module)\n", + " for imp_module in imports.keys():\n", + " if isinstance(imp_module, int):\n", + " continue\n", + " all_nodes.add(imp_module)\n", + " target_nodes.add(imp_module)\n", + "\n", + "styles = {\n", + " \"external\": {\"color\": \"blue\", \"shape\": \"box\", \"style\": \"filled\", \"fillcolor\": \"#c6dbef\"},\n", + " \"nested\": {\"color\": \"darkgreen\", \"shape\": \"ellipse\", \"style\": \"filled\", \"fillcolor\": \"#a1d99b\"},\n", + " \"top-level\": {\"color\": \"red\", \"shape\": \"diamond\", \"style\": \"filled\", \"fillcolor\": \"#fcbba1\"},\n", + " \"isolated\": {\"color\": \"grey\", \"shape\": \"circle\", \"style\": \"filled\", \"fillcolor\": \"#eeeeee\"},\n", + " \"pyfile\": {\"color\": \"orange\", \"shape\": \"rhombus\", \"style\": \"filled\", \"fillcolor\": \"#fdd0a2\"},\n", + "}\n", + "\n", + "for node in all_nodes:\n", + " if not node:\n", + " continue\n", + " category = categorize_node(node)\n", + " if node not in target_nodes and node not in import_data:\n", + " category = \"isolated\"\n", + " style = styles.get(category, {})\n", + " dot.node(node,\n", + " color=style.get(\"color\"),\n", + " shape=style.get(\"shape\"),\n", + " style=style.get(\"style\"),\n", + " fillcolor=style.get(\"fillcolor\"))\n", + "\n", + "for module, imports in import_data.items():\n", + " for imp_module, items in imports.items():\n", + " if isinstance(imp_module, int):\n", + " continue\n", + " try:\n", + " dot.edge(module, imp_module)\n", + " except Exception as e:\n", + " print(f\"Error adding edge from {module} to {imp_module}: {e}\")\n", + "\n", + "with open(\"import_graph.dot\", \"w\") as f:\n", + " f.write(dot.source)\n", + "\n", + "dot.render(\"import_graph\", format=\"pdf\", cleanup=True)\n", + "print(\"Graph written to import_graph.dot and rendered to import_graph.pdf\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "temp", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/import_graph.dot b/import_graph.dot new file mode 100644 index 00000000..76dd9f88 --- /dev/null +++ b/import_graph.dot @@ -0,0 +1,122 @@ +// CMIPLD Module Import Graph +digraph { + rankdir=TB + compound=true concentrate=true overlap=false splines=true + "data_request_api.version" + "data_request_api.version" -> typing + "data_request_api.data_request_api.__init__.py" + "data_request_api.data_request_api.__init__.py" -> version + "data_request_api.data_request_api.tests.test_dreq_content" + "data_request_api.data_request_api.tests.test_dreq_content" -> "data_request_api.content" + "data_request_api.data_request_api.tests.test_dreq_content" -> "data_request_api.utilities.logger" + "data_request_api.data_request_api.tests.test_config_cli" + "data_request_api.data_request_api.tests.test_config_cli" -> pathlib + "data_request_api.data_request_api.tests.test_optimize" + "data_request_api.data_request_api.tests.test_optimize" -> __future__ + "data_request_api.data_request_api.tests.test_optimize" -> "data_request_api.query.data_request" + "data_request_api.data_request_api.tests.test_optimize" -> "data_request_api.content.dreq_content" + "data_request_api.data_request_api.tests.test_optimize" -> "data_request_api.utilities.tools" + "data_request_api.data_request_api.tests.test_optimize" -> "data_request_api.content.dump_transformation" + "data_request_api.data_request_api.tests.test_optimize" -> "data_request_api.tests" + "data_request_api.data_request_api.tests.test_dump_transformation" + "data_request_api.data_request_api.tests.test_dump_transformation" -> __future__ + "data_request_api.data_request_api.tests.test_dump_transformation" -> "data_request_api.utilities.tools" + "data_request_api.data_request_api.tests.test_dump_transformation" -> "data_request_api.content.dump_transformation" + "data_request_api.data_request_api.tests.test_dump_transformation" -> "data_request_api.tests" + "data_request_api.data_request_api.tests.test_consolidation" + "data_request_api.data_request_api.tests.test_consolidation" -> "data_request_api.content" + "data_request_api.data_request_api.tests.test_consolidation" -> "data_request_api.content.consolidate_export" + "data_request_api.data_request_api.tests.test_consolidation" -> "data_request_api.content.mapping_table" + "data_request_api.data_request_api.tests.test_consolidation" -> "data_request_api.tests" + "data_request_api.data_request_api.tests.test_consolidation" -> "data_request_api.utilities.logger" + "data_request_api.data_request_api.tests.test_consolidation" -> "data_request_api.utilities.tools" + "data_request_api.data_request_api.tests.__init__.py" + "data_request_api.data_request_api.tests.test_data_request" + "data_request_api.data_request_api.tests.test_data_request" -> __future__ + "data_request_api.data_request_api.tests.test_data_request" -> "data_request_api.utilities.tools" + "data_request_api.data_request_api.tests.test_data_request" -> "data_request_api.query.data_request" + "data_request_api.data_request_api.tests.test_data_request" -> "data_request_api.query.vocabulary_server" + "data_request_api.data_request_api.tests.test_data_request" -> "data_request_api.tests" + "data_request_api.data_request_api.tests.test_vocabulary_server" + "data_request_api.data_request_api.tests.test_vocabulary_server" -> __future__ + "data_request_api.data_request_api.tests.test_vocabulary_server" -> "data_request_api.utilities.tools" + "data_request_api.data_request_api.tests.test_vocabulary_server" -> "data_request_api.query.vocabulary_server" + "data_request_api.data_request_api.tests.test_vocabulary_server" -> "data_request_api.tests" + "data_request_api.data_request_api.tests.test_config" + "data_request_api.data_request_api.tests.test_config" -> pathlib + "data_request_api.data_request_api.tests.test_config" -> "data_request_api.utilities.config" + "data_request_api.data_request_api.tests.test_cli" + "data_request_api.data_request_api.tests.test_cli" -> pathlib + "data_request_api.data_request_api.tests.test_decorator" + "data_request_api.data_request_api.tests.test_decorator" -> "data_request_api.utilities.decorators" + "data_request_api.data_request_api.tests.test_decorator" -> "data_request_api.utilities.logger" + "data_request_api.data_request_api.content.dump_transformation" + "data_request_api.data_request_api.content.dump_transformation" -> __future__ + "data_request_api.data_request_api.content.dump_transformation" -> collections + "data_request_api.data_request_api.content.dump_transformation" -> "data_request_api.utilities.decorators" + "data_request_api.data_request_api.content.dump_transformation" -> "data_request_api.utilities.logger" + "data_request_api.data_request_api.content.dump_transformation" -> "data_request_api.utilities.tools" + "data_request_api.data_request_api.content.dump_transformation" -> "data_request_api.content" + "data_request_api.data_request_api.content.consolidate_export" + "data_request_api.data_request_api.content.consolidate_export" -> collections + "data_request_api.data_request_api.content.consolidate_export" -> "data_request_api.utilities.logger" + "data_request_api.data_request_api.content.consolidate_export" -> mapping_table + "data_request_api.data_request_api.content.__init__.py" + "data_request_api.data_request_api.content.mapping_table" + "data_request_api.data_request_api.content.dreq_content" + "data_request_api.data_request_api.content.dreq_content" -> filecmp + "data_request_api.data_request_api.content.dreq_content" -> shutil + "data_request_api.data_request_api.content.dreq_content" -> bs4 + "data_request_api.data_request_api.content.dreq_content" -> "data_request_api.content" + "data_request_api.data_request_api.content.dreq_content" -> "data_request_api.content.mapping_table" + "data_request_api.data_request_api.content.dreq_content" -> "data_request_api.utilities.decorators" + "data_request_api.data_request_api.content.dreq_content" -> "data_request_api.utilities.logger" + "data_request_api.data_request_api.utilities.config" + "data_request_api.data_request_api.utilities.config" -> "importlib.metadata" + "data_request_api.data_request_api.utilities.config" -> pathlib + "data_request_api.data_request_api.utilities.tools" + "data_request_api.data_request_api.utilities.tools" -> __future__ + "data_request_api.data_request_api.utilities.tools" -> "data_request_api.utilities.logger" + "data_request_api.data_request_api.utilities.__init__.py" + "data_request_api.data_request_api.utilities.logger" + "data_request_api.data_request_api.utilities.logger" -> __future__ + "data_request_api.data_request_api.utilities.parser" + "data_request_api.data_request_api.utilities.decorators" + "data_request_api.data_request_api.utilities.decorators" -> "data_request_api.utilities.config" + "data_request_api.data_request_api.utilities.decorators" -> "data_request_api.utilities.logger" + "data_request_api.data_request_api.query.vocabulary_server" + "data_request_api.data_request_api.query.vocabulary_server" -> __future__ + "data_request_api.data_request_api.query.vocabulary_server" -> collections + "data_request_api.data_request_api.query.vocabulary_server" -> "data_request_api.utilities.logger" + "data_request_api.data_request_api.query.vocabulary_server" -> "data_request_api.utilities.tools" + "data_request_api.data_request_api.query.data_request" + "data_request_api.data_request_api.query.data_request" -> __future__ + "data_request_api.data_request_api.query.data_request" -> collections + "data_request_api.data_request_api.query.data_request" -> itertools + "data_request_api.data_request_api.query.data_request" -> "data_request_api.utilities.logger" + "data_request_api.data_request_api.query.data_request" -> "data_request_api.content.dump_transformation" + "data_request_api.data_request_api.query.data_request" -> "data_request_api.utilities.tools" + "data_request_api.data_request_api.query.data_request" -> "data_request_api.query.vocabulary_server" + "data_request_api.data_request_api.query.data_request" -> data_request_api + "data_request_api.data_request_api.query.__init__.py" + "data_request_api.data_request_api.query.dreq_query" + "data_request_api.data_request_api.query.dreq_query" -> collections + "data_request_api.data_request_api.query.dreq_query" -> "data_request_api.query.dreq_classes" + "data_request_api.data_request_api.query.dreq_query" -> "data_request_api.utilities.decorators" + "data_request_api.data_request_api.query.dreq_query" -> "data_request_api.utilities.tools" + "data_request_api.data_request_api.query.dreq_query" -> data_request_api + "data_request_api.data_request_api.query.dreq_classes" + "data_request_api.data_request_api.query.dreq_classes" -> dataclasses + "data_request_api.data_request_api.query.dreq_classes" -> typing + "data_request_api.data_request_api.command_line.get_variables_metadata" + "data_request_api.data_request_api.command_line.get_variables_metadata" -> data_request_api + "data_request_api.data_request_api.command_line.config" + "data_request_api.data_request_api.command_line.config" -> "data_request_api.utilities" + "data_request_api.data_request_api.command_line.__init__.py" + "data_request_api.data_request_api.command_line.export_dreq_lists_json" + "data_request_api.data_request_api.command_line.export_dreq_lists_json" -> collections + "data_request_api.data_request_api.command_line.compare_variables" + "data_request_api.data_request_api.command_line.compare_variables" -> collections + "data_request_api.data_request_api.command_line.estimate_dreq_volume" + "data_request_api.data_request_api.command_line.estimate_dreq_volume" -> collections +} diff --git a/importmap.pdf b/importmap.pdf new file mode 100644 index 0000000000000000000000000000000000000000..783b350d7646b88ec713db0736a5ff22205d45c0 GIT binary patch literal 34716 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%0AjIt}9yL8l;GSYo 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