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,466 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "lutaml/model"
|
|
4
|
+
require_relative "base"
|
|
5
|
+
require_relative "generic_text"
|
|
6
|
+
require_relative "class_note"
|
|
7
|
+
require_relative "class_namespace"
|
|
8
|
+
|
|
9
|
+
module Etassia
|
|
10
|
+
module Diagram
|
|
11
|
+
# Represents a class attribute in a UML class diagram.
|
|
12
|
+
#
|
|
13
|
+
# An attribute has a name, type, and visibility modifier that
|
|
14
|
+
# controls its access level.
|
|
15
|
+
class ClassAttribute < Lutaml::Model::Serializable
|
|
16
|
+
VISIBILITY_SYMBOLS = {
|
|
17
|
+
"private" => "-",
|
|
18
|
+
"protected" => "#",
|
|
19
|
+
"package" => "~",
|
|
20
|
+
}.freeze
|
|
21
|
+
|
|
22
|
+
# Attribute name
|
|
23
|
+
attribute :name, :string
|
|
24
|
+
|
|
25
|
+
# Attribute type (e.g., 'string', 'int', 'List~String~')
|
|
26
|
+
attribute :type, :string
|
|
27
|
+
|
|
28
|
+
# Visibility: :public (+), :private (-), :protected (#),
|
|
29
|
+
# :package (~)
|
|
30
|
+
attribute :visibility, :string
|
|
31
|
+
|
|
32
|
+
# The member as written in the source, when it came from a parser
|
|
33
|
+
attribute :text, :string
|
|
34
|
+
|
|
35
|
+
# Initialize with default visibility
|
|
36
|
+
def initialize(*args)
|
|
37
|
+
super
|
|
38
|
+
self.visibility ||= "public"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# The text a row draws: the source text as written, with generics shown
|
|
42
|
+
# as `<T>` and the `*`/`$` classifier mark left off.
|
|
43
|
+
#
|
|
44
|
+
# @return [String] the row text
|
|
45
|
+
def display_text
|
|
46
|
+
return fallback_text unless text
|
|
47
|
+
|
|
48
|
+
GenericText.display_member(text.sub(/\s*[*$]\z/, "").gsub(/\s+/, " "))
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Validates the attribute has required fields.
|
|
52
|
+
#
|
|
53
|
+
# @return [Boolean] true if attribute is valid
|
|
54
|
+
def valid?
|
|
55
|
+
!name.nil? && !name.empty?
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Returns the UML visibility symbol.
|
|
59
|
+
#
|
|
60
|
+
# @return [String] the visibility symbol (+, -, #, ~)
|
|
61
|
+
def visibility_symbol
|
|
62
|
+
VISIBILITY_SYMBOLS.fetch(visibility, "+")
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
private
|
|
66
|
+
|
|
67
|
+
def fallback_text
|
|
68
|
+
row = "#{visibility_symbol} #{name}"
|
|
69
|
+
row += ": #{type}" if type && !type.empty?
|
|
70
|
+
row
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Represents a class method in a UML class diagram.
|
|
75
|
+
#
|
|
76
|
+
# A method has a name, optional parameters, optional return type,
|
|
77
|
+
# and visibility modifier.
|
|
78
|
+
class ClassMethod < Lutaml::Model::Serializable
|
|
79
|
+
VISIBILITY_SYMBOLS = ClassAttribute::VISIBILITY_SYMBOLS
|
|
80
|
+
|
|
81
|
+
# Method name
|
|
82
|
+
attribute :name, :string
|
|
83
|
+
|
|
84
|
+
# Method parameters (e.g., 'x: int, y: int')
|
|
85
|
+
attribute :parameters, :string
|
|
86
|
+
|
|
87
|
+
# Return type (e.g., 'string', 'void')
|
|
88
|
+
attribute :return_type, :string
|
|
89
|
+
|
|
90
|
+
# Visibility: :public (+), :private (-), :protected (#),
|
|
91
|
+
# :package (~)
|
|
92
|
+
attribute :visibility, :string
|
|
93
|
+
|
|
94
|
+
# The member as written in the source, when it came from a parser
|
|
95
|
+
attribute :text, :string
|
|
96
|
+
|
|
97
|
+
# Initialize with default visibility
|
|
98
|
+
def initialize(*args)
|
|
99
|
+
super
|
|
100
|
+
self.visibility ||= "public"
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# The text a row draws: the source up to the `(` as written, then the
|
|
104
|
+
# parameters, then ` : ` and the return type, generics shown as `<T>`.
|
|
105
|
+
#
|
|
106
|
+
# @return [String] the row text
|
|
107
|
+
def display_text
|
|
108
|
+
return fallback_text unless text
|
|
109
|
+
|
|
110
|
+
head = text[/\A[^(]*/].gsub(/\s+/, " ").rstrip
|
|
111
|
+
row = "#{head}(#{parameters})"
|
|
112
|
+
row += " : #{return_type}" if return_type
|
|
113
|
+
GenericText.display_member(row)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Validates the method has required fields.
|
|
117
|
+
#
|
|
118
|
+
# @return [Boolean] true if method is valid
|
|
119
|
+
def valid?
|
|
120
|
+
!name.nil? && !name.empty?
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# Returns the UML visibility symbol.
|
|
124
|
+
#
|
|
125
|
+
# @return [String] the visibility symbol (+, -, #, ~)
|
|
126
|
+
def visibility_symbol
|
|
127
|
+
VISIBILITY_SYMBOLS.fetch(visibility, "+")
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# Returns the full method signature.
|
|
131
|
+
#
|
|
132
|
+
# @return [String] method signature with parameters and return type
|
|
133
|
+
def signature
|
|
134
|
+
sig = name
|
|
135
|
+
sig += "(#{parameters})" if parameters && !parameters.empty?
|
|
136
|
+
sig += " #{return_type}" if return_type && !return_type.empty?
|
|
137
|
+
sig
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
private
|
|
141
|
+
|
|
142
|
+
def fallback_text
|
|
143
|
+
row = "#{visibility_symbol} #{name}"
|
|
144
|
+
row += "(#{parameters})" if parameters
|
|
145
|
+
row += ": #{return_type}" if return_type
|
|
146
|
+
row
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# Represents a class/entity in a UML class diagram.
|
|
151
|
+
#
|
|
152
|
+
# A class entity has an identifier, name, optional stereotype,
|
|
153
|
+
# collection of attributes, and collection of methods.
|
|
154
|
+
class ClassEntity < Lutaml::Model::Serializable
|
|
155
|
+
# Unique identifier for the class
|
|
156
|
+
attribute :id, :string
|
|
157
|
+
|
|
158
|
+
# Display name for the class
|
|
159
|
+
attribute :name, :string
|
|
160
|
+
|
|
161
|
+
# Optional stereotype (e.g., 'interface', 'abstract', 'enum')
|
|
162
|
+
attribute :stereotype, :string
|
|
163
|
+
|
|
164
|
+
# Collection of class attributes
|
|
165
|
+
attribute :attributes, ClassAttribute, collection: true,
|
|
166
|
+
default: -> { [] }
|
|
167
|
+
|
|
168
|
+
# Collection of class methods
|
|
169
|
+
attribute :class_methods, ClassMethod, collection: true,
|
|
170
|
+
default: -> { [] }
|
|
171
|
+
|
|
172
|
+
# Validates the class entity has required fields.
|
|
173
|
+
#
|
|
174
|
+
# @return [Boolean] true if class entity is valid
|
|
175
|
+
def valid?
|
|
176
|
+
present?(id) && present?(name) && attributes.all?(&:valid?) &&
|
|
177
|
+
class_methods.all?(&:valid?)
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
# Checks if this is an interface.
|
|
181
|
+
#
|
|
182
|
+
# @return [Boolean] true if stereotype is 'interface'
|
|
183
|
+
def interface?
|
|
184
|
+
stereotype == "interface"
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
# Checks if this is an abstract class.
|
|
188
|
+
#
|
|
189
|
+
# @return [Boolean] true if stereotype is 'abstract'
|
|
190
|
+
def abstract?
|
|
191
|
+
stereotype == "abstract"
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
# Checks if this is an enum.
|
|
195
|
+
#
|
|
196
|
+
# @return [Boolean] true if stereotype is 'enum'
|
|
197
|
+
def enum?
|
|
198
|
+
stereotype == "enum"
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
private
|
|
202
|
+
|
|
203
|
+
def present?(value)
|
|
204
|
+
!value.nil? && !value.empty?
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
# Represents a relationship between classes in a UML class diagram.
|
|
209
|
+
#
|
|
210
|
+
# A relationship connects two classes with a specific type
|
|
211
|
+
# (inheritance, composition, aggregation, or association) and
|
|
212
|
+
# optional label and cardinality.
|
|
213
|
+
class ClassRelationship < Lutaml::Model::Serializable
|
|
214
|
+
# Source class identifier
|
|
215
|
+
attribute :from_id, :string
|
|
216
|
+
|
|
217
|
+
# Target class identifier
|
|
218
|
+
attribute :to_id, :string
|
|
219
|
+
|
|
220
|
+
# Relationship type: :inheritance, :composition, :aggregation,
|
|
221
|
+
# :association, :dependency, :realization
|
|
222
|
+
attribute :relationship_type, :string
|
|
223
|
+
|
|
224
|
+
# Optional relationship label
|
|
225
|
+
attribute :label, :string
|
|
226
|
+
|
|
227
|
+
# Optional cardinality for source end (e.g., '1', '0..1', '1..*')
|
|
228
|
+
attribute :source_cardinality, :string
|
|
229
|
+
|
|
230
|
+
# Optional cardinality for target end (e.g., '1', '0..1', '1..*')
|
|
231
|
+
attribute :target_cardinality, :string
|
|
232
|
+
|
|
233
|
+
# Marker drawn at the from_id end, independent of relationship_type.
|
|
234
|
+
# Only set for mixed-marker operators (e.g. `o--|>`) where each end
|
|
235
|
+
# carries its own marker; nil for the single-type operators, which
|
|
236
|
+
# render entirely from relationship_type. One of 'inheritance',
|
|
237
|
+
# 'composition', 'aggregation', 'dependency', or nil (no marker).
|
|
238
|
+
attribute :start_marker, :string
|
|
239
|
+
|
|
240
|
+
# Marker drawn at the to_id end. Same rules as start_marker.
|
|
241
|
+
attribute :end_marker, :string
|
|
242
|
+
|
|
243
|
+
# True when the source wrote the ends the other way round (`A <|-- B`
|
|
244
|
+
# is stored B -> A). mmdc ranks the written order, so layout needs it.
|
|
245
|
+
attribute :written_reversed, :boolean
|
|
246
|
+
|
|
247
|
+
# Line style override for mixed-marker operators (nil elsewhere):
|
|
248
|
+
# true renders a dashed line, matching the operator's own line type
|
|
249
|
+
# rather than relationship_type's usual dash rule.
|
|
250
|
+
attribute :dashed, :boolean
|
|
251
|
+
|
|
252
|
+
# Initialize with default relationship type
|
|
253
|
+
def initialize(*args)
|
|
254
|
+
super
|
|
255
|
+
self.relationship_type ||= "association"
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
# Validates the relationship has required fields.
|
|
259
|
+
#
|
|
260
|
+
# @return [Boolean] true if relationship is valid
|
|
261
|
+
def valid?
|
|
262
|
+
[from_id, to_id, relationship_type].all? do |value|
|
|
263
|
+
value && !value.empty?
|
|
264
|
+
end
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
# Checks if this is an inheritance relationship.
|
|
268
|
+
#
|
|
269
|
+
# @return [Boolean] true if inheritance type
|
|
270
|
+
def inheritance?
|
|
271
|
+
relationship_type == "inheritance"
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
# Checks if this is a composition relationship.
|
|
275
|
+
#
|
|
276
|
+
# @return [Boolean] true if composition type
|
|
277
|
+
def composition?
|
|
278
|
+
relationship_type == "composition"
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
# Checks if this is an aggregation relationship.
|
|
282
|
+
#
|
|
283
|
+
# @return [Boolean] true if aggregation type
|
|
284
|
+
def aggregation?
|
|
285
|
+
relationship_type == "aggregation"
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
# Checks if this is an association relationship.
|
|
289
|
+
#
|
|
290
|
+
# @return [Boolean] true if association type
|
|
291
|
+
def association?
|
|
292
|
+
relationship_type == "association"
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
# Checks if this is a dependency relationship.
|
|
296
|
+
#
|
|
297
|
+
# @return [Boolean] true if dependency type
|
|
298
|
+
def dependency?
|
|
299
|
+
relationship_type == "dependency"
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
# Checks if this is a realization relationship.
|
|
303
|
+
#
|
|
304
|
+
# @return [Boolean] true if realization type
|
|
305
|
+
def realization?
|
|
306
|
+
relationship_type == "realization"
|
|
307
|
+
end
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
# Class diagram model.
|
|
311
|
+
#
|
|
312
|
+
# Represents a complete UML class diagram with classes and their
|
|
313
|
+
# relationships. Class diagrams show the static structure of a
|
|
314
|
+
# system with classes, attributes, methods, and relationships.
|
|
315
|
+
#
|
|
316
|
+
# @example Creating a simple class diagram
|
|
317
|
+
# diagram = ClassDiagram.new(direction: 'TB')
|
|
318
|
+
# diagram.entities << ClassEntity.new(
|
|
319
|
+
# id: 'Animal',
|
|
320
|
+
# name: 'Animal'
|
|
321
|
+
# ).tap do |entity|
|
|
322
|
+
# entity.attributes << ClassAttribute.new(
|
|
323
|
+
# name: 'age',
|
|
324
|
+
# type: 'int',
|
|
325
|
+
# visibility: 'protected'
|
|
326
|
+
# )
|
|
327
|
+
# entity.class_methods << ClassMethod.new(
|
|
328
|
+
# name: 'breathe',
|
|
329
|
+
# visibility: 'public'
|
|
330
|
+
# )
|
|
331
|
+
# end
|
|
332
|
+
# diagram.entities << ClassEntity.new(
|
|
333
|
+
# id: 'Dog',
|
|
334
|
+
# name: 'Dog'
|
|
335
|
+
# ).tap do |entity|
|
|
336
|
+
# entity.class_methods << ClassMethod.new(
|
|
337
|
+
# name: 'bark',
|
|
338
|
+
# visibility: 'public'
|
|
339
|
+
# )
|
|
340
|
+
# end
|
|
341
|
+
# diagram.relationships << ClassRelationship.new(
|
|
342
|
+
# from_id: 'Dog',
|
|
343
|
+
# to_id: 'Animal',
|
|
344
|
+
# relationship_type: 'inheritance'
|
|
345
|
+
# )
|
|
346
|
+
class ClassDiagram < Base
|
|
347
|
+
# Collection of class entities in the diagram
|
|
348
|
+
attribute :entities, ClassEntity, collection: true,
|
|
349
|
+
default: -> { [] }
|
|
350
|
+
|
|
351
|
+
# Collection of relationships between entities
|
|
352
|
+
attribute :relationships, ClassRelationship, collection: true,
|
|
353
|
+
default: -> { [] }
|
|
354
|
+
|
|
355
|
+
# Notes written with `note` / `note for`, in source order
|
|
356
|
+
attribute :notes, ClassNote, collection: true, default: -> { [] }
|
|
357
|
+
|
|
358
|
+
# Namespace blocks, in source order
|
|
359
|
+
attribute :namespaces, ClassNamespace, collection: true,
|
|
360
|
+
default: -> { [] }
|
|
361
|
+
|
|
362
|
+
# Diagram-wide font from a Mermaid init `fontFamily`, e.g. "courier"
|
|
363
|
+
attribute :font_family, :string
|
|
364
|
+
|
|
365
|
+
# Returns the diagram type identifier.
|
|
366
|
+
#
|
|
367
|
+
# @return [Symbol] :class_diagram
|
|
368
|
+
def diagram_type
|
|
369
|
+
:class_diagram
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
# Validates the class diagram structure.
|
|
373
|
+
#
|
|
374
|
+
# A class diagram is valid if:
|
|
375
|
+
# - All entities are valid
|
|
376
|
+
# - All relationships are valid
|
|
377
|
+
# - All relationship references point to existing entities
|
|
378
|
+
#
|
|
379
|
+
# @return [Boolean] true if class diagram is valid
|
|
380
|
+
def valid?
|
|
381
|
+
entities.all?(&:valid?) && valid_relationships?
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
# Finds an entity by its identifier.
|
|
385
|
+
#
|
|
386
|
+
# @param id [String] the entity identifier to find
|
|
387
|
+
# @return [ClassEntity, nil] the entity or nil if not found
|
|
388
|
+
def find_entity(id)
|
|
389
|
+
entities.find { |e| e.id == id }
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
# Finds all relationships from a specific entity.
|
|
393
|
+
#
|
|
394
|
+
# @param entity_id [String] the source entity identifier
|
|
395
|
+
# @return [Array<ClassRelationship>] relationships from the entity
|
|
396
|
+
def relationships_from(entity_id)
|
|
397
|
+
relationships.select { |r| r.from_id == entity_id }
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
# Finds all relationships to a specific entity.
|
|
401
|
+
#
|
|
402
|
+
# @param entity_id [String] the target entity identifier
|
|
403
|
+
# @return [Array<ClassRelationship>] relationships to the entity
|
|
404
|
+
def relationships_to(entity_id)
|
|
405
|
+
relationships.select { |r| r.to_id == entity_id }
|
|
406
|
+
end
|
|
407
|
+
|
|
408
|
+
# Finds all inheritance relationships.
|
|
409
|
+
#
|
|
410
|
+
# @return [Array<ClassRelationship>] inheritance relationships
|
|
411
|
+
def inheritance_relationships
|
|
412
|
+
relationships.select(&:inheritance?)
|
|
413
|
+
end
|
|
414
|
+
|
|
415
|
+
# Finds all composition relationships.
|
|
416
|
+
#
|
|
417
|
+
# @return [Array<ClassRelationship>] composition relationships
|
|
418
|
+
def composition_relationships
|
|
419
|
+
relationships.select(&:composition?)
|
|
420
|
+
end
|
|
421
|
+
|
|
422
|
+
# Finds all aggregation relationships.
|
|
423
|
+
#
|
|
424
|
+
# @return [Array<ClassRelationship>] aggregation relationships
|
|
425
|
+
def aggregation_relationships
|
|
426
|
+
relationships.select(&:aggregation?)
|
|
427
|
+
end
|
|
428
|
+
|
|
429
|
+
# Finds parent classes for a given entity.
|
|
430
|
+
#
|
|
431
|
+
# @param entity_id [String] the entity identifier
|
|
432
|
+
# @return [Array<ClassEntity>] parent entities
|
|
433
|
+
def parent_entities(entity_id)
|
|
434
|
+
parent_ids = relationships
|
|
435
|
+
.select { |r| r.from_id == entity_id && r.inheritance? }
|
|
436
|
+
.map(&:to_id)
|
|
437
|
+
entities.select { |e| parent_ids.include?(e.id) }
|
|
438
|
+
end
|
|
439
|
+
|
|
440
|
+
# Finds child classes for a given entity.
|
|
441
|
+
#
|
|
442
|
+
# @param entity_id [String] the entity identifier
|
|
443
|
+
# @return [Array<ClassEntity>] child entities
|
|
444
|
+
def child_entities(entity_id)
|
|
445
|
+
child_ids = relationships
|
|
446
|
+
.select { |r| r.to_id == entity_id && r.inheritance? }
|
|
447
|
+
.map(&:from_id)
|
|
448
|
+
entities.select { |e| child_ids.include?(e.id) }
|
|
449
|
+
end
|
|
450
|
+
|
|
451
|
+
private
|
|
452
|
+
|
|
453
|
+
def valid_relationships?
|
|
454
|
+
relationships.nil? || relationships.all? do |relationship|
|
|
455
|
+
relationship.valid? && relationship_references_resolve?(relationship)
|
|
456
|
+
end
|
|
457
|
+
end
|
|
458
|
+
|
|
459
|
+
def relationship_references_resolve?(relationship)
|
|
460
|
+
entity_ids = entities.map(&:id)
|
|
461
|
+
entity_ids.include?(relationship.from_id) &&
|
|
462
|
+
entity_ids.include?(relationship.to_id)
|
|
463
|
+
end
|
|
464
|
+
end
|
|
465
|
+
end
|
|
466
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "lutaml/model"
|
|
4
|
+
|
|
5
|
+
module Etassia
|
|
6
|
+
module Diagram
|
|
7
|
+
# A `namespace Name { ... }` block of a class diagram: the box mmdc
|
|
8
|
+
# draws around the classes written inside it.
|
|
9
|
+
class ClassNamespace < Lutaml::Model::Serializable
|
|
10
|
+
# The namespace name, as written
|
|
11
|
+
attribute :name, :string
|
|
12
|
+
|
|
13
|
+
# The ids of the entities declared inside the block
|
|
14
|
+
attribute :class_ids, :string, collection: true, default: -> { [] }
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "lutaml/model"
|
|
4
|
+
|
|
5
|
+
module Etassia
|
|
6
|
+
module Diagram
|
|
7
|
+
# A `note "text"` or `note for Class "text"` statement of a class
|
|
8
|
+
# diagram.
|
|
9
|
+
class ClassNote < Lutaml::Model::Serializable
|
|
10
|
+
# The note text, without its surrounding quotes
|
|
11
|
+
attribute :text, :string
|
|
12
|
+
|
|
13
|
+
# The id of the class the note is attached to; nil for a general note
|
|
14
|
+
attribute :target_id, :string
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Etassia
|
|
4
|
+
module Diagram
|
|
5
|
+
# Cycle detection over a graph of box ids.
|
|
6
|
+
#
|
|
7
|
+
# Two callers, and their graphs run in OPPOSITE directions. The
|
|
8
|
+
# parser transform passes what each subgraph's SOURCE encloses —
|
|
9
|
+
# id to the ids inside it — before any model exists, so it can
|
|
10
|
+
# refuse `a` inside `b` inside `a` the way mmdc does. The flowchart
|
|
11
|
+
# model passes the `parent_id` graph — id to the id above it — of a
|
|
12
|
+
# model somebody built by hand, where the same loop hangs those
|
|
13
|
+
# boxes off each other and none of them is ever placed.
|
|
14
|
+
#
|
|
15
|
+
# So this reads edges, not parentage. It says whether following the
|
|
16
|
+
# arrows returns you to where you started; what an arrow MEANS is
|
|
17
|
+
# the caller's business, including which way round to read the pair
|
|
18
|
+
# that comes back.
|
|
19
|
+
#
|
|
20
|
+
# @api private
|
|
21
|
+
module Containment
|
|
22
|
+
module_function
|
|
23
|
+
|
|
24
|
+
# One walk over the whole graph, not one per box. Asking each box
|
|
25
|
+
# in turn whether it reaches itself re-walks the same subtree once
|
|
26
|
+
# per ancestor, which on the parser's graph — where a box lists
|
|
27
|
+
# everything below it, not just its direct children — cost 2.6
|
|
28
|
+
# seconds for 200 nested boxes against 0.2 for this.
|
|
29
|
+
#
|
|
30
|
+
# A box already walked to the end is left alone, which is what
|
|
31
|
+
# makes it one pass — reaching it again cannot find a loop the
|
|
32
|
+
# first visit missed.
|
|
33
|
+
#
|
|
34
|
+
# Keys are visited in insertion order, so a graph closing more
|
|
35
|
+
# than one loop always reports the same one.
|
|
36
|
+
#
|
|
37
|
+
# @param graph [Hash{Object => Array}] id to the ids it points at
|
|
38
|
+
# @return [Array(Object, Object), nil] the edge that closed the
|
|
39
|
+
# loop, as [from, to], or nil when there is none
|
|
40
|
+
def looping_pair(graph)
|
|
41
|
+
colour = {}
|
|
42
|
+
graph.each_key do |root|
|
|
43
|
+
found = back_edge(graph, root, colour)
|
|
44
|
+
return found unless found.nil?
|
|
45
|
+
end
|
|
46
|
+
nil
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# An explicit stack, not recursion. A flat chain of 4,000 boxes is
|
|
50
|
+
# a source mmdc draws, and the recursive form raised a bare
|
|
51
|
+
# SystemStackError out of the parse and into the caller.
|
|
52
|
+
#
|
|
53
|
+
# `colour` is threaded through the whole walk rather than reset
|
|
54
|
+
# per root, which is what keeps it to one pass.
|
|
55
|
+
#
|
|
56
|
+
# Grey is on the path being walked, black is finished. Meeting a
|
|
57
|
+
# grey box closes the loop, and BOTH ends get named rather than
|
|
58
|
+
# just the one we arrived at: the parser turns the pair into
|
|
59
|
+
# mermaid's "Setting b as parent of a", and naming one box twice
|
|
60
|
+
# misreported every two-box loop.
|
|
61
|
+
def back_edge(graph, root, colour)
|
|
62
|
+
return nil if colour.key?(root)
|
|
63
|
+
|
|
64
|
+
colour[root] = :grey
|
|
65
|
+
stack = [[root, 0]]
|
|
66
|
+
until stack.empty?
|
|
67
|
+
found = advance_walk(graph, colour, stack)
|
|
68
|
+
return found unless found.nil?
|
|
69
|
+
end
|
|
70
|
+
nil
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def advance_walk(graph, colour, stack)
|
|
74
|
+
box, taken = stack.last
|
|
75
|
+
children = graph.fetch(box, [])
|
|
76
|
+
return finish_box(colour, stack, box) if taken >= children.size
|
|
77
|
+
|
|
78
|
+
child = take_child(stack, children, taken)
|
|
79
|
+
return [box, child] if colour[child] == :grey
|
|
80
|
+
|
|
81
|
+
visit_child(colour, stack, child) unless colour.key?(child)
|
|
82
|
+
nil
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def finish_box(colour, stack, box)
|
|
86
|
+
colour[box] = :black
|
|
87
|
+
stack.pop
|
|
88
|
+
nil
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def take_child(stack, children, taken)
|
|
92
|
+
stack.last[1] = taken + 1
|
|
93
|
+
children[taken]
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def visit_child(colour, stack, child)
|
|
97
|
+
colour[child] = :grey
|
|
98
|
+
stack << [child, 0]
|
|
99
|
+
end
|
|
100
|
+
private_class_method :back_edge
|
|
101
|
+
private_class_method :advance_walk
|
|
102
|
+
private_class_method :finish_box
|
|
103
|
+
private_class_method :take_child
|
|
104
|
+
private_class_method :visit_child
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|