datapipes 0.0.4 → 0.1.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
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: