Reference¶
This document aims to provide a full reference of the usage and behaviour of Protokolo. For a full reference of the command-line options, see Command-line reference. For basic usage, please read the Usage section of the overview.
Global configuration¶
You can configure various global options in a TOML file. Protokolo loads the first match of the following files in your current working directory:
.protokolo.toml
pyproject.toml
The configuration values go in the [protokolo]
table, or the
[tool.protokolo]
table for pyproject.toml
. An example configuration looks
like this:
[protokolo]
changelog = "CHANGELOG.md"
directory = "changelog.d"
markup = "markdown"
Various Protokolo subcommands will use the above values as default values, saving you some time typing.
changelog¶
The path to your change log file. This is typically CHANGELOG
, CHANGELOG.md
,
or CHANGELOG.rst
.
directory¶
The path to the directory that contains the change log fragments and
subsections. This is typically changelog.d
.
markup¶
The markup language used by your change log file and change log fragments. Available options are:
markdown
restructuredtext
Change log directory¶
The change log directory, typically named changelog.d
, is a hierarchy of files
(fragments) and directories (sections) that can be compiled into a change log
file. The top section—the change log directory itself—typically maps to the
section of a version release in your change log file.
The change log directory and all its subdirectories must contain a
.protokolo.toml
section configuration file. If a
directory does not contain such a file, it is not a section, and is consequently
ignored.
The fragments must have a file extension corresponding to their markup language. If a file does not have such a file extension, it is not a fragment, and is consequently ignored by Protokolo.
As an example, the change log directory typically looks like this:
.
└── changelog.d
├── added
│ ├── new-feature.md
│ └── .protokolo.toml
├── fixed
│ ├── fix-lag.md
│ └── .protokolo.toml
└── .protokolo.toml
This represents the top section changelog.d
containing two subsections added
and fixed
. Each subsection has one fragment each. When compiled, it might look
a little like this:
## 1.0.0 - 2023-11-08
### Added
- Added feature `--foo`.
### Fixed
- Fixed performance issues when handling big files.
Section configuration¶
The .protokolo.toml
file in each directory configures options of the
corresponding section. The file format is TOML. The configuration values go in
the [protokolo.section]
table. An example configuration looks like this:
[protokolo.section]
title = "${version} - ${date}"
level = 2
order = 1
miscellaneous = "your-value-here"
The options are used during compilation.
title¶
A string that contains the text of the section heading, for example “Added” or “${version} - ${date}”.
Words that are prefixed by $
(e.g. $version
) or surrounded with ${}
(e.g.
${version}
) can be replaced during compile time with --format key value
(e.g. --format version 1.0.0
). Alternatively, they can be replaced by the
values of other keys in the .protokolo.toml
file. See the
Miscellaneous keys section.
${date}
is a special case. If its value is not defined anywhere, the value of
${date}
is today’s date in the format YYYY-MM-DD
.
${title}
is not valid and will not be replaced by anything.
The formatting rules of the title are identical to the Python
string.Template behaviour. Most pertinently, in
order to write $
to the title, you have to type $$
.
If no title is defined, it is automatically replaced by the string “TODO: No section title defined”.
level¶
The level of the heading as an integer. This defaults to 1, or the value of the
parent level plus 1. This effectively means you really only need to define it
once in the top section; the levels of the subsections are increased as the
subdirectories are nested. You typically set this value to ‘2’ in
changelog.d/.protokolo.toml
.
Note
There are no standard symbols assigned to levels in reStructuredText. They are supposed to be determined from the succession of headings. Because Protokolo is not an immensely smart tool, the levels are hardcoded to the levels used in Pandoc:
=
for level 1.-
for level 2.~
for level 3.^
for level 4.'
for level 5.
order¶
An integer representing the priority in ordering for a section. This does nothing for the top section.
(Sub)sections that share the same parent are normally sorted alphabetically by their title. If subsections define this option, they are instead sorted by this value, low-to-high. Sections that do not have this option defined are always sorted after sections that do.
Miscellaneous keys¶
You can define any key you want with any valid TOML value. Its value can be used as part of the formatting of the title, or for any other purpose.
Fragments¶
In fragment files, you can write any valid (or invalid) markup. If the fragment does not end with a newline character, one is implicitly added during compilation.
Fragments in the same section are sorted alphabetically by their file name stem
(i.e. the final file extension is removed). If you want to make sure that a
fragment appears first or last, you can prefix the file name with something like
000_
or zzz_
respectively.
Tip
Because of how the compilation works, you typically want to follow a few rules:
Do not start the fragment with a newline.
Do not include headings.
If the fragment represents a list item:
Start with a bullet, typically
-
or*
.End the fragment with zero or one newline.
If the fragment represents a paragraph:
Adjust its file name to make it appear exactly where you want it to appear.
End the fragment with two newlines.
Compilation¶
The main command of Protokolo is protokolo compile
. It gathers all your change
log fragment files and aggregates them into a new section in your change log
file, after which the change log fragment files are deleted.
The fragments are sorted alphabetically as described in Fragments, and the section sorting is described in order.
The section is inserted into the change log after the line containing the first
instance of protokolo-section-tag
. You typically want to comment that out. The
insertion always inserts two newlines at the start, effectively placing your
section two lines below protokolo-section-tag
. An example change log file is
as follows:
# Change log
Some text describing your change log.
<!-- protokolo-section-tag -->
## 0.1.0 - 2023-10-25
The latest release.
The compilation of the change log directory makes sure that after each section,
there are at least two newlines before the next section heading or fragment.
Before each subsection there are also at least two newlines after the preceding
section heading or fragment. These newlines can overlap, and are indicated below
using ←
. Newlines that belong to fragments are indicated using ↵
.
# Top section←
←
## Subsection 1←
←
- A fragment.↵
- Another fragment.↵
←
## Subsection 2←
←
- Last fragment.↵
Empty sections are not compiled.
Fragments are inserted as-is without any modification, except a newline is appended at the end of a fragment if one was not present in the file.