motion-support 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -317,7 +317,6 @@ Things to do / to decide:
317
317
  * Port callbacks.rb
318
318
  * Port concern.rb
319
319
  * Do we need the `Configurable` module?
320
- * Do we need the `DescendantsTracker` module?
321
320
  * Do we need the `OrderedOptions` class?
322
321
  * Some extensions have to be made available for Cocoa classes (`NSArray`, `NSDictionary` etc.), since we want to effectively handle return values from Objective-C methods (they return Cocoa classes). The way to do this is to write a conversion method from Cocoa class to Ruby class and delegate the extension methods in the Cocoa class to the conversion method. See `motion/core_ext/ns_string.rb` for an example.
323
322
  * Go through documentation and remove or rewrite things not relevant to RubyMotion, especially examples mentioning Rails components
@@ -7,8 +7,8 @@ class NSString
7
7
 
8
8
  delegate :at, :blank?, :camelcase, :camelize, :classify, :constantize, :dasherize,
9
9
  :deconstantize, :demodulize, :exclude?, :first, :foreign_key, :from, :humanize,
10
- :indent, :indent!, :last, :parameterize, :pluralize, :safe_constantize,
11
- :singularize, :squish, :squish!, :strip_heredoc, :tableize, :titlecase,
12
- :titleize, :to, :truncate, :underscore,
10
+ :indent, :indent!, :last, :pluralize, :safe_constantize, :singularize,
11
+ :squish, :squish!, :strip_heredoc, :tableize, :titlecase, :titleize, :to,
12
+ :truncate, :underscore,
13
13
  :to => :to_s
14
14
  end
@@ -132,23 +132,6 @@ class String
132
132
  MotionSupport::Inflector.deconstantize(self)
133
133
  end
134
134
 
135
- # Replaces special characters in a string so that it may be used as part of a 'pretty' URL.
136
- #
137
- # class Person
138
- # def to_param
139
- # "#{id}-#{name.parameterize}"
140
- # end
141
- # end
142
- #
143
- # @person = Person.find(1)
144
- # # => #<Person id: 1, name: "Donald E. Knuth">
145
- #
146
- # <%= link_to(@person.name, person_path) %>
147
- # # => <a href="/person/1-donald-e-knuth">Donald E. Knuth</a>
148
- def parameterize(sep = '-')
149
- MotionSupport::Inflector.parameterize(self, sep)
150
- end
151
-
152
135
  # Creates the name of a table like Rails does for models to table names. This method
153
136
  # uses the +pluralize+ method on the last word in the string.
154
137
  #
@@ -0,0 +1,50 @@
1
+ module MotionSupport
2
+ # This module provides an internal implementation to track descendants
3
+ # which is faster than iterating through ObjectSpace.
4
+ module DescendantsTracker
5
+ @@direct_descendants = {}
6
+
7
+ class << self
8
+ def direct_descendants(klass)
9
+ @@direct_descendants[klass] || []
10
+ end
11
+
12
+ def descendants(klass)
13
+ arr = []
14
+ accumulate_descendants(klass, arr)
15
+ arr
16
+ end
17
+
18
+ def clear
19
+ @@direct_descendants.clear
20
+ end
21
+
22
+ # This is the only method that is not thread safe, but is only ever called
23
+ # during the eager loading phase.
24
+ def store_inherited(klass, descendant)
25
+ (@@direct_descendants[klass] ||= []) << descendant
26
+ end
27
+
28
+ private
29
+ def accumulate_descendants(klass, acc)
30
+ if direct_descendants = @@direct_descendants[klass]
31
+ acc.concat(direct_descendants)
32
+ direct_descendants.each { |direct_descendant| accumulate_descendants(direct_descendant, acc) }
33
+ end
34
+ end
35
+ end
36
+
37
+ def inherited(base)
38
+ DescendantsTracker.store_inherited(self, base)
39
+ super
40
+ end
41
+
42
+ def direct_descendants
43
+ DescendantsTracker.direct_descendants(self)
44
+ end
45
+
46
+ def descendants
47
+ DescendantsTracker.descendants(self)
48
+ end
49
+ end
50
+ end
data/motion/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module MotionSupport
2
- VERSION = "0.2.2"
2
+ VERSION = "0.2.3"
3
3
  end
@@ -162,49 +162,6 @@ module InflectorTestCases
162
162
  "NodeChild" => "node_children"
163
163
  }
164
164
 
165
- StringToParameterized = {
166
- "Donald E. Knuth" => "donald-e-knuth",
167
- "Random text with *(bad)* characters" => "random-text-with-bad-characters",
168
- "Allow_Under_Scores" => "allow_under_scores",
169
- "Trailing bad characters!@#" => "trailing-bad-characters",
170
- "!@#Leading bad characters" => "leading-bad-characters",
171
- "Squeeze separators" => "squeeze-separators",
172
- "Test with + sign" => "test-with-sign",
173
- "Test with malformed utf8 \251" => "test-with-malformed-utf8"
174
- }
175
-
176
- StringToParameterizeWithNoSeparator = {
177
- "Donald E. Knuth" => "donaldeknuth",
178
- "With-some-dashes" => "with-some-dashes",
179
- "Random text with *(bad)* characters" => "randomtextwithbadcharacters",
180
- "Trailing bad characters!@#" => "trailingbadcharacters",
181
- "!@#Leading bad characters" => "leadingbadcharacters",
182
- "Squeeze separators" => "squeezeseparators",
183
- "Test with + sign" => "testwithsign",
184
- "Test with malformed utf8 \251" => "testwithmalformedutf8"
185
- }
186
-
187
- StringToParameterizeWithUnderscore = {
188
- "Donald E. Knuth" => "donald_e_knuth",
189
- "Random text with *(bad)* characters" => "random_text_with_bad_characters",
190
- "With-some-dashes" => "with-some-dashes",
191
- "Retain_underscore" => "retain_underscore",
192
- "Trailing bad characters!@#" => "trailing_bad_characters",
193
- "!@#Leading bad characters" => "leading_bad_characters",
194
- "Squeeze separators" => "squeeze_separators",
195
- "Test with + sign" => "test_with_sign",
196
- "Test with malformed utf8 \251" => "test_with_malformed_utf8"
197
- }
198
-
199
- StringToParameterizedAndNormalized = {
200
- "Malmö" => "malmo",
201
- "Garçons" => "garcons",
202
- "Ops\331" => "opsu",
203
- "Ærøskøbing" => "aeroskobing",
204
- "Aßlar" => "asslar",
205
- "Japanese: 日本語" => "japanese"
206
- }
207
-
208
165
  UnderscoreToHuman = {
209
166
  "employee_salary" => "Employee salary",
210
167
  "employee_id" => "Employee",
@@ -0,0 +1,58 @@
1
+ module DescendantsTrackerSpec
2
+ class Parent
3
+ extend MotionSupport::DescendantsTracker
4
+ end
5
+
6
+ class Child1 < Parent
7
+ end
8
+
9
+ class Child2 < Parent
10
+ end
11
+
12
+ class Grandchild1 < Child1
13
+ end
14
+
15
+ class Grandchild2 < Child1
16
+ end
17
+
18
+ ALL = [Parent, Child1, Child2, Grandchild1, Grandchild2]
19
+ end
20
+
21
+ describe "DescendatsTracker" do
22
+ describe "descendants" do
23
+ it "should get all descendants from parent class" do
24
+ [DescendantsTrackerSpec::Child1, DescendantsTrackerSpec::Child2, DescendantsTrackerSpec::Grandchild1, DescendantsTrackerSpec::Grandchild2].should == DescendantsTrackerSpec::Parent.descendants
25
+ end
26
+
27
+ it "should get descendants from subclass" do
28
+ [DescendantsTrackerSpec::Grandchild1, DescendantsTrackerSpec::Grandchild2].should == DescendantsTrackerSpec::Child1.descendants
29
+ end
30
+
31
+ it "should return empty array for leaf class" do
32
+ [].should == DescendantsTrackerSpec::Child2.descendants
33
+ end
34
+ end
35
+
36
+ describe "direct_descendants" do
37
+ it "should get direct descendants from parent class" do
38
+ [DescendantsTrackerSpec::Child1, DescendantsTrackerSpec::Child2].should == DescendantsTrackerSpec::Parent.direct_descendants
39
+ end
40
+
41
+ it "should get direct descendants from subclass" do
42
+ [DescendantsTrackerSpec::Grandchild1, DescendantsTrackerSpec::Grandchild2].should == DescendantsTrackerSpec::Child1.direct_descendants
43
+ end
44
+
45
+ it "should return empty array for leaf class" do
46
+ [].should == DescendantsTrackerSpec::Child2.direct_descendants
47
+ end
48
+ end
49
+
50
+ describe "clear" do
51
+ it "should remove all tracked descendants" do
52
+ MotionSupport::DescendantsTracker.clear
53
+ DescendantsTrackerSpec::ALL.each do |k|
54
+ MotionSupport::DescendantsTracker.descendants(k).should.be.empty
55
+ end
56
+ end
57
+ end
58
+ end
metadata CHANGED
@@ -1,49 +1,56 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: motion-support
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.3
4
5
  prerelease:
5
- version: 0.2.2
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Thomas Kadauke
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2013-05-06 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
12
+ date: 2013-05-11 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
16
15
  name: motion-require
17
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
18
17
  none: false
19
- requirements:
20
- - - ">="
21
- - !ruby/object:Gem::Version
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
22
21
  version: 0.0.6
23
22
  type: :runtime
24
23
  prerelease: false
25
- version_requirements: *id001
26
- - !ruby/object:Gem::Dependency
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.0.6
30
+ - !ruby/object:Gem::Dependency
27
31
  name: rake
28
- requirement: &id002 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
29
33
  none: false
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: "0"
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
34
38
  type: :development
35
39
  prerelease: false
36
- version_requirements: *id002
37
- description: Commonly useful extensions to the standard library for RubyMotion. Ported from ActiveSupport.
38
- email:
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ description: Commonly useful extensions to the standard library for RubyMotion. Ported
47
+ from ActiveSupport.
48
+ email:
39
49
  - thomas.kadauke@googlemail.com
40
50
  executables: []
41
-
42
51
  extensions: []
43
-
44
52
  extra_rdoc_files: []
45
-
46
- files:
53
+ files:
47
54
  - .gitignore
48
55
  - .yardopts
49
56
  - Gemfile
@@ -138,6 +145,7 @@ files:
138
145
  - motion/core_ext/time/acts_like.rb
139
146
  - motion/core_ext/time/calculations.rb
140
147
  - motion/core_ext/time/conversions.rb
148
+ - motion/descendants_tracker.rb
141
149
  - motion/duration.rb
142
150
  - motion/hash_with_indifferent_access.rb
143
151
  - motion/inflections.rb
@@ -202,6 +210,7 @@ files:
202
210
  - spec/motion-support/core_ext/time/acts_like_spec.rb
203
211
  - spec/motion-support/core_ext/time/calculation_spec.rb
204
212
  - spec/motion-support/core_ext/time/conversion_spec.rb
213
+ - spec/motion-support/descendants_tracker_spec.rb
205
214
  - spec/motion-support/duration_spec.rb
206
215
  - spec/motion-support/hash_with_indifferent_access_spec.rb
207
216
  - spec/motion-support/inflector_spec.rb
@@ -209,38 +218,35 @@ files:
209
218
  - spec/motion-support/ns_string_spec.rb
210
219
  homepage: https://github.com/tkadauke/motion-support
211
220
  licenses: []
212
-
213
221
  post_install_message:
214
222
  rdoc_options: []
215
-
216
- require_paths:
223
+ require_paths:
217
224
  - lib
218
- required_ruby_version: !ruby/object:Gem::Requirement
225
+ required_ruby_version: !ruby/object:Gem::Requirement
219
226
  none: false
220
- requirements:
221
- - - ">="
222
- - !ruby/object:Gem::Version
223
- hash: 1040678399660585820
224
- segments:
227
+ requirements:
228
+ - - ! '>='
229
+ - !ruby/object:Gem::Version
230
+ version: '0'
231
+ segments:
225
232
  - 0
226
- version: "0"
227
- required_rubygems_version: !ruby/object:Gem::Requirement
233
+ hash: -3381102909433523794
234
+ required_rubygems_version: !ruby/object:Gem::Requirement
228
235
  none: false
229
- requirements:
230
- - - ">="
231
- - !ruby/object:Gem::Version
232
- hash: 1040678399660585820
233
- segments:
236
+ requirements:
237
+ - - ! '>='
238
+ - !ruby/object:Gem::Version
239
+ version: '0'
240
+ segments:
234
241
  - 0
235
- version: "0"
242
+ hash: -3381102909433523794
236
243
  requirements: []
237
-
238
244
  rubyforge_project:
239
- rubygems_version: 1.8.19
245
+ rubygems_version: 1.8.25
240
246
  signing_key:
241
247
  specification_version: 3
242
248
  summary: Commonly useful extensions to the standard library for RubyMotion
243
- test_files:
249
+ test_files:
244
250
  - spec/motion-support/_helpers/constantize_test_cases.rb
245
251
  - spec/motion-support/_helpers/inflector_test_cases.rb
246
252
  - spec/motion-support/core_ext/array/access_spec.rb
@@ -298,6 +304,7 @@ test_files:
298
304
  - spec/motion-support/core_ext/time/acts_like_spec.rb
299
305
  - spec/motion-support/core_ext/time/calculation_spec.rb
300
306
  - spec/motion-support/core_ext/time/conversion_spec.rb
307
+ - spec/motion-support/descendants_tracker_spec.rb
301
308
  - spec/motion-support/duration_spec.rb
302
309
  - spec/motion-support/hash_with_indifferent_access_spec.rb
303
310
  - spec/motion-support/inflector_spec.rb