oapi-profile-builder 3.5.0__tar.gz → 3.6.1__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.
- {oapi_profile_builder-3.5.0/src/oapi_profile_builder.egg-info → oapi_profile_builder-3.6.1}/PKG-INFO +54 -5
- {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/README.md +53 -4
- {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/pyproject.toml +1 -1
- {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder/cover.py +8 -5
- {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder/generate.py +7 -6
- {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder/models.py +28 -6
- {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1/src/oapi_profile_builder.egg-info}/PKG-INFO +54 -5
- {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/LICENSE +0 -0
- {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/setup.cfg +0 -0
- {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder/__init__.py +0 -0
- {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder/cite.py +0 -0
- {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder/cite_features.py +0 -0
- {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder/cli.py +0 -0
- {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder/compile.py +0 -0
- {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder/server_validation.py +0 -0
- {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder.egg-info/SOURCES.txt +0 -0
- {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder.egg-info/dependency_links.txt +0 -0
- {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder.egg-info/entry_points.txt +0 -0
- {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder.egg-info/requires.txt +0 -0
- {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder.egg-info/top_level.txt +0 -0
{oapi_profile_builder-3.5.0/src/oapi_profile_builder.egg-info → oapi_profile_builder-3.6.1}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: oapi-profile-builder
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.6.1
|
|
4
4
|
Summary: Authoritative tooling for creating OGC API Service Profiles (EDR, Features)
|
|
5
5
|
Author-email: Shane Mill <shane.mill@noaa.gov>
|
|
6
6
|
License: Apache License
|
|
@@ -181,6 +181,20 @@ OGC API - EDR CITE Results
|
|
|
181
181
|
|
|
182
182
|
## GitHub Actions
|
|
183
183
|
|
|
184
|
+
### Self-service: generate artifacts from an issue (no fork, no install)
|
|
185
|
+
|
|
186
|
+
Anyone with a GitHub account can generate artifacts from their own config without cloning or installing anything:
|
|
187
|
+
|
|
188
|
+
1. Open a new issue using the **"Generate profile artifacts"** template ([New issue](../../issues/new/choose)).
|
|
189
|
+
2. Paste your profile YAML into the config field and submit.
|
|
190
|
+
3. A workflow validates the config, generates the artifacts, and comments on the issue with a link to download them as a zip (retained for 14 days). Optionally tick "Compile a PDF?" to also get a Metanorma PDF.
|
|
191
|
+
|
|
192
|
+
The workflow only runs the generator over your declarative config — it never executes user-supplied code — and comments back on both success and failure. Don't paste secrets: the artifacts are attached to a public workflow run.
|
|
193
|
+
|
|
194
|
+
> Maintainers: create a `profile-request` label so requests are easy to filter (the workflow gates on a marker in the issue body, so it works even before the label exists).
|
|
195
|
+
|
|
196
|
+
### Use the action in your own workflow
|
|
197
|
+
|
|
184
198
|
No local install needed. Add this to any workflow to generate profile artifacts from a config file:
|
|
185
199
|
|
|
186
200
|
```yaml
|
|
@@ -239,7 +253,7 @@ Everything about the document — cover, title-page metadata, legal page, footer
|
|
|
239
253
|
| PDF colours (titles, tables, cover, backgrounds) | `document_metadata.colors` | `:presentation-metadata-color-*:` |
|
|
240
254
|
| Page-ii legal text (copyright / license / notice) | `document_metadata.boilerplate` | `:boilerplate-authority:` |
|
|
241
255
|
| Footer organisation name | `document_metadata.copyright_holder` | `:copyright-holder:` |
|
|
242
|
-
| Cover layout (logo size/position, tagline/title size, bold edition) | `document_metadata.cover.{logo_width, logo_y, tagline_font_size, title_font_size, bold_edition}` | Generated cover image |
|
|
256
|
+
| Cover layout (logo size/position, tagline/title/edition-date size, bold edition+date) | `document_metadata.cover.{logo_width, logo_y, tagline_font_size, title_font_size, edition_date_font_size, bold_edition}` | Generated cover image |
|
|
243
257
|
| Cover date | `document_metadata.doc_pub_date` | Long-format date on the generated cover + `:published-date:` |
|
|
244
258
|
| Remove the OGC logo from the legal page | `document_metadata.suppress_flavor_logo` | targeted `:pdf-stylesheet-override:` |
|
|
245
259
|
| Remove OGC design (crossing lines, circled numbers, rules, navy divider pages) | `document_metadata.suppress_design_elements` (or the individual `suppress_crossing_lines` / `plain_section_numbers` / `suppress_title_underlines`) | `:pdf-stylesheet-override:` + colour attributes |
|
|
@@ -695,7 +709,7 @@ When present, generates `asyncapi.yaml` alongside `openapi.yaml`.
|
|
|
695
709
|
pubsub:
|
|
696
710
|
broker_host: my-broker.example.com
|
|
697
711
|
broker_port: 5672
|
|
698
|
-
protocol: amqp # amqp | mqtt | kafka
|
|
712
|
+
protocol: amqp # amqp | amqp1 | mqtt | kafka
|
|
699
713
|
collections:
|
|
700
714
|
- my_collection
|
|
701
715
|
filters:
|
|
@@ -704,6 +718,40 @@ pubsub:
|
|
|
704
718
|
type: string
|
|
705
719
|
```
|
|
706
720
|
|
|
721
|
+
`broker_host`/`broker_port`/`protocol` synthesise a single implicit
|
|
722
|
+
`production` AsyncAPI server. To describe an exact transport topology instead —
|
|
723
|
+
e.g. a native WebSocket `/ws` endpoint plus AMQP 1.0 and MQTT brokers, as the
|
|
724
|
+
`nws_connect_profile.yaml` example does — list them explicitly under `servers`.
|
|
725
|
+
When `servers` is set, the implicit `production` server is **not** emitted:
|
|
726
|
+
|
|
727
|
+
```yaml
|
|
728
|
+
pubsub:
|
|
729
|
+
broker_host: edr-broker
|
|
730
|
+
broker_port: 5672
|
|
731
|
+
protocol: amqp1 # AMQP 1.0 (e.g. RabbitMQ 4.x native)
|
|
732
|
+
collections: [water_gauge, wwa]
|
|
733
|
+
servers:
|
|
734
|
+
- name: websocket_secure
|
|
735
|
+
description: Native WebSocket live map (production)
|
|
736
|
+
host: ''
|
|
737
|
+
protocol: wss # amqp | amqp1 | mqtt | kafka | ws | wss
|
|
738
|
+
pathname: /ws
|
|
739
|
+
- name: amqp
|
|
740
|
+
description: AMQP 1.0 broker (RabbitMQ 4.x native AMQP 1.0)
|
|
741
|
+
host: 'edr-broker:5672'
|
|
742
|
+
protocol: amqp1
|
|
743
|
+
- name: mqtt
|
|
744
|
+
description: MQTT broker (RabbitMQ MQTT plugin)
|
|
745
|
+
host: 'edr-broker:1883'
|
|
746
|
+
protocol: mqtt
|
|
747
|
+
collection_filters: # per-collection filter overrides
|
|
748
|
+
water_gauge:
|
|
749
|
+
filters:
|
|
750
|
+
- name: flood_stages
|
|
751
|
+
description: Alert for selected flood stages
|
|
752
|
+
type: array
|
|
753
|
+
```
|
|
754
|
+
|
|
707
755
|
---
|
|
708
756
|
|
|
709
757
|
### `document_metadata`
|
|
@@ -773,11 +821,12 @@ document_metadata:
|
|
|
773
821
|
font_italic: "Source Sans Pro" # optional italic face for the tagline
|
|
774
822
|
watermark: "DRAFT" # optional diagonal watermark stamped on the cover
|
|
775
823
|
# --- cover layout (all optional) ---
|
|
776
|
-
logo_width:
|
|
824
|
+
logo_width: 300 # target logo width in px (default 420)
|
|
777
825
|
logo_y: 100 # logo vertical offset from top in px (default 180)
|
|
778
826
|
tagline_font_size: 20 # tagline point size (default 30)
|
|
779
827
|
title_font_size: 40 # title point size (default 54)
|
|
780
|
-
|
|
828
|
+
edition_date_font_size: 22 # edition/date point size (default 24)
|
|
829
|
+
bold_edition: true # render the "Edition X" and "Dated ..." lines in bold (default false)
|
|
781
830
|
colors:
|
|
782
831
|
text: "#000000" # body text
|
|
783
832
|
cover_text: "#1F3864" # cover text / section numbers / ToC
|
|
@@ -134,6 +134,20 @@ OGC API - EDR CITE Results
|
|
|
134
134
|
|
|
135
135
|
## GitHub Actions
|
|
136
136
|
|
|
137
|
+
### Self-service: generate artifacts from an issue (no fork, no install)
|
|
138
|
+
|
|
139
|
+
Anyone with a GitHub account can generate artifacts from their own config without cloning or installing anything:
|
|
140
|
+
|
|
141
|
+
1. Open a new issue using the **"Generate profile artifacts"** template ([New issue](../../issues/new/choose)).
|
|
142
|
+
2. Paste your profile YAML into the config field and submit.
|
|
143
|
+
3. A workflow validates the config, generates the artifacts, and comments on the issue with a link to download them as a zip (retained for 14 days). Optionally tick "Compile a PDF?" to also get a Metanorma PDF.
|
|
144
|
+
|
|
145
|
+
The workflow only runs the generator over your declarative config — it never executes user-supplied code — and comments back on both success and failure. Don't paste secrets: the artifacts are attached to a public workflow run.
|
|
146
|
+
|
|
147
|
+
> Maintainers: create a `profile-request` label so requests are easy to filter (the workflow gates on a marker in the issue body, so it works even before the label exists).
|
|
148
|
+
|
|
149
|
+
### Use the action in your own workflow
|
|
150
|
+
|
|
137
151
|
No local install needed. Add this to any workflow to generate profile artifacts from a config file:
|
|
138
152
|
|
|
139
153
|
```yaml
|
|
@@ -192,7 +206,7 @@ Everything about the document — cover, title-page metadata, legal page, footer
|
|
|
192
206
|
| PDF colours (titles, tables, cover, backgrounds) | `document_metadata.colors` | `:presentation-metadata-color-*:` |
|
|
193
207
|
| Page-ii legal text (copyright / license / notice) | `document_metadata.boilerplate` | `:boilerplate-authority:` |
|
|
194
208
|
| Footer organisation name | `document_metadata.copyright_holder` | `:copyright-holder:` |
|
|
195
|
-
| Cover layout (logo size/position, tagline/title size, bold edition) | `document_metadata.cover.{logo_width, logo_y, tagline_font_size, title_font_size, bold_edition}` | Generated cover image |
|
|
209
|
+
| Cover layout (logo size/position, tagline/title/edition-date size, bold edition+date) | `document_metadata.cover.{logo_width, logo_y, tagline_font_size, title_font_size, edition_date_font_size, bold_edition}` | Generated cover image |
|
|
196
210
|
| Cover date | `document_metadata.doc_pub_date` | Long-format date on the generated cover + `:published-date:` |
|
|
197
211
|
| Remove the OGC logo from the legal page | `document_metadata.suppress_flavor_logo` | targeted `:pdf-stylesheet-override:` |
|
|
198
212
|
| Remove OGC design (crossing lines, circled numbers, rules, navy divider pages) | `document_metadata.suppress_design_elements` (or the individual `suppress_crossing_lines` / `plain_section_numbers` / `suppress_title_underlines`) | `:pdf-stylesheet-override:` + colour attributes |
|
|
@@ -648,7 +662,7 @@ When present, generates `asyncapi.yaml` alongside `openapi.yaml`.
|
|
|
648
662
|
pubsub:
|
|
649
663
|
broker_host: my-broker.example.com
|
|
650
664
|
broker_port: 5672
|
|
651
|
-
protocol: amqp # amqp | mqtt | kafka
|
|
665
|
+
protocol: amqp # amqp | amqp1 | mqtt | kafka
|
|
652
666
|
collections:
|
|
653
667
|
- my_collection
|
|
654
668
|
filters:
|
|
@@ -657,6 +671,40 @@ pubsub:
|
|
|
657
671
|
type: string
|
|
658
672
|
```
|
|
659
673
|
|
|
674
|
+
`broker_host`/`broker_port`/`protocol` synthesise a single implicit
|
|
675
|
+
`production` AsyncAPI server. To describe an exact transport topology instead —
|
|
676
|
+
e.g. a native WebSocket `/ws` endpoint plus AMQP 1.0 and MQTT brokers, as the
|
|
677
|
+
`nws_connect_profile.yaml` example does — list them explicitly under `servers`.
|
|
678
|
+
When `servers` is set, the implicit `production` server is **not** emitted:
|
|
679
|
+
|
|
680
|
+
```yaml
|
|
681
|
+
pubsub:
|
|
682
|
+
broker_host: edr-broker
|
|
683
|
+
broker_port: 5672
|
|
684
|
+
protocol: amqp1 # AMQP 1.0 (e.g. RabbitMQ 4.x native)
|
|
685
|
+
collections: [water_gauge, wwa]
|
|
686
|
+
servers:
|
|
687
|
+
- name: websocket_secure
|
|
688
|
+
description: Native WebSocket live map (production)
|
|
689
|
+
host: ''
|
|
690
|
+
protocol: wss # amqp | amqp1 | mqtt | kafka | ws | wss
|
|
691
|
+
pathname: /ws
|
|
692
|
+
- name: amqp
|
|
693
|
+
description: AMQP 1.0 broker (RabbitMQ 4.x native AMQP 1.0)
|
|
694
|
+
host: 'edr-broker:5672'
|
|
695
|
+
protocol: amqp1
|
|
696
|
+
- name: mqtt
|
|
697
|
+
description: MQTT broker (RabbitMQ MQTT plugin)
|
|
698
|
+
host: 'edr-broker:1883'
|
|
699
|
+
protocol: mqtt
|
|
700
|
+
collection_filters: # per-collection filter overrides
|
|
701
|
+
water_gauge:
|
|
702
|
+
filters:
|
|
703
|
+
- name: flood_stages
|
|
704
|
+
description: Alert for selected flood stages
|
|
705
|
+
type: array
|
|
706
|
+
```
|
|
707
|
+
|
|
660
708
|
---
|
|
661
709
|
|
|
662
710
|
### `document_metadata`
|
|
@@ -726,11 +774,12 @@ document_metadata:
|
|
|
726
774
|
font_italic: "Source Sans Pro" # optional italic face for the tagline
|
|
727
775
|
watermark: "DRAFT" # optional diagonal watermark stamped on the cover
|
|
728
776
|
# --- cover layout (all optional) ---
|
|
729
|
-
logo_width:
|
|
777
|
+
logo_width: 300 # target logo width in px (default 420)
|
|
730
778
|
logo_y: 100 # logo vertical offset from top in px (default 180)
|
|
731
779
|
tagline_font_size: 20 # tagline point size (default 30)
|
|
732
780
|
title_font_size: 40 # title point size (default 54)
|
|
733
|
-
|
|
781
|
+
edition_date_font_size: 22 # edition/date point size (default 24)
|
|
782
|
+
bold_edition: true # render the "Edition X" and "Dated ..." lines in bold (default false)
|
|
734
783
|
colors:
|
|
735
784
|
text: "#000000" # body text
|
|
736
785
|
cover_text: "#1F3864" # cover text / section numbers / ToC
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "oapi-profile-builder"
|
|
7
|
-
version = "3.
|
|
7
|
+
version = "3.6.1"
|
|
8
8
|
description = "Authoritative tooling for creating OGC API Service Profiles (EDR, Features)"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { file = "LICENSE" }
|
|
@@ -197,17 +197,20 @@ def build_cover_image(profile, output_dir: Path) -> str | None:
|
|
|
197
197
|
if m and m.doc_number:
|
|
198
198
|
y = centered(m.doc_number, fonts.regular_font(46, bold=True), y, fg) + 40
|
|
199
199
|
|
|
200
|
-
# --- Edition ---
|
|
200
|
+
# --- Edition & date ---
|
|
201
|
+
# Per DGIWG feedback these two lines are both bold and set a little smaller
|
|
202
|
+
# than the document number so they read as a compact sub-heading.
|
|
203
|
+
ed_date_fs = getattr(cover, "edition_date_font_size", 24)
|
|
204
|
+
bold_ed = bool(getattr(cover, "bold_edition", False))
|
|
205
|
+
|
|
201
206
|
edition = getattr(profile, "version", None)
|
|
202
207
|
if edition:
|
|
203
|
-
|
|
204
|
-
y = centered(f"Edition {edition}", fonts.regular_font(28, bold=bold_ed), y, fg) + 24
|
|
208
|
+
y = centered(f"Edition {edition}", fonts.regular_font(ed_date_fs, bold=bold_ed), y, fg) + 20
|
|
205
209
|
|
|
206
|
-
# --- Date ---
|
|
207
210
|
pub_date = (m.doc_pub_date or m.publication_date) if m else None
|
|
208
211
|
date_str = _format_date(pub_date)
|
|
209
212
|
if date_str:
|
|
210
|
-
y = centered(f"Dated {date_str}", fonts.regular_font(
|
|
213
|
+
y = centered(f"Dated {date_str}", fonts.regular_font(ed_date_fs, bold=bold_ed), y, fg) + 80
|
|
211
214
|
|
|
212
215
|
# --- Title (large, bold, wrapped) ---
|
|
213
216
|
title = getattr(profile, "title", "") or ""
|
{oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder/generate.py
RENAMED
|
@@ -1405,13 +1405,16 @@ def build_asyncapi(profile: ServiceProfile) -> dict:
|
|
|
1405
1405
|
}
|
|
1406
1406
|
}
|
|
1407
1407
|
|
|
1408
|
-
# Build servers
|
|
1409
|
-
|
|
1410
|
-
|
|
1408
|
+
# Build servers. When the profile lists explicit servers, use those
|
|
1409
|
+
# verbatim so it can describe its exact transport topology (WebSocket /ws,
|
|
1410
|
+
# AMQP 1.0, MQTT, ...). Otherwise synthesise a single implicit production
|
|
1411
|
+
# server from broker_host/broker_port/protocol.
|
|
1412
|
+
servers: dict = {}
|
|
1413
|
+
if not pub.servers:
|
|
1414
|
+
servers["production"] = {
|
|
1411
1415
|
"host": f"{pub.broker_host}:{pub.broker_port}",
|
|
1412
1416
|
"protocol": pub.protocol,
|
|
1413
1417
|
}
|
|
1414
|
-
}
|
|
1415
1418
|
for srv in pub.servers:
|
|
1416
1419
|
server_def = {
|
|
1417
1420
|
"description": srv.description,
|
|
@@ -1419,8 +1422,6 @@ def build_asyncapi(profile: ServiceProfile) -> dict:
|
|
|
1419
1422
|
"protocol": srv.protocol,
|
|
1420
1423
|
"security": [],
|
|
1421
1424
|
}
|
|
1422
|
-
if srv.port:
|
|
1423
|
-
server_def["variables"] = {"port": {"default": str(srv.port), "enum": [str(srv.port)]}}
|
|
1424
1425
|
if srv.pathname:
|
|
1425
1426
|
server_def["pathname"] = srv.pathname
|
|
1426
1427
|
servers[srv.name] = server_def
|
{oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder/models.py
RENAMED
|
@@ -526,7 +526,14 @@ class CoverPage(BaseModel):
|
|
|
526
526
|
logo_y: int = Field(default=180, description="Logo y-offset from top of cover page")
|
|
527
527
|
tagline_font_size: int = Field(default=30, description="Font size of cover page tagline")
|
|
528
528
|
title_font_size: int = Field(default=54, description="Font size of cover page title")
|
|
529
|
-
|
|
529
|
+
edition_date_font_size: int = Field(
|
|
530
|
+
default=24,
|
|
531
|
+
description="Font size of the cover page edition and date lines (rendered a little smaller than the doc number)",
|
|
532
|
+
)
|
|
533
|
+
bold_edition: bool = Field(
|
|
534
|
+
default=False,
|
|
535
|
+
description="When true, render both the edition and date lines in bold font",
|
|
536
|
+
)
|
|
530
537
|
|
|
531
538
|
@field_validator("background", "text_color")
|
|
532
539
|
@classmethod
|
|
@@ -747,12 +754,18 @@ class DocumentMetadata(BaseModel):
|
|
|
747
754
|
|
|
748
755
|
|
|
749
756
|
class PubSubServer(BaseModel):
|
|
750
|
-
"""A single pub/sub server endpoint.
|
|
757
|
+
"""A single pub/sub server endpoint.
|
|
758
|
+
|
|
759
|
+
``protocol`` accepts the AsyncAPI protocol identifiers used by the EDR
|
|
760
|
+
Part 2 PubSub bindings: ``amqp`` (AMQP 0-9-1), ``amqp1`` (AMQP 1.0, e.g.
|
|
761
|
+
RabbitMQ 4.x native AMQP 1.0), ``mqtt``, ``kafka``, and the WebSocket
|
|
762
|
+
transports ``ws`` / ``wss``.
|
|
763
|
+
"""
|
|
751
764
|
name: str
|
|
752
765
|
description: str = ""
|
|
753
766
|
host: str
|
|
754
767
|
port: int | None = None
|
|
755
|
-
protocol: Literal["amqp", "mqtt", "kafka", "ws", "wss"] = "amqp"
|
|
768
|
+
protocol: Literal["amqp", "amqp1", "mqtt", "kafka", "ws", "wss"] = "amqp"
|
|
756
769
|
pathname: str | None = None
|
|
757
770
|
|
|
758
771
|
|
|
@@ -762,13 +775,22 @@ class CollectionPubSub(BaseModel):
|
|
|
762
775
|
|
|
763
776
|
|
|
764
777
|
class PubSubConfig(BaseModel):
|
|
765
|
-
"""Optional OGC API - EDR Part 2 (PubSub) configuration.
|
|
778
|
+
"""Optional OGC API - EDR Part 2 (PubSub) configuration.
|
|
779
|
+
|
|
780
|
+
When ``servers`` is populated the generated AsyncAPI uses those entries
|
|
781
|
+
verbatim (keyed by ``name``) and does not synthesise the implicit
|
|
782
|
+
``broker_host``/``broker_port`` ``production`` server, letting a profile
|
|
783
|
+
describe its exact transport topology (e.g. a native WebSocket ``/ws``
|
|
784
|
+
endpoint plus AMQP 1.0 and MQTT brokers). When ``servers`` is empty the
|
|
785
|
+
generator falls back to emitting a single ``production`` server built from
|
|
786
|
+
``broker_host``/``broker_port``/``protocol``.
|
|
787
|
+
"""
|
|
766
788
|
broker_host: str = "localhost"
|
|
767
789
|
broker_port: int = Field(default=5672, ge=1, le=65535)
|
|
768
|
-
protocol: Literal["amqp", "mqtt", "kafka"] = "amqp"
|
|
790
|
+
protocol: Literal["amqp", "amqp1", "mqtt", "kafka"] = "amqp"
|
|
769
791
|
collections: list[str] = Field(default_factory=list, description="Collection IDs that support PubSub")
|
|
770
792
|
filters: list[SubscriptionFilter] = Field(default_factory=list)
|
|
771
|
-
servers: list[PubSubServer] = Field(default_factory=list, description="
|
|
793
|
+
servers: list[PubSubServer] = Field(default_factory=list, description="Server endpoints (ws, wss, amqp, amqp1, mqtt); when set, replaces the implicit production server")
|
|
772
794
|
collection_filters: dict[str, CollectionPubSub] = Field(default_factory=dict, description="Per-collection filter overrides")
|
|
773
795
|
|
|
774
796
|
|
{oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1/src/oapi_profile_builder.egg-info}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: oapi-profile-builder
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.6.1
|
|
4
4
|
Summary: Authoritative tooling for creating OGC API Service Profiles (EDR, Features)
|
|
5
5
|
Author-email: Shane Mill <shane.mill@noaa.gov>
|
|
6
6
|
License: Apache License
|
|
@@ -181,6 +181,20 @@ OGC API - EDR CITE Results
|
|
|
181
181
|
|
|
182
182
|
## GitHub Actions
|
|
183
183
|
|
|
184
|
+
### Self-service: generate artifacts from an issue (no fork, no install)
|
|
185
|
+
|
|
186
|
+
Anyone with a GitHub account can generate artifacts from their own config without cloning or installing anything:
|
|
187
|
+
|
|
188
|
+
1. Open a new issue using the **"Generate profile artifacts"** template ([New issue](../../issues/new/choose)).
|
|
189
|
+
2. Paste your profile YAML into the config field and submit.
|
|
190
|
+
3. A workflow validates the config, generates the artifacts, and comments on the issue with a link to download them as a zip (retained for 14 days). Optionally tick "Compile a PDF?" to also get a Metanorma PDF.
|
|
191
|
+
|
|
192
|
+
The workflow only runs the generator over your declarative config — it never executes user-supplied code — and comments back on both success and failure. Don't paste secrets: the artifacts are attached to a public workflow run.
|
|
193
|
+
|
|
194
|
+
> Maintainers: create a `profile-request` label so requests are easy to filter (the workflow gates on a marker in the issue body, so it works even before the label exists).
|
|
195
|
+
|
|
196
|
+
### Use the action in your own workflow
|
|
197
|
+
|
|
184
198
|
No local install needed. Add this to any workflow to generate profile artifacts from a config file:
|
|
185
199
|
|
|
186
200
|
```yaml
|
|
@@ -239,7 +253,7 @@ Everything about the document — cover, title-page metadata, legal page, footer
|
|
|
239
253
|
| PDF colours (titles, tables, cover, backgrounds) | `document_metadata.colors` | `:presentation-metadata-color-*:` |
|
|
240
254
|
| Page-ii legal text (copyright / license / notice) | `document_metadata.boilerplate` | `:boilerplate-authority:` |
|
|
241
255
|
| Footer organisation name | `document_metadata.copyright_holder` | `:copyright-holder:` |
|
|
242
|
-
| Cover layout (logo size/position, tagline/title size, bold edition) | `document_metadata.cover.{logo_width, logo_y, tagline_font_size, title_font_size, bold_edition}` | Generated cover image |
|
|
256
|
+
| Cover layout (logo size/position, tagline/title/edition-date size, bold edition+date) | `document_metadata.cover.{logo_width, logo_y, tagline_font_size, title_font_size, edition_date_font_size, bold_edition}` | Generated cover image |
|
|
243
257
|
| Cover date | `document_metadata.doc_pub_date` | Long-format date on the generated cover + `:published-date:` |
|
|
244
258
|
| Remove the OGC logo from the legal page | `document_metadata.suppress_flavor_logo` | targeted `:pdf-stylesheet-override:` |
|
|
245
259
|
| Remove OGC design (crossing lines, circled numbers, rules, navy divider pages) | `document_metadata.suppress_design_elements` (or the individual `suppress_crossing_lines` / `plain_section_numbers` / `suppress_title_underlines`) | `:pdf-stylesheet-override:` + colour attributes |
|
|
@@ -695,7 +709,7 @@ When present, generates `asyncapi.yaml` alongside `openapi.yaml`.
|
|
|
695
709
|
pubsub:
|
|
696
710
|
broker_host: my-broker.example.com
|
|
697
711
|
broker_port: 5672
|
|
698
|
-
protocol: amqp # amqp | mqtt | kafka
|
|
712
|
+
protocol: amqp # amqp | amqp1 | mqtt | kafka
|
|
699
713
|
collections:
|
|
700
714
|
- my_collection
|
|
701
715
|
filters:
|
|
@@ -704,6 +718,40 @@ pubsub:
|
|
|
704
718
|
type: string
|
|
705
719
|
```
|
|
706
720
|
|
|
721
|
+
`broker_host`/`broker_port`/`protocol` synthesise a single implicit
|
|
722
|
+
`production` AsyncAPI server. To describe an exact transport topology instead —
|
|
723
|
+
e.g. a native WebSocket `/ws` endpoint plus AMQP 1.0 and MQTT brokers, as the
|
|
724
|
+
`nws_connect_profile.yaml` example does — list them explicitly under `servers`.
|
|
725
|
+
When `servers` is set, the implicit `production` server is **not** emitted:
|
|
726
|
+
|
|
727
|
+
```yaml
|
|
728
|
+
pubsub:
|
|
729
|
+
broker_host: edr-broker
|
|
730
|
+
broker_port: 5672
|
|
731
|
+
protocol: amqp1 # AMQP 1.0 (e.g. RabbitMQ 4.x native)
|
|
732
|
+
collections: [water_gauge, wwa]
|
|
733
|
+
servers:
|
|
734
|
+
- name: websocket_secure
|
|
735
|
+
description: Native WebSocket live map (production)
|
|
736
|
+
host: ''
|
|
737
|
+
protocol: wss # amqp | amqp1 | mqtt | kafka | ws | wss
|
|
738
|
+
pathname: /ws
|
|
739
|
+
- name: amqp
|
|
740
|
+
description: AMQP 1.0 broker (RabbitMQ 4.x native AMQP 1.0)
|
|
741
|
+
host: 'edr-broker:5672'
|
|
742
|
+
protocol: amqp1
|
|
743
|
+
- name: mqtt
|
|
744
|
+
description: MQTT broker (RabbitMQ MQTT plugin)
|
|
745
|
+
host: 'edr-broker:1883'
|
|
746
|
+
protocol: mqtt
|
|
747
|
+
collection_filters: # per-collection filter overrides
|
|
748
|
+
water_gauge:
|
|
749
|
+
filters:
|
|
750
|
+
- name: flood_stages
|
|
751
|
+
description: Alert for selected flood stages
|
|
752
|
+
type: array
|
|
753
|
+
```
|
|
754
|
+
|
|
707
755
|
---
|
|
708
756
|
|
|
709
757
|
### `document_metadata`
|
|
@@ -773,11 +821,12 @@ document_metadata:
|
|
|
773
821
|
font_italic: "Source Sans Pro" # optional italic face for the tagline
|
|
774
822
|
watermark: "DRAFT" # optional diagonal watermark stamped on the cover
|
|
775
823
|
# --- cover layout (all optional) ---
|
|
776
|
-
logo_width:
|
|
824
|
+
logo_width: 300 # target logo width in px (default 420)
|
|
777
825
|
logo_y: 100 # logo vertical offset from top in px (default 180)
|
|
778
826
|
tagline_font_size: 20 # tagline point size (default 30)
|
|
779
827
|
title_font_size: 40 # title point size (default 54)
|
|
780
|
-
|
|
828
|
+
edition_date_font_size: 22 # edition/date point size (default 24)
|
|
829
|
+
bold_edition: true # render the "Edition X" and "Dated ..." lines in bold (default false)
|
|
781
830
|
colors:
|
|
782
831
|
text: "#000000" # body text
|
|
783
832
|
cover_text: "#1F3864" # cover text / section numbers / ToC
|
|
File without changes
|
|
File without changes
|
{oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder/cite_features.py
RENAMED
|
File without changes
|
|
File without changes
|
{oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder/compile.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|