Low-level utilities (:mod:`~message_ix_models.util`)
****************************************************


.. currentmodule:: message_ix_models.util

Submodules:

.. autosummary::

   click
   context
   genno
   importlib
   _logging
   node
   pooch
   pycountry
   scenarioinfo
   sdmx

Commonly used:

.. autosummary::

   ~config.Config
   ~config.ConfigHelper
   ~context.Context
   ~scenarioinfo.ScenarioInfo
   ~scenarioinfo.Spec
   .adapt_R11_R12
   .adapt_R11_R14
   .as_codes
   broadcast
   cached
   check_support
   convert_units
   copy_column
   datetime_now_with_tz
   ffill
   identify_nodes
   iter_keys
   load_package_data
   load_private_data
   local_data_path
   make_io
   make_matched_dfs
   make_source_tech
   maybe_query
   merge_data
   minimum_version
   ~node.nodes_ex_world
   package_data_path
   private_data_path
   same_node
   same_time
   show_versions

.. automodule:: message_ix_models.util
   :members:
   :exclude-members: as_codes, eval_anno

.. autodata:: message_ix_models.util.cache.SKIP_CACHE

:mod:`.util.click`
==================

.. currentmodule:: message_ix_models.util.click

.. automodule:: message_ix_models.util.click
   :members:

   :data:`PARAMS` contains, among others:

   - :program:`--urls-from-file=…` Path to a file containing scenario URLs, one per line.
     These are parsed and stored on :attr:`.Config.scenarios`.

:mod:`.util.config`
===================

.. currentmodule:: message_ix_models.util.config

.. automodule:: message_ix_models.util.config
   :members:
   :exclude-members: Config

:mod:`.util.context`
====================

.. currentmodule:: message_ix_models.util.context

.. automodule:: message_ix_models.util.context
   :members:
   :exclude-members: Context

.. autoclass:: Context
   :members:
   :exclude-members: clone_to_dest

   Context is :class:`dict`-like, so :class:`dict` methods including :meth:`~dict.copy` and :meth:`~dict.setdefault` may be used to handle settings.
   It also provides attribute access: :py:`context.foo` is equivalent to :py:`context["foo"]`.

   A Context instance always has the following members:

   1. :attr:`core`: an instance of :class:`message_ix_models.Config`.
   2. :attr:`model`: an instance of :class:`message_ix_models.model.Config`.
   3. :attr:`report`: an instance of :class:`message_ix_models.report.Config`.

   Attributes of (1) and (2) **may** be accessed by shorthand/aliases.
   For instance, :py:`context.regions` is an alias for :py:`context.model.regions`.
   However, for clarity and to support type checking, explicit reference to the configuration class and its attributes **should** be used.

   Context provides additional methods to do common tasks that depend on configurable settings:

   .. autosummary::
      clone_to_dest
      close_db
      delete
      get_cache_path
      get_local_path
      get_platform
      get_scenario
      handle_cli_args
      only
      use_defaults

   .. The following Context methods and attribute are **deprecated**:

      .. autosummary::
         (currently none)

   .. automethod:: clone_to_dest

      To use this method, either decorate a command with :func:`.common_params`:

      .. code-block:: python

         from message_data.tools.cli import common_params

         @click.command()
         @common_params("dest")
         @click.pass_obj
         def foo(context, dest):
             scenario, mp = context.clone_to_dest()

      or, store the settings :attr:`.Config.dest_scenario` and optionally :attr:`.Config.dest_platform` on `context`:

      .. code-block:: python

         c = Context.get_instance()

         c.dest_scenario = dict(model="foo model", scenario="foo scenario")
         scenario_mp = context.clone_to_dest()

      The resulting scenario has the indicated model- and scenario names.

      If ``--url`` (or ``--platform``, ``--model``, ``--scenario``, and optionally ``--version``) are given, the identified scenario is used as a 'base' scenario, and is cloned.
      If ``--url``/``--platform`` and ``--dest`` refer to different Platform instances, then this is a two-platform clone.

      If no base scenario can be loaded, :func:`.bare.create_res` is called to generate a base scenario.

:mod:`.util.genno`
==================

.. currentmodule:: message_ix_models.util.genno

.. automodule:: message_ix_models.util.genno
   :members:

:mod:`.util.importlib`
======================

.. currentmodule:: message_ix_models.util.importlib

.. automodule:: message_ix_models.util.importlib
   :members:

:mod:`.util._logging`
=====================

.. currentmodule:: message_ix_models.util._logging

.. automodule:: message_ix_models.util._logging
   :members:

:mod:`.util.node`
=================

.. currentmodule:: message_ix_models.util.node

.. automodule:: message_ix_models.util.node
   :members:
   :exclude-members: identify_nodes

:mod:`.util.pooch`
==================

.. currentmodule:: message_ix_models.util.pooch

.. automodule:: message_ix_models.util.pooch
   :members:

:mod:`.util.pycountry`
======================

.. currentmodule:: message_ix_models.util.pycountry

.. automodule:: message_ix_models.util.pycountry
   :members:

:mod:`.util.scenarioinfo`
=========================

.. currentmodule:: message_ix_models.util.scenarioinfo

.. automodule:: message_ix_models.util.scenarioinfo
   :members:

:mod:`.util.sdmx`
=================

.. currentmodule:: message_ix_models.util.sdmx

.. automodule:: message_ix_models.util.sdmx
   :members:

:mod:`.util.slurm`
==================

.. currentmodule:: message_ix_models.util.slurm

.. automodule:: message_ix_models.util.slurm
   :members:

:mod:`.types`
=============

.. currentmodule:: message_ix_models.types

.. automodule:: message_ix_models.types
   :members: