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,504 @@
|
|
|
1
|
+
module InflectorHelper
|
|
2
|
+
# Dups the singleton and yields, restoring the original inflections later.
|
|
3
|
+
# Use this in tests what modify the state of the singleton.
|
|
4
|
+
#
|
|
5
|
+
# This helper is implemented by setting @__instance__ because in some tests
|
|
6
|
+
# there are module functions that access MotionSupport::Inflector.inflections,
|
|
7
|
+
# so we need to replace the singleton itself.
|
|
8
|
+
def with_dup
|
|
9
|
+
original = MotionSupport::Inflector::Inflections.instance_variable_get(:@__instance__)
|
|
10
|
+
MotionSupport::Inflector::Inflections.instance_variable_set(:@__instance__, original.dup)
|
|
11
|
+
yield
|
|
12
|
+
ensure
|
|
13
|
+
MotionSupport::Inflector::Inflections.instance_variable_set(:@__instance__, original)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe "Inflector" do
|
|
18
|
+
describe "singularize/pluralize" do
|
|
19
|
+
extend InflectorHelper
|
|
20
|
+
|
|
21
|
+
it "should pluralize plurals" do
|
|
22
|
+
MotionSupport::Inflector.pluralize("plurals").should == "plurals"
|
|
23
|
+
MotionSupport::Inflector.pluralize("Plurals").should == "Plurals"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "should pluralize empty string" do
|
|
27
|
+
MotionSupport::Inflector.pluralize("").should == ""
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
MotionSupport::Inflector.inflections.uncountable.each do |word|
|
|
31
|
+
it "should treat #{word} as uncountable" do
|
|
32
|
+
MotionSupport::Inflector.singularize(word).should == word
|
|
33
|
+
MotionSupport::Inflector.pluralize(word).should == word
|
|
34
|
+
MotionSupport::Inflector.singularize(word).should == MotionSupport::Inflector.pluralize(word)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
InflectorTestCases::SingularToPlural.each do |singular, plural|
|
|
39
|
+
it "should pluralize singular #{singular}" do
|
|
40
|
+
MotionSupport::Inflector.pluralize(singular).should == plural
|
|
41
|
+
MotionSupport::Inflector.pluralize(singular.capitalize).should == plural.capitalize
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "should singularize plural #{plural}" do
|
|
45
|
+
MotionSupport::Inflector.singularize(plural).should == singular
|
|
46
|
+
MotionSupport::Inflector.singularize(plural.capitalize).should == singular.capitalize
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "should pluralize plural #{plural}" do
|
|
50
|
+
MotionSupport::Inflector.pluralize(plural).should == plural
|
|
51
|
+
MotionSupport::Inflector.pluralize(plural.capitalize).should == plural.capitalize
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "should singularize singular #{singular}" do
|
|
55
|
+
MotionSupport::Inflector.singularize(singular).should == singular
|
|
56
|
+
MotionSupport::Inflector.singularize(singular.capitalize).should == singular.capitalize
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it "should handle uncountable words non-greedily" do
|
|
61
|
+
with_dup do
|
|
62
|
+
uncountable_word = "ors"
|
|
63
|
+
countable_word = "sponsor"
|
|
64
|
+
|
|
65
|
+
MotionSupport::Inflector.inflections.uncountable << uncountable_word
|
|
66
|
+
|
|
67
|
+
MotionSupport::Inflector.singularize(uncountable_word).should == uncountable_word
|
|
68
|
+
MotionSupport::Inflector.pluralize(uncountable_word).should == uncountable_word
|
|
69
|
+
MotionSupport::Inflector.pluralize(uncountable_word).should == MotionSupport::Inflector.singularize(uncountable_word)
|
|
70
|
+
|
|
71
|
+
MotionSupport::Inflector.singularize(countable_word).should == "sponsor"
|
|
72
|
+
MotionSupport::Inflector.pluralize(countable_word).should == "sponsors"
|
|
73
|
+
MotionSupport::Inflector.singularize(MotionSupport::Inflector.pluralize(countable_word)).should == "sponsor"
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
describe "titleize" do
|
|
79
|
+
InflectorTestCases::MixtureToTitleCase.each do |before, titleized|
|
|
80
|
+
it "should titleize #{before}" do
|
|
81
|
+
MotionSupport::Inflector.titleize(before).should == titleized
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
describe "underscore" do
|
|
87
|
+
InflectorTestCases::CamelToUnderscore.each do |camel, underscore|
|
|
88
|
+
it "should underscore #{camel}" do
|
|
89
|
+
MotionSupport::Inflector.underscore(camel).should == underscore
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
InflectorTestCases::CamelToUnderscoreWithoutReverse.each do |camel, underscore|
|
|
94
|
+
it "should underscore #{camel}" do
|
|
95
|
+
MotionSupport::Inflector.underscore(camel).should == underscore
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
InflectorTestCases::CamelWithModuleToUnderscoreWithSlash.each do |camel, underscore|
|
|
100
|
+
it "should underscore #{camel}" do
|
|
101
|
+
MotionSupport::Inflector.underscore(camel).should == underscore
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
describe "camelize" do
|
|
107
|
+
InflectorTestCases::CamelToUnderscore.each do |camel, underscore|
|
|
108
|
+
it "should camelize #{underscore}" do
|
|
109
|
+
MotionSupport::Inflector.camelize(underscore).should == camel
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
InflectorTestCases::CamelWithModuleToUnderscoreWithSlash.each do |camel, underscore|
|
|
114
|
+
it "should camelize #{underscore}" do
|
|
115
|
+
MotionSupport::Inflector.camelize(underscore).should == camel
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
it "should downcase first letter if called with lower" do
|
|
120
|
+
MotionSupport::Inflector.camelize('Capital', false).should == 'capital'
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
it "should remove underscores" do
|
|
124
|
+
MotionSupport::Inflector.camelize('Camel_Case').should == "CamelCase"
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
InflectorTestCases::UnderscoreToLowerCamel.each do |underscored, lower_camel|
|
|
128
|
+
it "should lower-camelize #{underscored}" do
|
|
129
|
+
MotionSupport::Inflector.camelize(underscored, false).should == lower_camel
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
InflectorTestCases::SymbolToLowerCamel.each do |symbol, lower_camel|
|
|
134
|
+
it "should lower-camelize symbol :#{symbol}" do
|
|
135
|
+
MotionSupport::Inflector.camelize(symbol, false).should == lower_camel
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
describe "irregularities" do
|
|
141
|
+
InflectorTestCases::Irregularities.each do |irregularity|
|
|
142
|
+
singular, plural = *irregularity
|
|
143
|
+
MotionSupport::Inflector.inflections do |inflect|
|
|
144
|
+
it "should singularize #{plural} as #{singular}" do
|
|
145
|
+
inflect.irregular(singular, plural)
|
|
146
|
+
MotionSupport::Inflector.singularize(plural).should == singular
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
it "should pluralize #{singular} as #{plural}" do
|
|
150
|
+
inflect.irregular(singular, plural)
|
|
151
|
+
MotionSupport::Inflector.pluralize(singular).should == plural
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
MotionSupport::Inflector.inflections do |inflect|
|
|
156
|
+
it "should return same string when pluralizing irregular plural #{plural}" do
|
|
157
|
+
inflect.irregular(singular, plural)
|
|
158
|
+
MotionSupport::Inflector.pluralize(plural).should == plural
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
MotionSupport::Inflector.inflections do |inflect|
|
|
163
|
+
it "should return same string when singularizing irregular singular #{singular}" do
|
|
164
|
+
inflect.irregular(singular, plural)
|
|
165
|
+
MotionSupport::Inflector.singularize(singular).should == singular
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
it "should overwrite previous inflectors" do
|
|
172
|
+
MotionSupport::Inflector.singularize("series").should == "series"
|
|
173
|
+
MotionSupport::Inflector.inflections.singular "series", "serie"
|
|
174
|
+
MotionSupport::Inflector.singularize("series").should == "serie"
|
|
175
|
+
MotionSupport::Inflector.inflections.uncountable "series" # Return to normal
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
describe "acronym" do
|
|
179
|
+
before do
|
|
180
|
+
MotionSupport::Inflector.inflections do |inflect|
|
|
181
|
+
inflect.acronym("API")
|
|
182
|
+
inflect.acronym("HTML")
|
|
183
|
+
inflect.acronym("HTTP")
|
|
184
|
+
inflect.acronym("RESTful")
|
|
185
|
+
inflect.acronym("W3C")
|
|
186
|
+
inflect.acronym("PhD")
|
|
187
|
+
inflect.acronym("RoR")
|
|
188
|
+
inflect.acronym("SSL")
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
# camelize underscore humanize titleize
|
|
193
|
+
[
|
|
194
|
+
["API", "api", "API", "API"],
|
|
195
|
+
["APIController", "api_controller", "API controller", "API Controller"],
|
|
196
|
+
["Nokogiri::HTML", "nokogiri/html", "Nokogiri/HTML", "Nokogiri/HTML"],
|
|
197
|
+
["HTTPAPI", "http_api", "HTTP API", "HTTP API"],
|
|
198
|
+
["HTTP::Get", "http/get", "HTTP/get", "HTTP/Get"],
|
|
199
|
+
["SSLError", "ssl_error", "SSL error", "SSL Error"],
|
|
200
|
+
["RESTful", "restful", "RESTful", "RESTful"],
|
|
201
|
+
["RESTfulController", "restful_controller", "RESTful controller", "RESTful Controller"],
|
|
202
|
+
["IHeartW3C", "i_heart_w3c", "I heart W3C", "I Heart W3C"],
|
|
203
|
+
["PhDRequired", "phd_required", "PhD required", "PhD Required"],
|
|
204
|
+
["IRoRU", "i_ror_u", "I RoR u", "I RoR U"],
|
|
205
|
+
["RESTfulHTTPAPI", "restful_http_api", "RESTful HTTP API", "RESTful HTTP API"],
|
|
206
|
+
["UIImage", "ui_image", "UI image", "UI Image"],
|
|
207
|
+
|
|
208
|
+
# misdirection
|
|
209
|
+
["Capistrano", "capistrano", "Capistrano", "Capistrano"],
|
|
210
|
+
["CapiController", "capi_controller", "Capi controller", "Capi Controller"],
|
|
211
|
+
["HttpsApis", "https_apis", "Https apis", "Https Apis"],
|
|
212
|
+
["Html5", "html5", "Html5", "Html5"],
|
|
213
|
+
["Restfully", "restfully", "Restfully", "Restfully"],
|
|
214
|
+
["RoRails", "ro_rails", "Ro rails", "Ro Rails"]
|
|
215
|
+
].each do |camel, under, human, title|
|
|
216
|
+
it "should camelize #{under} as #{camel}" do
|
|
217
|
+
MotionSupport::Inflector.camelize(under).should == camel
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
it "should keep #{camel} camelized" do
|
|
221
|
+
MotionSupport::Inflector.camelize(camel).should == camel
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
it "should keep #{under} underscored" do
|
|
225
|
+
MotionSupport::Inflector.underscore(under).should == under
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
it "should underscore #{camel} as #{under}" do
|
|
229
|
+
MotionSupport::Inflector.underscore(camel).should == under
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
it "should titleize #{under} as #{title}" do
|
|
233
|
+
MotionSupport::Inflector.titleize(under).should == title
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
it "should titleize #{camel} as #{title}" do
|
|
237
|
+
MotionSupport::Inflector.titleize(camel).should == title
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
it "should humanize #{under} as #{human}" do
|
|
241
|
+
MotionSupport::Inflector.humanize(under).should == human
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
describe "override acronyms" do
|
|
246
|
+
before do
|
|
247
|
+
MotionSupport::Inflector.inflections do |inflect|
|
|
248
|
+
inflect.acronym("API")
|
|
249
|
+
inflect.acronym("LegacyApi")
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
{
|
|
254
|
+
"legacyapi" => "LegacyApi",
|
|
255
|
+
"legacy_api" => "LegacyAPI",
|
|
256
|
+
"some_legacyapi" => "SomeLegacyApi",
|
|
257
|
+
"nonlegacyapi" => "Nonlegacyapi"
|
|
258
|
+
}.each do |from, to|
|
|
259
|
+
it "should camelize #{from} as #{to}" do
|
|
260
|
+
MotionSupport::Inflector.camelize(from).should == to
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
describe "lower-camelize with acronym parts" do
|
|
266
|
+
before do
|
|
267
|
+
MotionSupport::Inflector.inflections do |inflect|
|
|
268
|
+
inflect.acronym("API")
|
|
269
|
+
inflect.acronym("HTML")
|
|
270
|
+
end
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
{
|
|
274
|
+
"html_api" => "htmlAPI",
|
|
275
|
+
"htmlAPI" => "htmlAPI",
|
|
276
|
+
"HTMLAPI" => "htmlAPI"
|
|
277
|
+
}.each do |from, to|
|
|
278
|
+
it "should lower-camelize #{from} as #{to}" do
|
|
279
|
+
MotionSupport::Inflector.camelize(from, false).should == to
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
it "should underscore acronym sequence" do
|
|
285
|
+
MotionSupport::Inflector.inflections do |inflect|
|
|
286
|
+
inflect.acronym("API")
|
|
287
|
+
inflect.acronym("JSON")
|
|
288
|
+
inflect.acronym("HTML")
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
MotionSupport::Inflector.underscore("JSONHTMLAPI").should == "json_html_api"
|
|
292
|
+
end
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
describe "demodulize" do
|
|
296
|
+
{
|
|
297
|
+
"MyApplication::Billing::Account" => "Account",
|
|
298
|
+
"Account" => "Account",
|
|
299
|
+
"" => ""
|
|
300
|
+
}.each do |from, to|
|
|
301
|
+
it "should transform #{from} to #{to}" do
|
|
302
|
+
MotionSupport::Inflector.demodulize(from).should == to
|
|
303
|
+
end
|
|
304
|
+
end
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
describe "deconstantize" do
|
|
308
|
+
{
|
|
309
|
+
"MyApplication::Billing::Account" => "MyApplication::Billing",
|
|
310
|
+
"::MyApplication::Billing::Account" => "::MyApplication::Billing",
|
|
311
|
+
"MyApplication::Billing" => "MyApplication",
|
|
312
|
+
"::MyApplication::Billing" => "::MyApplication",
|
|
313
|
+
"Account" => "",
|
|
314
|
+
"::Account" => "",
|
|
315
|
+
"" => ""
|
|
316
|
+
}.each do |from, to|
|
|
317
|
+
it "should deconstantize #{from} as #{to}" do
|
|
318
|
+
MotionSupport::Inflector.deconstantize(from).should == to
|
|
319
|
+
end
|
|
320
|
+
end
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
describe "foreign_key" do
|
|
324
|
+
InflectorTestCases::ClassNameToForeignKeyWithUnderscore.each do |klass, foreign_key|
|
|
325
|
+
it "should create foreign key for class name #{klass}" do
|
|
326
|
+
MotionSupport::Inflector.foreign_key(klass).should == foreign_key
|
|
327
|
+
end
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
InflectorTestCases::ClassNameToForeignKeyWithoutUnderscore.each do |klass, foreign_key|
|
|
331
|
+
it "should create foreign key for class name #{klass} without underscore" do
|
|
332
|
+
MotionSupport::Inflector.foreign_key(klass, false).should == foreign_key
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
describe "tableize" do
|
|
338
|
+
InflectorTestCases::ClassNameToTableName.each do |class_name, table_name|
|
|
339
|
+
it "should create table name from class name #{class_name}" do
|
|
340
|
+
MotionSupport::Inflector.tableize(class_name).should == table_name
|
|
341
|
+
end
|
|
342
|
+
end
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
describe "classify" do
|
|
346
|
+
InflectorTestCases::ClassNameToTableName.each do |class_name, table_name|
|
|
347
|
+
it "should classify #{table_name}" do
|
|
348
|
+
MotionSupport::Inflector.classify(table_name).should == class_name
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
it "should classify #{table_name} with table prefix" do
|
|
352
|
+
MotionSupport::Inflector.classify("table_prefix." + table_name).should == class_name
|
|
353
|
+
end
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
it "should classify with symbol" do
|
|
357
|
+
lambda do
|
|
358
|
+
MotionSupport::Inflector.classify(:foo_bars).should == 'FooBar'
|
|
359
|
+
end.should.not.raise
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
it "should classify with leading schema name" do
|
|
363
|
+
MotionSupport::Inflector.classify('schema.foo_bar').should == 'FooBar'
|
|
364
|
+
end
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
describe "humanize" do
|
|
368
|
+
InflectorTestCases::UnderscoreToHuman.each do |underscore, human|
|
|
369
|
+
it "should humanize #{underscore}" do
|
|
370
|
+
MotionSupport::Inflector.humanize(underscore).should == human
|
|
371
|
+
end
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
it "should humanize by rule" do
|
|
375
|
+
MotionSupport::Inflector.inflections do |inflect|
|
|
376
|
+
inflect.human(/_cnt$/i, '\1_count')
|
|
377
|
+
inflect.human(/^prefx_/i, '\1')
|
|
378
|
+
end
|
|
379
|
+
MotionSupport::Inflector.humanize("jargon_cnt").should == "Jargon count"
|
|
380
|
+
MotionSupport::Inflector.humanize("prefx_request").should == "Request"
|
|
381
|
+
end
|
|
382
|
+
|
|
383
|
+
it "should humanize by string" do
|
|
384
|
+
MotionSupport::Inflector.inflections do |inflect|
|
|
385
|
+
inflect.human("col_rpted_bugs", "Reported bugs")
|
|
386
|
+
end
|
|
387
|
+
MotionSupport::Inflector.humanize("col_rpted_bugs").should == "Reported bugs"
|
|
388
|
+
MotionSupport::Inflector.humanize("COL_rpted_bugs").should == "Col rpted bugs"
|
|
389
|
+
end
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
describe "constantize" do
|
|
393
|
+
extend ConstantizeTestCases
|
|
394
|
+
|
|
395
|
+
it "should constantize" do
|
|
396
|
+
run_constantize_tests_on do |string|
|
|
397
|
+
MotionSupport::Inflector.constantize(string)
|
|
398
|
+
end
|
|
399
|
+
end
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
describe "safe_constantize" do
|
|
403
|
+
extend ConstantizeTestCases
|
|
404
|
+
|
|
405
|
+
it "should safe_constantize" do
|
|
406
|
+
run_safe_constantize_tests_on do |string|
|
|
407
|
+
MotionSupport::Inflector.safe_constantize(string)
|
|
408
|
+
end
|
|
409
|
+
end
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
describe "ordinal" do
|
|
413
|
+
InflectorTestCases::OrdinalNumbers.each do |number, ordinalized|
|
|
414
|
+
it "should return ordinal of number #{number}" do
|
|
415
|
+
(number + MotionSupport::Inflector.ordinal(number)).should == ordinalized
|
|
416
|
+
end
|
|
417
|
+
end
|
|
418
|
+
end
|
|
419
|
+
|
|
420
|
+
describe "ordinalize" do
|
|
421
|
+
InflectorTestCases::OrdinalNumbers.each do |number, ordinalized|
|
|
422
|
+
it "should ordinalize number #{number}" do
|
|
423
|
+
MotionSupport::Inflector.ordinalize(number).should == ordinalized
|
|
424
|
+
end
|
|
425
|
+
end
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
describe "dasherize" do
|
|
429
|
+
InflectorTestCases::UnderscoresToDashes.each do |underscored, dasherized|
|
|
430
|
+
it "should dasherize #{underscored}" do
|
|
431
|
+
MotionSupport::Inflector.dasherize(underscored).should == dasherized
|
|
432
|
+
end
|
|
433
|
+
end
|
|
434
|
+
|
|
435
|
+
InflectorTestCases::UnderscoresToDashes.each_key do |underscored|
|
|
436
|
+
it "should dasherize and then underscore #{underscored}, returning #{underscored}" do
|
|
437
|
+
MotionSupport::Inflector.underscore(MotionSupport::Inflector.dasherize(underscored)).should == underscored
|
|
438
|
+
end
|
|
439
|
+
end
|
|
440
|
+
end
|
|
441
|
+
|
|
442
|
+
describe "clear" do
|
|
443
|
+
extend InflectorHelper
|
|
444
|
+
|
|
445
|
+
%w{plurals singulars uncountables humans acronyms}.each do |inflection_type|
|
|
446
|
+
it "should clear #{inflection_type}" do
|
|
447
|
+
with_dup do
|
|
448
|
+
MotionSupport::Inflector.inflections.clear inflection_type.to_sym
|
|
449
|
+
MotionSupport::Inflector.inflections.send(inflection_type).should.be.empty
|
|
450
|
+
end
|
|
451
|
+
end
|
|
452
|
+
end
|
|
453
|
+
|
|
454
|
+
it "should clear all" do
|
|
455
|
+
with_dup do
|
|
456
|
+
MotionSupport::Inflector.inflections do |inflect|
|
|
457
|
+
# ensure any data is present
|
|
458
|
+
inflect.plural(/(quiz)$/i, '\1zes')
|
|
459
|
+
inflect.singular(/(database)s$/i, '\1')
|
|
460
|
+
inflect.uncountable('series')
|
|
461
|
+
inflect.human("col_rpted_bugs", "Reported bugs")
|
|
462
|
+
|
|
463
|
+
inflect.clear :all
|
|
464
|
+
|
|
465
|
+
inflect.plurals.should.be.empty
|
|
466
|
+
inflect.singulars.should.be.empty
|
|
467
|
+
inflect.uncountables.should.be.empty
|
|
468
|
+
inflect.humans.should.be.empty
|
|
469
|
+
end
|
|
470
|
+
end
|
|
471
|
+
end
|
|
472
|
+
|
|
473
|
+
it "should clear with default" do
|
|
474
|
+
with_dup do
|
|
475
|
+
MotionSupport::Inflector.inflections do |inflect|
|
|
476
|
+
# ensure any data is present
|
|
477
|
+
inflect.plural(/(quiz)$/i, '\1zes')
|
|
478
|
+
inflect.singular(/(database)s$/i, '\1')
|
|
479
|
+
inflect.uncountable('series')
|
|
480
|
+
inflect.human("col_rpted_bugs", "Reported bugs")
|
|
481
|
+
|
|
482
|
+
inflect.clear
|
|
483
|
+
|
|
484
|
+
inflect.plurals.should.be.empty
|
|
485
|
+
inflect.singulars.should.be.empty
|
|
486
|
+
inflect.uncountables.should.be.empty
|
|
487
|
+
inflect.humans.should.be.empty
|
|
488
|
+
end
|
|
489
|
+
end
|
|
490
|
+
end
|
|
491
|
+
|
|
492
|
+
%w(plurals singulars uncountables humans acronyms).each do |scope|
|
|
493
|
+
it "should clear inflections with #{scope}" do
|
|
494
|
+
with_dup do
|
|
495
|
+
MotionSupport::Inflector.inflections do |inflect|
|
|
496
|
+
# clear the inflections
|
|
497
|
+
inflect.clear(scope)
|
|
498
|
+
inflect.send(scope).should == []
|
|
499
|
+
end
|
|
500
|
+
end
|
|
501
|
+
end
|
|
502
|
+
end
|
|
503
|
+
end
|
|
504
|
+
end
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
describe "NSDictionary" do
|
|
2
|
+
describe "to_hash" do
|
|
3
|
+
before do
|
|
4
|
+
dict = NSMutableDictionary.alloc.init
|
|
5
|
+
dict.setValue('bar', forKey:'foo')
|
|
6
|
+
@hash = dict.to_hash
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
it "should convert NSDictionary to Hash" do
|
|
10
|
+
@hash.class.should == Hash
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "should preserve all keys" do
|
|
14
|
+
@hash.keys.should == ['foo']
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "should preserve all values" do
|
|
18
|
+
@hash.values.should == ['bar']
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def describe_with_bang(method, &block)
|
|
23
|
+
bang_method = "#{method}!"
|
|
24
|
+
|
|
25
|
+
describe(method) do
|
|
26
|
+
it "should work for NSDictionary instances" do
|
|
27
|
+
block.call(method)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
describe(bang_method) do
|
|
32
|
+
it "should work for NSDictionary instances" do
|
|
33
|
+
block.call(bang_method)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
describe_with_bang "symbolize_keys" do |method|
|
|
39
|
+
dict = NSMutableDictionary.alloc.init
|
|
40
|
+
dict.setValue('bar', forKey:'foo')
|
|
41
|
+
dict.send(method).should == { :foo => 'bar' }
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
describe_with_bang "deep_symbolize_keys" do |method|
|
|
45
|
+
dict = NSMutableDictionary.alloc.init
|
|
46
|
+
innerDict = NSMutableDictionary.alloc.init
|
|
47
|
+
innerDict.setValue('foobar', forKey: 'bar')
|
|
48
|
+
dict.setValue(innerDict, forKey:'foo')
|
|
49
|
+
dict.send(method).should == {foo: {bar: 'foobar'}}
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
describe_with_bang "stringify_keys" do |method|
|
|
53
|
+
dict = NSMutableDictionary.alloc.init
|
|
54
|
+
dict.setValue('bar', forKey: :foo)
|
|
55
|
+
dict.send(method).should == {'foo' => 'bar'}
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
describe_with_bang "deep_stringify_keys" do |method|
|
|
59
|
+
dict = NSMutableDictionary.alloc.init
|
|
60
|
+
innerDict = NSMutableDictionary.alloc.init
|
|
61
|
+
innerDict.setValue('foobar', forKey: :bar)
|
|
62
|
+
dict.setValue(innerDict, forKey: :foo)
|
|
63
|
+
dict.send(method).should == {'foo' => {'bar' => 'foobar'}}
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
describe "with_indifferent_access" do
|
|
67
|
+
it "should work for NSDictionary instances" do
|
|
68
|
+
dict = NSMutableDictionary.alloc.init
|
|
69
|
+
dict.setValue('bar', forKey:'foo')
|
|
70
|
+
dict_indifferent = dict.with_indifferent_access
|
|
71
|
+
dict_indifferent['foo'].should == 'bar'
|
|
72
|
+
dict_indifferent[:foo].should == dict_indifferent['foo']
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
it "should work with nested NSDictionary instances" do
|
|
76
|
+
dict = NSMutableDictionary.alloc.init
|
|
77
|
+
dict_inner = NSMutableDictionary.alloc.init
|
|
78
|
+
dict_inner.setValue('value', forKey: 'key')
|
|
79
|
+
dict.setValue('bar', forKey:'foo')
|
|
80
|
+
dict.setValue(dict_inner, forKey: 'inner')
|
|
81
|
+
|
|
82
|
+
dict_indifferent = dict.with_indifferent_access
|
|
83
|
+
inner_indifferent = dict_indifferent['inner']
|
|
84
|
+
dict_indifferent[:inner].should == inner_indifferent
|
|
85
|
+
inner_indifferent['key'].should == dict_inner['key']
|
|
86
|
+
inner_indifferent[:key].should == inner_indifferent['key']
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|