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.
- checksums.yaml +7 -0
- data/lib/chartable.rb +9 -0
- data/lib/chartable/active_record_extension.rb +21 -0
- data/lib/chartable/errors/invalid_period_error.rb +5 -0
- data/lib/chartable/period_query.rb +23 -0
- data/lib/chartable/queries/daily.rb +13 -0
- data/lib/chartable/queries/monthly.rb +13 -0
- data/lib/chartable/queries/quarterly.rb +13 -0
- data/lib/chartable/queries/weekly.rb +13 -0
- data/lib/chartable/queries/yearly.rb +13 -0
- data/lib/chartable/range_query.rb +25 -0
- data/lib/chartable/version.rb +12 -0
- metadata +174 -0
checksums.yaml
ADDED
@@ -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
|
data/lib/chartable.rb
ADDED
@@ -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,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
|
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: []
|