futuroscope 0.0.1 → 0.0.2
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.
- 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
|
[](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
|