motion-support 0.1.0 → 0.2.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 +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
|