future-resource 0.0.2 → 1.0.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.
- data/.gitignore +4 -0
- data/.rspec +3 -0
- data/.travis.yml +9 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +1 -1
- data/Guardfile +5 -0
- data/Rakefile +21 -0
- data/future-resource.gemspec +7 -0
- data/lib/future-resource/version.rb +1 -1
- data/lib/future-resource.rb +47 -2
- data/spec/future-resource_spec.rb +33 -0
- metadata +77 -7
data/.gitignore
CHANGED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/Guardfile
ADDED
data/Rakefile
CHANGED
@@ -1 +1,22 @@
|
|
1
1
|
require 'bundler/gem_tasks'
|
2
|
+
Bundler::GemHelper.install_tasks
|
3
|
+
|
4
|
+
require 'rspec/core'
|
5
|
+
require 'rspec/core/rake_task'
|
6
|
+
require 'ci/reporter/rake/rspec'
|
7
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
8
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
9
|
+
spec.rspec_opts = '--color'
|
10
|
+
end
|
11
|
+
|
12
|
+
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
13
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
14
|
+
spec.rcov = true
|
15
|
+
spec.rspec_opts = '--color'
|
16
|
+
end
|
17
|
+
|
18
|
+
task :default => :spec
|
19
|
+
task :ci => ['ci:setup:rspec', :spec]
|
20
|
+
|
21
|
+
require 'yard'
|
22
|
+
YARD::Rake::YardocTask.new
|
data/future-resource.gemspec
CHANGED
@@ -17,4 +17,11 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
18
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
19
|
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_development_dependency 'bundler', [">= 1.0.0"]
|
22
|
+
s.add_development_dependency 'rspec', [">= 2.5.0"]
|
23
|
+
s.add_development_dependency 'ci_reporter', [">= 1.6.3"]
|
24
|
+
s.add_development_dependency 'yard', [">= 0.7.0"]
|
25
|
+
s.add_development_dependency 'rake', [">= 0"]
|
26
|
+
s.add_development_dependency 'guard-rspec'
|
20
27
|
end
|
data/lib/future-resource.rb
CHANGED
@@ -2,16 +2,51 @@ require "thread"
|
|
2
2
|
require "monitor"
|
3
3
|
require "timeout"
|
4
4
|
|
5
|
+
##
|
6
|
+
# future-resource allows you to wait on a final value being set for a placeholder, which may occur asynchronously.
|
7
|
+
#
|
8
|
+
# @author Ben Langfeld
|
9
|
+
# @author Jay Phillips
|
10
|
+
#
|
11
|
+
# @example false printed first, followed by a delay before :foo is printed
|
12
|
+
# fr = FutureResource.new
|
13
|
+
#
|
14
|
+
# Thread.new do
|
15
|
+
# sleep 10
|
16
|
+
# fr.resource = :foo
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# p fr.set_yet?
|
20
|
+
# p fr.resource
|
21
|
+
#
|
5
22
|
class FutureResource
|
23
|
+
##
|
24
|
+
# Create a new FutureResource.
|
25
|
+
#
|
6
26
|
def initialize
|
7
27
|
@resource_lock = Monitor.new
|
8
28
|
@resource_value_blocker = @resource_lock.new_cond
|
9
29
|
end
|
10
|
-
|
30
|
+
|
31
|
+
##
|
32
|
+
# Checks if the value of the resource placeholder has been set yet.
|
33
|
+
#
|
34
|
+
# @return [Boolean]
|
35
|
+
#
|
11
36
|
def set_yet?
|
12
37
|
!!@resource_lock.synchronize { defined? @resource }
|
13
38
|
end
|
14
39
|
|
40
|
+
##
|
41
|
+
# Returns the value of a specific resource, optionally waiting for `timeout` seconds before raising a Timeout::Error exception.
|
42
|
+
# When called on a not set resource without a timeout, raises a deadlock.
|
43
|
+
#
|
44
|
+
# @param [Integer] timeout number of seconds to wait for the resource to become ready
|
45
|
+
#
|
46
|
+
# @raise [Timeout::Error] if timeout expires and resource is not ready
|
47
|
+
#
|
48
|
+
# @return [Object]
|
49
|
+
#
|
15
50
|
def resource(timeout = nil)
|
16
51
|
Timeout::timeout timeout do
|
17
52
|
@resource_lock.synchronize do
|
@@ -20,7 +55,14 @@ class FutureResource
|
|
20
55
|
end
|
21
56
|
end
|
22
57
|
end
|
23
|
-
|
58
|
+
|
59
|
+
##
|
60
|
+
# Sets the value for the resource, making it available for all waiting and following reads.
|
61
|
+
# Resourcs values can only be set once.
|
62
|
+
#
|
63
|
+
# @param [Object] resource any value to be set for the resource
|
64
|
+
#
|
65
|
+
# @raise [FutureResource::ResourceAlreadySet] if resource is already set
|
24
66
|
def resource=(resource)
|
25
67
|
@resource_lock.synchronize do
|
26
68
|
raise ResourceAlreadySetException if defined? @resource
|
@@ -30,6 +72,9 @@ class FutureResource
|
|
30
72
|
end
|
31
73
|
end
|
32
74
|
|
75
|
+
##
|
76
|
+
# Raised when the program tries to set a value for the resource that is already set.
|
77
|
+
#
|
33
78
|
class ResourceAlreadySetException < StandardError
|
34
79
|
def initialize
|
35
80
|
super "Cannot set this resource twice!"
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'future-resource'
|
2
|
+
|
3
|
+
describe FutureResource do
|
4
|
+
it { should be_instance_of FutureResource }
|
5
|
+
|
6
|
+
it { should_not be_set_yet }
|
7
|
+
|
8
|
+
it "should set resource" do
|
9
|
+
subject.resource = :foo
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "with a resource set" do
|
13
|
+
before { subject.resource = :foo }
|
14
|
+
|
15
|
+
it { should be_set_yet }
|
16
|
+
|
17
|
+
its(:resource) { should === :foo }
|
18
|
+
|
19
|
+
it "should raise ResourceAlreadySetException when setting value that is already set" do
|
20
|
+
expect {
|
21
|
+
subject.resource = :bar
|
22
|
+
}.to raise_error FutureResource::ResourceAlreadySetException
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should receive the resource value from another thread" do
|
27
|
+
Thread.new do
|
28
|
+
sleep 1
|
29
|
+
subject.resource = :foo
|
30
|
+
end
|
31
|
+
subject.resource.should === :foo
|
32
|
+
end
|
33
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: future-resource
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,9 +10,74 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
14
|
-
|
15
|
-
|
13
|
+
date: 2012-03-13 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: bundler
|
17
|
+
requirement: &2164502240 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.0.0
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *2164502240
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: rspec
|
28
|
+
requirement: &2164501200 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.5.0
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *2164501200
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: ci_reporter
|
39
|
+
requirement: &2164500260 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: 1.6.3
|
45
|
+
type: :development
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: *2164500260
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: yard
|
50
|
+
requirement: &2164499560 !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 0.7.0
|
56
|
+
type: :development
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: *2164499560
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: rake
|
61
|
+
requirement: &2164499040 !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - ! '>='
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
67
|
+
type: :development
|
68
|
+
prerelease: false
|
69
|
+
version_requirements: *2164499040
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: guard-rspec
|
72
|
+
requirement: &2164514760 !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
type: :development
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: *2164514760
|
16
81
|
description: Sometimes a value is set asynchronously and you need to wait until it
|
17
82
|
appears. Easy!
|
18
83
|
email:
|
@@ -22,15 +87,18 @@ extensions: []
|
|
22
87
|
extra_rdoc_files: []
|
23
88
|
files:
|
24
89
|
- .gitignore
|
90
|
+
- .rspec
|
91
|
+
- .travis.yml
|
25
92
|
- CHANGELOG.md
|
26
93
|
- Gemfile
|
94
|
+
- Guardfile
|
27
95
|
- LICENSE.txt
|
28
96
|
- README.md
|
29
97
|
- Rakefile
|
30
98
|
- future-resource.gemspec
|
31
99
|
- lib/future-resource.rb
|
32
100
|
- lib/future-resource/version.rb
|
33
|
-
|
101
|
+
- spec/future-resource_spec.rb
|
34
102
|
homepage: https://github.com/adhearsion/future-resource
|
35
103
|
licenses: []
|
36
104
|
post_install_message:
|
@@ -51,8 +119,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
51
119
|
version: '0'
|
52
120
|
requirements: []
|
53
121
|
rubyforge_project: future-resource
|
54
|
-
rubygems_version: 1.
|
122
|
+
rubygems_version: 1.8.10
|
55
123
|
signing_key:
|
56
124
|
specification_version: 3
|
57
125
|
summary: Wait on resources being set in the future
|
58
|
-
test_files:
|
126
|
+
test_files:
|
127
|
+
- spec/future-resource_spec.rb
|
128
|
+
has_rdoc:
|