futuroscope 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/.rspec +1 -0
- data/README.md +7 -0
- data/lib/futuroscope/convenience.rb +7 -0
- data/lib/futuroscope/future.rb +8 -0
- data/lib/futuroscope/map.rb +39 -0
- data/lib/futuroscope/version.rb +1 -1
- data/spec/futuroscope/convenience_spec.rb +17 -1
- data/spec/futuroscope/future_spec.rb +5 -5
- data/spec/futuroscope/map_spec.rb +20 -0
- metadata +85 -43
- checksums.yaml +0 -7
data/.gitignore
CHANGED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color --format documentation
|
data/README.md
CHANGED
@@ -7,6 +7,9 @@
|
|
7
7
|
Futursocope is a simple library that implements futures in ruby. Futures are a
|
8
8
|
concurrency pattern meant to help you deal with concurrency in a simple way.
|
9
9
|
|
10
|
+
It's specially useful when working in Service Oriented Architectures where HTTP
|
11
|
+
calls can take a long time and you only expect a value from them.
|
12
|
+
|
10
13
|
[![The awesome Futuroscope park](http://europe.eurostar.com/wp-content/uploads/2011/06/Futuroscope10-59-of-107.jpg)](http://futuroscope.com)
|
11
14
|
|
12
15
|
You can learn more about futures here in this excellent article from @jpignata:
|
@@ -66,6 +69,10 @@ puts x + y + z
|
|
66
69
|
=> 6
|
67
70
|
```
|
68
71
|
|
72
|
+
## Ideas for the future
|
73
|
+
|
74
|
+
* Having a thread pool so you can limit maximum concurrency.
|
75
|
+
|
69
76
|
## Contributing
|
70
77
|
|
71
78
|
1. Fork it
|
data/lib/futuroscope/future.rb
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
module Futuroscope
|
2
|
+
# A Future is an object that gets initialized with a block and will behave
|
3
|
+
# exactly like the block's result, but being able to "borrow" its result from
|
4
|
+
# the future. That is, will block when the result is not ready until it is,
|
5
|
+
# and will return it instantly if the thread's execution already finished.
|
6
|
+
#
|
2
7
|
class Future
|
3
8
|
attr_writer :__value
|
9
|
+
extend Forwardable
|
4
10
|
|
5
11
|
# Initializes a future with a block and starts its execution.
|
6
12
|
#
|
@@ -37,6 +43,8 @@ module Futuroscope
|
|
37
43
|
@__value
|
38
44
|
end
|
39
45
|
|
46
|
+
def_delegators :__value, :to_s, :==
|
47
|
+
|
40
48
|
private
|
41
49
|
|
42
50
|
def method_missing(method, *args)
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'futuroscope/future'
|
2
|
+
|
3
|
+
module Futuroscope
|
4
|
+
# A futuroscope map behaves like a regular map but performs all operations
|
5
|
+
# using futures so they're effectively parallel.
|
6
|
+
#
|
7
|
+
class Map
|
8
|
+
# Initializes a map with a set of items.
|
9
|
+
#
|
10
|
+
# items - Items in which to perform the mapping
|
11
|
+
#
|
12
|
+
def initialize(items)
|
13
|
+
@items = items
|
14
|
+
end
|
15
|
+
|
16
|
+
# Maps each item with a future.
|
17
|
+
#
|
18
|
+
# block - A block that will be executed passing each element as a parameter
|
19
|
+
#
|
20
|
+
# Returns an array of futures that behave like the original objects.
|
21
|
+
def map(&block)
|
22
|
+
@items.map do |item|
|
23
|
+
Future.new do
|
24
|
+
block.call(item)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def method_missing(method, *args)
|
32
|
+
@map.send(method, *args)
|
33
|
+
end
|
34
|
+
|
35
|
+
def respond_to_missing?(method, include_private = false)
|
36
|
+
@map.respond_to?(method, include_private)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/futuroscope/version.rb
CHANGED
@@ -8,8 +8,24 @@ describe "Kernel#future" do
|
|
8
8
|
y = future{ sleep(1); 2 }
|
9
9
|
z = future{ sleep(1); 3 }
|
10
10
|
|
11
|
-
Timeout::timeout(
|
11
|
+
Timeout::timeout(2.5) do
|
12
12
|
expect(x + y + z).to eq(6)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
16
|
+
|
17
|
+
describe "Enumerable#future_map" do
|
18
|
+
it "adds a future_map method do Enumerable" do
|
19
|
+
items = [1, 2, 3]
|
20
|
+
map = items.future_map do |i|
|
21
|
+
sleep(1)
|
22
|
+
i + 1
|
23
|
+
end
|
24
|
+
|
25
|
+
Timeout::timeout(2.5) do
|
26
|
+
expect(map.first).to eq(2)
|
27
|
+
expect(map[1]).to eq(3)
|
28
|
+
expect(map.last).to eq(4)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -8,15 +8,15 @@ module Futuroscope
|
|
8
8
|
future = Future.new{ :edballs }
|
9
9
|
sleep(0.1)
|
10
10
|
|
11
|
-
expect(future
|
11
|
+
expect(future).to eq(:edballs)
|
12
12
|
end
|
13
13
|
|
14
14
|
it "will execute the future in the background and wait for it" do
|
15
|
-
future = Future.new{ sleep(
|
15
|
+
future = Future.new{ sleep(1); :edballs }
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
expect(future
|
17
|
+
sleep(1)
|
18
|
+
Timeout::timeout(0.9) do
|
19
|
+
expect(future).to eq(:edballs)
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'futuroscope/map'
|
3
|
+
|
4
|
+
module Futuroscope
|
5
|
+
describe Map do
|
6
|
+
it "behaves like a normal map" do
|
7
|
+
items = [1, 2, 3]
|
8
|
+
result = Map.new(items).map do |item|
|
9
|
+
sleep(item)
|
10
|
+
"Item #{item}"
|
11
|
+
end
|
12
|
+
|
13
|
+
Timeout::timeout(4) do
|
14
|
+
expect(result.first).to eq("Item 1")
|
15
|
+
expect(result[1]).to eq("Item 2")
|
16
|
+
expect(result.last).to eq("Item 3")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
metadata
CHANGED
@@ -1,57 +1,64 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: futuroscope
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Josep Jaume Rey Peroy
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2013-05-
|
12
|
+
date: 2013-05-03 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: bundler
|
15
|
-
|
16
|
+
version_requirements: !ruby/object:Gem::Requirement
|
16
17
|
requirements:
|
17
18
|
- - ~>
|
18
19
|
- !ruby/object:Gem::Version
|
19
20
|
version: '1.3'
|
20
|
-
|
21
|
-
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
21
|
+
none: false
|
22
|
+
requirement: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.3'
|
27
|
+
none: false
|
28
|
+
prerelease: false
|
29
|
+
type: :development
|
27
30
|
- !ruby/object:Gem::Dependency
|
28
31
|
name: rake
|
29
|
-
|
32
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
33
|
requirements:
|
31
|
-
- - '>='
|
34
|
+
- - ! '>='
|
32
35
|
- !ruby/object:Gem::Version
|
33
36
|
version: '0'
|
34
|
-
|
35
|
-
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
38
|
+
requirement: !ruby/object:Gem::Requirement
|
37
39
|
requirements:
|
38
|
-
- - '>='
|
40
|
+
- - ! '>='
|
39
41
|
- !ruby/object:Gem::Version
|
40
42
|
version: '0'
|
43
|
+
none: false
|
44
|
+
prerelease: false
|
45
|
+
type: :development
|
41
46
|
- !ruby/object:Gem::Dependency
|
42
47
|
name: rspec
|
43
|
-
|
48
|
+
version_requirements: !ruby/object:Gem::Requirement
|
44
49
|
requirements:
|
45
|
-
- - '>='
|
50
|
+
- - ! '>='
|
46
51
|
- !ruby/object:Gem::Version
|
47
52
|
version: '0'
|
48
|
-
|
49
|
-
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirement: !ruby/object:Gem::Requirement
|
51
55
|
requirements:
|
52
|
-
- - '>='
|
56
|
+
- - ! '>='
|
53
57
|
- !ruby/object:Gem::Version
|
54
58
|
version: '0'
|
59
|
+
none: false
|
60
|
+
prerelease: false
|
61
|
+
type: :development
|
55
62
|
description: Futuroscope is yet another simple gem that implements the Futures concurrency
|
56
63
|
pattern.
|
57
64
|
email:
|
@@ -60,49 +67,84 @@ executables: []
|
|
60
67
|
extensions: []
|
61
68
|
extra_rdoc_files: []
|
62
69
|
files:
|
63
|
-
-
|
64
|
-
|
65
|
-
-
|
66
|
-
|
67
|
-
-
|
68
|
-
|
69
|
-
-
|
70
|
-
|
71
|
-
-
|
72
|
-
|
73
|
-
-
|
74
|
-
|
75
|
-
-
|
76
|
-
|
77
|
-
-
|
78
|
-
|
79
|
-
-
|
70
|
+
- !binary |-
|
71
|
+
LmdpdGlnbm9yZQ==
|
72
|
+
- !binary |-
|
73
|
+
LnJzcGVj
|
74
|
+
- !binary |-
|
75
|
+
LnJ1YnktZ2Vtc2V0
|
76
|
+
- !binary |-
|
77
|
+
LnJ1YnktdmVyc2lvbg==
|
78
|
+
- !binary |-
|
79
|
+
LnRyYXZpcy55bWw=
|
80
|
+
- !binary |-
|
81
|
+
R2VtZmlsZQ==
|
82
|
+
- !binary |-
|
83
|
+
R3VhcmRmaWxl
|
84
|
+
- !binary |-
|
85
|
+
TElDRU5TRS50eHQ=
|
86
|
+
- !binary |-
|
87
|
+
UkVBRE1FLm1k
|
88
|
+
- !binary |-
|
89
|
+
UmFrZWZpbGU=
|
90
|
+
- !binary |-
|
91
|
+
ZnV0dXJvc2NvcGUuZ2Vtc3BlYw==
|
92
|
+
- !binary |-
|
93
|
+
bGliL2Z1dHVyb3Njb3BlLnJi
|
94
|
+
- !binary |-
|
95
|
+
bGliL2Z1dHVyb3Njb3BlL2NvbnZlbmllbmNlLnJi
|
96
|
+
- !binary |-
|
97
|
+
bGliL2Z1dHVyb3Njb3BlL2Z1dHVyZS5yYg==
|
98
|
+
- !binary |-
|
99
|
+
bGliL2Z1dHVyb3Njb3BlL21hcC5yYg==
|
100
|
+
- !binary |-
|
101
|
+
bGliL2Z1dHVyb3Njb3BlL3ZlcnNpb24ucmI=
|
102
|
+
- !binary |-
|
103
|
+
c3BlYy9mdXR1cm9zY29wZS9jb252ZW5pZW5jZV9zcGVjLnJi
|
104
|
+
- !binary |-
|
105
|
+
c3BlYy9mdXR1cm9zY29wZS9mdXR1cmVfc3BlYy5yYg==
|
106
|
+
- !binary |-
|
107
|
+
c3BlYy9mdXR1cm9zY29wZS9tYXBfc3BlYy5yYg==
|
108
|
+
- !binary |-
|
109
|
+
c3BlYy9zcGVjX2hlbHBlci5yYg==
|
80
110
|
homepage: ''
|
81
111
|
licenses:
|
82
112
|
- MIT
|
83
|
-
metadata: {}
|
84
113
|
post_install_message:
|
85
114
|
rdoc_options: []
|
86
115
|
require_paths:
|
87
116
|
- lib
|
88
117
|
required_ruby_version: !ruby/object:Gem::Requirement
|
89
118
|
requirements:
|
90
|
-
- - '>='
|
119
|
+
- - ! '>='
|
91
120
|
- !ruby/object:Gem::Version
|
92
121
|
version: '0'
|
122
|
+
segments:
|
123
|
+
- 0
|
124
|
+
hash: 2002549777813010636
|
125
|
+
none: false
|
93
126
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
127
|
requirements:
|
95
|
-
- - '>='
|
128
|
+
- - ! '>='
|
96
129
|
- !ruby/object:Gem::Version
|
97
130
|
version: '0'
|
131
|
+
segments:
|
132
|
+
- 0
|
133
|
+
hash: 2002549777813010636
|
134
|
+
none: false
|
98
135
|
requirements: []
|
99
136
|
rubyforge_project:
|
100
|
-
rubygems_version:
|
137
|
+
rubygems_version: 1.8.25
|
101
138
|
signing_key:
|
102
|
-
specification_version:
|
139
|
+
specification_version: 3
|
103
140
|
summary: Futuroscope is yet another simple gem that implements the Futures concurrency
|
104
141
|
pattern.
|
105
142
|
test_files:
|
106
|
-
-
|
107
|
-
|
108
|
-
-
|
143
|
+
- !binary |-
|
144
|
+
c3BlYy9mdXR1cm9zY29wZS9jb252ZW5pZW5jZV9zcGVjLnJi
|
145
|
+
- !binary |-
|
146
|
+
c3BlYy9mdXR1cm9zY29wZS9mdXR1cmVfc3BlYy5yYg==
|
147
|
+
- !binary |-
|
148
|
+
c3BlYy9mdXR1cm9zY29wZS9tYXBfc3BlYy5yYg==
|
149
|
+
- !binary |-
|
150
|
+
c3BlYy9zcGVjX2hlbHBlci5yYg==
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 702932e991c91726ce5ff65ff9a673261c227e6d
|
4
|
-
data.tar.gz: ae1f97ea456347b722cbd7b41c3038a799a29f77
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: 87cd6524f383af41f7ee3443115398cf3de5c8014a343bfcc33651d45535ff8947576cd2a098aba38011d53d5dca4f710e776ff0ae065400f8dc06f314ad4be8
|
7
|
-
data.tar.gz: be014a3a3dfe04124b54ea31555ca12d75be30cf39a8ba10824d5569da88eb6655b018973f921451273e0ab8fa73c62df2c617a717cc31df309bd18409c8a10c
|