by_star 2.0.0.beta1 → 2.1.0.beta2

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 (37) hide show
  1. data/.travis.yml +2 -0
  2. data/Gemfile.lock +42 -42
  3. data/README.markdown +78 -14
  4. data/by_star.gemspec +3 -2
  5. data/lib/by_star.rb +12 -4
  6. data/lib/by_star/by_day.rb +4 -0
  7. data/lib/by_star/by_fortnight.rb +4 -0
  8. data/lib/by_star/by_month.rb +24 -12
  9. data/lib/by_star/by_quarter.rb +32 -0
  10. data/lib/by_star/by_week.rb +5 -3
  11. data/lib/by_star/by_weekend.rb +3 -0
  12. data/lib/by_star/by_year.rb +5 -3
  13. data/lib/by_star/version.rb +1 -1
  14. data/lib/mongoid/by_star.rb +83 -0
  15. data/spec/by_star/active_record/active_record_spec.rb +50 -0
  16. data/spec/by_star/mongoid/mongoid_spec.rb +44 -0
  17. data/spec/by_star/shared/by_day.rb +62 -0
  18. data/spec/by_star/shared/by_direction.rb +85 -0
  19. data/spec/by_star/shared/by_fortnight.rb +47 -0
  20. data/spec/by_star/shared/by_month.rb +109 -0
  21. data/spec/by_star/shared/by_quarter.rb +33 -0
  22. data/spec/by_star/shared/by_week.rb +41 -0
  23. data/spec/by_star/shared/by_weekend.rb +13 -0
  24. data/spec/by_star/shared/by_year.rb +54 -0
  25. data/spec/fixtures/active_record/models.rb +13 -0
  26. data/spec/fixtures/{schema.rb → active_record/schema.rb} +0 -0
  27. data/spec/fixtures/mongoid/models.rb +65 -0
  28. data/spec/fixtures/{models.rb → shared/seeds.rb} +0 -16
  29. data/spec/spec_helper.rb +4 -11
  30. metadata +95 -31
  31. data/spec/by_star/by_day_spec.rb +0 -52
  32. data/spec/by_star/by_direction_spec.rb +0 -82
  33. data/spec/by_star/by_fortnight_spec.rb +0 -46
  34. data/spec/by_star/by_month_spec.rb +0 -60
  35. data/spec/by_star/by_week_spec.rb +0 -39
  36. data/spec/by_star/by_weekend_spec.rb +0 -12
  37. data/spec/by_star/by_year_spec.rb +0 -57
@@ -21,3 +21,5 @@ rvm:
21
21
  - 1.8.7
22
22
  - 1.9.3
23
23
  - 1.9.2
24
+
25
+ services: mongodb
@@ -1,85 +1,85 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- by_star (2.0.0.beta)
5
- activerecord (>= 2.0.0)
4
+ by_star (2.0.0.beta1)
5
+ activerecord (~> 3.0)
6
6
  chronic
7
7
 
8
8
  GEM
9
9
  remote: http://rubygems.org/
10
10
  specs:
11
- actionpack (3.2.1)
12
- activemodel (= 3.2.1)
13
- activesupport (= 3.2.1)
11
+ actionpack (3.2.8)
12
+ activemodel (= 3.2.8)
13
+ activesupport (= 3.2.8)
14
14
  builder (~> 3.0.0)
15
15
  erubis (~> 2.7.0)
16
- journey (~> 1.0.1)
16
+ journey (~> 1.0.4)
17
17
  rack (~> 1.4.0)
18
- rack-cache (~> 1.1)
18
+ rack-cache (~> 1.2)
19
19
  rack-test (~> 0.6.1)
20
- sprockets (~> 2.1.2)
21
- activemodel (3.2.1)
22
- activesupport (= 3.2.1)
20
+ sprockets (~> 2.1.3)
21
+ activemodel (3.2.8)
22
+ activesupport (= 3.2.8)
23
23
  builder (~> 3.0.0)
24
- activerecord (3.2.1)
25
- activemodel (= 3.2.1)
26
- activesupport (= 3.2.1)
27
- arel (~> 3.0.0)
24
+ activerecord (3.2.8)
25
+ activemodel (= 3.2.8)
26
+ activesupport (= 3.2.8)
27
+ arel (~> 3.0.2)
28
28
  tzinfo (~> 0.3.29)
29
- activesupport (3.2.1)
29
+ activesupport (3.2.8)
30
30
  i18n (~> 0.6)
31
31
  multi_json (~> 1.0)
32
- arel (3.0.0)
32
+ arel (3.0.2)
33
33
  builder (3.0.0)
34
- chronic (0.6.7)
34
+ chronic (0.7.0)
35
35
  diff-lcs (1.1.3)
36
36
  erubis (2.7.0)
37
37
  hike (1.2.1)
38
- i18n (0.6.0)
39
- journey (1.0.1)
40
- json (1.6.5)
41
- multi_json (1.0.4)
38
+ i18n (0.6.1)
39
+ journey (1.0.4)
40
+ json (1.7.5)
41
+ multi_json (1.3.6)
42
42
  mysql2 (0.3.11)
43
- pg (0.13.1)
43
+ pg (0.14.0)
44
44
  rack (1.4.1)
45
- rack-cache (1.1)
45
+ rack-cache (1.2)
46
46
  rack (>= 0.4)
47
47
  rack-ssl (1.3.2)
48
48
  rack
49
49
  rack-test (0.6.1)
50
50
  rack (>= 1.0)
51
- railties (3.2.1)
52
- actionpack (= 3.2.1)
53
- activesupport (= 3.2.1)
51
+ railties (3.2.8)
52
+ actionpack (= 3.2.8)
53
+ activesupport (= 3.2.8)
54
54
  rack-ssl (~> 1.3.2)
55
55
  rake (>= 0.8.7)
56
56
  rdoc (~> 3.4)
57
- thor (~> 0.14.6)
57
+ thor (>= 0.14.6, < 2.0)
58
58
  rake (0.9.2.2)
59
59
  rdoc (3.12)
60
60
  json (~> 1.4)
61
- rspec (2.8.0)
62
- rspec-core (~> 2.8.0)
63
- rspec-expectations (~> 2.8.0)
64
- rspec-mocks (~> 2.8.0)
65
- rspec-core (2.8.0)
66
- rspec-expectations (2.8.0)
67
- diff-lcs (~> 1.1.2)
68
- rspec-mocks (2.8.0)
69
- rspec-rails (2.8.1)
61
+ rspec (2.11.0)
62
+ rspec-core (~> 2.11.0)
63
+ rspec-expectations (~> 2.11.0)
64
+ rspec-mocks (~> 2.11.0)
65
+ rspec-core (2.11.1)
66
+ rspec-expectations (2.11.2)
67
+ diff-lcs (~> 1.1.3)
68
+ rspec-mocks (2.11.2)
69
+ rspec-rails (2.11.0)
70
70
  actionpack (>= 3.0)
71
71
  activesupport (>= 3.0)
72
72
  railties (>= 3.0)
73
- rspec (~> 2.8.0)
74
- sprockets (2.1.2)
73
+ rspec (~> 2.11.0)
74
+ sprockets (2.1.3)
75
75
  hike (~> 1.2)
76
76
  rack (~> 1.0)
77
77
  tilt (~> 1.1, != 1.3.0)
78
- sqlite3 (1.3.5)
79
- thor (0.14.6)
78
+ sqlite3 (1.3.6)
79
+ thor (0.16.0)
80
80
  tilt (1.3.3)
81
- timecop (0.3.5)
82
- tzinfo (0.3.31)
81
+ timecop (0.4.5)
82
+ tzinfo (0.3.33)
83
83
 
84
84
  PLATFORMS
85
85
  ruby
@@ -1,7 +1,31 @@
1
1
  # by_*
2
2
 
3
3
 
4
- by_* (by_star) is a plugin that allows you to find ActiveRecord objects given certain date objects. This was originally crafted for only finding objects within a given month, but now has extended out to much more. It now supports finding objects for:
4
+ by_* (by_star) is a plugin that allows you to find ActiveRecord and/or Mongoid objects given certain date objects.
5
+
6
+ ## Installation
7
+
8
+ Install this gem by adding this to your Gemfile:
9
+
10
+ ```ruby
11
+ gem 'by_star', :git => "git://github.com/radar/by_star"
12
+ ```
13
+
14
+ Then run `bundle install`.
15
+
16
+ If you are using ActiveRecord, you're done!
17
+
18
+ Mongoid users, please include the Mongoid::ByStar module for each model you wish to use the functionality. This is the convention among Mongoid plugins.
19
+
20
+ ```ruby
21
+ class MyModel
22
+ include Mongoid::Document
23
+ include Mongoid::ByStar
24
+ ```
25
+
26
+ ## What it does
27
+
28
+ This was originally crafted for only finding objects within a given month, but now has extended out to much more. It now supports finding objects for:
5
29
 
6
30
  * A given year
7
31
  * A given month
@@ -9,6 +33,8 @@ by_* (by_star) is a plugin that allows you to find ActiveRecord objects given ce
9
33
  * A given week
10
34
  * A given weekend
11
35
  * A given day
36
+ * A given quarter
37
+ * The weeks of a given month as shown on a calendar
12
38
  * The current weekend
13
39
  * The current work week
14
40
  * The Past
@@ -93,6 +119,14 @@ If you have a Time object you can use it to find the posts:
93
119
 
94
120
  This will find all the posts in November 2012.
95
121
 
122
+ ## By Calendar Month (`by_calendar_month`)
123
+
124
+ Finds records for a given month as shown on a calendar. Includes all the results of `by_month`, plus any results which fall in the same week as the first and last of the month. Useful for working with UI calendars which show rows of weeks.
125
+
126
+ Post.by_calendar_month
127
+
128
+ Parameter behavior is otherwise the same as `by_month`
129
+
96
130
  ## By Fortnight (`by_fortnight`)
97
131
 
98
132
  Fortnight numbering starts at 0. The beginning of a fortnight is Monday, 12am.
@@ -127,11 +161,11 @@ To find records based on a week, you can pass in a number (representing the week
127
161
 
128
162
  Post.by_week(36)
129
163
 
130
- This will return all posts in the 36th week of the current year.
164
+ This will return all posts in the 37th week of the current year (remember week numbering starts at 0).
131
165
 
132
166
  Post.by_week(36, :year => 2012)
133
167
 
134
- This will return all posts in the 36th week of 2012.
168
+ This will return all posts in the 37th week of 2012.
135
169
 
136
170
  Post.by_week(Time.local(2012,1,1))
137
171
 
@@ -160,6 +194,28 @@ You can also pass a string:
160
194
 
161
195
  This will return all posts for the given day.
162
196
 
197
+ ## By Quarter (`by_quarter`)
198
+
199
+ Finds records by 3-month quarterly period of year. Quarter numbering starts at 1. The four quarters of the year begin on Jan 1, Apr 1, Jul 1, and Oct 1 respectively.
200
+
201
+ To find records from the current quarter:
202
+
203
+ Post.by_quarter
204
+
205
+ To find records based on a quarter, you can pass in a number (representing the quarter number) or a time object:
206
+
207
+ Post.by_quarter(4)
208
+
209
+ This will return all posts in the 4th quarter of the current year.
210
+
211
+ Post.by_quarter(2, :year => 2012)
212
+
213
+ This will return all posts in the 2nd quarter of 2012.
214
+
215
+ Post.by_week(Time.local(2012,1,1))
216
+
217
+ This will return all posts from the first quarter of 2012.
218
+
163
219
  ## Tomorrow (`tomorrow`)
164
220
 
165
221
  *This method has been shown to be shifty when passed a `Date` object, it is recommended that you pass it an `ActiveSupport::TimeWithZone` object instead.*
@@ -194,37 +250,37 @@ You can also pass a string:
194
250
 
195
251
  Post.yesterday("next tuesday")
196
252
 
197
- ## Past (`past`)
253
+ ## Before (`before`)
198
254
 
199
255
  To find all posts before the current time:
200
256
 
201
- Post.past
257
+ Post.before
202
258
 
203
259
  To find all posts before certain time or date:
204
260
 
205
- Post.past(Date.today + 2)
206
- Post.past(Time.now + 5.days)
261
+ Post.before(Date.today + 2)
262
+ Post.before(Time.now + 5.days)
207
263
 
208
264
  You can also pass a string:
209
265
 
210
- Post.past("next tuesday")
266
+ Post.before("next tuesday")
211
267
 
212
- ## Future (`future`)
268
+ ## After (`after`)
213
269
 
214
270
  To find all posts after the current time:
215
271
 
216
- Post.future
272
+ Post.after
217
273
 
218
274
  To find all posts after certain time or date:
219
275
 
220
- Post.future(Date.today + 2)
221
- Post.future(Time.now + 5.days)
276
+ Post.after(Date.today + 2)
277
+ Post.after(Time.now + 5.days)
222
278
 
223
279
  You can also pass a string:
224
280
 
225
- Post.future("next tuesday")
281
+ Post.after("next tuesday")
226
282
 
227
- ## Between (`between`)
283
+ ## Between (`between` or `between_times`)
228
284
 
229
285
  To find records between two times:
230
286
 
@@ -234,6 +290,10 @@ Also works with dates:
234
290
 
235
291
  Post.between(date1, date2)
236
292
 
293
+ `between_times` is an alias for `between`:
294
+
295
+ Post.between_times(time1, time2) #=> results identical to above
296
+
237
297
  ## Previous (`previous`)
238
298
 
239
299
  To find the record prior to this one call `previous` on any model instance:
@@ -268,6 +328,10 @@ Or if you're doing it all the time on your model, then it's best to use `by_star
268
328
  by_star_field :something_else
269
329
  end
270
330
 
331
+ ## Mongoid
332
+
333
+ Mongoid is only tested/supported on version 3.0+
334
+
271
335
  ## Collaborators
272
336
 
273
337
  Thanks to Thomas Sinclair for the original bump for implementing it. I would like to thank #rubyonrails for their support and the following people:
@@ -7,7 +7,7 @@ Gem::Specification.new do |s|
7
7
  s.platform = Gem::Platform::RUBY
8
8
  s.authors = ["Ryan Bigg"]
9
9
  s.email = ["radarlistener@gmail.com"]
10
- s.homepage = "http://rubygems.org/gems/by_star"
10
+ s.homepage = "http://github.com/radar/by_star"
11
11
  s.summary = "ActiveRecord extension for easier date scopes and time ranges"
12
12
  s.description = "ActiveRecord extension for easier date scopes and time ranges"
13
13
 
@@ -20,8 +20,9 @@ Gem::Specification.new do |s|
20
20
  s.add_development_dependency "mysql2"
21
21
  s.add_development_dependency "rspec-rails", "~> 2.8"
22
22
  s.add_development_dependency "timecop", "~> 0.3"
23
+ s.add_development_dependency "mongoid", "~> 3.0" if Gem::Version.create(RUBY_VERSION.dup) >= Gem::Version.create('1.9.3')
23
24
 
24
- s.add_dependency "activerecord", ">= 2.0.0"
25
+ s.add_dependency "activerecord", "~> 3.0"
25
26
  s.add_dependency "chronic"
26
27
 
27
28
  s.files = `git ls-files`.split("\n")
@@ -10,12 +10,13 @@ require 'by_star/by_fortnight'
10
10
  require 'by_star/by_week'
11
11
  require 'by_star/by_weekend'
12
12
  require 'by_star/by_day'
13
+ require 'by_star/by_quarter'
13
14
 
14
15
  module ByStar
15
16
 
16
17
  def by_star_field(field=nil)
17
18
  @by_star_field ||= field
18
- @by_star_field || "created_at"
19
+ @by_star_field || "#{self.table_name}.created_at"
19
20
  end
20
21
 
21
22
  include ByDirection
@@ -25,6 +26,7 @@ module ByStar
25
26
  include ByWeek
26
27
  include ByWeekend
27
28
  include ByDay
29
+ include ByQuarter
28
30
 
29
31
  class ParseError < StandardError
30
32
 
@@ -40,6 +42,7 @@ module ByStar
40
42
  scope = scope.order(options[:order]) if options[:order]
41
43
  scope
42
44
  end
45
+ alias_method :between_times, :between
43
46
 
44
47
  private
45
48
 
@@ -57,7 +60,12 @@ module ByStar
57
60
 
58
61
  end
59
62
 
60
- ActiveRecord::Base.send :extend, ByStar
61
- ActiveRecord::Relation.send :extend, ByStar
63
+ if defined?(ActiveRecord)
64
+ ActiveRecord::Base.send :extend, ByStar
65
+ ActiveRecord::Relation.send :extend, ByStar
66
+ ActiveRecord::Base.send :include, ByStar::InstanceMethods
67
+ end
62
68
 
63
- ActiveRecord::Base.send :include, ByStar::InstanceMethods
69
+ if defined?(Mongoid)
70
+ require 'mongoid/by_star'
71
+ end
@@ -25,6 +25,10 @@ module ByStar
25
25
  def by_day_Time(time, options)
26
26
  between(time.beginning_of_day, time.end_of_day, options)
27
27
  end
28
+ alias_method :by_day_Date, :by_day_Time
28
29
 
30
+ def by_day_String(string, options)
31
+ by_day_Time(Time.parse(string), options)
32
+ end
29
33
  end
30
34
  end
@@ -23,6 +23,10 @@ module ByStar
23
23
  between(start_time, (start_time + 2.weeks).end_of_day, options)
24
24
  end
25
25
 
26
+ def by_fortnight_Date(date, options={})
27
+ by_fortnight_Time(date.to_time, options)
28
+ end
29
+
26
30
  def by_fortnight_String_or_Fixnum(weeks, options={})
27
31
  weeks = weeks.to_i
28
32
  current_time = Time.zone.local(options[:year] || Time.zone.now.year)
@@ -6,30 +6,42 @@ module ByStar
6
6
  def by_month(*args)
7
7
  options = args.extract_options!
8
8
  time = args.first || Time.zone.now
9
- send("by_month_#{time_klass(time)}", time, options)
9
+ send("by_month_#{time_klass(time)}", time, false, options)
10
+ end
11
+
12
+ def by_calendar_month(*args)
13
+ options = args.extract_options!
14
+ time = args.first || Time.zone.now
15
+ send("by_month_#{time_klass(time)}", time, true, options)
10
16
  end
11
17
 
12
18
  private
13
19
 
14
- def by_month_Time(time, options={})
15
- between(time.beginning_of_month, time.end_of_month, options)
20
+ def by_month_Time(time, is_calendar=false, options={})
21
+ if is_calendar
22
+ between(time.beginning_of_month.beginning_of_week, time.end_of_month.end_of_week, options)
23
+ else
24
+ between(time.beginning_of_month, time.end_of_month, options)
25
+ end
26
+ end
27
+
28
+ def by_month_Date(date, is_calendar=false, options={})
29
+ by_month_Time(date.to_time, is_calendar, options)
16
30
  end
17
31
 
18
- def by_month_String_or_Fixnum(month, options={})
19
- if valid_month?(month)
32
+ def by_month_String_or_Fixnum(month, is_calendar=false, options={})
33
+ begin
20
34
  year = options[:year] || Time.zone.now.year
21
- by_month_Time("#{year}-#{month}-01".to_time, options)
22
- else
35
+ date = Date.parse("#{year}-#{month}-01").to_time
36
+ by_month_Time(date, is_calendar, options)
37
+
38
+ rescue
23
39
  raise ParseError, "Month must be a number between 1 and 12 or the full month name (e.g. 'January', 'Feburary', etc.)"
24
40
  end
25
41
  end
42
+
26
43
  alias_method :by_month_String, :by_month_String_or_Fixnum
27
44
  alias_method :by_month_Fixnum, :by_month_String_or_Fixnum
28
45
 
29
-
30
- def valid_month?(month)
31
- (1..12).include?(month) || Date::MONTHNAMES.include?(month)
32
- end
33
-
34
46
  end
35
47
  end
@@ -0,0 +1,32 @@
1
+ module ByStar
2
+ module ByQuarter
3
+ # For reasoning why I use *args rather than variables here,
4
+ # please see the by_year method comments in lib/by_star/by_year.rb
5
+
6
+ def by_quarter(*args)
7
+ options = args.extract_options!.symbolize_keys!
8
+ time = args.first
9
+ time ||= Time.zone.local(options[:year], 1, 1) if options[:year]
10
+ time ||= Time.zone.now
11
+ send("by_quarter_#{time_klass(time)}", time, options)
12
+ end
13
+
14
+ private
15
+
16
+ def by_quarter_Time(time, options={})
17
+ between(time.beginning_of_quarter, time.end_of_quarter, options)
18
+ end
19
+
20
+ def by_quarter_Date(date, options={})
21
+ by_quarter_Time(date.to_time, options)
22
+ end
23
+
24
+ def by_quarter_Fixnum(quarter, options={})
25
+ raise 'Quarter must be a number between 1 and 4' unless quarter >= 1 && quarter <= 4
26
+ time = Time.zone.local(options[:year], 1, 1) if options[:year]
27
+ time ||= Time.zone.now
28
+ start_time = time.beginning_of_year + ((quarter.to_i - 1) * 3).months
29
+ between(start_time, start_time.end_of_quarter, options)
30
+ end
31
+ end
32
+ end