elkrb 1.0.0 → 2.0.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.
Files changed (144) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.adoc +364 -0
  3. data/LICENSE +25 -0
  4. data/README.adoc +695 -557
  5. data/exe/elkrb +36 -2
  6. data/lib/elkrb/atomic_destination.rb +53 -0
  7. data/lib/elkrb/best_effort_write.rb +49 -0
  8. data/lib/elkrb/cli/layout_flag_options.rb +54 -0
  9. data/lib/elkrb/cli.rb +155 -82
  10. data/lib/elkrb/command_resolver.rb +186 -0
  11. data/lib/elkrb/commands/batch_command.rb +28 -5
  12. data/lib/elkrb/commands/convert_command.rb +22 -52
  13. data/lib/elkrb/commands/diagram_command.rb +234 -102
  14. data/lib/elkrb/commands/options_command.rb +87 -0
  15. data/lib/elkrb/commands/render_command.rb +6 -1
  16. data/lib/elkrb/commands/validate_command.rb +146 -91
  17. data/lib/elkrb/errors.rb +20 -1
  18. data/lib/elkrb/format_sniffer.rb +362 -0
  19. data/lib/elkrb/geometry/bezier.rb +14 -4
  20. data/lib/elkrb/geometry/point.rb +5 -6
  21. data/lib/elkrb/geometry/rectangle.rb +2 -2
  22. data/lib/elkrb/graph/deep_stringify_keys.rb +30 -0
  23. data/lib/elkrb/graph/edge.rb +89 -3
  24. data/lib/elkrb/graph/graph.rb +43 -15
  25. data/lib/elkrb/graph/label.rb +16 -2
  26. data/lib/elkrb/graph/node.rb +13 -2
  27. data/lib/elkrb/graph/node_constraints.rb +139 -8
  28. data/lib/elkrb/graph/normalize_option_keys.rb +39 -0
  29. data/lib/elkrb/graph/port.rb +29 -21
  30. data/lib/elkrb/graph/read_only_mapping.rb +21 -0
  31. data/lib/elkrb/graphviz_wrapper.rb +152 -44
  32. data/lib/elkrb/layout/algorithm_registry.rb +65 -8
  33. data/lib/elkrb/layout/algorithms/base_algorithm.rb +74 -74
  34. data/lib/elkrb/layout/algorithms/box.rb +47 -20
  35. data/lib/elkrb/layout/algorithms/disco.rb +150 -61
  36. data/lib/elkrb/layout/algorithms/fixed.rb +70 -10
  37. data/lib/elkrb/layout/algorithms/force.rb +145 -86
  38. data/lib/elkrb/layout/algorithms/layered/bk/aligner.rb +104 -0
  39. data/lib/elkrb/layout/algorithms/layered/bk/compactor.rb +87 -0
  40. data/lib/elkrb/layout/algorithms/layered/bk/view.rb +103 -0
  41. data/lib/elkrb/layout/algorithms/layered/bk_node_placer.rb +170 -0
  42. data/lib/elkrb/layout/algorithms/layered/components.rb +170 -0
  43. data/lib/elkrb/layout/algorithms/layered/crossing_minimizer.rb +306 -0
  44. data/lib/elkrb/layout/algorithms/layered/cycle_breaker.rb +118 -49
  45. data/lib/elkrb/layout/algorithms/layered/discovery_order.rb +75 -0
  46. data/lib/elkrb/layout/algorithms/layered/dummy_slot.rb +31 -0
  47. data/lib/elkrb/layout/algorithms/layered/layer_assigner.rb +188 -48
  48. data/lib/elkrb/layout/algorithms/layered/layer_constraints.rb +82 -0
  49. data/lib/elkrb/layout/algorithms/layered/layer_sweep.rb +195 -0
  50. data/lib/elkrb/layout/algorithms/layered/node_placer.rb +214 -36
  51. data/lib/elkrb/layout/algorithms/layered/orthogonal/gap_solver.rb +219 -0
  52. data/lib/elkrb/layout/algorithms/layered/orthogonal/hyper_edge_segment.rb +152 -0
  53. data/lib/elkrb/layout/algorithms/layered/orthogonal/junction_points.rb +58 -0
  54. data/lib/elkrb/layout/algorithms/layered/orthogonal/segment_order.rb +134 -0
  55. data/lib/elkrb/layout/algorithms/layered/orthogonal_router.rb +253 -0
  56. data/lib/elkrb/layout/algorithms/layered/port_order.rb +188 -0
  57. data/lib/elkrb/layout/algorithms/layered/port_spread.rb +42 -0
  58. data/lib/elkrb/layout/algorithms/layered.rb +548 -13
  59. data/lib/elkrb/layout/algorithms/libavoid.rb +951 -187
  60. data/lib/elkrb/layout/algorithms/mrtree.rb +585 -65
  61. data/lib/elkrb/layout/algorithms/radial.rb +188 -29
  62. data/lib/elkrb/layout/algorithms/random.rb +131 -17
  63. data/lib/elkrb/layout/algorithms/rectpacking.rb +28 -40
  64. data/lib/elkrb/layout/algorithms/spore_compaction.rb +57 -100
  65. data/lib/elkrb/layout/algorithms/spore_overlap.rb +78 -84
  66. data/lib/elkrb/layout/algorithms/stress.rb +391 -84
  67. data/lib/elkrb/layout/algorithms/topdown_packing.rb +95 -31
  68. data/lib/elkrb/layout/algorithms/vertiflex.rb +12 -47
  69. data/lib/elkrb/layout/constraints/alignment_constraint.rb +49 -12
  70. data/lib/elkrb/layout/constraints/base_constraint.rb +3 -15
  71. data/lib/elkrb/layout/constraints/constraint_processor.rb +9 -23
  72. data/lib/elkrb/layout/constraints/fixed_position_constraint.rb +22 -13
  73. data/lib/elkrb/layout/constraints/layer_constraint.rb +10 -33
  74. data/lib/elkrb/layout/constraints/relative_position_constraint.rb +94 -50
  75. data/lib/elkrb/layout/edge_router.rb +533 -337
  76. data/lib/elkrb/layout/hierarchical_processor.rb +19 -276
  77. data/lib/elkrb/layout/java_random.rb +59 -0
  78. data/lib/elkrb/layout/label_placer.rb +165 -157
  79. data/lib/elkrb/layout/layout_engine.rb +46 -23
  80. data/lib/elkrb/layout/node_index.rb +149 -0
  81. data/lib/elkrb/layout/polyomino/component_compactor.rb +138 -0
  82. data/lib/elkrb/layout/polyomino/footprint.rb +94 -0
  83. data/lib/elkrb/layout/polyomino/grid.rb +106 -0
  84. data/lib/elkrb/layout/polyomino/packer.rb +95 -0
  85. data/lib/elkrb/layout/polyomino/piece.rb +52 -0
  86. data/lib/elkrb/layout/port_constraint_processor.rb +131 -44
  87. data/lib/elkrb/layout/spore/body.rb +65 -0
  88. data/lib/elkrb/layout/spore/depth_first_compaction.rb +127 -0
  89. data/lib/elkrb/layout/spore/edge_cost.rb +69 -0
  90. data/lib/elkrb/layout/spore/gap.rb +76 -0
  91. data/lib/elkrb/layout/spore/geometry.rb +104 -0
  92. data/lib/elkrb/layout/spore/overlap_sweep.rb +90 -0
  93. data/lib/elkrb/layout/spore/placement.rb +57 -0
  94. data/lib/elkrb/layout/spore/rays.rb +119 -0
  95. data/lib/elkrb/layout/spore/spanning_tree.rb +53 -0
  96. data/lib/elkrb/layout/spore/triangulation.rb +159 -0
  97. data/lib/elkrb/layout_flags.rb +69 -0
  98. data/lib/elkrb/options/decimal.rb +50 -0
  99. data/lib/elkrb/options/element_options.rb +43 -0
  100. data/lib/elkrb/options/elk_padding.rb +20 -14
  101. data/lib/elkrb/options/k_vector.rb +6 -7
  102. data/lib/elkrb/options/k_vector_chain.rb +12 -20
  103. data/lib/elkrb/options/option_map.rb +85 -0
  104. data/lib/elkrb/options/registry.rb +335 -0
  105. data/lib/elkrb/options/resolver.rb +151 -0
  106. data/lib/elkrb/options/spellings.rb +62 -0
  107. data/lib/elkrb/options/unhonoured_report.rb +194 -0
  108. data/lib/elkrb/parsers/elkt/lexer.rb +309 -0
  109. data/lib/elkrb/parsers/elkt/parser.rb +424 -0
  110. data/lib/elkrb/parsers/elkt/resolver.rb +142 -0
  111. data/lib/elkrb/parsers/elkt/token.rb +40 -0
  112. data/lib/elkrb/parsers/elkt_parser.rb +32 -230
  113. data/lib/elkrb/serializers/dot_serializer.rb +342 -54
  114. data/lib/elkrb/serializers/elkt_serializer.rb +386 -155
  115. data/lib/elkrb/version.rb +1 -1
  116. data/lib/elkrb.rb +60 -61
  117. metadata +71 -49
  118. data/.rspec +0 -3
  119. data/.rubocop.yml +0 -11
  120. data/Gemfile +0 -13
  121. data/Rakefile +0 -64
  122. data/benchmarks/README.md +0 -172
  123. data/benchmarks/elkjs_benchmark.js +0 -140
  124. data/benchmarks/elkrb_benchmark.rb +0 -145
  125. data/benchmarks/fixtures/graphs.json +0 -10777
  126. data/benchmarks/generate_report.rb +0 -241
  127. data/benchmarks/generate_test_graphs.rb +0 -154
  128. data/benchmarks/results/elkrb_results.json +0 -280
  129. data/benchmarks/results/elkrb_summary.json +0 -285
  130. data/elkrb.gemspec +0 -39
  131. data/examples/dot_export_demo.rb +0 -133
  132. data/examples/hierarchical_graph.rb +0 -19
  133. data/examples/layout_constraints_demo.rb +0 -272
  134. data/examples/port_constraints_demo.rb +0 -291
  135. data/examples/self_loop_demo.rb +0 -391
  136. data/examples/simple_graph.rb +0 -50
  137. data/examples/spline_routing_demo.rb +0 -235
  138. data/lib/elkrb/graph/layout_options.rb +0 -247
  139. data/sig/elkrb/constraints.rbs +0 -114
  140. data/sig/elkrb/geometry.rbs +0 -61
  141. data/sig/elkrb/graph.rbs +0 -112
  142. data/sig/elkrb/layout.rbs +0 -107
  143. data/sig/elkrb/options.rbs +0 -81
  144. data/sig/elkrb.rbs +0 -32
data/lib/elkrb.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "logger"
4
+
3
5
  require_relative "elkrb/version"
4
6
  require_relative "elkrb/errors"
5
7
 
@@ -10,7 +12,9 @@ require_relative "elkrb/geometry/rectangle"
10
12
  require_relative "elkrb/geometry/vector"
11
13
 
12
14
  # Graph models
13
- require_relative "elkrb/graph/layout_options"
15
+ require_relative "elkrb/graph/deep_stringify_keys"
16
+ require_relative "elkrb/graph/normalize_option_keys"
17
+ require_relative "elkrb/graph/read_only_mapping"
14
18
  require_relative "elkrb/graph/label"
15
19
  require_relative "elkrb/graph/port"
16
20
  require_relative "elkrb/graph/node_constraints"
@@ -20,11 +24,17 @@ require_relative "elkrb/graph/graph"
20
24
 
21
25
  # Serializers
22
26
  require_relative "elkrb/serializers/dot_serializer"
27
+ require_relative "elkrb/serializers/elkt_serializer"
28
+
29
+ # Parsers
30
+ require_relative "elkrb/parsers/elkt_parser"
23
31
 
24
32
  # Options parsers
25
33
  require_relative "elkrb/options/elk_padding"
26
34
  require_relative "elkrb/options/k_vector"
27
35
  require_relative "elkrb/options/k_vector_chain"
36
+ require_relative "elkrb/options/registry"
37
+ require_relative "elkrb/options/resolver"
28
38
 
29
39
  # Layout constraints
30
40
  require_relative "elkrb/layout/constraints/base_constraint"
@@ -57,7 +67,7 @@ require_relative "elkrb/layout/algorithms/vertiflex"
57
67
  # ElkRb - Pure Ruby implementation of the Eclipse Layout Kernel
58
68
  #
59
69
  # ElkRb provides automatic graph layout algorithms for node-link diagrams.
60
- # It implements 12 layout algorithms from the Eclipse Layout Kernel (ELK),
70
+ # It implements the layout algorithms from the Eclipse Layout Kernel (ELK),
61
71
  # supporting hierarchical graphs, port-based connections, and automatic
62
72
  # label placement.
63
73
  #
@@ -77,7 +87,7 @@ require_relative "elkrb/layout/algorithms/vertiflex"
77
87
  # }
78
88
  #
79
89
  # result = Elkrb.layout(graph)
80
- # puts result[:children][0][:x] # Node positions computed
90
+ # puts result.children[0].x # Node positions computed
81
91
  #
82
92
  # @example Using model classes
83
93
  # graph = Elkrb::Graph::Graph.new(id: "root")
@@ -94,6 +104,19 @@ require_relative "elkrb/layout/algorithms/vertiflex"
94
104
  # @see https://www.eclipse.org/elk/ Eclipse Layout Kernel
95
105
  # @see https://github.com/kieler/elkjs elkjs - JavaScript port
96
106
  module Elkrb
107
+ # The logger every elkrb warning goes through. Defaults to WARN on $stderr;
108
+ # assign your own to redirect or silence it.
109
+ #
110
+ # @return [Logger]
111
+ def self.logger
112
+ @logger ||= Logger.new($stderr, level: Logger::WARN)
113
+ end
114
+
115
+ # @param logger [Logger] replaces the default logger
116
+ def self.logger=(logger)
117
+ @logger = logger
118
+ end
119
+
97
120
  # Register basic layout algorithms
98
121
  Layout::AlgorithmRegistry.register(
99
122
  "random",
@@ -237,7 +260,9 @@ module Elkrb
237
260
  Layout::Algorithms::Libavoid,
238
261
  {
239
262
  name: "Libavoid",
240
- description: "Orthogonal connector routing with obstacle avoidance",
263
+ description: "Orthogonal connector routing with bounded A* obstacle " \
264
+ "avoidance (falls back to a direct connector if no path " \
265
+ "is found within the search limit)",
241
266
  category: "routing",
242
267
  supports_hierarchy: false,
243
268
  },
@@ -248,8 +273,8 @@ module Elkrb
248
273
  Layout::Algorithms::VertiFlex,
249
274
  {
250
275
  name: "VertiFlex",
251
- description: "Vertical flexible layout with column-based arrangement",
252
- category: "layered",
276
+ description: "Column-grid arrangement that ignores edges",
277
+ category: "packing",
253
278
  supports_hierarchy: false,
254
279
  experimental: true,
255
280
  },
@@ -261,11 +286,27 @@ module Elkrb
261
286
  # a Graph model object and applies the chosen layout algorithm to compute
262
287
  # node positions and edge routes.
263
288
  #
289
+ # A Graph argument is mutated in place and returned, so the caller's object
290
+ # carries the computed positions. A Hash argument is converted to a fresh
291
+ # Graph and left untouched.
292
+ #
264
293
  # @param graph [Hash, Graph::Graph] The graph to layout
294
+ # Options are read in one order: the graph's own layoutOptions, then its
295
+ # properties, then these call-level options, then the registry default. A
296
+ # graph that pins an algorithm keeps it, whatever :algorithm says here.
297
+ #
265
298
  # @param options [Hash] Layout options including:
266
- # - :algorithm (String) - Algorithm name (default: "layered")
299
+ # - :algorithm (String) - Algorithm name, used when the graph pins none
300
+ # (default: "layered")
301
+ # - :strict (Boolean) - Raise instead of warn when the graph carries an
302
+ # option elkrb does not know or does not fully honour, or the call
303
+ # passes a registered option that is not fully honoured (default: false)
267
304
  # - Algorithm-specific options (e.g., "elk.spacing.nodeNode")
268
305
  # @return [Graph::Graph] The input graph with computed positions
306
+ # @raise [ArgumentError] If graph is neither a Hash nor a Graph::Graph
307
+ # @raise [Elkrb::AlgorithmNotFoundError] If the algorithm is not registered
308
+ # @raise [Elkrb::ValidationError] If an option value has the wrong type
309
+ # @raise [Elkrb::Error] In strict mode, for an unknown or unhonoured option
269
310
  #
270
311
  # @example With hash input
271
312
  # result = Elkrb.layout({
@@ -357,7 +398,7 @@ module Elkrb
357
398
 
358
399
  # Returns metadata for all available layout algorithms.
359
400
  #
360
- # This includes the 12 built-in algorithms plus any custom algorithms
401
+ # This includes the built-in algorithms plus any custom algorithms
361
402
  # registered via {register_algorithm}.
362
403
  #
363
404
  # @return [Array<Hash>] Array of algorithm metadata with keys:
@@ -366,6 +407,7 @@ module Elkrb
366
407
  # - :description (String) - Brief description
367
408
  # - :category (String) - Algorithm category
368
409
  # - :supports_hierarchy (Boolean) - Whether it supports nested graphs
410
+ # - :supported_options (Array<String>) - Canonical option ids scoped to this algorithm
369
411
  #
370
412
  # @example List all algorithms
371
413
  # Elkrb.known_layout_algorithms.each do |alg|
@@ -376,29 +418,22 @@ module Elkrb
376
418
  # force_algorithms = Elkrb.known_layout_algorithms
377
419
  # .select { |alg| alg[:category] == "force" }
378
420
  def self.known_layout_algorithms
379
- Layout::AlgorithmRegistry.all.map do |name, data|
380
- {
381
- id: name,
382
- name: data[:metadata][:name] || name.capitalize,
383
- description: data[:metadata][:description] || "",
384
- category: data[:metadata][:category] || "general",
385
- supports_hierarchy: data[:metadata][:supports_hierarchy] || false,
386
- }
387
- end
421
+ Layout::AlgorithmRegistry.all_algorithm_info
388
422
  end
389
423
 
390
- # Returns metadata for all supported layout options.
424
+ # Returns metadata for all supported layout options, sourced from
425
+ # Elkrb::Options::Registry (the single source of truth every algorithm
426
+ # and the CLI eventually read from).
391
427
  #
392
- # This includes common options like algorithm selection, spacing,
393
- # direction, and padding, as well as algorithm-specific options.
394
- #
395
- # @return [Hash{String => Hash}] Hash mapping option names to metadata.
428
+ # @return [Hash{String => Hash}] Hash mapping canonical option ids to metadata.
396
429
  # Each metadata hash contains:
397
- # - :type (String) - Option value type
430
+ # - :type (Symbol) - Option value type (:string, :float, :integer,
431
+ # :boolean, :enum, :padding, :kvector, :kvector_chain)
398
432
  # - :description (String) - Brief description
399
433
  # - :default - Default value
400
434
  # - :values (Array, nil) - Allowed values for enum types
401
435
  # - :parser (String, nil) - Parser class for complex types
436
+ # - :status (Symbol) - :honoured, :partial, :accepted, or :unsupported
402
437
  #
403
438
  # @example Query options
404
439
  # options = Elkrb.known_layout_options
@@ -407,45 +442,9 @@ module Elkrb
407
442
  #
408
443
  # @example Get allowed values
409
444
  # directions = Elkrb.known_layout_options["elk.direction"][:values]
410
- # # => ["UP", "DOWN", "LEFT", "RIGHT"]
445
+ # # => ["UNDEFINED", "RIGHT", "LEFT", "DOWN", "UP"]
411
446
  def self.known_layout_options
412
- {
413
- "algorithm" => {
414
- type: "string",
415
- description: "The layout algorithm to use",
416
- default: "layered",
417
- values: Layout::AlgorithmRegistry.all.keys,
418
- },
419
- "elk.direction" => {
420
- type: "string",
421
- description: "Overall direction of layout",
422
- default: "RIGHT",
423
- values: %w[UP DOWN LEFT RIGHT],
424
- },
425
- "elk.spacing.nodeNode" => {
426
- type: "float",
427
- description: "Spacing between nodes",
428
- default: 20.0,
429
- },
430
- "elk.padding" => {
431
- type: "ElkPadding",
432
- description: "Padding around the graph",
433
- default: "[left=12, top=12, right=12, bottom=12]",
434
- parser: "Elkrb::Options::ElkPadding",
435
- },
436
- "position" => {
437
- type: "KVector",
438
- description: "Fixed position for nodes (when using fixed algorithm)",
439
- default: nil,
440
- parser: "Elkrb::Options::KVector",
441
- },
442
- "bendPoints" => {
443
- type: "KVectorChain",
444
- description: "Bend points for edges",
445
- default: nil,
446
- parser: "Elkrb::Options::KVectorChain",
447
- },
448
- }
447
+ Options::Registry.render_known_options(algorithm_values: Layout::AlgorithmRegistry.available_algorithms)
449
448
  end
450
449
 
451
450
  # Returns metadata for layout option categories.
metadata CHANGED
@@ -1,43 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elkrb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-11-14 00:00:00.000000000 Z
11
+ date: 2026-10-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lutaml-model
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0.7'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
19
+ version: '0.8'
20
+ - - "<"
25
21
  - !ruby/object:Gem::Version
26
- version: '0.7'
27
- - !ruby/object:Gem::Dependency
28
- name: rbs
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '3.0'
22
+ version: '0.9'
34
23
  type: :runtime
35
24
  prerelease: false
36
25
  version_requirements: !ruby/object:Gem::Requirement
37
26
  requirements:
38
- - - "~>"
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '0.8'
30
+ - - "<"
39
31
  - !ruby/object:Gem::Version
40
- version: '3.0'
32
+ version: '0.9'
41
33
  - !ruby/object:Gem::Dependency
42
34
  name: thor
43
35
  requirement: !ruby/object:Gem::Requirement
@@ -54,7 +46,7 @@ dependencies:
54
46
  version: '1.4'
55
47
  description: |
56
48
  Pure Ruby implementation of the Eclipse Layout Kernel (ELK) providing automatic
57
- layout of node-link diagrams. Supports all ELK algorithms.
49
+ layout of node-link diagrams. Supports 15 registered layout algorithms.
58
50
  email:
59
51
  - open.source@ribose.com
60
52
  executables:
@@ -62,48 +54,38 @@ executables:
62
54
  extensions: []
63
55
  extra_rdoc_files: []
64
56
  files:
65
- - ".rspec"
66
- - ".rubocop.yml"
67
- - Gemfile
57
+ - CHANGELOG.adoc
58
+ - LICENSE
68
59
  - README.adoc
69
- - Rakefile
70
- - benchmarks/README.md
71
- - benchmarks/elkjs_benchmark.js
72
- - benchmarks/elkrb_benchmark.rb
73
- - benchmarks/fixtures/graphs.json
74
- - benchmarks/generate_report.rb
75
- - benchmarks/generate_test_graphs.rb
76
- - benchmarks/results/elkrb_results.json
77
- - benchmarks/results/elkrb_summary.json
78
- - elkrb.gemspec
79
- - examples/dot_export_demo.rb
80
- - examples/hierarchical_graph.rb
81
- - examples/layout_constraints_demo.rb
82
- - examples/port_constraints_demo.rb
83
- - examples/self_loop_demo.rb
84
- - examples/simple_graph.rb
85
- - examples/spline_routing_demo.rb
86
60
  - exe/elkrb
87
61
  - lib/elkrb.rb
62
+ - lib/elkrb/atomic_destination.rb
63
+ - lib/elkrb/best_effort_write.rb
88
64
  - lib/elkrb/cli.rb
65
+ - lib/elkrb/cli/layout_flag_options.rb
66
+ - lib/elkrb/command_resolver.rb
89
67
  - lib/elkrb/commands/batch_command.rb
90
68
  - lib/elkrb/commands/convert_command.rb
91
69
  - lib/elkrb/commands/diagram_command.rb
70
+ - lib/elkrb/commands/options_command.rb
92
71
  - lib/elkrb/commands/render_command.rb
93
72
  - lib/elkrb/commands/validate_command.rb
94
73
  - lib/elkrb/errors.rb
74
+ - lib/elkrb/format_sniffer.rb
95
75
  - lib/elkrb/geometry/bezier.rb
96
76
  - lib/elkrb/geometry/dimension.rb
97
77
  - lib/elkrb/geometry/point.rb
98
78
  - lib/elkrb/geometry/rectangle.rb
99
79
  - lib/elkrb/geometry/vector.rb
80
+ - lib/elkrb/graph/deep_stringify_keys.rb
100
81
  - lib/elkrb/graph/edge.rb
101
82
  - lib/elkrb/graph/graph.rb
102
83
  - lib/elkrb/graph/label.rb
103
- - lib/elkrb/graph/layout_options.rb
104
84
  - lib/elkrb/graph/node.rb
105
85
  - lib/elkrb/graph/node_constraints.rb
86
+ - lib/elkrb/graph/normalize_option_keys.rb
106
87
  - lib/elkrb/graph/port.rb
88
+ - lib/elkrb/graph/read_only_mapping.rb
107
89
  - lib/elkrb/graphviz_wrapper.rb
108
90
  - lib/elkrb/layout/algorithm_registry.rb
109
91
  - lib/elkrb/layout/algorithms/base_algorithm.rb
@@ -112,9 +94,26 @@ files:
112
94
  - lib/elkrb/layout/algorithms/fixed.rb
113
95
  - lib/elkrb/layout/algorithms/force.rb
114
96
  - lib/elkrb/layout/algorithms/layered.rb
97
+ - lib/elkrb/layout/algorithms/layered/bk/aligner.rb
98
+ - lib/elkrb/layout/algorithms/layered/bk/compactor.rb
99
+ - lib/elkrb/layout/algorithms/layered/bk/view.rb
100
+ - lib/elkrb/layout/algorithms/layered/bk_node_placer.rb
101
+ - lib/elkrb/layout/algorithms/layered/components.rb
102
+ - lib/elkrb/layout/algorithms/layered/crossing_minimizer.rb
115
103
  - lib/elkrb/layout/algorithms/layered/cycle_breaker.rb
104
+ - lib/elkrb/layout/algorithms/layered/discovery_order.rb
105
+ - lib/elkrb/layout/algorithms/layered/dummy_slot.rb
116
106
  - lib/elkrb/layout/algorithms/layered/layer_assigner.rb
107
+ - lib/elkrb/layout/algorithms/layered/layer_constraints.rb
108
+ - lib/elkrb/layout/algorithms/layered/layer_sweep.rb
117
109
  - lib/elkrb/layout/algorithms/layered/node_placer.rb
110
+ - lib/elkrb/layout/algorithms/layered/orthogonal/gap_solver.rb
111
+ - lib/elkrb/layout/algorithms/layered/orthogonal/hyper_edge_segment.rb
112
+ - lib/elkrb/layout/algorithms/layered/orthogonal/junction_points.rb
113
+ - lib/elkrb/layout/algorithms/layered/orthogonal/segment_order.rb
114
+ - lib/elkrb/layout/algorithms/layered/orthogonal_router.rb
115
+ - lib/elkrb/layout/algorithms/layered/port_order.rb
116
+ - lib/elkrb/layout/algorithms/layered/port_spread.rb
118
117
  - lib/elkrb/layout/algorithms/libavoid.rb
119
118
  - lib/elkrb/layout/algorithms/mrtree.rb
120
119
  - lib/elkrb/layout/algorithms/radial.rb
@@ -133,29 +132,52 @@ files:
133
132
  - lib/elkrb/layout/constraints/relative_position_constraint.rb
134
133
  - lib/elkrb/layout/edge_router.rb
135
134
  - lib/elkrb/layout/hierarchical_processor.rb
135
+ - lib/elkrb/layout/java_random.rb
136
136
  - lib/elkrb/layout/label_placer.rb
137
137
  - lib/elkrb/layout/layout_engine.rb
138
+ - lib/elkrb/layout/node_index.rb
139
+ - lib/elkrb/layout/polyomino/component_compactor.rb
140
+ - lib/elkrb/layout/polyomino/footprint.rb
141
+ - lib/elkrb/layout/polyomino/grid.rb
142
+ - lib/elkrb/layout/polyomino/packer.rb
143
+ - lib/elkrb/layout/polyomino/piece.rb
138
144
  - lib/elkrb/layout/port_constraint_processor.rb
145
+ - lib/elkrb/layout/spore/body.rb
146
+ - lib/elkrb/layout/spore/depth_first_compaction.rb
147
+ - lib/elkrb/layout/spore/edge_cost.rb
148
+ - lib/elkrb/layout/spore/gap.rb
149
+ - lib/elkrb/layout/spore/geometry.rb
150
+ - lib/elkrb/layout/spore/overlap_sweep.rb
151
+ - lib/elkrb/layout/spore/placement.rb
152
+ - lib/elkrb/layout/spore/rays.rb
153
+ - lib/elkrb/layout/spore/spanning_tree.rb
154
+ - lib/elkrb/layout/spore/triangulation.rb
155
+ - lib/elkrb/layout_flags.rb
156
+ - lib/elkrb/options/decimal.rb
157
+ - lib/elkrb/options/element_options.rb
139
158
  - lib/elkrb/options/elk_padding.rb
140
159
  - lib/elkrb/options/k_vector.rb
141
160
  - lib/elkrb/options/k_vector_chain.rb
161
+ - lib/elkrb/options/option_map.rb
162
+ - lib/elkrb/options/registry.rb
163
+ - lib/elkrb/options/resolver.rb
164
+ - lib/elkrb/options/spellings.rb
165
+ - lib/elkrb/options/unhonoured_report.rb
166
+ - lib/elkrb/parsers/elkt/lexer.rb
167
+ - lib/elkrb/parsers/elkt/parser.rb
168
+ - lib/elkrb/parsers/elkt/resolver.rb
169
+ - lib/elkrb/parsers/elkt/token.rb
142
170
  - lib/elkrb/parsers/elkt_parser.rb
143
171
  - lib/elkrb/serializers/dot_serializer.rb
144
172
  - lib/elkrb/serializers/elkt_serializer.rb
145
173
  - lib/elkrb/version.rb
146
- - sig/elkrb.rbs
147
- - sig/elkrb/constraints.rbs
148
- - sig/elkrb/geometry.rbs
149
- - sig/elkrb/graph.rbs
150
- - sig/elkrb/layout.rbs
151
- - sig/elkrb/options.rbs
152
174
  homepage: https://github.com/claricle/elkrb
153
175
  licenses:
154
176
  - BSD-2-Clause
155
177
  metadata:
156
178
  homepage_uri: https://github.com/claricle/elkrb
157
179
  source_code_uri: https://github.com/claricle/elkrb
158
- changelog_uri: https://github.com/claricle/elkrb
180
+ changelog_uri: https://github.com/claricle/elkrb/blob/v2/CHANGELOG.adoc
159
181
  rubygems_mfa_required: 'true'
160
182
  post_install_message:
161
183
  rdoc_options: []
@@ -165,7 +187,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
165
187
  requirements:
166
188
  - - ">="
167
189
  - !ruby/object:Gem::Version
168
- version: 3.0.0
190
+ version: 3.3.0
169
191
  required_rubygems_version: !ruby/object:Gem::Requirement
170
192
  requirements:
171
193
  - - ">="
data/.rspec DELETED
@@ -1,3 +0,0 @@
1
- --require spec_helper
2
- --color
3
- --format documentation
data/.rubocop.yml DELETED
@@ -1,11 +0,0 @@
1
- # Auto-generated by Cimas: Do not edit it manually!
2
- # See https://github.com/metanorma/cimas
3
- inherit_from:
4
- - https://raw.githubusercontent.com/riboseinc/oss-guides/main/ci/rubocop.yml
5
- - .rubocop_todo.yml
6
-
7
- # local repo-specific modifications
8
- # ...
9
-
10
- AllCops:
11
- NewCops: enable
data/Gemfile DELETED
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source "https://rubygems.org"
4
-
5
- # Specify your gem's dependencies in omnizip.gemspec
6
- gemspec
7
-
8
- gem "rake"
9
- gem "rspec"
10
- gem "rubocop"
11
- gem "rubocop-performance"
12
- gem "rubocop-rake"
13
- gem "rubocop-rspec"
data/Rakefile DELETED
@@ -1,64 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "bundler/gem_tasks"
4
- require "rspec/core/rake_task"
5
-
6
- RSpec::Core::RakeTask.new(:spec)
7
-
8
- task default: :spec
9
-
10
- namespace :benchmark do
11
- desc "Generate test graphs for benchmarking"
12
- task :generate_graphs do
13
- ruby "benchmarks/generate_test_graphs.rb"
14
- end
15
-
16
- desc "Run ElkRb benchmarks"
17
- task elkrb: :generate_graphs do
18
- ruby "benchmarks/elkrb_benchmark.rb"
19
- end
20
-
21
- desc "Run elkjs benchmarks (requires Node.js and elkjs)"
22
- task elkjs: :generate_graphs do
23
- sh "node benchmarks/elkjs_benchmark.js"
24
- end
25
-
26
- desc "Generate performance report"
27
- task :report do
28
- ruby "benchmarks/generate_report.rb"
29
- end
30
-
31
- desc "Run all benchmarks and generate report"
32
- task all: %i[elkrb report] do
33
- puts "\nAll benchmarks completed!"
34
- puts "Note: Run 'rake benchmark:elkjs' separately if elkjs is installed"
35
- end
36
- end
37
-
38
- namespace :validate do
39
- desc "Import test cases from elkjs"
40
- task :import_elkjs do
41
- ruby "spec/cross_validation/elkjs_test_importer.rb"
42
- end
43
-
44
- desc "Import test cases from Java ELK"
45
- task :import_java_elk do
46
- ruby "spec/cross_validation/java_elk_test_importer.rb"
47
- end
48
-
49
- desc "Import all test cases from elkjs and Java ELK"
50
- task import_all: %i[import_elkjs import_java_elk]
51
-
52
- desc "Run cross-validation tests"
53
- task :run do
54
- ruby "spec/cross_validation/validation_runner.rb"
55
- end
56
-
57
- desc "Import and run cross-validation (full pipeline)"
58
- task all: %i[import_all run]
59
-
60
- desc "Generate validation report (AsciiDoc)"
61
- task :report do
62
- ruby "spec/cross_validation/generate_validation_report.rb"
63
- end
64
- end