Commit 91e563ff5077814bbe816eff4ddd6ea6f0b20322

Authored by Andrew Kane
1 parent 46e7a697

Protect methods

Showing 1 changed file with 65 additions and 63 deletions   Show diff stats
lib/groupdate/magic.rb
... ... @@ -15,39 +15,10 @@ module Groupdate
15 15 end
16 16 end
17 17  
18   - def time_zone
19   - @time_zone ||= begin
20   - time_zone = options[:time_zone] || Groupdate.time_zone || Time.zone || "Etc/UTC"
21   - time_zone.is_a?(ActiveSupport::TimeZone) ? time_zone : ActiveSupport::TimeZone[time_zone]
22   - end
23   - end
24   -
25   - def week_start
26   - @week_start ||= [:mon, :tue, :wed, :thu, :fri, :sat, :sun].index((options[:week_start] || options[:start] || Groupdate.week_start).to_sym)
27   - end
28   -
29   - def day_start
30   - @day_start ||= (options[:day_start] || Groupdate.day_start).to_i
31   - end
32   -
33 18 def group_by(enum, &block)
34 19 series(enum.group_by{|v| round_time(block.call(v)) }, [])
35 20 end
36 21  
37   - def time_range
38   - @time_range ||= begin
39   - time_range = options[:range]
40   - if !time_range and options[:last]
41   - step = 1.send(field) if 1.respond_to?(field)
42   - if step
43   - now = Time.now
44   - time_range = round_time(now - (options[:last].to_i - 1).send(field))..now
45   - end
46   - end
47   - time_range
48   - end
49   - end
50   -
51 22 def relation(column, relation)
52 23 column = relation.connection.quote_table_name(column)
53 24 time_zone = self.time_zone.tzinfo.name
... ... @@ -117,6 +88,71 @@ module Groupdate
117 88 end
118 89 end
119 90  
  91 + def perform(relation, method, *args, &block)
  92 + # undo reverse since we do not want this to appear in the query
  93 + reverse = relation.reverse_order_value
  94 + if reverse
  95 + relation = relation.reverse_order
  96 + end
  97 + order = relation.order_values.first
  98 + if order.is_a?(String)
  99 + parts = order.split(" ")
  100 + reverse_order = (parts.size == 2 && parts[0].to_sym == field && parts[1].to_s.downcase == "desc")
  101 + reverse = !reverse if reverse_order
  102 + end
  103 +
  104 + multiple_groups = relation.group_values.size > 1
  105 +
  106 + cast_method =
  107 + case field
  108 + when :day_of_week, :hour_of_day
  109 + lambda{|k| k.to_i }
  110 + else
  111 + utc = ActiveSupport::TimeZone["UTC"]
  112 + lambda{|k| (k.is_a?(String) ? utc.parse(k) : k.to_time).in_time_zone(time_zone) }
  113 + end
  114 +
  115 + count =
  116 + begin
  117 + Hash[ relation.send(method, *args, &block).map{|k, v| [multiple_groups ? k[0...@group_index] + [cast_method.call(k[@group_index])] + k[(@group_index + 1)..-1] : cast_method.call(k), v] } ]
  118 + rescue NoMethodError
  119 + raise "Be sure to install time zone support - https://github.com/ankane/groupdate#for-mysql"
  120 + end
  121 +
  122 + series(count, 0, multiple_groups, reverse)
  123 + end
  124 +
  125 + protected
  126 +
  127 + def time_zone
  128 + @time_zone ||= begin
  129 + time_zone = options[:time_zone] || Groupdate.time_zone || Time.zone || "Etc/UTC"
  130 + time_zone.is_a?(ActiveSupport::TimeZone) ? time_zone : ActiveSupport::TimeZone[time_zone]
  131 + end
  132 + end
  133 +
  134 + def week_start
  135 + @week_start ||= [:mon, :tue, :wed, :thu, :fri, :sat, :sun].index((options[:week_start] || options[:start] || Groupdate.week_start).to_sym)
  136 + end
  137 +
  138 + def day_start
  139 + @day_start ||= (options[:day_start] || Groupdate.day_start).to_i
  140 + end
  141 +
  142 + def time_range
  143 + @time_range ||= begin
  144 + time_range = options[:range]
  145 + if !time_range and options[:last]
  146 + step = 1.send(field) if 1.respond_to?(field)
  147 + if step
  148 + now = Time.now
  149 + time_range = round_time(now - (options[:last].to_i - 1).send(field))..now
  150 + end
  151 + end
  152 + time_range
  153 + end
  154 + end
  155 +
120 156 def series(count, default_value, multiple_groups = false, reverse = false)
121 157 series =
122 158 case field
... ... @@ -193,40 +229,6 @@ module Groupdate
193 229 end]
194 230 end
195 231  
196   - def perform(relation, method, *args, &block)
197   - # undo reverse since we do not want this to appear in the query
198   - reverse = relation.reverse_order_value
199   - if reverse
200   - relation = relation.reverse_order
201   - end
202   - order = relation.order_values.first
203   - if order.is_a?(String)
204   - parts = order.split(" ")
205   - reverse_order = (parts.size == 2 && parts[0].to_sym == field && parts[1].to_s.downcase == "desc")
206   - reverse = !reverse if reverse_order
207   - end
208   -
209   - multiple_groups = relation.group_values.size > 1
210   -
211   - cast_method =
212   - case field
213   - when :day_of_week, :hour_of_day
214   - lambda{|k| k.to_i }
215   - else
216   - utc = ActiveSupport::TimeZone["UTC"]
217   - lambda{|k| (k.is_a?(String) ? utc.parse(k) : k.to_time).in_time_zone(time_zone) }
218   - end
219   -
220   - count =
221   - begin
222   - Hash[ relation.send(method, *args, &block).map{|k, v| [multiple_groups ? k[0...@group_index] + [cast_method.call(k[@group_index])] + k[(@group_index + 1)..-1] : cast_method.call(k), v] } ]
223   - rescue NoMethodError
224   - raise "Be sure to install time zone support - https://github.com/ankane/groupdate#for-mysql"
225   - end
226   -
227   - series(count, 0, multiple_groups, reverse)
228   - end
229   -
230 232 def round_time(time)
231 233 time = time.to_time.in_time_zone(time_zone) - day_start.hours
232 234  
... ...