Dynamic versioning
===================

pyproject.toml
---------------

.. code-block:: text

   [build-system]
   requires = ["setuptools>=70.0.0", "wheel", "build", "setuptools_scm>=8", "drain-swamp"]
   build-backend = "setuptools.build_meta"

   [project]
   # drain-swamp grabs package name from here
   name = "your-package-name"

   # See getting start --> Dependencies
   dynamic = [
       "optional-dependencies",
       "dependencies",
       "version",
   ]

   # drain-swamp sources first name from here
   authors = [  # Contact by mastodon please
       {name = "Dave Faulkmore", email = "faulkmore@protonmail.com"},
   ]

   [tool.setuptools.dynamic]
   version = {attr = "your_package_name._version.__version__"}

   [tool.setuptools.packages.find]
   where = ["src"]
   include = ["your_package_name*"]

   [tool.setuptools.dynamic]
   # @@@ editable little_shop_of_horrors_shrine_candles
   dependencies = { file = ["requirements/prod.lnk"] }
   optional-dependencies.pip = { file = ["requirements/pip.lnk"] }
   optional-dependencies.manage = { file = ["requirements/manage.lnk"] }
   # @@@ end

   [tool.drain-swamp]
   copyright_start_year = 2024

   [tool.pipenv-unlock]
   # wraps-build-backend = "setuptools.build_meta"
   version_file = "src/complete_awesome_perfect/_version.py"
   folders = [
       "ci",
   ]

   required = { target = "prod", relative_path = "requirements/prod.in" }

   # underscore: hyphen
   optionals = [
       { target = "pip", relative_path = "requirements/pip.in" },
       { target = "manage", relative_path = "requirements/manage.in" },
   ]

Change ``drain_swamp`` to your package name (underscores, not hyphens)

Provide defaults
"""""""""""""""""

.. code-block:: text

   [tool.drain-swamp]
   copyright_start_year = 2024  # this is an int, not a str

Default value for copyright_start_year is 1970

\_version.py
--------------

Here is an example ``_version.py`` file. Might need this, before the
first commit or tagged release

.. code-block:: text

   # file generated by setuptools_scm
   # don't change, don't track in version control
   TYPE_CHECKING = False
   if TYPE_CHECKING:
       from typing import Tuple, 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 = '0.0.2'
   __version_tuple__ = version_tuple = (0, 0, 2)

Always automatically generated, so don't bother fixing the static typing

Keep an eye on ``src/[package_name]/_version.py``

Beyond ``[major].[minor].[micro]`` learn about when to be using
alpha/beta/post/rc releases.

static typing
--------------

Here is ``_version.pyi`` so don't duplicate efforts.

.. code-block:: text

   from typing import Final

   version: Final[str]
   __version__: Final[str]
   __version_tuple__: Final[tuple[int | str, ...]]
   version_tuple: Final[tuple[int | str, ...]]
