datapipes 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5da9524d54bee9ddd9316b41e8b0aae7a39b2515
4
- data.tar.gz: bf301fe6740d050cb879137c47be2e0232b998e3
3
+ metadata.gz: 36fcf4de0a57bf1712ee266c6d99272ae5b823bf
4
+ data.tar.gz: 3c88fe0667cf777f8241cbf57c4f729046645092
5
5
  SHA512:
6
- metadata.gz: 541820467ba42ecb78f51359554457c4e09dc7c5896e39ba784dcd52a83f26f750d3ddc8f3af4a6740ed7793f2e7a871e0efd935d62a1f2427ba9cf657139b65
7
- data.tar.gz: a2378d84a6e3192a737c0dccabc2a19d6fce8d2653bcf96f56689fe8cf871d1fc4a8e998f5ba7727ec881b12dbc4adea34a4f7816f5c55c8fbae8a7048a880dd
6
+ metadata.gz: d79a8457b86cbc3f9e12128e7e08ef840d7e90fd9f230cc57c48e41b7997570dfec5865c60ee0256ccfc511cc2e6a985dda7038821379d59fd61863e17fb1c6f
7
+ data.tar.gz: 0a5a5a692c50f1814affee9caaf132e0c142951733147d7683c02ba83daa3db5c4ec0e4d13d2c74449408438293b5d8b410628856eac37aec4afd5cd83c2f0f4
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ -c
data/CHANGELOG.md ADDED
@@ -0,0 +1,4 @@
1
+ ## 0.1.0
2
+ - Change Tube cmposing way. https://github.com/taiki45/datapipes/pull/4
3
+ - Remove `accept?` methods from Tube and Sink. d966744f9
4
+ - Composable now works fine. 47ed4b45b
data/README.md CHANGED
@@ -18,7 +18,7 @@ a few objects sparated by its responsibility.
18
18
  Tube
19
19
  | pipe is '|'
20
20
  |
21
- Consumer
21
+ Sink
22
22
  ```
23
23
 
24
24
  To handle multi streamings, datapipes offers composabiliy. Source, Tube and Sink
@@ -2,7 +2,7 @@ class Datapipes
2
2
  module Basics
3
3
  class Print < Sink
4
4
  def run(data)
5
- puts data
5
+ puts data if accept? data
6
6
  end
7
7
 
8
8
  def accept?(data)
@@ -2,7 +2,11 @@ class Datapipes
2
2
  module Basics
3
3
  class Triple < Tube
4
4
  def run(data)
5
- [data, data, data]
5
+ if accept? data
6
+ [data, data, data]
7
+ else
8
+ data
9
+ end
6
10
  end
7
11
 
8
12
  def accept?(data)
@@ -2,9 +2,12 @@ class Datapipes
2
2
  module Composable
3
3
  attr_accessor :accumulated
4
4
 
5
- def +(other)
5
+ def +(op2)
6
+ op1 = self
7
+ op1_acc = (op1.accumulated || [op1])
8
+ op2_acc = (op2.accumulated || [op2])
6
9
  self.class.new.tap do |o|
7
- o.accumulated = [self, other] + (accumulated || [])
10
+ o.accumulated = op1_acc + op2_acc
8
11
  end
9
12
  end
10
13
  end
@@ -3,13 +3,10 @@ class Datapipes
3
3
  class Sink
4
4
  include Composable
5
5
 
6
+ # TODO: parallel
6
7
  def run_all(data)
7
8
  @accumulated ||= [self]
8
- @accumulated.each {|sink| sink.run(data) if sink.accept? data }
9
- end
10
-
11
- def accept?(data)
12
- true
9
+ @accumulated.each {|sink| sink.run(data) }
13
10
  end
14
11
  end
15
12
  end
@@ -3,22 +3,17 @@ class Datapipes
3
3
  #
4
4
  # Build your own tube logic in `run` method.
5
5
  class Tube
6
- include Composable
7
-
8
- def run_all(data)
9
- @accumulated ||= [self]
10
-
11
- @accumulated.reduce(data) do |d, tube|
12
- if tube.accept? d
13
- tube.run(d)
14
- else
15
- d
6
+ def >>(op2)
7
+ op1 = self
8
+ Tube.new.tap do |o|
9
+ o.define_singleton_method(:run) do |data|
10
+ op2.run(op1.run(data))
16
11
  end
17
12
  end
18
13
  end
19
14
 
20
- def accept?(data)
21
- true
15
+ def run(data)
16
+ data
22
17
  end
23
18
  end
24
19
  end
@@ -1,3 +1,3 @@
1
1
  class Datapipes
2
- VERSION = '0.0.4'
2
+ VERSION = '0.1.0'
3
3
  end
data/lib/datapipes.rb CHANGED
@@ -6,6 +6,7 @@ require 'datapipes/pipe'
6
6
  require 'datapipes/version'
7
7
 
8
8
  class Datapipes
9
+ # TODO: optional tube and pipe
9
10
  def initialize(source, tube, sink, pipe)
10
11
  @source = source
11
12
  @tube = tube
@@ -34,7 +35,7 @@ class Datapipes
34
35
  loop do
35
36
  break if resource_ended? && @pipe.empty?
36
37
 
37
- data = @tube.run_all(@pipe.pull)
38
+ data = @tube.run(@pipe.pull)
38
39
  @sink.run_all(data)
39
40
  end
40
41
  Thread.current.kill
@@ -1,69 +1,4 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Datapipes::Composable do
4
- context 'with valid object' do
5
- let(:class_a) do
6
- Class.new do
7
- include Datapipes::Composable
8
-
9
- def call
10
- one
11
- end
12
-
13
- def one
14
- 1
15
- end
16
-
17
- def exec
18
- accumulated.map(&:call)
19
- end
20
- end
21
- end
22
-
23
- let(:class_b) do
24
- Class.new do
25
- include Datapipes::Composable
26
-
27
- def call
28
- five
29
- end
30
-
31
- def five
32
- 5
33
- end
34
- end
35
- end
36
-
37
- let(:a) { class_a.new }
38
- let(:b) { class_b.new }
39
- subject { a + b }
40
-
41
- it 'remember defined body' do
42
- expect(subject.exec).to eq [1, 5]
43
- end
44
- end
45
-
46
- context 'with tube' do
47
- let(:tube_a) do
48
- Class.new(Datapipes::Tube) do
49
- def run(data)
50
- data + 2
51
- end
52
- end.new
53
- end
54
-
55
- let(:tube_b) do
56
- Class.new(Datapipes::Tube) do
57
- def run(data)
58
- data * 3
59
- end
60
- end.new
61
- end
62
-
63
- subject { tube_a + tube_b }
64
-
65
- it 'generates new tube' do
66
- expect(subject.run_all(4)).to eq 18
67
- end
68
- end
69
4
  end
data/spec/sink_spec.rb ADDED
@@ -0,0 +1,71 @@
1
+ require 'spec_helper'
2
+
3
+ describe Datapipes::Sink do
4
+ describe 'composable' do
5
+ context 'with 3 sinks' do
6
+ subject { sink_a + sink_b + sink_c }
7
+
8
+ it 'composes' do
9
+ subject.run_all(5)
10
+ expect(list).to eq [8, 20, 6]
11
+ end
12
+ end
13
+
14
+ context 'with 4 sinks' do
15
+ subject { sink_a + sink_b + sink_c + sink_d }
16
+
17
+ it 'composes' do
18
+ subject.run_all(5)
19
+ expect(list).to eq [8, 20, 6, 50]
20
+ end
21
+ end
22
+
23
+ describe 'associative law' do
24
+ let(:a) { (sink_a + sink_b) + sink_c }
25
+ let(:b) { sink_a + (sink_b + sink_c) }
26
+
27
+ it 'keeps' do
28
+ expect(a.run_all(3)).to eq b.run_all(3)
29
+ end
30
+ end
31
+
32
+ let(:list) { [] }
33
+
34
+ let(:sink_a) do
35
+ list_ = list
36
+ Class.new(Datapipes::Sink) do
37
+ define_method(:run) do |data|
38
+ list_ << (data + 3)
39
+ end
40
+ end.new
41
+ end
42
+
43
+ let(:sink_b) do
44
+ list_ = list
45
+ Class.new(Datapipes::Sink) do
46
+ define_method(:run) do |data|
47
+ list_ << (data * 4)
48
+ end
49
+ end.new
50
+ end
51
+
52
+ let(:sink_c) do
53
+ list_ = list
54
+ Class.new(Datapipes::Sink) do
55
+ define_method(:run) do |data|
56
+ list_ << (data + 1)
57
+ end
58
+ end.new
59
+ end
60
+
61
+ let(:sink_d) do
62
+ list_ = list
63
+ Class.new(Datapipes::Sink) do
64
+ define_method(:run) do |data|
65
+ list_ << (data * 10)
66
+ end
67
+ end.new
68
+ end
69
+
70
+ end
71
+ end
data/spec/tube_spec.rb ADDED
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ describe Datapipes::Tube do
4
+ describe 'composable' do
5
+ let(:tube_a) do
6
+ Class.new(Datapipes::Tube) do
7
+ def run(data)
8
+ data + 2
9
+ end
10
+ end.new
11
+ end
12
+
13
+ let(:tube_b) do
14
+ Class.new(Datapipes::Tube) do
15
+ def run(data)
16
+ data * 3
17
+ end
18
+ end.new
19
+ end
20
+
21
+ let(:tube_c) do
22
+ Class.new(Datapipes::Tube) do
23
+ def run(data)
24
+ data + 4
25
+ end
26
+ end.new
27
+ end
28
+
29
+ subject { tube_a >> tube_b >> tube_c }
30
+
31
+ it 'composes' do
32
+ expect(subject.run(4)).to eq 22
33
+ end
34
+
35
+ describe 'associative law' do
36
+ let(:a) { (tube_a >> tube_b) >> tube_c }
37
+ let(:b) { tube_a >> (tube_b >> tube_c) }
38
+
39
+ it 'keeps' do
40
+ expect(a.run(5)).to eq b.run(5)
41
+ end
42
+ end
43
+ end
44
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datapipes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Taiki ONO
@@ -74,7 +74,9 @@ extensions: []
74
74
  extra_rdoc_files: []
75
75
  files:
76
76
  - ".gitignore"
77
+ - ".rspec"
77
78
  - ".travis.yml"
79
+ - CHANGELOG.md
78
80
  - Gemfile
79
81
  - LICENSE
80
82
  - README.md
@@ -94,7 +96,9 @@ files:
94
96
  - lib/datapipes/version.rb
95
97
  - spec/basics_spec.rb
96
98
  - spec/composable_spec.rb
99
+ - spec/sink_spec.rb
97
100
  - spec/spec_helper.rb
101
+ - spec/tube_spec.rb
98
102
  homepage: https://github.com/taiki45/datapipes
99
103
  licenses:
100
104
  - MIT
@@ -122,5 +126,7 @@ summary: An asynchronous multi steamings library.
122
126
  test_files:
123
127
  - spec/basics_spec.rb
124
128
  - spec/composable_spec.rb
129
+ - spec/sink_spec.rb
125
130
  - spec/spec_helper.rb
131
+ - spec/tube_spec.rb
126
132
  has_rdoc: