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 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: