foobara-util 0.0.7 → 0.0.9

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 (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: []