hermes.commands.harvest.git
===========================

.. py:module:: hermes.commands.harvest.git


Attributes
----------

.. autoapisummary::

   hermes.commands.harvest.git.SHELL_ENCODING
   hermes.commands.harvest.git._GIT_SEP
   hermes.commands.harvest.git._GIT_FORMAT
   hermes.commands.harvest.git._GIT_ARGS


Classes
-------

.. autoapisummary::

   hermes.commands.harvest.git.NodeRegister
   hermes.commands.harvest.git.ContributorData
   hermes.commands.harvest.git.GitHarvestSettings
   hermes.commands.harvest.git.GitHarvestPlugin


Module Contents
---------------

.. py:class:: NodeRegister(cls, *order, **mapping)

   Helper class to unify Git commit authors and committers.

   This class keeps track of all registered instances and merges two :py:class:`ContributorData` instances if some
   attributes match.


   .. py:method:: add(node: Any)

      Add (or merge) a new node to the register.
      :param node: The node that should be added.



   .. py:method:: update(**kwargs)

      Add (or merge) a new item to the register with the given attribute values.

      :fixme: This is not a good implementation strategy at all.

      :param kwargs: The attribute values to be stored.



.. py:class:: ContributorData(name: str | List[str], email: str | List[str], timestamp: str | List[str], role: str | List[str])

   Stores contributor data information from Git history.


   .. py:method:: __str__()


   .. py:method:: _update_attr(target, value, unique=True)


   .. py:method:: update(name=None, email=None, timestamp=None, role=None)

      Update the current contributor with the given data.

      :param name: New name to assign (addtionally).
      :param email: New email to assign (additionally).
      :param timestamp: New timestamp to adapt time range.



   .. py:method:: merge(other: ContributorData)

      Merge another :py:class:`ContributorData` instance into this one.

      All attributes will be merged yet kept unique if required.

      :param other: The other instance that should contribute to this.



   .. py:method:: to_codemeta() -> dict

      Return the current dataset as CodeMeta.

      :return: The CodeMeta representation of this dataset.



.. py:data:: SHELL_ENCODING
   :value: 'utf-8'


.. py:data:: _GIT_SEP
   :value: '|'


.. py:data:: _GIT_FORMAT
   :value: ['%aN', '%aE', '%aI', '%cN', '%cE', '%cI']


.. py:data:: _GIT_ARGS
   :value: []


.. py:class:: GitHarvestSettings(/, **data: Any)

   Bases: :py:obj:`pydantic.BaseModel`


   !!! abstract "Usage Documentation"
       [Models](../concepts/models.md)

   A base class for creating Pydantic models.

   .. attribute:: __class_vars__

      The names of the class variables defined on the model.

   .. attribute:: __private_attributes__

      Metadata about the private attributes of the model.

   .. attribute:: __signature__

      The synthesized `__init__` [`Signature`][inspect.Signature] of the model.

   .. attribute:: __pydantic_complete__

      Whether model building is completed, or if there are still undefined fields.

   .. attribute:: __pydantic_core_schema__

      The core schema of the model.

   .. attribute:: __pydantic_custom_init__

      Whether the model has a custom `__init__` function.

   .. attribute:: __pydantic_decorators__

      Metadata containing the decorators defined on the model.
      This replaces `Model.__validators__` and `Model.__root_validators__` from Pydantic V1.

   .. attribute:: __pydantic_generic_metadata__

      A dictionary containing metadata about generic Pydantic models.
      The `origin` and `args` items map to the [`__origin__`][genericalias.__origin__]
      and [`__args__`][genericalias.__args__] attributes of [generic aliases][types-genericalias],
      and the `parameter` item maps to the `__parameter__` attribute of generic classes.

   .. attribute:: __pydantic_parent_namespace__

      Parent namespace of the model, used for automatic rebuilding of models.

   .. attribute:: __pydantic_post_init__

      The name of the post-init method for the model, if defined.

   .. attribute:: __pydantic_root_model__

      Whether the model is a [`RootModel`][pydantic.root_model.RootModel].

   .. attribute:: __pydantic_serializer__

      The `pydantic-core` `SchemaSerializer` used to dump instances of the model.

   .. attribute:: __pydantic_validator__

      The `pydantic-core` `SchemaValidator` used to validate instances of the model.

   .. attribute:: __pydantic_fields__

      A dictionary of field names and their corresponding [`FieldInfo`][pydantic.fields.FieldInfo] objects.

   .. attribute:: __pydantic_computed_fields__

      A dictionary of computed field names and their corresponding [`ComputedFieldInfo`][pydantic.fields.ComputedFieldInfo] objects.

   .. attribute:: __pydantic_extra__

      A dictionary containing extra values, if [`extra`][pydantic.config.ConfigDict.extra]
      is set to `'allow'`.

   .. attribute:: __pydantic_fields_set__

      The names of fields explicitly set during instantiation.

   .. attribute:: __pydantic_private__

      Values of private attributes set on the model instance.


.. py:class:: GitHarvestPlugin

   Bases: :py:obj:`hermes.commands.harvest.base.HermesHarvestPlugin`


   Base plugin that does harvesting.

   .. attribute:: operations

      The information recorded on the
      load operations executed by the plugin.

      :type: list[tuple[dict[str, str], dict[str, str], dict[str, str]]]

   TODO: describe the harvesting process and how this is mapped to this plugin.


   .. py:method:: _run_git(subcommand: str, *args: str) -> TextIO


   .. py:method:: __call__(command: hermes.commands.harvest.base.HermesHarvestCommand) -> hermes.model.api.SoftwareMetadata

      Implementation of a harvester that provides author, branch & remote data from Git.



   .. py:method:: _audit_contributors(contributors, audit_log: logging.Logger)


   .. py:method:: _merge_contributors(git_authors: NodeRegister, git_committers: NodeRegister) -> NodeRegister

      Merge the git authors and git committers :py:class:`NodeRegister` and assign the respective roles for each node.



