future 0.0.1
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/ChangeLog +4 -0
- data/README +29 -0
- data/Rakefile +135 -0
- data/lib/future.rb +48 -0
- data/spec/future_spec.rb +88 -0
- data/spec/spec.opts +1 -0
- metadata +70 -0
data/ChangeLog
ADDED
data/README
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
|
2
|
+
= future
|
3
|
+
|
4
|
+
|
5
|
+
== Description
|
6
|
+
|
7
|
+
|
8
|
+
== Installation
|
9
|
+
|
10
|
+
=== Archive Installation
|
11
|
+
|
12
|
+
rake install
|
13
|
+
|
14
|
+
=== Gem Installation
|
15
|
+
|
16
|
+
gem install future
|
17
|
+
|
18
|
+
|
19
|
+
== Features/Problems
|
20
|
+
|
21
|
+
|
22
|
+
== Synopsis
|
23
|
+
|
24
|
+
|
25
|
+
== Copyright
|
26
|
+
|
27
|
+
Author:: cho45 <cho45@lowreal.net>
|
28
|
+
Copyright:: Copyright (c) 2008 cho45
|
29
|
+
License::
|
data/Rakefile
ADDED
@@ -0,0 +1,135 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require "shipit"
|
3
|
+
require 'rake'
|
4
|
+
require 'rake/clean'
|
5
|
+
require 'rake/testtask'
|
6
|
+
require 'rake/packagetask'
|
7
|
+
require 'rake/gempackagetask'
|
8
|
+
require 'rake/rdoctask'
|
9
|
+
require 'rake/contrib/rubyforgepublisher'
|
10
|
+
require 'rake/contrib/sshpublisher'
|
11
|
+
require 'spec/rake/spectask'
|
12
|
+
require 'fileutils'
|
13
|
+
include FileUtils
|
14
|
+
|
15
|
+
$LOAD_PATH.unshift "lib"
|
16
|
+
require "future"
|
17
|
+
|
18
|
+
NAME = "future"
|
19
|
+
AUTHOR = "cho45"
|
20
|
+
EMAIL = "cho45@lowreal.net"
|
21
|
+
DESCRIPTION = "async library"
|
22
|
+
RUBYFORGE_PROJECT = "lowreal"
|
23
|
+
HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
|
24
|
+
BIN_FILES = %w( )
|
25
|
+
VERS = Future::VERSION
|
26
|
+
|
27
|
+
REV = File.read(".svn/entries")[/committed-rev="(d+)"/, 1] rescue nil
|
28
|
+
CLEAN.include ['**/.*.sw?', '*.gem', '.config']
|
29
|
+
RDOC_OPTS = [
|
30
|
+
'--title', "#{NAME} documentation",
|
31
|
+
"--charset", "utf-8",
|
32
|
+
"--opname", "index.html",
|
33
|
+
"--line-numbers",
|
34
|
+
"--main", "README",
|
35
|
+
"--inline-source",
|
36
|
+
]
|
37
|
+
|
38
|
+
task :default => [:spec]
|
39
|
+
task :package => [:clean]
|
40
|
+
|
41
|
+
Spec::Rake::SpecTask.new do |t|
|
42
|
+
t.spec_opts = ['--options', "spec/spec.opts"]
|
43
|
+
t.spec_files = FileList['spec/*_spec.rb']
|
44
|
+
t.rcov = true
|
45
|
+
end
|
46
|
+
|
47
|
+
spec = Gem::Specification.new do |s|
|
48
|
+
s.name = NAME
|
49
|
+
s.version = VERS
|
50
|
+
s.platform = Gem::Platform::RUBY
|
51
|
+
s.has_rdoc = true
|
52
|
+
s.extra_rdoc_files = ["README", "ChangeLog"]
|
53
|
+
s.rdoc_options += RDOC_OPTS + ['--exclude', '^(examples|extras)/']
|
54
|
+
s.summary = DESCRIPTION
|
55
|
+
s.description = DESCRIPTION
|
56
|
+
s.author = AUTHOR
|
57
|
+
s.email = EMAIL
|
58
|
+
s.homepage = HOMEPATH
|
59
|
+
s.executables = BIN_FILES
|
60
|
+
s.rubyforge_project = RUBYFORGE_PROJECT
|
61
|
+
s.bindir = "bin"
|
62
|
+
s.require_path = "lib"
|
63
|
+
s.autorequire = ""
|
64
|
+
s.test_files = Dir["test/test_*.rb"]
|
65
|
+
|
66
|
+
#s.add_dependency('activesupport', '>=1.3.1')
|
67
|
+
#s.required_ruby_version = '>= 1.8.2'
|
68
|
+
|
69
|
+
s.files = %w(README ChangeLog Rakefile) +
|
70
|
+
Dir.glob("{bin,doc,spec,test,lib,templates,generator,extras,website,script}/**/*") +
|
71
|
+
Dir.glob("ext/**/*.{h,c,rb}") +
|
72
|
+
Dir.glob("examples/**/*.rb") +
|
73
|
+
Dir.glob("tools/*.rb")
|
74
|
+
|
75
|
+
s.extensions = FileList["ext/**/extconf.rb"].to_a
|
76
|
+
end
|
77
|
+
|
78
|
+
Rake::GemPackageTask.new(spec) do |p|
|
79
|
+
p.need_tar = true
|
80
|
+
p.gem_spec = spec
|
81
|
+
end
|
82
|
+
|
83
|
+
task :install do
|
84
|
+
name = "#{NAME}-#{VERS}.gem"
|
85
|
+
sh %{rake package}
|
86
|
+
sh %{sudo gem install pkg/#{name}}
|
87
|
+
end
|
88
|
+
|
89
|
+
task :uninstall => [:clean] do
|
90
|
+
sh %{sudo gem uninstall #{NAME}}
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
Rake::RDocTask.new do |rdoc|
|
95
|
+
rdoc.rdoc_dir = 'html'
|
96
|
+
rdoc.options += RDOC_OPTS
|
97
|
+
rdoc.template = "resh"
|
98
|
+
#rdoc.template = "#{ENV['template']}.rb" if ENV['template']
|
99
|
+
if ENV['DOC_FILES']
|
100
|
+
rdoc.rdoc_files.include(ENV['DOC_FILES'].split(/,\s*/))
|
101
|
+
else
|
102
|
+
rdoc.rdoc_files.include('README', 'ChangeLog')
|
103
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
104
|
+
rdoc.rdoc_files.include('ext/**/*.c')
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
desc "Publish to RubyForge"
|
109
|
+
task :rubyforge => [:rdoc, :package] do
|
110
|
+
require 'rubyforge'
|
111
|
+
@local_dir = "html"
|
112
|
+
@host = "cho45@rubyforge.org"
|
113
|
+
@remote_dir = "/var/www/gforge-projects/#{RUBYFORGE_PROJECT}/#{NAME}"
|
114
|
+
sh %{rsync -r --delete --verbose #{@local_dir}/ #{@host}:#{@remote_dir}}
|
115
|
+
end
|
116
|
+
|
117
|
+
desc "Show information about the gem"
|
118
|
+
task :debug_gem do
|
119
|
+
require "date"
|
120
|
+
puts spec.to_ruby
|
121
|
+
end
|
122
|
+
|
123
|
+
Rake::ShipitTask.new do |s|
|
124
|
+
s.Step.new {
|
125
|
+
system("svn", "up")
|
126
|
+
}.and {}
|
127
|
+
s.ChangeVersion "lib/future.rb", "VERSION"
|
128
|
+
s.Commit
|
129
|
+
s.Task :clean, :package
|
130
|
+
s.RubyForge
|
131
|
+
s.Tag
|
132
|
+
s.Twitter
|
133
|
+
s.Task :rubyforge
|
134
|
+
end
|
135
|
+
|
data/lib/future.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
|
2
|
+
class Future
|
3
|
+
VERSION = "0.0.1"
|
4
|
+
|
5
|
+
def initialize(obj, name, args, block)
|
6
|
+
@obj, @name, @args, @block = obj, name, args, block
|
7
|
+
@th = Thread.start do
|
8
|
+
Thread.pass # 一応明示的に pass しておく
|
9
|
+
@obj.send(@name, *@args, &@block)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def method_missing(name, *args, &block)
|
14
|
+
@th.value.send(name, *args, &block)
|
15
|
+
end
|
16
|
+
|
17
|
+
# 全部委譲してなりすます
|
18
|
+
Object.instance_methods.each do |m|
|
19
|
+
next if %w|__send__ __id__ object_id|.include? m.to_s
|
20
|
+
undef_method m
|
21
|
+
end
|
22
|
+
|
23
|
+
module ObjectExtension
|
24
|
+
def async(name=nil, *args, &block)
|
25
|
+
name ? Future.new(self, name, args, block) : AsyncObject.new(self)
|
26
|
+
end
|
27
|
+
|
28
|
+
class AsyncObject
|
29
|
+
def initialize(obj)
|
30
|
+
@obj = obj
|
31
|
+
end
|
32
|
+
|
33
|
+
def method_missing(name, *args, &block)
|
34
|
+
Future.new(@obj, name, args, block)
|
35
|
+
end
|
36
|
+
|
37
|
+
Object.instance_methods.each do |m|
|
38
|
+
next if %w|__send__ __id__ object_id|.include? m.to_s
|
39
|
+
undef_method m
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class Object
|
46
|
+
include Future::ObjectExtension
|
47
|
+
end
|
48
|
+
|
data/spec/future_spec.rb
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
|
4
|
+
$LOAD_PATH << "lib"
|
5
|
+
$LOAD_PATH << "../lib"
|
6
|
+
|
7
|
+
require "future"
|
8
|
+
|
9
|
+
require "rubygems"
|
10
|
+
require "spec"
|
11
|
+
|
12
|
+
require "timeout"
|
13
|
+
|
14
|
+
class TestObject
|
15
|
+
@@result = []
|
16
|
+
|
17
|
+
def result
|
18
|
+
ret = @@result.dup
|
19
|
+
@@result.clear
|
20
|
+
ret
|
21
|
+
end
|
22
|
+
|
23
|
+
def heavy(n, value, &block)
|
24
|
+
sleep n
|
25
|
+
@@result << [n, value]
|
26
|
+
if block_given?
|
27
|
+
yield
|
28
|
+
else
|
29
|
+
value
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe Future do
|
35
|
+
before do
|
36
|
+
@o = TestObject.new
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should handle message asynchronously" do
|
40
|
+
future = nil
|
41
|
+
|
42
|
+
timeout(0.1) do
|
43
|
+
future = Future.new(Kernel, :sleep, [ 0.5 ], nil)
|
44
|
+
end
|
45
|
+
|
46
|
+
Proc.new {
|
47
|
+
timeout(0.1) do
|
48
|
+
future.inspect
|
49
|
+
end
|
50
|
+
}.should raise_error(Timeout::Error)
|
51
|
+
|
52
|
+
future.inspect # block
|
53
|
+
|
54
|
+
Proc.new {
|
55
|
+
timeout(0.1) do
|
56
|
+
future.inspect
|
57
|
+
end
|
58
|
+
}.should_not raise_error(Timeout::Error)
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should append async mehtod to Object" do
|
62
|
+
# normal
|
63
|
+
@o.heavy(0.1, :foo)
|
64
|
+
@o.result.should == [ [0.1, :foo] ]
|
65
|
+
|
66
|
+
# async
|
67
|
+
future = @o.async(:heavy, 0.1, :foo)
|
68
|
+
@o.result.should == [ ]
|
69
|
+
future.inspect.should == ":foo"
|
70
|
+
@o.result.should == [ [0.1, :foo] ]
|
71
|
+
|
72
|
+
# async object
|
73
|
+
future = @o.async.heavy(0.1, :foo)
|
74
|
+
@o.result.should == [ ]
|
75
|
+
future.inspect.should == ":foo"
|
76
|
+
@o.result.should == [ [0.1, :foo] ]
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should handle block correctly" do
|
80
|
+
future = @o.async(:heavy, 0.1, :foo) {
|
81
|
+
:bar
|
82
|
+
}
|
83
|
+
@o.result.should == [ ]
|
84
|
+
future.inspect.should == ":bar"
|
85
|
+
@o.result.should == [ [0.1, :foo] ]
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
metadata
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: future
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- cho45
|
8
|
+
autorequire: ""
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-06-14 00:00:00 +09:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: async library
|
17
|
+
email: cho45@lowreal.net
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- README
|
24
|
+
- ChangeLog
|
25
|
+
files:
|
26
|
+
- README
|
27
|
+
- ChangeLog
|
28
|
+
- Rakefile
|
29
|
+
- spec/future_spec.rb
|
30
|
+
- spec/spec.opts
|
31
|
+
- lib/future.rb
|
32
|
+
has_rdoc: true
|
33
|
+
homepage: http://lowreal.rubyforge.org
|
34
|
+
post_install_message:
|
35
|
+
rdoc_options:
|
36
|
+
- --title
|
37
|
+
- future documentation
|
38
|
+
- --charset
|
39
|
+
- utf-8
|
40
|
+
- --opname
|
41
|
+
- index.html
|
42
|
+
- --line-numbers
|
43
|
+
- --main
|
44
|
+
- README
|
45
|
+
- --inline-source
|
46
|
+
- --exclude
|
47
|
+
- ^(examples|extras)/
|
48
|
+
require_paths:
|
49
|
+
- lib
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: "0"
|
55
|
+
version:
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: "0"
|
61
|
+
version:
|
62
|
+
requirements: []
|
63
|
+
|
64
|
+
rubyforge_project: lowreal
|
65
|
+
rubygems_version: 1.1.1
|
66
|
+
signing_key:
|
67
|
+
specification_version: 2
|
68
|
+
summary: async library
|
69
|
+
test_files: []
|
70
|
+
|