motion_blender-support 0.2.7
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.
- checksums.yaml +7 -0
- data/.gitignore +13 -0
- data/.yardopts +1 -0
- data/Gemfile +4 -0
- data/HACKS.md +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +359 -0
- data/Rakefile +14 -0
- data/app/app_delegate.rb +5 -0
- 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 +109 -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/callbacks.rb +8 -0
- data/lib/motion-support/concern.rb +4 -0
- data/lib/motion-support/core_ext/array.rb +10 -0
- data/lib/motion-support/core_ext/class.rb +5 -0
- data/lib/motion-support/core_ext/hash.rb +13 -0
- data/lib/motion-support/core_ext/integer.rb +6 -0
- data/lib/motion-support/core_ext/module.rb +11 -0
- data/lib/motion-support/core_ext/numeric.rb +6 -0
- data/lib/motion-support/core_ext/object.rb +12 -0
- data/lib/motion-support/core_ext/range.rb +5 -0
- data/lib/motion-support/core_ext/string.rb +13 -0
- data/lib/motion-support/core_ext/time.rb +16 -0
- data/lib/motion-support/core_ext.rb +13 -0
- data/lib/motion-support/inflector.rb +8 -0
- data/lib/motion-support.rb +81 -0
- data/motion/_stdlib/array.rb +13 -0
- data/motion/_stdlib/cgi.rb +22 -0
- data/motion/_stdlib/date.rb +81 -0
- data/motion/_stdlib/enumerable.rb +9 -0
- data/motion/_stdlib/time.rb +19 -0
- data/motion/callbacks.rb +511 -0
- data/motion/concern.rb +122 -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/motion/core_ext/array.rb +19 -0
- 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_delete_if.rb +23 -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 +150 -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/motion/core_ext/kernel/singleton_class.rb +6 -0
- data/motion/core_ext/metaclass.rb +8 -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 +14 -0
- data/motion/core_ext/ns_string.rb +14 -0
- data/motion/core_ext/numeric/bytes.rb +44 -0
- data/motion/core_ext/numeric/conversions.rb +49 -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 +87 -0
- data/motion/core_ext/object/inclusion.rb +15 -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 +178 -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/descendants_tracker.rb +50 -0
- data/motion/duration.rb +104 -0
- data/motion/hash_with_indifferent_access.rb +253 -0
- data/motion/inflections.rb +67 -0
- data/motion/inflector/inflections.rb +203 -0
- data/motion/inflector/methods.rb +321 -0
- data/motion/logger.rb +47 -0
- data/motion/number_helper.rb +54 -0
- data/motion/version.rb +3 -0
- data/motion_blender-support.gemspec +21 -0
- data/spec/motion-support/_helpers/constantize_test_cases.rb +75 -0
- data/spec/motion-support/_helpers/inflector_test_cases.rb +270 -0
- data/spec/motion-support/callback_spec.rb +702 -0
- data/spec/motion-support/concern_spec.rb +93 -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/core_ext/array_spec.rb +16 -0
- 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_delete_if_spec.rb +19 -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 +236 -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/core_ext/kernel/singleton_class_spec.rb +9 -0
- data/spec/motion-support/core_ext/metaclass_spec.rb +9 -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/numeric/conversions_spec.rb +40 -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/inclusion_spec.rb +34 -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 +49 -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 +53 -0
- data/spec/motion-support/descendants_tracker_spec.rb +58 -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 +504 -0
- data/spec/motion-support/ns_dictionary_spec.rb +89 -0
- data/spec/motion-support/ns_string_spec.rb +182 -0
- data/spec/motion-support/number_helper_spec.rb +55 -0
- metadata +352 -0
|
@@ -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
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
describe "Numeric" do
|
|
2
|
+
describe "conversions" do
|
|
3
|
+
describe "phone" do
|
|
4
|
+
it "should format phone number without area code" do
|
|
5
|
+
5551234.to_s(:phone).should == "555-1234"
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
it "should format long number without area code" do
|
|
9
|
+
225551212.to_s(:phone).should == "22-555-1212"
|
|
10
|
+
8005551212.to_s(:phone).should == "800-555-1212"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "should format phone number with area code" do
|
|
14
|
+
8005551212.to_s(:phone, :area_code => true).should == "(800) 555-1212"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "should format phone number with custom delimiter" do
|
|
18
|
+
8005551212.to_s(:phone, :delimiter => " ").should == "800 555 1212"
|
|
19
|
+
5551212.to_s(:phone, :delimiter => '.').should == "555.1212"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "should append extension to phone number" do
|
|
23
|
+
8005551212.to_s(:phone, :area_code => true, :extension => 123).should == "(800) 555-1212 x 123"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "should not append whitespace as extension to the phone number" do
|
|
27
|
+
8005551212.to_s(:phone, :extension => " ").should == "800-555-1212"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "should format phone number with country code" do
|
|
31
|
+
8005551212.to_s(:phone, :country_code => 1).should == "+1-800-555-1212"
|
|
32
|
+
225551212.to_s(:phone, :country_code => 45).should == "+45-22-555-1212"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "should format phone number with country code and empty delimiter" do
|
|
36
|
+
8005551212.to_s(:phone, :country_code => 1, :delimiter => '').should == "+18005551212"
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
class DuckFoo
|
|
2
|
+
def acts_like_foo?
|
|
3
|
+
true
|
|
4
|
+
end
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
describe "Object" do
|
|
8
|
+
describe "acts_like" do
|
|
9
|
+
it "should not act like anything" do
|
|
10
|
+
object = Object.new
|
|
11
|
+
object.should.not.acts_like(:time)
|
|
12
|
+
object.should.not.acts_like(:date)
|
|
13
|
+
object.should.not.acts_like(:foo)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "should allow subclasses to act like something" do
|
|
17
|
+
object = DuckFoo.new
|
|
18
|
+
object.should.acts_like(:foo)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
class EmptyTrue
|
|
2
|
+
def empty?() true; end
|
|
3
|
+
end
|
|
4
|
+
|
|
5
|
+
class EmptyFalse
|
|
6
|
+
def empty?() false; end
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
BLANK = [ EmptyTrue.new, nil, false, '', ' ', " \n\t \r ", ' ', [], {} ]
|
|
10
|
+
NOT = [ EmptyFalse.new, Object.new, true, 0, 1, 'a', [nil], { nil => 0 } ]
|
|
11
|
+
|
|
12
|
+
describe "blank" do
|
|
13
|
+
describe "blank?" do
|
|
14
|
+
BLANK.each do |v|
|
|
15
|
+
it "should treat #{v.inspect} as blank" do
|
|
16
|
+
v.should.be.blank
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
NOT.each do |v|
|
|
21
|
+
it "should treat #{v.inspect} as NOT blank" do
|
|
22
|
+
v.should.not.be.blank
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
describe "present?" do
|
|
28
|
+
BLANK.each do |v|
|
|
29
|
+
it "should treat #{v.inspect} as NOT present" do
|
|
30
|
+
v.should.not.be.present
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
NOT.each do |v|
|
|
35
|
+
it "should treat #{v.inspect} as present" do
|
|
36
|
+
v.should.be.present
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
describe "presence" do
|
|
42
|
+
BLANK.each do |v|
|
|
43
|
+
it "should return nil for #{v.inspect}.presence" do
|
|
44
|
+
v.presence.should.be.nil
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
NOT.each do |v|
|
|
49
|
+
it "should return self for #{v.inspect}.presence" do
|
|
50
|
+
v.presence.should == v
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
describe "deep_dup" do
|
|
2
|
+
describe "array" do
|
|
3
|
+
it "should deep_dup nested array" do
|
|
4
|
+
array = [1, [2, 3]]
|
|
5
|
+
dup = array.deep_dup
|
|
6
|
+
dup[1][2] = 4
|
|
7
|
+
array[1][2].should.be.nil
|
|
8
|
+
dup[1][2].should == 4
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "should deep_dup array with hash inside" do
|
|
12
|
+
array = [1, { :a => 2, :b => 3 } ]
|
|
13
|
+
dup = array.deep_dup
|
|
14
|
+
dup[1][:c] = 4
|
|
15
|
+
array[1][:c].should.be.nil
|
|
16
|
+
dup[1][:c].should == 4
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
describe "hash" do
|
|
21
|
+
it "should deep_dup nested hash" do
|
|
22
|
+
hash = { :a => { :b => 'b' } }
|
|
23
|
+
dup = hash.deep_dup
|
|
24
|
+
dup[:a][:c] = 'c'
|
|
25
|
+
hash[:a][:c].should.be.nil
|
|
26
|
+
dup[:a][:c].should == 'c'
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "should deep_dup hash with array inside" do
|
|
30
|
+
hash = { :a => [1, 2] }
|
|
31
|
+
dup = hash.deep_dup
|
|
32
|
+
dup[:a][2] = 'c'
|
|
33
|
+
hash[:a][2].should.be.nil
|
|
34
|
+
dup[:a][2].should == 'c'
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "should deep_dup hash with init value" do
|
|
38
|
+
zero_hash = Hash.new 0
|
|
39
|
+
hash = { :a => zero_hash }
|
|
40
|
+
dup = hash.deep_dup
|
|
41
|
+
dup[:a][44].should == 0
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
describe "Object" do
|
|
46
|
+
it "should deep_dup object" do
|
|
47
|
+
object = Object.new
|
|
48
|
+
dup = object.deep_dup
|
|
49
|
+
dup.instance_variable_set(:@a, 1)
|
|
50
|
+
object.should.not.be.instance_variable_defined(:@a)
|
|
51
|
+
dup.should.be.instance_variable_defined(:@a)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|