ssb-pubmd 0.1.1__py3-none-any.whl → 0.1.3__py3-none-any.whl

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.
@@ -44,13 +44,8 @@ class LocalTokenClient:
44
44
 
45
45
 
46
46
  class DaplaTokenClient:
47
- token: str
48
-
49
- def __init__(self) -> None:
50
- self.token = AuthClient.fetch_personal_token(audiences=["ssbno"])
51
-
52
47
  def get_token(self) -> str:
53
- return self.token
48
+ return AuthClient.fetch_personal_token(audiences=["ssbno"])
54
49
 
55
50
  class Response(NamedTuple):
56
51
  publish_path: str
@@ -111,14 +106,12 @@ class MimirPublishClient:
111
106
  )
112
107
 
113
108
 
114
- def get_publish_client(
115
- config: Config, use_dapla_token_client: bool = False
116
- ) -> PublishClient:
109
+ def get_publish_client(config: Config) -> PublishClient:
117
110
  return MimirPublishClient(
118
111
  base_url=config.publish_base_url,
119
- endpoint=config.publish_endpoint,
120
- preview_base_path=config.publish_preview_base_path,
112
+ endpoint="/webapp/pubmd",
113
+ preview_base_path=config.publish_admin_path + "/site/preview/default/draft",
121
114
  token_client=DaplaTokenClient()
122
- if use_dapla_token_client
115
+ if config.use_dapla_token_client
123
116
  else DEFULT_TOKEN_CLIENT,
124
117
  )
ssb_pubmd/cli.py CHANGED
@@ -1,9 +1,12 @@
1
1
  import subprocess
2
2
  import sys
3
+ from importlib import resources
3
4
  from pathlib import Path
4
5
 
6
+ from jinja2 import Template
5
7
  from watchfiles import watch
6
8
 
9
+ from ssb_pubmd import templates
7
10
  from ssb_pubmd.adapters.content_parser import MimirContentParser
8
11
  from ssb_pubmd.adapters.document_processor import PandocDocumentProcessor
9
12
  from ssb_pubmd.adapters.publish_client import PublishClient
@@ -15,37 +18,58 @@ from ssb_pubmd.domain.document_publisher import sync_document
15
18
 
16
19
  def run_cli(system_arguments: list[str], config: Config) -> None:
17
20
  match system_arguments:
18
- case [_, "preview", file_path]:
19
- _preview(file_path, config)
21
+ case [_, "create", filename]:
22
+ _create_template(filename, config)
23
+ case [_, "preview", filename]:
24
+ _preview(filename, config)
20
25
  case _:
21
- print("Usage: ssb-pubmd preview QUARTO_MARKDOWN_FILE")
26
+ print("Usage:")
27
+ print(" ssb-pubmd create FILENAME")
28
+ print(" ssb-pubmd preview FILENAME")
22
29
  sys.exit(1)
23
30
 
24
31
 
32
+ def _create_template(filename: str, config: Config) -> None:
33
+ destination = Path.cwd() / filename
34
+ if destination.suffix != ".qmd":
35
+ print("The destination file path must have the '.qmd' extension.")
36
+ sys.exit(1)
37
+
38
+ with resources.open_text(templates, "template.qmd") as file:
39
+ raw_template = file.read()
40
+
41
+ rendered_template = Template(raw_template).render(
42
+ filepath=destination,
43
+ cms_admin_url=config.publish_base_url + config.publish_admin_path,
44
+ project_folder=destination.parent.name,
45
+ filename=destination.name,
46
+ )
47
+ destination.write_text(rendered_template)
48
+ print(
49
+ f"Successfully created template file {destination}.\n",
50
+ "Open the file for further instructions.",
51
+ )
52
+
53
+
25
54
  def _preview(file_path: str, config: Config) -> None:
26
55
  if Path(file_path).suffix != ".qmd":
27
56
  print("Only Quarto Markdown (.qmd) files are supported.")
28
57
  sys.exit(1)
29
- try:
30
- print("Fetching labid token...")
31
- publish_client = get_publish_client(config, use_dapla_token_client=True)
32
- except Exception:
33
- print("Failed to fetch labid token; using environment variable...")
34
- publish_client = get_publish_client(config, use_dapla_token_client=False)
58
+
59
+ publish_client = get_publish_client(config)
35
60
 
36
61
  _sync_updated_file(file_path, publish_client)
37
62
 
38
63
  print("Watching for file changes...")
39
64
  for changes in watch(file_path):
65
+ print("Found changes:")
66
+ print(changes)
40
67
  _sync_updated_file(file_path, publish_client)
41
68
 
42
69
  def _sync_updated_file(file_path: str, publish_client: PublishClient) -> None:
43
70
  print("Syncing updated document...")
44
- try:
45
- preview_url = _sync_quarto_file(file_path, publish_client)
46
- print(f"Content synced successfully. Preview URL: {preview_url}")
47
- except Exception as e:
48
- print(f"Error during sync: {e}")
71
+ preview_url = _sync_quarto_file(file_path, publish_client)
72
+ print(f"Content synced successfully. Preview URL: {preview_url}")
49
73
 
50
74
  def _sync_quarto_file(file_path: str, publish_client: PublishClient) -> str:
51
75
  pandoc_document = _quarto_to_pandoc(file_path)
ssb_pubmd/config.py CHANGED
@@ -4,20 +4,34 @@ import os
4
4
  from dataclasses import dataclass
5
5
  from pathlib import Path
6
6
 
7
- APP_NAME = "SSB_PUBMD"
8
-
9
7
 
10
8
  @dataclass
11
9
  class Config:
12
10
  publish_base_url: str
13
- publish_endpoint: str
14
- publish_preview_base_path: str
11
+ publish_admin_path: str
12
+ use_dapla_token_client: bool
13
+
14
+
15
+ _TEST_CONFIG = Config(
16
+ publish_base_url="https://i.test.ssb.no",
17
+ publish_admin_path="/xp/admin",
18
+ use_dapla_token_client=True,
19
+ )
20
+
21
+ _LOCAL_CONFIG = Config(
22
+ publish_base_url="http://localhost:8080",
23
+ publish_admin_path="/admin",
24
+ use_dapla_token_client=False,
25
+ )
15
26
 
16
27
 
17
28
  def get_config(metadata_file_path: Path | None = None) -> Config:
18
- """Get config from enviromnent variables."""
19
- return Config(
20
- publish_base_url=os.environ[f"{APP_NAME}_BASE_URL"],
21
- publish_endpoint=os.environ[f"{APP_NAME}_ENDPOINT"],
22
- publish_preview_base_path=os.environ[f"{APP_NAME}_PREVIEW_BASE_PATH"],
23
- )
29
+ if os.environ.get("SSB_PUBMD_ENVIRONMENT") == "local":
30
+ config = _LOCAL_CONFIG
31
+ else:
32
+ config = _TEST_CONFIG
33
+
34
+ if os.environ.get("SSB_PUBMD_TOKEN_CLIENT") == "local":
35
+ config.use_dapla_token_client = False
36
+
37
+ return config
@@ -45,7 +45,10 @@ def configure_factbox(
45
45
  )
46
46
  _store_user_content(user_key=key, content=content)
47
47
 
48
- md = _get_markdown_snippet(key, placeholder_text="Faktaboksens tekst skrives her.")
48
+ md = _get_markdown_snippet(
49
+ key,
50
+ placeholder_text="Faktaboksens tekst skrives her med Markdown-syntaks.\n\n### Underoverskrift\n\nNy paragraf.",
51
+ )
49
52
  print(md)
50
53
 
51
54
 
File without changes
@@ -0,0 +1,138 @@
1
+ ---
2
+ ssb:
3
+ path: /utdanning/grunnskoler/statistikk/elevar-i-grunnskolen/artikler
4
+ title: "Hovedtittel for artikkelen"
5
+ authors:
6
+ - name: Fornavn Etternavn
7
+ email: ---@ssb.no
8
+ - name: Fornavn Etternavn
9
+ email: ---@ssb.no
10
+ ingress: |
11
+ Ingress for artikkelen,
12
+ som kan skrives over flere linjer.
13
+ ---
14
+ Dette er en SSB-artikkel skrevet med Quarto Markdown.
15
+
16
+ Neste steg:
17
+
18
+ 1. Sjekk at du er logget inn i CMS-et: {{ cms_admin_url }}/tool/com.enonic.app.contentstudio/main.
19
+
20
+ 2. Det er gitt et eksempel på CMS-mappe i feltet `path` ovenfor. Endre denne til CMS-mappen du ønsker å opprette artikkelen i. Dette må være en mappe du har skrivetilgang til.
21
+
22
+ 3. Kjør kommandoen `poetry run ssb-pubmd preview {{ filepath }}`.
23
+
24
+ * Dette vil opprette en draft-artikkel og printe URL'en til en forhåndsvisning av artikkelen.
25
+ * Kommandoen fungerer tilsvarende som `quarto preview`, det vil si at forhåndsvisningen holdes oppdatert etter hvert som du endrer og lagrer denne filen.****
26
+ * Du må oppdatere nettleservinduet for å se endringene.
27
+
28
+ 4. Les seksjonene nedenfor for en kort introduksjon til skriving av SSB-artikler i Quarto Markdown.
29
+
30
+ ## Artikkelmetadata
31
+
32
+ Metadata-blokken øverst viser all metadata som kan settes for en artikkel.
33
+ Dette er noe begrenset i testversjonen, men vil senere være komplett.
34
+ Merk at `path` og `title` er obligatoriske felt.
35
+
36
+
37
+ ## Markdown
38
+
39
+ Se [Quarto-referansen](https://quarto.org/docs/authoring/markdown-basics.html). Merk at:
40
+
41
+ * Hovedoverskrift (`#`) støttes ikke, og skal settes i metadatablokken.
42
+
43
+ ## Kode
44
+
45
+ Se [Quarto-referansen](https://quarto.org/docs/computations/python.html). Merk at:
46
+
47
+ * Ingen kodeblokker eller output vil komme med i artikkelen.
48
+ * [Kode i teksten](https://quarto.org/docs/computations/inline-code.html) støttes. Koden vil evalueres og erstattes med tekst før artikkelen sendes til CMS'et.
49
+ * All kode må kunne kjøres fra topp til bunn.
50
+
51
+ ## SSB-komponenter
52
+
53
+ I testversjonen tilbys et begrenset utvalg SSB-komponenter.
54
+ Komponentene opprettes med Python og settes inn med Markdown.
55
+
56
+ ### Opprette komponenter
57
+
58
+ Importér Python-pakken:
59
+
60
+ ```{python}
61
+ import ssb_pubmd as ssb
62
+ ```
63
+
64
+ Kodeblokkene nedenfor viser opprettelse av to komponenter; et highchart og en faktaboks:
65
+ ```{python}
66
+ import pandas as pd
67
+ data = {
68
+ "År": [
69
+ 2000, 2001, 2002, 2003, 2004,
70
+ 2005, 2006, 2007, 2008, 2009,
71
+ 2010, 2011, 2012, 2013, 2014,
72
+ 2015, 2016, 2017, 2018, 2019
73
+ ],
74
+ "Andel": [
75
+ 4, 3.3, 4.7, 5.6, 7.2,
76
+ 6.7, 7, 7.3, 7.6, 7.7,
77
+ 7.7, 7.6, 8, 8.6, 9.4,
78
+ 10, 10.3, 10.7, 11.3, 11.7
79
+ ]
80
+ }
81
+ df = pd.DataFrame(data)
82
+
83
+ ssb.Highchart(
84
+ key="my-highchart",
85
+ title="Highchart title",
86
+ dataframe=df,
87
+ graph_type="line",
88
+ xlabel="my_xlabel",
89
+ ylabel="my_ylabel"
90
+ )
91
+ ```
92
+
93
+ ```{python}
94
+ ssb.Factbox(
95
+ key = "my-factbox",
96
+ title = "Factbox title",
97
+ display_type = "default")
98
+ ```
99
+
100
+ Dokumentasjon: (link kommer).
101
+ * For å se alle funksjonene som tilbys, skriv `ssb.` på en kodelinje og tast `Ctrl + Space` (VSCode) eller `Tab` (Jupyterlab).
102
+ * VSCode: Dokumentasjonen til funksjonen vises automatisk i en popup-boks når man hovrer over funksjonen.
103
+
104
+ ### Sette inn komponenter
105
+
106
+ Når du kjører en av kodeblokkene ovenfor, vil det printes en Markdown-snippet som kan kopieres og limes inn på en ny linje:
107
+
108
+ ::: { #my-highchart .ssb }
109
+ :::
110
+
111
+ Merk at faktabokser settes inn med innhold:
112
+
113
+ ::: { #my-factbox .ssb }
114
+
115
+ Faktaboksens tekst skrives her med Markdown-syntaks.
116
+
117
+ ### Underoverskrift
118
+
119
+ Ny paragraf.
120
+
121
+ :::
122
+
123
+
124
+ ## Synkronisering
125
+
126
+ Etter å ha synkronisert denne filen til CMS'et, vil du se en ekstra fil i Dapla-tjenesten:
127
+
128
+ ```
129
+ {{ project_folder }}/
130
+ ├── {{ filename }}
131
+ ├── .ssbno.json
132
+ ```
133
+
134
+ Metadatafilen `.ssbno.json` er automatisk generert og inneholder metadata for den tilhørende CMS-artikkelen. Merk at:
135
+
136
+ * Dersom `.ssbno.json` slettes, vil en ny CMS-artikkel opprettes ved neste synkronisering.
137
+ * Dersom man jobber med to separate SSB-artikler, skal disse ligge i hver sin mappe, slik at de har hver sin metadatafil.
138
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: ssb-pubmd
3
- Version: 0.1.1
3
+ Version: 0.1.3
4
4
  Summary: SSB Pubmd
5
5
  License: MIT
6
6
  Author: Olav Landsverk
@@ -16,10 +16,8 @@ Classifier: Programming Language :: Python :: 3.13
16
16
  Requires-Dist: dapla-auth-client (>=1.2.5,<2.0.0)
17
17
  Requires-Dist: ipynbname (>=2025.8.0.0,<2026.0.0.0)
18
18
  Requires-Dist: narwhals (>=2.15.0,<3.0.0)
19
- Requires-Dist: nbformat (>=5.10.4,<6.0.0)
20
19
  Requires-Dist: nh3 (>=0.3.2,<0.4.0)
21
20
  Requires-Dist: pandocfilters (>=1.5.1,<2.0.0)
22
- Requires-Dist: pydantic (>=2.12.5,<3.0.0)
23
21
  Requires-Dist: requests (>=2.32.4,<3.0.0)
24
22
  Requires-Dist: watchfiles (>=1.1.1,<2.0.0)
25
23
  Project-URL: Changelog, https://github.com/statisticsnorway/ssb-pubmd/releases
@@ -0,0 +1,18 @@
1
+ ssb_pubmd/__init__.py,sha256=GmZebzEEIJcwwYD6_J5irpY5-lGAKFr8lRrTGB_nAPA,170
2
+ ssb_pubmd/__main__.py,sha256=7Trn-DZkNbVn6s5J8FVg9JFtpFEHv-4VKZ34MVs23Cc,204
3
+ ssb_pubmd/adapters/content_parser.py,sha256=ExOULfwoFBVb9h2wH8m61fWFy192ZEIG2LI3fuFRpbE,5141
4
+ ssb_pubmd/adapters/document_processor.py,sha256=GN4FJmWcyiCdTBzWkyUReFGd7AME-F4Eq5N4JmarddQ,4271
5
+ ssb_pubmd/adapters/publish_client.py,sha256=5JIVtJCV_uLDv6YwGitQLE_T4dLWaWQCm9nO6F9RpR4,3350
6
+ ssb_pubmd/adapters/storage.py,sha256=Dexfgw0csQ9wljC6lqf9kFmoM2CHdfMghm-qBrgdWjM,1227
7
+ ssb_pubmd/cli.py,sha256=fOJKHz8l871k5rS-1b1IUzgnhJozMhiujXwzqyeL6og,3262
8
+ ssb_pubmd/config.py,sha256=FbHkHDobBdqZLT9ZZKfH9Ch0wtj4TmKNF8EMCbQAJgE,844
9
+ ssb_pubmd/domain/document_publisher.py,sha256=hgzJx9kGZJOVLrgFRg-JGAmNsasvHA9_BA1g3htcWrQ,1920
10
+ ssb_pubmd/notebook_client.py,sha256=w4Jlo6CH5tVTzSxZlD0bPn0CPwgdX2NL7nKzlfstheU,4090
11
+ ssb_pubmd/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
+ ssb_pubmd/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
+ ssb_pubmd/templates/template.qmd,sha256=s4aEMlseEyZMytHrNz8HpcYd1JG2UPwTOL_edJ48qmQ,4084
14
+ ssb_pubmd-0.1.3.dist-info/LICENSE,sha256=tF5bnYv09fgH5ph9t1EpH1MGrVOGTQeswL4dzVeZ_ak,1073
15
+ ssb_pubmd-0.1.3.dist-info/METADATA,sha256=Z9mTdqMo6jas9Pc40RmrnphQH41sCrXMdrxHfIb7PUw,4017
16
+ ssb_pubmd-0.1.3.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
17
+ ssb_pubmd-0.1.3.dist-info/entry_points.txt,sha256=o4oU99zbZNIBKGYWdgdEG6ev-62ZRWEJOe7EOjJaajk,53
18
+ ssb_pubmd-0.1.3.dist-info/RECORD,,
@@ -1,16 +0,0 @@
1
- ssb_pubmd/__init__.py,sha256=GmZebzEEIJcwwYD6_J5irpY5-lGAKFr8lRrTGB_nAPA,170
2
- ssb_pubmd/__main__.py,sha256=7Trn-DZkNbVn6s5J8FVg9JFtpFEHv-4VKZ34MVs23Cc,204
3
- ssb_pubmd/adapters/content_parser.py,sha256=ExOULfwoFBVb9h2wH8m61fWFy192ZEIG2LI3fuFRpbE,5141
4
- ssb_pubmd/adapters/document_processor.py,sha256=GN4FJmWcyiCdTBzWkyUReFGd7AME-F4Eq5N4JmarddQ,4271
5
- ssb_pubmd/adapters/publish_client.py,sha256=mBRfOEEcrmKlDHJVsaqQR984XlJel9oBK4PGP-GhriE,3451
6
- ssb_pubmd/adapters/storage.py,sha256=Dexfgw0csQ9wljC6lqf9kFmoM2CHdfMghm-qBrgdWjM,1227
7
- ssb_pubmd/cli.py,sha256=dusmoCX3U6Lpc_uSqqgCRC0U0m8fRq48ExdsYBXRtr4,2555
8
- ssb_pubmd/config.py,sha256=chnW-GC5Ie5kEcjVb-4_a5_Vq6glhATorDVIghc50SI,606
9
- ssb_pubmd/domain/document_publisher.py,sha256=hgzJx9kGZJOVLrgFRg-JGAmNsasvHA9_BA1g3htcWrQ,1920
10
- ssb_pubmd/notebook_client.py,sha256=MANyeyIdTuci8b0flD9e3jgFnEwx5dGo4zLMp39tkRE,4007
11
- ssb_pubmd/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
- ssb_pubmd-0.1.1.dist-info/LICENSE,sha256=tF5bnYv09fgH5ph9t1EpH1MGrVOGTQeswL4dzVeZ_ak,1073
13
- ssb_pubmd-0.1.1.dist-info/METADATA,sha256=z_bEnr4p9KiPhscq4X5r8mHmn34Wambsacj7DLlp_bA,4101
14
- ssb_pubmd-0.1.1.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
15
- ssb_pubmd-0.1.1.dist-info/entry_points.txt,sha256=o4oU99zbZNIBKGYWdgdEG6ev-62ZRWEJOe7EOjJaajk,53
16
- ssb_pubmd-0.1.1.dist-info/RECORD,,