tresse 1.0.0 → 1.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 +4 -4
- data/CHANGELOG.md +25 -0
- data/lib/tresse.rb +64 -38
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 80b7de6139b9cc1d3e7bacd2f86b7c6b0685d431
|
4
|
+
data.tar.gz: 673e625a9a20149d09120348e2ab299a06605c36
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 073fe8f17b480a03c32c1a22443ad3024f99c5eeff3da696d9e2313899e447f65daf6104af0f601943d1fb0ec618091ee23d75087a33fb6b3ea1f6ff151b1ca1
|
7
|
+
data.tar.gz: dd3631c389f68d0855a9f73b57f183a3a4c93a7565dc2c57d82a170ca369acbbd211da856310ca8e5242e92917ffab0c13b07d2986f01d30464cdd600bd69050
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,31 @@
|
|
2
2
|
# CHANGELOG.md
|
3
3
|
|
4
4
|
|
5
|
+
## tresse 1.2.0 released 2019-09-17
|
6
|
+
|
7
|
+
* Re-raise errors at reduction stage
|
8
|
+
|
9
|
+
|
10
|
+
## tresse 1.1.3 released 2019-09-17
|
11
|
+
|
12
|
+
* Fix ready for reduction check (prevent it from hanging)
|
13
|
+
|
14
|
+
|
15
|
+
## tresse 1.1.2 released 2019-09-17
|
16
|
+
|
17
|
+
* Let Tresse::Group#flatten accept non-arrays
|
18
|
+
|
19
|
+
|
20
|
+
## tresse 1.1.1 released 2019-09-17
|
21
|
+
|
22
|
+
* Refine Tresse::Group#source_each
|
23
|
+
|
24
|
+
|
25
|
+
## tresse 1.1.0 released 2019-09-17
|
26
|
+
|
27
|
+
* Introduce Tresse::Group#source_each(collection, &block)
|
28
|
+
|
29
|
+
|
5
30
|
## tresse 1.0.0 released 2019-09-16
|
6
31
|
|
7
32
|
* #source / #map / #reduce
|
data/lib/tresse.rb
CHANGED
@@ -4,7 +4,7 @@ require 'thread'
|
|
4
4
|
|
5
5
|
module Tresse
|
6
6
|
|
7
|
-
VERSION = '1.
|
7
|
+
VERSION = '1.2.0'
|
8
8
|
|
9
9
|
class << self
|
10
10
|
|
@@ -12,15 +12,6 @@ module Tresse
|
|
12
12
|
|
13
13
|
@work_queue = Queue.new
|
14
14
|
@work_threads = 8.times.collect { |i| make_work_thread }
|
15
|
-
|
16
|
-
@on_error =
|
17
|
-
lambda do |where, err|
|
18
|
-
puts "-" * 80
|
19
|
-
p where
|
20
|
-
p err
|
21
|
-
puts err.backtrace
|
22
|
-
puts "-" * 80
|
23
|
-
end
|
24
15
|
end
|
25
16
|
|
26
17
|
def enqueue(batch)
|
@@ -30,11 +21,6 @@ module Tresse
|
|
30
21
|
batch.group
|
31
22
|
end
|
32
23
|
|
33
|
-
def on_error(&block)
|
34
|
-
|
35
|
-
@on_error = block
|
36
|
-
end
|
37
|
-
|
38
24
|
def max_work_thread_count
|
39
25
|
|
40
26
|
@work_threads.size
|
@@ -73,7 +59,7 @@ module Tresse
|
|
73
59
|
|
74
60
|
rescue => err
|
75
61
|
|
76
|
-
|
62
|
+
batch.error = err
|
77
63
|
end
|
78
64
|
end
|
79
65
|
end
|
@@ -83,11 +69,19 @@ module Tresse
|
|
83
69
|
self.init
|
84
70
|
|
85
71
|
|
72
|
+
def self.call_block(block, args)
|
73
|
+
|
74
|
+
block.call(*args[0, block.arity.abs])
|
75
|
+
end
|
76
|
+
|
77
|
+
|
86
78
|
class Batch
|
87
79
|
|
88
80
|
attr_reader :group
|
89
81
|
attr_reader :map_index
|
82
|
+
attr_reader :completed
|
90
83
|
attr_accessor :value
|
84
|
+
attr_reader :error
|
91
85
|
|
92
86
|
def initialize(group, block_or_group)
|
93
87
|
|
@@ -96,6 +90,7 @@ module Tresse
|
|
96
90
|
|
97
91
|
@map_index = -1
|
98
92
|
@value = nil
|
93
|
+
@completed = false
|
99
94
|
end
|
100
95
|
|
101
96
|
def process
|
@@ -106,27 +101,31 @@ module Tresse
|
|
106
101
|
|
107
102
|
def source
|
108
103
|
|
109
|
-
|
110
|
-
args = args[0, @bog.method(:call).arity]
|
111
|
-
|
112
|
-
@value = @bog.call(*args)
|
104
|
+
@value = Tresse.call_block(@bog, [ group ] + [ nil ] * 7)
|
113
105
|
end
|
114
106
|
|
115
107
|
def map(type, block)
|
116
108
|
|
117
|
-
|
118
|
-
args = args[0, block.method(:call).arity.abs]
|
119
|
-
|
120
|
-
r = block.call(*args)
|
109
|
+
r = Tresse.call_block(block, [ @value, self ])
|
121
110
|
|
122
111
|
@value = r if type == :map
|
123
112
|
end
|
113
|
+
|
114
|
+
def complete
|
115
|
+
|
116
|
+
@completed = true
|
117
|
+
end
|
118
|
+
|
119
|
+
def error=(err)
|
120
|
+
|
121
|
+
@error = err
|
122
|
+
@group.send(:receive, self)
|
123
|
+
end
|
124
124
|
end
|
125
125
|
|
126
126
|
class Group
|
127
127
|
|
128
128
|
attr_accessor :name
|
129
|
-
#attr_reader :batches
|
130
129
|
|
131
130
|
def initialize(name=nil)
|
132
131
|
|
@@ -137,18 +136,29 @@ module Tresse
|
|
137
136
|
@maps = [ nil ]
|
138
137
|
|
139
138
|
@reduce = nil
|
140
|
-
@
|
139
|
+
@reduce_mutex = Mutex.new
|
141
140
|
@reduction_queue = Queue.new
|
142
141
|
end
|
143
142
|
|
144
143
|
#
|
145
144
|
# sourcing methods
|
146
145
|
|
147
|
-
def source(
|
146
|
+
def source(&block)
|
147
|
+
|
148
|
+
@batches << Tresse::Batch.new(self, block)
|
149
|
+
|
150
|
+
self
|
151
|
+
end
|
148
152
|
|
149
|
-
|
153
|
+
def source_each(collection, &block)
|
150
154
|
|
151
|
-
|
155
|
+
if collection.is_a?(Hash)
|
156
|
+
collection.each { |k, v|
|
157
|
+
source { Tresse.call_block(block, [ k, v ]) } }
|
158
|
+
else
|
159
|
+
collection.each_with_index { |e, i|
|
160
|
+
source { Tresse.call_block(block, [ e, i ]) } }
|
161
|
+
end
|
152
162
|
|
153
163
|
self
|
154
164
|
end
|
@@ -177,7 +187,14 @@ module Tresse
|
|
177
187
|
|
178
188
|
def flatten
|
179
189
|
|
180
|
-
do_reduce(
|
190
|
+
do_reduce(
|
191
|
+
[],
|
192
|
+
lambda { |a, e|
|
193
|
+
if e.respond_to?(:to_a) && ! e.is_a?(Hash)
|
194
|
+
a.concat(e.to_a)
|
195
|
+
else
|
196
|
+
a.push(e)
|
197
|
+
end })
|
181
198
|
end
|
182
199
|
alias values flatten
|
183
200
|
|
@@ -198,7 +215,11 @@ module Tresse
|
|
198
215
|
|
199
216
|
launch
|
200
217
|
|
201
|
-
@reduction_queue.pop
|
218
|
+
r = @reduction_queue.pop
|
219
|
+
|
220
|
+
raise r.error if r.is_a?(Tresse::Batch)
|
221
|
+
|
222
|
+
r
|
202
223
|
end
|
203
224
|
|
204
225
|
def launch
|
@@ -211,7 +232,9 @@ module Tresse
|
|
211
232
|
|
212
233
|
def receive(batch)
|
213
234
|
|
214
|
-
if batch.
|
235
|
+
if batch.error
|
236
|
+
@reduction_queue << batch
|
237
|
+
elsif batch.map_index == 0
|
215
238
|
batch.source
|
216
239
|
Tresse.enqueue(batch)
|
217
240
|
elsif m = @maps[batch.map_index]
|
@@ -224,15 +247,18 @@ module Tresse
|
|
224
247
|
|
225
248
|
def queue_for_reduction(batch)
|
226
249
|
|
227
|
-
@
|
250
|
+
@reduce_mutex.synchronize do
|
251
|
+
|
252
|
+
batch.complete
|
228
253
|
|
229
|
-
|
230
|
-
|
254
|
+
return unless @reduce
|
255
|
+
return if @batches.find { |b| ! b.completed }
|
231
256
|
|
232
|
-
|
233
|
-
|
257
|
+
es = @batches.collect(&:value)
|
258
|
+
target, block = @reduce
|
234
259
|
|
235
|
-
|
260
|
+
@reduction_queue << es.inject(target, &block)
|
261
|
+
end
|
236
262
|
end
|
237
263
|
end
|
238
264
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tresse
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Mettraux
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-09-
|
11
|
+
date: 2019-09-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|