motion-support 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (171) hide show
  1. data/.gitignore +3 -0
  2. data/Gemfile +1 -1
  3. data/README.md +231 -2
  4. data/Rakefile +3 -3
  5. data/app/app_delegate.rb +0 -2
  6. data/examples/Inflector/.gitignore +16 -0
  7. data/examples/Inflector/Gemfile +5 -0
  8. data/examples/Inflector/Rakefile +13 -0
  9. data/examples/Inflector/app/app_delegate.rb +8 -0
  10. data/examples/Inflector/app/inflections.rb +5 -0
  11. data/examples/Inflector/app/inflector_view_controller.rb +120 -0
  12. data/examples/Inflector/app/words_view_controller.rb +101 -0
  13. data/examples/Inflector/resources/Default-568h@2x.png +0 -0
  14. data/examples/Inflector/spec/main_spec.rb +9 -0
  15. data/lib/motion-support/core_ext/array.rb +13 -0
  16. data/lib/motion-support/core_ext/class.rb +8 -0
  17. data/lib/motion-support/core_ext/hash.rb +16 -0
  18. data/lib/motion-support/core_ext/integer.rb +9 -0
  19. data/lib/motion-support/core_ext/module.rb +14 -0
  20. data/lib/motion-support/core_ext/numeric.rb +8 -0
  21. data/lib/motion-support/core_ext/object.rb +14 -0
  22. data/lib/motion-support/core_ext/range.rb +8 -0
  23. data/lib/motion-support/core_ext/string.rb +14 -0
  24. data/lib/motion-support/core_ext/time.rb +19 -0
  25. data/lib/motion-support/core_ext.rb +3 -0
  26. data/lib/motion-support/inflector.rb +12 -156
  27. data/lib/motion-support.rb +5 -5
  28. data/motion/_stdlib/cgi.rb +22 -0
  29. data/motion/_stdlib/date.rb +77 -0
  30. data/motion/_stdlib/time.rb +19 -0
  31. data/motion/core_ext/array/access.rb +28 -0
  32. data/motion/core_ext/array/conversions.rb +86 -0
  33. data/motion/core_ext/array/extract_options.rb +11 -0
  34. data/motion/core_ext/array/grouping.rb +99 -0
  35. data/motion/core_ext/array/prepend_and_append.rb +7 -0
  36. data/motion/core_ext/array/wrap.rb +45 -0
  37. data/{lib/motion-support → motion/core_ext}/array.rb +0 -4
  38. data/motion/core_ext/class/attribute.rb +119 -0
  39. data/motion/core_ext/class/attribute_accessors.rb +168 -0
  40. data/motion/core_ext/date/acts_like.rb +8 -0
  41. data/motion/core_ext/date/calculations.rb +117 -0
  42. data/motion/core_ext/date/conversions.rb +56 -0
  43. data/motion/core_ext/date_and_time/calculations.rb +232 -0
  44. data/motion/core_ext/enumerable.rb +90 -0
  45. data/motion/core_ext/hash/deep_merge.rb +27 -0
  46. data/motion/core_ext/hash/except.rb +15 -0
  47. data/motion/core_ext/hash/indifferent_access.rb +19 -0
  48. data/motion/core_ext/hash/keys.rb +138 -0
  49. data/motion/core_ext/hash/reverse_merge.rb +22 -0
  50. data/motion/core_ext/hash/slice.rb +40 -0
  51. data/motion/core_ext/integer/inflections.rb +27 -0
  52. data/motion/core_ext/integer/multiple.rb +10 -0
  53. data/motion/core_ext/integer/time.rb +41 -0
  54. data/{lib/motion-support → motion/core_ext}/metaclass.rb +0 -0
  55. data/motion/core_ext/module/aliasing.rb +69 -0
  56. data/motion/core_ext/module/anonymous.rb +19 -0
  57. data/motion/core_ext/module/attr_internal.rb +38 -0
  58. data/motion/core_ext/module/attribute_accessors.rb +64 -0
  59. data/motion/core_ext/module/delegation.rb +175 -0
  60. data/motion/core_ext/module/introspection.rb +60 -0
  61. data/motion/core_ext/module/reachable.rb +5 -0
  62. data/motion/core_ext/module/remove_method.rb +12 -0
  63. data/motion/core_ext/ns_dictionary.rb +11 -0
  64. data/motion/core_ext/numeric/bytes.rb +44 -0
  65. data/motion/core_ext/numeric/conversions.rb +7 -0
  66. data/motion/core_ext/numeric/time.rb +75 -0
  67. data/motion/core_ext/object/acts_like.rb +10 -0
  68. data/motion/core_ext/object/blank.rb +105 -0
  69. data/motion/core_ext/object/deep_dup.rb +44 -0
  70. data/motion/core_ext/object/duplicable.rb +83 -0
  71. data/motion/core_ext/object/instance_variables.rb +28 -0
  72. data/motion/core_ext/object/to_param.rb +58 -0
  73. data/motion/core_ext/object/to_query.rb +26 -0
  74. data/motion/core_ext/object/try.rb +78 -0
  75. data/motion/core_ext/range/include_range.rb +23 -0
  76. data/motion/core_ext/range/overlaps.rb +8 -0
  77. data/motion/core_ext/regexp.rb +5 -0
  78. data/motion/core_ext/string/access.rb +104 -0
  79. data/motion/core_ext/string/behavior.rb +6 -0
  80. data/motion/core_ext/string/exclude.rb +11 -0
  81. data/motion/core_ext/string/filters.rb +55 -0
  82. data/motion/core_ext/string/indent.rb +43 -0
  83. data/motion/core_ext/string/inflections.rb +195 -0
  84. data/motion/core_ext/string/starts_ends_with.rb +4 -0
  85. data/motion/core_ext/string/strip.rb +24 -0
  86. data/motion/core_ext/time/acts_like.rb +8 -0
  87. data/motion/core_ext/time/calculations.rb +215 -0
  88. data/motion/core_ext/time/conversions.rb +52 -0
  89. data/motion/duration.rb +104 -0
  90. data/motion/hash_with_indifferent_access.rb +251 -0
  91. data/motion/inflections.rb +67 -0
  92. data/motion/inflector/inflections.rb +203 -0
  93. data/motion/inflector/methods.rb +321 -0
  94. data/{lib/motion-support → motion}/logger.rb +0 -0
  95. data/{lib/motion-support → motion}/version.rb +1 -1
  96. data/motion-support.gemspec +2 -2
  97. data/spec/motion-support/_helpers/constantize_test_cases.rb +75 -0
  98. data/spec/motion-support/_helpers/inflector_test_cases.rb +313 -0
  99. data/spec/motion-support/core_ext/array/access_spec.rb +29 -0
  100. data/spec/motion-support/core_ext/array/conversion_spec.rb +60 -0
  101. data/spec/motion-support/core_ext/array/extract_options_spec.rb +15 -0
  102. data/spec/motion-support/core_ext/array/grouping_spec.rb +85 -0
  103. data/spec/motion-support/core_ext/array/prepend_and_append_spec.rb +25 -0
  104. data/spec/motion-support/core_ext/array/wrap_spec.rb +19 -0
  105. data/spec/motion-support/{array_spec.rb → core_ext/array_spec.rb} +0 -5
  106. data/spec/motion-support/core_ext/class/attribute_accessor_spec.rb +127 -0
  107. data/spec/motion-support/core_ext/class/attribute_spec.rb +92 -0
  108. data/spec/motion-support/core_ext/date/acts_like_spec.rb +11 -0
  109. data/spec/motion-support/core_ext/date/calculation_spec.rb +186 -0
  110. data/spec/motion-support/core_ext/date/conversion_spec.rb +18 -0
  111. data/spec/motion-support/core_ext/date_and_time/calculation_spec.rb +336 -0
  112. data/spec/motion-support/core_ext/enumerable_spec.rb +130 -0
  113. data/spec/motion-support/core_ext/hash/deep_merge_spec.rb +32 -0
  114. data/spec/motion-support/core_ext/hash/except_spec.rb +43 -0
  115. data/spec/motion-support/core_ext/hash/key_spec.rb +230 -0
  116. data/spec/motion-support/core_ext/hash/reverse_merge_spec.rb +26 -0
  117. data/spec/motion-support/core_ext/hash/slice_spec.rb +61 -0
  118. data/spec/motion-support/core_ext/integer/inflection_spec.rb +23 -0
  119. data/spec/motion-support/core_ext/integer/multiple_spec.rb +19 -0
  120. data/spec/motion-support/{metaclass_spec.rb → core_ext/metaclass_spec.rb} +0 -0
  121. data/spec/motion-support/core_ext/module/aliasing_spec.rb +143 -0
  122. data/spec/motion-support/core_ext/module/anonymous_spec.rb +29 -0
  123. data/spec/motion-support/core_ext/module/attr_internal_spec.rb +104 -0
  124. data/spec/motion-support/core_ext/module/attribute_accessor_spec.rb +86 -0
  125. data/spec/motion-support/core_ext/module/delegation_spec.rb +136 -0
  126. data/spec/motion-support/core_ext/module/introspection_spec.rb +70 -0
  127. data/spec/motion-support/core_ext/module/reachable_spec.rb +61 -0
  128. data/spec/motion-support/core_ext/module/remove_method_spec.rb +25 -0
  129. data/spec/motion-support/core_ext/numeric/bytes_spec.rb +43 -0
  130. data/spec/motion-support/core_ext/object/acts_like_spec.rb +21 -0
  131. data/spec/motion-support/core_ext/object/blank_spec.rb +54 -0
  132. data/spec/motion-support/core_ext/object/deep_dup_spec.rb +54 -0
  133. data/spec/motion-support/core_ext/object/duplicable_spec.rb +31 -0
  134. data/spec/motion-support/core_ext/object/instance_variable_spec.rb +19 -0
  135. data/spec/motion-support/core_ext/object/to_param_spec.rb +75 -0
  136. data/spec/motion-support/core_ext/object/to_query_spec.rb +37 -0
  137. data/spec/motion-support/core_ext/object/try_spec.rb +92 -0
  138. data/spec/motion-support/core_ext/range/include_range_spec.rb +31 -0
  139. data/spec/motion-support/core_ext/range/overlap_spec.rb +43 -0
  140. data/spec/motion-support/core_ext/regexp_spec.rb +7 -0
  141. data/spec/motion-support/core_ext/string/access_spec.rb +53 -0
  142. data/spec/motion-support/core_ext/string/behavior_spec.rb +7 -0
  143. data/spec/motion-support/core_ext/string/exclude_spec.rb +8 -0
  144. data/spec/motion-support/core_ext/string/filter_spec.rb +48 -0
  145. data/spec/motion-support/core_ext/string/indent_spec.rb +56 -0
  146. data/spec/motion-support/core_ext/string/inflection_spec.rb +142 -0
  147. data/spec/motion-support/core_ext/string/starts_end_with_spec.rb +14 -0
  148. data/spec/motion-support/core_ext/string/strip_spec.rb +34 -0
  149. data/spec/motion-support/core_ext/string_spec.rb +88 -0
  150. data/spec/motion-support/core_ext/time/acts_like_spec.rb +11 -0
  151. data/spec/motion-support/core_ext/time/calculation_spec.rb +201 -0
  152. data/spec/motion-support/core_ext/time/conversion_spec.rb +54 -0
  153. data/spec/motion-support/duration_spec.rb +107 -0
  154. data/spec/motion-support/hash_with_indifferent_access_spec.rb +605 -0
  155. data/spec/motion-support/inflector_spec.rb +474 -35
  156. data/spec/motion-support/ns_dictionary_spec.rb +29 -0
  157. metadata +212 -35
  158. data/lib/motion-support/cattr_accessor.rb +0 -19
  159. data/lib/motion-support/class_inheritable_accessor.rb +0 -23
  160. data/lib/motion-support/class_inheritable_array.rb +0 -29
  161. data/lib/motion-support/hash.rb +0 -31
  162. data/lib/motion-support/nilclass.rb +0 -5
  163. data/lib/motion-support/object.rb +0 -17
  164. data/lib/motion-support/string.rb +0 -71
  165. data/spec/motion-support/cattr_accessor_spec.rb +0 -49
  166. data/spec/motion-support/class_inheritable_accessor_spec.rb +0 -49
  167. data/spec/motion-support/class_inheritable_array_spec.rb +0 -61
  168. data/spec/motion-support/hash_spec.rb +0 -31
  169. data/spec/motion-support/nilclass_spec.rb +0 -5
  170. data/spec/motion-support/object_spec.rb +0 -43
  171. data/spec/motion-support/string_spec.rb +0 -145
data/.gitignore CHANGED
@@ -7,3 +7,6 @@ resources/*.storyboardc
7
7
  .bundle
8
8
  Gemfile.lock
9
9
  pkg/*
10
+ .DS_Store
11
+ doc/*
12
+ .dat*
data/Gemfile CHANGED
@@ -1,6 +1,6 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- gem "bubble-wrap"
3
+ gem 'motion-require'
4
4
 
5
5
  # Specify your gem's dependencies in motion-support.gemspec
6
6
  gemspec
data/README.md CHANGED
@@ -1,8 +1,237 @@
1
1
  # MotionSupport
2
2
 
3
- This is a very small library that sits loosely on top of BubbleWrap to extend the core RubyMotion classes, i.e. no user interface classes. It is somewhat inspired by ActiveSupport, but right now, not a lot is implemented.
3
+ This is a port of the parts of ActiveSupport that make sense for RubyMotion.
4
4
 
5
- To see what's there, look into the lib folder. There is documentation, also most everything is tested.
5
+ To see what's there, generate the documentation with the `rdoc` command from the repository root, or look into the lib folder. Almost everything is tested.
6
+
7
+ # Usage
8
+
9
+ Install with
10
+
11
+ gem install motion-support
12
+
13
+ or add to your `Gemfile`
14
+
15
+ gem 'motion-support'
16
+
17
+ # Partial loading
18
+
19
+ It is also possible to only use parts of this library. To do so, change your `Gemfile` so that it reads:
20
+
21
+ gem 'motion-support', :require => false
22
+
23
+ Then add a require statement as shown below to your `Rakefile`.
24
+
25
+ ## all
26
+
27
+ require 'motion-support'
28
+
29
+ Loads everything.
30
+
31
+ ## inflector
32
+
33
+ require 'motion-support/inflector'
34
+
35
+ Loads the `Inflector` module and extensions to the `String` class. See the "Inflector" app in the `examples/` folder for what the inflector can do.
36
+
37
+ Example usage include:
38
+
39
+ "app_delegate".camelize # => "AppDelegate"
40
+ "HomeController".constantize # => HomeController
41
+ "thing".pluralize # => "things"
42
+ "mice".singularize # => "mouse"
43
+
44
+ ## core_ext
45
+
46
+ require 'motion-support/core_ext'
47
+
48
+ Loads all the extensions to core classes.
49
+
50
+ ## core_ext/array
51
+
52
+ require 'motion-support/core_ext/array'
53
+
54
+ Loads extensions to class `Array`. Example usage include
55
+
56
+ %w( a b c d ).from(2) # => ["c", "d"]
57
+ ['one', 'two', 'three'].to_sentence # => "one, two, and three"
58
+ args.extract_options! # extracts options hash from variant args array
59
+ [1, 2, 3, 4].in_groups_of(2) # => [[1, 2], [3, 4]]
60
+
61
+ ## core_ext/class
62
+
63
+ require 'motion-support/core_ext/class'
64
+
65
+ Loads extensions to class `Class`.
66
+
67
+ class Foo
68
+ cattr_accessor :bar
69
+ class_attribute :foo
70
+ end
71
+
72
+ ## core_ext/hash
73
+
74
+ require 'motion-support/core_ext/hash'
75
+
76
+ Loads extensions to class `Hash`, including class `HashWithIndifferentAccess`.
77
+
78
+ { 'foo' => 'bar', 'baz' => 'bam' }.symbolize_keys # => { :foo => 'bar', :baz => 'bam' }
79
+ { 'foo' => 'bar', 'baz' => 'bam' }.except('foo') # => { 'baz' => 'bam' }
80
+ { 'foo' => 'bar', 'baz' => 'bam' }.with_indifferent_access
81
+ # => #<HashWithIndifferentAccess>
82
+
83
+ ## core_ext/integer
84
+
85
+ require 'motion-support/core_ext/integer'
86
+
87
+ Loads extensions to class `Integer`.
88
+
89
+ 1.ordinalize # => "1st"
90
+ 3.ordinalize # => "3rd"
91
+
92
+ ## core_ext/module
93
+
94
+ require 'motion-support/core_ext/module'
95
+
96
+ Loads extensions to class `Module`.
97
+
98
+ module Mod
99
+ mattr_accessor :foo, :bar
100
+ attr_internal :baz
101
+ delegate :boo, :to => :foo
102
+
103
+ remove_method :baz
104
+ end
105
+
106
+ ## core_ext/numeric
107
+
108
+ require 'motion-support/core_ext/numeric'
109
+
110
+ Loads extensions to class `Numeric`.
111
+
112
+ 10.kilobytes # => 10240
113
+ 2.megabytes # => 2097152
114
+ 3.days
115
+
116
+ ## core_ext/object
117
+
118
+ require 'motion-support/core_ext/object'
119
+
120
+ Loads extensions to class `Object`.
121
+
122
+ nil.blank? # => true
123
+ Object.new.blank? # => false
124
+ { "hello" => "world", "foo" => "bar" }.to_query # => "hello=world&foo=bar"
125
+ 1.duplicable? # => false
126
+ 1.try(:to_s) # => "1"
127
+ nil.try(:to_s) # => nil
128
+
129
+ ## core_ext/range
130
+
131
+ require 'motion-support/core_ext/range'
132
+
133
+ Loads extensions to class `Range`.
134
+
135
+ (1..5).overlaps(3..9) # => true
136
+ (1..5).include?(2..3) # => true
137
+
138
+ ## core_ext/string
139
+
140
+ require 'motion-support/core_ext/string'
141
+
142
+ Loads extensions to class `String`.
143
+
144
+ "ruby_motion".camelize # => "RubyMotion"
145
+ "User".pluralize # => "Users"
146
+ "mice".singularize # => "mouse"
147
+ "Foo::Bar".underscore # => "foo/bar"
148
+ "AppDelegate".underscore # => "app_delegate"
149
+ "UIView".constantize # => UIView
150
+
151
+ ## core_ext/time
152
+
153
+ require 'motion-support/core_ext/time'
154
+
155
+ Loads extensions to class `Time`.
156
+
157
+ 1.week.ago
158
+ 17.days.from_now
159
+ Date.yesterday
160
+ Time.beginning_of_week
161
+
162
+ # Differences to ActiveSupport
163
+
164
+ In general:
165
+
166
+ * All `I18n` stuff was removed. Maybe it will be readded later.
167
+ * No support for the `TimeWithZone` class (iOS apps don't need advanced time zone support)
168
+ * No support for the `DateTime` class
169
+ * All deprecated methods have been removed
170
+ * All `YAML` extensions were removed, since RubyMotion doesn't come with YAML support
171
+ * `Kernel#silence_warnings` and stream manipulation methods were removed
172
+ * Multibyte string handling methods have been removed
173
+ * All Rails-specific stuff was removed
174
+ * The dependency resolution code was removed. So was the dynamic code reloading code
175
+ * All marshalling code was removed
176
+ * All logging code was removed
177
+ * All extensions to `Test::Unit` were removed
178
+
179
+ Specifically:
180
+
181
+ * `Array#third` .. `Array#fourty_two` were removed
182
+ * `Array#to_xml` is missing
183
+ * `Array#to_sentence` does not accept a `:locale` parameter
184
+ * `Class#subclasses` is missing. It depends on `ObjectSpace.each_object` which is missing in RubyMotion
185
+ * `Hash#extractable_options?` is missing
186
+ * `BigDecimal` conversions were removed
187
+ * `Time.current` an alias for `Time.now`
188
+ * `Date.current` an alias for `Date.today`
189
+ * `Date#to_time` does not accept a timezone form (`:local`, `:utc`)
190
+ * `Date#xmlschema` is missing
191
+ * `Object#in?` is missing. It is incompatible with Bacon, it will break specs.
192
+ * `String#parameterize` is missing because it needs to transliterate the string, which is dependent on the locale
193
+ * `String#constantize` is very slow. Cache the result if you use it.
194
+ * `String#to_time`, `#to_date`, `#to_datetime` are missing because they depend on `Date#_parse`
195
+ * String inquiry methods are missing
196
+ * String multibyte methods are missing
197
+ * `String#html_safe` and `ERB` extensions are not needed in RubyMotion
198
+ * `Object#to_json` and subclasses are missing
199
+ * `Range#to_s(:db)` was removed
200
+ * The `rfc822` time format was removed, since it relies on time zone support.
201
+ * Extensions to `LoadError` and `NameError` were removed
202
+ * The `ThreadSafe` versions of `Hash` and `Array` are just aliases to the standard classes
203
+
204
+ Things to do / to decide:
205
+
206
+ * RubyMotion lacks a `Date` class. in `_stdlib` there is a stub of a Date class that makes the `Date` extensions work. This stub needs to be completed.
207
+ * Implement `Object#to_json`, probably best if implemented on top of Cocoa APIs
208
+ * Implement `Object#to_xml`
209
+ * Implement `Hash#from_xml`
210
+ * Do we need `Hash#extractable_options?`?
211
+ * Do we need `Class#superclass_delegating_accessor`?
212
+ * Implement all `InfiniteComparable` extensions
213
+ * Do we need `File#atomic_write` for thread-safe file writing?
214
+ * Do we need `Kernel#class_eval` (it delegates to `class_eval` on this' singleton class)?
215
+ * Do we need `Module#qualified_const_defined?`? What is that even for?
216
+ * Do we need `Module#synchronize`?
217
+ * Implement `Numeric` conversions, especially `NumberHelper`
218
+ * Do we need `Object#with_options`?
219
+ * Implement `String#to_time`, `String#to_date`. In the original ActiveSupport, they make use of the `Date#_parse` method (which seems like it's supposed to be private). Here, they should be implemented on top of Cocoa APIs
220
+ * Do we need `String#parameterize`? If so, we need to find a way to transliterate UTF-8 characters.
221
+ * Do we need the `StringInquirer`? It allows things like `Rails.env.development?` instead of `Rails.env == 'development'`
222
+ * Do we need multibyte string handling extensions? AFAIK, all strings in RubyMotion are UTF-8. Is that true?
223
+ * Do we need `Struct#to_h`?
224
+ * Implement extensions to class `Thread` if they make sense.
225
+ * Port callbacks.rb
226
+ * Port concern.rb
227
+ * Do we need the `Configurable` module?
228
+ * Do we need the `DescendantsTracker` module?
229
+ * Do we need the `OrderedOptions` class?
230
+ * Go through documentation and remove or rewrite things not relevant to RubyMotion, especially examples mentioning Rails components
231
+
232
+ # Acknowledgements
233
+
234
+ ActiveSupport was originally written as part of Ruby on Rails by David Heinemeier Hansson. Over the years, countless contributors made many additions. They made this library possible.
6
235
 
7
236
  # Forking
8
237
 
data/Rakefile CHANGED
@@ -5,10 +5,10 @@ require "bundler/gem_tasks"
5
5
  Bundler.setup
6
6
  Bundler.require
7
7
 
8
- $:.unshift("./lib/")
9
- require './lib/motion-support'
8
+ require 'motion-support'
10
9
 
11
10
  Motion::Project::App.setup do |app|
12
11
  # Use `rake config' to see complete project settings.
13
12
  app.name = 'MotionSupport'
14
- end
13
+ app.detect_dependencies = false
14
+ end
data/app/app_delegate.rb CHANGED
@@ -1,7 +1,5 @@
1
1
  class AppDelegate
2
2
  def application(application, didFinishLaunchingWithOptions:launchOptions)
3
- @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
4
- @window.rootViewController = UIViewController.alloc.init
5
3
  true
6
4
  end
7
5
  end
@@ -0,0 +1,16 @@
1
+ .repl_history
2
+ build
3
+ tags
4
+ app/pixate_code.rb
5
+ resources/*.nib
6
+ resources/*.momd
7
+ resources/*.storyboardc
8
+ .DS_Store
9
+ nbproject
10
+ .redcar
11
+ #*#
12
+ *~
13
+ *.sw[po]
14
+ .eprj
15
+ .sass-cache
16
+ .idea
@@ -0,0 +1,5 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem 'rake'
4
+ gem 'motion-require'
5
+ gem 'formotion'
@@ -0,0 +1,13 @@
1
+ # -*- coding: utf-8 -*-
2
+ $:.unshift("/Library/RubyMotion/lib")
3
+ require 'motion/project'
4
+ require 'bundler'
5
+ Bundler.require
6
+
7
+ require '../../lib/motion-support/inflector'
8
+
9
+ Motion::Project::App.setup do |app|
10
+ # Use `rake config' to see complete project settings.
11
+ app.name = 'Inflector'
12
+ app.detect_dependencies = false
13
+ end
@@ -0,0 +1,8 @@
1
+ class AppDelegate
2
+ def application(application, didFinishLaunchingWithOptions:launchOptions)
3
+ @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
4
+ @window.rootViewController = UINavigationController.alloc.initWithRootViewController(InflectorViewController.alloc.init)
5
+ @window.makeKeyAndVisible
6
+ true
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ MotionSupport::Inflector.inflections do |inflect|
2
+ inflect.acronym 'HTML'
3
+ inflect.acronym 'API'
4
+ inflect.acronym 'BSD'
5
+ end
@@ -0,0 +1,120 @@
1
+ class Formotion::Form
2
+ def row(key)
3
+ sections.each do |section|
4
+ section.rows.each do |row|
5
+ return row if row.key == key
6
+ end
7
+ end
8
+ nil
9
+ end
10
+ end
11
+
12
+ class InflectorViewController < Formotion::FormController
13
+ def init
14
+ initWithForm(build_form)
15
+ self.title = "Inflector"
16
+ @form.on_submit do |form|
17
+ submit(form)
18
+ end
19
+ self
20
+ end
21
+
22
+ def submit(form)
23
+ data = form.render
24
+ original = String.new(data[:word])
25
+
26
+ update_fields(original)
27
+
28
+ form.row(:word).text_field.resignFirstResponder
29
+ end
30
+
31
+ def set_word(word)
32
+ @form.values = { :word => word }
33
+ update_fields(word)
34
+ end
35
+
36
+ def update_fields(original)
37
+ @form.values = {
38
+ :singular => original.singularize,
39
+ :plural => original.pluralize,
40
+ :camelized => original.camelize,
41
+ :lower_camelized => original.camelize(:lower),
42
+ :underscored => original.underscore,
43
+ :classified => original.classify,
44
+ :dasherized => original.dasherize,
45
+ :titleized => original.titleize,
46
+ :humanized => original.humanize
47
+ }
48
+ end
49
+
50
+ private
51
+ def build_form
52
+ @form ||= Formotion::Form.persist({
53
+ sections: [{
54
+ rows: [{
55
+ title: "Word",
56
+ key: :word,
57
+ type: :string,
58
+ placeholder: "Enter a word",
59
+ auto_correction: :no,
60
+ auto_capitalization: :none
61
+ }, {
62
+ title: "Select",
63
+ type: :button,
64
+ key: :select
65
+ }]
66
+ }, {
67
+ rows: [{
68
+ title: "Inflect",
69
+ type: :submit
70
+ }]
71
+ }, {
72
+ title: "Inflections",
73
+ rows: [{
74
+ title: "Singular",
75
+ key: :singular,
76
+ type: :static
77
+ }, {
78
+ title: "Plural",
79
+ key: :plural,
80
+ type: :static
81
+ }]
82
+ }, {
83
+ title: "Transformations",
84
+ rows: [{
85
+ title: "Camelized",
86
+ key: :camelized,
87
+ type: :static
88
+ }, {
89
+ title: "Lower-Camelized",
90
+ key: :lower_camelized,
91
+ type: :static
92
+ }, {
93
+ title: "Underscored",
94
+ key: :underscored,
95
+ type: :static
96
+ }, {
97
+ title: "Classified",
98
+ key: :classified,
99
+ type: :static
100
+ }, {
101
+ title: "Dasherized",
102
+ key: :dasherized,
103
+ type: :static
104
+ }, {
105
+ title: "Titleized",
106
+ key: :titleized,
107
+ type: :static
108
+ }, {
109
+ title: "Humanized",
110
+ key: :humanized,
111
+ type: :static
112
+ }]
113
+ }]
114
+ })
115
+ @form.row(:select).on_tap do
116
+ self.navigationController.pushViewController(WordsViewController.alloc.initWithParent(self), animated:true)
117
+ end
118
+ @form
119
+ end
120
+ end
@@ -0,0 +1,101 @@
1
+ class WordsViewController < UITableViewController
2
+ WORDS = [
3
+ [
4
+ "Single words",
5
+ %w{
6
+ alias
7
+ axis
8
+ buffalo
9
+ bus
10
+ cat
11
+ child
12
+ cow
13
+ crisis
14
+ dog
15
+ house
16
+ man
17
+ matrix
18
+ mouse
19
+ move
20
+ octopus
21
+ ox
22
+ parenthesis
23
+ person
24
+ quiz
25
+ series
26
+ sex
27
+ vertex
28
+ zombie
29
+ }
30
+ ], [
31
+ "Uncountable words",
32
+ %w{
33
+ equipment
34
+ fish
35
+ information
36
+ jeans
37
+ money
38
+ police
39
+ rice
40
+ series
41
+ sheep
42
+ species
43
+ }
44
+ ], [
45
+ "Programming",
46
+ %w{
47
+ app_delegate
48
+ motion_support
49
+ motion_support/inflector
50
+ ruby_motion
51
+ }
52
+ ], [
53
+ "Acronyms",
54
+ %w{
55
+ free_bsd
56
+ html_api
57
+ html_tidy
58
+ ui_image
59
+ ui_table_view_controller
60
+ xml_http_request
61
+ }
62
+ ]
63
+ ]
64
+
65
+ def initWithParent(parent)
66
+ @parent = parent
67
+
68
+ self.title = "Select word"
69
+
70
+ self
71
+ end
72
+
73
+ def numberOfSectionsInTableView(tableView)
74
+ WORDS.size
75
+ end
76
+
77
+ def tableView(tableView, titleForHeaderInSection:section)
78
+ WORDS[section].first
79
+ end
80
+
81
+ def tableView(tableView, numberOfRowsInSection:section)
82
+ WORDS[section].last.size
83
+ end
84
+
85
+ def tableView(tableView, cellForRowAtIndexPath:indexPath)
86
+ fresh_cell.tap do |cell|
87
+ cell.textLabel.text = WORDS[indexPath.section].last[indexPath.row]
88
+ end
89
+ end
90
+
91
+ def tableView(tableView, didSelectRowAtIndexPath:indexPath)
92
+ @parent.set_word(WORDS[indexPath.section].last[indexPath.row])
93
+ navigationController.popViewControllerAnimated(true)
94
+ end
95
+
96
+ private
97
+ def fresh_cell
98
+ tableView.dequeueReusableCellWithIdentifier('Cell') ||
99
+ UITableViewCell.alloc.initWithStyle(UITableViewCellStyleSubtitle, reuseIdentifier:'Cell')
100
+ end
101
+ end
@@ -0,0 +1,9 @@
1
+ describe "Application 'Inflector'" do
2
+ before do
3
+ @app = UIApplication.sharedApplication
4
+ end
5
+
6
+ it "has one window" do
7
+ @app.windows.size.should == 1
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ require 'motion-require'
2
+
3
+ files = [
4
+ 'core_ext/array',
5
+ 'core_ext/array/wrap',
6
+ 'core_ext/array/access',
7
+ 'core_ext/array/conversions',
8
+ 'core_ext/array/extract_options',
9
+ 'core_ext/array/grouping',
10
+ 'core_ext/array/prepend_and_append'
11
+ ].map { |file| File.expand_path(File.join(File.dirname(__FILE__), "/../../../motion", "#{file}.rb")) }
12
+
13
+ Motion::Require.all(files)
@@ -0,0 +1,8 @@
1
+ require 'motion-require'
2
+
3
+ files = [
4
+ 'core_ext/class/attribute',
5
+ 'core_ext/class/attribute_accessors',
6
+ ].map { |file| File.expand_path(File.join(File.dirname(__FILE__), "/../../../motion", "#{file}.rb")) }
7
+
8
+ Motion::Require.all(files)
@@ -0,0 +1,16 @@
1
+ require 'motion-require'
2
+
3
+ files = [
4
+ 'core_ext/ns_dictionary',
5
+ 'core_ext/hash/deep_merge',
6
+ 'core_ext/hash/except',
7
+ 'core_ext/hash/indifferent_access',
8
+ 'core_ext/hash/keys',
9
+ 'core_ext/hash/reverse_merge',
10
+ 'core_ext/hash/slice',
11
+ 'hash_with_indifferent_access',
12
+
13
+ 'core_ext/module/delegation'
14
+ ].map { |file| File.expand_path(File.join(File.dirname(__FILE__), "/../../../motion", "#{file}.rb")) }
15
+
16
+ Motion::Require.all(files)
@@ -0,0 +1,9 @@
1
+ require 'motion-require'
2
+
3
+ files = [
4
+ 'core_ext/integer/multiple',
5
+ 'core_ext/integer/inflections',
6
+ 'core_ext/integer/time'
7
+ ].map { |file| File.expand_path(File.join(File.dirname(__FILE__), "/../../../motion", "#{file}.rb")) }
8
+
9
+ Motion::Require.all(files)
@@ -0,0 +1,14 @@
1
+ require 'motion-require'
2
+
3
+ files = [
4
+ 'core_ext/module/aliasing',
5
+ 'core_ext/module/introspection',
6
+ 'core_ext/module/anonymous',
7
+ 'core_ext/module/reachable',
8
+ 'core_ext/module/attribute_accessors',
9
+ 'core_ext/module/attr_internal',
10
+ 'core_ext/module/delegation',
11
+ 'core_ext/module/remove_method'
12
+ ].map { |file| File.expand_path(File.join(File.dirname(__FILE__), "/../../../motion", "#{file}.rb")) }
13
+
14
+ Motion::Require.all(files)
@@ -0,0 +1,8 @@
1
+ require 'motion-require'
2
+
3
+ files = [
4
+ 'core_ext/numeric/bytes',
5
+ 'core_ext/numeric/time'
6
+ ].map { |file| File.expand_path(File.join(File.dirname(__FILE__), "/../../../motion", "#{file}.rb")) }
7
+
8
+ Motion::Require.all(files)
@@ -0,0 +1,14 @@
1
+ require 'motion-require'
2
+
3
+ files = [
4
+ 'core_ext/object/acts_like',
5
+ 'core_ext/object/blank',
6
+ 'core_ext/object/deep_dup',
7
+ 'core_ext/object/duplicable',
8
+ 'core_ext/object/try',
9
+ 'core_ext/object/instance_variables',
10
+ 'core_ext/object/to_param',
11
+ 'core_ext/object/to_query',
12
+ ].map { |file| File.expand_path(File.join(File.dirname(__FILE__), "/../../../motion", "#{file}.rb")) }
13
+
14
+ Motion::Require.all(files)
@@ -0,0 +1,8 @@
1
+ require 'motion-require'
2
+
3
+ files = [
4
+ 'core_ext/range/include_range',
5
+ 'core_ext/range/overlaps'
6
+ ].map { |file| File.expand_path(File.join(File.dirname(__FILE__), "/../../../motion", "#{file}.rb")) }
7
+
8
+ Motion::Require.all(files)
@@ -0,0 +1,14 @@
1
+ require 'motion-require'
2
+
3
+ files = [
4
+ 'core_ext/string/access',
5
+ 'core_ext/string/behavior',
6
+ 'core_ext/string/exclude',
7
+ 'core_ext/string/filters',
8
+ 'core_ext/string/indent',
9
+ 'core_ext/string/starts_ends_with',
10
+ 'core_ext/string/inflections',
11
+ 'core_ext/string/strip'
12
+ ].map { |file| File.expand_path(File.join(File.dirname(__FILE__), "/../../../motion", "#{file}.rb")) }
13
+
14
+ Motion::Require.all(files)