ruby-ext 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.git/COMMIT_EDITMSG +1 -0
- data/.git/HEAD +1 -0
- data/.git/config +12 -0
- data/.git/description +1 -0
- data/.git/hooks/applypatch-msg.sample +15 -0
- data/.git/hooks/commit-msg.sample +24 -0
- data/.git/hooks/post-commit.sample +8 -0
- data/.git/hooks/post-receive.sample +15 -0
- data/.git/hooks/post-update.sample +8 -0
- data/.git/hooks/pre-applypatch.sample +14 -0
- data/.git/hooks/pre-commit.sample +46 -0
- data/.git/hooks/pre-rebase.sample +169 -0
- data/.git/hooks/prepare-commit-msg.sample +36 -0
- data/.git/hooks/update.sample +128 -0
- data/.git/index +0 -0
- data/.git/info/exclude +6 -0
- data/.git/logs/HEAD +6 -0
- data/.git/logs/refs/heads/master +6 -0
- data/.git/logs/refs/remotes/origin/master +5 -0
- data/.git/objects/01/a6ccb4f4fb0c6cfdf9ec1bb23779721cf503e9 +5 -0
- data/.git/objects/05/18bc8be5c58a5bd9d7fc82c75c87478aa361e9 +5 -0
- data/.git/objects/05/b76a8d022e0e0fbca5b69b9f7b4d2a132fcc89 +0 -0
- data/.git/objects/06/864a068d188ab7ae17e39d58d6c25dc49a8ff3 +2 -0
- data/.git/objects/0e/13cf36bc744c90f576c0a31c3f76dcf1fd2485 +0 -0
- data/.git/objects/0f/add343d54917efbd138ee2d7c092a52b12ebd5 +0 -0
- data/.git/objects/10/53306d48d434b477991f5fb64a6d8d3aca84a0 +0 -0
- data/.git/objects/17/70296a7ba0a9aaadd3e857ae34d92d2e13e935 +0 -0
- data/.git/objects/20/c2ee1bb9f6749181e464a4ce444092fc1a1ecb +0 -0
- data/.git/objects/26/4d70a16bbad0c5b3b16fb7a92bcc6178f2cca2 +2 -0
- data/.git/objects/27/eb5694d78540b1a489a1aff5415d4713d5fca9 +0 -0
- data/.git/objects/29/88f150ee1623b97d234b2742b30caad382775b +0 -0
- data/.git/objects/29/8cb590f97362cc7a326815dac3289a88b69153 +0 -0
- data/.git/objects/2b/edc3eb69408a817194c28d14fb2dbfed5a21c0 +2 -0
- data/.git/objects/2e/3e3fc8e46949a9b944da3c36207c444aa2c9b7 +0 -0
- data/.git/objects/2f/74073c8d1580f5a8fc59389b4c1b6d89e4d85f +0 -0
- data/.git/objects/34/a418e8c4b43510124491ff3be262edd8008043 +3 -0
- data/.git/objects/38/91f271b22f2a1caee6910a34139076e27ade00 +0 -0
- data/.git/objects/38/bf6dbb2520b448e08ac9cb353523bbc72118db +0 -0
- data/.git/objects/44/73d59f32a2806eca098ba6bf10cdc2e6453542 +0 -0
- data/.git/objects/44/e92f51b4c9a44497c7f170598fae64564052eb +0 -0
- data/.git/objects/4b/2ac3de91e560277749f749ed47230ef080d36c +0 -0
- data/.git/objects/54/4fb213faf0c1b4cc459ada84120823d204ae3a +4 -0
- data/.git/objects/55/a433dd00ba298006a2fc028964eb0cde7c2e5b +0 -0
- data/.git/objects/55/f338afb8c82f8cad38b28d0e8cf887f9bda1ce +1 -0
- data/.git/objects/57/cf2479bb9c6e31118c42c5cceaffada1862c72 +0 -0
- data/.git/objects/59/60bdbdc3be504b89371c2b4b09d22754251260 +0 -0
- data/.git/objects/59/653cefe5b174e4a7002100f024448cdb337373 +0 -0
- data/.git/objects/5c/28c251bb201232470340d73ed4cc4926cd241d +0 -0
- data/.git/objects/5c/536c5d712f7cf34e21be5526aa3e826888810f +0 -0
- data/.git/objects/5d/37379f1b929c7b82f96382fc256895a50e97fd +0 -0
- data/.git/objects/60/a681e873ca0ae0b7da3f37dbc5701f6e42b970 +1 -0
- data/.git/objects/61/d4509b8fc63e53b8e5d417ace33919e8a7a8f2 +0 -0
- data/.git/objects/6b/dcac704e4f8abe1928e8f3f5d9b7e17e4992de +0 -0
- data/.git/objects/6c/18afba63861887fb7ac53fee1b24c181b2a8e4 +0 -0
- data/.git/objects/70/222d828221b1884b6b8ce124b7f22eea5d420d +0 -0
- data/.git/objects/74/bf8f37d70d9818474e1fb5081f04c496741a28 +0 -0
- data/.git/objects/77/141a7a91a61baff283e5f16e55a720d0bc65e0 +2 -0
- data/.git/objects/81/6bb8c35fe2169fa9ecbcd40941c440e5d032e1 +2 -0
- data/.git/objects/81/a5373f6837b02ace55c07cebf4a60fb6d4b084 +0 -0
- data/.git/objects/82/8cab0a228a826cb346b6cf4ffffac84c674e4b +3 -0
- data/.git/objects/84/2a9747ce87d8b90ee360f7252b557ff8e19352 +0 -0
- data/.git/objects/90/eea923ef08bb39013e7cd5be777b7539733638 +0 -0
- data/.git/objects/93/276f74ef0e157c5f81eeec7844f30d4eceda7a +0 -0
- data/.git/objects/9e/a37d9fc7e1ad1504b50da2a1ec639c523fb8b7 +2 -0
- data/.git/objects/ab/daaab37771475482389bdfcb2021b1651ba399 +0 -0
- data/.git/objects/ad/e1a70e7cf984a2f518d19ef625362d78a5fbd0 +3 -0
- data/.git/objects/b6/17a8cc2ae7f6ea496051db493aa56edc178073 +0 -0
- data/.git/objects/b6/863b5d4c0a4d87b81a9bbc29e786fcf7ef0df2 +0 -0
- data/.git/objects/bc/ee5c51061bdb9ab5a5aea4f00245a8ab3689b2 +0 -0
- data/.git/objects/c3/faad9ba42388a50a57acf9df88f6d2a64a4122 +1 -0
- data/.git/objects/d4/8b935ca7e38d2434ceb1711544293f4baf8203 +0 -0
- data/.git/objects/dd/e851a435431f0c03b12f7a9ca6e5dd5ce80617 +0 -0
- data/.git/objects/e0/c54997bfab8a0bf135d0de79ddee431b9112ad +0 -0
- data/.git/objects/e9/d385c1913656b7ce15a1ac1424361d2e065a6c +0 -0
- data/.git/objects/f0/c37cf78e53e6f859111f35d9dbf52cbfbc633d +0 -0
- data/.git/objects/f1/2346269ed5287267f0271f57546291c013b318 +0 -0
- data/.git/objects/f3/655e33b96e5b8b25990a2ae88fcdfed415074b +0 -0
- data/.git/objects/f7/c0fa5621b81aca548c738c08907055696e1956 +0 -0
- data/.git/objects/f8/c960b12cbddb90f18123673e6778efdc822058 +2 -0
- data/.git/objects/fb/85b5793dcebae826b04cd8c37406504540d8a4 +2 -0
- data/.git/objects/fd/d3ef7ec06e804f3688491e21caaa4d89796b16 +0 -0
- data/.git/objects/pack/pack-304aec40b1be62a8e3c105c6423354d9e62bd089.idx +0 -0
- data/.git/objects/pack/pack-304aec40b1be62a8e3c105c6423354d9e62bd089.pack +0 -0
- data/.git/packed-refs +2 -0
- data/.git/refs/heads/master +1 -0
- data/.git/refs/remotes/origin/HEAD +1 -0
- data/.git/refs/remotes/origin/master +1 -0
- data/.gitignore +5 -0
- data/README.rdoc +3 -0
- data/Rakefile +64 -0
- data/lib/ruby_ext/declarative_cache.rb +167 -0
- data/lib/ruby_ext/file.rb +23 -0
- data/lib/ruby_ext/kernel.rb +21 -0
- data/lib/ruby_ext/module.rb +84 -0
- data/lib/ruby_ext/not_defined.rb +2 -0
- data/lib/ruby_ext/object.rb +7 -0
- data/lib/ruby_ext/open_constructor.rb +51 -0
- data/lib/ruby_ext/prepare_arguments.rb +105 -0
- data/lib/ruby_ext/should.rb +150 -0
- data/lib/ruby_ext/string.rb +21 -0
- data/lib/ruby_ext/symbol.rb +21 -0
- data/lib/ruby_ext/synchronizer.rb +31 -0
- data/lib/ruby_ext.rb +17 -0
- data/spec/assert_spec.rb +27 -0
- data/spec/declarative_cache_spec.rb +97 -0
- data/spec/kernel_spec.rb +16 -0
- data/spec/module_spec.rb +127 -0
- data/spec/open_constructor_spec.rb +39 -0
- data/spec/prepare_arguments_spec.rb +50 -0
- data/spec/spec.opts +3 -0
- data/spec/spec_require.rb +10 -0
- data/spec/synchronizer_spec.rb +69 -0
- metadata +166 -0
@@ -0,0 +1,150 @@
|
|
1
|
+
class Object
|
2
|
+
def should_be! method
|
3
|
+
unless self.send("#{method}?") == true
|
4
|
+
raise RuntimeError, "
|
5
|
+
ASSERTION FAILED:
|
6
|
+
#{self.inspect} should be #{method}
|
7
|
+
", caller
|
8
|
+
end
|
9
|
+
|
10
|
+
return self
|
11
|
+
end
|
12
|
+
alias_method :should_have!, :should_be!
|
13
|
+
|
14
|
+
def should_not_be! method
|
15
|
+
unless self.send("#{method}?") == false
|
16
|
+
raise RuntimeError, "
|
17
|
+
ASSERTION FAILED:
|
18
|
+
#{self.inspect} should not be #{method}
|
19
|
+
", caller
|
20
|
+
end
|
21
|
+
|
22
|
+
return self
|
23
|
+
end
|
24
|
+
alias_method :should_not_have!, :should_not_be!
|
25
|
+
|
26
|
+
def should! cmd, arg = NotDefined
|
27
|
+
result = case cmd
|
28
|
+
when :be_never_called then
|
29
|
+
false
|
30
|
+
|
31
|
+
when :be_nil then
|
32
|
+
self.equal? nil
|
33
|
+
|
34
|
+
when :be_a
|
35
|
+
if arg.class == Array
|
36
|
+
arg.any?{|klass| self.is_a? klass}
|
37
|
+
else
|
38
|
+
self.is_a? arg
|
39
|
+
end
|
40
|
+
|
41
|
+
when :be
|
42
|
+
if arg.class == Array
|
43
|
+
arg.any?{|klass| self.respond_to :is?, klass}
|
44
|
+
else
|
45
|
+
self.respond_to :is?, arg
|
46
|
+
end
|
47
|
+
|
48
|
+
when :include then
|
49
|
+
self.include? arg
|
50
|
+
|
51
|
+
when :be_in then
|
52
|
+
arg.include? self
|
53
|
+
|
54
|
+
when :be_true then
|
55
|
+
self
|
56
|
+
|
57
|
+
when :be_false then
|
58
|
+
!self
|
59
|
+
|
60
|
+
when :be_empty then
|
61
|
+
self.empty?
|
62
|
+
|
63
|
+
else
|
64
|
+
if arg.equal? NotDefined
|
65
|
+
self.send cmd
|
66
|
+
else
|
67
|
+
self.send cmd, arg
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
unless result
|
72
|
+
unless arg.equal? NotDefined
|
73
|
+
raise RuntimeError, "
|
74
|
+
ASSERTION FAILED:
|
75
|
+
#{self.inspect} should #{cmd} #{arg.inspect}
|
76
|
+
", caller
|
77
|
+
else
|
78
|
+
raise RuntimeError, "
|
79
|
+
ASSERTION FAILED:
|
80
|
+
#{self.inspect} should #{cmd}
|
81
|
+
", caller
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
return self
|
86
|
+
end
|
87
|
+
|
88
|
+
def should_not! cmd, arg = NotDefined
|
89
|
+
result =
|
90
|
+
case cmd
|
91
|
+
when :be_never_called then
|
92
|
+
false
|
93
|
+
|
94
|
+
when :be_nil then
|
95
|
+
self.equal? nil
|
96
|
+
|
97
|
+
when :be_a
|
98
|
+
if arg.class == Array
|
99
|
+
arg.any?{|klass| self.is_a? klass}
|
100
|
+
else
|
101
|
+
self.is_a? arg
|
102
|
+
end
|
103
|
+
|
104
|
+
when :be
|
105
|
+
if arg.class == Array
|
106
|
+
arg.any?{|klass| self.respond_to :is?, klass}
|
107
|
+
else
|
108
|
+
self.respond_to :is?, arg
|
109
|
+
end
|
110
|
+
|
111
|
+
when :include then
|
112
|
+
self.include? arg
|
113
|
+
|
114
|
+
when :be_in then
|
115
|
+
arg.include? self
|
116
|
+
|
117
|
+
when :be_true then
|
118
|
+
self
|
119
|
+
|
120
|
+
when :be_false then
|
121
|
+
!self
|
122
|
+
|
123
|
+
when :be_empty then
|
124
|
+
self.empty?
|
125
|
+
|
126
|
+
else
|
127
|
+
if arg.equal? NotDefined
|
128
|
+
self.send cmd
|
129
|
+
else
|
130
|
+
self.send cmd, arg
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
if result
|
135
|
+
unless arg.equal? NotDefined
|
136
|
+
raise RuntimeError, "
|
137
|
+
ASSERTION FAILED:
|
138
|
+
#{self.inspect} should not #{cmd} #{arg.inspect}
|
139
|
+
", caller
|
140
|
+
else
|
141
|
+
raise RuntimeError, "
|
142
|
+
ASSERTION FAILED:
|
143
|
+
#{self.inspect} should not #{cmd}
|
144
|
+
", caller
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
return self
|
149
|
+
end
|
150
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class String
|
2
|
+
def to_reader
|
3
|
+
self.to_sym
|
4
|
+
end
|
5
|
+
|
6
|
+
def to_writer
|
7
|
+
"#{self}=".to_sym
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_iv
|
11
|
+
"@#{self}"
|
12
|
+
end
|
13
|
+
|
14
|
+
def substitute binding
|
15
|
+
binding.should! :be_a, Binding
|
16
|
+
return gsub(/\#\{.+?\}/) do |term|
|
17
|
+
identifier = term.slice(2 .. term.size-2)
|
18
|
+
binding.eval identifier
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class Symbol
|
2
|
+
def <=> other
|
3
|
+
self.to_s <=> other.to_s
|
4
|
+
end
|
5
|
+
|
6
|
+
def to_reader
|
7
|
+
self
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_writer
|
11
|
+
"#{self}=".to_sym
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_iv
|
15
|
+
"@#{self}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def + other
|
19
|
+
(self.to_s + other.to_s).to_sym
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'monitor'
|
2
|
+
|
3
|
+
module Synchronizer
|
4
|
+
include MonitorMixin
|
5
|
+
|
6
|
+
module ClassMethods
|
7
|
+
def synchronize *methods
|
8
|
+
methods.each do |name|
|
9
|
+
als = (name.to_s =~ /^[_a-zA-Z0-9]+$/) ? name : DeclarativeCache.alias_counter.to_sym
|
10
|
+
|
11
|
+
alias_method :"sync_#{als}", name
|
12
|
+
script = "\
|
13
|
+
def #{name} *p, &b
|
14
|
+
synchronize{sync_#{als} *p, &b}
|
15
|
+
end"
|
16
|
+
class_eval script, __FILE__, __LINE__
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def synchronize_all
|
21
|
+
methods = self.instance_methods(false).collect{|m| m.to_sym}
|
22
|
+
synchronize *methods
|
23
|
+
end
|
24
|
+
|
25
|
+
protected
|
26
|
+
def alias_counter
|
27
|
+
@alias_counter += 1
|
28
|
+
return :"m#{@alias_counter}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/ruby_ext.rb
ADDED
data/spec/assert_spec.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec'
|
2
|
+
|
3
|
+
dir = File.dirname __FILE__
|
4
|
+
require "#{dir}/spec_require"
|
5
|
+
require "#{dir}/../lib/ruby_ext/should"
|
6
|
+
|
7
|
+
describe 'Assert' do
|
8
|
+
it 'should! & should_not!' do
|
9
|
+
lambda{should! :be_never_called}.should raise_error(/ever/)
|
10
|
+
lambda{nil.should_not! :be_nil}.should raise_error(/nil/)
|
11
|
+
1.should_not! :be_nil
|
12
|
+
1.should! :==, 1
|
13
|
+
lambda{1.should! :==, 2}.should raise_error(%r{==})
|
14
|
+
1.should! :be_in, [1, 2]
|
15
|
+
"".should! :be_a, String
|
16
|
+
String.should! :be, String
|
17
|
+
1.should! :<, 2
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should_be! & should_not_be!' do
|
21
|
+
[].should_be! :empty
|
22
|
+
[''].should_not_be! :empty
|
23
|
+
|
24
|
+
lambda{[''].should_be! :empty}.should raise_error(/should be/)
|
25
|
+
lambda{[].should_not_be! :empty}.should raise_error(/should not be/)
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'spec'
|
2
|
+
|
3
|
+
dir = File.dirname __FILE__
|
4
|
+
require "#{dir}/spec_require"
|
5
|
+
require "#{dir}/../lib/ruby_ext/should"
|
6
|
+
require "#{dir}/../lib/ruby_ext/declarative_cache"
|
7
|
+
|
8
|
+
describe 'DeclarativeCache' do
|
9
|
+
class CachedClass
|
10
|
+
attr_accessor :value
|
11
|
+
def value_get; @value end
|
12
|
+
|
13
|
+
attr_accessor :value2
|
14
|
+
def value2_get; @value2 end
|
15
|
+
|
16
|
+
attr_accessor :params
|
17
|
+
def params_get param; @params[param] end
|
18
|
+
end
|
19
|
+
|
20
|
+
DeclarativeCache.cached CachedClass, CachedClass, :value_get
|
21
|
+
DeclarativeCache.cached :cache_version_name, CachedClass, :value2_get
|
22
|
+
DeclarativeCache.cached_with_params CachedClass, CachedClass, :params_get
|
23
|
+
|
24
|
+
it "Simple Cache" do
|
25
|
+
o = CachedClass.new
|
26
|
+
o.value = 0
|
27
|
+
o.value2 = 0
|
28
|
+
o.value_get.should == 0
|
29
|
+
o.value2_get.should == 0
|
30
|
+
o.value = 1
|
31
|
+
o.value2 = 1
|
32
|
+
o.value_get.should == 0
|
33
|
+
o.value2_get.should == 0
|
34
|
+
DeclarativeCache.update CachedClass
|
35
|
+
o.value_get.should == 1
|
36
|
+
o.value2_get.should == 0
|
37
|
+
DeclarativeCache.update :cache_version_name
|
38
|
+
o.value2_get.should == 1
|
39
|
+
DeclarativeCache.update CachedClass, :cache_version_name
|
40
|
+
end
|
41
|
+
|
42
|
+
it "Cache With Params" do
|
43
|
+
o = CachedClass.new
|
44
|
+
o.params = {:a => :b}
|
45
|
+
o.params_get(:a).should == :b
|
46
|
+
o.params = {:a => :c}
|
47
|
+
o.params_get(:a).should == :b
|
48
|
+
DeclarativeCache.update CachedClass
|
49
|
+
o.params_get(:a).should == :c
|
50
|
+
end
|
51
|
+
|
52
|
+
class CachedClass2
|
53
|
+
class << self
|
54
|
+
attr_accessor :value
|
55
|
+
def value_get; @value end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
DeclarativeCache.cached CachedClass2, CachedClass2.singleton_class, :value_get
|
60
|
+
|
61
|
+
it "Simple Cache" do
|
62
|
+
CachedClass2.value = 0
|
63
|
+
CachedClass2.value_get.should == 0
|
64
|
+
CachedClass2.value = 1
|
65
|
+
CachedClass2.value_get.should == 0
|
66
|
+
DeclarativeCache.update CachedClass2
|
67
|
+
CachedClass2.value_get.should == 1
|
68
|
+
end
|
69
|
+
|
70
|
+
class MultipleCacheVersions
|
71
|
+
attr_accessor :value
|
72
|
+
def value_get; @value end
|
73
|
+
|
74
|
+
attr_accessor :value2
|
75
|
+
def value2_get params; @value2 end
|
76
|
+
end
|
77
|
+
|
78
|
+
DeclarativeCache.cached [:class, :resource_update, :security_update], MultipleCacheVersions, :value_get
|
79
|
+
DeclarativeCache.cached_with_params [:class, :resource_update, :security_update], MultipleCacheVersions, :value2_get
|
80
|
+
|
81
|
+
it "Multiple cache versions" do
|
82
|
+
o = MultipleCacheVersions.new
|
83
|
+
o.value, o.value2 = 0, 0
|
84
|
+
|
85
|
+
o.value_get.should == 0
|
86
|
+
o.value = 1
|
87
|
+
o.value_get.should == 0
|
88
|
+
DeclarativeCache.update :class
|
89
|
+
o.value_get.should == 1
|
90
|
+
o.value = 2
|
91
|
+
o.value_get.should == 1
|
92
|
+
DeclarativeCache.update :resource_update, :security_update
|
93
|
+
o.value_get.should == 2
|
94
|
+
|
95
|
+
o.value2_get("params").should == 0
|
96
|
+
end
|
97
|
+
end
|
data/spec/kernel_spec.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec'
|
2
|
+
|
3
|
+
dir = File.dirname __FILE__
|
4
|
+
require "#{dir}/../lib/ruby_ext/kernel"
|
5
|
+
|
6
|
+
describe 'Kernel' do
|
7
|
+
class Respond
|
8
|
+
def test; 2 end
|
9
|
+
end
|
10
|
+
|
11
|
+
it "respond_to" do
|
12
|
+
r = Respond.new
|
13
|
+
r.respond_to(:not_exist).should be_nil
|
14
|
+
r.respond_to(:test).should == 2
|
15
|
+
end
|
16
|
+
end
|
data/spec/module_spec.rb
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'spec'
|
2
|
+
|
3
|
+
dir = File.dirname __FILE__
|
4
|
+
require "#{dir}/../lib/ruby_ext/module"
|
5
|
+
|
6
|
+
|
7
|
+
describe "Module" do
|
8
|
+
class A
|
9
|
+
class B
|
10
|
+
class C
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
it "Namespace" do
|
17
|
+
File.namespace.should == nil
|
18
|
+
A::B::C.namespace.should == A::B
|
19
|
+
end
|
20
|
+
|
21
|
+
class AnonymousClass
|
22
|
+
class << self
|
23
|
+
def anonymous_name
|
24
|
+
self.name
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
it "name" do
|
31
|
+
A::B::C.name.should == "A::B::C"
|
32
|
+
end
|
33
|
+
|
34
|
+
class X; end
|
35
|
+
class Y < X; end
|
36
|
+
class Z < Y; end
|
37
|
+
|
38
|
+
|
39
|
+
it "each_ancestor" do
|
40
|
+
list = []
|
41
|
+
Z.each_ancestor{|a| list << a}
|
42
|
+
list.should include Y
|
43
|
+
list.should include X
|
44
|
+
list.should_not include Z
|
45
|
+
list.should_not include Object
|
46
|
+
list.should_not include Kernel
|
47
|
+
|
48
|
+
list = []
|
49
|
+
Z.each_ancestor(true){|a| list << a}
|
50
|
+
list.should include Y
|
51
|
+
list.should include X
|
52
|
+
list.should_not include Z
|
53
|
+
list.should include Object
|
54
|
+
list.should include Kernel
|
55
|
+
end
|
56
|
+
|
57
|
+
it "each_namespace" do
|
58
|
+
list = []
|
59
|
+
A::B::C.each_namespace{|n| list << n}
|
60
|
+
list.should == [A::B, A]
|
61
|
+
end
|
62
|
+
|
63
|
+
it "is?" do
|
64
|
+
File.is?(IO).should be_true
|
65
|
+
end
|
66
|
+
|
67
|
+
class WrapMethod
|
68
|
+
def method_name value
|
69
|
+
10*value
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
it "wrap_method" do
|
74
|
+
WrapMethod.wrap_method :method_name do |old, value|
|
75
|
+
send(old, value)*value
|
76
|
+
end
|
77
|
+
WrapMethod.new.method_name(10).should == 1000
|
78
|
+
end
|
79
|
+
|
80
|
+
module M
|
81
|
+
def m_m; end
|
82
|
+
module ClassMethods
|
83
|
+
def cm_m; end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
class C
|
88
|
+
inherit M
|
89
|
+
end
|
90
|
+
|
91
|
+
it "inherit" do
|
92
|
+
C.respond_to?(:cm_m).should be_true
|
93
|
+
C.new.respond_to?(:m_m).should be_true
|
94
|
+
end
|
95
|
+
|
96
|
+
module M2
|
97
|
+
include M
|
98
|
+
|
99
|
+
module ClassMethods
|
100
|
+
def cm2_m; end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
class D
|
105
|
+
inherit M2
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should inherit all ancestors class methods" do
|
109
|
+
D.respond_to?(:cm_m).should be_true
|
110
|
+
D.respond_to?(:cm2_m).should be_true
|
111
|
+
D.new.respond_to?(:m_m).should be_true
|
112
|
+
end
|
113
|
+
|
114
|
+
class C2
|
115
|
+
inherit M
|
116
|
+
end
|
117
|
+
|
118
|
+
it "Shouldn't redefine ancestors class methods" do
|
119
|
+
C2.respond_to?(:cm2_m).should be_false
|
120
|
+
end
|
121
|
+
|
122
|
+
it "inherited_instance_methods" do
|
123
|
+
im = Set.instance_methods - Set.inherited_instance_methods
|
124
|
+
im.should include("union")
|
125
|
+
im.should_not include("object_id")
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec'
|
2
|
+
|
3
|
+
dir = File.dirname __FILE__
|
4
|
+
require "#{dir}/spec_require"
|
5
|
+
require "#{dir}/../lib/ruby_ext/open_constructor"
|
6
|
+
|
7
|
+
describe 'OpenConstructor' do
|
8
|
+
class Test
|
9
|
+
include OpenConstructor
|
10
|
+
attr_accessor :name, :value
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should initialize atributes from Hash' do
|
14
|
+
t = Test.new.set(:name => 'name', :value => 'value')
|
15
|
+
[t.name, t.value].should == ['name', 'value']
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should initialize atributes from any Object' do
|
19
|
+
t = Test.new.set(:name => 'name', :value => 'value')
|
20
|
+
t2 = Test.new.set t
|
21
|
+
[t2.name, t2.value].should == ['name', 'value']
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'restrict copied values' do
|
25
|
+
t = Test.new.set(:name => 'name', :value => 'value')
|
26
|
+
t2 = Test.new.set t, [:name]
|
27
|
+
[t2.name, t2.value].should == ['name', nil]
|
28
|
+
|
29
|
+
t = {:name => 'name', :value => 'value'}
|
30
|
+
t2 = Test.new.set t, [:name]
|
31
|
+
[t2.name, t2.value].should == ['name', nil]
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'to_hash' do
|
35
|
+
h = {:name => 'name', :value => 'value'}
|
36
|
+
t = Test.new.set h
|
37
|
+
t.to_hash.should == h
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec'
|
2
|
+
|
3
|
+
dir = File.dirname __FILE__
|
4
|
+
require "#{dir}/spec_require"
|
5
|
+
require "#{dir}/../lib/ruby_ext/should"
|
6
|
+
require "#{dir}/../lib/ruby_ext/prepare_arguments"
|
7
|
+
|
8
|
+
describe "Prepare Arguments" do
|
9
|
+
|
10
|
+
it "basic parsing" do
|
11
|
+
ArgumentsParser.register :m, [:object, :array, :hash]
|
12
|
+
ArgumentsParser.parse_arguments_for(:m, :o, 1).should == [:o, [1], {}]
|
13
|
+
end
|
14
|
+
|
15
|
+
it "basic method wrapping" do
|
16
|
+
class BMWTest
|
17
|
+
def add content, options
|
18
|
+
:ok
|
19
|
+
end
|
20
|
+
prepare_arguments_for :add, {:type => :object, :required => true}, :hash
|
21
|
+
end
|
22
|
+
|
23
|
+
BMWTest.new.add('text').should == :ok
|
24
|
+
end
|
25
|
+
|
26
|
+
it "except_last_hash for array" do
|
27
|
+
ArgumentsParser.register :m, [{:type => :array, :range => :except_last_hash}, :hash]
|
28
|
+
ArgumentsParser.parse_arguments_for(:m, 1, 2, 3, :a => :b).should == [[1, 2, 3], {:a => :b}]
|
29
|
+
ArgumentsParser.parse_arguments_for(:m, :a => :b).should == [[], {:a => :b}]
|
30
|
+
ArgumentsParser.parse_arguments_for(:m, 1, 2, 3).should == [[1, 2, 3], {}]
|
31
|
+
end
|
32
|
+
|
33
|
+
it "except_last_hash for object" do
|
34
|
+
ArgumentsParser.register :m, [{:type => :object, :range => :except_last_hash}, :hash]
|
35
|
+
ArgumentsParser.parse_arguments_for(:m, 1, :a => :b).should == [1, {:a => :b}]
|
36
|
+
ArgumentsParser.parse_arguments_for(:m, :a => :b).should == [nil, {:a => :b}]
|
37
|
+
ArgumentsParser.parse_arguments_for(:m, 1).should == [1, {}]
|
38
|
+
end
|
39
|
+
|
40
|
+
it "default value" do
|
41
|
+
ArgumentsParser.register :m, [{:type => :object, :default => ""}]
|
42
|
+
ArgumentsParser.parse_arguments_for(:m).should == [""]
|
43
|
+
end
|
44
|
+
|
45
|
+
it "string" do
|
46
|
+
ArgumentsParser.register :m, [:string]
|
47
|
+
ArgumentsParser.parse_arguments_for(:m).should == [""]
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
data/spec/spec.opts
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'spec'
|
2
|
+
|
3
|
+
dir = File.dirname __FILE__
|
4
|
+
require "#{dir}/spec_require"
|
5
|
+
require "#{dir}/../lib/ruby_ext/synchronizer"
|
6
|
+
|
7
|
+
module RubyExt
|
8
|
+
describe "Synchronize" do
|
9
|
+
it "synchronize" do
|
10
|
+
class Account
|
11
|
+
inherit Synchronizer
|
12
|
+
attr_reader :from, :to
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
super
|
16
|
+
@from, @to = 0, 0
|
17
|
+
end
|
18
|
+
|
19
|
+
def transfer
|
20
|
+
@from -= 1
|
21
|
+
@to += 1
|
22
|
+
end
|
23
|
+
synchronize :transfer
|
24
|
+
end
|
25
|
+
|
26
|
+
a, threads = Account.new, []
|
27
|
+
100.times do
|
28
|
+
t = Thread.new do
|
29
|
+
100.times{a.transfer}
|
30
|
+
end
|
31
|
+
threads << t
|
32
|
+
end
|
33
|
+
threads.each{|t| t.join}
|
34
|
+
|
35
|
+
a.from.should == -10_000
|
36
|
+
a.to.should == 10_000
|
37
|
+
end
|
38
|
+
|
39
|
+
it "synchronize_all" do
|
40
|
+
class Account
|
41
|
+
inherit Synchronizer
|
42
|
+
attr_reader :from, :to
|
43
|
+
|
44
|
+
def initialize
|
45
|
+
super
|
46
|
+
@from, @to = 0, 0
|
47
|
+
end
|
48
|
+
|
49
|
+
def transfer
|
50
|
+
@from -= 1
|
51
|
+
@to += 1
|
52
|
+
end
|
53
|
+
synchronize_all
|
54
|
+
end
|
55
|
+
|
56
|
+
a, threads = Account.new, []
|
57
|
+
100.times do
|
58
|
+
t = Thread.new do
|
59
|
+
100.times{a.transfer}
|
60
|
+
end
|
61
|
+
threads << t
|
62
|
+
end
|
63
|
+
threads.each{|t| t.join}
|
64
|
+
|
65
|
+
a.from.should == -10_000
|
66
|
+
a.to.should == 10_000
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|