mkdocs2confluence 0.7.19__tar.gz → 0.7.22__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/PKG-INFO +1 -1
  2. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/pyproject.toml +1 -1
  3. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs2confluence.egg-info/PKG-INFO +1 -1
  4. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/cli.py +1 -0
  5. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/publisher/client.py +19 -5
  6. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/publisher/pipeline.py +17 -2
  7. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/LICENSE +0 -0
  8. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/README.md +0 -0
  9. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/setup.cfg +0 -0
  10. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs2confluence.egg-info/SOURCES.txt +0 -0
  11. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs2confluence.egg-info/dependency_links.txt +0 -0
  12. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs2confluence.egg-info/entry_points.txt +0 -0
  13. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs2confluence.egg-info/requires.txt +0 -0
  14. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs2confluence.egg-info/top_level.txt +0 -0
  15. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/__init__.py +0 -0
  16. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/emitter/__init__.py +0 -0
  17. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/emitter/xhtml.py +0 -0
  18. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/ir/__init__.py +0 -0
  19. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/ir/document.py +0 -0
  20. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/ir/nodes.py +0 -0
  21. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/ir/treeutil.py +0 -0
  22. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/loader/__init__.py +0 -0
  23. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/loader/config.py +0 -0
  24. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/loader/extra_css.py +0 -0
  25. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/loader/nav.py +0 -0
  26. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/loader/page.py +0 -0
  27. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/parser/__init__.py +0 -0
  28. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/parser/markdown.py +0 -0
  29. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/pdf/__init__.py +0 -0
  30. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/pdf/generator.py +0 -0
  31. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/pdf/render.py +0 -0
  32. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/preprocess/__init__.py +0 -0
  33. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/preprocess/abbrevs.py +0 -0
  34. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/preprocess/fence.py +0 -0
  35. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/preprocess/frontmatter.py +0 -0
  36. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/preprocess/icons.py +0 -0
  37. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/preprocess/includes.py +0 -0
  38. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/preprocess/linkdefs.py +0 -0
  39. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/preview/__init__.py +0 -0
  40. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/preview/render.py +0 -0
  41. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/preview/server.py +0 -0
  42. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/publisher/__init__.py +0 -0
  43. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/transforms/__init__.py +0 -0
  44. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/transforms/abbrevs.py +0 -0
  45. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/transforms/assets.py +0 -0
  46. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/transforms/editlink.py +0 -0
  47. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/transforms/images.py +0 -0
  48. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/transforms/internallinks.py +0 -0
  49. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/src/mkdocs_to_confluence/transforms/mermaid.py +0 -0
  50. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/tests/test_abbrevs.py +0 -0
  51. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/tests/test_cli.py +0 -0
  52. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/tests/test_editlink.py +0 -0
  53. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/tests/test_emitter.py +0 -0
  54. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/tests/test_extra_css.py +0 -0
  55. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/tests/test_frontmatter.py +0 -0
  56. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/tests/test_icons.py +0 -0
  57. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/tests/test_images.py +0 -0
  58. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/tests/test_internallinks.py +0 -0
  59. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/tests/test_ir.py +0 -0
  60. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/tests/test_linkdefs.py +0 -0
  61. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/tests/test_loader.py +0 -0
  62. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/tests/test_mermaid.py +0 -0
  63. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/tests/test_page_loader.py +0 -0
  64. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/tests/test_parser.py +0 -0
  65. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/tests/test_pdf.py +0 -0
  66. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/tests/test_preprocess.py +0 -0
  67. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/tests/test_preview.py +0 -0
  68. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/tests/test_publish_client.py +0 -0
  69. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/tests/test_publish_config.py +0 -0
  70. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/tests/test_publish_pipeline.py +0 -0
  71. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/tests/test_server.py +0 -0
  72. {mkdocs2confluence-0.7.19 → mkdocs2confluence-0.7.22}/tests/test_treeutil.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mkdocs2confluence
3
- Version: 0.7.19
3
+ Version: 0.7.22
4
4
  Summary: Publish MkDocs Material pages to Confluence Cloud — admonitions, Mermaid diagrams, tabs, page properties and more
5
5
  Author: Anders Hybertz
6
6
  License: GPL-3.0-or-later
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mkdocs2confluence"
3
- version = "0.7.19"
3
+ version = "0.7.22"
4
4
  description = "Publish MkDocs Material pages to Confluence Cloud — admonitions, Mermaid diagrams, tabs, page properties and more"
5
5
  readme = "README.md"
6
6
  license = { text = "GPL-3.0-or-later" }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mkdocs2confluence
3
- Version: 0.7.19
3
+ Version: 0.7.22
4
4
  Summary: Publish MkDocs Material pages to Confluence Cloud — admonitions, Mermaid diagrams, tabs, page properties and more
5
5
  Author: Anders Hybertz
6
6
  License: GPL-3.0-or-later
@@ -492,6 +492,7 @@ def _cmd_publish(args: argparse.Namespace) -> None:
492
492
  partial = bool(getattr(args, "page", None) or getattr(args, "section", None))
493
493
  report = execute_publish(
494
494
  plan, client, dry_run=False, space_id=space_id,
495
+ space_key=conf_config.space_key,
495
496
  docs_dir=config.docs_dir, full_width=conf_config.full_width,
496
497
  root_page_id=conf_config.parent_page_id,
497
498
  prune=getattr(args, "prune", False) and not partial,
@@ -33,6 +33,7 @@ class ConfluenceClient:
33
33
  def __init__(self, config: ConfluenceConfig) -> None:
34
34
  self._config = config
35
35
  self._client: httpx.Client | None = None
36
+ self._space_states: dict[str, list[dict[str, Any]]] = {} # space_key → list of ContentState
36
37
 
37
38
  # ── Context manager ────────────────────────────────────────────────────────
38
39
 
@@ -361,16 +362,29 @@ class ConfluenceClient:
361
362
  resp = self._http.post(label_url, json=payload)
362
363
  self._raise_for_status(resp, f"set_page_labels({page_id!r})")
363
364
 
364
- def set_page_status(self, page_id: str, status_key: str) -> None:
365
+ def set_page_status(self, page_id: str, status_key: str, space_key: str | None = None) -> None:
365
366
  """Set the Confluence page content state (e.g. ``rough-draft``, ``in-progress``).
366
367
 
367
- Uses the v1 ``PUT /content/{id}/state`` endpoint. *status_key* is a
368
- kebab-case alias that is converted to a title-case name matching the
369
- built-in Confluence space states (e.g. ``in-progress`` ``In Progress``).
368
+ Uses the v1 ``PUT /content/{id}/state`` endpoint. When *space_key* is
369
+ provided the space states are fetched once (cached) so the correct
370
+ ``id``, ``name``, and ``color`` are sent — required to match an
371
+ existing space state rather than creating a new custom one.
370
372
  """
371
373
  name = status_key.replace("-", " ").title()
374
+ state_body: dict[str, Any] = {"name": name}
375
+
376
+ if space_key:
377
+ if space_key not in self._space_states:
378
+ resp = self._http.get(self._v1(f"/space/{space_key}/state"))
379
+ if resp.is_success:
380
+ self._space_states[space_key] = resp.json() if isinstance(resp.json(), list) else []
381
+ for state in self._space_states.get(space_key, []):
382
+ if state.get("name", "").lower() == name.lower():
383
+ state_body = {"id": state["id"], "name": state["name"], "color": state["color"]}
384
+ break
385
+
372
386
  url = self._v1(f"/content/{page_id}/state")
373
- resp = self._http.put(url, json={"name": name})
387
+ resp = self._http.put(url, json=state_body)
374
388
  self._raise_for_status(resp, f"set_page_status({page_id!r}, {status_key!r})")
375
389
 
376
390
  def list_attachments(self, page_id: str) -> dict[str, dict[str, Any]]:
@@ -636,6 +636,7 @@ def _post_process_action(
636
636
  full_width: bool,
637
637
  docs_dir: Path,
638
638
  report: PublishReport,
639
+ space_key: str | None = None,
639
640
  quiet: bool = False,
640
641
  ) -> None:
641
642
  """Run all non-fatal post-create/update work for a single action."""
@@ -663,7 +664,7 @@ def _post_process_action(
663
664
  # Set Confluence page status (rough-draft / in-progress / etc.) — non-fatal.
664
665
  if action.page_id and action.confluence_status and not action.is_folder:
665
666
  try:
666
- client.set_page_status(action.page_id, action.confluence_status)
667
+ client.set_page_status(action.page_id, action.confluence_status, space_key=space_key)
667
668
  except Exception as exc:
668
669
  if not quiet:
669
670
  print(f" [warn] could not set page status '{action.confluence_status}': {exc}", file=sys.stderr)
@@ -685,6 +686,7 @@ def execute_publish(
685
686
  *,
686
687
  dry_run: bool = False,
687
688
  space_id: str,
689
+ space_key: str | None = None,
688
690
  docs_dir: Path,
689
691
  full_width: bool = True,
690
692
  root_page_id: str | None = None,
@@ -725,6 +727,16 @@ def execute_publish(
725
727
  for action in plan:
726
728
  if action.action == "skip":
727
729
  report.skipped += 1
730
+ # Still apply status even for unchanged pages.
731
+ if action.page_id and action.confluence_status and not action.is_folder:
732
+ try:
733
+ client.set_page_status(action.page_id, action.confluence_status, space_key=space_key)
734
+ except Exception as exc:
735
+ if not quiet:
736
+ print(
737
+ f" [warn] could not set page status '{action.confluence_status}': {exc}",
738
+ file=sys.stderr,
739
+ )
728
740
  continue
729
741
 
730
742
  counter += 1
@@ -746,7 +758,10 @@ def execute_publish(
746
758
  if action.node.is_section and action.page_id:
747
759
  _wire_children(action, action_by_node)
748
760
 
749
- _post_process_action(action, client, full_width=full_width, docs_dir=docs_dir, report=report, quiet=quiet)
761
+ _post_process_action(
762
+ action, client,
763
+ full_width=full_width, docs_dir=docs_dir, space_key=space_key, report=report, quiet=quiet,
764
+ )
750
765
 
751
766
  if prune and root_page_id:
752
767
  published_ids = {a.page_id for a in plan if a.page_id}