mirror of
https://github.com/drewcassidy/yaclog.git
synced 2024-09-01 14:58:58 +00:00
Use regex for parsing
This commit is contained in:
parent
8666e48639
commit
0279d89367
@ -1,20 +1,9 @@
|
|||||||
[project]
|
|
||||||
name = "ya-changelog"
|
|
||||||
description = "Yet another changelog CLI tool."
|
|
||||||
authors = ["Andrew Cassidy"]
|
|
||||||
license = "AGPL"
|
|
||||||
readme = "README.md"
|
|
||||||
python = "^3.8"
|
|
||||||
homepage = "https://github.com/drewcassidy/yet-another-changelog"
|
|
||||||
repository = "https://github.com/drewcassidy/yet-another-changelog"
|
|
||||||
|
|
||||||
keywords = ["changelog", "commandline"]
|
|
||||||
|
|
||||||
dependencies = ["Click", "GitPython"]
|
|
||||||
|
|
||||||
[build-system]
|
[build-system]
|
||||||
requires = [
|
requires = [
|
||||||
"setuptools >= 35.0.2",
|
"setuptools >= 35.0.2",
|
||||||
"setuptools_scm >= 2.0.0"
|
"setuptools_scm[toml] >= 3.4",
|
||||||
|
"wheel"
|
||||||
]
|
]
|
||||||
build-backend = "setuptools.build_meta"
|
build-backend = "setuptools.build_meta"
|
||||||
|
|
||||||
|
[tool.setuptools_scm]
|
29
setup.cfg
Normal file
29
setup.cfg
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
[metadata]
|
||||||
|
# until setuptools supports PEP621, this will have to do
|
||||||
|
name = yaclog
|
||||||
|
description = Yet another changelog CLI tool.
|
||||||
|
author = Andrew Cassidy
|
||||||
|
license = AGPLv3
|
||||||
|
license_file = LICENSE.md
|
||||||
|
long_description = file: README.md
|
||||||
|
long_description_content_type = text/markdown
|
||||||
|
url = https://github.com/drewcassidy/yet-another-changelog
|
||||||
|
|
||||||
|
keywords = changelog, commandline, markdown
|
||||||
|
classifiers =
|
||||||
|
Development Status :: 3 - Alpha
|
||||||
|
Intended Audience :: Developers
|
||||||
|
License :: OSI Approved :: GNU Affero General Public License v3
|
||||||
|
Operating System :: OS Independent
|
||||||
|
Programming Language :: Python :: 3 :: Only
|
||||||
|
Programming Language :: Python :: 3
|
||||||
|
Programming Language :: Python :: 3.8
|
||||||
|
Programming Language :: Python :: 3.9
|
||||||
|
Topic :: Text Processing :: Markup :: Markdown
|
||||||
|
Topic :: Software Development :: Version Control :: Git
|
||||||
|
Topic :: Utilities
|
||||||
|
|
||||||
|
[options]
|
||||||
|
install_requires = Click; GitPython
|
||||||
|
python_requires >= 3.8
|
||||||
|
packages = find:
|
11
yaclog/__init__.py
Normal file
11
yaclog/__init__.py
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import os
|
||||||
|
from yaclog.changelog import Changelog
|
||||||
|
|
||||||
|
|
||||||
|
def read(path: os.PathLike):
|
||||||
|
"""
|
||||||
|
Create a new Changelog object from the given path
|
||||||
|
:param path: a path to a markdown changelog file
|
||||||
|
:return: a parsed Changelog object
|
||||||
|
"""
|
||||||
|
return Changelog(path)
|
@ -62,44 +62,43 @@ class Changelog:
|
|||||||
if line.isspace():
|
if line.isspace():
|
||||||
# skip empty lines
|
# skip empty lines
|
||||||
pass
|
pass
|
||||||
elif line.startswith('## '):
|
elif match := re.fullmatch(
|
||||||
# line is a version header
|
r'^##\s+(?P<name>\S*)(?:\s+-\s+(?P<date>\S+))?\s*?(?P<extra>.*?)\s*#*$', line):
|
||||||
|
# this is a version header in the form '## Name (- date) (tags*) (#*)'
|
||||||
version = VersionEntry()
|
version = VersionEntry()
|
||||||
section = ''
|
section = ''
|
||||||
split = line.removeprefix('##').strip().split()
|
|
||||||
|
|
||||||
version.name, version.link, version.link_id = _strip_link(split[0])
|
version.name, version.link, version.link_id = _strip_link(match['name'])
|
||||||
|
|
||||||
if len(split) > 1:
|
|
||||||
if split[1] == '-':
|
|
||||||
split.remove('-')
|
|
||||||
|
|
||||||
|
if match['date']:
|
||||||
try:
|
try:
|
||||||
version.date = datetime.date.fromisoformat(split[1].strip(string.punctuation))
|
version.date = datetime.date.fromisoformat(match['date'].strip(string.punctuation))
|
||||||
except ValueError:
|
except ValueError:
|
||||||
version.date = None
|
version.date = None
|
||||||
|
|
||||||
version.tags = [s.strip(brackets) for s in split[2:]]
|
if match['extra']:
|
||||||
|
version.tags = [s.strip('[]') for s in re.findall(r'\[.*?]', match['extra'])]
|
||||||
|
|
||||||
self.versions.append(version)
|
self.versions.append(version)
|
||||||
|
|
||||||
elif line.startswith('### '):
|
elif match := re.fullmatch(r'###\s+(\S*?)(\s+#*)?', line):
|
||||||
# line is a version section header
|
# this is a version section header in the form '### Name' or '### Name ###'
|
||||||
section = line.removeprefix('###').strip().title()
|
section = match[1].title()
|
||||||
if section not in version.sections.keys():
|
if section not in version.sections.keys():
|
||||||
version.sections[section] = []
|
version.sections[section] = []
|
||||||
|
|
||||||
|
elif match := re.fullmatch(r'\[(\S*)]:\s*(\S*)\n', line):
|
||||||
|
# this is a link definition in the form '[id]: link', so add it to the link table
|
||||||
|
self.links[match[1].lower()] = match[2]
|
||||||
|
|
||||||
|
elif line[0] in bullets or last_line.isspace():
|
||||||
|
# bullet point or new paragraph
|
||||||
|
# bullet points are preserved since some people like to use '+', '-' or '*' for different things
|
||||||
|
version.sections[section].append(line.strip())
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# line is an entry
|
# not a bullet point, and no whitespace on last line, so append to the last entry
|
||||||
if match := re.fullmatch(r'\[(.*)]:\s*(.*)\n', line):
|
version.sections[section][-1] += '\n' + line.strip()
|
||||||
# this is a link, so a it to the link table
|
|
||||||
self.links[match[1].lower()] = match[2]
|
|
||||||
elif line[0] in bullets or last_line.isspace():
|
|
||||||
# bullet point or new paragraph
|
|
||||||
# bullet points are preserved since some people like to use '+', '-' or '*' for different things
|
|
||||||
version.sections[section].append(line.strip())
|
|
||||||
else:
|
|
||||||
# not a bullet point, and no whitespace on last line, so append to the last entry
|
|
||||||
version.sections[section][-1] += '\n' + line.strip()
|
|
||||||
|
|
||||||
last_line = line
|
last_line = line
|
||||||
line = fp.readline()
|
line = fp.readline()
|
Loading…
Reference in New Issue
Block a user