chartable 0.0.0.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 542726255882a8805df4e6f6fdd0417234dea2841340b1e0c703729c40c9355f
4
+ data.tar.gz: 38f0a30b7f1dc584968a268a8eed9c042788aedd285b98b2fc6b336ef43b27b4
5
+ SHA512:
6
+ metadata.gz: 3364382cc913e5e98ed6bc7aae962cfd261639241fceb709e9f5e583a32f2e913a99d9921cafb2234034ff80eb027e1025988e2877e7b86362eb0c48aeb1bb71
7
+ data.tar.gz: f95d5ae606a9cde926d3242bb7cf2d46736fe80260285e3e57b5d078fee8fba6f0a7cf5e5abea56d318906625e2668394b71f47770dc6c4716c557bb97ce1da7
@@ -0,0 +1,9 @@
1
+ require 'chartable/errors/invalid_period_error'
2
+ require 'chartable/queries/daily'
3
+ require 'chartable/queries/monthly'
4
+ require 'chartable/queries/weekly'
5
+ require 'chartable/queries/quarterly'
6
+ require 'chartable/queries/yearly'
7
+ require 'chartable/active_record_extension'
8
+ require 'chartable/period_query'
9
+ require 'chartable/range_query'
@@ -0,0 +1,21 @@
1
+ require 'active_support'
2
+ require 'active_record'
3
+
4
+ module Chartable
5
+ module ActiveRecordExtension
6
+ extend ActiveSupport::Concern
7
+
8
+ class_methods do
9
+ # It returns analytics hash created from the given criteria
10
+ #
11
+ # @return [Hash]
12
+ def analytics(period, from: nil, to: nil, on: 'created_at')
13
+ period_query = Chartable::PeriodQuery.build(period)
14
+ scope = Chartable::RangeQuery.call(self, on: on, from: from, to: to)
15
+ period_query.call(scope, on: on)
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ ActiveRecord::Base.send(:include, Chartable::ActiveRecordExtension)
@@ -0,0 +1,5 @@
1
+ module Chartable
2
+ module Errors
3
+ class InvalidPeriodError < StandardError; end
4
+ end
5
+ end
@@ -0,0 +1,23 @@
1
+ module Chartable
2
+ class PeriodQuery
3
+ PERIODS = {
4
+ daily: Chartable::Queries::Daily,
5
+ weekly: Chartable::Queries::Weekly,
6
+ quarterly: Chartable::Queries::Quarterly,
7
+ yearly: Chartable::Queries::Yearly,
8
+ monthly: Chartable::Queries::Monthly
9
+ }
10
+
11
+ # It returns the proper query object for selected period.
12
+ # If given period is not supported it raises `Chartable::Errors::InvalidPeriodError` error
13
+ #
14
+ # @return [Class]
15
+ def self.build(period)
16
+ period_class = PERIODS[period]
17
+
18
+ raise(Chartable::Errors::InvalidPeriodError, "#{period} is not valid, valid one are: #{PERIODS.keys.join(', ')}") if period_class.nil?
19
+
20
+ period_class
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ module Chartable
2
+ module Queries
3
+ class Daily
4
+ # It returns analytics data for the daily period.
5
+ # Example output: `{"October 09, 2018" => 1, "October 10, 2018" => 1}`
6
+ #
7
+ # @return [Hash]
8
+ def self.call(scope, on:)
9
+ scope.group("DATE_FORMAT(#{on}, '%M %d, %Y')").size
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Chartable
2
+ module Queries
3
+ class Monthly
4
+ # It returns analytics data for the monthly period.
5
+ # Example output: `{"November 2018" => 1, "October 2018" => 1}`
6
+ #
7
+ # @return [Hash]
8
+ def self.call(scope, on:)
9
+ scope.group("DATE_FORMAT(#{on},'%M %Y')").size
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Chartable
2
+ module Queries
3
+ class Quarterly
4
+ # It returns analytics data for the quarterly period.
5
+ # Example output: `{"Q1 2018" => 1, "Q2 2018" => 1}`
6
+ #
7
+ # @return [Hash]
8
+ def self.call(scope, on:)
9
+ scope.group("CONCAT('Q', QUARTER(#{on}), DATE_FORMAT(#{on},' %Y'))").size
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Chartable
2
+ module Queries
3
+ class Weekly
4
+ # It returns analytics data for the weekly period.
5
+ # Example output: `{"01/28/18 - 02/03/18" => 1, "02/11/18 - 02/17/18" => 1}`
6
+ #
7
+ # @return [Hash]
8
+ def self.call(scope, on:)
9
+ scope.group("CONCAT(DATE_FORMAT(DATE(DATE_ADD(#{on}, INTERVAL(1-DAYOFWEEK(#{on})) DAY)), '%m/%d/%y'), ' - ', DATE_FORMAT(DATE(DATE_ADD(#{on}, INTERVAL(7-DAYOFWEEK(#{on})) DAY)),'%m/%d/%y'))").size
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Chartable
2
+ module Queries
3
+ class Yearly
4
+ # It returns analytics data for the yearly period.
5
+ # Example output: `{ 2017 => 1, 2018 => 1 }`
6
+ #
7
+ # @return [Hash]
8
+ def self.call(scope, on:)
9
+ scope.group("YEAR(#{on})").size
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,25 @@
1
+ require 'chronic'
2
+
3
+ module Chartable
4
+ class RangeQuery
5
+ # Returns scope filtered according to the given date criteria.
6
+ # If dates are not given it returns original scope.
7
+ # Given value is parsed by Chronic gem and transformed into the data format
8
+ #
9
+ # @return [Model::ActiveRecord_Relation]
10
+ def self.call(scope, on:, from: nil, to: nil)
11
+ from_date = Chronic.parse(from)
12
+ to_date = Chronic.parse(to)
13
+
14
+ return scope if from_date.nil? && to_date.nil?
15
+
16
+ if from_date.nil?
17
+ scope.where("DATE(#{on}) <= ?", to_date.to_date)
18
+ elsif to_date.nil?
19
+ scope.where("DATE(#{on}) >= ?", from_date.to_date)
20
+ else
21
+ scope.where("DATE(#{on}) >= ? AND DATE(#{on}) <= ?", from_date.to_date, to_date.to_date)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,12 @@
1
+ module Chartable
2
+ module Version
3
+ module_function
4
+
5
+ # Gem current version
6
+ #
7
+ # @return [String]
8
+ def to_s
9
+ "0.0.0.1"
10
+ end
11
+ end
12
+ end
metadata ADDED
@@ -0,0 +1,174 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: chartable
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Paweł Dąbrowski
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-04-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 3.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 3.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: chronic
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.10'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.10'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.7'
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 3.7.0
51
+ type: :development
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '3.7'
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 3.7.0
61
+ - !ruby/object:Gem::Dependency
62
+ name: activerecord
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: 4.0.0
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 4.0.0
75
+ - !ruby/object:Gem::Dependency
76
+ name: mysql2
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: timecop
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ - !ruby/object:Gem::Dependency
104
+ name: factory_bot_rails
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: 4.0.0
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: 4.0.0
117
+ - !ruby/object:Gem::Dependency
118
+ name: database_cleaner
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: 1.0.0
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: 1.0.0
131
+ description: A lightweight and database-level library to transform any Active Record
132
+ query into analytics data ready for any chart
133
+ email: dziamber@gmail.com
134
+ executables: []
135
+ extensions: []
136
+ extra_rdoc_files: []
137
+ files:
138
+ - lib/chartable.rb
139
+ - lib/chartable/active_record_extension.rb
140
+ - lib/chartable/errors/invalid_period_error.rb
141
+ - lib/chartable/period_query.rb
142
+ - lib/chartable/queries/daily.rb
143
+ - lib/chartable/queries/monthly.rb
144
+ - lib/chartable/queries/quarterly.rb
145
+ - lib/chartable/queries/weekly.rb
146
+ - lib/chartable/queries/yearly.rb
147
+ - lib/chartable/range_query.rb
148
+ - lib/chartable/version.rb
149
+ homepage: http://github.com/rubyhero/chartable
150
+ licenses:
151
+ - MIT
152
+ metadata: {}
153
+ post_install_message:
154
+ rdoc_options: []
155
+ require_paths:
156
+ - lib
157
+ required_ruby_version: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ version: 2.0.0
162
+ required_rubygems_version: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ requirements: []
168
+ rubyforge_project:
169
+ rubygems_version: 2.7.3
170
+ signing_key:
171
+ specification_version: 4
172
+ summary: A lightweight and database-level library to transform any Active Record query
173
+ into analytics data ready for any chart
174
+ test_files: []