tukey 2.0.0 → 2.2.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.
- checksums.yaml +5 -5
- data/.travis.yml +1 -2
- data/Gemfile +1 -1
- data/lib/tukey/data_set.rb +57 -53
- data/lib/tukey/version.rb +1 -1
- data/tukey.gemspec +3 -3
- metadata +9 -9
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 7b7a7f474704898d007927e3ffee77173219edd492411ea0275db0225f7a2509
|
|
4
|
+
data.tar.gz: f4404b3ec404c3de2597ffff5d2759151d246c1263c4d73ae746adda7b454eca
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8269e1e0bf6649ad7a2dc01b10031a1fd144b13edd861a542347a7adbd144fd01b8dcae3ec41118fafe8b0d9284b002d6c05cbe2438fc464d144a321742f4549
|
|
7
|
+
data.tar.gz: 2046b5827342f80cbb7073dc0ba70d420abbbf99341210e7ec302405142f9d26ad5fde5265d26c4753233339fb5a38e5726a4c6735092d55083f7da549a952bf
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/lib/tukey/data_set.rb
CHANGED
|
@@ -46,6 +46,10 @@ class DataSet
|
|
|
46
46
|
[]
|
|
47
47
|
end
|
|
48
48
|
|
|
49
|
+
def leafs
|
|
50
|
+
children.select(&:leaf?)
|
|
51
|
+
end
|
|
52
|
+
|
|
49
53
|
def siblings
|
|
50
54
|
return [] if parent.nil?
|
|
51
55
|
parent.children.reject { |c| c == self }
|
|
@@ -69,7 +73,7 @@ class DataSet
|
|
|
69
73
|
end
|
|
70
74
|
|
|
71
75
|
def oneling?
|
|
72
|
-
siblings.none?
|
|
76
|
+
leaf? ? siblings.none? : siblings.reject(&:leaf?).none?
|
|
73
77
|
end
|
|
74
78
|
|
|
75
79
|
def root?
|
|
@@ -127,8 +131,10 @@ class DataSet
|
|
|
127
131
|
#
|
|
128
132
|
def filter(leaf_label_id = nil, keep_leafs: false, orphan_strategy: :destroy, &block)
|
|
129
133
|
fail ArgumentError, 'No block and no leaf_label_id passed' if !block_given? && leaf_label_id.nil?
|
|
134
|
+
fail 'Cannot filter value DataSets' unless data_array?
|
|
135
|
+
return self.dup if self.data.empty?
|
|
130
136
|
|
|
131
|
-
self.data.each_with_object(DataSet.new(
|
|
137
|
+
self.data.each_with_object(DataSet.new(label: label.deep_dup, data: nil, parent: parent, id: id)) do |set, parent_set|
|
|
132
138
|
if block_given?
|
|
133
139
|
condition_met = yield(parent_set, set)
|
|
134
140
|
else
|
|
@@ -145,7 +151,7 @@ class DataSet
|
|
|
145
151
|
deep_filter_result = set_dup.filter(leaf_label_id, keep_leafs: keep_leafs, orphan_strategy: orphan_strategy, &block)
|
|
146
152
|
|
|
147
153
|
# Here is where either the taking along or adopting of nodes happens
|
|
148
|
-
if deep_filter_result.data
|
|
154
|
+
if deep_filter_result.data && !deep_filter_result.data.empty?
|
|
149
155
|
# Filtering underlying children and adding the potential filter result to parent.
|
|
150
156
|
parent_set.add_item(deep_filter_result) if condition_met.nil?
|
|
151
157
|
|
|
@@ -156,13 +162,11 @@ class DataSet
|
|
|
156
162
|
elsif condition_met.nil? && set.leaf?
|
|
157
163
|
parent_set.add_item(set_dup) if keep_leafs
|
|
158
164
|
end
|
|
159
|
-
|
|
160
|
-
parent_set
|
|
161
165
|
end
|
|
162
166
|
end
|
|
163
167
|
|
|
164
168
|
def find(subtree_id = nil, &block)
|
|
165
|
-
return super if block_given?
|
|
169
|
+
return super if block_given? # It recursively searches descendants for data set matching block
|
|
166
170
|
return self if id == subtree_id
|
|
167
171
|
return nil unless data_array?
|
|
168
172
|
data.each do |child|
|
|
@@ -198,9 +202,11 @@ class DataSet
|
|
|
198
202
|
return 0 if data == other.data && label == other.label
|
|
199
203
|
return 1 if data && other.data.nil?
|
|
200
204
|
return -1 if data.nil? && other.data
|
|
201
|
-
return
|
|
202
|
-
return
|
|
203
|
-
|
|
205
|
+
return 1 if data_array? && !other.data_array?
|
|
206
|
+
return -1 if !data_array? && other.data_array?
|
|
207
|
+
return label.id <=> other.label.id if label && other.label && label.id <=> other.label.id
|
|
208
|
+
return data.size <=> other.data.size if data_array? && other.data_array?
|
|
209
|
+
data <=> other.data
|
|
204
210
|
end
|
|
205
211
|
|
|
206
212
|
# == is used for comparison of two instances directly
|
|
@@ -243,7 +249,10 @@ class DataSet
|
|
|
243
249
|
end
|
|
244
250
|
|
|
245
251
|
def sum
|
|
246
|
-
|
|
252
|
+
# Leafs are considered a sum of their underlying data_sets,
|
|
253
|
+
# therefore we can just sum the leafs if present.
|
|
254
|
+
return value == [] ? nil : value if leaf? # TODO: Make redundant by not allowing [] in `data` to begin with
|
|
255
|
+
values = (leafs.any? ? leafs.map(&:value) : children.map(&:sum)).compact
|
|
247
256
|
return nil if values.empty?
|
|
248
257
|
values.inject(&:+)
|
|
249
258
|
end
|
|
@@ -260,16 +269,46 @@ class DataSet
|
|
|
260
269
|
set.data
|
|
261
270
|
end
|
|
262
271
|
|
|
263
|
-
def
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
272
|
+
def transform_labels!(&block)
|
|
273
|
+
self.label = yield(label, self)
|
|
274
|
+
data.each { |d| d.transform_labels!(&block) } if data_array?
|
|
275
|
+
self
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
def transform_values!(&block)
|
|
279
|
+
if data_array?
|
|
280
|
+
self.data = data.map { |d| d.transform_values!(&block) }
|
|
269
281
|
else
|
|
270
|
-
|
|
282
|
+
self.data = yield(value, self)
|
|
271
283
|
end
|
|
272
|
-
|
|
284
|
+
self
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
def merge(other_data_set, &block)
|
|
288
|
+
merged_data_set = dup
|
|
289
|
+
if data_array? && other_data_set.data_array? # Merge sets
|
|
290
|
+
other_children = other_data_set.children.dup
|
|
291
|
+
merged_children = children.map do |child|
|
|
292
|
+
other_child = other_children.find { |ods| ods.label == child.label }
|
|
293
|
+
if other_child
|
|
294
|
+
other_children.delete(other_child)
|
|
295
|
+
child.merge(other_child, &block)
|
|
296
|
+
else
|
|
297
|
+
child
|
|
298
|
+
end
|
|
299
|
+
end
|
|
300
|
+
merged_children += other_children # The remaining other children (without matching child in this data set)
|
|
301
|
+
merged_data_set.data = merged_children
|
|
302
|
+
elsif !data_array? && !other_data_set.data_array? # Merge values
|
|
303
|
+
if block_given? # Combine data using block
|
|
304
|
+
merged_data_set.data = yield(label, value, other_data_set.value)
|
|
305
|
+
else # Simply overwrite data with other data
|
|
306
|
+
merged_data_set.data = other_data_set.value
|
|
307
|
+
end
|
|
308
|
+
else
|
|
309
|
+
fail ArgumentError, "Can't merge array DataSet with value DataSet"
|
|
310
|
+
end
|
|
311
|
+
merged_data_set
|
|
273
312
|
end
|
|
274
313
|
|
|
275
314
|
def data_array?
|
|
@@ -310,41 +349,6 @@ class DataSet
|
|
|
310
349
|
def dup_value(value)
|
|
311
350
|
value.is_a?(Numeric) ? value : value.dup
|
|
312
351
|
end
|
|
313
|
-
|
|
314
|
-
def combine_data_array(other_children, operator)
|
|
315
|
-
other_children = other_children.dup
|
|
316
|
-
result = children.map do |child|
|
|
317
|
-
other_child = other_children.find { |ods| ods.label == child.label }
|
|
318
|
-
if other_child
|
|
319
|
-
other_children.delete(other_child)
|
|
320
|
-
child.combine(other_child, operator)
|
|
321
|
-
else
|
|
322
|
-
child
|
|
323
|
-
end
|
|
324
|
-
end
|
|
325
|
-
result += other_children # The remaining other children (without matching child in this data set)
|
|
326
|
-
result
|
|
327
|
-
end
|
|
328
|
-
|
|
329
|
-
def combine_data_value(other_value, operator)
|
|
330
|
-
own_value = value
|
|
331
|
-
|
|
332
|
-
# Always return nil if both values are nil (prevents summed data sets of being wrongly considered unempty and thus not hidden)
|
|
333
|
-
return nil if own_value.nil? && other_value.nil?
|
|
334
|
-
|
|
335
|
-
case operator.to_sym
|
|
336
|
-
when :+, :-
|
|
337
|
-
# When adding or subtracting treat nil (unknown) values as zero, instead of returning nil as summation result
|
|
338
|
-
own_value ||= 0.0
|
|
339
|
-
other_value ||= 0.0
|
|
340
|
-
when :/
|
|
341
|
-
# Prevent division by zero resulting in NaN/Infinity values
|
|
342
|
-
other_value = nil if other_value&.zero?
|
|
343
|
-
end
|
|
344
|
-
|
|
345
|
-
return nil if own_value.nil? || other_value.nil?
|
|
346
|
-
own_value.send(operator, other_value)
|
|
347
|
-
end
|
|
348
352
|
end
|
|
349
353
|
|
|
350
354
|
class CannotAddToNonEnumerableData < StandardError
|
data/lib/tukey/version.rb
CHANGED
data/tukey.gemspec
CHANGED
|
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
|
|
|
21
21
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
22
22
|
spec.require_paths = ["lib"]
|
|
23
23
|
|
|
24
|
-
spec.add_development_dependency "bundler", "~> 1.
|
|
25
|
-
spec.add_development_dependency "rake", "~>
|
|
26
|
-
spec.add_development_dependency "rspec", "~> 3.0"
|
|
24
|
+
spec.add_development_dependency "bundler", "~> 1.17.2"
|
|
25
|
+
spec.add_development_dependency "rake", "~> 12.3.2"
|
|
26
|
+
spec.add_development_dependency "rspec", "~> 3.8.0"
|
|
27
27
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: tukey
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Achilleas Buisman
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2019-05-02 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -16,42 +16,42 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version:
|
|
19
|
+
version: 1.17.2
|
|
20
20
|
type: :development
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
24
|
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version:
|
|
26
|
+
version: 1.17.2
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: rake
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
31
|
- - "~>"
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version:
|
|
33
|
+
version: 12.3.2
|
|
34
34
|
type: :development
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
38
|
- - "~>"
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
|
-
version:
|
|
40
|
+
version: 12.3.2
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: rspec
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
44
44
|
requirements:
|
|
45
45
|
- - "~>"
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
|
-
version:
|
|
47
|
+
version: 3.8.0
|
|
48
48
|
type: :development
|
|
49
49
|
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
52
|
- - "~>"
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
|
-
version:
|
|
54
|
+
version: 3.8.0
|
|
55
55
|
description: Tukey provides DataSets which can be put in a tree. This way you can
|
|
56
56
|
store partial results of calculations or other data and, for example, create charts,
|
|
57
57
|
tables or other presentations.
|
|
@@ -98,7 +98,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
98
98
|
version: '0'
|
|
99
99
|
requirements: []
|
|
100
100
|
rubyforge_project:
|
|
101
|
-
rubygems_version: 2.
|
|
101
|
+
rubygems_version: 2.7.6
|
|
102
102
|
signing_key:
|
|
103
103
|
specification_version: 4
|
|
104
104
|
summary: DataSets for putting data in a tree of sets
|