From 52af6dc2dac1c369d2f504a6249f01717a4b713c Mon Sep 17 00:00:00 2001 From: Levente Hunyadi Date: Fri, 20 Sep 2024 16:04:17 +0200 Subject: [PATCH] Ensure local output succeeds with missing page ID when root page ID is set --- md2conf/__main__.py | 2 ++ md2conf/converter.py | 11 +++++++++++ md2conf/processor.py | 12 ++++++++++-- sample/.gitignore | 2 +- sample/parent/child.md | 1 + 5 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 sample/parent/child.md diff --git a/md2conf/__main__.py b/md2conf/__main__.py index cbb1301..db9ae85 100644 --- a/md2conf/__main__.py +++ b/md2conf/__main__.py @@ -7,6 +7,7 @@ import requests +from . import __version__ from .api import ConfluenceAPI from .application import Application from .converter import ConfluenceDocumentOptions @@ -30,6 +31,7 @@ class Arguments(argparse.Namespace): def main() -> None: parser = argparse.ArgumentParser() parser.prog = os.path.basename(os.path.dirname(__file__)) + parser.add_argument("--version", action="version", version=__version__) parser.add_argument( "mdpath", help="Path to Markdown file or directory to convert and publish." ) diff --git a/md2conf/converter.py b/md2conf/converter.py index cbf1076..9f81f3d 100644 --- a/md2conf/converter.py +++ b/md2conf/converter.py @@ -726,6 +726,10 @@ class ConfluenceQualifiedID: page_id: str space_key: Optional[str] = None + def __init__(self, page_id: str, space_key: Optional[str] = None): + self.page_id = page_id + self.space_key = space_key + def extract_qualified_id(string: str) -> Tuple[Optional[ConfluenceQualifiedID], str]: "Extracts the Confluence page ID and space key from a Markdown document." @@ -798,6 +802,13 @@ def __init__( # extract Confluence page ID qualified_id, text = extract_qualified_id(text) + if qualified_id is None: + # look up Confluence page ID in metadata + metadata = page_metadata.get(path) + if metadata is not None: + qualified_id = ConfluenceQualifiedID( + metadata.page_id, metadata.space_key + ) if qualified_id is None: raise ValueError("missing Confluence page ID") self.id = qualified_id diff --git a/md2conf/processor.py b/md2conf/processor.py index a83eb56..467734b 100644 --- a/md2conf/processor.py +++ b/md2conf/processor.py @@ -1,3 +1,4 @@ +import hashlib import logging import os from pathlib import Path @@ -7,6 +8,7 @@ ConfluenceDocument, ConfluenceDocumentOptions, ConfluencePageMetadata, + ConfluenceQualifiedID, extract_qualified_id, ) from .properties import ConfluenceProperties @@ -92,9 +94,15 @@ def _get_page(self, absolute_path: Path) -> ConfluencePageMetadata: with open(absolute_path, "r", encoding="utf-8") as f: document = f.read() - qualified_id, _ = extract_qualified_id(document) + qualified_id, document = extract_qualified_id(document) if qualified_id is None: - raise ValueError("required: page ID for local output") + if self.options.root_page_id is not None: + hash = hashlib.md5(document.encode("utf-8")) + digest = "".join(f"{c:x}" for c in hash.digest()) + LOGGER.info(f"Identifier '{digest}' assigned to page: {absolute_path}") + qualified_id = ConfluenceQualifiedID(digest) + else: + raise ValueError("required: page ID for local output") return ConfluencePageMetadata( domain=self.properties.domain, diff --git a/sample/.gitignore b/sample/.gitignore index b208055..290ff7a 100644 --- a/sample/.gitignore +++ b/sample/.gitignore @@ -1 +1 @@ -/*.csf +*.csf diff --git a/sample/parent/child.md b/sample/parent/child.md new file mode 100644 index 0000000..0b0d1a2 --- /dev/null +++ b/sample/parent/child.md @@ -0,0 +1 @@ +A child page without an explicitly assigned Confluence page ID or space key.