future-resource 0.0.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -2,3 +2,7 @@
2
2
  .bundle
3
3
  Gemfile.lock
4
4
  pkg/*
5
+ tmp/*
6
+ *.swp
7
+ doc/*
8
+ spec/reports
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --colour
3
+ --tty
data/.travis.yml ADDED
@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - jruby-19mode # JRuby in 1.9 mode
6
+ - rbx-19mode # currently in active development, may or may not work for your project
7
+ - ruby-head
8
+ notifications:
9
+ irc: "irc.freenode.org#adhearsion"
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ # develop
2
+
3
+ # 1.0.0 - 2012-03-13
4
+ * Feature: Better testing and documentation
5
+
1
6
  # 0.0.2
2
7
  * Feature: FutureResource#resource now takes an optional argument of the number of seconds to wait before timing out. On timeout, a Timeout::Error will be raised.
3
8
 
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source "http://rubygems.org"
1
+ source :rubygems
2
2
 
3
3
  # Specify your gem's dependencies in future-resource.gemspec
4
4
  gemspec
data/Guardfile ADDED
@@ -0,0 +1,5 @@
1
+ guard 'rspec', :version => 2, :cli => '--format documentation' do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec/" }
5
+ end
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
@@ -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
@@ -1,3 +1,3 @@
1
1
  class FutureResource
2
- VERSION = "0.0.2"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -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.2
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: 2011-08-17 00:00:00.000000000 +01:00
14
- default_executable:
15
- dependencies: []
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
- has_rdoc: true
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.6.2
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: