elkrb 1.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 (89) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/.rubocop.yml +11 -0
  4. data/Gemfile +13 -0
  5. data/README.adoc +1028 -0
  6. data/Rakefile +64 -0
  7. data/benchmarks/README.md +172 -0
  8. data/benchmarks/elkjs_benchmark.js +140 -0
  9. data/benchmarks/elkrb_benchmark.rb +145 -0
  10. data/benchmarks/fixtures/graphs.json +10777 -0
  11. data/benchmarks/generate_report.rb +241 -0
  12. data/benchmarks/generate_test_graphs.rb +154 -0
  13. data/benchmarks/results/elkrb_results.json +280 -0
  14. data/benchmarks/results/elkrb_summary.json +285 -0
  15. data/elkrb.gemspec +39 -0
  16. data/examples/dot_export_demo.rb +133 -0
  17. data/examples/hierarchical_graph.rb +19 -0
  18. data/examples/layout_constraints_demo.rb +272 -0
  19. data/examples/port_constraints_demo.rb +291 -0
  20. data/examples/self_loop_demo.rb +391 -0
  21. data/examples/simple_graph.rb +50 -0
  22. data/examples/spline_routing_demo.rb +235 -0
  23. data/exe/elkrb +8 -0
  24. data/lib/elkrb/cli.rb +224 -0
  25. data/lib/elkrb/commands/batch_command.rb +66 -0
  26. data/lib/elkrb/commands/convert_command.rb +130 -0
  27. data/lib/elkrb/commands/diagram_command.rb +208 -0
  28. data/lib/elkrb/commands/render_command.rb +52 -0
  29. data/lib/elkrb/commands/validate_command.rb +241 -0
  30. data/lib/elkrb/errors.rb +30 -0
  31. data/lib/elkrb/geometry/bezier.rb +163 -0
  32. data/lib/elkrb/geometry/dimension.rb +32 -0
  33. data/lib/elkrb/geometry/point.rb +68 -0
  34. data/lib/elkrb/geometry/rectangle.rb +86 -0
  35. data/lib/elkrb/geometry/vector.rb +67 -0
  36. data/lib/elkrb/graph/edge.rb +95 -0
  37. data/lib/elkrb/graph/graph.rb +90 -0
  38. data/lib/elkrb/graph/label.rb +45 -0
  39. data/lib/elkrb/graph/layout_options.rb +247 -0
  40. data/lib/elkrb/graph/node.rb +79 -0
  41. data/lib/elkrb/graph/node_constraints.rb +107 -0
  42. data/lib/elkrb/graph/port.rb +104 -0
  43. data/lib/elkrb/graphviz_wrapper.rb +133 -0
  44. data/lib/elkrb/layout/algorithm_registry.rb +57 -0
  45. data/lib/elkrb/layout/algorithms/base_algorithm.rb +208 -0
  46. data/lib/elkrb/layout/algorithms/box.rb +47 -0
  47. data/lib/elkrb/layout/algorithms/disco.rb +206 -0
  48. data/lib/elkrb/layout/algorithms/fixed.rb +32 -0
  49. data/lib/elkrb/layout/algorithms/force.rb +165 -0
  50. data/lib/elkrb/layout/algorithms/layered/cycle_breaker.rb +86 -0
  51. data/lib/elkrb/layout/algorithms/layered/layer_assigner.rb +96 -0
  52. data/lib/elkrb/layout/algorithms/layered/node_placer.rb +77 -0
  53. data/lib/elkrb/layout/algorithms/layered.rb +49 -0
  54. data/lib/elkrb/layout/algorithms/libavoid.rb +389 -0
  55. data/lib/elkrb/layout/algorithms/mrtree.rb +144 -0
  56. data/lib/elkrb/layout/algorithms/radial.rb +64 -0
  57. data/lib/elkrb/layout/algorithms/random.rb +43 -0
  58. data/lib/elkrb/layout/algorithms/rectpacking.rb +93 -0
  59. data/lib/elkrb/layout/algorithms/spore_compaction.rb +139 -0
  60. data/lib/elkrb/layout/algorithms/spore_overlap.rb +117 -0
  61. data/lib/elkrb/layout/algorithms/stress.rb +176 -0
  62. data/lib/elkrb/layout/algorithms/topdown_packing.rb +183 -0
  63. data/lib/elkrb/layout/algorithms/vertiflex.rb +174 -0
  64. data/lib/elkrb/layout/constraints/alignment_constraint.rb +150 -0
  65. data/lib/elkrb/layout/constraints/base_constraint.rb +72 -0
  66. data/lib/elkrb/layout/constraints/constraint_processor.rb +134 -0
  67. data/lib/elkrb/layout/constraints/fixed_position_constraint.rb +87 -0
  68. data/lib/elkrb/layout/constraints/layer_constraint.rb +71 -0
  69. data/lib/elkrb/layout/constraints/relative_position_constraint.rb +110 -0
  70. data/lib/elkrb/layout/edge_router.rb +935 -0
  71. data/lib/elkrb/layout/hierarchical_processor.rb +299 -0
  72. data/lib/elkrb/layout/label_placer.rb +338 -0
  73. data/lib/elkrb/layout/layout_engine.rb +170 -0
  74. data/lib/elkrb/layout/port_constraint_processor.rb +173 -0
  75. data/lib/elkrb/options/elk_padding.rb +94 -0
  76. data/lib/elkrb/options/k_vector.rb +100 -0
  77. data/lib/elkrb/options/k_vector_chain.rb +135 -0
  78. data/lib/elkrb/parsers/elkt_parser.rb +248 -0
  79. data/lib/elkrb/serializers/dot_serializer.rb +339 -0
  80. data/lib/elkrb/serializers/elkt_serializer.rb +236 -0
  81. data/lib/elkrb/version.rb +5 -0
  82. data/lib/elkrb.rb +509 -0
  83. data/sig/elkrb/constraints.rbs +114 -0
  84. data/sig/elkrb/geometry.rbs +61 -0
  85. data/sig/elkrb/graph.rbs +112 -0
  86. data/sig/elkrb/layout.rbs +107 -0
  87. data/sig/elkrb/options.rbs +81 -0
  88. data/sig/elkrb.rbs +32 -0
  89. metadata +179 -0
@@ -0,0 +1,112 @@
1
+ module Elkrb
2
+ module Graph
3
+ class LayoutOptions
4
+ attr_accessor algorithm: String?
5
+ attr_accessor direction: String?
6
+ attr_accessor spacing_node_node: Float?
7
+ attr_accessor spacing_edge_node: Float?
8
+ attr_accessor spacing_edge_edge: Float?
9
+ attr_accessor edge_routing: String?
10
+ attr_accessor padding: Hash[Symbol, Float]?
11
+ attr_accessor aspect_ratio: Float?
12
+
13
+ def self.from_hash: (Hash[String | Symbol, untyped] hash) -> LayoutOptions
14
+ def to_json: () -> String
15
+ def to_yaml: () -> String
16
+ end
17
+
18
+ class Label
19
+ attr_accessor id: String?
20
+ attr_accessor text: String?
21
+ attr_accessor x: Float?
22
+ attr_accessor y: Float?
23
+ attr_accessor width: Float?
24
+ attr_accessor height: Float?
25
+
26
+ def self.from_hash: (Hash[String | Symbol, untyped] hash) -> Label
27
+ def to_json: () -> String
28
+ def to_yaml: () -> String
29
+ end
30
+
31
+ class Port
32
+ attr_accessor id: String?
33
+ attr_accessor x: Float?
34
+ attr_accessor y: Float?
35
+ attr_accessor width: Float?
36
+ attr_accessor height: Float?
37
+ attr_accessor labels: Array[Label]?
38
+
39
+ def self.from_hash: (Hash[String | Symbol, untyped] hash) -> Port
40
+ def to_json: () -> String
41
+ def to_yaml: () -> String
42
+ end
43
+
44
+ class EdgeSection
45
+ attr_accessor id: String?
46
+ attr_accessor start_point: Hash[String, Float]?
47
+ attr_accessor end_point: Hash[String, Float]?
48
+ attr_accessor bend_points: Array[Hash[String, Float]]?
49
+ attr_accessor incoming_shape: String?
50
+ attr_accessor outgoing_shape: String?
51
+
52
+ def self.from_hash: (Hash[String | Symbol, untyped] hash) -> EdgeSection
53
+ def to_json: () -> String
54
+ def to_yaml: () -> String
55
+ end
56
+
57
+ class Edge
58
+ attr_accessor id: String?
59
+ attr_accessor sources: Array[String]?
60
+ attr_accessor targets: Array[String]?
61
+ attr_accessor labels: Array[Label]?
62
+ attr_accessor sections: Array[EdgeSection]?
63
+ attr_accessor layout_options: LayoutOptions?
64
+ attr_accessor properties: Hash[String, untyped]?
65
+
66
+ def self.from_hash: (Hash[String | Symbol, untyped] hash) -> Edge
67
+ def to_json: () -> String
68
+ def to_yaml: () -> String
69
+ end
70
+
71
+ class Node
72
+ attr_accessor id: String?
73
+ attr_accessor x: Float?
74
+ attr_accessor y: Float?
75
+ attr_accessor width: Float?
76
+ attr_accessor height: Float?
77
+ attr_accessor labels: Array[Label]?
78
+ attr_accessor ports: Array[Port]?
79
+ attr_accessor children: Array[Node]?
80
+ attr_accessor edges: Array[Edge]?
81
+ attr_accessor layout_options: LayoutOptions?
82
+ attr_accessor properties: Hash[String, untyped]?
83
+
84
+ def self.from_hash: (Hash[String | Symbol, untyped] hash) -> Node
85
+ def to_json: () -> String
86
+ def to_yaml: () -> String
87
+ def hierarchical?: () -> bool
88
+ def find_node: (String node_id) -> Node?
89
+ def all_nodes: () -> Array[Node]
90
+ end
91
+
92
+ class Graph
93
+ attr_accessor id: String?
94
+ attr_accessor x: Float?
95
+ attr_accessor y: Float?
96
+ attr_accessor width: Float?
97
+ attr_accessor height: Float?
98
+ attr_accessor children: Array[Node]?
99
+ attr_accessor edges: Array[Edge]?
100
+ attr_accessor layout_options: LayoutOptions?
101
+ attr_accessor properties: Hash[String, untyped]?
102
+
103
+ def self.from_hash: (Hash[String | Symbol, untyped] hash) -> Graph
104
+ def to_json: () -> String
105
+ def to_yaml: () -> String
106
+ def hierarchical?: () -> bool
107
+ def find_node: (String node_id) -> Node?
108
+ def all_nodes: () -> Array[Node]
109
+ def all_edges: () -> Array[Edge]
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,107 @@
1
+ module Elkrb
2
+ module Layout
3
+ type algorithmMetadata = {
4
+ name: String,
5
+ description: String,
6
+ category: String?,
7
+ supports_hierarchy: bool?
8
+ }
9
+
10
+ type algorithmInfo = {
11
+ id: String,
12
+ name: String,
13
+ description: String,
14
+ category: String,
15
+ supports_hierarchy: bool
16
+ }
17
+
18
+ class AlgorithmRegistry
19
+ def self.register: (String name, singleton(Algorithms::BaseAlgorithm) algorithm_class, ?algorithmMetadata metadata) -> void
20
+ def self.get: (String name) -> singleton(Algorithms::BaseAlgorithm)?
21
+ def self.available_algorithms: () -> Array[String]
22
+ def self.algorithm_info: (String name) -> algorithmInfo?
23
+ def self.all_algorithm_info: () -> Array[algorithmInfo]
24
+
25
+ private
26
+
27
+ def self.normalize_name: (String name) -> String
28
+ end
29
+
30
+ class LayoutEngine
31
+ def self.layout: (Hash[String | Symbol, untyped] | Graph::Graph graph, Hash[String | Symbol, untyped] options) -> Graph::Graph
32
+ def self.known_layout_algorithms: () -> Array[algorithmInfo]
33
+ def self.known_layout_options: () -> Array[untyped]
34
+
35
+ private
36
+
37
+ def self.convert_to_graph: (Hash[String | Symbol, untyped] hash) -> Graph::Graph
38
+ end
39
+
40
+ module Algorithms
41
+ class BaseAlgorithm
42
+ attr_reader options: Hash[String | Symbol, untyped]
43
+
44
+ def initialize: (Hash[String | Symbol, untyped] options) -> void
45
+ def layout: (Graph::Graph graph) -> Graph::Graph
46
+
47
+ private
48
+
49
+ def option: (String | Symbol key, ?untyped default) -> untyped
50
+ def node_spacing: () -> Float
51
+ def padding: () -> Hash[Symbol, Float]
52
+ def calculate_bounding_box: (Array[Graph::Node] nodes) -> Geometry::Rectangle
53
+ def apply_padding: (Graph::Graph graph) -> void
54
+ end
55
+
56
+ class Random < BaseAlgorithm
57
+ def layout: (Graph::Graph graph) -> Graph::Graph
58
+ end
59
+
60
+ class Fixed < BaseAlgorithm
61
+ def layout: (Graph::Graph graph) -> Graph::Graph
62
+ end
63
+
64
+ class Box < BaseAlgorithm
65
+ def layout: (Graph::Graph graph) -> Graph::Graph
66
+ end
67
+
68
+ class Force < BaseAlgorithm
69
+ DEFAULT_ITERATIONS: Integer
70
+ DEFAULT_REPULSION: Float
71
+ DEFAULT_TEMPERATURE: Float
72
+
73
+ def layout: (Graph::Graph graph) -> Graph::Graph
74
+
75
+ private
76
+
77
+ def iterations: () -> Integer
78
+ def repulsion: () -> Float
79
+ def temperature: () -> Float
80
+ def collect_edges: (Graph::Graph graph) -> Array[Graph::Edge]
81
+ def initialize_positions: (Graph::Graph graph) -> void
82
+ def apply_forces: (Graph::Graph graph, Float repulsion, Float temperature, Integer iteration, Integer total_iterations) -> void
83
+ def calculate_repulsive_forces: (Array[Graph::Node] nodes, Float repulsion) -> Hash[String, Geometry::Vector]
84
+ def calculate_attractive_forces: (Array[Graph::Edge] edges, Float temperature) -> Hash[String, Geometry::Vector]
85
+ def apply_displacement: (Array[Graph::Node] nodes, Hash[String, Geometry::Vector] forces, Float cooling_factor) -> void
86
+ end
87
+
88
+ class Stress < BaseAlgorithm
89
+ DEFAULT_ITERATIONS: Integer
90
+ DEFAULT_EPSILON: Float
91
+
92
+ def layout: (Graph::Graph graph) -> Graph::Graph
93
+
94
+ private
95
+
96
+ def iterations: () -> Integer
97
+ def epsilon: () -> Float
98
+ def collect_edges: (Graph::Graph graph) -> Array[Graph::Edge]
99
+ def initialize_positions: (Graph::Graph graph) -> void
100
+ def calculate_distances: (Graph::Graph graph) -> Hash[String, Hash[String, Float]]
101
+ def calculate_stress: (Graph::Graph graph, Hash[String, Hash[String, Float]] distances) -> Float
102
+ def optimize_positions: (Graph::Graph graph, Hash[String, Hash[String, Float]] distances) -> void
103
+ def euclidean_distance: (Graph::Node n1, Graph::Node n2) -> Float
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Elkrb
4
+ module Options
5
+ class ElkPadding
6
+ attr_reader left: Float
7
+ attr_reader top: Float
8
+ attr_reader right: Float
9
+ attr_reader bottom: Float
10
+
11
+ def initialize: (?left: Numeric, ?top: Numeric, ?right: Numeric, ?bottom: Numeric) -> void
12
+
13
+ def self.parse: (String | Hash[Symbol | String, Numeric] | ElkPadding value) -> ElkPadding
14
+
15
+ def self.from_hash: (Hash[Symbol | String, Numeric] hash) -> ElkPadding
16
+
17
+ def self.from_string: (String str) -> ElkPadding
18
+
19
+ def to_h: () -> Hash[Symbol, Float]
20
+
21
+ def to_s: () -> String
22
+
23
+ def ==: (untyped other) -> bool
24
+ end
25
+
26
+ class KVector
27
+ attr_reader x: Float
28
+ attr_reader y: Float
29
+
30
+ def initialize: (Numeric x, Numeric y) -> void
31
+
32
+ def self.parse: (String | Hash[Symbol | String, Numeric] | Array[Numeric] | KVector value) -> KVector
33
+
34
+ def self.from_hash: (Hash[Symbol | String, Numeric] hash) -> KVector
35
+
36
+ def self.from_array: (Array[Numeric] array) -> KVector
37
+
38
+ def self.from_string: (String str) -> KVector
39
+
40
+ def to_h: () -> Hash[Symbol, Float]
41
+
42
+ def to_a: () -> Array[Float]
43
+
44
+ def to_s: () -> String
45
+
46
+ def ==: (untyped other) -> bool
47
+ end
48
+
49
+ class KVectorChain
50
+ attr_reader vectors: Array[KVector]
51
+
52
+ def initialize: (?Array[Array[Numeric] | Hash[Symbol | String, Numeric] | KVector] vectors) -> void
53
+
54
+ def self.parse: (String | Array[Array[Numeric] | Hash[Symbol | String, Numeric] | KVector] | KVectorChain value) -> KVectorChain
55
+
56
+ def self.from_array: (Array[Array[Numeric] | Hash[Symbol | String, Numeric] | KVector] array) -> KVectorChain
57
+
58
+ def self.from_string: (String str) -> KVectorChain
59
+
60
+ def add: (Array[Numeric] | Hash[Symbol | String, Numeric] | KVector vector) -> self
61
+
62
+ alias << add
63
+
64
+ def []: (Integer index) -> KVector?
65
+
66
+ def size: () -> Integer
67
+
68
+ alias length size
69
+
70
+ def empty?: () -> bool
71
+
72
+ def each: () { (KVector) -> void } -> void
73
+
74
+ def to_a: () -> Array[KVector]
75
+
76
+ def to_s: () -> String
77
+
78
+ def ==: (untyped other) -> bool
79
+ end
80
+ end
81
+ end
data/sig/elkrb.rbs ADDED
@@ -0,0 +1,32 @@
1
+ module Elkrb
2
+ VERSION: String
3
+
4
+ class Error < StandardError
5
+ end
6
+
7
+ class UnsupportedConfigurationException < Error
8
+ attr_reader option: String?
9
+ attr_reader value: untyped
10
+
11
+ def initialize: (String message, ?option: String?, ?value: untyped) -> void
12
+ end
13
+
14
+ class ValidationError < Error
15
+ end
16
+
17
+ class AlgorithmNotFoundError < Error
18
+ attr_reader algorithm_name: String
19
+
20
+ def initialize: (String algorithm_name) -> void
21
+ end
22
+
23
+ def self.layout: (Graph::Graph | Hash[Symbol, untyped] graph, ?Hash[Symbol, untyped] options) -> Graph::Graph
24
+
25
+ def self.register_algorithm: (String name, Class algorithm_class, ?Hash[Symbol, untyped] metadata) -> void
26
+
27
+ def self.known_layout_algorithms: () -> Array[Hash[Symbol, untyped]]
28
+
29
+ def self.known_layout_options: () -> Hash[String, Hash[Symbol, untyped]]
30
+
31
+ def self.known_layout_categories: () -> Hash[String, Hash[Symbol, String]]
32
+ end
metadata ADDED
@@ -0,0 +1,179 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: elkrb
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Ribose Inc.
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2025-11-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: lutaml-model
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
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
+ - - "~>"
25
+ - !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'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: thor
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.4'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.4'
55
+ description: |
56
+ Pure Ruby implementation of the Eclipse Layout Kernel (ELK) providing automatic
57
+ layout of node-link diagrams. Supports all ELK algorithms.
58
+ email:
59
+ - open.source@ribose.com
60
+ executables:
61
+ - elkrb
62
+ extensions: []
63
+ extra_rdoc_files: []
64
+ files:
65
+ - ".rspec"
66
+ - ".rubocop.yml"
67
+ - Gemfile
68
+ - 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
+ - exe/elkrb
87
+ - lib/elkrb.rb
88
+ - lib/elkrb/cli.rb
89
+ - lib/elkrb/commands/batch_command.rb
90
+ - lib/elkrb/commands/convert_command.rb
91
+ - lib/elkrb/commands/diagram_command.rb
92
+ - lib/elkrb/commands/render_command.rb
93
+ - lib/elkrb/commands/validate_command.rb
94
+ - lib/elkrb/errors.rb
95
+ - lib/elkrb/geometry/bezier.rb
96
+ - lib/elkrb/geometry/dimension.rb
97
+ - lib/elkrb/geometry/point.rb
98
+ - lib/elkrb/geometry/rectangle.rb
99
+ - lib/elkrb/geometry/vector.rb
100
+ - lib/elkrb/graph/edge.rb
101
+ - lib/elkrb/graph/graph.rb
102
+ - lib/elkrb/graph/label.rb
103
+ - lib/elkrb/graph/layout_options.rb
104
+ - lib/elkrb/graph/node.rb
105
+ - lib/elkrb/graph/node_constraints.rb
106
+ - lib/elkrb/graph/port.rb
107
+ - lib/elkrb/graphviz_wrapper.rb
108
+ - lib/elkrb/layout/algorithm_registry.rb
109
+ - lib/elkrb/layout/algorithms/base_algorithm.rb
110
+ - lib/elkrb/layout/algorithms/box.rb
111
+ - lib/elkrb/layout/algorithms/disco.rb
112
+ - lib/elkrb/layout/algorithms/fixed.rb
113
+ - lib/elkrb/layout/algorithms/force.rb
114
+ - lib/elkrb/layout/algorithms/layered.rb
115
+ - lib/elkrb/layout/algorithms/layered/cycle_breaker.rb
116
+ - lib/elkrb/layout/algorithms/layered/layer_assigner.rb
117
+ - lib/elkrb/layout/algorithms/layered/node_placer.rb
118
+ - lib/elkrb/layout/algorithms/libavoid.rb
119
+ - lib/elkrb/layout/algorithms/mrtree.rb
120
+ - lib/elkrb/layout/algorithms/radial.rb
121
+ - lib/elkrb/layout/algorithms/random.rb
122
+ - lib/elkrb/layout/algorithms/rectpacking.rb
123
+ - lib/elkrb/layout/algorithms/spore_compaction.rb
124
+ - lib/elkrb/layout/algorithms/spore_overlap.rb
125
+ - lib/elkrb/layout/algorithms/stress.rb
126
+ - lib/elkrb/layout/algorithms/topdown_packing.rb
127
+ - lib/elkrb/layout/algorithms/vertiflex.rb
128
+ - lib/elkrb/layout/constraints/alignment_constraint.rb
129
+ - lib/elkrb/layout/constraints/base_constraint.rb
130
+ - lib/elkrb/layout/constraints/constraint_processor.rb
131
+ - lib/elkrb/layout/constraints/fixed_position_constraint.rb
132
+ - lib/elkrb/layout/constraints/layer_constraint.rb
133
+ - lib/elkrb/layout/constraints/relative_position_constraint.rb
134
+ - lib/elkrb/layout/edge_router.rb
135
+ - lib/elkrb/layout/hierarchical_processor.rb
136
+ - lib/elkrb/layout/label_placer.rb
137
+ - lib/elkrb/layout/layout_engine.rb
138
+ - lib/elkrb/layout/port_constraint_processor.rb
139
+ - lib/elkrb/options/elk_padding.rb
140
+ - lib/elkrb/options/k_vector.rb
141
+ - lib/elkrb/options/k_vector_chain.rb
142
+ - lib/elkrb/parsers/elkt_parser.rb
143
+ - lib/elkrb/serializers/dot_serializer.rb
144
+ - lib/elkrb/serializers/elkt_serializer.rb
145
+ - 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
+ homepage: https://github.com/claricle/elkrb
153
+ licenses:
154
+ - BSD-2-Clause
155
+ metadata:
156
+ homepage_uri: https://github.com/claricle/elkrb
157
+ source_code_uri: https://github.com/claricle/elkrb
158
+ changelog_uri: https://github.com/claricle/elkrb
159
+ rubygems_mfa_required: 'true'
160
+ post_install_message:
161
+ rdoc_options: []
162
+ require_paths:
163
+ - lib
164
+ required_ruby_version: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ version: 3.0.0
169
+ required_rubygems_version: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ requirements: []
175
+ rubygems_version: 3.5.22
176
+ signing_key:
177
+ specification_version: 4
178
+ summary: 'ElkRb: Ruby implementation of Eclipse Layout Kernel (ELK)'
179
+ test_files: []