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.
Files changed (182) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.yardopts +1 -0
  4. data/Gemfile +4 -0
  5. data/HACKS.md +7 -0
  6. data/MIT-LICENSE +20 -0
  7. data/README.md +359 -0
  8. data/Rakefile +14 -0
  9. data/app/app_delegate.rb +5 -0
  10. data/examples/Inflector/.gitignore +16 -0
  11. data/examples/Inflector/Gemfile +5 -0
  12. data/examples/Inflector/Rakefile +13 -0
  13. data/examples/Inflector/app/app_delegate.rb +8 -0
  14. data/examples/Inflector/app/inflections.rb +5 -0
  15. data/examples/Inflector/app/inflector_view_controller.rb +109 -0
  16. data/examples/Inflector/app/words_view_controller.rb +101 -0
  17. data/examples/Inflector/resources/Default-568h@2x.png +0 -0
  18. data/examples/Inflector/spec/main_spec.rb +9 -0
  19. data/lib/motion-support/callbacks.rb +8 -0
  20. data/lib/motion-support/concern.rb +4 -0
  21. data/lib/motion-support/core_ext/array.rb +10 -0
  22. data/lib/motion-support/core_ext/class.rb +5 -0
  23. data/lib/motion-support/core_ext/hash.rb +13 -0
  24. data/lib/motion-support/core_ext/integer.rb +6 -0
  25. data/lib/motion-support/core_ext/module.rb +11 -0
  26. data/lib/motion-support/core_ext/numeric.rb +6 -0
  27. data/lib/motion-support/core_ext/object.rb +12 -0
  28. data/lib/motion-support/core_ext/range.rb +5 -0
  29. data/lib/motion-support/core_ext/string.rb +13 -0
  30. data/lib/motion-support/core_ext/time.rb +16 -0
  31. data/lib/motion-support/core_ext.rb +13 -0
  32. data/lib/motion-support/inflector.rb +8 -0
  33. data/lib/motion-support.rb +81 -0
  34. data/motion/_stdlib/array.rb +13 -0
  35. data/motion/_stdlib/cgi.rb +22 -0
  36. data/motion/_stdlib/date.rb +81 -0
  37. data/motion/_stdlib/enumerable.rb +9 -0
  38. data/motion/_stdlib/time.rb +19 -0
  39. data/motion/callbacks.rb +511 -0
  40. data/motion/concern.rb +122 -0
  41. data/motion/core_ext/array/access.rb +28 -0
  42. data/motion/core_ext/array/conversions.rb +86 -0
  43. data/motion/core_ext/array/extract_options.rb +11 -0
  44. data/motion/core_ext/array/grouping.rb +99 -0
  45. data/motion/core_ext/array/prepend_and_append.rb +7 -0
  46. data/motion/core_ext/array/wrap.rb +45 -0
  47. data/motion/core_ext/array.rb +19 -0
  48. data/motion/core_ext/class/attribute.rb +119 -0
  49. data/motion/core_ext/class/attribute_accessors.rb +168 -0
  50. data/motion/core_ext/date/acts_like.rb +8 -0
  51. data/motion/core_ext/date/calculations.rb +117 -0
  52. data/motion/core_ext/date/conversions.rb +56 -0
  53. data/motion/core_ext/date_and_time/calculations.rb +232 -0
  54. data/motion/core_ext/enumerable.rb +90 -0
  55. data/motion/core_ext/hash/deep_delete_if.rb +23 -0
  56. data/motion/core_ext/hash/deep_merge.rb +27 -0
  57. data/motion/core_ext/hash/except.rb +15 -0
  58. data/motion/core_ext/hash/indifferent_access.rb +19 -0
  59. data/motion/core_ext/hash/keys.rb +150 -0
  60. data/motion/core_ext/hash/reverse_merge.rb +22 -0
  61. data/motion/core_ext/hash/slice.rb +40 -0
  62. data/motion/core_ext/integer/inflections.rb +27 -0
  63. data/motion/core_ext/integer/multiple.rb +10 -0
  64. data/motion/core_ext/integer/time.rb +41 -0
  65. data/motion/core_ext/kernel/singleton_class.rb +6 -0
  66. data/motion/core_ext/metaclass.rb +8 -0
  67. data/motion/core_ext/module/aliasing.rb +69 -0
  68. data/motion/core_ext/module/anonymous.rb +19 -0
  69. data/motion/core_ext/module/attr_internal.rb +38 -0
  70. data/motion/core_ext/module/attribute_accessors.rb +64 -0
  71. data/motion/core_ext/module/delegation.rb +175 -0
  72. data/motion/core_ext/module/introspection.rb +60 -0
  73. data/motion/core_ext/module/reachable.rb +5 -0
  74. data/motion/core_ext/module/remove_method.rb +12 -0
  75. data/motion/core_ext/ns_dictionary.rb +14 -0
  76. data/motion/core_ext/ns_string.rb +14 -0
  77. data/motion/core_ext/numeric/bytes.rb +44 -0
  78. data/motion/core_ext/numeric/conversions.rb +49 -0
  79. data/motion/core_ext/numeric/time.rb +75 -0
  80. data/motion/core_ext/object/acts_like.rb +10 -0
  81. data/motion/core_ext/object/blank.rb +105 -0
  82. data/motion/core_ext/object/deep_dup.rb +44 -0
  83. data/motion/core_ext/object/duplicable.rb +87 -0
  84. data/motion/core_ext/object/inclusion.rb +15 -0
  85. data/motion/core_ext/object/instance_variables.rb +28 -0
  86. data/motion/core_ext/object/to_param.rb +58 -0
  87. data/motion/core_ext/object/to_query.rb +26 -0
  88. data/motion/core_ext/object/try.rb +78 -0
  89. data/motion/core_ext/range/include_range.rb +23 -0
  90. data/motion/core_ext/range/overlaps.rb +8 -0
  91. data/motion/core_ext/regexp.rb +5 -0
  92. data/motion/core_ext/string/access.rb +104 -0
  93. data/motion/core_ext/string/behavior.rb +6 -0
  94. data/motion/core_ext/string/exclude.rb +11 -0
  95. data/motion/core_ext/string/filters.rb +55 -0
  96. data/motion/core_ext/string/indent.rb +43 -0
  97. data/motion/core_ext/string/inflections.rb +178 -0
  98. data/motion/core_ext/string/starts_ends_with.rb +4 -0
  99. data/motion/core_ext/string/strip.rb +24 -0
  100. data/motion/core_ext/time/acts_like.rb +8 -0
  101. data/motion/core_ext/time/calculations.rb +215 -0
  102. data/motion/core_ext/time/conversions.rb +52 -0
  103. data/motion/descendants_tracker.rb +50 -0
  104. data/motion/duration.rb +104 -0
  105. data/motion/hash_with_indifferent_access.rb +253 -0
  106. data/motion/inflections.rb +67 -0
  107. data/motion/inflector/inflections.rb +203 -0
  108. data/motion/inflector/methods.rb +321 -0
  109. data/motion/logger.rb +47 -0
  110. data/motion/number_helper.rb +54 -0
  111. data/motion/version.rb +3 -0
  112. data/motion_blender-support.gemspec +21 -0
  113. data/spec/motion-support/_helpers/constantize_test_cases.rb +75 -0
  114. data/spec/motion-support/_helpers/inflector_test_cases.rb +270 -0
  115. data/spec/motion-support/callback_spec.rb +702 -0
  116. data/spec/motion-support/concern_spec.rb +93 -0
  117. data/spec/motion-support/core_ext/array/access_spec.rb +29 -0
  118. data/spec/motion-support/core_ext/array/conversion_spec.rb +60 -0
  119. data/spec/motion-support/core_ext/array/extract_options_spec.rb +15 -0
  120. data/spec/motion-support/core_ext/array/grouping_spec.rb +85 -0
  121. data/spec/motion-support/core_ext/array/prepend_and_append_spec.rb +25 -0
  122. data/spec/motion-support/core_ext/array/wrap_spec.rb +19 -0
  123. data/spec/motion-support/core_ext/array_spec.rb +16 -0
  124. data/spec/motion-support/core_ext/class/attribute_accessor_spec.rb +127 -0
  125. data/spec/motion-support/core_ext/class/attribute_spec.rb +92 -0
  126. data/spec/motion-support/core_ext/date/acts_like_spec.rb +11 -0
  127. data/spec/motion-support/core_ext/date/calculation_spec.rb +186 -0
  128. data/spec/motion-support/core_ext/date/conversion_spec.rb +18 -0
  129. data/spec/motion-support/core_ext/date_and_time/calculation_spec.rb +336 -0
  130. data/spec/motion-support/core_ext/enumerable_spec.rb +130 -0
  131. data/spec/motion-support/core_ext/hash/deep_delete_if_spec.rb +19 -0
  132. data/spec/motion-support/core_ext/hash/deep_merge_spec.rb +32 -0
  133. data/spec/motion-support/core_ext/hash/except_spec.rb +43 -0
  134. data/spec/motion-support/core_ext/hash/key_spec.rb +236 -0
  135. data/spec/motion-support/core_ext/hash/reverse_merge_spec.rb +26 -0
  136. data/spec/motion-support/core_ext/hash/slice_spec.rb +61 -0
  137. data/spec/motion-support/core_ext/integer/inflection_spec.rb +23 -0
  138. data/spec/motion-support/core_ext/integer/multiple_spec.rb +19 -0
  139. data/spec/motion-support/core_ext/kernel/singleton_class_spec.rb +9 -0
  140. data/spec/motion-support/core_ext/metaclass_spec.rb +9 -0
  141. data/spec/motion-support/core_ext/module/aliasing_spec.rb +143 -0
  142. data/spec/motion-support/core_ext/module/anonymous_spec.rb +29 -0
  143. data/spec/motion-support/core_ext/module/attr_internal_spec.rb +104 -0
  144. data/spec/motion-support/core_ext/module/attribute_accessor_spec.rb +86 -0
  145. data/spec/motion-support/core_ext/module/delegation_spec.rb +136 -0
  146. data/spec/motion-support/core_ext/module/introspection_spec.rb +70 -0
  147. data/spec/motion-support/core_ext/module/reachable_spec.rb +61 -0
  148. data/spec/motion-support/core_ext/module/remove_method_spec.rb +25 -0
  149. data/spec/motion-support/core_ext/numeric/bytes_spec.rb +43 -0
  150. data/spec/motion-support/core_ext/numeric/conversions_spec.rb +40 -0
  151. data/spec/motion-support/core_ext/object/acts_like_spec.rb +21 -0
  152. data/spec/motion-support/core_ext/object/blank_spec.rb +54 -0
  153. data/spec/motion-support/core_ext/object/deep_dup_spec.rb +54 -0
  154. data/spec/motion-support/core_ext/object/duplicable_spec.rb +31 -0
  155. data/spec/motion-support/core_ext/object/inclusion_spec.rb +34 -0
  156. data/spec/motion-support/core_ext/object/instance_variable_spec.rb +19 -0
  157. data/spec/motion-support/core_ext/object/to_param_spec.rb +75 -0
  158. data/spec/motion-support/core_ext/object/to_query_spec.rb +37 -0
  159. data/spec/motion-support/core_ext/object/try_spec.rb +92 -0
  160. data/spec/motion-support/core_ext/range/include_range_spec.rb +31 -0
  161. data/spec/motion-support/core_ext/range/overlap_spec.rb +43 -0
  162. data/spec/motion-support/core_ext/regexp_spec.rb +7 -0
  163. data/spec/motion-support/core_ext/string/access_spec.rb +53 -0
  164. data/spec/motion-support/core_ext/string/behavior_spec.rb +7 -0
  165. data/spec/motion-support/core_ext/string/exclude_spec.rb +8 -0
  166. data/spec/motion-support/core_ext/string/filter_spec.rb +49 -0
  167. data/spec/motion-support/core_ext/string/indent_spec.rb +56 -0
  168. data/spec/motion-support/core_ext/string/inflection_spec.rb +142 -0
  169. data/spec/motion-support/core_ext/string/starts_end_with_spec.rb +14 -0
  170. data/spec/motion-support/core_ext/string/strip_spec.rb +34 -0
  171. data/spec/motion-support/core_ext/string_spec.rb +88 -0
  172. data/spec/motion-support/core_ext/time/acts_like_spec.rb +11 -0
  173. data/spec/motion-support/core_ext/time/calculation_spec.rb +201 -0
  174. data/spec/motion-support/core_ext/time/conversion_spec.rb +53 -0
  175. data/spec/motion-support/descendants_tracker_spec.rb +58 -0
  176. data/spec/motion-support/duration_spec.rb +107 -0
  177. data/spec/motion-support/hash_with_indifferent_access_spec.rb +605 -0
  178. data/spec/motion-support/inflector_spec.rb +504 -0
  179. data/spec/motion-support/ns_dictionary_spec.rb +89 -0
  180. data/spec/motion-support/ns_string_spec.rb +182 -0
  181. data/spec/motion-support/number_helper_spec.rb +55 -0
  182. metadata +352 -0
@@ -0,0 +1,186 @@
1
+ describe "Date" do
2
+ describe "calculations" do
3
+ describe "yesterday" do
4
+ it "should calculate yesterday's date" do
5
+ Date.new(1982,10,15).yesterday.should == Date.new(1982,10,14)
6
+ end
7
+
8
+ it "should construct yesterday's date" do
9
+ Date.yesterday.should == Date.current - 1
10
+ end
11
+ end
12
+
13
+ describe "tomorrow" do
14
+ it "should calculate tomorrow's date" do
15
+ Date.new(1982,10,4).tomorrow.should == Date.new(1982,10,5)
16
+ end
17
+
18
+ it "should construct tomorrow's date" do
19
+ Date.tomorrow.should == Date.current + 1
20
+ end
21
+ end
22
+
23
+ describe "change" do
24
+ it "should change correctly" do
25
+ Date.new(2005,2,11).change(:day => 21).should == Date.new(2005,2,21)
26
+ Date.new(2005,2,11).change(:year => 2007, :month => 5).should == Date.new(2007,5,11)
27
+ Date.new(2005,2,22).change(:year => 2006).should == Date.new(2006,2,22)
28
+ Date.new(2005,2,22).change(:month => 6).should == Date.new(2005,6,22)
29
+ end
30
+ end
31
+
32
+ describe "sunday" do
33
+ it "should calculate correctly" do
34
+ Date.new(2008,3,02).sunday.should == Date.new(2008,3,2)
35
+ Date.new(2008,2,29).sunday.should == Date.new(2008,3,2)
36
+ end
37
+ end
38
+
39
+ describe "beginning_of_week" do
40
+ it "should calculate correctly" do
41
+ Date.new(1982,10,15).beginning_of_week.should == Date.new(1982,10,11)
42
+ end
43
+ end
44
+
45
+ describe "end_of_week" do
46
+ it "should calculate correctly" do
47
+ Date.new(1982,10,4).end_of_week.should == Date.new(1982,10,10)
48
+ end
49
+ end
50
+
51
+ describe "end_of_year" do
52
+ it "should calculate correctly" do
53
+ Date.new(2008,2,22).end_of_year.should == Date.new(2008,12,31)
54
+ end
55
+ end
56
+
57
+ describe "end_of_month" do
58
+ it "should calculate correctly" do
59
+ Date.new(2005,3,20).end_of_month.should == Date.new(2005,3,31)
60
+ Date.new(2005,2,20).end_of_month.should == Date.new(2005,2,28)
61
+ Date.new(2005,4,20).end_of_month.should == Date.new(2005,4,30)
62
+ end
63
+ end
64
+
65
+ describe "prev_year" do
66
+ it "should calculate correctly" do
67
+ Date.new(1983,10,14).prev_year.should == Date.new(1982,10,14)
68
+ end
69
+
70
+ it "should work with leap years" do
71
+ Date.new(2000,2,29).prev_year.should == Date.new(1999,2,28)
72
+ end
73
+ end
74
+
75
+ describe "last_year" do
76
+ it "should calculate correctly" do
77
+ Date.new(2005,6,5).last_year.should == Date.new(2004,6,5)
78
+ Date.new(1983,10,14).last_year.should == Date.new(1982,10,14)
79
+ end
80
+
81
+ it "should work with leap years" do
82
+ Date.new(2000,2,29).last_year.should == Date.new(1999,2,28)
83
+ end
84
+ end
85
+
86
+ describe "next_year" do
87
+ it "should calculate correctly" do
88
+ Date.new(1981,10,10).next_year.should == Date.new(1982,10,10)
89
+ end
90
+
91
+ it "should work with leap years" do
92
+ Date.new(2000,2,29).next_year.should == Date.new(2001,2,28)
93
+ end
94
+ end
95
+
96
+ describe "advance" do
97
+ it "should calculate correctly" do
98
+ Date.new(2005,2,28).advance(:years => 1).should == Date.new(2006,2,28)
99
+ Date.new(2005,2,28).advance(:months => 4).should == Date.new(2005,6,28)
100
+ Date.new(2005,2,28).advance(:weeks => 3).should == Date.new(2005,3,21)
101
+ Date.new(2005,2,28).advance(:days => 5).should == Date.new(2005,3,5)
102
+ Date.new(2005,2,28).advance(:years => 7, :months => 7).should == Date.new(2012,9,28)
103
+ Date.new(2005,2,28).advance(:years => 7, :months => 19, :days => 5).should == Date.new(2013,10,3)
104
+ Date.new(2005,2,28).advance(:years => 7, :months => 19, :weeks => 2, :days => 5).should == Date.new(2013,10,17)
105
+ Date.new(2004,2,29).advance(:years => 1).should == Date.new(2005,2,28)
106
+ end
107
+
108
+ it "should advance years before days" do
109
+ Date.new(2011, 2, 28).advance(:years => 1, :days => 1).should == Date.new(2012, 2, 29)
110
+ end
111
+
112
+ it "should advance months before days" do
113
+ Date.new(2010, 2, 28).advance(:months => 1, :days => 1).should == Date.new(2010, 3, 29)
114
+ end
115
+
116
+ it "should not change passed option hash" do
117
+ options = { :years => 3, :months => 11, :days => 2 }
118
+ Date.new(2005,2,28).advance(options)
119
+ options.should == { :years => 3, :months => 11, :days => 2 }
120
+ end
121
+ end
122
+
123
+ describe "last_week" do
124
+ it "should calculate correctly" do
125
+ Date.new(2005,5,17).last_week.should == Date.new(2005,5,9)
126
+ Date.new(2007,1,7).last_week.should == Date.new(2006,12,25)
127
+ Date.new(2010,2,19).last_week(:friday).should == Date.new(2010,2,12)
128
+ Date.new(2010,2,19).last_week(:saturday).should == Date.new(2010,2,13)
129
+ Date.new(2010,3,4).last_week(:saturday).should == Date.new(2010,2,27)
130
+ end
131
+ end
132
+
133
+ describe "last_month" do
134
+ it "should calculate correctly on the 31st" do
135
+ Date.new(2004, 3, 31).last_month.should == Date.new(2004, 2, 29)
136
+
137
+ end
138
+ end
139
+
140
+ describe "last_quarter" do
141
+ it "should calculate correctly on the 31st" do
142
+ Date.new(2004, 5, 31).last_quarter.should == Date.new(2004, 2, 29)
143
+ end
144
+ end
145
+
146
+ describe "since" do
147
+ it "should calculate correctly" do
148
+ Date.new(2005,2,21).since(45).should == Time.local(2005,2,21,0,0,45)
149
+ end
150
+ end
151
+
152
+ describe "ago" do
153
+ it "should calculate correctly" do
154
+ Date.new(2005,2,21).ago(45).should == Time.local(2005,2,20,23,59,15)
155
+ end
156
+ end
157
+
158
+ describe "beginning_of_day" do
159
+ it "should calculate correctly" do
160
+ Date.new(2005,2,21).beginning_of_day.should == Time.local(2005,2,21,0,0,0)
161
+ end
162
+ end
163
+
164
+ describe "end_of_day" do
165
+ it "should calculate correctly" do
166
+ Date.new(2005,2,21).end_of_day.should == Time.local(2005,2,21,23,59,59,Rational(999999999, 1000))
167
+ end
168
+ end
169
+
170
+ describe "past?" do
171
+ it "should calculate correctly" do
172
+ Date.yesterday.should.be.past
173
+ Date.today.last_week.should.be.past
174
+ Date.tomorrow.should.not.be.past
175
+ end
176
+ end
177
+
178
+ describe "future?" do
179
+ it "should calculate correctly" do
180
+ Date.tomorrow.should.be.future
181
+ Date.today.next_week.should.be.future
182
+ Date.yesterday.should.not.be.future
183
+ end
184
+ end
185
+ end
186
+ end
@@ -0,0 +1,18 @@
1
+ describe "date" do
2
+ describe "conversions" do
3
+ it "should convert date to string" do
4
+ date = Date.new(2005, 2, 21)
5
+ date.to_s.should == "2005-2-21"
6
+ date.to_s(:short).should == "21 Feb"
7
+ date.to_s(:long).should == "February 21, 2005"
8
+ date.to_s(:long_ordinal).should == "February 21st, 2005"
9
+ date.to_s(:db).should == "2005-02-21"
10
+ date.to_s(:rfc822).should == "21 Feb 2005"
11
+ end
12
+
13
+ it "should make inspect readable" do
14
+ Date.new(2005, 2, 21).readable_inspect.should == "Mon, 21 Feb 2005"
15
+ Date.new(2005, 2, 21).readable_inspect.should == Date.new(2005, 2, 21).inspect
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,336 @@
1
+ class Date
2
+ def self.for_spec(year, month, day, hour, minute, second, usec)
3
+ new(year, month, day)
4
+ end
5
+ end
6
+
7
+ class Time
8
+ def self.for_spec(year, month, day, hour, minute, second, usec)
9
+ local(year, month, day, hour, minute, second, usec)
10
+ end
11
+ end
12
+
13
+ [Date, Time].each do |klass|
14
+ describe klass do
15
+ @klass = klass
16
+ def date_or_time(year, month, day, hour, minute, second, usec = nil)
17
+ @klass.for_spec(year, month, day, hour, minute, second, usec)
18
+ end
19
+
20
+ def with_bw_default(bw = :monday)
21
+ old_bw = Date.beginning_of_week
22
+ Date.beginning_of_week = bw
23
+ yield
24
+ ensure
25
+ Date.beginning_of_week = old_bw
26
+ end
27
+
28
+ describe "yesterday" do
29
+ it "should be calculated correctly" do
30
+ date_or_time(2005,2,22,10,10,10).yesterday.should == date_or_time(2005,2,21,10,10,10)
31
+ date_or_time(2005,3,2,10,10,10).yesterday.yesterday.should == date_or_time(2005,2,28,10,10,10)
32
+ end
33
+ end
34
+
35
+ describe "tomorrow" do
36
+ it "should be calculated correctly" do
37
+ date_or_time(2005,2,22,10,10,10).tomorrow.should == date_or_time(2005,2,23,10,10,10)
38
+ date_or_time(2005,2,28,10,10,10).tomorrow.tomorrow.should == date_or_time(2005,3,2,10,10,10)
39
+ end
40
+ end
41
+
42
+ describe "days_ago" do
43
+ it "should be calculated correctly" do
44
+ date_or_time(2005,6,5,10,10,10).days_ago(1).should == date_or_time(2005,6,4,10,10,10)
45
+ date_or_time(2005,6,5,10,10,10).days_ago(5).should == date_or_time(2005,5,31,10,10,10)
46
+ end
47
+ end
48
+
49
+ describe "days_since" do
50
+ it "should be calculated correctly" do
51
+ date_or_time(2005,6,5,10,10,10).days_since(1).should == date_or_time(2005,6,6,10,10,10)
52
+ date_or_time(2004,12,31,10,10,10).days_since(1).should == date_or_time(2005,1,1,10,10,10)
53
+ end
54
+ end
55
+
56
+ describe "weeks_ago" do
57
+ it "should be calculated correctly" do
58
+ date_or_time(2005,6,5,10,10,10).weeks_ago(1).should == date_or_time(2005,5,29,10,10,10)
59
+ date_or_time(2005,6,5,10,10,10).weeks_ago(5).should == date_or_time(2005,5,1,10,10,10)
60
+ date_or_time(2005,6,5,10,10,10).weeks_ago(6).should == date_or_time(2005,4,24,10,10,10)
61
+ date_or_time(2005,6,5,10,10,10).weeks_ago(14).should == date_or_time(2005,2,27,10,10,10)
62
+ date_or_time(2005,1,1,10,10,10).weeks_ago(1).should == date_or_time(2004,12,25,10,10,10)
63
+ end
64
+ end
65
+
66
+ describe "weeks_since" do
67
+ it "should be calculated correctly" do
68
+ date_or_time(2005,7,7,10,10,10).weeks_since(1).should == date_or_time(2005,7,14,10,10,10)
69
+ date_or_time(2005,7,7,10,10,10).weeks_since(1).should == date_or_time(2005,7,14,10,10,10)
70
+ date_or_time(2005,6,27,10,10,10).weeks_since(1).should == date_or_time(2005,7,4,10,10,10)
71
+ date_or_time(2004,12,28,10,10,10).weeks_since(1).should == date_or_time(2005,1,4,10,10,10)
72
+ end
73
+ end
74
+
75
+ describe "months_ago" do
76
+ it "should be calculated correctly" do
77
+ date_or_time(2005,6,5,10,10,10).months_ago(1).should == date_or_time(2005,5,5,10,10,10)
78
+ date_or_time(2005,6,5,10,10,10).months_ago(7).should == date_or_time(2004,11,5,10,10,10)
79
+ date_or_time(2005,6,5,10,10,10).months_ago(6).should == date_or_time(2004,12,5,10,10,10)
80
+ date_or_time(2005,6,5,10,10,10).months_ago(12).should == date_or_time(2004,6,5,10,10,10)
81
+ date_or_time(2005,6,5,10,10,10).months_ago(24).should == date_or_time(2003,6,5,10,10,10)
82
+ end
83
+ end
84
+
85
+ describe "months_since" do
86
+ it "should be calculated correctly" do
87
+ date_or_time(2005,6,5,10,10,10).months_since(1).should == date_or_time(2005,7,5,10,10,10)
88
+ date_or_time(2005,12,5,10,10,10).months_since(1).should == date_or_time(2006,1,5,10,10,10)
89
+ date_or_time(2005,6,5,10,10,10).months_since(6).should == date_or_time(2005,12,5,10,10,10)
90
+ date_or_time(2005,12,5,10,10,10).months_since(6).should == date_or_time(2006,6,5,10,10,10)
91
+ date_or_time(2005,6,5,10,10,10).months_since(7).should == date_or_time(2006,1,5,10,10,10)
92
+ date_or_time(2005,6,5,10,10,10).months_since(12).should == date_or_time(2006,6,5,10,10,10)
93
+ date_or_time(2005,6,5,10,10,10).months_since(24).should == date_or_time(2007,6,5,10,10,10)
94
+ date_or_time(2005,3,31,10,10,10).months_since(1).should == date_or_time(2005,4,30,10,10,10)
95
+ date_or_time(2005,1,29,10,10,10).months_since(1).should == date_or_time(2005,2,28,10,10,10)
96
+ date_or_time(2005,1,30,10,10,10).months_since(1).should == date_or_time(2005,2,28,10,10,10)
97
+ date_or_time(2005,1,31,10,10,10).months_since(1).should == date_or_time(2005,2,28,10,10,10)
98
+ end
99
+ end
100
+
101
+ describe "years_ago" do
102
+ it "should be calculated correctly" do
103
+ date_or_time(2005,6,5,10,10,10).years_ago(1).should == date_or_time(2004,6,5,10,10,10)
104
+ date_or_time(2005,6,5,10,10,10).years_ago(7).should == date_or_time(1998,6,5,10,10,10)
105
+ # 1 year ago from leap day
106
+ date_or_time(2004,2,29,10,10,10).years_ago(1).should == date_or_time(2003,2,28,10,10,10)
107
+ end
108
+ end
109
+
110
+ describe "years_since" do
111
+ it "should be calculated correctly" do
112
+ date_or_time(2005,6,5,10,10,10).years_since(1).should == date_or_time(2006,6,5,10,10,10)
113
+ date_or_time(2005,6,5,10,10,10).years_since(7).should == date_or_time(2012,6,5,10,10,10)
114
+ # 1 year since leap day
115
+ date_or_time(2004,2,29,10,10,10).years_since(1).should == date_or_time(2005,2,28,10,10,10)
116
+ end
117
+ end
118
+
119
+ describe "beginning_of_month" do
120
+ it "should be calculated correctly" do
121
+ date_or_time(2005,2,22,10,10,10).beginning_of_month.should == date_or_time(2005,2,1,0,0,0)
122
+ end
123
+ end
124
+
125
+ describe "beginning_of_quarter" do
126
+ it "should be calculated correctly" do
127
+ date_or_time(2005,2,15,10,10,10).beginning_of_quarter.should == date_or_time(2005,1,1,0,0,0)
128
+ date_or_time(2005,1,1,0,0,0).beginning_of_quarter.should == date_or_time(2005,1,1,0,0,0)
129
+ date_or_time(2005,12,31,10,10,10).beginning_of_quarter.should == date_or_time(2005,10,1,0,0,0)
130
+ date_or_time(2005,6,30,23,59,59).beginning_of_quarter.should == date_or_time(2005,4,1,0,0,0)
131
+ end
132
+ end
133
+
134
+ describe "end_of_quarter" do
135
+ it "should be calculated correctly" do
136
+ date_or_time(2007,2,15,10,10,10).end_of_quarter.should == date_or_time(2007,3,31,23,59,59,Rational(999999999, 1000))
137
+ date_or_time(2007,3,31,0,0,0).end_of_quarter.should == date_or_time(2007,3,31,23,59,59,Rational(999999999, 1000))
138
+ date_or_time(2007,12,21,10,10,10).end_of_quarter.should == date_or_time(2007,12,31,23,59,59,Rational(999999999, 1000))
139
+ date_or_time(2007,4,1,0,0,0).end_of_quarter.should == date_or_time(2007,6,30,23,59,59,Rational(999999999, 1000))
140
+ date_or_time(2008,5,31,0,0,0).end_of_quarter.should == date_or_time(2008,6,30,23,59,59,Rational(999999999, 1000))
141
+ end
142
+ end
143
+
144
+ describe "beginning_of_year" do
145
+ it "should be calculated correctly" do
146
+ date_or_time(2005,2,22,10,10,10).beginning_of_year.should == date_or_time(2005,1,1,0,0,0)
147
+ end
148
+ end
149
+
150
+ describe "next_week" do
151
+ it "should be calculated correctly" do
152
+ date_or_time(2005,2,22,15,15,10).next_week.should == date_or_time(2005,2,28,0,0,0)
153
+ date_or_time(2005,2,22,15,15,10).next_week(:friday).should == date_or_time(2005,3,4,0,0,0)
154
+ date_or_time(2006,10,23,0,0,0).next_week.should == date_or_time(2006,10,30,0,0,0)
155
+ date_or_time(2006,10,23,0,0,0).next_week(:wednesday).should == date_or_time(2006,11,1,0,0,0)
156
+ end
157
+
158
+ it "should be calculated correctly with default beginning of week" do
159
+ # calling with_bw_default produces LocalJumpError, even though a block is given
160
+ begin
161
+ old_bw = Date.beginning_of_week
162
+ Date.beginning_of_week = :tuesday
163
+
164
+ date_or_time(2012,3,21,0,0,0).next_week(:wednesday).should == date_or_time(2012,3,28,0,0,0)
165
+ date_or_time(2012,3,21,0,0,0).next_week(:saturday).should == date_or_time(2012,3,31,0,0,0)
166
+ date_or_time(2012,3,21,0,0,0).next_week(:tuesday).should == date_or_time(2012,3,27,0,0,0)
167
+ date_or_time(2012,3,21,0,0,0).next_week(:monday).should == date_or_time(2012,4,02,0,0,0)
168
+ ensure
169
+ Date.beginning_of_week = old_bw
170
+ end
171
+ end
172
+ end
173
+
174
+ describe "next_month" do
175
+ it "should be calculated correctly" do
176
+ date_or_time(2005,8,31,15,15,10).next_month.should == date_or_time(2005,9,30,15,15,10)
177
+ end
178
+ end
179
+
180
+ describe "next_quarter" do
181
+ it "should be calculated correctly" do
182
+ date_or_time(2005,8,31,15,15,10).next_quarter.should == date_or_time(2005,11,30,15,15,10)
183
+ end
184
+ end
185
+
186
+ describe "next_year" do
187
+ it "should be calculated correctly" do
188
+ date_or_time(2005,6,5,10,10,10).next_year.should == date_or_time(2006,6,5,10,10,10)
189
+ end
190
+ end
191
+
192
+ describe "prev_week" do
193
+ it "should be calculated correctly" do
194
+ date_or_time(2005,3,1,15,15,10).prev_week.should == date_or_time(2005,2,21,0,0,0)
195
+ date_or_time(2005,3,1,15,15,10).prev_week(:tuesday).should == date_or_time(2005,2,22,0,0,0)
196
+ date_or_time(2005,3,1,15,15,10).prev_week(:friday).should == date_or_time(2005,2,25,0,0,0)
197
+ date_or_time(2006,11,6,0,0,0).prev_week.should == date_or_time(2006,10,30,0,0,0)
198
+ date_or_time(2006,11,23,0,0,0).prev_week(:wednesday).should == date_or_time(2006,11,15,0,0,0)
199
+ end
200
+
201
+ it "should be calculated correctly with default beginning of week" do
202
+ begin
203
+ old_bw = Date.beginning_of_week
204
+ Date.beginning_of_week = :tuesday
205
+
206
+ date_or_time(2012,3,21,0,0,0).prev_week(:wednesday).should == date_or_time(2012,3,14,0,0,0)
207
+ date_or_time(2012,3,21,0,0,0).prev_week(:saturday).should == date_or_time(2012,3,17,0,0,0)
208
+ date_or_time(2012,3,21,0,0,0).prev_week(:tuesday).should == date_or_time(2012,3,13,0,0,0)
209
+ date_or_time(2012,3,21,0,0,0).prev_week(:monday).should == date_or_time(2012,3,19,0,0,0)
210
+ ensure
211
+ Date.beginning_of_week = old_bw
212
+ end
213
+ end
214
+ end
215
+
216
+ describe "prev_month" do
217
+ it "should be calculated correctly" do
218
+ date_or_time(2004,3,31,10,10,10).prev_month.should == date_or_time(2004,2,29,10,10,10)
219
+ end
220
+ end
221
+
222
+ describe "prev_quarter" do
223
+ it "should be calculated correctly" do
224
+ date_or_time(2004,5,31,10,10,10).prev_quarter.should == date_or_time(2004,2,29,10,10,10)
225
+ end
226
+ end
227
+
228
+ describe "prev_year" do
229
+ it "should be calculated correctly" do
230
+ date_or_time(2005,6,5,10,10,10).prev_year.should == date_or_time(2004,6,5,10,10,10)
231
+ end
232
+ end
233
+
234
+ describe "days_to_week_start" do
235
+ it "should be calculated correctly" do
236
+ date_or_time(2011,11,01,0,0,0).days_to_week_start(:tuesday).should == 0
237
+ date_or_time(2011,11,02,0,0,0).days_to_week_start(:tuesday).should == 1
238
+ date_or_time(2011,11,03,0,0,0).days_to_week_start(:tuesday).should == 2
239
+ date_or_time(2011,11,04,0,0,0).days_to_week_start(:tuesday).should == 3
240
+ date_or_time(2011,11,05,0,0,0).days_to_week_start(:tuesday).should == 4
241
+ date_or_time(2011,11,06,0,0,0).days_to_week_start(:tuesday).should == 5
242
+ date_or_time(2011,11,07,0,0,0).days_to_week_start(:tuesday).should == 6
243
+
244
+ date_or_time(2011,11,03,0,0,0).days_to_week_start(:monday).should == 3
245
+ date_or_time(2011,11,04,0,0,0).days_to_week_start(:tuesday).should == 3
246
+ date_or_time(2011,11,05,0,0,0).days_to_week_start(:wednesday).should == 3
247
+ date_or_time(2011,11,06,0,0,0).days_to_week_start(:thursday).should == 3
248
+ date_or_time(2011,11,07,0,0,0).days_to_week_start(:friday).should == 3
249
+ date_or_time(2011,11,8,0,0,0).days_to_week_start(:saturday).should == 3
250
+ date_or_time(2011,11,9,0,0,0).days_to_week_start(:sunday).should == 3
251
+ end
252
+
253
+ it "should be calculated correctly with default beginning of week" do
254
+ begin
255
+ old_bw = Date.beginning_of_week
256
+ Date.beginning_of_week = :friday
257
+
258
+ date_or_time(2012,03,8,0,0,0).days_to_week_start.should == 6
259
+ date_or_time(2012,03,7,0,0,0).days_to_week_start.should == 5
260
+ date_or_time(2012,03,6,0,0,0).days_to_week_start.should == 4
261
+ date_or_time(2012,03,5,0,0,0).days_to_week_start.should == 3
262
+ date_or_time(2012,03,4,0,0,0).days_to_week_start.should == 2
263
+ date_or_time(2012,03,3,0,0,0).days_to_week_start.should == 1
264
+ date_or_time(2012,03,2,0,0,0).days_to_week_start.should == 0
265
+ ensure
266
+ Date.beginning_of_week = old_bw
267
+ end
268
+ end
269
+ end
270
+
271
+ describe "beginning_of_week" do
272
+ it "should be calculated correctly" do
273
+ date_or_time(2005,2,4,10,10,10).beginning_of_week.should == date_or_time(2005,1,31,0,0,0)
274
+ date_or_time(2005,11,28,0,0,0).beginning_of_week.should == date_or_time(2005,11,28,0,0,0)
275
+ date_or_time(2005,11,29,0,0,0).beginning_of_week.should == date_or_time(2005,11,28,0,0,0)
276
+ date_or_time(2005,11,30,0,0,0).beginning_of_week.should == date_or_time(2005,11,28,0,0,0)
277
+ date_or_time(2005,12,01,0,0,0).beginning_of_week.should == date_or_time(2005,11,28,0,0,0)
278
+ date_or_time(2005,12,02,0,0,0).beginning_of_week.should == date_or_time(2005,11,28,0,0,0)
279
+ date_or_time(2005,12,03,0,0,0).beginning_of_week.should == date_or_time(2005,11,28,0,0,0)
280
+ date_or_time(2005,12,04,0,0,0).beginning_of_week.should == date_or_time(2005,11,28,0,0,0)
281
+ end
282
+ end
283
+
284
+ describe "end_of_week" do
285
+ it "should be calculated correctly" do
286
+ date_or_time(2007,12,31,10,10,10).end_of_week.should == date_or_time(2008,1,6,23,59,59,Rational(999999999, 1000))
287
+ date_or_time(2007,8,27,0,0,0).end_of_week.should == date_or_time(2007,9,2,23,59,59,Rational(999999999, 1000))
288
+ date_or_time(2007,8,28,0,0,0).end_of_week.should == date_or_time(2007,9,2,23,59,59,Rational(999999999, 1000))
289
+ date_or_time(2007,8,29,0,0,0).end_of_week.should == date_or_time(2007,9,2,23,59,59,Rational(999999999, 1000))
290
+ date_or_time(2007,8,30,0,0,0).end_of_week.should == date_or_time(2007,9,2,23,59,59,Rational(999999999, 1000))
291
+ date_or_time(2007,8,31,0,0,0).end_of_week.should == date_or_time(2007,9,2,23,59,59,Rational(999999999, 1000))
292
+ date_or_time(2007,9,01,0,0,0).end_of_week.should == date_or_time(2007,9,2,23,59,59,Rational(999999999, 1000))
293
+ date_or_time(2007,9,02,0,0,0).end_of_week.should == date_or_time(2007,9,2,23,59,59,Rational(999999999, 1000))
294
+ end
295
+ end
296
+
297
+ describe "end_of_month" do
298
+ it "should be calculated correctly" do
299
+ date_or_time(2005,3,20,10,10,10).end_of_month.should == date_or_time(2005,3,31,23,59,59,Rational(999999999, 1000))
300
+ date_or_time(2005,2,20,10,10,10).end_of_month.should == date_or_time(2005,2,28,23,59,59,Rational(999999999, 1000))
301
+ date_or_time(2005,4,20,10,10,10).end_of_month.should == date_or_time(2005,4,30,23,59,59,Rational(999999999, 1000))
302
+ end
303
+ end
304
+
305
+ describe "end_of_year" do
306
+ it "should be calculated correctly" do
307
+ date_or_time(2007,2,22,10,10,10).end_of_year.should == date_or_time(2007,12,31,23,59,59,Rational(999999999, 1000))
308
+ date_or_time(2007,12,31,10,10,10).end_of_year.should == date_or_time(2007,12,31,23,59,59,Rational(999999999, 1000))
309
+ end
310
+ end
311
+
312
+ describe "weekdays" do
313
+ it "should return monday with default beginning of week" do
314
+ begin
315
+ old_bw = Date.beginning_of_week
316
+ Date.beginning_of_week = :saturday
317
+
318
+ date_or_time(2012,9,18,0,0,0).monday.should == date_or_time(2012,9,17,0,0,0)
319
+ ensure
320
+ Date.beginning_of_week = old_bw
321
+ end
322
+ end
323
+
324
+ it "should return sunday with default beginning of week" do
325
+ begin
326
+ old_bw = Date.beginning_of_week
327
+ Date.beginning_of_week = :wednesday
328
+
329
+ date_or_time(2012,9,19,0,0,0).sunday.should == date_or_time(2012,9,23,23,59,59, Rational(999999999, 1000))
330
+ ensure
331
+ Date.beginning_of_week = old_bw
332
+ end
333
+ end
334
+ end
335
+ end
336
+ end
@@ -0,0 +1,130 @@
1
+ describe "enumerable" do
2
+ describe "collect_with_index" do
3
+ describe "on Array" do
4
+ it "should return an empty array on an empty array" do
5
+ [].collect_with_index { |x, i| x }.should == []
6
+ end
7
+
8
+ it "should yield an index for each element" do
9
+ [1, 2, 3].collect_with_index { |x, i| [i, x] }.should == [[0, 1], [1, 2], [2, 3]]
10
+ end
11
+
12
+ it "should apply the block to each element" do
13
+ [1, 2, 3].collect_with_index { |x, i| x * i }.should == [0, 2, 6]
14
+ end
15
+ end
16
+
17
+ describe "on Hash" do
18
+ it "should return an empty array on an empty hash" do
19
+ {}.collect_with_index { |x, i| x }.should == []
20
+ end
21
+
22
+ it "should apply the block to each element" do
23
+ result = {:foo => 1, :bar => 2, :baz => 3}.collect_with_index { |p, i| [p.first, p.last, i] }
24
+ result.should == [[:foo, 1, 0], [:bar, 2, 1], [:baz, 3, 2]]
25
+ end
26
+ end
27
+ end
28
+
29
+ describe "sum" do
30
+ it "should return the sum of an integer array" do
31
+ [5, 15, 10].sum.should == 30
32
+ end
33
+
34
+ it "should concatenate strings in a string array" do
35
+ ['foo', 'bar'].sum.should == "foobar"
36
+ end
37
+
38
+ it "should concatenate arrays" do
39
+ [[1, 2], [3, 1, 5]].sum.should == [1, 2, 3, 1, 5]
40
+ end
41
+
42
+ it "should yield a block to each element before summing if given" do
43
+ [1, 2, 3].sum { |p| p * 2 }.should == 12
44
+ end
45
+
46
+ it "should allow a custom result for an empty list" do
47
+ [].sum("empty") { |i| i.amount }.should == "empty"
48
+ end
49
+ end
50
+
51
+ describe "index_by" do
52
+ class Person < Struct.new(:first_name, :last_name)
53
+ end
54
+
55
+ before do
56
+ @peter = Person.new('Peter', 'Griffin')
57
+ @homer = Person.new('Homer', 'Simpson')
58
+ end
59
+
60
+ it "should create hash with keys given by block result" do
61
+ [@peter, @homer].index_by { |x| x.first_name }.should == { 'Peter' => @peter, 'Homer' => @homer }
62
+ end
63
+
64
+ it "should create enumerator if no block is given" do
65
+ [@peter, @homer].index_by.should.is_a Enumerator
66
+ end
67
+ end
68
+
69
+ describe "many?" do
70
+ it "should return false for an empty enumerable" do
71
+ [].many?.should == false
72
+ {}.many?.should == false
73
+ end
74
+
75
+ it "should return false for an enumerable with only one element" do
76
+ [1].many?.should == false
77
+ {:foo => :bar}.many?.should == false
78
+ end
79
+
80
+ it "should return true for an enumerable with more than one element" do
81
+ [1, 2].many?.should == true
82
+ [1, 2, 3].many?.should == true
83
+ {:foo => :bar, :baz => :bingo}.many?.should == true
84
+ {:a => :b, :c => :d, :e => :f}.many?.should == true
85
+ end
86
+
87
+ it "should return false if there are less than two elements satisfying the block if given" do
88
+ [1].many? { |x| x * 10 > 100 }.should == false
89
+ [1, 2, 3, 4, 5].many? { |x| x >= 5 }.should == false
90
+ end
91
+
92
+ it "should return true if there is more than one element satisfying the block if given" do
93
+ [1, 2, 3, 4, 5].many? { |x| x < 4 }.should == true
94
+ end
95
+ end
96
+
97
+ describe "exclude?" do
98
+ it "should return true if the element is not in the array" do
99
+ [1, 2, 3].exclude?(4).should == true
100
+ end
101
+
102
+ it "should return false if the element is in the array" do
103
+ [1, 2, 3].exclude?(2).should == false
104
+ end
105
+
106
+ it "should always return true for an empty array" do
107
+ [].exclude?(rand).should == true
108
+ end
109
+ end
110
+ end
111
+
112
+ describe "Range" do
113
+ describe "sum" do
114
+ it "should return the sum of integers in an inclusive range" do
115
+ (3..5).sum.should == 12
116
+ end
117
+
118
+ it "should return the sum of integers in an exclusive range" do
119
+ (3...5).sum.should == 7
120
+ end
121
+
122
+ it "should return zero for an empty range" do
123
+ (1...1).sum.should == 0
124
+ end
125
+
126
+ it "should return custom identity for an empty range if given" do
127
+ (1...1).sum("empty").should == "empty"
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,19 @@
1
+ describe "hash" do
2
+ before do
3
+ @hash = { :a => 1, :b => [ { :c => 2, :d => 3 }, :b ], :d => { :f => 4 } }
4
+ end
5
+
6
+ describe "deep_delete_if" do
7
+ it "should delete a top level key recursively" do
8
+ @hash.deep_delete_if { |k,v| k == :a }.should == { :b => [ { :c => 2, :d => 3 }, :b ], :d => { :f => 4 } }
9
+ end
10
+
11
+ it "should delete a key within an array recursively" do
12
+ @hash.deep_delete_if { |k,v| v == 2 }.should == { :a => 1, :b => [ { :d => 3 }, :b ], :d => { :f => 4 } }
13
+ end
14
+
15
+ it "should delete a key within a hash recursively" do
16
+ @hash.deep_delete_if { |k,v| v == 4 }.should == { :a => 1, :b => [ { :c => 2, :d => 3 }, :b ], :d => {} }
17
+ end
18
+ end
19
+ end