:py:mod:`grading_lib.makefile`
==============================

.. py:module:: grading_lib.makefile

.. autodoc2-docstring:: grading_lib.makefile
   :allowtitles:

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

Classes
~~~~~~~

.. list-table::
   :class: autosummary longtable
   :align: left

   * - :py:obj:`Rule <grading_lib.makefile.Rule>`
     - .. autodoc2-docstring:: grading_lib.makefile.Rule
          :summary:
   * - :py:obj:`VariableDefinition <grading_lib.makefile.VariableDefinition>`
     - .. autodoc2-docstring:: grading_lib.makefile.VariableDefinition
          :summary:
   * - :py:obj:`Makefile <grading_lib.makefile.Makefile>`
     - .. autodoc2-docstring:: grading_lib.makefile.Makefile
          :summary:
   * - :py:obj:`MakefileBaseTestCase <grading_lib.makefile.MakefileBaseTestCase>`
     -

Functions
~~~~~~~~~

.. list-table::
   :class: autosummary longtable
   :align: left

   * - :py:obj:`run_targets <grading_lib.makefile.run_targets>`
     - .. autodoc2-docstring:: grading_lib.makefile.run_targets
          :summary:

Data
~~~~

.. list-table::
   :class: autosummary longtable
   :align: left

   * - :py:obj:`RULE_PATTERN <grading_lib.makefile.RULE_PATTERN>`
     - .. autodoc2-docstring:: grading_lib.makefile.RULE_PATTERN
          :summary:
   * - :py:obj:`VAR_DEF_PATTERN <grading_lib.makefile.VAR_DEF_PATTERN>`
     - .. autodoc2-docstring:: grading_lib.makefile.VAR_DEF_PATTERN
          :summary:

API
~~~

.. py:data:: RULE_PATTERN
   :canonical: grading_lib.makefile.RULE_PATTERN
   :value: 'compile(...)'

   .. autodoc2-docstring:: grading_lib.makefile.RULE_PATTERN

.. py:data:: VAR_DEF_PATTERN
   :canonical: grading_lib.makefile.VAR_DEF_PATTERN
   :value: 'compile(...)'

   .. autodoc2-docstring:: grading_lib.makefile.VAR_DEF_PATTERN

.. py:function:: run_targets(targets: list[str], makefile_name: str = 'answer.mk', cwd: typing.Optional[str | pathlib.Path] = None) -> grading_lib.common.CommandResult
   :canonical: grading_lib.makefile.run_targets

   .. autodoc2-docstring:: grading_lib.makefile.run_targets

.. py:class:: Rule(targets: str | list[str], prerequisites: list[str], recipe: list[str])
   :canonical: grading_lib.makefile.Rule

   .. autodoc2-docstring:: grading_lib.makefile.Rule

   .. rubric:: Initialization

   .. autodoc2-docstring:: grading_lib.makefile.Rule.__init__

   .. py:property:: prereqs
      :canonical: grading_lib.makefile.Rule.prereqs
      :type: list[str]

      .. autodoc2-docstring:: grading_lib.makefile.Rule.prereqs

   .. py:method:: __str__() -> str
      :canonical: grading_lib.makefile.Rule.__str__

   .. py:method:: __repr__() -> str
      :canonical: grading_lib.makefile.Rule.__repr__

   .. py:method:: is_empty() -> bool
      :canonical: grading_lib.makefile.Rule.is_empty

      .. autodoc2-docstring:: grading_lib.makefile.Rule.is_empty

.. py:class:: VariableDefinition(name: str, value: str)
   :canonical: grading_lib.makefile.VariableDefinition

   .. autodoc2-docstring:: grading_lib.makefile.VariableDefinition

   .. rubric:: Initialization

   .. autodoc2-docstring:: grading_lib.makefile.VariableDefinition.__init__

.. py:class:: Makefile(path: pathlib.Path | str, rules: list[grading_lib.makefile.Rule])
   :canonical: grading_lib.makefile.Makefile

   .. autodoc2-docstring:: grading_lib.makefile.Makefile

   .. rubric:: Initialization

   .. autodoc2-docstring:: grading_lib.makefile.Makefile.__init__

   .. py:method:: from_path(path: pathlib.Path | str) -> grading_lib.makefile.Makefile
      :canonical: grading_lib.makefile.Makefile.from_path
      :classmethod:

      .. autodoc2-docstring:: grading_lib.makefile.Makefile.from_path

   .. py:method:: from_text(text: str)
      :canonical: grading_lib.makefile.Makefile.from_text
      :classmethod:

      .. autodoc2-docstring:: grading_lib.makefile.Makefile.from_text

   .. py:method:: get_rule(targets: str | list[str]) -> typing.Optional[grading_lib.makefile.Rule]
      :canonical: grading_lib.makefile.Makefile.get_rule

      .. autodoc2-docstring:: grading_lib.makefile.Makefile.get_rule

   .. py:method:: has_rule(targets: str | list[str]) -> bool
      :canonical: grading_lib.makefile.Makefile.has_rule

      .. autodoc2-docstring:: grading_lib.makefile.Makefile.has_rule

.. py:class:: MakefileBaseTestCase(methodName='runTest')
   :canonical: grading_lib.makefile.MakefileBaseTestCase

   Bases: :py:obj:`grading_lib.common.BaseTestCase`

   .. py:attribute:: makefile_path
      :canonical: grading_lib.makefile.MakefileBaseTestCase.makefile_path
      :type: str | pathlib.Path
      :value: None

      .. autodoc2-docstring:: grading_lib.makefile.MakefileBaseTestCase.makefile_path

   .. py:attribute:: makefile
      :canonical: grading_lib.makefile.MakefileBaseTestCase.makefile
      :type: grading_lib.makefile.Makefile
      :value: None

      .. autodoc2-docstring:: grading_lib.makefile.MakefileBaseTestCase.makefile

   .. py:method:: setUpClass() -> None
      :canonical: grading_lib.makefile.MakefileBaseTestCase.setUpClass
      :classmethod:

   .. py:method:: copy_makefile(dest: typing.Optional[pathlib.Path] = None, as_name: str = 'answer.mk') -> None
      :canonical: grading_lib.makefile.MakefileBaseTestCase.copy_makefile

      .. autodoc2-docstring:: grading_lib.makefile.MakefileBaseTestCase.copy_makefile

   .. py:method:: assertHasRuleForTarget(target_name: str, msg_template: str = "Rule for a target '{target_name}' does not exist. Its behavior cannot be verified.")
      :canonical: grading_lib.makefile.MakefileBaseTestCase.assertHasRuleForTarget

      .. autodoc2-docstring:: grading_lib.makefile.MakefileBaseTestCase.assertHasRuleForTarget

   .. py:method:: assertRuleRecipeIsEmpty(target_name: str, msg_template: str = "Recipe of the rule for a target '{target_name}' is not empty.")
      :canonical: grading_lib.makefile.MakefileBaseTestCase.assertRuleRecipeIsEmpty

      .. autodoc2-docstring:: grading_lib.makefile.MakefileBaseTestCase.assertRuleRecipeIsEmpty
