groupdate 1.0.3 → 1.0.4

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.
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: