datapipes 0.0.2 → 0.0.3
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/README.md +122 -2
- data/datapipes.gemspec +2 -2
- data/examples/basics.rb +36 -0
- data/lib/datapipes/version.rb +1 -1
- data/lib/datapipes.rb +9 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b69f0bd0a67b11610394bb01fe5d5e3dccb5da8b
|
4
|
+
data.tar.gz: 1f171ea4c6f63989795bfb1cb22da5cbbb732cc5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b283617335d62edffd27f34c69deca578481788e381766f9dc54adbc7742495bffa7f132c0b769f79c922d660b4e775744e6c8b14e87cc619deefc96e34a51e5
|
7
|
+
data.tar.gz: a1cfdeadae7ba85c47cc2c2cbbdb1ff2b594e186bd0391913a546ec0b0e8ceadf175d632856b7bce74403050088dc7b3e52707a127f58df3481d719ae38d6e12
|
data/README.md
CHANGED
@@ -1,6 +1,49 @@
|
|
1
1
|
datapipes [](https://travis-ci.org/taiki45/datapipes)
|
2
2
|
=========
|
3
|
-
datapipes is multi
|
3
|
+
datapipes is an asynchronous multi streaming library.
|
4
|
+
|
5
|
+
## About
|
6
|
+
datapipes encourages to handle multi streamings asynchronously. datapipes has
|
7
|
+
a few objects sparated by its responsibility.
|
8
|
+
|
9
|
+
- __Source__ Produces resources and emits the resource to pipe.
|
10
|
+
- __Tube__ Effector for resources. Processes resource in the middle of pipe.
|
11
|
+
- __Sink__ Consumer for resources. Do something with processed resources.
|
12
|
+
- __Pipe__ Resources pass through the pipe. Handles resources asynchronously.
|
13
|
+
|
14
|
+
```
|
15
|
+
Source
|
16
|
+
| ↓ data flow
|
17
|
+
|
|
18
|
+
Tube
|
19
|
+
| pipe is '|'
|
20
|
+
|
|
21
|
+
Consumer
|
22
|
+
```
|
23
|
+
|
24
|
+
To handle multi streamings, datapipes offers composabiliy. Source, Tube and Sink
|
25
|
+
are composable individually. So the diagram above will be:
|
26
|
+
|
27
|
+
```
|
28
|
+
Composed Source works asynchronously
|
29
|
+
|
30
|
+
[Source Source Source]
|
31
|
+
|
|
32
|
+
| pipe handles asynchronous
|
33
|
+
|
|
34
|
+
Tube
|
35
|
+
Tube Composed Tube has individual tube in series
|
36
|
+
Tube
|
37
|
+
Tube
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
Sink
|
42
|
+
Sink
|
43
|
+
Sink
|
44
|
+
|
45
|
+
Composed Sink works synchronously
|
46
|
+
```
|
4
47
|
|
5
48
|
## Installation
|
6
49
|
|
@@ -17,8 +60,85 @@ Or install it yourself as:
|
|
17
60
|
$ gem install datapipes
|
18
61
|
|
19
62
|
## Usage
|
63
|
+
You have to define your own Source, Tube and Sink.
|
64
|
+
|
65
|
+
A basic source is list type. it produces a value in several times.
|
66
|
+
Use `produce` method to emit data to pipe.
|
67
|
+
|
68
|
+
```ruby
|
69
|
+
class List < Datapipes::Source
|
70
|
+
def run
|
71
|
+
(1..10).each {|i| produce(i) }
|
72
|
+
end
|
73
|
+
end
|
74
|
+
```
|
75
|
+
|
76
|
+
Next is tube. Tube processes piped data. A example tube recieve
|
77
|
+
Integer value then increase amount of the value.
|
78
|
+
|
79
|
+
Define `accept?` to recieve the data or skip this.
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
class Triple < Datapipes::Tube
|
83
|
+
def run(data)
|
84
|
+
[data, data, data]
|
85
|
+
end
|
86
|
+
|
87
|
+
def accept?(data)
|
88
|
+
data.is_a? Integer and data > 3
|
89
|
+
end
|
90
|
+
end
|
91
|
+
```
|
92
|
+
|
93
|
+
Sink consumes piped data. A typical sink is printing data.
|
94
|
+
|
95
|
+
```ruby
|
96
|
+
class Print < Datapipes::Sink
|
97
|
+
def run(data)
|
98
|
+
puts data
|
99
|
+
end
|
100
|
+
|
101
|
+
def accept?(data)
|
102
|
+
data.is_a? Array and data[0] < 7
|
103
|
+
end
|
104
|
+
end
|
105
|
+
```
|
106
|
+
|
107
|
+
You can make your own datapipe with your objects.
|
108
|
+
|
109
|
+
```ruby
|
110
|
+
datapipe = Datapipes.new(
|
111
|
+
List.new, # A source
|
112
|
+
Triple.new, # A tube
|
113
|
+
Print.new, # A sink
|
114
|
+
Datapipes::Pipe.new # A pipe
|
115
|
+
)
|
116
|
+
```
|
117
|
+
|
118
|
+
Then just run everything with `run_resource`.
|
119
|
+
|
120
|
+
```ruby
|
121
|
+
datapipe.run_resource
|
122
|
+
```
|
123
|
+
|
124
|
+
The output will be:
|
125
|
+
|
126
|
+
```
|
127
|
+
4
|
128
|
+
4
|
129
|
+
4
|
130
|
+
5
|
131
|
+
5
|
132
|
+
5
|
133
|
+
6
|
134
|
+
6
|
135
|
+
6
|
136
|
+
```
|
137
|
+
|
138
|
+
Congratulation!!
|
20
139
|
|
21
|
-
|
140
|
+
### Composing objects
|
141
|
+
TODO...
|
22
142
|
|
23
143
|
## Contributing
|
24
144
|
|
data/datapipes.gemspec
CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = Datapipes::VERSION
|
9
9
|
spec.authors = ['Taiki ONO']
|
10
10
|
spec.email = ['taiks.4559@gmail.com']
|
11
|
-
spec.summary = %q{
|
12
|
-
spec.description = %q{
|
11
|
+
spec.summary = %q{An asynchronous multi steamings library.}
|
12
|
+
spec.description = %q{To handle multi steamings easily.}
|
13
13
|
spec.homepage = 'https://github.com/taiki45/datapipes'
|
14
14
|
spec.license = 'MIT'
|
15
15
|
|
data/examples/basics.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'datapipes'
|
2
|
+
|
3
|
+
class List < Datapipes::Source
|
4
|
+
def run
|
5
|
+
(1..10).each {|i| produce(i) }
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class Triple < Datapipes::Tube
|
10
|
+
def run(data)
|
11
|
+
[data, data, data]
|
12
|
+
end
|
13
|
+
|
14
|
+
def accept?(data)
|
15
|
+
data.is_a? Integer and data > 3
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class Print < Datapipes::Sink
|
20
|
+
def run(data)
|
21
|
+
puts data
|
22
|
+
end
|
23
|
+
|
24
|
+
def accept?(data)
|
25
|
+
data.is_a? Array and data[0] < 7
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
datapipe = Datapipes.new(
|
30
|
+
List.new, # A source
|
31
|
+
Triple.new, # A tube
|
32
|
+
Print.new, # A sink
|
33
|
+
Datapipes::Pipe.new # A pipe
|
34
|
+
)
|
35
|
+
|
36
|
+
datapipe.run_resource
|
data/lib/datapipes/version.rb
CHANGED
data/lib/datapipes.rb
CHANGED
@@ -24,7 +24,7 @@ class Datapipes
|
|
24
24
|
runners.each(&:join)
|
25
25
|
|
26
26
|
notify_resource_ending
|
27
|
-
consumer
|
27
|
+
graceful_down(consumer)
|
28
28
|
end
|
29
29
|
|
30
30
|
private
|
@@ -37,14 +37,22 @@ class Datapipes
|
|
37
37
|
data = @tube.run_all(@pipe.pull)
|
38
38
|
@sink.run_all(data)
|
39
39
|
end
|
40
|
+
Thread.current.kill
|
40
41
|
end
|
41
42
|
end
|
42
43
|
|
43
44
|
def notify_resource_ending
|
44
45
|
@flag.enq true
|
46
|
+
Thread.pass
|
45
47
|
end
|
46
48
|
|
47
49
|
def resource_ended?
|
48
50
|
!@flag.empty?
|
49
51
|
end
|
52
|
+
|
53
|
+
def graceful_down(consumer)
|
54
|
+
sleep 0.1
|
55
|
+
consumer.kill if consumer.status == 'sleep'
|
56
|
+
consumer.join
|
57
|
+
end
|
50
58
|
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
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Taiki ONO
|
@@ -66,7 +66,7 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
-
description:
|
69
|
+
description: To handle multi steamings easily.
|
70
70
|
email:
|
71
71
|
- taiks.4559@gmail.com
|
72
72
|
executables: []
|
@@ -80,6 +80,7 @@ files:
|
|
80
80
|
- README.md
|
81
81
|
- Rakefile
|
82
82
|
- datapipes.gemspec
|
83
|
+
- examples/basics.rb
|
83
84
|
- lib/datapipes.rb
|
84
85
|
- lib/datapipes/basics.rb
|
85
86
|
- lib/datapipes/basics/list.rb
|
@@ -117,7 +118,7 @@ rubyforge_project:
|
|
117
118
|
rubygems_version: 2.2.2
|
118
119
|
signing_key:
|
119
120
|
specification_version: 4
|
120
|
-
summary:
|
121
|
+
summary: An asynchronous multi steamings library.
|
121
122
|
test_files:
|
122
123
|
- spec/basics_spec.rb
|
123
124
|
- spec/composable_spec.rb
|