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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. metadata +1 -2
  3. data/lib/golden.rb +0 -137
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7f3e10474552a7bfa80b189b46769b1dc621468b9a068918e42cce44d14879ab
4
- data.tar.gz: 1dd5bea186d416ebb39bc6f74d268d271516cbbf945a9c3fbfa97d4682bf85bc
3
+ metadata.gz: 365e591e60a0c174cbfec4f2b80cf1e6f2cd6e2c57b27be341fc16bf10a6ac98
4
+ data.tar.gz: 86030f2e3c14e8bb2e9042bcf6b639211ab65a24095d158c15f002047d7d3c99
5
5
  SHA512:
6
- metadata.gz: eefbe47d1db3cf1e4316502de159d68963c633d72ea84fc38a378eefa235747845b8d7496d26534eeed6986e2e16cf9728366a1b3015e6e509f0c57a8ace5b3a
7
- data.tar.gz: d4eaf78c1280145ad57841a984bde38b0f5f25b69845a59300877ed04ad6c48a2f325a144b6ff97aad6933fb9ed0b36bdc9b6c0c8156126fffd4a8c1d55aca32
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
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
-