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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 983ed9bbc18f085f8b33609ff13c6794db8140e3
4
- data.tar.gz: e08a4102017038fc28cb4205ab16cb74e14f271f
2
+ SHA256:
3
+ metadata.gz: 7b7a7f474704898d007927e3ffee77173219edd492411ea0275db0225f7a2509
4
+ data.tar.gz: f4404b3ec404c3de2597ffff5d2759151d246c1263c4d73ae746adda7b454eca
5
5
  SHA512:
6
- metadata.gz: 1f2f63eed3a6779330e6e5b3d6200100df1fd1046a8956d45215073ddf84b42b187c079452ac1b96aeb7bf5842c4a0aacbaadda25bdcc006348ffd39731c0667
7
- data.tar.gz: 537c350faa79e346cbd2668dd4e1b68f0850d72b1bc8afc4178af9076d3659451d21e4bf3879291bd4461aaa37b3629ed0e03b3d82fcd9495776e80b031ace5d
6
+ metadata.gz: 8269e1e0bf6649ad7a2dc01b10031a1fd144b13edd861a542347a7adbd144fd01b8dcae3ec41118fafe8b0d9284b002d6c05cbe2438fc464d144a321742f4549
7
+ data.tar.gz: 2046b5827342f80cbb7073dc0ba70d420abbbf99341210e7ec302405142f9d26ad5fde5265d26c4753233339fb5a38e5726a4c6735092d55083f7da549a952bf
@@ -1,5 +1,4 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - 2.3.1
5
- before_install: gem install bundler -v 1.13.6
4
+ - 2.6.2
data/Gemfile CHANGED
@@ -3,5 +3,5 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in tukey.gemspec
4
4
  gemspec
5
5
 
6
- gem 'pry', '~> 0.10.4'
6
+ gem 'pry', '~> 0.12.2'
7
7
  gem 'pry-coolline', '~> 0.2.5'
@@ -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(id: id, label: label.deep_dup)) do |set, parent_set|
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 label.id <=> other.label.id if label.id <=> other.label.id
202
- return data <=> other.data if data.is_a?(Numeric) && other.data.is_a?(Numeric)
203
- data.size <=> other.data.size
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
- values = [reducable_values].flatten.compact
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 combine(other_data_set, operator)
264
- combined_data_set = dup
265
- if data_array? && other_data_set.data_array?
266
- combined_data_set.data = combine_data_array(other_data_set.children, operator)
267
- elsif !data_array? && !other_data_set.data_array?
268
- combined_data_set.data = combine_data_value(other_data_set.value, operator)
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
- fail ArgumentError, "Can't combine array DataSet with value DataSet"
282
+ self.data = yield(value, self)
271
283
  end
272
- combined_data_set
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
@@ -1,3 +1,3 @@
1
1
  module Tukey
2
- VERSION = "2.0.0"
2
+ VERSION = "2.2.0"
3
3
  end
@@ -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.13"
25
- spec.add_development_dependency "rake", "~> 10.0"
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.0.0
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: 2017-01-24 00:00:00.000000000 Z
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: '1.13'
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: '1.13'
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: '10.0'
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: '10.0'
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: '3.0'
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: '3.0'
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.5.1
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