<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Martin Ueding (Einträge über Commitizen)</title><link>https://martin-ueding.de/</link><description></description><atom:link href="https://martin-ueding.de/categories/commitizen.xml" rel="self" type="application/rss+xml"></atom:link><language>de</language><copyright>Contents © 2026 &lt;a href="mailto:mu@martin-ueding.de"&gt;Martin Ueding&lt;/a&gt; 
&lt;p&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"&gt;&lt;img alt="Creative Commons License" style="border-width:0" src="/assets/80x15.png" /&gt;&lt;/a&gt; Dieses Werk ist lizenziert unter einer &lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"&gt;Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 4.0 International Lizenz&lt;/a&gt;.&lt;/p&gt;
</copyright><lastBuildDate>Sat, 28 Mar 2026 18:17:13 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Standardisierte Prozesse sind toll</title><link>https://martin-ueding.de/posts/standardisierte-prozesse-sind-toll/</link><dc:creator>Martin Ueding</dc:creator><description>&lt;p&gt;Wenn man viele kleine Programmierprojekte hat, sind Standardprozesse wirklich viel Wert. Ein kleines Beispiel mit Conventional Commits, Semantic Versioning und entsprechenden Werkzeugen.&lt;/p&gt;
&lt;!-- END_TEASER --&gt;

&lt;p&gt;Auf meinem Tolino mache ich mir immer wieder Anmerkungen, während ich Bücher lese. Die werden in einer Textdatei gespeichert. Um die zu parsen, habe ich mir von Google Gemini einfach ein Skript erzeugen lassen.&lt;/p&gt;
&lt;p&gt;Früher hätte ich so etwas einfach in meinen Skripte-Ordner gepackt. Allerdings hätte ich dann keine Versionskontrolle gehabt. Und daher mache ich daraus ein eigenes Projekt und Repository. Das Setup dafür ist auch gar nicht mehr schwer, wenn man einfach Standardprozesse nimmt.&lt;/p&gt;
&lt;p&gt;Für mich ist das &lt;a href="https://www.conventionalcommits.org/"&gt;Conventional Commits&lt;/a&gt; zum Verfassen der Git-Commit-Nachrichten. Dann nutze ich &lt;a href="https://semver.org/"&gt;Semantic Versioning&lt;/a&gt; um zu entscheiden, welche die nächste Versionsnummer ist. Manchmal schreibe ich einen Changelog nach &lt;a href="https://keepachangelog.com/"&gt;Keep-A-Changelog&lt;/a&gt; selbst, manchmal lasse ich den erzeugen. Ich nutze &lt;a href="https://docs.astral.sh/uv/"&gt;uv&lt;/a&gt; für das Python-Projekt und &lt;a href="https://commitizen-tools.github.io/"&gt;Commitizen&lt;/a&gt; für die Projekt-Logistik.&lt;/p&gt;
&lt;p&gt;Und so habe ich gerade eine Änderung an meinem Skript gemacht:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;tolino-note-extractor on  main [!] is 📦 v0.1.0 via 🐍 v3.14.2 
❯ git diff
diff --git a/src/tolino_note_extractor/__main__.py b/src/tolino_note_extractor/__main__.py
index 5d6497d..83a642c 100755
--- a/src/tolino_note_extractor/__main__.py
+++ b/src/tolino_note_extractor/__main__.py
@@ -23,8 +23,11 @@ def main() -&amp;gt; None:
     for author_title, notes in sorted_notes.items():
         print(f"# {author_title}")
         print()
-        print("\n\n---\n\n".join(map(dedent_lines, notes)))
-        print()
+        for note in notes:
+            print(dedent_lines(note))
+            print()
+            print("---")
+            print()


 def dedent_lines(s: str) -&amp;gt; str:
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Da kann ich jetzt einfach ein Commit machen. Mein &lt;code&gt;ca&lt;/code&gt; ist ein &lt;code&gt;git commit --all --message '...'&lt;/code&gt;. Es ist ein neues Feature, also nutze ich &lt;code&gt;feat:&lt;/code&gt; in der Nachricht:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;tolino-note-extractor on  main [!] is 📦 v0.1.0 via 🐍 v3.14.2 
❯ ca feat: leave a trailing horizontal line
[main 116f34d] feat: leave a trailing horizontal line
 1 file changed, 5 insertions(+), 2 deletions(-)
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Nun möchte ich diese neue Version veröffentlichen. Das ist normalerweise ziemlich viel kleinteilige Arbeit:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Eine neue Versionnummer überlegen: Ist das nur ein Bugfix-Release oder gibt es ein neues Feature? Ist irgendwas kaputtgegangen, ist das sogar eine neue Major-Version? Oder wenn es Marketing-Versionen sind, welche nimmt man dann?&lt;/li&gt;
&lt;li&gt;Die neue Version in die &lt;code&gt;pyproject.toml&lt;/code&gt; eintragen.&lt;/li&gt;
&lt;li&gt;Davon einen Commit machen.&lt;/li&gt;
&lt;li&gt;In Git einen Tag mit der Version anlegen.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Alles das kann ich mit nur einem Kommando machen, weil ich durch die Conventional Commits schon bei jedem Commit sage, wie groß der Sprung im Sinne von Semantic Versioning sein muss. Das Teil passt die &lt;code&gt;pyproject.toml&lt;/code&gt; an, macht einen Commit und legt den Tag an:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;tolino-note-extractor on  main is 📦 v0.1.0 via 🐍 v3.14.2 
❯ cz bump
bump: version 0.1.0 → 0.2.0
tag to create: 0.2.0
increment detected: MINOR

[main aa1b8b2] bump: version 0.1.0 → 0.2.0
 3 files changed, 8 insertions(+), 2 deletions(-)

Done!
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Dann kann ich das ganze direkt mit uv bauen:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;tolino-note-extractor on  main is 📦 v0.2.0 via 🐍 v3.14.2 
❯ uv build
Building source distribution...
Building wheel from source distribution...
Successfully built dist/tolino_note_extractor-0.2.0.tar.gz
Successfully built dist/tolino_note_extractor-0.2.0-py3-none-any.whl
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Weil mein Projekt ja einfach nur ein Python-Paket ist, kann ich das dann auch sofort damit installieren:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;tolino-note-extractor on  main is 📦 v0.2.0 via 🐍 v3.14.2 
❯ uv tool install dist/tolino_note_extractor-0.2.0-py3-none-any.whl
Resolved 1 package in 1ms
Prepared 1 package in 3ms
Uninstalled 1 package in 0.73ms
Installed 1 package in 2ms
 - tolino-note-extractor==0.1.0 (from file:///home/mu/Projekte/tolino-note-extractor/dist/tolino_note_extractor-0.1.0-py3-none-any.whl)
 + tolino-note-extractor==0.2.0 (from file:///home/mu/Projekte/tolino-note-extractor/dist/tolino_note_extractor-0.2.0-py3-none-any.whl)
Installed 1 executable: extract-tolino-notes
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Und schon kann ich es nutzen. Das sind zwar mehr Schritte als bei einem Skript im Skripte-Ordner, dafür ist das Skript dann auch als &lt;a href="https://github.com/martin-ueding/tolino-note-extractor"&gt;eigenes Repository&lt;/a&gt; online verfügbar. Zudem habe ich auch eine Liste der Änderungen, was ich ganz angenehm finde:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;tolino-note-extractor on  main is 📦 v0.2.0 via 🐍 v3.14.2 
❯ git log --oneline
aa1b8b2 (HEAD -&amp;gt; main, tag: 0.2.0) bump: version 0.1.0 → 0.2.0
116f34d feat: leave a trailing horizontal line
d4c86d5 (tag: 0.1.0) bump: version 0.0.0 → 0.1.0
469f3c4 build: do not use v prefix
0c4a3e8 build: set version to no release yet
d6d8161 build: add commitizen
0eaa7bb feat: dedent lines
417d6ba feat: print more like Markdown
9922a58 feat: also extract type
ee6ff3c build: rename script
cfb665e build: expose CLI entrypoint
be15db6 feat: print out notes in CLI
316efdc feat: fix regular expression with NBSP
f640ee6 build: start with project skeleton
953fdc7 Init
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Zudem kann ich auf bestimmte Versionen zugreifen:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;tolino-note-extractor on  main is 📦 v0.2.0 via 🐍 v3.14.2 
❯ git tag
0.1.0
0.2.0
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Und einen Changelog gibt es auch noch:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="gu"&gt;## 0.2.0 (2026-02-28)&lt;/span&gt;

&lt;span class="gu"&gt;### Feat&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;leave a trailing horizontal line

&lt;span class="gu"&gt;## 0.1.0 (2026-02-28)&lt;/span&gt;

&lt;span class="gu"&gt;### Feat&lt;/span&gt;

&lt;span class="k"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dedent lines
&lt;span class="k"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;print more like Markdown
&lt;span class="k"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;also extract type
&lt;span class="k"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;print out notes in CLI
&lt;span class="k"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;fix regular expression with NBSP
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Der Changelog ist nicht ganz so gut wie ein handgeschriebener. Aber für so ein Skript reicht mir das. Und es erzeugt keine zusätzliche Arbeit. Und das ist ein Kosten-Nutzen-Verhältnis, das mich dann sehr anspricht. Ein Hoch auf standardisierte Prozesse!&lt;/p&gt;</description><category>Commitizen</category><category>Conventional Commits</category><category>Semantic Versioning</category><category>Softwareentwicklung</category><category>uv</category><guid>https://martin-ueding.de/posts/standardisierte-prozesse-sind-toll/</guid><pubDate>Mon, 16 Mar 2026 23:00:00 GMT</pubDate></item></channel></rss>