async-proxy 0.0.0 → 0.1.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/README.rdoc CHANGED
@@ -62,6 +62,14 @@ This means that in most cases you can treat an async object exactly in the same
62
62
  wrapped object. You generally don't need to make explicit +sync+ calls (although you can if
63
63
  you want to control the exact moment the object will be "realized")
64
64
 
65
+ =Soft timeouts
66
+ Sometimes you are interested in a value only if it can be computed in a certain time.
67
+
68
+ async_result = async_proxy.slow_method
69
+ ..
70
+ result = async_result.sync(:soft_timeout => 0.30)
71
+
72
+
65
73
  = Locking and thread safety
66
74
 
67
75
  Async Proxy makes no attempt to guarantee thread safety. It can be considered as just syntactic
data/Rakefile CHANGED
@@ -11,6 +11,7 @@ begin
11
11
  gem.homepage = "http://github.com/angelf/async-proxy"
12
12
  gem.authors = ["Angel Faus"]
13
13
  gem.add_development_dependency "rspec", ">= 1.2.9"
14
+ gem.add_dependency "system_timer"
14
15
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
15
16
  end
16
17
  Jeweler::GemcutterTasks.new
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.0
1
+ 0.1.0
data/async-proxy.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{async-proxy}
8
- s.version = "0.0.0"
8
+ s.version = "0.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Angel Faus"]
12
- s.date = %q{2010-07-04}
12
+ s.date = %q{2010-09-12}
13
13
  s.description = %q{turn any object into an async version of itself, so that all method calls will run asynchronously, including dependent computations}
14
14
  s.email = %q{angel@vlex.com}
15
15
  s.extra_rdoc_files = [
@@ -49,11 +49,14 @@ Gem::Specification.new do |s|
49
49
 
50
50
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
51
51
  s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
52
+ s.add_runtime_dependency(%q<system_timer>, [">= 0"])
52
53
  else
53
54
  s.add_dependency(%q<rspec>, [">= 1.2.9"])
55
+ s.add_dependency(%q<system_timer>, [">= 0"])
54
56
  end
55
57
  else
56
58
  s.add_dependency(%q<rspec>, [">= 1.2.9"])
59
+ s.add_dependency(%q<system_timer>, [">= 0"])
57
60
  end
58
61
  end
59
62
 
data/lib/async-proxy.rb CHANGED
@@ -1,4 +1,4 @@
1
+ require 'system_timer'
1
2
  require File.join(File.dirname(__FILE__), 'object_extensions')
2
3
  require File.join(File.dirname(__FILE__), 'object_proxy')
3
4
  require File.join(File.dirname(__FILE__), 'computed_proxy')
4
-
@@ -1,3 +1,4 @@
1
+
1
2
  module AsyncProxy
2
3
 
3
4
  # a specialization of ObjectProxy to be used when the wraped value is dependent on another
@@ -26,8 +27,17 @@ module AsyncProxy
26
27
  self
27
28
  end
28
29
 
29
- def sync
30
- wait_for_computation
30
+ # waits for the computation to finish and returns the actual result
31
+ #
32
+ # optional arguments:
33
+ # - timeout: the maximum number of seconds that the computation can take.
34
+
35
+ def sync(options = {})
36
+ if options[:timeout]
37
+ SystemTimer.timeout_after(options[:timeout]){wait_for_computation}
38
+ else
39
+ wait_for_computation
40
+ end
31
41
  @result
32
42
  end
33
43
 
@@ -41,7 +51,7 @@ module AsyncProxy
41
51
 
42
52
  def wait_for_computation
43
53
  callable.sync # ensures the callable has finished and run its callbacks
44
- @thread.join if !@done
54
+ @thread.join unless @done
45
55
  end
46
56
 
47
57
  private
@@ -5,7 +5,7 @@ class Object
5
5
  end
6
6
 
7
7
  # ensures we are dealing with the "real" synchronous object
8
- def sync
9
- self # a no-op in Object, will be redefine in async proxies classes
8
+ def sync(options = {})
9
+ self # a no-op in Object, will be redefined in async proxies classes
10
10
  end
11
11
  end
data/lib/object_proxy.rb CHANGED
@@ -7,7 +7,7 @@ module AsyncProxy
7
7
  @callbacks = []
8
8
  end
9
9
 
10
- def sync
10
+ def sync(options = {})
11
11
  @object
12
12
  end
13
13
 
@@ -5,6 +5,7 @@ class Integer
5
5
  Kernel.sleep(1)
6
6
  self + 1
7
7
  end
8
+
8
9
  end
9
10
 
10
11
  describe "AsyncProxy" do
@@ -48,4 +49,8 @@ describe "AsyncProxy" do
48
49
  intermediate_plus_2.sync.should == 3
49
50
  end
50
51
 
52
+ it "timeout" do
53
+ lambda {1.async.slow_inc.sync(:timeout => 0.5)}.should raise_error(Timeout::Error)
54
+ end
55
+
51
56
  end
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  $LOAD_PATH.unshift(File.dirname(__FILE__))
2
2
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ require 'rubygems'
3
4
  require 'async-proxy'
4
5
  require 'spec'
5
6
  require 'spec/autorun'
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
+ - 1
7
8
  - 0
8
- - 0
9
- version: 0.0.0
9
+ version: 0.1.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Angel Faus
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-07-04 00:00:00 +02:00
17
+ date: 2010-09-12 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -31,6 +31,18 @@ dependencies:
31
31
  version: 1.2.9
32
32
  type: :development
33
33
  version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: system_timer
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 0
43
+ version: "0"
44
+ type: :runtime
45
+ version_requirements: *id002
34
46
  description: turn any object into an async version of itself, so that all method calls will run asynchronously, including dependent computations
35
47
  email: angel@vlex.com
36
48
  executables: []