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.
Files changed (20) hide show
  1. {oapi_profile_builder-3.5.0/src/oapi_profile_builder.egg-info → oapi_profile_builder-3.6.1}/PKG-INFO +54 -5
  2. {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/README.md +53 -4
  3. {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/pyproject.toml +1 -1
  4. {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder/cover.py +8 -5
  5. {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder/generate.py +7 -6
  6. {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder/models.py +28 -6
  7. {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1/src/oapi_profile_builder.egg-info}/PKG-INFO +54 -5
  8. {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/LICENSE +0 -0
  9. {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/setup.cfg +0 -0
  10. {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder/__init__.py +0 -0
  11. {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder/cite.py +0 -0
  12. {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder/cite_features.py +0 -0
  13. {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder/cli.py +0 -0
  14. {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder/compile.py +0 -0
  15. {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder/server_validation.py +0 -0
  16. {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder.egg-info/SOURCES.txt +0 -0
  17. {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder.egg-info/dependency_links.txt +0 -0
  18. {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder.egg-info/entry_points.txt +0 -0
  19. {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder.egg-info/requires.txt +0 -0
  20. {oapi_profile_builder-3.5.0 → oapi_profile_builder-3.6.1}/src/oapi_profile_builder.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: oapi-profile-builder
3
- Version: 3.5.0
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: 200 # target logo width in px (default 420)
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
- bold_edition: true # render the "Edition X" line in bold (default false)
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: 200 # target logo width in px (default 420)
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
- bold_edition: true # render the "Edition X" line in bold (default false)
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.5.0"
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
- bold_ed = bool(getattr(cover, "bold_edition", False))
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(28), y, fg) + 80
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 ""
@@ -1405,13 +1405,16 @@ def build_asyncapi(profile: ServiceProfile) -> dict:
1405
1405
  }
1406
1406
  }
1407
1407
 
1408
- # Build servers: default production + additional servers
1409
- servers = {
1410
- "production": {
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
@@ -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
- bold_edition: bool = Field(default=False, description="When true, render edition in bold font")
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="Additional server endpoints (ws, wss)")
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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: oapi-profile-builder
3
- Version: 3.5.0
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: 200 # target logo width in px (default 420)
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
- bold_edition: true # render the "Edition X" line in bold (default false)
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