flex-cartesian 0.1.4 → 0.1.5
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 +4 -4
- metadata +1 -2
- data/lib/golden.rb +0 -137
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 365e591e60a0c174cbfec4f2b80cf1e6f2cd6e2c57b27be341fc16bf10a6ac98
|
4
|
+
data.tar.gz: 86030f2e3c14e8bb2e9042bcf6b639211ab65a24095d158c15f002047d7d3c99
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 69e18d211995c7f5f5325fe0146bcf580bcbee923444aa524ec8ac13e773264d8b3fe66f8dcaed84f2b29409c9b089b00d5f4a19f7f0b74fbf25f8ed3936ba16
|
7
|
+
data.tar.gz: 2395bf3d93663c0d39ea8126498b68c8e02f805ee2183387071f278f1bf8bddf44822ac80ff41bce33e88732959ff9c79017ceeea69f19609b1818e2fdf86d3f
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flex-cartesian
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yury Rassokhin
|
@@ -64,7 +64,6 @@ files:
|
|
64
64
|
- LICENSE
|
65
65
|
- README.md
|
66
66
|
- lib/flex-cartesian.rb
|
67
|
-
- lib/golden.rb
|
68
67
|
homepage: https://github.com/Yuri-Rassokhin/flex-cartesian
|
69
68
|
licenses:
|
70
69
|
- GPL-3.0
|
data/lib/golden.rb
DELETED
@@ -1,137 +0,0 @@
|
|
1
|
-
require 'ostruct'
|
2
|
-
require 'progressbar'
|
3
|
-
require 'colorize'
|
4
|
-
require 'json'
|
5
|
-
require 'yaml'
|
6
|
-
|
7
|
-
module FlexOutput
|
8
|
-
def output(separator: " | ", colorize: false, align: false)
|
9
|
-
return puts "(empty struct)" unless respond_to?(:members) && respond_to?(:values)
|
10
|
-
|
11
|
-
values_list = members.zip(values.map { |v| v.inspect })
|
12
|
-
|
13
|
-
# calculate widths, if align required
|
14
|
-
widths = align ? values_list.map { |k, v| [k.to_s.size, v.size].max } : []
|
15
|
-
|
16
|
-
line = values_list.each_with_index.map do |(_, val), i|
|
17
|
-
str = val.to_s
|
18
|
-
str = str.ljust(widths[i]) if align
|
19
|
-
colorize ? str.colorize(:cyan) : str
|
20
|
-
end
|
21
|
-
|
22
|
-
puts line.join(separator)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
class FlexCartesian
|
27
|
-
attr :dimensions
|
28
|
-
|
29
|
-
def initialize(dimensions = nil)
|
30
|
-
@dimensions = dimensions
|
31
|
-
end
|
32
|
-
|
33
|
-
def cartesian(dims = nil, lazy: false)
|
34
|
-
dimensions = dims || @dimensions
|
35
|
-
return nil unless dimensions.is_a?(Hash)
|
36
|
-
|
37
|
-
names = dimensions.keys
|
38
|
-
values = dimensions.values.map { |dim| dim.is_a?(Enumerable) ? dim.to_a : [dim] }
|
39
|
-
|
40
|
-
return to_enum(:cartesian, dims, lazy: lazy) unless block_given?
|
41
|
-
return if values.any?(&:empty?)
|
42
|
-
|
43
|
-
struct_class = Struct.new(*names).tap { |sc| sc.include(FlexOutput) }
|
44
|
-
|
45
|
-
base = values.first.product(*values[1..])
|
46
|
-
enum = lazy ? base.lazy : base
|
47
|
-
|
48
|
-
enum.each do |combo|
|
49
|
-
yield struct_class.new(*combo)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def size(dims = nil)
|
54
|
-
dimensions = dims || @dimensions
|
55
|
-
return 0 unless dimensions.is_a?(Hash)
|
56
|
-
|
57
|
-
values = dimensions.values.map { |dim| dim.is_a?(Enumerable) ? dim.to_a : [dim] }
|
58
|
-
return 0 if values.any?(&:empty?)
|
59
|
-
|
60
|
-
values.map(&:size).inject(1, :*)
|
61
|
-
end
|
62
|
-
|
63
|
-
def to_a(limit: nil)
|
64
|
-
result = []
|
65
|
-
cartesian do |v|
|
66
|
-
result << v
|
67
|
-
break if limit && result.size >= limit
|
68
|
-
end
|
69
|
-
result
|
70
|
-
end
|
71
|
-
|
72
|
-
def progress_each(dims = nil, lazy: false, title: "Processing")
|
73
|
-
total = size(dims)
|
74
|
-
bar = ProgressBar.create(title: title, total: total, format: '%t [%B] %p%% %e')
|
75
|
-
|
76
|
-
cartesian(dims, lazy: lazy) do |v|
|
77
|
-
yield v
|
78
|
-
bar.increment
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
def output(separator: " | ", colorize: false, align: false, format: :plain, limit: nil)
|
83
|
-
rows = []
|
84
|
-
cartesian do |v|
|
85
|
-
rows << v
|
86
|
-
break if limit && rows.size >= limit
|
87
|
-
end
|
88
|
-
return if rows.empty?
|
89
|
-
|
90
|
-
headers = rows.first.members.map(&:to_s)
|
91
|
-
|
92
|
-
# Get widths
|
93
|
-
widths = align ? headers.to_h { |h|
|
94
|
-
[h, [h.size, *rows.map { |r| fmt_cell(r[h], false).size }].max]
|
95
|
-
} : {}
|
96
|
-
|
97
|
-
# Title
|
98
|
-
case format
|
99
|
-
when :markdown
|
100
|
-
puts "| " + headers.map { |h| h.ljust(widths[h] || h.size) }.join(" | ") + " |"
|
101
|
-
puts "|-" + headers.map { |h| "-" * (widths[h] || h.size) }.join("-|-") + "-|"
|
102
|
-
when :csv
|
103
|
-
puts headers.join(",")
|
104
|
-
else
|
105
|
-
puts headers.map { |h| fmt_cell(h, colorize, widths[h]) }.join(separator)
|
106
|
-
end
|
107
|
-
|
108
|
-
# Rows
|
109
|
-
rows.each do |row|
|
110
|
-
line = headers.map { |h| fmt_cell(row[h], colorize, widths[h]) }
|
111
|
-
puts format == :csv ? line.join(",") : line.join(separator)
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
def self.from_json(path)
|
116
|
-
data = JSON.parse(File.read(path), symbolize_names: true)
|
117
|
-
new(data)
|
118
|
-
end
|
119
|
-
|
120
|
-
def self.from_yaml(path)
|
121
|
-
data = YAML.safe_load(File.read(path), symbolize_names: true)
|
122
|
-
new(data)
|
123
|
-
end
|
124
|
-
|
125
|
-
private
|
126
|
-
|
127
|
-
def fmt_cell(value, colorize, width = nil)
|
128
|
-
str = case value
|
129
|
-
when String then value # rows - without inspect
|
130
|
-
else value.inspect # the rest is good to inspect
|
131
|
-
end
|
132
|
-
str = str.ljust(width) if width
|
133
|
-
colorize ? str.colorize(:cyan) : str
|
134
|
-
end
|
135
|
-
|
136
|
-
end
|
137
|
-
|