dateslices 0.0.2 → 0.0.3

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,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b68aa17be20ba5b07f590ae06385ccf18b5a5c64
4
- data.tar.gz: 15da28cf505321ef535b07a0a5e51859c9b19085
3
+ metadata.gz: 3efa5cfa855a50c696f0d04409b2ed0187920eea
4
+ data.tar.gz: 26c2e49f84cb16c2c3dcd2a2a1f5924e0f134f21
5
5
  SHA512:
6
- metadata.gz: df4ef7ce5e1bc900f25b55e92bf8ecaf843bc8869f5a6abcb35ef162267554b61d50f45cf1a9bdb516fa21bc112f9391956a35d2021c906ee3b4b6f9f186fc22
7
- data.tar.gz: 987181e91f8152f6d6ba21b388f6330e42253188be26928158e3434d9cc31aa09cd8a8be63cd83c477028b142b3ae03f56f6ba7ba73a347e1e16b958eb974587
6
+ metadata.gz: 854d8b6e033cf34ce2a673fcc2a5eb4b1968bb2869fb77b9a4d3038fd8f31968fe2d7684c56e4a83b10669cb99c53c0a2b0abad20014f7c65529b6b13f4a1ac0
7
+ data.tar.gz: 0ec27b6e51699b05d77facf95b1dfa280c2bdc6021dba6711450789571d808efda8f81efef6d75c98df0eeac2cd475b7046e0fa55aea5ff2a668edf63502919c
data/README.md ADDED
@@ -0,0 +1,61 @@
1
+ # Dateslices
2
+
3
+ This project rocks and uses MIT-LICENSE.
4
+
5
+ This project is based upon [groupdate](https://github.com/ankane/groupdate) and follows a similar API.
6
+
7
+ The differences between the groupdate and dateslices are:
8
+ - dateslices supports sqlite3.
9
+ - dateslices has much less functionality.
10
+ - dateslices ignores timezones.
11
+ - dateslices is rails 4 only.
12
+ - dateslices uses rspecs for tests.
13
+ - dateslices doesn't have hour_of_day since it doesn't deal with timezones
14
+
15
+
16
+ The reason that I wrote this is that I use sqlite in development, and wanted to make sure that I could test things locally. I didn't understand the test suite of groupdate, so I ended up rewriting it.
17
+
18
+
19
+ ## Example Usage
20
+
21
+ ```
22
+ User.where( :created_at > 1.month.ago ).group_by_day
23
+ ```
24
+
25
+ ## Summing up a column
26
+
27
+ ```
28
+ User.group_by_day( :created_at, "sum", "karma" )
29
+ ```
30
+
31
+ ## Averaging a column
32
+
33
+ ```
34
+ Post.group_by_week( :updated_at, "avg", "comment_count")
35
+ ```
36
+
37
+ ## All find methods
38
+
39
+ These methods take three optional arguments:
40
+
41
+ 1. column to group by, normally "created_at"
42
+ 2. sql function to run, normally "count". Also "sum", "avg"
43
+ 3. column to do the function on, normally "*"
44
+
45
+ - group_by_second
46
+ - group_by_minute
47
+ - group_by_hour
48
+ - group_by_day
49
+ - group_by_week
50
+ - group_by_day_of_week
51
+ - group_by_month
52
+ - group_by_year
53
+
54
+ ## Configuration
55
+
56
+ The output format now defaults to a Chartkick compatible hash of dates and values.
57
+ If you wish to use the dateslice format, please add `Dateslices.output_format = :dateslice` to an initializer.
58
+
59
+ ## Tests
60
+
61
+ Rspec tests need to be run out of the spec/dummy directory, and you'll need to have a postgres and a mysql database named "dateslice_test" for them to succeed.
data/lib/dateslices.rb CHANGED
@@ -5,9 +5,9 @@ module Dateslices
5
5
  FIELDS = [:second, :minute, :hour, :day, :week, :day_of_week, :month, :year ]
6
6
  METHODS = FIELDS.map{|v| :"group_by_#{v}" }
7
7
 
8
- mattr_accessor :week_start, :day_start, :time_zone
9
- self.week_start = :sun
10
- self.day_start = 0
8
+ mattr_accessor :output_format
9
+
10
+ self.output_format = :groupdate
11
11
  end
12
12
 
13
13
  begin
@@ -20,7 +20,7 @@ module Dateslices
20
20
  when :week # Sigh...
21
21
  "DATE_FORMAT( date_sub( created_at, interval ((weekday( created_at ) + 1)%7) day ), '%Y-%m-%d 00:00:00 UTC')"
22
22
  else
23
- throw "Implement #{field}"
23
+ throw "Unknown time filter #{field}"
24
24
  end
25
25
  end
26
26
 
@@ -3,41 +3,51 @@ module Dateslices
3
3
 
4
4
  Dateslices::FIELDS.each do |field|
5
5
  define_method :"group_by_#{field}" do |*args|
6
+
6
7
  args = args.dup
7
8
 
8
- column = args[0]
9
- column = 'created_at' if column.blank?
9
+ column = args[0].blank? ? 'created_at' : args[0]
10
+
11
+ aggregation = args[1].blank? ? 'count' : args[1]
12
+
13
+ aggregation_column = args[2].blank? ? '*' : args[2]
10
14
 
11
- aggregation = args[1]
12
- aggregation = 'count' if aggregation.blank?
15
+ sql = ["#{aggregation}(#{aggregation_column}) as count"]
13
16
 
14
- aggregation_column = args[2]
15
- aggregation_column = "*" if aggregation_column.blank?
17
+ time_filter = case connection.adapter_name
18
+ when 'SQLite'
19
+ Dateslices::Sqlite.time_filter(column, field)
20
+ when 'PostgreSQL', 'PostGIS'
21
+ Dateslices::Postgresql.time_filter(column, field)
22
+ when 'MySQL', 'Mysql2'
23
+ Dateslices::Mysql.time_filter(column, field)
24
+ else
25
+ throw "Unknown database adaptor #{connection.adapter_name}"
26
+ end
27
+
28
+ sql << "#{time_filter} as date_slice"
16
29
 
17
- sql = ["#{aggregation}(#{aggregation_column}) as cnt"]
30
+ slices = select( sql.join(', ')).where.not(column => nil).group('date_slice').order('date_slice')
18
31
 
19
- time_filter = ''
32
+ if Dateslices.output_format == :groupdate
20
33
 
21
- case connection.adapter_name
22
- when 'SQLite'
23
- time_filter = Dateslices::Sqlite.time_filter(column, field)
24
- when 'PostgreSQL', 'PostGIS'
25
- time_filter = Dateslices::Postgresql.time_filter(column, field)
26
- when 'MySQL', 'Mysql2'
27
- time_filter = Dateslices::Mysql.time_filter(column, field)
34
+ slices.collect! do |c|
35
+ slice = c['date_slice']
36
+ slice = slice.is_a?(Float) ? slice.to_i.to_s : slice.to_s
37
+ [slice, c['count']]
38
+ end
39
+
40
+ Hash[slices]
28
41
  else
29
- throw "Unknown database adaptor #{connection.adapter_name}"
30
- end
31
42
 
32
- sql << "#{time_filter} as date_slice"
43
+ slices.collect do |c|
44
+ slice = c['date_slice']
45
+ slice = slice.is_a?(Float) ? slice.to_i.to_s : slice.to_s
46
+ { date_slice: slice, aggregation.to_sym => c['count'] }
47
+ end
33
48
 
34
- select( sql.join(', ')).where.not(column => nil).group('date_slice').order('date_slice').collect do |c|
35
- slice = c['date_slice']
36
- slice = slice.to_i.to_s if slice.is_a? Float
37
- slice = slice.to_s if slice.is_a? Integer
38
- slice = slice.to_s
39
- { date_slice: slice, aggregation.to_sym => c["cnt"] }
40
49
  end
50
+
41
51
  end
42
52
  end
43
53
 
@@ -1,3 +1,3 @@
1
1
  module Dateslices
2
- VERSION = '0.0.2'
2
+ VERSION = '0.0.3'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dateslices
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Will Schenk
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-16 00:00:00.000000000 Z
11
+ date: 2014-12-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -117,6 +117,7 @@ extensions: []
117
117
  extra_rdoc_files: []
118
118
  files:
119
119
  - MIT-LICENSE
120
+ - README.md
120
121
  - Rakefile
121
122
  - lib/dateslices.rb
122
123
  - lib/dateslices/mysql.rb