etassia 0.1.0
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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +140 -0
- data/LICENSE +25 -0
- data/README.adoc +436 -0
- data/exe/etassia +7 -0
- data/lib/etassia/cli.rb +187 -0
- data/lib/etassia/commands/batch.rb +210 -0
- data/lib/etassia/commands/notation_loader.rb +22 -0
- data/lib/etassia/commands/render.rb +98 -0
- data/lib/etassia/commands/types.rb +33 -0
- data/lib/etassia/commands/version.rb +24 -0
- data/lib/etassia/corpus_type_names.rb +52 -0
- data/lib/etassia/diagram/architecture.rb +108 -0
- data/lib/etassia/diagram/base.rb +61 -0
- data/lib/etassia/diagram/block.rb +102 -0
- data/lib/etassia/diagram/c4.rb +337 -0
- data/lib/etassia/diagram/class_diagram.rb +466 -0
- data/lib/etassia/diagram/class_namespace.rb +17 -0
- data/lib/etassia/diagram/class_note.rb +17 -0
- data/lib/etassia/diagram/containment.rb +107 -0
- data/lib/etassia/diagram/er_diagram.rb +317 -0
- data/lib/etassia/diagram/error.rb +38 -0
- data/lib/etassia/diagram/flowchart.rb +419 -0
- data/lib/etassia/diagram/flowchart_label_text.rb +63 -0
- data/lib/etassia/diagram/gantt.rb +94 -0
- data/lib/etassia/diagram/generic_text.rb +30 -0
- data/lib/etassia/diagram/git_graph.rb +57 -0
- data/lib/etassia/diagram/info.rb +38 -0
- data/lib/etassia/diagram/kanban.rb +198 -0
- data/lib/etassia/diagram/mindmap.rb +71 -0
- data/lib/etassia/diagram/packet.rb +93 -0
- data/lib/etassia/diagram/pie.rb +115 -0
- data/lib/etassia/diagram/quadrant.rb +135 -0
- data/lib/etassia/diagram/radar.rb +65 -0
- data/lib/etassia/diagram/requirement.rb +168 -0
- data/lib/etassia/diagram/sankey.rb +217 -0
- data/lib/etassia/diagram/sequence.rb +299 -0
- data/lib/etassia/diagram/sequence_box.rb +18 -0
- data/lib/etassia/diagram/sequence_frame.rb +37 -0
- data/lib/etassia/diagram/sequence_frame_section.rb +23 -0
- data/lib/etassia/diagram/sequence_text.rb +69 -0
- data/lib/etassia/diagram/sequence_wrap.rb +23 -0
- data/lib/etassia/diagram/state_diagram.rb +282 -0
- data/lib/etassia/diagram/timeline.rb +183 -0
- data/lib/etassia/diagram/treemap.rb +95 -0
- data/lib/etassia/diagram/user_journey.rb +153 -0
- data/lib/etassia/diagram/xy_chart.rb +90 -0
- data/lib/etassia/diagram.rb +8 -0
- data/lib/etassia/diagram_registry.rb +34 -0
- data/lib/etassia/engine.rb +334 -0
- data/lib/etassia/error/diagram_type_error.rb +10 -0
- data/lib/etassia/error/layout_error.rb +12 -0
- data/lib/etassia/error/notation_registration_error.rb +10 -0
- data/lib/etassia/error/parse_error.rb +11 -0
- data/lib/etassia/error/pipeline_error.rb +10 -0
- data/lib/etassia/error/render_error.rb +12 -0
- data/lib/etassia/error/score_error.rb +12 -0
- data/lib/etassia/error.rb +10 -0
- data/lib/etassia/error_report.rb +69 -0
- data/lib/etassia/ir/data.rb +39 -0
- data/lib/etassia/ir/data_value.rb +35 -0
- data/lib/etassia/ir/dimension.rb +10 -0
- data/lib/etassia/ir/edge.rb +34 -0
- data/lib/etassia/ir/graph.rb +28 -0
- data/lib/etassia/ir/integrity.rb +80 -0
- data/lib/etassia/ir/item.rb +46 -0
- data/lib/etassia/ir/model.rb +56 -0
- data/lib/etassia/ir/node.rb +10 -0
- data/lib/etassia/ir/placement.rb +47 -0
- data/lib/etassia/ir/prepositioned.rb +25 -0
- data/lib/etassia/ir/prepositioned_item.rb +26 -0
- data/lib/etassia/ir/property_set.rb +43 -0
- data/lib/etassia/ir/scalar.rb +25 -0
- data/lib/etassia/ir/series.rb +10 -0
- data/lib/etassia/ir.rb +17 -0
- data/lib/etassia/js_math.rb +511 -0
- data/lib/etassia/js_number.rb +64 -0
- data/lib/etassia/layout/architecture.rb +1472 -0
- data/lib/etassia/layout/base.rb +276 -0
- data/lib/etassia/layout/block.rb +738 -0
- data/lib/etassia/layout/c4.rb +876 -0
- data/lib/etassia/layout/c4_boundary_metrics.rb +35 -0
- data/lib/etassia/layout/c4_bounds.rb +106 -0
- data/lib/etassia/layout/c4_intersection.rb +77 -0
- data/lib/etassia/layout/c4_placement.rb +135 -0
- data/lib/etassia/layout/c4_shape_metrics.rb +97 -0
- data/lib/etassia/layout/c4_shape_outline.rb +67 -0
- data/lib/etassia/layout/c4_stereotype.rb +30 -0
- data/lib/etassia/layout/c4_text.rb +54 -0
- data/lib/etassia/layout/class_cell_placement.rb +148 -0
- data/lib/etassia/layout/class_diagram.rb +1116 -0
- data/lib/etassia/layout/class_diagram_namespaces.rb +26 -0
- data/lib/etassia/layout/class_diagram_notes.rb +26 -0
- data/lib/etassia/layout/class_name_advances.rb +31 -0
- data/lib/etassia/layout/class_namespace_box.rb +21 -0
- data/lib/etassia/layout/class_namespace_nodes.rb +197 -0
- data/lib/etassia/layout/class_namespace_placement.rb +71 -0
- data/lib/etassia/layout/class_note.rb +44 -0
- data/lib/etassia/layout/class_note_nodes.rb +84 -0
- data/lib/etassia/layout/elk_notices.rb +48 -0
- data/lib/etassia/layout/elk_placement.rb +197 -0
- data/lib/etassia/layout/er_diagram.rb +1002 -0
- data/lib/etassia/layout/er_diagram_adjacency.rb +20 -0
- data/lib/etassia/layout/er_diagram_alignment.rb +72 -0
- data/lib/etassia/layout/er_diagram_compaction.rb +85 -0
- data/lib/etassia/layout/er_diagram_conflicts.rb +70 -0
- data/lib/etassia/layout/er_diagram_coordinates.rb +104 -0
- data/lib/etassia/layout/er_diagram_entity_size.rb +82 -0
- data/lib/etassia/layout/er_diagram_layering.rb +109 -0
- data/lib/etassia/layout/er_diagram_ordering.rb +143 -0
- data/lib/etassia/layout/er_diagram_placement.rb +163 -0
- data/lib/etassia/layout/er_diagram_placement_node.rb +22 -0
- data/lib/etassia/layout/error.rb +133 -0
- data/lib/etassia/layout/flowchart/brandes_koepf.rb +208 -0
- data/lib/etassia/layout/flowchart/cluster_reach.rb +70 -0
- data/lib/etassia/layout/flowchart/component_packing.rb +129 -0
- data/lib/etassia/layout/flowchart/directed_placement.rb +428 -0
- data/lib/etassia/layout/flowchart/edge_chains.rb +111 -0
- data/lib/etassia/layout/flowchart/edge_order.rb +34 -0
- data/lib/etassia/layout/flowchart/edge_router.rb +533 -0
- data/lib/etassia/layout/flowchart/label_backdrop_geometry.rb +62 -0
- data/lib/etassia/layout/flowchart/layer_spacing.rb +85 -0
- data/lib/etassia/layout/flowchart/level_edges.rb +74 -0
- data/lib/etassia/layout/flowchart/level_frame.rb +47 -0
- data/lib/etassia/layout/flowchart/minimum_rank_spacing.rb +74 -0
- data/lib/etassia/layout/flowchart/row_centering.rb +229 -0
- data/lib/etassia/layout/flowchart.rb +1290 -0
- data/lib/etassia/layout/gantt.rb +814 -0
- data/lib/etassia/layout/gantt_duration.rb +49 -0
- data/lib/etassia/layout/gantt_exclusions.rb +74 -0
- data/lib/etassia/layout/gantt_ticks.rb +165 -0
- data/lib/etassia/layout/git_graph.rb +1075 -0
- data/lib/etassia/layout/grid.rb +165 -0
- data/lib/etassia/layout/info.rb +113 -0
- data/lib/etassia/layout/kanban.rb +452 -0
- data/lib/etassia/layout/kanban_card_text.rb +95 -0
- data/lib/etassia/layout/mindmap.rb +425 -0
- data/lib/etassia/layout/mindmap_cose.rb +81 -0
- data/lib/etassia/layout/mindmap_cose_body.rb +93 -0
- data/lib/etassia/layout/mindmap_cose_geometry.rb +190 -0
- data/lib/etassia/layout/mindmap_cose_grid.rb +96 -0
- data/lib/etassia/layout/mindmap_cose_link.rb +42 -0
- data/lib/etassia/layout/mindmap_cose_relaxation.rb +166 -0
- data/lib/etassia/layout/mindmap_cose_seed.rb +93 -0
- data/lib/etassia/layout/mindmap_cose_wedge.rb +37 -0
- data/lib/etassia/layout/mindmap_node_size.rb +130 -0
- data/lib/etassia/layout/packet.rb +285 -0
- data/lib/etassia/layout/pie.rb +305 -0
- data/lib/etassia/layout/pie_legend.rb +64 -0
- data/lib/etassia/layout/pie_legend_entry.rb +21 -0
- data/lib/etassia/layout/quadrant.rb +402 -0
- data/lib/etassia/layout/radar.rb +442 -0
- data/lib/etassia/layout/requirement.rb +765 -0
- data/lib/etassia/layout/sankey.rb +501 -0
- data/lib/etassia/layout/scene.rb +18 -0
- data/lib/etassia/layout/sequence/actor_gaps.rb +151 -0
- data/lib/etassia/layout/sequence/box_shape.rb +23 -0
- data/lib/etassia/layout/sequence/creations.rb +73 -0
- data/lib/etassia/layout/sequence/frame_divider.rb +22 -0
- data/lib/etassia/layout/sequence/frame_placement.rb +424 -0
- data/lib/etassia/layout/sequence/frame_reader.rb +75 -0
- data/lib/etassia/layout/sequence/frame_shape.rb +45 -0
- data/lib/etassia/layout/sequence/geometry.rb +24 -0
- data/lib/etassia/layout/sequence/message_rows.rb +165 -0
- data/lib/etassia/layout/sequence/note.rb +16 -0
- data/lib/etassia/layout/sequence/note_box.rb +114 -0
- data/lib/etassia/layout/sequence/note_placement.rb +223 -0
- data/lib/etassia/layout/sequence/text_width.rb +69 -0
- data/lib/etassia/layout/sequence/text_wrap.rb +93 -0
- data/lib/etassia/layout/sequence.rb +936 -0
- data/lib/etassia/layout/state_diagram.rb +1277 -0
- data/lib/etassia/layout/timeline.rb +165 -0
- data/lib/etassia/layout/timeline_card.rb +142 -0
- data/lib/etassia/layout/timeline_flow.rb +164 -0
- data/lib/etassia/layout/timeline_line.rb +33 -0
- data/lib/etassia/layout/timeline_rounding.rb +19 -0
- data/lib/etassia/layout/timeline_text.rb +105 -0
- data/lib/etassia/layout/treemap.rb +303 -0
- data/lib/etassia/layout/treemap_placement.rb +52 -0
- data/lib/etassia/layout/treemap_squarify.rb +108 -0
- data/lib/etassia/layout/user_journey.rb +300 -0
- data/lib/etassia/layout/user_journey_face.rb +33 -0
- data/lib/etassia/layout/user_journey_face_geometry.rb +80 -0
- data/lib/etassia/layout/user_journey_geometry.rb +336 -0
- data/lib/etassia/layout/user_journey_legend.rb +84 -0
- data/lib/etassia/layout/xy_chart.rb +620 -0
- data/lib/etassia/layout.rb +19 -0
- data/lib/etassia/lint_debt_scoreboard.rb +219 -0
- data/lib/etassia/markdown_text/emphasis_simulator.rb +373 -0
- data/lib/etassia/markdown_text.rb +393 -0
- data/lib/etassia/notation/builtin.rb +39 -0
- data/lib/etassia/notation/entry.rb +15 -0
- data/lib/etassia/notation/mermaid/class_diagram_config.rb +42 -0
- data/lib/etassia/notation/mermaid/git_graph_config.rb +46 -0
- data/lib/etassia/notation/mermaid/ir_adapter.rb +27 -0
- data/lib/etassia/notation/mermaid/ir_adapters/architecture.rb +196 -0
- data/lib/etassia/notation/mermaid/ir_adapters/block.rb +138 -0
- data/lib/etassia/notation/mermaid/ir_adapters/c4.rb +258 -0
- data/lib/etassia/notation/mermaid/ir_adapters/class_diagram.rb +257 -0
- data/lib/etassia/notation/mermaid/ir_adapters/er_diagram.rb +220 -0
- data/lib/etassia/notation/mermaid/ir_adapters/error.rb +32 -0
- data/lib/etassia/notation/mermaid/ir_adapters/flowchart.rb +208 -0
- data/lib/etassia/notation/mermaid/ir_adapters/gantt.rb +236 -0
- data/lib/etassia/notation/mermaid/ir_adapters/git_graph.rb +186 -0
- data/lib/etassia/notation/mermaid/ir_adapters/info.rb +34 -0
- data/lib/etassia/notation/mermaid/ir_adapters/kanban.rb +110 -0
- data/lib/etassia/notation/mermaid/ir_adapters/mindmap.rb +76 -0
- data/lib/etassia/notation/mermaid/ir_adapters/packet.rb +51 -0
- data/lib/etassia/notation/mermaid/ir_adapters/pie.rb +71 -0
- data/lib/etassia/notation/mermaid/ir_adapters/quadrant.rb +116 -0
- data/lib/etassia/notation/mermaid/ir_adapters/radar.rb +142 -0
- data/lib/etassia/notation/mermaid/ir_adapters/requirement.rb +237 -0
- data/lib/etassia/notation/mermaid/ir_adapters/sankey.rb +74 -0
- data/lib/etassia/notation/mermaid/ir_adapters/sequence.rb +304 -0
- data/lib/etassia/notation/mermaid/ir_adapters/state_diagram.rb +225 -0
- data/lib/etassia/notation/mermaid/ir_adapters/timeline.rb +93 -0
- data/lib/etassia/notation/mermaid/ir_adapters/treemap.rb +143 -0
- data/lib/etassia/notation/mermaid/ir_adapters/user_journey.rb +127 -0
- data/lib/etassia/notation/mermaid/ir_adapters/xychart.rb +131 -0
- data/lib/etassia/notation/mermaid.rb +399 -0
- data/lib/etassia/notation/parsed.rb +31 -0
- data/lib/etassia/notation/plantuml/activity/arrow_head.rb +45 -0
- data/lib/etassia/notation/plantuml/activity/arrow_style.rb +53 -0
- data/lib/etassia/notation/plantuml/activity/bar_columns.rb +75 -0
- data/lib/etassia/notation/plantuml/activity/box.rb +60 -0
- data/lib/etassia/notation/plantuml/activity/builder.rb +77 -0
- data/lib/etassia/notation/plantuml/activity/canvas.rb +117 -0
- data/lib/etassia/notation/plantuml/activity/column_centres.rb +151 -0
- data/lib/etassia/notation/plantuml/activity/columns.rb +224 -0
- data/lib/etassia/notation/plantuml/activity/diagram.rb +35 -0
- data/lib/etassia/notation/plantuml/activity/edge.rb +35 -0
- data/lib/etassia/notation/plantuml/activity/edge_marks.rb +68 -0
- data/lib/etassia/notation/plantuml/activity/exits.rb +61 -0
- data/lib/etassia/notation/plantuml/activity/frame_marks.rb +116 -0
- data/lib/etassia/notation/plantuml/activity/lane_steps.rb +82 -0
- data/lib/etassia/notation/plantuml/activity/lane_titles.rb +46 -0
- data/lib/etassia/notation/plantuml/activity/layout.rb +50 -0
- data/lib/etassia/notation/plantuml/activity/legacy_parser.rb +181 -0
- data/lib/etassia/notation/plantuml/activity/legacy_row_gaps.rb +65 -0
- data/lib/etassia/notation/plantuml/activity/mark.rb +23 -0
- data/lib/etassia/notation/plantuml/activity/marks.rb +62 -0
- data/lib/etassia/notation/plantuml/activity/metrics.rb +169 -0
- data/lib/etassia/notation/plantuml/activity/new_parser/blocks.rb +166 -0
- data/lib/etassia/notation/plantuml/activity/new_parser.rb +177 -0
- data/lib/etassia/notation/plantuml/activity/node.rb +50 -0
- data/lib/etassia/notation/plantuml/activity/node_marks.rb +174 -0
- data/lib/etassia/notation/plantuml/activity/note.rb +27 -0
- data/lib/etassia/notation/plantuml/activity/parser.rb +51 -0
- data/lib/etassia/notation/plantuml/activity/placement.rb +327 -0
- data/lib/etassia/notation/plantuml/activity/ranking.rb +142 -0
- data/lib/etassia/notation/plantuml/activity/reach.rb +58 -0
- data/lib/etassia/notation/plantuml/activity/renderer.rb +220 -0
- data/lib/etassia/notation/plantuml/activity/route.rb +22 -0
- data/lib/etassia/notation/plantuml/activity/router.rb +308 -0
- data/lib/etassia/notation/plantuml/activity/row_gaps.rb +105 -0
- data/lib/etassia/notation/plantuml/activity/row_spread.rb +59 -0
- data/lib/etassia/notation/plantuml/activity/scene.rb +20 -0
- data/lib/etassia/notation/plantuml/activity/text.rb +36 -0
- data/lib/etassia/notation/plantuml/activity.rb +50 -0
- data/lib/etassia/notation/plantuml/arrow.rb +135 -0
- data/lib/etassia/notation/plantuml/caption.rb +50 -0
- data/lib/etassia/notation/plantuml/caption_layout.rb +97 -0
- data/lib/etassia/notation/plantuml/caption_rows.rb +67 -0
- data/lib/etassia/notation/plantuml/class_header.rb +178 -0
- data/lib/etassia/notation/plantuml/class_name.rb +51 -0
- data/lib/etassia/notation/plantuml/component.rb +37 -0
- data/lib/etassia/notation/plantuml/creole.rb +278 -0
- data/lib/etassia/notation/plantuml/creole_icons.rb +33 -0
- data/lib/etassia/notation/plantuml/diagram.rb +60 -0
- data/lib/etassia/notation/plantuml/diagram_builder.rb +442 -0
- data/lib/etassia/notation/plantuml/diagram_name.rb +51 -0
- data/lib/etassia/notation/plantuml/directives.rb +33 -0
- data/lib/etassia/notation/plantuml/drawing/box.rb +28 -0
- data/lib/etassia/notation/plantuml/drawing/face.rb +39 -0
- data/lib/etassia/notation/plantuml/drawing/pen.rb +105 -0
- data/lib/etassia/notation/plantuml/drawing/renderer.rb +36 -0
- data/lib/etassia/notation/plantuml/drawing/scene.rb +28 -0
- data/lib/etassia/notation/plantuml/drawing.rb +19 -0
- data/lib/etassia/notation/plantuml/ebnf/blocks.rb +272 -0
- data/lib/etassia/notation/plantuml/ebnf/layout.rb +117 -0
- data/lib/etassia/notation/plantuml/ebnf/model.rb +22 -0
- data/lib/etassia/notation/plantuml/ebnf/reader.rb +131 -0
- data/lib/etassia/notation/plantuml/ebnf.rb +34 -0
- data/lib/etassia/notation/plantuml/end_texts.rb +78 -0
- data/lib/etassia/notation/plantuml/entity.rb +54 -0
- data/lib/etassia/notation/plantuml/further.rb +38 -0
- data/lib/etassia/notation/plantuml/gantt/layout.rb +269 -0
- data/lib/etassia/notation/plantuml/gantt/reader.rb +210 -0
- data/lib/etassia/notation/plantuml/gantt/renderer.rb +81 -0
- data/lib/etassia/notation/plantuml/gantt.rb +34 -0
- data/lib/etassia/notation/plantuml/include/blocks.rb +66 -0
- data/lib/etassia/notation/plantuml/include/finder.rb +61 -0
- data/lib/etassia/notation/plantuml/include.rb +78 -0
- data/lib/etassia/notation/plantuml/ir_adapter/annotations.rb +40 -0
- data/lib/etassia/notation/plantuml/ir_adapter/links.rb +91 -0
- data/lib/etassia/notation/plantuml/ir_adapter/sink.rb +49 -0
- data/lib/etassia/notation/plantuml/ir_adapter/structure.rb +86 -0
- data/lib/etassia/notation/plantuml/ir_adapter.rb +32 -0
- data/lib/etassia/notation/plantuml/ir_reader/annotations.rb +51 -0
- data/lib/etassia/notation/plantuml/ir_reader/index.rb +49 -0
- data/lib/etassia/notation/plantuml/ir_reader/links.rb +133 -0
- data/lib/etassia/notation/plantuml/ir_reader/structure.rb +83 -0
- data/lib/etassia/notation/plantuml/ir_reader.rb +42 -0
- data/lib/etassia/notation/plantuml/junction.rb +20 -0
- data/lib/etassia/notation/plantuml/klass.rb +41 -0
- data/lib/etassia/notation/plantuml/label_clearance.rb +67 -0
- data/lib/etassia/notation/plantuml/layout.rb +2806 -0
- data/lib/etassia/notation/plantuml/member.rb +37 -0
- data/lib/etassia/notation/plantuml/member_icon.rb +87 -0
- data/lib/etassia/notation/plantuml/member_icon_elements.rb +91 -0
- data/lib/etassia/notation/plantuml/member_pitch.rb +76 -0
- data/lib/etassia/notation/plantuml/member_rule.rb +48 -0
- data/lib/etassia/notation/plantuml/network/grid.rb +170 -0
- data/lib/etassia/notation/plantuml/network/layout.rb +158 -0
- data/lib/etassia/notation/plantuml/network/model.rb +22 -0
- data/lib/etassia/notation/plantuml/network/placement.rb +64 -0
- data/lib/etassia/notation/plantuml/network/reader.rb +126 -0
- data/lib/etassia/notation/plantuml/network/shapes.rb +109 -0
- data/lib/etassia/notation/plantuml/network.rb +37 -0
- data/lib/etassia/notation/plantuml/node_graph/archimate.rb +49 -0
- data/lib/etassia/notation/plantuml/node_graph/box_reader.rb +86 -0
- data/lib/etassia/notation/plantuml/node_graph/cloud.rb +73 -0
- data/lib/etassia/notation/plantuml/node_graph/crows_foot.rb +85 -0
- data/lib/etassia/notation/plantuml/node_graph/curve.rb +66 -0
- data/lib/etassia/notation/plantuml/node_graph/data_reader.rb +77 -0
- data/lib/etassia/notation/plantuml/node_graph/data_shape.rb +39 -0
- data/lib/etassia/notation/plantuml/node_graph/detour.rb +98 -0
- data/lib/etassia/notation/plantuml/node_graph/edge.rb +26 -0
- data/lib/etassia/notation/plantuml/node_graph/entity_metrics.rb +49 -0
- data/lib/etassia/notation/plantuml/node_graph/entity_reader.rb +65 -0
- data/lib/etassia/notation/plantuml/node_graph/entity_shape.rb +111 -0
- data/lib/etassia/notation/plantuml/node_graph/figures.rb +92 -0
- data/lib/etassia/notation/plantuml/node_graph/frame_ports.rb +73 -0
- data/lib/etassia/notation/plantuml/node_graph/graph.rb +40 -0
- data/lib/etassia/notation/plantuml/node_graph/heads.rb +89 -0
- data/lib/etassia/notation/plantuml/node_graph/label_fan.rb +76 -0
- data/lib/etassia/notation/plantuml/node_graph/label_placer.rb +310 -0
- data/lib/etassia/notation/plantuml/node_graph/label_waypoint.rb +47 -0
- data/lib/etassia/notation/plantuml/node_graph/layout.rb +293 -0
- data/lib/etassia/notation/plantuml/node_graph/link.rb +78 -0
- data/lib/etassia/notation/plantuml/node_graph/macros.rb +39 -0
- data/lib/etassia/notation/plantuml/node_graph/metrics.rb +113 -0
- data/lib/etassia/notation/plantuml/node_graph/node.rb +44 -0
- data/lib/etassia/notation/plantuml/node_graph/note_tail.rb +58 -0
- data/lib/etassia/notation/plantuml/node_graph/packer.rb +126 -0
- data/lib/etassia/notation/plantuml/node_graph/parser.rb +309 -0
- data/lib/etassia/notation/plantuml/node_graph/paths.rb +48 -0
- data/lib/etassia/notation/plantuml/node_graph/ranking.rb +231 -0
- data/lib/etassia/notation/plantuml/node_graph/reader.rb +53 -0
- data/lib/etassia/notation/plantuml/node_graph/references.rb +38 -0
- data/lib/etassia/notation/plantuml/node_graph/renderer.rb +160 -0
- data/lib/etassia/notation/plantuml/node_graph/scene.rb +22 -0
- data/lib/etassia/notation/plantuml/node_graph/shapes.rb +302 -0
- data/lib/etassia/notation/plantuml/node_graph/skipped_ranks.rb +61 -0
- data/lib/etassia/notation/plantuml/node_graph/tab.rb +68 -0
- data/lib/etassia/notation/plantuml/node_graph/usecase_ellipse.rb +100 -0
- data/lib/etassia/notation/plantuml/node_graph.rb +38 -0
- data/lib/etassia/notation/plantuml/note.rb +27 -0
- data/lib/etassia/notation/plantuml/note_layout.rb +257 -0
- data/lib/etassia/notation/plantuml/note_outline.rb +68 -0
- data/lib/etassia/notation/plantuml/objects/map_rows.rb +46 -0
- data/lib/etassia/notation/plantuml/objects/reader.rb +208 -0
- data/lib/etassia/notation/plantuml/objects.rb +39 -0
- data/lib/etassia/notation/plantuml/package.rb +45 -0
- data/lib/etassia/notation/plantuml/package_color.rb +32 -0
- data/lib/etassia/notation/plantuml/package_frames.rb +178 -0
- data/lib/etassia/notation/plantuml/parser.rb +622 -0
- data/lib/etassia/notation/plantuml/portion_visibility.rb +91 -0
- data/lib/etassia/notation/plantuml/qualified_association_layout.rb +332 -0
- data/lib/etassia/notation/plantuml/qualifier_box.rb +78 -0
- data/lib/etassia/notation/plantuml/rank_chain.rb +527 -0
- data/lib/etassia/notation/plantuml/rank_hierarchy.rb +347 -0
- data/lib/etassia/notation/plantuml/relation.rb +103 -0
- data/lib/etassia/notation/plantuml/relation_label_separator.rb +199 -0
- data/lib/etassia/notation/plantuml/relation_path_points.rb +84 -0
- data/lib/etassia/notation/plantuml/renderer.rb +490 -0
- data/lib/etassia/notation/plantuml/scene.rb +134 -0
- data/lib/etassia/notation/plantuml/segment_box.rb +85 -0
- data/lib/etassia/notation/plantuml/sequence/activation.rb +28 -0
- data/lib/etassia/notation/plantuml/sequence/appearance.rb +71 -0
- data/lib/etassia/notation/plantuml/sequence/arrow_end.rb +23 -0
- data/lib/etassia/notation/plantuml/sequence/arrow_marks.rb +111 -0
- data/lib/etassia/notation/plantuml/sequence/arrow_style.rb +42 -0
- data/lib/etassia/notation/plantuml/sequence/arrow_syntax.rb +122 -0
- data/lib/etassia/notation/plantuml/sequence/bar_tracker.rb +59 -0
- data/lib/etassia/notation/plantuml/sequence/box.rb +23 -0
- data/lib/etassia/notation/plantuml/sequence/chrome.rb +60 -0
- data/lib/etassia/notation/plantuml/sequence/chrome_rows.rb +184 -0
- data/lib/etassia/notation/plantuml/sequence/create.rb +34 -0
- data/lib/etassia/notation/plantuml/sequence/delay.rb +19 -0
- data/lib/etassia/notation/plantuml/sequence/destroy.rb +20 -0
- data/lib/etassia/notation/plantuml/sequence/diagram.rb +86 -0
- data/lib/etassia/notation/plantuml/sequence/divider.rb +19 -0
- data/lib/etassia/notation/plantuml/sequence/edge.rb +53 -0
- data/lib/etassia/notation/plantuml/sequence/embedded.rb +77 -0
- data/lib/etassia/notation/plantuml/sequence/fill.rb +56 -0
- data/lib/etassia/notation/plantuml/sequence/fragment.rb +28 -0
- data/lib/etassia/notation/plantuml/sequence/fragment_shape.rb +138 -0
- data/lib/etassia/notation/plantuml/sequence/head_style.rb +43 -0
- data/lib/etassia/notation/plantuml/sequence/ir_adapter/blocks.rb +73 -0
- data/lib/etassia/notation/plantuml/sequence/ir_adapter/fills.rb +24 -0
- data/lib/etassia/notation/plantuml/sequence/ir_adapter/items.rb +48 -0
- data/lib/etassia/notation/plantuml/sequence/ir_adapter/messages.rb +62 -0
- data/lib/etassia/notation/plantuml/sequence/ir_adapter/participants.rb +42 -0
- data/lib/etassia/notation/plantuml/sequence/ir_adapter/settings.rb +54 -0
- data/lib/etassia/notation/plantuml/sequence/ir_adapter.rb +38 -0
- data/lib/etassia/notation/plantuml/sequence/ir_reader/blocks.rb +77 -0
- data/lib/etassia/notation/plantuml/sequence/ir_reader/fills.rb +27 -0
- data/lib/etassia/notation/plantuml/sequence/ir_reader/index.rb +36 -0
- data/lib/etassia/notation/plantuml/sequence/ir_reader/items.rb +35 -0
- data/lib/etassia/notation/plantuml/sequence/ir_reader/messages.rb +70 -0
- data/lib/etassia/notation/plantuml/sequence/ir_reader/participants.rb +42 -0
- data/lib/etassia/notation/plantuml/sequence/ir_reader/settings.rb +74 -0
- data/lib/etassia/notation/plantuml/sequence/ir_reader.rb +38 -0
- data/lib/etassia/notation/plantuml/sequence/keyword_defaults.rb +28 -0
- data/lib/etassia/notation/plantuml/sequence/layout.rb +1567 -0
- data/lib/etassia/notation/plantuml/sequence/message.rb +97 -0
- data/lib/etassia/notation/plantuml/sequence/message_wrap.rb +77 -0
- data/lib/etassia/notation/plantuml/sequence/note.rb +61 -0
- data/lib/etassia/notation/plantuml/sequence/note_fill.rb +35 -0
- data/lib/etassia/notation/plantuml/sequence/note_geometry.rb +126 -0
- data/lib/etassia/notation/plantuml/sequence/note_shape.rb +51 -0
- data/lib/etassia/notation/plantuml/sequence/numbered_label.rb +57 -0
- data/lib/etassia/notation/plantuml/sequence/numbering.rb +49 -0
- data/lib/etassia/notation/plantuml/sequence/outline.rb +204 -0
- data/lib/etassia/notation/plantuml/sequence/page_break.rb +17 -0
- data/lib/etassia/notation/plantuml/sequence/paint.rb +79 -0
- data/lib/etassia/notation/plantuml/sequence/parallel_message.rb +19 -0
- data/lib/etassia/notation/plantuml/sequence/parser.rb +844 -0
- data/lib/etassia/notation/plantuml/sequence/participant.rb +27 -0
- data/lib/etassia/notation/plantuml/sequence/picture.rb +29 -0
- data/lib/etassia/notation/plantuml/sequence/ref.rb +24 -0
- data/lib/etassia/notation/plantuml/sequence/ref_shape.rb +74 -0
- data/lib/etassia/notation/plantuml/sequence/refusals.rb +47 -0
- data/lib/etassia/notation/plantuml/sequence/renderer.rb +501 -0
- data/lib/etassia/notation/plantuml/sequence/scene.rb +200 -0
- data/lib/etassia/notation/plantuml/sequence/skin.rb +76 -0
- data/lib/etassia/notation/plantuml/sequence/spacing.rb +28 -0
- data/lib/etassia/notation/plantuml/sequence/style.rb +151 -0
- data/lib/etassia/notation/plantuml/sequence/tab_size.rb +42 -0
- data/lib/etassia/notation/plantuml/sequence/walker.rb +1190 -0
- data/lib/etassia/notation/plantuml/sequence.rb +47 -0
- data/lib/etassia/notation/plantuml/source_lines.rb +33 -0
- data/lib/etassia/notation/plantuml/state/axis_solver.rb +272 -0
- data/lib/etassia/notation/plantuml/state/cluster_padding.rb +75 -0
- data/lib/etassia/notation/plantuml/state/curve.rb +73 -0
- data/lib/etassia/notation/plantuml/state/dot_axis.rb +248 -0
- data/lib/etassia/notation/plantuml/state/extent.rb +42 -0
- data/lib/etassia/notation/plantuml/state/hierarchy.rb +355 -0
- data/lib/etassia/notation/plantuml/state/label_clearance.rb +148 -0
- data/lib/etassia/notation/plantuml/state/label_reach.rb +139 -0
- data/lib/etassia/notation/plantuml/state/layout.rb +173 -0
- data/lib/etassia/notation/plantuml/state/level_edges.rb +113 -0
- data/lib/etassia/notation/plantuml/state/look.rb +36 -0
- data/lib/etassia/notation/plantuml/state/note_shape.rb +73 -0
- data/lib/etassia/notation/plantuml/state/plane.rb +85 -0
- data/lib/etassia/notation/plantuml/state/ranking.rb +181 -0
- data/lib/etassia/notation/plantuml/state/reader.rb +310 -0
- data/lib/etassia/notation/plantuml/state/renderer.rb +253 -0
- data/lib/etassia/notation/plantuml/state/route_detour.rb +115 -0
- data/lib/etassia/notation/plantuml/state/route_geometry.rb +186 -0
- data/lib/etassia/notation/plantuml/state/routes.rb +196 -0
- data/lib/etassia/notation/plantuml/state/row.rb +88 -0
- data/lib/etassia/notation/plantuml/state/rows.rb +50 -0
- data/lib/etassia/notation/plantuml/state/stretch.rb +71 -0
- data/lib/etassia/notation/plantuml/state.rb +62 -0
- data/lib/etassia/notation/plantuml/stereotype_head.rb +58 -0
- data/lib/etassia/notation/plantuml/style/bound.rb +34 -0
- data/lib/etassia/notation/plantuml/style/colour.rb +41 -0
- data/lib/etassia/notation/plantuml/style/colour_names.rb +89 -0
- data/lib/etassia/notation/plantuml/style/defaults.rb +33 -0
- data/lib/etassia/notation/plantuml/style/inline.rb +56 -0
- data/lib/etassia/notation/plantuml/style/reader.rb +242 -0
- data/lib/etassia/notation/plantuml/style/sheet.rb +103 -0
- data/lib/etassia/notation/plantuml/style.rb +32 -0
- data/lib/etassia/notation/plantuml/style_reader.rb +160 -0
- data/lib/etassia/notation/plantuml/style_sheet.rb +27 -0
- data/lib/etassia/notation/plantuml/styled_relation_curve.rb +71 -0
- data/lib/etassia/notation/plantuml/timing/arrows.rb +81 -0
- data/lib/etassia/notation/plantuml/timing/axis.rb +100 -0
- data/lib/etassia/notation/plantuml/timing/layout.rb +172 -0
- data/lib/etassia/notation/plantuml/timing/model.rb +34 -0
- data/lib/etassia/notation/plantuml/timing/reader.rb +173 -0
- data/lib/etassia/notation/plantuml/timing/signals.rb +328 -0
- data/lib/etassia/notation/plantuml/timing.rb +38 -0
- data/lib/etassia/notation/plantuml/tree/layout.rb +276 -0
- data/lib/etassia/notation/plantuml/tree/mindmap_layout.rb +157 -0
- data/lib/etassia/notation/plantuml/tree/reader.rb +186 -0
- data/lib/etassia/notation/plantuml/tree/renderer.rb +67 -0
- data/lib/etassia/notation/plantuml/tree/role.rb +57 -0
- data/lib/etassia/notation/plantuml/tree/rules.rb +156 -0
- data/lib/etassia/notation/plantuml/tree/wbs_layout.rb +164 -0
- data/lib/etassia/notation/plantuml/tree.rb +41 -0
- data/lib/etassia/notation/plantuml/unsupported_construct_error.rb +39 -0
- data/lib/etassia/notation/plantuml/unsupported_constructs.rb +103 -0
- data/lib/etassia/notation/plantuml/usecase.rb +36 -0
- data/lib/etassia/notation/plantuml.rb +132 -0
- data/lib/etassia/notation/plantuml_data/boxes/frames.rb +101 -0
- data/lib/etassia/notation/plantuml_data/boxes/graph_layout.rb +348 -0
- data/lib/etassia/notation/plantuml_data/boxes/heads.rb +65 -0
- data/lib/etassia/notation/plantuml_data/boxes/highlights.rb +70 -0
- data/lib/etassia/notation/plantuml_data/boxes/inline_rows.rb +99 -0
- data/lib/etassia/notation/plantuml_data/boxes/json_reader.rb +24 -0
- data/lib/etassia/notation/plantuml_data/boxes/link_text.rb +94 -0
- data/lib/etassia/notation/plantuml_data/boxes/marks.rb +76 -0
- data/lib/etassia/notation/plantuml_data/boxes/ornaments.rb +130 -0
- data/lib/etassia/notation/plantuml_data/boxes/renderer.rb +95 -0
- data/lib/etassia/notation/plantuml_data/boxes/row_alignment.rb +58 -0
- data/lib/etassia/notation/plantuml_data/boxes/row_bend.rb +43 -0
- data/lib/etassia/notation/plantuml_data/boxes/scene.rb +27 -0
- data/lib/etassia/notation/plantuml_data/boxes/table.rb +56 -0
- data/lib/etassia/notation/plantuml_data/boxes/table_box.rb +355 -0
- data/lib/etassia/notation/plantuml_data/boxes/text.rb +101 -0
- data/lib/etassia/notation/plantuml_data/boxes/tree_builder.rb +82 -0
- data/lib/etassia/notation/plantuml_data/boxes/tree_layout.rb +82 -0
- data/lib/etassia/notation/plantuml_data/boxes/yaml_reader.rb +105 -0
- data/lib/etassia/notation/plantuml_data/openiconic.LICENSE +6 -0
- data/lib/etassia/notation/plantuml_data/openiconic.json +1 -0
- data/lib/etassia/notation/plantuml_data.rb +84 -0
- data/lib/etassia/notation/plantuml_salt/block.rb +80 -0
- data/lib/etassia/notation/plantuml_salt/box.rb +30 -0
- data/lib/etassia/notation/plantuml_salt/font_metrics.rb +28 -0
- data/lib/etassia/notation/plantuml_salt/grid_marks.rb +66 -0
- data/lib/etassia/notation/plantuml_salt/group_marks.rb +77 -0
- data/lib/etassia/notation/plantuml_salt/layout.rb +206 -0
- data/lib/etassia/notation/plantuml_salt/mark.rb +36 -0
- data/lib/etassia/notation/plantuml_salt/markup.rb +57 -0
- data/lib/etassia/notation/plantuml_salt/parser.rb +239 -0
- data/lib/etassia/notation/plantuml_salt/renderer.rb +138 -0
- data/lib/etassia/notation/plantuml_salt/row.rb +19 -0
- data/lib/etassia/notation/plantuml_salt/run.rb +34 -0
- data/lib/etassia/notation/plantuml_salt/scene.rb +23 -0
- data/lib/etassia/notation/plantuml_salt/scroll_marks.rb +94 -0
- data/lib/etassia/notation/plantuml_salt/tab_marks.rb +74 -0
- data/lib/etassia/notation/plantuml_salt/tree_marks.rb +127 -0
- data/lib/etassia/notation/plantuml_salt/widget.rb +40 -0
- data/lib/etassia/notation/plantuml_salt/widget_marks.rb +319 -0
- data/lib/etassia/notation/plantuml_salt.rb +66 -0
- data/lib/etassia/notation/plugin_failure.rb +42 -0
- data/lib/etassia/notation.rb +289 -0
- data/lib/etassia/parser/architecture.rb +25 -0
- data/lib/etassia/parser/atoms/delimited_run.rb +82 -0
- data/lib/etassia/parser/atoms/greedy_run.rb +116 -0
- data/lib/etassia/parser/atoms/joined.rb +47 -0
- data/lib/etassia/parser/atoms/trimmed_run.rb +47 -0
- data/lib/etassia/parser/base.rb +258 -0
- data/lib/etassia/parser/block.rb +32 -0
- data/lib/etassia/parser/builders/architecture.rb +135 -0
- data/lib/etassia/parser/builders/block.rb +288 -0
- data/lib/etassia/parser/builders/c4.rb +275 -0
- data/lib/etassia/parser/builders/capture_string.rb +17 -0
- data/lib/etassia/parser/builders/class_diagram.rb +539 -0
- data/lib/etassia/parser/builders/er_diagram.rb +308 -0
- data/lib/etassia/parser/builders/error.rb +51 -0
- data/lib/etassia/parser/builders/flowchart.rb +1150 -0
- data/lib/etassia/parser/builders/gantt.rb +267 -0
- data/lib/etassia/parser/builders/git_graph.rb +301 -0
- data/lib/etassia/parser/builders/info.rb +57 -0
- data/lib/etassia/parser/builders/kanban.rb +411 -0
- data/lib/etassia/parser/builders/mindmap.rb +271 -0
- data/lib/etassia/parser/builders/packet.rb +85 -0
- data/lib/etassia/parser/builders/pie.rb +105 -0
- data/lib/etassia/parser/builders/quadrant.rb +165 -0
- data/lib/etassia/parser/builders/radar.rb +157 -0
- data/lib/etassia/parser/builders/requirement.rb +230 -0
- data/lib/etassia/parser/builders/sankey.rb +142 -0
- data/lib/etassia/parser/builders/sequence.rb +431 -0
- data/lib/etassia/parser/builders/sequence_blocks.rb +117 -0
- data/lib/etassia/parser/builders/sequence_box_title.rb +57 -0
- data/lib/etassia/parser/builders/state_diagram.rb +364 -0
- data/lib/etassia/parser/builders/timeline.rb +133 -0
- data/lib/etassia/parser/builders/treemap.rb +138 -0
- data/lib/etassia/parser/builders/xy_chart.rb +148 -0
- data/lib/etassia/parser/c4.rb +37 -0
- data/lib/etassia/parser/class_diagram.rb +58 -0
- data/lib/etassia/parser/class_namespaces.rb +62 -0
- data/lib/etassia/parser/class_notes.rb +54 -0
- data/lib/etassia/parser/er_diagram.rb +28 -0
- data/lib/etassia/parser/error.rb +30 -0
- data/lib/etassia/parser/flowchart.rb +87 -0
- data/lib/etassia/parser/gantt.rb +43 -0
- data/lib/etassia/parser/git_graph.rb +106 -0
- data/lib/etassia/parser/grammars/architecture.rb +165 -0
- data/lib/etassia/parser/grammars/block.rb +190 -0
- data/lib/etassia/parser/grammars/c4.rb +229 -0
- data/lib/etassia/parser/grammars/class_diagram.rb +606 -0
- data/lib/etassia/parser/grammars/common.rb +107 -0
- data/lib/etassia/parser/grammars/er_diagram.rb +232 -0
- data/lib/etassia/parser/grammars/error.rb +32 -0
- data/lib/etassia/parser/grammars/flowchart.rb +1722 -0
- data/lib/etassia/parser/grammars/gantt.rb +198 -0
- data/lib/etassia/parser/grammars/git_graph.rb +234 -0
- data/lib/etassia/parser/grammars/info.rb +53 -0
- data/lib/etassia/parser/grammars/kanban.rb +417 -0
- data/lib/etassia/parser/grammars/mermaid_unicode_text.rb +108 -0
- data/lib/etassia/parser/grammars/mindmap.rb +220 -0
- data/lib/etassia/parser/grammars/packet.rb +71 -0
- data/lib/etassia/parser/grammars/pie.rb +128 -0
- data/lib/etassia/parser/grammars/quadrant.rb +202 -0
- data/lib/etassia/parser/grammars/radar.rb +158 -0
- data/lib/etassia/parser/grammars/requirement.rb +258 -0
- data/lib/etassia/parser/grammars/sankey.rb +104 -0
- data/lib/etassia/parser/grammars/sequence.rb +940 -0
- data/lib/etassia/parser/grammars/state_diagram.rb +382 -0
- data/lib/etassia/parser/grammars/timeline.rb +153 -0
- data/lib/etassia/parser/grammars/treemap.rb +122 -0
- data/lib/etassia/parser/grammars/xy_chart.rb +119 -0
- data/lib/etassia/parser/info.rb +32 -0
- data/lib/etassia/parser/kanban.rb +131 -0
- data/lib/etassia/parser/mermaid_shapes.rb +106 -0
- data/lib/etassia/parser/metadata_yaml.rb +452 -0
- data/lib/etassia/parser/mindmap.rb +92 -0
- data/lib/etassia/parser/native/builders/architecture.rb +103 -0
- data/lib/etassia/parser/native/builders/block.rb +68 -0
- data/lib/etassia/parser/native/builders/c4.rb +16 -0
- data/lib/etassia/parser/native/builders/class_diagram.rb +63 -0
- data/lib/etassia/parser/native/builders/er_diagram.rb +47 -0
- data/lib/etassia/parser/native/builders/flowchart.rb +58 -0
- data/lib/etassia/parser/native/builders/gantt.rb +35 -0
- data/lib/etassia/parser/native/builders/gitgraph.rb +35 -0
- data/lib/etassia/parser/native/builders/info.rb +30 -0
- data/lib/etassia/parser/native/builders/kanban.rb +37 -0
- data/lib/etassia/parser/native/builders/mindmap.rb +26 -0
- data/lib/etassia/parser/native/builders/packet.rb +63 -0
- data/lib/etassia/parser/native/builders/pie.rb +82 -0
- data/lib/etassia/parser/native/builders/quadrant.rb +27 -0
- data/lib/etassia/parser/native/builders/radar.rb +84 -0
- data/lib/etassia/parser/native/builders/requirement.rb +25 -0
- data/lib/etassia/parser/native/builders/sankey.rb +18 -0
- data/lib/etassia/parser/native/builders/sequence.rb +48 -0
- data/lib/etassia/parser/native/builders/state_diagram.rb +61 -0
- data/lib/etassia/parser/native/builders/timeline.rb +46 -0
- data/lib/etassia/parser/native/builders/treemap.rb +60 -0
- data/lib/etassia/parser/native/builders/user_journey.rb +83 -0
- data/lib/etassia/parser/native/builders/xy_chart.rb +94 -0
- data/lib/etassia/parser/native/declined.rb +12 -0
- data/lib/etassia/parser/native/mermaid.json +1 -0
- data/lib/etassia/parser/native/text.rb +31 -0
- data/lib/etassia/parser/native.rb +99 -0
- data/lib/etassia/parser/packet.rb +56 -0
- data/lib/etassia/parser/pie.rb +32 -0
- data/lib/etassia/parser/quadrant.rb +77 -0
- data/lib/etassia/parser/radar.rb +99 -0
- data/lib/etassia/parser/requirement.rb +32 -0
- data/lib/etassia/parser/sankey.rb +47 -0
- data/lib/etassia/parser/sequence.rb +34 -0
- data/lib/etassia/parser/state_diagram.rb +29 -0
- data/lib/etassia/parser/timeline.rb +40 -0
- data/lib/etassia/parser/treemap.rb +25 -0
- data/lib/etassia/parser/user_journey.rb +253 -0
- data/lib/etassia/parser/xy_chart.rb +98 -0
- data/lib/etassia/parser.rb +18 -0
- data/lib/etassia/renderer/architecture.rb +232 -0
- data/lib/etassia/renderer/architecture_edge_router.rb +379 -0
- data/lib/etassia/renderer/base.rb +295 -0
- data/lib/etassia/renderer/block.rb +157 -0
- data/lib/etassia/renderer/c4.rb +294 -0
- data/lib/etassia/renderer/class_diagram.rb +671 -0
- data/lib/etassia/renderer/er_diagram.rb +842 -0
- data/lib/etassia/renderer/error.rb +131 -0
- data/lib/etassia/renderer/flowchart.rb +315 -0
- data/lib/etassia/renderer/gantt.rb +177 -0
- data/lib/etassia/renderer/git_graph.rb +224 -0
- data/lib/etassia/renderer/info.rb +59 -0
- data/lib/etassia/renderer/kanban.rb +157 -0
- data/lib/etassia/renderer/line_break_text.rb +56 -0
- data/lib/etassia/renderer/markdown_text.rb +106 -0
- data/lib/etassia/renderer/mindmap.rb +290 -0
- data/lib/etassia/renderer/packet.rb +87 -0
- data/lib/etassia/renderer/pie.rb +113 -0
- data/lib/etassia/renderer/quadrant.rb +189 -0
- data/lib/etassia/renderer/radar.rb +191 -0
- data/lib/etassia/renderer/requirement.rb +209 -0
- data/lib/etassia/renderer/sankey.rb +114 -0
- data/lib/etassia/renderer/sequence/frame_drawing.rb +169 -0
- data/lib/etassia/renderer/sequence/note_drawing.rb +69 -0
- data/lib/etassia/renderer/sequence.rb +490 -0
- data/lib/etassia/renderer/state_diagram.rb +202 -0
- data/lib/etassia/renderer/timeline.rb +134 -0
- data/lib/etassia/renderer/timeline_palette.rb +18 -0
- data/lib/etassia/renderer/treemap/section_total.rb +33 -0
- data/lib/etassia/renderer/treemap.rb +128 -0
- data/lib/etassia/renderer/user_journey.rb +209 -0
- data/lib/etassia/renderer/xy_chart.rb +180 -0
- data/lib/etassia/renderer.rb +22 -0
- data/lib/etassia/runtime.rb +125 -0
- data/lib/etassia/source/frontmatter.rb +501 -0
- data/lib/etassia/source.rb +224 -0
- data/lib/etassia/svg/arrowhead.rb +205 -0
- data/lib/etassia/svg/circle.rb +19 -0
- data/lib/etassia/svg/document.rb +106 -0
- data/lib/etassia/svg/element.rb +209 -0
- data/lib/etassia/svg/ellipse.rb +23 -0
- data/lib/etassia/svg/escaping.rb +149 -0
- data/lib/etassia/svg/group.rb +64 -0
- data/lib/etassia/svg/line.rb +21 -0
- data/lib/etassia/svg/numbers.rb +53 -0
- data/lib/etassia/svg/path.rb +67 -0
- data/lib/etassia/svg/path_geometry.rb +378 -0
- data/lib/etassia/svg/polygon.rb +25 -0
- data/lib/etassia/svg/polyline.rb +28 -0
- data/lib/etassia/svg/rect.rb +34 -0
- data/lib/etassia/svg/style.rb +50 -0
- data/lib/etassia/svg/text.rb +181 -0
- data/lib/etassia/svg/tspan.rb +48 -0
- data/lib/etassia/svg.rb +38 -0
- data/lib/etassia/text_measurement/arial_advances.rb +122 -0
- data/lib/etassia/text_measurement/dejavu_advances.rb +111 -0
- data/lib/etassia/text_measurement/times_advances.rb +64 -0
- data/lib/etassia/text_measurement/trebuchet_advances.rb +53 -0
- data/lib/etassia/text_measurement/trebuchet_kerning.rb +29 -0
- data/lib/etassia/text_measurement.rb +198 -0
- data/lib/etassia/theme/builtin/dark.yml +229 -0
- data/lib/etassia/theme/builtin/default.yml +239 -0
- data/lib/etassia/theme/builtin/high_contrast.yml +231 -0
- data/lib/etassia/theme/builtin/light.yml +229 -0
- data/lib/etassia/theme/color_palette.rb +97 -0
- data/lib/etassia/theme/completion.rb +50 -0
- data/lib/etassia/theme/effect_styles.rb +34 -0
- data/lib/etassia/theme/registry.rb +45 -0
- data/lib/etassia/theme/shape_styles.rb +34 -0
- data/lib/etassia/theme/spacing_config.rb +30 -0
- data/lib/etassia/theme/typography.rb +40 -0
- data/lib/etassia/theme.rb +73 -0
- data/lib/etassia/version.rb +5 -0
- data/lib/etassia.rb +40 -0
- metadata +865 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "lutaml/model"
|
|
4
|
+
require_relative "base"
|
|
5
|
+
require_relative "containment"
|
|
6
|
+
|
|
7
|
+
module Etassia
|
|
8
|
+
module Diagram
|
|
9
|
+
# Architecture diagram model representing system architecture visualization
|
|
10
|
+
class Architecture < Base
|
|
11
|
+
# Group (boundary) in architecture diagram
|
|
12
|
+
class Group < Lutaml::Model::Serializable
|
|
13
|
+
attribute :id, :string
|
|
14
|
+
attribute :label, :string
|
|
15
|
+
attribute :icon, :string
|
|
16
|
+
attribute :parent_id, :string
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Service/component in architecture diagram
|
|
20
|
+
class Service < Lutaml::Model::Serializable
|
|
21
|
+
attribute :id, :string
|
|
22
|
+
attribute :label, :string
|
|
23
|
+
attribute :icon, :string
|
|
24
|
+
attribute :group_id, :string
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Junction (routing point) in architecture diagram. Carries no icon
|
|
28
|
+
# or label - it exists only so edges can bend between services.
|
|
29
|
+
class Junction < Lutaml::Model::Serializable
|
|
30
|
+
attribute :id, :string
|
|
31
|
+
attribute :group_id, :string
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Edge (relationship) between services
|
|
35
|
+
class Edge < Lutaml::Model::Serializable
|
|
36
|
+
attribute :from_id, :string
|
|
37
|
+
attribute :to_id, :string
|
|
38
|
+
attribute :from_position, :string
|
|
39
|
+
attribute :to_position, :string
|
|
40
|
+
attribute :label, :string
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
attribute :title, :string
|
|
44
|
+
attribute :acc_title, :string
|
|
45
|
+
attribute :acc_descr, :string
|
|
46
|
+
attribute :groups, Group, collection: true, default: -> { [] }
|
|
47
|
+
attribute :services, Service, collection: true, default: -> { [] }
|
|
48
|
+
attribute :junctions, Junction, collection: true, default: -> { [] }
|
|
49
|
+
attribute :edges, Edge, collection: true, default: -> { [] }
|
|
50
|
+
|
|
51
|
+
# Returns the diagram type identifier.
|
|
52
|
+
#
|
|
53
|
+
# @return [Symbol] :architecture
|
|
54
|
+
def diagram_type
|
|
55
|
+
:architecture
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# A group cannot be its own ancestor, and every group_id a service,
|
|
59
|
+
# junction, or another group's parent_id names must belong to a
|
|
60
|
+
# declared group. Neither the grammar nor the parser refuses either
|
|
61
|
+
# shape. Left unchecked, a parent_id cycle poisons
|
|
62
|
+
# Architecture's bounding-box arithmetic with
|
|
63
|
+
# Infinity/-Infinity that later NaNs a comparison, and an undeclared
|
|
64
|
+
# group_id is silently dropped from the render along with whatever
|
|
65
|
+
# was placed in it — this stops both at the door instead.
|
|
66
|
+
#
|
|
67
|
+
# @return [Boolean] true if the diagram is valid
|
|
68
|
+
def valid?
|
|
69
|
+
return false if group_parent_cycle?
|
|
70
|
+
return false unless group_references_resolve?
|
|
71
|
+
|
|
72
|
+
true
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
private
|
|
76
|
+
|
|
77
|
+
# Mirrors Flowchart#parent_cycle? — a group is its own ancestor.
|
|
78
|
+
#
|
|
79
|
+
# @return [Boolean] true when some group is its own ancestor
|
|
80
|
+
def group_parent_cycle?
|
|
81
|
+
graph = groups.each_with_object({}) do |group, acc|
|
|
82
|
+
next if group.parent_id.nil?
|
|
83
|
+
|
|
84
|
+
acc[group.id] = acc.fetch(group.id, []) | [group.parent_id]
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
!Containment.looping_pair(graph).nil?
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# @return [Boolean] true when every parent_id and group_id names a
|
|
91
|
+
# group actually declared in the diagram
|
|
92
|
+
def group_references_resolve?
|
|
93
|
+
known = groups.map(&:id)
|
|
94
|
+
|
|
95
|
+
references_resolve?(groups, :parent_id, known) &&
|
|
96
|
+
references_resolve?(services, :group_id, known) &&
|
|
97
|
+
references_resolve?(junctions, :group_id, known)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def references_resolve?(items, attribute, known)
|
|
101
|
+
items.all? do |item|
|
|
102
|
+
reference = item.public_send(attribute)
|
|
103
|
+
reference.nil? || known.include?(reference)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "lutaml/model"
|
|
4
|
+
|
|
5
|
+
module Etassia
|
|
6
|
+
module Diagram
|
|
7
|
+
# Abstract base class for all diagram models.
|
|
8
|
+
#
|
|
9
|
+
# This class provides common attributes and functionality shared across
|
|
10
|
+
# all diagram types. Specific diagram types (Flowchart, Sequence, etc.)
|
|
11
|
+
# inherit from this base and add their type-specific attributes.
|
|
12
|
+
#
|
|
13
|
+
# All diagram models use Lutaml::Model for serialization support.
|
|
14
|
+
#
|
|
15
|
+
# @example Define a custom diagram type
|
|
16
|
+
# class Flowchart < Diagram::Base
|
|
17
|
+
# attribute :nodes, :array
|
|
18
|
+
# attribute :edges, :array
|
|
19
|
+
# end
|
|
20
|
+
#
|
|
21
|
+
# @abstract Subclass and add diagram-specific attributes
|
|
22
|
+
class Base < Lutaml::Model::Serializable
|
|
23
|
+
# Unique identifier for the diagram
|
|
24
|
+
attribute :id, :string
|
|
25
|
+
|
|
26
|
+
# Optional title for the diagram
|
|
27
|
+
attribute :title, :string
|
|
28
|
+
|
|
29
|
+
# Direction or orientation of the diagram
|
|
30
|
+
# (e.g., 'TB' for top-to-bottom, 'LR' for left-to-right)
|
|
31
|
+
attribute :direction, :string
|
|
32
|
+
|
|
33
|
+
# Optional theme or style configuration
|
|
34
|
+
attribute :theme, :string
|
|
35
|
+
|
|
36
|
+
# Validates that required diagram structure is present.
|
|
37
|
+
#
|
|
38
|
+
# This method should be overridden by subclasses to implement
|
|
39
|
+
# diagram-specific validation logic.
|
|
40
|
+
#
|
|
41
|
+
# @return [Boolean] true if diagram is valid
|
|
42
|
+
# @raise [NotImplementedError] if not implemented by subclass
|
|
43
|
+
def valid?
|
|
44
|
+
raise NotImplementedError,
|
|
45
|
+
"#{self.class} must implement #valid?"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Returns the diagram type identifier.
|
|
49
|
+
#
|
|
50
|
+
# This method should be overridden by subclasses to return their
|
|
51
|
+
# specific diagram type.
|
|
52
|
+
#
|
|
53
|
+
# @return [Symbol] the diagram type identifier
|
|
54
|
+
# @raise [NotImplementedError] if not implemented by subclass
|
|
55
|
+
def diagram_type
|
|
56
|
+
raise NotImplementedError,
|
|
57
|
+
"#{self.class} must implement #diagram_type"
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "lutaml/model"
|
|
4
|
+
require_relative "base"
|
|
5
|
+
|
|
6
|
+
module Etassia
|
|
7
|
+
module Diagram
|
|
8
|
+
# Represents a block in the diagram
|
|
9
|
+
class BlockNode < Lutaml::Model::Serializable
|
|
10
|
+
attribute :id, :string
|
|
11
|
+
attribute :label, :string
|
|
12
|
+
attribute :width, :integer, default: -> { 1 }
|
|
13
|
+
attribute :shape, :string, default: -> { "rect" }
|
|
14
|
+
attribute :children, BlockNode, collection: true, default: -> { [] }
|
|
15
|
+
attribute :block_type, :string # "block", "space", "arrow"
|
|
16
|
+
# Arrow block directions: "up", "down", "left", or "right".
|
|
17
|
+
attribute :direction, :string
|
|
18
|
+
attribute :is_compound, :boolean, default: -> { false }
|
|
19
|
+
|
|
20
|
+
def compound?
|
|
21
|
+
is_compound
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def space?
|
|
25
|
+
block_type == "space"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def arrow?
|
|
29
|
+
block_type == "arrow"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def add_child(child)
|
|
33
|
+
children << child
|
|
34
|
+
self.is_compound = true
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Represents a connection between blocks
|
|
39
|
+
class BlockConnection < Lutaml::Model::Serializable
|
|
40
|
+
attribute :from, :string
|
|
41
|
+
attribute :to, :string
|
|
42
|
+
attribute :connection_type, :string # "arrow" or "line"
|
|
43
|
+
attribute :label, :string
|
|
44
|
+
|
|
45
|
+
def arrow?
|
|
46
|
+
connection_type == "arrow"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def line?
|
|
50
|
+
connection_type == "line"
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Represents styling for a block
|
|
55
|
+
class BlockStyle < Lutaml::Model::Serializable
|
|
56
|
+
attribute :block_id, :string
|
|
57
|
+
attribute :fill, :string
|
|
58
|
+
attribute :stroke, :string
|
|
59
|
+
attribute :stroke_width, :string
|
|
60
|
+
attribute :properties, :string, collection: true, default: -> { [] }
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Represents a Mermaid block diagram
|
|
64
|
+
class Block < Base
|
|
65
|
+
attribute :columns, :integer
|
|
66
|
+
attribute :blocks, BlockNode, collection: true, default: -> { [] }
|
|
67
|
+
attribute :connections,
|
|
68
|
+
BlockConnection,
|
|
69
|
+
collection: true,
|
|
70
|
+
default: -> { [] }
|
|
71
|
+
attribute :styles, BlockStyle, collection: true, default: -> { [] }
|
|
72
|
+
|
|
73
|
+
def add_block(block)
|
|
74
|
+
blocks << block
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def add_connection(connection)
|
|
78
|
+
connections << connection
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def add_style(style)
|
|
82
|
+
styles << style
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Returns the diagram type identifier.
|
|
86
|
+
#
|
|
87
|
+
# @return [Symbol] :block
|
|
88
|
+
def diagram_type
|
|
89
|
+
:block
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Block diagrams have no validation rules yet. See
|
|
93
|
+
# TODO.foundation's corpus burndown for real validation; this is
|
|
94
|
+
# deliberately trivial.
|
|
95
|
+
#
|
|
96
|
+
# @return [Boolean] true
|
|
97
|
+
def valid?
|
|
98
|
+
true
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "lutaml/model"
|
|
4
|
+
require_relative "base"
|
|
5
|
+
|
|
6
|
+
module Etassia
|
|
7
|
+
module Diagram
|
|
8
|
+
# Represents a C4 element (Person, System, Container, Component).
|
|
9
|
+
#
|
|
10
|
+
# Elements are the nodes in C4 diagrams representing various architectural
|
|
11
|
+
# entities like people, systems, containers, and components.
|
|
12
|
+
class C4Element < Lutaml::Model::Serializable
|
|
13
|
+
# Unique identifier for the element
|
|
14
|
+
attribute :id, :string
|
|
15
|
+
|
|
16
|
+
# Display label
|
|
17
|
+
attribute :label, :string
|
|
18
|
+
|
|
19
|
+
# Element type: Person, Person_Ext, System, System_Ext, SystemDb,
|
|
20
|
+
# SystemDb_Ext, SystemQueue, SystemQueue_Ext, Container, ContainerDb,
|
|
21
|
+
# ContainerQueue, Component
|
|
22
|
+
attribute :element_type, :string
|
|
23
|
+
|
|
24
|
+
# Description text
|
|
25
|
+
attribute :description, :string
|
|
26
|
+
|
|
27
|
+
# Technology stack (for Containers and Components)
|
|
28
|
+
attribute :technology, :string
|
|
29
|
+
|
|
30
|
+
# Sprite icon name
|
|
31
|
+
attribute :sprite, :string
|
|
32
|
+
|
|
33
|
+
# Link URL
|
|
34
|
+
attribute :link, :string
|
|
35
|
+
|
|
36
|
+
# Tags (comma-separated)
|
|
37
|
+
attribute :tags, :string
|
|
38
|
+
|
|
39
|
+
# Whether element is external (_Ext suffix)
|
|
40
|
+
attribute :external, :boolean, default: -> { false }
|
|
41
|
+
|
|
42
|
+
# Parent boundary ID (if nested)
|
|
43
|
+
attribute :boundary_id, :string
|
|
44
|
+
|
|
45
|
+
# Validates the element has required attributes.
|
|
46
|
+
#
|
|
47
|
+
# @return [Boolean] true if element is valid
|
|
48
|
+
def valid?
|
|
49
|
+
[id, label].all? { |value| value && !value.empty? } &&
|
|
50
|
+
!element_type.nil?
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Returns base type without _Ext suffix
|
|
54
|
+
#
|
|
55
|
+
# @return [String] base element type
|
|
56
|
+
def base_type
|
|
57
|
+
element_type&.gsub(/_Ext$/, "") || element_type
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Check if element is a person
|
|
61
|
+
#
|
|
62
|
+
# @return [Boolean] true if person
|
|
63
|
+
def person?
|
|
64
|
+
base_type == "Person"
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Check if element is a system
|
|
68
|
+
#
|
|
69
|
+
# @return [Boolean] true if system
|
|
70
|
+
def system?
|
|
71
|
+
%w[System SystemDb SystemQueue].include?(base_type)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Check if element is a container
|
|
75
|
+
#
|
|
76
|
+
# @return [Boolean] true if container
|
|
77
|
+
def container?
|
|
78
|
+
%w[Container ContainerDb ContainerQueue].include?(base_type)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Check if element is a component
|
|
82
|
+
#
|
|
83
|
+
# @return [Boolean] true if component
|
|
84
|
+
def component?
|
|
85
|
+
base_type == "Component"
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Represents a C4 relationship between elements.
|
|
90
|
+
#
|
|
91
|
+
# Relationships show interactions or dependencies between architectural
|
|
92
|
+
# elements.
|
|
93
|
+
class C4Relationship < Lutaml::Model::Serializable
|
|
94
|
+
# Source element identifier
|
|
95
|
+
attribute :from_id, :string
|
|
96
|
+
|
|
97
|
+
# Target element identifier
|
|
98
|
+
attribute :to_id, :string
|
|
99
|
+
|
|
100
|
+
# Relationship label
|
|
101
|
+
attribute :label, :string
|
|
102
|
+
|
|
103
|
+
# Technology used in relationship
|
|
104
|
+
attribute :technology, :string
|
|
105
|
+
|
|
106
|
+
# Relationship type: Rel, BiRel
|
|
107
|
+
attribute :rel_type, :string
|
|
108
|
+
|
|
109
|
+
# Initialize with default type
|
|
110
|
+
def initialize(*args)
|
|
111
|
+
super
|
|
112
|
+
self.rel_type ||= "Rel"
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Validates the relationship has required attributes.
|
|
116
|
+
#
|
|
117
|
+
# @return [Boolean] true if relationship is valid
|
|
118
|
+
def valid?
|
|
119
|
+
!from_id.nil? && !from_id.empty? &&
|
|
120
|
+
!to_id.nil? && !to_id.empty?
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# Check if bidirectional relationship
|
|
124
|
+
#
|
|
125
|
+
# @return [Boolean] true if bidirectional
|
|
126
|
+
def bidirectional?
|
|
127
|
+
rel_type == "BiRel"
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# Represents a C4 boundary grouping.
|
|
132
|
+
#
|
|
133
|
+
# Boundaries group related elements together, representing enterprise
|
|
134
|
+
# boundaries, system boundaries, or custom boundaries.
|
|
135
|
+
class C4Boundary < Lutaml::Model::Serializable
|
|
136
|
+
# Unique identifier for the boundary
|
|
137
|
+
attribute :id, :string
|
|
138
|
+
|
|
139
|
+
# Display label
|
|
140
|
+
attribute :label, :string
|
|
141
|
+
|
|
142
|
+
# Boundary type: Enterprise_Boundary, System_Boundary, Boundary
|
|
143
|
+
attribute :boundary_type, :string
|
|
144
|
+
|
|
145
|
+
# Additional type parameter (for generic Boundary)
|
|
146
|
+
attribute :type_param, :string
|
|
147
|
+
|
|
148
|
+
# Link URL
|
|
149
|
+
attribute :link, :string
|
|
150
|
+
|
|
151
|
+
# Tags (comma-separated)
|
|
152
|
+
attribute :tags, :string
|
|
153
|
+
|
|
154
|
+
# Nested elements (element IDs)
|
|
155
|
+
attribute :element_ids, :string, collection: true, default: -> { [] }
|
|
156
|
+
|
|
157
|
+
# Nested boundaries (boundary IDs)
|
|
158
|
+
attribute :boundary_ids, :string, collection: true, default: -> { [] }
|
|
159
|
+
|
|
160
|
+
# Parent boundary ID (if nested)
|
|
161
|
+
attribute :parent_id, :string
|
|
162
|
+
|
|
163
|
+
# Initialize with default type
|
|
164
|
+
def initialize(*args)
|
|
165
|
+
super
|
|
166
|
+
self.boundary_type ||= "Boundary"
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
# Validates the boundary has required attributes.
|
|
170
|
+
#
|
|
171
|
+
# @return [Boolean] true if boundary is valid
|
|
172
|
+
def valid?
|
|
173
|
+
!id.nil? && !id.empty? &&
|
|
174
|
+
!label.nil? && !label.empty?
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
# Check if enterprise boundary
|
|
178
|
+
#
|
|
179
|
+
# @return [Boolean] true if enterprise boundary
|
|
180
|
+
def enterprise?
|
|
181
|
+
boundary_type == "Enterprise_Boundary"
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
# Check if system boundary
|
|
185
|
+
#
|
|
186
|
+
# @return [Boolean] true if system boundary
|
|
187
|
+
def system?
|
|
188
|
+
boundary_type == "System_Boundary"
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
# C4 diagram model.
|
|
193
|
+
#
|
|
194
|
+
# Represents a complete C4 diagram showing software architecture at
|
|
195
|
+
# different levels of abstraction: Context, Container, Component, or Code.
|
|
196
|
+
#
|
|
197
|
+
# @example Creating a C4 Context diagram
|
|
198
|
+
# c4 = C4.new(level: 'Context')
|
|
199
|
+
# c4.title = 'System Context diagram'
|
|
200
|
+
# c4.elements << C4Element.new(
|
|
201
|
+
# id: 'customer',
|
|
202
|
+
# label: 'Customer',
|
|
203
|
+
# element_type: 'Person',
|
|
204
|
+
# description: 'A user of the system'
|
|
205
|
+
# )
|
|
206
|
+
# c4.elements << C4Element.new(
|
|
207
|
+
# id: 'system',
|
|
208
|
+
# label: 'Banking System',
|
|
209
|
+
# element_type: 'System',
|
|
210
|
+
# description: 'Main banking application'
|
|
211
|
+
# )
|
|
212
|
+
# c4.relationships << C4Relationship.new(
|
|
213
|
+
# from_id: 'customer',
|
|
214
|
+
# to_id: 'system',
|
|
215
|
+
# label: 'Uses'
|
|
216
|
+
# )
|
|
217
|
+
class C4 < Base
|
|
218
|
+
# C4 level: Context, Container, Component, Dynamic, Deployment
|
|
219
|
+
attribute :level, :string
|
|
220
|
+
|
|
221
|
+
# Diagram title
|
|
222
|
+
attribute :title, :string
|
|
223
|
+
|
|
224
|
+
# Collection of elements
|
|
225
|
+
attribute :elements, C4Element, collection: true, default: -> { [] }
|
|
226
|
+
|
|
227
|
+
# Collection of relationships
|
|
228
|
+
attribute :relationships, C4Relationship, collection: true,
|
|
229
|
+
default: -> { [] }
|
|
230
|
+
|
|
231
|
+
# Collection of boundaries
|
|
232
|
+
attribute :boundaries, C4Boundary, collection: true, default: -> { [] }
|
|
233
|
+
|
|
234
|
+
# Layout configuration
|
|
235
|
+
attribute :layout_config, :string
|
|
236
|
+
|
|
237
|
+
# Initialize with default level
|
|
238
|
+
def initialize(*args)
|
|
239
|
+
super
|
|
240
|
+
self.level ||= "Context"
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
# Returns the diagram type identifier.
|
|
244
|
+
#
|
|
245
|
+
# @return [Symbol] :c4
|
|
246
|
+
def diagram_type
|
|
247
|
+
:c4
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
# Validates the C4 diagram structure.
|
|
251
|
+
#
|
|
252
|
+
# A C4 diagram is valid if:
|
|
253
|
+
# - It has a valid level
|
|
254
|
+
# - All elements are valid
|
|
255
|
+
# - All relationships are valid
|
|
256
|
+
# - All boundaries are valid
|
|
257
|
+
# - All relationship references point to existing elements
|
|
258
|
+
#
|
|
259
|
+
# @return [Boolean] true if C4 diagram is valid
|
|
260
|
+
def valid?
|
|
261
|
+
valid_level? && valid_collections? && relationship_references_resolve?
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
# Finds an element by its identifier.
|
|
265
|
+
#
|
|
266
|
+
# @param id [String] the element identifier to find
|
|
267
|
+
# @return [C4Element, nil] the element or nil if not found
|
|
268
|
+
def find_element(id)
|
|
269
|
+
elements.find { |e| e.id == id }
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
# Finds a boundary by its identifier.
|
|
273
|
+
#
|
|
274
|
+
# @param id [String] the boundary identifier to find
|
|
275
|
+
# @return [C4Boundary, nil] the boundary or nil if not found
|
|
276
|
+
def find_boundary(id)
|
|
277
|
+
boundaries.find { |b| b.id == id }
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
# Finds relationships from a specific element.
|
|
281
|
+
#
|
|
282
|
+
# @param element_id [String] the source element identifier
|
|
283
|
+
# @return [Array<C4Relationship>] relationships from the element
|
|
284
|
+
def relationships_from(element_id)
|
|
285
|
+
relationships.select { |r| r.from_id == element_id }
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
# Finds relationships to a specific element.
|
|
289
|
+
#
|
|
290
|
+
# @param element_id [String] the target element identifier
|
|
291
|
+
# @return [Array<C4Relationship>] relationships to the element
|
|
292
|
+
def relationships_to(element_id)
|
|
293
|
+
relationships.select { |r| r.to_id == element_id }
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
# Finds elements within a boundary.
|
|
297
|
+
#
|
|
298
|
+
# @param boundary_id [String] the boundary identifier
|
|
299
|
+
# @return [Array<C4Element>] elements in the boundary
|
|
300
|
+
def elements_in_boundary(boundary_id)
|
|
301
|
+
elements.select { |e| e.boundary_id == boundary_id }
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
# Finds child boundaries within a parent boundary.
|
|
305
|
+
#
|
|
306
|
+
# @param boundary_id [String] the parent boundary identifier
|
|
307
|
+
# @return [Array<C4Boundary>] child boundaries
|
|
308
|
+
def boundaries_in_boundary(boundary_id)
|
|
309
|
+
boundaries.select { |b| b.parent_id == boundary_id }
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
private
|
|
313
|
+
|
|
314
|
+
def valid_level?
|
|
315
|
+
%w[Context Container Component Dynamic Deployment].include?(level)
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
def valid_collections?
|
|
319
|
+
valid_collection?(elements) && valid_collection?(relationships) &&
|
|
320
|
+
valid_collection?(boundaries)
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
def valid_collection?(items)
|
|
324
|
+
items.nil? || items.all?(&:valid?)
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
def relationship_references_resolve?
|
|
328
|
+
element_ids = elements.map(&:id)
|
|
329
|
+
|
|
330
|
+
relationships.nil? || relationships.all? do |relationship|
|
|
331
|
+
element_ids.include?(relationship.from_id) &&
|
|
332
|
+
element_ids.include?(relationship.to_id)
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
end
|
|
336
|
+
end
|
|
337
|
+
end
|