From 645e5eb9753586518822710e296385961004d094 Mon Sep 17 00:00:00 2001 From: Joshua Watt Date: Thu, 29 Feb 2024 15:16:33 -0700 Subject: [PATCH] Convert to build as a module using hatchling Converts the project to be structured so that it can be built into wheels using `python3 -m build`. The build system chosen is hatchling, because it is very simple to use. Note that now instead of using ./main.py to invoke the script, the module installs a command called `md-spec-parser` that is used instead Also, the name of the project is changed to "md-spec-parser" since "spec-parser" is already taken in pip --- .gitignore | 5 +++ README.md | 28 +++++++++---- pyproject.toml | 41 +++++++++++++++++++ requirements.txt | 3 -- .../md_spec_parser}/__init__.py | 0 src/md_spec_parser/__main__.py | 12 ++++++ .../md_spec_parser}/jsondump.py | 0 .../md_spec_parser}/loaders.py | 0 main.py => src/md_spec_parser/main.py | 6 +-- .../md_spec_parser}/mdparsing.py | 0 {spec_parser => src/md_spec_parser}/mkdocs.py | 6 +-- {spec_parser => src/md_spec_parser}/model.py | 0 .../md_spec_parser}/plantuml.py | 0 {spec_parser => src/md_spec_parser}/rdf.py | 0 .../md_spec_parser/runparams.py | 17 ++++---- .../templates/mkdocs/class.md.j2 | 0 .../templates/mkdocs/datatype.md.j2 | 0 .../templates/mkdocs/individual.md.j2 | 0 .../templates/mkdocs/namespace.md.j2 | 0 .../templates/mkdocs/page.md.j2 | 0 .../templates/mkdocs/property.md.j2 | 0 .../templates/mkdocs/vocabulary.md.j2 | 0 22 files changed, 92 insertions(+), 26 deletions(-) create mode 100644 pyproject.toml delete mode 100644 requirements.txt rename {spec_parser => src/md_spec_parser}/__init__.py (100%) create mode 100644 src/md_spec_parser/__main__.py rename {spec_parser => src/md_spec_parser}/jsondump.py (100%) rename {spec_parser => src/md_spec_parser}/loaders.py (100%) rename main.py => src/md_spec_parser/main.py (69%) rename {spec_parser => src/md_spec_parser}/mdparsing.py (100%) rename {spec_parser => src/md_spec_parser}/mkdocs.py (95%) rename {spec_parser => src/md_spec_parser}/model.py (100%) rename {spec_parser => src/md_spec_parser}/plantuml.py (100%) rename {spec_parser => src/md_spec_parser}/rdf.py (100%) rename runparams.py => src/md_spec_parser/runparams.py (95%) rename {spec_parser => src/md_spec_parser}/templates/mkdocs/class.md.j2 (100%) rename {spec_parser => src/md_spec_parser}/templates/mkdocs/datatype.md.j2 (100%) rename {spec_parser => src/md_spec_parser}/templates/mkdocs/individual.md.j2 (100%) rename {spec_parser => src/md_spec_parser}/templates/mkdocs/namespace.md.j2 (100%) rename {spec_parser => src/md_spec_parser}/templates/mkdocs/page.md.j2 (100%) rename {spec_parser => src/md_spec_parser}/templates/mkdocs/property.md.j2 (100%) rename {spec_parser => src/md_spec_parser}/templates/mkdocs/vocabulary.md.j2 (100%) diff --git a/.gitignore b/.gitignore index a2064dc..760a40e 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,8 @@ docs/_build # Virtual Env # ###################### venv +.venv + +# Wheel build output # +###################### +dist/ diff --git a/README.md b/README.md index 704d750..1ff2c3b 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,26 @@ -# spec-parser +# md-spec-parser -Automagically process the model of the SPDXv3 specification to validate input or to generate stuff. +Automagically process the Markdown model of the SPDXv3 specification to validate input or to generate stuff. +## Installation + +``` +# Create virtual environment +python3 -m venv venv + +# Activate virtual environment +. ./venv/bin/activate + +# Install module and dependencies in editable mode +pip install -e . +``` + ## Usage ``` -python3 ./main.py -h -usage: main.py [-h] [-d] [-f] [-n] [-q] [-v] [-V] input_dir [output_dir] +$ md-spec-parser -h +usage: md-spec-parser [-h] [-d] [-f] [-n] [-q] [-v] [-V] input_dir [output_dir] Generate documentation from an SPDX 3.0 model @@ -30,15 +43,12 @@ Note that not all flags are functional yet. ### Checking input ``` -python3 main.py -n some/where/.../model +md-spec-parser -n some/where/.../model ``` -Note that no dependencies are needed. - ### Generate output ``` -python3 -m pip install -r requirements.txt -python3 main.py some/where/.../model some/where/else/.../output_dir +md-spec-parser some/where/.../model some/where/else/.../output_dir ``` diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..e333e0f --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,41 @@ +[project] +name = "md-spec-parser" +description = "Parse SPDX Spec Markdown Files" +dynamic = ["version"] +dependencies = [ + "Jinja2 == 3.1.2", + "jsonpickle == 3.0.2", + "rdflib == 7.0.0", +] +required-python = ">= 3.8" +authors = [ + {name = "Alexios Zavras", email = "alexios.zavras@intel.com"}, +] +readme = "README.md" +classifiers = [ + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "Topic :: Software Development :: Build Tools", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", +] + +[project.urls] +Homepage = "https://github.com/spdx/spec-parser" +Repository = "https://github.com/spdx/spec-parser.git" +Issues = "https://github.com/spdx/spec-parser/issues" + +[project.scripts] +md-spec-parser = "md_spec_parser.main:main" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.version] +path = "src/md_spec_parser/__init__.py" diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 8aaf7a0..0000000 --- a/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -Jinja2==3.1.2 -jsonpickle==3.0.2 -rdflib==7.0.0 diff --git a/spec_parser/__init__.py b/src/md_spec_parser/__init__.py similarity index 100% rename from spec_parser/__init__.py rename to src/md_spec_parser/__init__.py diff --git a/src/md_spec_parser/__main__.py b/src/md_spec_parser/__main__.py new file mode 100644 index 0000000..6b5d08b --- /dev/null +++ b/src/md_spec_parser/__main__.py @@ -0,0 +1,12 @@ +#! /usr/bin/env python3 +# +# Copyright (c) 2024 Joshua Watt +# +# SPDX-License-Identifier: MIT + +import sys + +from .main import main + +if __name__ == "__main__": + sys.exit(main()) diff --git a/spec_parser/jsondump.py b/src/md_spec_parser/jsondump.py similarity index 100% rename from spec_parser/jsondump.py rename to src/md_spec_parser/jsondump.py diff --git a/spec_parser/loaders.py b/src/md_spec_parser/loaders.py similarity index 100% rename from spec_parser/loaders.py rename to src/md_spec_parser/loaders.py diff --git a/main.py b/src/md_spec_parser/main.py similarity index 69% rename from main.py rename to src/md_spec_parser/main.py index f4d61f9..a1dfb9f 100644 --- a/main.py +++ b/src/md_spec_parser/main.py @@ -2,10 +2,10 @@ # SPDX-License-Identifier: Apache-2.0 -from spec_parser import Model -from runparams import RunParams +from . import Model +from .runparams import RunParams -if __name__ == "__main__": +def main(): cfg = RunParams() m = Model(cfg.input_dir) diff --git a/spec_parser/mdparsing.py b/src/md_spec_parser/mdparsing.py similarity index 100% rename from spec_parser/mdparsing.py rename to src/md_spec_parser/mdparsing.py diff --git a/spec_parser/mkdocs.py b/src/md_spec_parser/mkdocs.py similarity index 95% rename from spec_parser/mkdocs.py rename to src/md_spec_parser/mkdocs.py index 63d5ed9..4ae3540 100644 --- a/spec_parser/mkdocs.py +++ b/src/md_spec_parser/mkdocs.py @@ -13,9 +13,9 @@ def gen_mkdocs(model, dir, cfg): if not cfg.opt_force: logging.error(f"Destination for mkdocs {dir} already exists, will not overwrite") return - + jinja = Environment( - loader=PackageLoader("spec_parser", package_path="templates/mkdocs"), + loader=PackageLoader("md_spec_parser", package_path="templates/mkdocs"), autoescape=select_autoescape(), trim_blocks=True, lstrip_blocks=True ) @@ -60,7 +60,7 @@ def class_link(name): _, other_ns, name = name.split("/") return f"[/{other_ns}/{name}](../../{other_ns}/Classes/{name}.md)" else: - return f"[{name}](../Classes/{name}.md)" + return f"[{name}](../Classes/{name}.md)" def property_link(name): diff --git a/spec_parser/model.py b/src/md_spec_parser/model.py similarity index 100% rename from spec_parser/model.py rename to src/md_spec_parser/model.py diff --git a/spec_parser/plantuml.py b/src/md_spec_parser/plantuml.py similarity index 100% rename from spec_parser/plantuml.py rename to src/md_spec_parser/plantuml.py diff --git a/spec_parser/rdf.py b/src/md_spec_parser/rdf.py similarity index 100% rename from spec_parser/rdf.py rename to src/md_spec_parser/rdf.py diff --git a/runparams.py b/src/md_spec_parser/runparams.py similarity index 95% rename from runparams.py rename to src/md_spec_parser/runparams.py index d2e217a..01fb620 100644 --- a/runparams.py +++ b/src/md_spec_parser/runparams.py @@ -12,7 +12,7 @@ def __init__(self): self._ts = datetime.now(timezone.utc) self.process_args() - + @property def autogen_header(self): return f"Automatically generated by spec-parser v{self.parser_version} on {self._ts.isoformat()}" @@ -20,11 +20,11 @@ def autogen_header(self): @property def input_dir(self): return self.args.input_dir - + @property def output_dir(self): return self.args.output_dir - + @property def opt_debug(self): return self.args.debug @@ -36,7 +36,7 @@ def opt_force(self): @property def opt_nooutput(self): return self.args.nooutput - + @property def opt_quiet(self): return self.args.quiet @@ -47,8 +47,9 @@ def opt_verbose(self): @property def parser_version(self): - return sys.modules['spec_parser'].__version__ - + import md_spec_parser + return md_spec_parser.__version__ + @property def all_as_dict(self): return { k: getattr(self, k) for k in ( @@ -66,7 +67,7 @@ def all_as_dict(self): # - separate output dirs for mkdocs / RDF /JSON-LD / ... # - maybe flags whether something might not be generated? # - etc. - + def process_args(self, args=sys.argv[1:]): parser = argparse.ArgumentParser(description="Generate documentation from an SPDX 3.0 model") parser.add_argument("input_dir", help="Directory containing the input specification files") @@ -76,7 +77,7 @@ def process_args(self, args=sys.argv[1:]): parser.add_argument("-n", "--nooutput", action="store_true", help="Do not generate anything, only check input") parser.add_argument("-q", "--quiet", action="store_true", help="Print no output") parser.add_argument("-v", "--verbose", action="store_true", help="Print verbose output") - parser.add_argument("-V", "--version", action="version", version=f"%(prog)s {RunParams.parser_version}") + parser.add_argument("-V", "--version", action="version", version=f"%(prog)s {self.parser_version}") self.args = parser.parse_args(args) if self.opt_nooutput: diff --git a/spec_parser/templates/mkdocs/class.md.j2 b/src/md_spec_parser/templates/mkdocs/class.md.j2 similarity index 100% rename from spec_parser/templates/mkdocs/class.md.j2 rename to src/md_spec_parser/templates/mkdocs/class.md.j2 diff --git a/spec_parser/templates/mkdocs/datatype.md.j2 b/src/md_spec_parser/templates/mkdocs/datatype.md.j2 similarity index 100% rename from spec_parser/templates/mkdocs/datatype.md.j2 rename to src/md_spec_parser/templates/mkdocs/datatype.md.j2 diff --git a/spec_parser/templates/mkdocs/individual.md.j2 b/src/md_spec_parser/templates/mkdocs/individual.md.j2 similarity index 100% rename from spec_parser/templates/mkdocs/individual.md.j2 rename to src/md_spec_parser/templates/mkdocs/individual.md.j2 diff --git a/spec_parser/templates/mkdocs/namespace.md.j2 b/src/md_spec_parser/templates/mkdocs/namespace.md.j2 similarity index 100% rename from spec_parser/templates/mkdocs/namespace.md.j2 rename to src/md_spec_parser/templates/mkdocs/namespace.md.j2 diff --git a/spec_parser/templates/mkdocs/page.md.j2 b/src/md_spec_parser/templates/mkdocs/page.md.j2 similarity index 100% rename from spec_parser/templates/mkdocs/page.md.j2 rename to src/md_spec_parser/templates/mkdocs/page.md.j2 diff --git a/spec_parser/templates/mkdocs/property.md.j2 b/src/md_spec_parser/templates/mkdocs/property.md.j2 similarity index 100% rename from spec_parser/templates/mkdocs/property.md.j2 rename to src/md_spec_parser/templates/mkdocs/property.md.j2 diff --git a/spec_parser/templates/mkdocs/vocabulary.md.j2 b/src/md_spec_parser/templates/mkdocs/vocabulary.md.j2 similarity index 100% rename from spec_parser/templates/mkdocs/vocabulary.md.j2 rename to src/md_spec_parser/templates/mkdocs/vocabulary.md.j2