groupdate 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: !binary |-
4
- MGY4OTc0MzM2NTNlMjVlOWM1ZjhlNzczN2FjZmNjZjkyZDI4M2Y5Yg==
5
- data.tar.gz: !binary |-
6
- OGE0ZDVhNmNjNDNjYWI4ZmFlNGY4MTYzNTc5M2VjNDRlMWI4MjUwYQ==
3
+ metadata.gz: aca7ed94e70ba77cb94f64a51398c1c7a8b3a888
4
+ data.tar.gz: f8601b3f0fc5c9ee1a0886ecd717b02901c215ef
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- NmI0MDM0MzEyOWFjMjYyNjk4N2VhNTE4Y2M5MzRlMzM5NTYyODc4OTA5M2Zh
10
- ZTRkM2RiYjY0ODZkM2IyOGQxMzU4NTA4MTNiOGNjNWRlMjUyZWQ2MDNhYWQw
11
- ZDlkOGVkYjZiOGE4MTE5MDBiYzUxZmQxYjQ3NjBiYmNjYWJkZjQ=
12
- data.tar.gz: !binary |-
13
- OWVmMTM2YmU1Y2IyY2ZmOGY5MWEzOTAxYjQ5NGIwNTVkOWM1Y2Q4NDZiOGVi
14
- ODQ5MWZkZGM5ZDkzODU2ODlmZDk2MGU2NGMyOTFkZDRlZDU5ZDM4MmJkM2Q1
15
- NTIyZjE0MzM4NzkzYzVmYWIzNzk0MWI1YjE2NTVlNzY4NWUxNGI=
6
+ metadata.gz: 285ff44107dc4028bf1369203abcf466443a0faf90d36060cdfc688511c87ca33b88a242cd37c6b9ad45f0c5f9702b381ef3a3fed00ce6d5b3e6b5b98934887e
7
+ data.tar.gz: 2a068e99ecdfe6c6feaf1dd1a6134440dcaf17b284fa85488abe57adabc27c2bfd4228c1a5307efe1cca4a0820c8d39c2cc43fd92f895cff6c6637d32fb278e8
data/.travis.yml CHANGED
@@ -1,6 +1,5 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.8.7
4
3
  - 1.9.3
5
4
  - 2.0.0
6
5
  - jruby
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ # 1.0.4
2
+
3
+ - Added global week_start option
4
+ - Fixed bug with NULL values and series
5
+
1
6
  ## 1.0.3
2
7
 
3
8
  - Fixed deprecation warning when used with will_paginate
data/README.md CHANGED
@@ -68,6 +68,9 @@ User.group_by_week(:created_at, :start => :mon) # first three letters of day
68
68
 
69
69
  # must be the last argument
70
70
  User.group_by_week(:created_at, time_zone, :start => :sat)
71
+
72
+ # change globally
73
+ Groupdate.week_start = :mon
71
74
  ```
72
75
 
73
76
  You can also group by the day of the week or hour of the day.
data/lib/groupdate.rb CHANGED
@@ -21,3 +21,8 @@ module ActiveRecord
21
21
 
22
22
  end
23
23
  end
24
+
25
+ module Groupdate
26
+ mattr_accessor :week_start
27
+ self.week_start = :sun
28
+ end
@@ -19,7 +19,7 @@ module Groupdate
19
19
  end
20
20
 
21
21
  # for week
22
- week_start = [:mon, :tue, :wed, :thu, :fri, :sat, :sun].index((options[:start] || :sun).to_sym)
22
+ week_start = [:mon, :tue, :wed, :thu, :fri, :sat, :sun].index((options[:start] || Groupdate.week_start).to_sym)
23
23
  if field == "week" and !week_start
24
24
  raise "Unrecognized :start option"
25
25
  end
@@ -2,9 +2,11 @@ module Groupdate
2
2
  class Series
3
3
 
4
4
  def initialize(relation, field, column, time_zone, time_range, week_start)
5
- @relation = relation
6
5
  if time_range.is_a?(Range)
7
- @relation = relation.where("#{column} BETWEEN ? AND ?", time_range.first, time_range.last)
6
+ # doesn't matter whether we include the end of a ... range - it will be excluded later
7
+ @relation = relation.where("#{column} >= ? AND #{column} <= ?", time_range.first, time_range.last)
8
+ else
9
+ @relation = relation.where("#{column} IS NOT NULL")
8
10
  end
9
11
  @field = field
10
12
  @time_zone = time_zone
@@ -23,9 +25,7 @@ module Groupdate
23
25
  lambda{|k| (k.is_a?(String) ? utc.parse(k) : k.to_time).utc }
24
26
  end
25
27
 
26
- count = Hash[count.map do |k, v|
27
- [cast_method.call(k), v]
28
- end]
28
+ count = Hash[ count.map{|k, v| [cast_method.call(k), v] } ]
29
29
 
30
30
  series =
31
31
  case @field
@@ -1,3 +1,3 @@
1
1
  module Groupdate
2
- VERSION = "1.0.3"
2
+ VERSION = "1.0.4"
3
3
  end
data/test/mysql_test.rb CHANGED
@@ -1,18 +1,15 @@
1
1
  require "test_helper"
2
2
 
3
- class TestMysql < Minitest::Test
3
+ class TestMysql < Minitest::Unit::TestCase
4
4
  include TestGroupdate
5
5
 
6
6
  def setup
7
+ super
7
8
  User.establish_connection :adapter => "mysql2", :database => "groupdate_test", :username => "root"
8
9
  end
9
10
 
10
11
  def time_key(key)
11
- if RUBY_PLATFORM == "java"
12
- key.utc.strftime("%Y-%m-%d %H:%M:%S").gsub(/ 00\:00\:00\z/, "")
13
- else
14
- key
15
- end
12
+ key
16
13
  end
17
14
 
18
15
  def number_key(key)
@@ -1,21 +1,18 @@
1
1
  require "test_helper"
2
2
 
3
- class TestPostgresql < Minitest::Test
3
+ class TestPostgresql < Minitest::Unit::TestCase
4
4
  include TestGroupdate
5
5
 
6
6
  def setup
7
+ super
7
8
  User.establish_connection :adapter => "postgresql", :database => "groupdate_test"
8
9
  end
9
10
 
10
11
  def time_key(key)
11
- if RUBY_PLATFORM == "java"
12
- key.utc.strftime("%Y-%m-%d %H:%M:%S%z")[0..-3]
12
+ if ActiveRecord::VERSION::MAJOR == 3
13
+ key.utc.strftime("%Y-%m-%d %H:%M:%S+00")
13
14
  else
14
- if ActiveRecord::VERSION::MAJOR == 3
15
- key.utc.strftime("%Y-%m-%d %H:%M:%S+00")
16
- else
17
- key
18
- end
15
+ key
19
16
  end
20
17
  end
21
18
 
data/test/test_helper.rb CHANGED
@@ -4,6 +4,11 @@ require "minitest/autorun"
4
4
  require "minitest/pride"
5
5
  require "logger"
6
6
 
7
+ # TODO determine why this is necessary
8
+ if RUBY_PLATFORM == "java"
9
+ ENV["TZ"] = "UTC"
10
+ end
11
+
7
12
  # for debugging
8
13
  # ActiveRecord::Base.logger = Logger.new(STDOUT)
9
14
 
@@ -18,17 +23,19 @@ end
18
23
  %w(postgresql mysql2).each do |adapter|
19
24
  ActiveRecord::Base.establish_connection :adapter => adapter, :database => "groupdate_test", :username => adapter == "mysql2" ? "root" : nil
20
25
 
21
- unless ActiveRecord::Base.connection.table_exists? "users"
22
- ActiveRecord::Migration.create_table :users do |t|
23
- t.string :name
24
- t.integer :score
25
- t.timestamps
26
- end
26
+ ActiveRecord::Migration.create_table :users, :force => true do |t|
27
+ t.string :name
28
+ t.integer :score
29
+ t.timestamps
27
30
  end
28
31
  end
29
32
 
30
33
  module TestGroupdate
31
34
 
35
+ def setup
36
+ Groupdate.week_start = :sun
37
+ end
38
+
32
39
  # second
33
40
 
34
41
  def test_second_end_of_second
@@ -271,7 +278,7 @@ module TestGroupdate
271
278
  7.times do |n|
272
279
  expected[n] = n == 3 ? 1 : 0
273
280
  end
274
- assert_equal(expected, User.group_by_day_of_week(:created_at, Time.zone, true).count(:created_at))
281
+ assert_equal expected, User.group_by_day_of_week(:created_at, Time.zone, true).count(:created_at)
275
282
  end
276
283
 
277
284
  def test_zeros_hour_of_day
@@ -280,7 +287,7 @@ module TestGroupdate
280
287
  24.times do |n|
281
288
  expected[n] = n == 20 ? 1 : 0
282
289
  end
283
- assert_equal(expected, User.group_by_hour_of_day(:created_at, Time.zone, true).count(:created_at))
290
+ assert_equal expected, User.group_by_hour_of_day(:created_at, Time.zone, true).count(:created_at)
284
291
  end
285
292
 
286
293
  def test_zeros_excludes_end
@@ -288,7 +295,7 @@ module TestGroupdate
288
295
  expected = {
289
296
  Time.parse("2013-05-01 00:00:00 UTC") => 0
290
297
  }
291
- assert_equal(expected, User.group_by_day(:created_at, Time.zone, Time.parse("2013-05-01 00:00:00 UTC")...Time.parse("2013-05-02 00:00:00 UTC")).count)
298
+ assert_equal expected, User.group_by_day(:created_at, Time.zone, Time.parse("2013-05-01 00:00:00 UTC")...Time.parse("2013-05-02 00:00:00 UTC")).count
292
299
  end
293
300
 
294
301
  def test_zeros_previous_scope
@@ -296,7 +303,7 @@ module TestGroupdate
296
303
  expected = {
297
304
  Time.parse("2013-05-01 00:00:00 UTC") => 0
298
305
  }
299
- assert_equal(expected, User.where("id = 0").group_by_day(:created_at, Time.zone, Time.parse("2013-05-01 00:00:00 UTC")..Time.parse("2013-05-01 23:59:59 UTC")).count)
306
+ assert_equal expected, User.where("id = 0").group_by_day(:created_at, Time.zone, Time.parse("2013-05-01 00:00:00 UTC")..Time.parse("2013-05-01 23:59:59 UTC")).count
300
307
  end
301
308
 
302
309
  def test_zeros_datetime
@@ -304,30 +311,48 @@ module TestGroupdate
304
311
  expected = {
305
312
  Time.parse("2013-05-01 00:00:00 UTC") => 1
306
313
  }
307
- assert_equal(expected, User.group_by_day(:created_at, Time.zone, DateTime.parse("2013-05-01 00:00:00 UTC")..DateTime.parse("2013-05-01 00:00:00 UTC")).count)
314
+ assert_equal expected, User.group_by_day(:created_at, Time.zone, DateTime.parse("2013-05-01 00:00:00 UTC")..DateTime.parse("2013-05-01 00:00:00 UTC")).count
315
+ end
316
+
317
+ def test_zeros_null_value
318
+ user = User.create!(name: "Andrew")
319
+ user.update_column :created_at, nil
320
+ assert_equal 0, User.group_by_hour_of_day(:created_at, Time.zone, true).count[0]
321
+ end
322
+
323
+ # week_start
324
+
325
+ def test_week_start
326
+ Groupdate.week_start = :mon
327
+ assert_result_time :week, "2013-03-18 00:00:00 UTC", "2013-03-24 23:59:59"
328
+ end
329
+
330
+ def test_week_start_and_start_option
331
+ Groupdate.week_start = :mon
332
+ assert_result_time :week, "2013-03-16 00:00:00 UTC", "2013-03-22 23:59:59", false, :start => :sat
308
333
  end
309
334
 
310
335
  # misc
311
336
 
312
337
  def test_order_day
313
- assert_equal({}, User.group_by_day(:created_at).order("day desc").limit(20).count)
338
+ assert_empty User.group_by_day(:created_at).order("day desc").limit(20).count
314
339
  end
315
340
 
316
341
  def test_order_week
317
- assert_equal({}, User.group_by_week(:created_at).order("week asc").count)
342
+ assert_empty User.group_by_week(:created_at).order("week asc").count
318
343
  end
319
344
 
320
345
  def test_order_hour_of_day
321
- assert_equal({}, User.group_by_hour_of_day(:created_at).order("hour_of_day desc").count)
346
+ assert_empty User.group_by_hour_of_day(:created_at).order("hour_of_day desc").count
322
347
  end
323
348
 
324
349
  def test_table_name
325
- assert_equal({}, User.group_by_day("users.created_at").count)
350
+ assert_empty User.group_by_day("users.created_at").count
326
351
  end
327
352
 
328
353
  def test_previous_scopes
329
354
  create_user "2013-05-01 00:00:00 UTC"
330
- assert_equal({}, User.where("id = 0").group_by_day(:created_at).count)
355
+ assert_empty User.where("id = 0").group_by_day(:created_at).count
331
356
  end
332
357
 
333
358
  # helpers
@@ -339,7 +364,7 @@ module TestGroupdate
339
364
  def assert_result(method, expected, time_str, time_zone = false, options = {})
340
365
  create_user time_str
341
366
  expected = expected.is_a?(Time) ? time_key(expected) : number_key(expected)
342
- assert_equal(ordered_hash({expected => 1}), User.send(:"group_by_#{method}", :created_at, time_zone ? "Pacific Time (US & Canada)" : nil, options).order(method.to_s).count)
367
+ assert_equal ordered_hash({expected => 1}), User.send(:"group_by_#{method}", :created_at, time_zone ? "Pacific Time (US & Canada)" : nil, options).order(method.to_s).count
343
368
  end
344
369
 
345
370
  def assert_zeros(method, created_at, keys, range_start, range_end, time_zone = nil, options = {})
@@ -348,7 +373,7 @@ module TestGroupdate
348
373
  keys.each_with_index do |key, i|
349
374
  expected[Time.parse(key)] = i == 1 ? 1 : 0
350
375
  end
351
- assert_equal(expected, User.send(:"group_by_#{method}", :created_at, time_zone ? "Pacific Time (US & Canada)" : nil, Time.parse(range_start)..Time.parse(range_end), options).count)
376
+ assert_equal expected, User.send(:"group_by_#{method}", :created_at, time_zone ? "Pacific Time (US & Canada)" : nil, Time.parse(range_start)..Time.parse(range_end), options).count
352
377
  end
353
378
 
354
379
  def ordered_hash(hash)
@@ -356,7 +381,7 @@ module TestGroupdate
356
381
  end
357
382
 
358
383
  def create_user(created_at)
359
- User.create!(:name => "Andrew", :score => 1, :created_at => ActiveSupport::TimeZone["UTC"].parse(created_at))
384
+ User.create! :name => "Andrew", :score => 1, :created_at => ActiveSupport::TimeZone["UTC"].parse(created_at)
360
385
  end
361
386
 
362
387
  def teardown
metadata CHANGED
@@ -1,99 +1,99 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: groupdate
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-07-06 00:00:00.000000000 Z
11
+ date: 2013-07-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
15
- version_requirements: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: 3.0.0
20
15
  requirement: !ruby/object:Gem::Requirement
21
16
  requirements:
22
- - - ">="
17
+ - - '>='
23
18
  - !ruby/object:Gem::Version
24
19
  version: 3.0.0
25
- prerelease: false
26
20
  type: :runtime
27
- - !ruby/object:Gem::Dependency
28
- name: bundler
21
+ prerelease: false
29
22
  version_requirements: !ruby/object:Gem::Requirement
30
23
  requirements:
31
- - - "~>"
24
+ - - '>='
32
25
  - !ruby/object:Gem::Version
33
- version: '1.3'
26
+ version: 3.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
34
29
  requirement: !ruby/object:Gem::Requirement
35
30
  requirements:
36
- - - "~>"
31
+ - - ~>
37
32
  - !ruby/object:Gem::Version
38
33
  version: '1.3'
39
- prerelease: false
40
34
  type: :development
41
- - !ruby/object:Gem::Dependency
42
- name: rake
35
+ prerelease: false
43
36
  version_requirements: !ruby/object:Gem::Requirement
44
37
  requirements:
45
- - - ">="
38
+ - - ~>
46
39
  - !ruby/object:Gem::Version
47
- version: '0'
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
48
43
  requirement: !ruby/object:Gem::Requirement
49
44
  requirements:
50
- - - ">="
45
+ - - '>='
51
46
  - !ruby/object:Gem::Version
52
47
  version: '0'
53
- prerelease: false
54
48
  type: :development
55
- - !ruby/object:Gem::Dependency
56
- name: minitest
49
+ prerelease: false
57
50
  version_requirements: !ruby/object:Gem::Requirement
58
51
  requirements:
59
- - - ">="
52
+ - - '>='
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
62
57
  requirement: !ruby/object:Gem::Requirement
63
58
  requirements:
64
- - - ">="
59
+ - - '>='
65
60
  - !ruby/object:Gem::Version
66
61
  version: '0'
67
- prerelease: false
68
62
  type: :development
69
- - !ruby/object:Gem::Dependency
70
- name: activerecord-jdbcpostgresql-adapter
63
+ prerelease: false
71
64
  version_requirements: !ruby/object:Gem::Requirement
72
65
  requirements:
73
- - - ">="
66
+ - - '>='
74
67
  - !ruby/object:Gem::Version
75
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pg
76
71
  requirement: !ruby/object:Gem::Requirement
77
72
  requirements:
78
- - - ">="
73
+ - - '>='
79
74
  - !ruby/object:Gem::Version
80
75
  version: '0'
81
- prerelease: false
82
76
  type: :development
83
- - !ruby/object:Gem::Dependency
84
- name: activerecord-jdbcmysql-adapter
77
+ prerelease: false
85
78
  version_requirements: !ruby/object:Gem::Requirement
86
79
  requirements:
87
- - - ">="
80
+ - - '>='
88
81
  - !ruby/object:Gem::Version
89
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: mysql2
90
85
  requirement: !ruby/object:Gem::Requirement
91
86
  requirements:
92
- - - ">="
87
+ - - '>='
93
88
  - !ruby/object:Gem::Version
94
89
  version: '0'
95
- prerelease: false
96
90
  type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
97
  description: The simplest way to group temporal data
98
98
  email:
99
99
  - acekane1@gmail.com
@@ -101,8 +101,8 @@ executables: []
101
101
  extensions: []
102
102
  extra_rdoc_files: []
103
103
  files:
104
- - ".gitignore"
105
- - ".travis.yml"
104
+ - .gitignore
105
+ - .travis.yml
106
106
  - CHANGELOG.md
107
107
  - Gemfile
108
108
  - LICENSE.txt
@@ -121,24 +121,24 @@ homepage: ''
121
121
  licenses:
122
122
  - MIT
123
123
  metadata: {}
124
- post_install_message:
124
+ post_install_message:
125
125
  rdoc_options: []
126
126
  require_paths:
127
127
  - lib
128
128
  required_ruby_version: !ruby/object:Gem::Requirement
129
129
  requirements:
130
- - - ">="
130
+ - - '>='
131
131
  - !ruby/object:Gem::Version
132
132
  version: '0'
133
133
  required_rubygems_version: !ruby/object:Gem::Requirement
134
134
  requirements:
135
- - - ">="
135
+ - - '>='
136
136
  - !ruby/object:Gem::Version
137
137
  version: '0'
138
138
  requirements: []
139
- rubyforge_project:
140
- rubygems_version: 2.0.3
141
- signing_key:
139
+ rubyforge_project:
140
+ rubygems_version: 2.0.0
141
+ signing_key:
142
142
  specification_version: 4
143
143
  summary: The simplest way to group temporal data
144
144
  test_files: