foobara-util 0.0.7 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/lib/foobara/util/tree.rb +144 -0
  4. metadata +5 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 85a512d24b80d3764d64162a9a0307980b4c5b4208fd446ca5eb61e45c12e9d7
4
- data.tar.gz: 1830f90dc6c33596d1a66c4971f148ebbb16846e2d1bb07340598ecc2ff38908
3
+ metadata.gz: 6b4070d73b35f4d78f9eed62ed1aa1e717beed8049881885c92291f1ae01c055
4
+ data.tar.gz: a9a7185f19e1e64655a1460444229de4ba94c2e1f15050f59063aa01d4b9f47e
5
5
  SHA512:
6
- metadata.gz: aa086713f6a0d871cd43d1884d66b1c009073853cdcaabbbee1b6b2c5099b08c34652dde426030d868267307313df912b549965d40a1d3d07c1724534e716304
7
- data.tar.gz: 8a1e198c1b944adc46a54d67981bd724b19e206fec5395eca350a0dffa4a6ab996eb2ad339cb379ec76848d00d41f36c148fcefe6b7ae3ecfe48a5dc53e2365a
6
+ metadata.gz: bfdd2d199b0c13951d122851d7a2dcd0820de3ab75e152bf47f1cc663fe85677c4f9fa82b01531a9dd84210b1ce9ef19561a0a7bcc365406223c0b7a74b147d0
7
+ data.tar.gz: 14ec8a7ac063c58018920029fce654ecadc4902fcb2844fcfae4a846ddd7f218c5d2d9f43e8c5fb75869c43c0cc6d91e882c4cb011bc0cbbf8414e337a7e6f19
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## [0.0.9] - 2025-01-07
2
+
3
+ - Bump Ruby to 3.4.1
4
+
5
+ ## [0.0.8] - 2024-12-05
6
+
7
+ * Add .print_tree for displaying dependencies/graphs via ASCII art
8
+
1
9
  ## [0.0.7] - 2024-11-30
2
10
 
3
11
  * Handle kebab-cased strings as expected in .classify
@@ -0,0 +1,144 @@
1
+ module Foobara
2
+ module Util
3
+ class SubTree
4
+ attr_accessor :value, :parent_tree, :to_parent
5
+
6
+ def initialize(value, to_parent = nil, &block)
7
+ self.value = value
8
+ self.to_parent = to_parent.nil? ? block : to_parent.to_proc
9
+ end
10
+
11
+ def root?
12
+ parent_tree.is_a?(Tree)
13
+ end
14
+
15
+ def children_trees
16
+ @children_trees ||= []
17
+ end
18
+
19
+ def add(object)
20
+ return if include?(object)
21
+
22
+ parent = to_parent.call(object)
23
+
24
+ parent_node = if parent
25
+ node_for(parent) || add(parent)
26
+ else
27
+ self
28
+ end
29
+
30
+ child_tree = SubTree.new(object, to_parent)
31
+ child_tree.parent_tree = parent_node
32
+ parent_node.children_trees << child_tree
33
+
34
+ child_tree
35
+ end
36
+
37
+ def node_for(value)
38
+ return self if value == self.value
39
+
40
+ children_trees.each do |child|
41
+ node = child.node_for(value)
42
+ return node if node
43
+ end
44
+
45
+ nil
46
+ end
47
+
48
+ def include?(value)
49
+ !!node_for(value)
50
+ end
51
+
52
+ # TODO: try to break this up a bit
53
+ def to_s(to_name, padding: "", last_child: true)
54
+ output = StringIO.new
55
+ name = to_name.call(value)
56
+
57
+ padding = puts_box(output, name, padding, last_child)
58
+
59
+ children = children_trees.sort_by { |child_tree| to_name.call(child_tree.value) }
60
+ last = children.last
61
+
62
+ children.each do |child_tree|
63
+ output.puts child_tree.to_s(to_name, padding:, last_child: child_tree == last)
64
+ end
65
+
66
+ output.string
67
+ end
68
+
69
+ private
70
+
71
+ def puts_box(output, name, padding, last_child)
72
+ name_size = name.size + 1
73
+ name_size_left = name_size / 2
74
+ name_size_right = name_size - name_size_left
75
+
76
+ bottom_connector = children_trees.any? ? "┬" : "─"
77
+
78
+ if root?
79
+ output.puts "╭#{"─" * (name.size + 2)}╮"
80
+ output.puts "│ #{name} │"
81
+ output.puts "╰#{"─" * name_size_left}#{bottom_connector}#{"─" * name_size_right}╯"
82
+ else
83
+ padding += " "
84
+
85
+ connector = last_child ? "└" : "├"
86
+ padding_end = last_child ? " " : "│ "
87
+
88
+ output.print padding
89
+ output.print "│ "
90
+
91
+ output.puts "╭#{"─" * (name.size + 2)}╮"
92
+ output.print "#{padding}#{connector}"
93
+ output.puts "─┤ #{name} │"
94
+
95
+ padding += padding_end
96
+
97
+ output.puts "#{padding}╰#{"─" * name_size_left}#{bottom_connector}#{"─" * name_size_right}╯"
98
+ end
99
+
100
+ padding + (" " * (name_size / 2))
101
+ end
102
+ end
103
+
104
+ class Tree < SubTree
105
+ def initialize(data, to_parent = nil, &)
106
+ super(nil, to_parent, &)
107
+
108
+ data.each do |object|
109
+ add(object)
110
+ end
111
+ end
112
+
113
+ def to_s(to_name = nil, &block)
114
+ to_name = if to_name
115
+ to_name.to_proc
116
+ elsif block_given?
117
+ block
118
+ else
119
+ :to_s.to_proc
120
+ end
121
+
122
+ children_trees.map { |child| child.to_s(to_name) }.join("\n")
123
+ end
124
+ end
125
+
126
+ module_function
127
+
128
+ def print_tree(data, io: $stdout, to_name: nil, to_parent: nil)
129
+ data = data.to_a if data.is_a?(::Hash)
130
+
131
+ if to_name.nil? && to_parent.nil?
132
+ to_name = :first.to_proc
133
+ to_parent = proc do |object|
134
+ parent_name = object.last
135
+ data.find { |pair| pair.first == parent_name }
136
+ end
137
+ end
138
+
139
+ tree = Util::Tree.new(data, to_parent)
140
+
141
+ io.puts tree.to_s(to_name)
142
+ end
143
+ end
144
+ end
metadata CHANGED
@@ -1,16 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foobara-util
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miles Georgi
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-12-01 00:00:00.000000000 Z
10
+ date: 2025-01-07 00:00:00.000000000 Z
12
11
  dependencies: []
13
- description:
14
12
  email:
15
13
  - azimux@gmail.com
16
14
  executables: []
@@ -33,6 +31,7 @@ files:
33
31
  - lib/foobara/util/require.rb
34
32
  - lib/foobara/util/string.rb
35
33
  - lib/foobara/util/structured.rb
34
+ - lib/foobara/util/tree.rb
36
35
  homepage: https://github.com/foobara/util
37
36
  licenses:
38
37
  - Apache-2.0
@@ -42,7 +41,6 @@ metadata:
42
41
  source_code_uri: https://github.com/foobara/util
43
42
  changelog_uri: https://github.com/foobara/util/blob/main/CHANGELOG.md
44
43
  rubygems_mfa_required: 'true'
45
- post_install_message:
46
44
  rdoc_options: []
47
45
  require_paths:
48
46
  - lib
@@ -50,15 +48,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
50
48
  requirements:
51
49
  - - ">="
52
50
  - !ruby/object:Gem::Version
53
- version: 3.2.2
51
+ version: 3.4.0
54
52
  required_rubygems_version: !ruby/object:Gem::Requirement
55
53
  requirements:
56
54
  - - ">="
57
55
  - !ruby/object:Gem::Version
58
56
  version: '0'
59
57
  requirements: []
60
- rubygems_version: 3.5.23
61
- signing_key:
58
+ rubygems_version: 3.6.2
62
59
  specification_version: 4
63
60
  summary: Utility functions used across various Foobara projects
64
61
  test_files: []