motion-support 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/Gemfile +1 -1
- data/README.md +231 -2
- data/Rakefile +3 -3
- data/app/app_delegate.rb +0 -2
- data/examples/Inflector/.gitignore +16 -0
- data/examples/Inflector/Gemfile +5 -0
- data/examples/Inflector/Rakefile +13 -0
- data/examples/Inflector/app/app_delegate.rb +8 -0
- data/examples/Inflector/app/inflections.rb +5 -0
- data/examples/Inflector/app/inflector_view_controller.rb +120 -0
- data/examples/Inflector/app/words_view_controller.rb +101 -0
- data/examples/Inflector/resources/Default-568h@2x.png +0 -0
- data/examples/Inflector/spec/main_spec.rb +9 -0
- data/lib/motion-support/core_ext/array.rb +13 -0
- data/lib/motion-support/core_ext/class.rb +8 -0
- data/lib/motion-support/core_ext/hash.rb +16 -0
- data/lib/motion-support/core_ext/integer.rb +9 -0
- data/lib/motion-support/core_ext/module.rb +14 -0
- data/lib/motion-support/core_ext/numeric.rb +8 -0
- data/lib/motion-support/core_ext/object.rb +14 -0
- data/lib/motion-support/core_ext/range.rb +8 -0
- data/lib/motion-support/core_ext/string.rb +14 -0
- data/lib/motion-support/core_ext/time.rb +19 -0
- data/lib/motion-support/core_ext.rb +3 -0
- data/lib/motion-support/inflector.rb +12 -156
- data/lib/motion-support.rb +5 -5
- data/motion/_stdlib/cgi.rb +22 -0
- data/motion/_stdlib/date.rb +77 -0
- data/motion/_stdlib/time.rb +19 -0
- data/motion/core_ext/array/access.rb +28 -0
- data/motion/core_ext/array/conversions.rb +86 -0
- data/motion/core_ext/array/extract_options.rb +11 -0
- data/motion/core_ext/array/grouping.rb +99 -0
- data/motion/core_ext/array/prepend_and_append.rb +7 -0
- data/motion/core_ext/array/wrap.rb +45 -0
- data/{lib/motion-support → motion/core_ext}/array.rb +0 -4
- data/motion/core_ext/class/attribute.rb +119 -0
- data/motion/core_ext/class/attribute_accessors.rb +168 -0
- data/motion/core_ext/date/acts_like.rb +8 -0
- data/motion/core_ext/date/calculations.rb +117 -0
- data/motion/core_ext/date/conversions.rb +56 -0
- data/motion/core_ext/date_and_time/calculations.rb +232 -0
- data/motion/core_ext/enumerable.rb +90 -0
- data/motion/core_ext/hash/deep_merge.rb +27 -0
- data/motion/core_ext/hash/except.rb +15 -0
- data/motion/core_ext/hash/indifferent_access.rb +19 -0
- data/motion/core_ext/hash/keys.rb +138 -0
- data/motion/core_ext/hash/reverse_merge.rb +22 -0
- data/motion/core_ext/hash/slice.rb +40 -0
- data/motion/core_ext/integer/inflections.rb +27 -0
- data/motion/core_ext/integer/multiple.rb +10 -0
- data/motion/core_ext/integer/time.rb +41 -0
- data/{lib/motion-support → motion/core_ext}/metaclass.rb +0 -0
- data/motion/core_ext/module/aliasing.rb +69 -0
- data/motion/core_ext/module/anonymous.rb +19 -0
- data/motion/core_ext/module/attr_internal.rb +38 -0
- data/motion/core_ext/module/attribute_accessors.rb +64 -0
- data/motion/core_ext/module/delegation.rb +175 -0
- data/motion/core_ext/module/introspection.rb +60 -0
- data/motion/core_ext/module/reachable.rb +5 -0
- data/motion/core_ext/module/remove_method.rb +12 -0
- data/motion/core_ext/ns_dictionary.rb +11 -0
- data/motion/core_ext/numeric/bytes.rb +44 -0
- data/motion/core_ext/numeric/conversions.rb +7 -0
- data/motion/core_ext/numeric/time.rb +75 -0
- data/motion/core_ext/object/acts_like.rb +10 -0
- data/motion/core_ext/object/blank.rb +105 -0
- data/motion/core_ext/object/deep_dup.rb +44 -0
- data/motion/core_ext/object/duplicable.rb +83 -0
- data/motion/core_ext/object/instance_variables.rb +28 -0
- data/motion/core_ext/object/to_param.rb +58 -0
- data/motion/core_ext/object/to_query.rb +26 -0
- data/motion/core_ext/object/try.rb +78 -0
- data/motion/core_ext/range/include_range.rb +23 -0
- data/motion/core_ext/range/overlaps.rb +8 -0
- data/motion/core_ext/regexp.rb +5 -0
- data/motion/core_ext/string/access.rb +104 -0
- data/motion/core_ext/string/behavior.rb +6 -0
- data/motion/core_ext/string/exclude.rb +11 -0
- data/motion/core_ext/string/filters.rb +55 -0
- data/motion/core_ext/string/indent.rb +43 -0
- data/motion/core_ext/string/inflections.rb +195 -0
- data/motion/core_ext/string/starts_ends_with.rb +4 -0
- data/motion/core_ext/string/strip.rb +24 -0
- data/motion/core_ext/time/acts_like.rb +8 -0
- data/motion/core_ext/time/calculations.rb +215 -0
- data/motion/core_ext/time/conversions.rb +52 -0
- data/motion/duration.rb +104 -0
- data/motion/hash_with_indifferent_access.rb +251 -0
- data/motion/inflections.rb +67 -0
- data/motion/inflector/inflections.rb +203 -0
- data/motion/inflector/methods.rb +321 -0
- data/{lib/motion-support → motion}/logger.rb +0 -0
- data/{lib/motion-support → motion}/version.rb +1 -1
- data/motion-support.gemspec +2 -2
- data/spec/motion-support/_helpers/constantize_test_cases.rb +75 -0
- data/spec/motion-support/_helpers/inflector_test_cases.rb +313 -0
- data/spec/motion-support/core_ext/array/access_spec.rb +29 -0
- data/spec/motion-support/core_ext/array/conversion_spec.rb +60 -0
- data/spec/motion-support/core_ext/array/extract_options_spec.rb +15 -0
- data/spec/motion-support/core_ext/array/grouping_spec.rb +85 -0
- data/spec/motion-support/core_ext/array/prepend_and_append_spec.rb +25 -0
- data/spec/motion-support/core_ext/array/wrap_spec.rb +19 -0
- data/spec/motion-support/{array_spec.rb → core_ext/array_spec.rb} +0 -5
- data/spec/motion-support/core_ext/class/attribute_accessor_spec.rb +127 -0
- data/spec/motion-support/core_ext/class/attribute_spec.rb +92 -0
- data/spec/motion-support/core_ext/date/acts_like_spec.rb +11 -0
- data/spec/motion-support/core_ext/date/calculation_spec.rb +186 -0
- data/spec/motion-support/core_ext/date/conversion_spec.rb +18 -0
- data/spec/motion-support/core_ext/date_and_time/calculation_spec.rb +336 -0
- data/spec/motion-support/core_ext/enumerable_spec.rb +130 -0
- data/spec/motion-support/core_ext/hash/deep_merge_spec.rb +32 -0
- data/spec/motion-support/core_ext/hash/except_spec.rb +43 -0
- data/spec/motion-support/core_ext/hash/key_spec.rb +230 -0
- data/spec/motion-support/core_ext/hash/reverse_merge_spec.rb +26 -0
- data/spec/motion-support/core_ext/hash/slice_spec.rb +61 -0
- data/spec/motion-support/core_ext/integer/inflection_spec.rb +23 -0
- data/spec/motion-support/core_ext/integer/multiple_spec.rb +19 -0
- data/spec/motion-support/{metaclass_spec.rb → core_ext/metaclass_spec.rb} +0 -0
- data/spec/motion-support/core_ext/module/aliasing_spec.rb +143 -0
- data/spec/motion-support/core_ext/module/anonymous_spec.rb +29 -0
- data/spec/motion-support/core_ext/module/attr_internal_spec.rb +104 -0
- data/spec/motion-support/core_ext/module/attribute_accessor_spec.rb +86 -0
- data/spec/motion-support/core_ext/module/delegation_spec.rb +136 -0
- data/spec/motion-support/core_ext/module/introspection_spec.rb +70 -0
- data/spec/motion-support/core_ext/module/reachable_spec.rb +61 -0
- data/spec/motion-support/core_ext/module/remove_method_spec.rb +25 -0
- data/spec/motion-support/core_ext/numeric/bytes_spec.rb +43 -0
- data/spec/motion-support/core_ext/object/acts_like_spec.rb +21 -0
- data/spec/motion-support/core_ext/object/blank_spec.rb +54 -0
- data/spec/motion-support/core_ext/object/deep_dup_spec.rb +54 -0
- data/spec/motion-support/core_ext/object/duplicable_spec.rb +31 -0
- data/spec/motion-support/core_ext/object/instance_variable_spec.rb +19 -0
- data/spec/motion-support/core_ext/object/to_param_spec.rb +75 -0
- data/spec/motion-support/core_ext/object/to_query_spec.rb +37 -0
- data/spec/motion-support/core_ext/object/try_spec.rb +92 -0
- data/spec/motion-support/core_ext/range/include_range_spec.rb +31 -0
- data/spec/motion-support/core_ext/range/overlap_spec.rb +43 -0
- data/spec/motion-support/core_ext/regexp_spec.rb +7 -0
- data/spec/motion-support/core_ext/string/access_spec.rb +53 -0
- data/spec/motion-support/core_ext/string/behavior_spec.rb +7 -0
- data/spec/motion-support/core_ext/string/exclude_spec.rb +8 -0
- data/spec/motion-support/core_ext/string/filter_spec.rb +48 -0
- data/spec/motion-support/core_ext/string/indent_spec.rb +56 -0
- data/spec/motion-support/core_ext/string/inflection_spec.rb +142 -0
- data/spec/motion-support/core_ext/string/starts_end_with_spec.rb +14 -0
- data/spec/motion-support/core_ext/string/strip_spec.rb +34 -0
- data/spec/motion-support/core_ext/string_spec.rb +88 -0
- data/spec/motion-support/core_ext/time/acts_like_spec.rb +11 -0
- data/spec/motion-support/core_ext/time/calculation_spec.rb +201 -0
- data/spec/motion-support/core_ext/time/conversion_spec.rb +54 -0
- data/spec/motion-support/duration_spec.rb +107 -0
- data/spec/motion-support/hash_with_indifferent_access_spec.rb +605 -0
- data/spec/motion-support/inflector_spec.rb +474 -35
- data/spec/motion-support/ns_dictionary_spec.rb +29 -0
- metadata +212 -35
- data/lib/motion-support/cattr_accessor.rb +0 -19
- data/lib/motion-support/class_inheritable_accessor.rb +0 -23
- data/lib/motion-support/class_inheritable_array.rb +0 -29
- data/lib/motion-support/hash.rb +0 -31
- data/lib/motion-support/nilclass.rb +0 -5
- data/lib/motion-support/object.rb +0 -17
- data/lib/motion-support/string.rb +0 -71
- data/spec/motion-support/cattr_accessor_spec.rb +0 -49
- data/spec/motion-support/class_inheritable_accessor_spec.rb +0 -49
- data/spec/motion-support/class_inheritable_array_spec.rb +0 -61
- data/spec/motion-support/hash_spec.rb +0 -31
- data/spec/motion-support/nilclass_spec.rb +0 -5
- data/spec/motion-support/object_spec.rb +0 -43
- data/spec/motion-support/string_spec.rb +0 -145
@@ -0,0 +1,143 @@
|
|
1
|
+
module Aliasing
|
2
|
+
class File
|
3
|
+
public
|
4
|
+
def open(file)
|
5
|
+
end
|
6
|
+
def open_with_internet(url)
|
7
|
+
open_without_internet(url)
|
8
|
+
end
|
9
|
+
alias_method_chain :open, :internet
|
10
|
+
|
11
|
+
protected
|
12
|
+
def exist?(file)
|
13
|
+
end
|
14
|
+
def exist_with_internet?(url)
|
15
|
+
exist_without_internet?(url)
|
16
|
+
end
|
17
|
+
alias_method_chain :exist?, :internet
|
18
|
+
|
19
|
+
private
|
20
|
+
def remove!(file)
|
21
|
+
end
|
22
|
+
def remove_with_internet!(url)
|
23
|
+
remove_without_internet!(url)
|
24
|
+
end
|
25
|
+
alias_method_chain :remove!, :internet
|
26
|
+
end
|
27
|
+
|
28
|
+
class Content
|
29
|
+
attr_accessor :title, :Data
|
30
|
+
|
31
|
+
def initialize
|
32
|
+
@title, @Data = nil, nil
|
33
|
+
end
|
34
|
+
|
35
|
+
def title?
|
36
|
+
!title.nil?
|
37
|
+
end
|
38
|
+
|
39
|
+
def Data?
|
40
|
+
!self.Data.nil?
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class Email < Content
|
45
|
+
alias_attribute :subject, :title
|
46
|
+
alias_attribute :body, :Data
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "module" do
|
51
|
+
describe "alias_method_chain" do
|
52
|
+
it "should define 'without' method" do
|
53
|
+
Aliasing::File.new.should.respond_to :open_without_internet
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should respond to original method" do
|
57
|
+
Aliasing::File.new.should.respond_to :open
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should respond to 'with' method" do
|
61
|
+
Aliasing::File.new.should.respond_to :open_with_internet
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should preserve question punctuation" do
|
65
|
+
Aliasing::File.new.should.respond_to :exist_without_internet?
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should preserve bang punctuation" do
|
69
|
+
# Ruby objects don't respond to private methods
|
70
|
+
Aliasing::File.new.should.not.respond_to :remove_without_internet!
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should keep public methods public" do
|
74
|
+
Aliasing::File.new.public_methods.should.include :"open_without_internet:"
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should keep protected methods protected" do
|
78
|
+
Aliasing::File.new.protected_methods.should.include :"exist_without_internet?:"
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should keep private methods private" do
|
82
|
+
Aliasing::File.new.private_methods.should.include :"remove_without_internet!:"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "alias_attribute" do
|
87
|
+
before do
|
88
|
+
@email = Aliasing::Email.new
|
89
|
+
end
|
90
|
+
|
91
|
+
describe "getter" do
|
92
|
+
it "should exist" do
|
93
|
+
lambda { @email.subject }.should.not.raise
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should read" do
|
97
|
+
@email.title = "hello"
|
98
|
+
@email.subject.should == "hello"
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should read from uppercase method" do
|
102
|
+
@email.body = "world"
|
103
|
+
@email.Data.should == "world"
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
describe "setter" do
|
108
|
+
it "should exist" do
|
109
|
+
lambda { @email.subject = "hello" }.should.not.raise
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should write" do
|
113
|
+
@email.subject = "hello"
|
114
|
+
@email.title.should == "hello"
|
115
|
+
end
|
116
|
+
|
117
|
+
it "should write to uppercase method" do
|
118
|
+
@email.Data = "world"
|
119
|
+
@email.body.should == "world"
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
describe "question method" do
|
124
|
+
it "should exist" do
|
125
|
+
lambda { @email.subject? }.should.not.raise
|
126
|
+
end
|
127
|
+
|
128
|
+
it "should return false for nil attribute" do
|
129
|
+
@email.subject?.should == false
|
130
|
+
end
|
131
|
+
|
132
|
+
it "should return true for non-nil attribute" do
|
133
|
+
@email.title = "hello"
|
134
|
+
@email.subject?.should == true
|
135
|
+
end
|
136
|
+
|
137
|
+
it "should return true for non-nil uppercase attribute" do
|
138
|
+
@email.body = "hello"
|
139
|
+
@email.Data?.should == true
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
describe "module" do
|
2
|
+
describe "anonymous?" do
|
3
|
+
it "should return true for an anonymous module" do
|
4
|
+
Module.new.anonymous?.should == true
|
5
|
+
end
|
6
|
+
|
7
|
+
it "should return true for an anonymous class" do
|
8
|
+
Class.new.anonymous?.should == true
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should return false for a named module" do
|
12
|
+
Kernel.anonymous?.should == false
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should return false for a named class" do
|
16
|
+
Object.anonymous?.should == false
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should return false for module that acquired a name" do
|
20
|
+
NamedModule = Module.new
|
21
|
+
NamedModule.anonymous?.should == false
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should return false for module that acquired a name" do
|
25
|
+
NamedClass = Class.new
|
26
|
+
NamedClass.anonymous?.should == false
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
describe "module" do
|
2
|
+
describe "attr_internal" do
|
3
|
+
before do
|
4
|
+
@target = Class.new
|
5
|
+
@instance = @target.new
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "reader" do
|
9
|
+
it "should define reader" do
|
10
|
+
lambda { @target.attr_internal_reader :foo }.should.not.raise
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "defined" do
|
14
|
+
before do
|
15
|
+
@target.attr_internal_reader :foo
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should not have instance variable at first" do
|
19
|
+
@instance.instance_variable_defined?('@_foo').should.not.be.true
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should not define writer" do
|
23
|
+
lambda { @instance.foo = 1 }.should.raise NoMethodError
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should return value of internal reader" do
|
27
|
+
@instance.instance_variable_set('@_foo', 1)
|
28
|
+
lambda { @instance.foo.should == 1 }.should.not.raise
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "writer" do
|
34
|
+
it "should define writer" do
|
35
|
+
lambda { @target.attr_internal_writer :foo }.should.not.raise
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "defined" do
|
39
|
+
before do
|
40
|
+
@target.attr_internal_writer :foo
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should not have instance variable at first" do
|
44
|
+
@instance.instance_variable_defined?('@_foo').should.not.be.true
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should set instance variable" do
|
48
|
+
lambda { @instance.foo = 1 }.should.not.raise
|
49
|
+
@instance.instance_variable_defined?('@_foo').should.be.true
|
50
|
+
@instance.instance_variable_get('@_foo').should == 1
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should not define reader" do
|
54
|
+
lambda { @instance.foo }.should.raise NoMethodError
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "accessor" do
|
60
|
+
it "should define accessor" do
|
61
|
+
lambda { @target.attr_internal :foo }.should.not.raise
|
62
|
+
end
|
63
|
+
|
64
|
+
describe "defined" do
|
65
|
+
before do
|
66
|
+
@target.attr_internal :foo
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should not have instance variable at first" do
|
70
|
+
@instance.instance_variable_defined?('@_foo').should.not.be.true
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should set instance variable" do
|
74
|
+
lambda { @instance.foo = 1 }.should.not.raise
|
75
|
+
@instance.instance_variable_defined?('@_foo').should.be.true
|
76
|
+
@instance.instance_variable_get('@_foo').should == 1
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should read from instance variable" do
|
80
|
+
@instance.instance_variable_set('@_foo', 1)
|
81
|
+
lambda { @instance.foo }.should.not.raise
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "naming format" do
|
87
|
+
it "should allow custom naming format for instance variable" do
|
88
|
+
begin
|
89
|
+
Module.attr_internal_naming_format.should == '@_%s'
|
90
|
+
lambda { Module.attr_internal_naming_format = '@abc%sdef' }.should.not.raise
|
91
|
+
@target.attr_internal :foo
|
92
|
+
|
93
|
+
@instance.instance_variable_defined?('@_foo').should.be.false
|
94
|
+
@instance.instance_variable_defined?('@abcfoodef').should.be.false
|
95
|
+
lambda { @instance.foo = 1 }.should.not.raise
|
96
|
+
@instance.instance_variable_defined?('@_foo').should.not.be.true
|
97
|
+
@instance.instance_variable_defined?('@abcfoodef').should.be.true
|
98
|
+
ensure
|
99
|
+
Module.attr_internal_naming_format = '@_%s'
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
describe "module" do
|
2
|
+
describe "attribute accessors" do
|
3
|
+
before do
|
4
|
+
m = @module = Module.new
|
5
|
+
@module.instance_eval do
|
6
|
+
mattr_accessor :foo
|
7
|
+
mattr_accessor :bar, :instance_writer => false
|
8
|
+
mattr_reader :shaq, :instance_reader => false
|
9
|
+
mattr_accessor :camp, :instance_accessor => false
|
10
|
+
end
|
11
|
+
@class = Class.new
|
12
|
+
@class.instance_eval { include m }
|
13
|
+
@object = @class.new
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "reader" do
|
17
|
+
it "should return nil by default" do
|
18
|
+
@module.foo.should.be.nil
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "writer" do
|
23
|
+
it "should set value" do
|
24
|
+
@module.foo = :test
|
25
|
+
@module.foo.should == :test
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should set value through instance writer" do
|
29
|
+
@object.foo = :bar
|
30
|
+
@object.foo.should == :bar
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should set instance reader's value through module's writer" do
|
34
|
+
@module.foo = :test
|
35
|
+
@object.foo.should == :test
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should set module reader's value through instances's writer" do
|
39
|
+
@object.foo = :bar
|
40
|
+
@module.foo.should == :bar
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "instance_writer => false" do
|
45
|
+
it "should not create instance writer" do
|
46
|
+
@module.should.respond_to :foo
|
47
|
+
@module.should.respond_to :foo=
|
48
|
+
@object.should.respond_to :bar
|
49
|
+
@object.should.not.respond_to :bar=
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "instance_reader => false" do
|
54
|
+
it "should not create instance reader" do
|
55
|
+
@module.should.respond_to :shaq
|
56
|
+
@object.should.not.respond_to :shaq
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "instance_accessor => false" do
|
61
|
+
it "should not create reader or writer" do
|
62
|
+
@module.should.respond_to :camp
|
63
|
+
@object.should.not.respond_to :camp
|
64
|
+
@object.should.not.respond_to :camp=
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "invalid attribute accessors" do
|
70
|
+
it "should raise NameError when creating an invalid reader" do
|
71
|
+
lambda do
|
72
|
+
Class.new do
|
73
|
+
mattr_reader "invalid attribute name"
|
74
|
+
end
|
75
|
+
end.should.raise NameError
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should raise NameError when creating an invalid writer" do
|
79
|
+
lambda do
|
80
|
+
Class.new do
|
81
|
+
mattr_writer "invalid attribute name"
|
82
|
+
end
|
83
|
+
end.should.raise NameError
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,136 @@
|
|
1
|
+
module ModuleDelegation
|
2
|
+
class Delegator
|
3
|
+
def receive
|
4
|
+
"result"
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
class InstanceVariable
|
9
|
+
def initialize
|
10
|
+
@instance_variable = Delegator.new
|
11
|
+
end
|
12
|
+
delegate :receive, :to => '@instance_variable'
|
13
|
+
end
|
14
|
+
|
15
|
+
class ClassVariable
|
16
|
+
def initialize
|
17
|
+
@@class_variable = Delegator.new
|
18
|
+
end
|
19
|
+
delegate :receive, :to => '@@class_variable'
|
20
|
+
end
|
21
|
+
|
22
|
+
class RelativeConstant
|
23
|
+
Receiver = Delegator.new
|
24
|
+
delegate :receive, :to => 'Receiver'
|
25
|
+
end
|
26
|
+
|
27
|
+
class AbsoluteConstant
|
28
|
+
Receiver = Delegator.new
|
29
|
+
delegate :receive, :to => 'ModuleDelegation::AbsoluteConstant::Receiver'
|
30
|
+
end
|
31
|
+
|
32
|
+
class Method
|
33
|
+
def method
|
34
|
+
Delegator.new
|
35
|
+
end
|
36
|
+
delegate :receive, :to => :method
|
37
|
+
end
|
38
|
+
|
39
|
+
class MethodChain
|
40
|
+
def first
|
41
|
+
self
|
42
|
+
end
|
43
|
+
|
44
|
+
def second
|
45
|
+
Delegator.new
|
46
|
+
end
|
47
|
+
delegate :receive, :to => 'first.second'
|
48
|
+
end
|
49
|
+
|
50
|
+
class ConstantSingleton
|
51
|
+
class Nested
|
52
|
+
def self.method
|
53
|
+
Delegator.new
|
54
|
+
end
|
55
|
+
end
|
56
|
+
delegate :receive, :to => 'Nested.method'
|
57
|
+
end
|
58
|
+
|
59
|
+
class AllowNil
|
60
|
+
delegate :receive, :to => '@undefined', :allow_nil => true
|
61
|
+
end
|
62
|
+
|
63
|
+
class DisallowNil
|
64
|
+
delegate :receive, :to => '@undefined'
|
65
|
+
end
|
66
|
+
|
67
|
+
class NonexistentMethod
|
68
|
+
delegate :receive, :to => :nonexistent_method
|
69
|
+
end
|
70
|
+
|
71
|
+
class Prefix
|
72
|
+
def method
|
73
|
+
Delegator.new
|
74
|
+
end
|
75
|
+
delegate :receive, :to => :method, :prefix => 'foo'
|
76
|
+
end
|
77
|
+
|
78
|
+
class AutoPrefix
|
79
|
+
def method
|
80
|
+
Delegator.new
|
81
|
+
end
|
82
|
+
delegate :receive, :to => :method, :prefix => true
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "module" do
|
87
|
+
describe "delegation" do
|
88
|
+
it "should delegate to instance variable" do
|
89
|
+
ModuleDelegation::InstanceVariable.new.receive.should == "result"
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should delegate to class variable" do
|
93
|
+
ModuleDelegation::ClassVariable.new.receive.should == "result"
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should delegate to relative constant" do
|
97
|
+
ModuleDelegation::RelativeConstant.new.receive.should == "result"
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should delegate to absolute constant" do
|
101
|
+
ModuleDelegation::AbsoluteConstant.new.receive.should == "result"
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should delegate to method" do
|
105
|
+
ModuleDelegation::Method.new.receive.should == "result"
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should delegate to method chain" do
|
109
|
+
ModuleDelegation::MethodChain.new.receive.should == "result"
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should delegate to constant's singleton method" do
|
113
|
+
ModuleDelegation::ConstantSingleton.new.receive.should == "result"
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should delegate to nil without raising an error when allowed" do
|
117
|
+
ModuleDelegation::AllowNil.new.receive.should.be.nil
|
118
|
+
end
|
119
|
+
|
120
|
+
it "should raise an error when delegating to nil and not allowed" do
|
121
|
+
lambda { ModuleDelegation::DisallowNil.new.receive }.should.raise
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should raise an error when delegating to non-existent method" do
|
125
|
+
lambda { ModuleDelegation::NonexistentMethod.new.receive }.should.raise NoMethodError
|
126
|
+
end
|
127
|
+
|
128
|
+
it "should delegate with prefix" do
|
129
|
+
ModuleDelegation::Prefix.new.foo_receive.should == "result"
|
130
|
+
end
|
131
|
+
|
132
|
+
it "should delegate to method with automatic prefix" do
|
133
|
+
ModuleDelegation::AutoPrefix.new.method_receive.should == "result"
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module ModuleIntrospection
|
2
|
+
module Foo
|
3
|
+
module Bar
|
4
|
+
end
|
5
|
+
end
|
6
|
+
module Baz
|
7
|
+
end
|
8
|
+
end
|
9
|
+
ModuleIntrospectionAlias = ModuleIntrospection::Foo
|
10
|
+
|
11
|
+
describe "module" do
|
12
|
+
describe "introspection" do
|
13
|
+
describe "parent_name" do
|
14
|
+
it "should return nil for top-level module" do
|
15
|
+
ModuleIntrospection.parent_name.should.be.nil
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should return direct parent for nested module" do
|
19
|
+
ModuleIntrospection::Foo.parent_name.should == "ModuleIntrospection"
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should return nil for anonymous module" do
|
23
|
+
Module.new.parent_name.should.be.nil
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should return original parent name for module alias" do
|
27
|
+
ModuleIntrospectionAlias.parent_name.should == "ModuleIntrospection"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "parent" do
|
32
|
+
it "should return Object for top-level module" do
|
33
|
+
ModuleIntrospection.parent.should == Object
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should return direct parent for nested module" do
|
37
|
+
ModuleIntrospection::Foo.parent.should == ModuleIntrospection
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should return nil for anonymous module" do
|
41
|
+
Module.new.parent.should == Object
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should return original parent for module alias" do
|
45
|
+
ModuleIntrospectionAlias.parent.should == ModuleIntrospection
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "parents" do
|
50
|
+
it "should return Object for top-level module" do
|
51
|
+
ModuleIntrospection.parents.should == [Object]
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should return parents for nested module" do
|
55
|
+
ModuleIntrospection::Foo::Bar.parents.should == [ModuleIntrospection::Foo, ModuleIntrospection, Object]
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should return original parents for module alias" do
|
59
|
+
ModuleIntrospectionAlias.parents.should == [ModuleIntrospection, Object]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "local_constants" do
|
64
|
+
it "should return all direct constants within the module as symbols" do
|
65
|
+
ModuleIntrospection.local_constants.should.include :Foo
|
66
|
+
ModuleIntrospection.local_constants.should.include :Baz
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
describe "Module" do
|
2
|
+
describe "reachable?" do
|
3
|
+
it "should be false for an anonymous module" do
|
4
|
+
Module.new.should.not.be.reachable
|
5
|
+
end
|
6
|
+
|
7
|
+
it "should be false for an anonymous class" do
|
8
|
+
Class.new.should.not.be.reachable
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should be true for a named module" do
|
12
|
+
Kernel.should.be.reachable
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should be true for a named class" do
|
16
|
+
Object.should.be.reachable
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should be false for a named class whose constant has gone" do
|
20
|
+
class C; end
|
21
|
+
c = C
|
22
|
+
|
23
|
+
Object.send(:remove_const, :C)
|
24
|
+
|
25
|
+
c.should.not.be.reachable
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should be false for a named module whose constant has gone" do
|
29
|
+
module M; end
|
30
|
+
m = M
|
31
|
+
|
32
|
+
Object.send(:remove_const, :M)
|
33
|
+
|
34
|
+
m.should.not.be.reachable
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should be false for a named class whose constant was redefined" do
|
38
|
+
class C; end
|
39
|
+
c = C
|
40
|
+
|
41
|
+
Object.send(:remove_const, :C)
|
42
|
+
|
43
|
+
class C; end
|
44
|
+
|
45
|
+
C.should.be.reachable
|
46
|
+
c.should.not.be.reachable
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should be false for a named module whose constant was redefined" do
|
50
|
+
module M; end
|
51
|
+
m = M
|
52
|
+
|
53
|
+
Object.send(:remove_const, :M)
|
54
|
+
|
55
|
+
module M; end
|
56
|
+
|
57
|
+
M.should.be.reachable
|
58
|
+
m.should.not.be.reachable
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module RemoveMethodSpec
|
2
|
+
class A
|
3
|
+
def do_something
|
4
|
+
return 1
|
5
|
+
end
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "module" do
|
10
|
+
describe "remove_method" do
|
11
|
+
it "should remove a method from an object" do
|
12
|
+
RemoveMethodSpec::A.class_eval {
|
13
|
+
self.remove_possible_method(:do_something)
|
14
|
+
}
|
15
|
+
RemoveMethodSpec::A.new.should.not.respond_to :do_something
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_redefine_method_in_an_object
|
19
|
+
RemoveMethodSpec::A.class_eval {
|
20
|
+
self.redefine_method(:do_something) { return 100 }
|
21
|
+
}
|
22
|
+
RemoveMethodSpec::A.new.do_something.should == 100
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
describe "Numeric" do
|
2
|
+
describe "bytes" do
|
3
|
+
it "should calculate kilobytes" do
|
4
|
+
1.kilobyte.should == 1024.bytes
|
5
|
+
3.kilobytes.should == 3072
|
6
|
+
3.kilobyte.should == 3072
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should calculate megabytes" do
|
10
|
+
1.megabyte.should == 1024.kilobytes
|
11
|
+
3.5.megabytes.should == 3584.0.kilobytes
|
12
|
+
3.megabytes.should == 1024.kilobytes + 2.megabytes
|
13
|
+
512.megabytes.should == 2.gigabytes / 4
|
14
|
+
3.megabytes.should == 3145728
|
15
|
+
3.megabyte.should == 3145728
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should calculate gigabytes" do
|
19
|
+
3.5.gigabytes.should == 3584.0.megabytes
|
20
|
+
10.gigabytes.should == 256.megabytes * 20 + 5.gigabytes
|
21
|
+
3.gigabytes.should == 3221225472
|
22
|
+
3.gigabyte.should == 3221225472
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should calculate terabytes" do
|
26
|
+
1.terabyte.should == 1.kilobyte ** 4
|
27
|
+
3.terabytes.should == 3298534883328
|
28
|
+
3.terabyte.should == 3298534883328
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should calculate petabytes" do
|
32
|
+
1.petabyte.should == 1.kilobyte ** 5
|
33
|
+
3.petabytes.should == 3377699720527872
|
34
|
+
3.petabyte.should == 3377699720527872
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should calculate exabytes" do
|
38
|
+
1.exabyte.should == 1.kilobyte ** 6
|
39
|
+
3.exabytes.should == 3458764513820540928
|
40
|
+
3.exabyte.should == 3458764513820540928
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|