active_analytics 0.2.1 → 0.3.0
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 +4 -4
- data/README.md +88 -15
- data/app/controllers/active_analytics/application_controller.rb +23 -5
- data/app/controllers/active_analytics/assets_controller.rb +29 -0
- data/app/controllers/active_analytics/pages_controller.rb +9 -10
- data/app/controllers/active_analytics/referrers_controller.rb +9 -5
- data/app/controllers/active_analytics/sites_controller.rb +4 -4
- data/app/models/active_analytics/views_per_day.rb +22 -3
- data/app/views/active_analytics/assets/_charts.css +249 -0
- data/app/{assets/stylesheets/active_analytics/style.css → views/active_analytics/assets/_style.css} +36 -26
- data/app/views/active_analytics/assets/application.css.erb +2 -0
- data/app/{assets/javascripts/active_analytics → views/active_analytics/assets}/application.js +1 -3
- data/app/{assets/stylesheets/active_analytics → views/active_analytics/assets}/ariato.css +237 -234
- data/app/views/active_analytics/pages/_table.html.erb +6 -17
- data/app/views/active_analytics/pages/index.html.erb +1 -1
- data/app/views/active_analytics/pages/show.html.erb +7 -4
- data/app/views/active_analytics/referrers/_table.html.erb +9 -2
- data/app/views/active_analytics/referrers/index.html.erb +2 -2
- data/app/views/active_analytics/referrers/show.html.erb +6 -3
- data/app/views/active_analytics/sites/_histogram.html.erb +9 -2
- data/app/views/active_analytics/sites/_histogram_header.html.erb +10 -0
- data/app/views/active_analytics/sites/show.html.erb +2 -2
- data/app/views/layouts/active_analytics/_footer.html.erb +3 -3
- data/app/views/layouts/active_analytics/_header.html.erb +1 -3
- data/app/views/layouts/active_analytics/application.html.erb +5 -3
- data/config/routes.rb +2 -1
- data/lib/active_analytics/engine.rb +0 -4
- data/lib/active_analytics/version.rb +1 -1
- data/lib/active_analytics.rb +41 -3
- metadata +11 -9
- data/app/assets/stylesheets/active_analytics/application.css +0 -15
- data/app/assets/stylesheets/active_analytics/charts.css +0 -296
- /data/app/{assets/javascripts/active_analytics → views/active_analytics/assets}/ariato.js +0 -0
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
<% if pages.empty? %>
|
3
2
|
<div class="is-empty">
|
4
3
|
<span>no data</span>
|
@@ -8,26 +7,16 @@
|
|
8
7
|
<% for page in pages %>
|
9
8
|
<tr>
|
10
9
|
<td>
|
11
|
-
<% if page.
|
12
|
-
|
13
|
-
<%= link_to page.path, page_path(site: page.host, page: page_to_params(page.path), from: params[:from], to: params[:to]) %>
|
14
|
-
<% else %>
|
15
|
-
<%= site_icon page.host %>
|
16
|
-
<%= link_to page.host, site_path(site: page.host, from: params[:from], to: params[:to]) %>
|
17
|
-
<small>(page not provided <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#strict-origin-when-cross-origin">?</a>)</small>
|
18
|
-
<% end %>
|
19
|
-
<% elsif page.host.present? && page.path.present? %>
|
20
|
-
<%= link_to(referrer_path(site: params[:site], referrer: page.host, from: params[:from], to: params[:to])) { site_icon page.host } %>
|
21
|
-
<%= link_to page.url, referrer_path(site: params[:site], referrer: page.host, from: params[:from], to: params[:to]) %>
|
22
|
-
<% elsif page.host.present? %>
|
23
|
-
<%= site_icon page.host %>
|
24
|
-
<%= page.host %>
|
10
|
+
<% if page.path.present? %>
|
11
|
+
<%= link_to page.path, page_path(site: page.host, page: page_to_params(page.path), from: params[:from], to: params[:to]) %>
|
25
12
|
<% else %>
|
26
|
-
|
13
|
+
<%= site_icon page.host %>
|
14
|
+
<%= link_to page.host, site_path(site: page.host, from: params[:from], to: params[:to]) %>
|
15
|
+
<small>(page not provided <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#strict-origin-when-cross-origin">?</a>)</small>
|
27
16
|
<% end %>
|
28
17
|
</td>
|
29
18
|
<td class="number"><%= format_view_count page.total %></td>
|
30
19
|
</tr>
|
31
20
|
<% end %>
|
32
21
|
</table>
|
33
|
-
<% end %>
|
22
|
+
<% end %>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<section class="card">
|
2
|
-
|
2
|
+
<%= render "/active_analytics/sites/histogram_header", histogram: @histogram, previous_histogram: @previous_histogram %>
|
3
3
|
<%= render "/active_analytics/sites/histogram", histogram: @histogram %>
|
4
4
|
</section>
|
5
5
|
|
@@ -1,9 +1,12 @@
|
|
1
1
|
<section>
|
2
|
-
<h2
|
2
|
+
<h2>
|
3
|
+
<%= page_from_params %>
|
4
|
+
<%= link_to "", File.join("https://", params[:site], page_from_params), target: "_blank" %>
|
5
|
+
</h2>
|
3
6
|
</section>
|
4
7
|
|
5
8
|
<section class="card">
|
6
|
-
|
9
|
+
<%= render "/active_analytics/sites/histogram_header", histogram: @histogram, previous_histogram: @previous_histogram %>
|
7
10
|
<%= render "/active_analytics/sites/histogram", histogram: @histogram %>
|
8
11
|
</section>
|
9
12
|
|
@@ -11,7 +14,7 @@
|
|
11
14
|
<li class="card">
|
12
15
|
<section>
|
13
16
|
<h3>Previous page</h3>
|
14
|
-
<%= render "table",
|
17
|
+
<%= render "/active_analytics/referrers/table", referrers: @previous_pages %>
|
15
18
|
</section>
|
16
19
|
</li>
|
17
20
|
|
@@ -19,4 +22,4 @@
|
|
19
22
|
<h3>Next page</h3>
|
20
23
|
<%= render "table", pages: @next_pages %>
|
21
24
|
</li>
|
22
|
-
</ul>
|
25
|
+
</ul>
|
@@ -7,11 +7,18 @@
|
|
7
7
|
<% for referrer in referrers %>
|
8
8
|
<tr>
|
9
9
|
<td>
|
10
|
-
<% if referrer.
|
10
|
+
<% if referrer.try(:path) %>
|
11
|
+
<%= site_icon referrer.host %>
|
12
|
+
<% if referrer.host == params[:site] %>
|
13
|
+
<%= link_to referrer.path, page_path(site: referrer.host, page: page_to_params(referrer.path), from: params[:from], to: params[:to]) %>
|
14
|
+
<% else %>
|
15
|
+
<%= link_to referrer.url, referrer_path(site: params[:site], referrer: referrer.url.chomp("/"), from: params[:from], to: params[:to]) %>
|
16
|
+
<% end %>
|
17
|
+
<% elsif referrer.host %>
|
11
18
|
<%= site_icon referrer.host %>
|
12
19
|
<%= link_to referrer.host, referrer_path(site: params[:site], referrer: referrer.host, from: params[:from], to: params[:to]) %>
|
13
20
|
<% else %>
|
14
|
-
|
21
|
+
(None or direct)
|
15
22
|
<% end %>
|
16
23
|
</td>
|
17
24
|
<td class="number"><%= format_view_count referrer.total %></td>
|
@@ -1,9 +1,9 @@
|
|
1
1
|
<section class="card">
|
2
|
-
|
2
|
+
<%= render "/active_analytics/sites/histogram_header", histogram: @histogram, previous_histogram: @previous_histogram %>
|
3
3
|
<%= render "/active_analytics/sites/histogram", histogram: @histogram %>
|
4
4
|
</section>
|
5
5
|
|
6
6
|
<section class="card">
|
7
7
|
<h3>Top sources</h3>
|
8
8
|
<%= render "table", referrers: @referrers %>
|
9
|
-
</section>
|
9
|
+
</section>
|
@@ -1,15 +1,18 @@
|
|
1
1
|
<section>
|
2
|
-
<h2>
|
2
|
+
<h2>
|
3
|
+
Source: <%= params[:referrer] %>
|
4
|
+
<%= link_to "", File.join("https://", params[:referrer]), target: "_blank" %>
|
5
|
+
</h2>
|
3
6
|
</section>
|
4
7
|
|
5
8
|
<section class="card">
|
6
|
-
|
9
|
+
<%= render "/active_analytics/sites/histogram_header", histogram: @histogram, previous_histogram: @previous_histogram %>
|
7
10
|
<%= render "/active_analytics/sites/histogram", histogram: @histogram %>
|
8
11
|
</section>
|
9
12
|
<ul class="grid-auto">
|
10
13
|
<li class="card">
|
11
14
|
<h3>Source page</h3>
|
12
|
-
<%= render "/active_analytics/
|
15
|
+
<%= render "/active_analytics/referrers/table", referrers: @previous_pages %>
|
13
16
|
</li>
|
14
17
|
|
15
18
|
<li class="card">
|
@@ -3,11 +3,18 @@
|
|
3
3
|
<tbody>
|
4
4
|
<% for bar in histogram.bars %>
|
5
5
|
<tr>
|
6
|
-
<th scope="row"
|
7
|
-
|
6
|
+
<th scope="row">
|
7
|
+
<% if bar.height > 0 %>
|
8
|
+
<%= link_to bar.label.day, url_for(params.merge(from: bar.label.to_date, to: bar.label.to_date).to_unsafe_hash) %>
|
9
|
+
<% else %>
|
10
|
+
<%= bar.label.day %>
|
11
|
+
<% end %>
|
12
|
+
</th>
|
13
|
+
<td style="--size: <%= bar.height %>; --color: rgba(var(--color-grey-100), 1);">
|
8
14
|
<span class="data"><%= bar.value.to_i %></span>
|
9
15
|
<span class="tooltip"><small class="tooltip-date"><%= l bar.label, format: :long%></small><br/><%= format_view_count bar.value %> views</span>
|
10
16
|
</td>
|
17
|
+
</a>
|
11
18
|
</tr>
|
12
19
|
<% end %>
|
13
20
|
</tbody>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<h3>
|
2
|
+
<%= format_view_count current_total = histogram.total %> views
|
3
|
+
<% if (previous_total = previous_histogram.total) > 0 %>
|
4
|
+
<% if (diff = current_total - previous_total) > 0 %>
|
5
|
+
<small class="is-success">+<%= number_to_percentage diff * 100.0 / previous_total, precision: 0 %></small>
|
6
|
+
<% elsif (diff = current_total - previous_total) < 0 %>
|
7
|
+
<small class="is-danger"><%= number_to_percentage diff * 100.0 / previous_total, precision: 0 %></small>
|
8
|
+
<% end %>
|
9
|
+
<% end %>
|
10
|
+
</h3>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<section class="card">
|
2
|
-
|
2
|
+
<%= render "/active_analytics/sites/histogram_header", histogram: @histogram, previous_histogram: @previous_histogram %>
|
3
3
|
<%= render "/active_analytics/sites/histogram", histogram: @histogram %>
|
4
4
|
</section>
|
5
5
|
|
@@ -13,4 +13,4 @@
|
|
13
13
|
<h3>Top pages <%= link_to "view all", pages_path(from: params[:from], to: params[:to]) %></h3>
|
14
14
|
<%= render "/active_analytics/pages/table", pages: @pages %>
|
15
15
|
</li>
|
16
|
-
</ul>
|
16
|
+
</ul>
|
@@ -37,12 +37,12 @@
|
|
37
37
|
<header id="custom-range-title">Custom range</header>
|
38
38
|
<%= form_tag url_for(params.except(:from, :to).to_unsafe_hash), method: "get", id: "dateRangeForm" do %>
|
39
39
|
<div role="group" class="is-block">
|
40
|
-
<label>From <%=
|
41
|
-
<label>To <%=
|
40
|
+
<label>From <%= date_field_tag :from, params[:from] %></label>
|
41
|
+
<label>To <%= date_field_tag :to, params[:to] %></label>
|
42
42
|
</div>
|
43
43
|
<% end %>
|
44
44
|
<footer>
|
45
45
|
<%= submit_tag "Change date range", form: "dateRangeForm" %>
|
46
46
|
<button type="reset" onclick="Ariato.Dialog.close(this)">Close</button>
|
47
47
|
</footer>
|
48
|
-
</div>
|
48
|
+
</div>
|
@@ -1,7 +1,5 @@
|
|
1
1
|
<header data-ariato="ActiveAnalytics.Header">
|
2
|
-
<nav aria-label="site">
|
3
|
-
|
4
|
-
<%#= link_to "Analytics", active_analytics_path, role: "button" %>
|
2
|
+
<nav aria-label="site">
|
5
3
|
<%= link_to active_analytics_path, class: 'logo' do %>
|
6
4
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 11 11">
|
7
5
|
<path class="a" d="M.5,5.5s0,2,1,2,1-2,1-2,0-2,1-2,1,2,1,2,0,2,1,2,1-2,1-2,0-2,1-2,1,2,1,2,0,2,1,2,1-2,1-2"/>
|
@@ -1,13 +1,15 @@
|
|
1
1
|
<!DOCTYPE html>
|
2
|
-
<html>
|
2
|
+
<html class="active-analytics">
|
3
3
|
<head>
|
4
4
|
<title>Active analytics</title>
|
5
5
|
<meta name=viewport content="width=device-width, initial-scale=1">
|
6
6
|
<%= csrf_meta_tags %>
|
7
7
|
<%= csp_meta_tag %>
|
8
8
|
|
9
|
-
<%=
|
10
|
-
<%=
|
9
|
+
<%= tag.link rel: "stylesheet", href: asset_path(:ariato, format: :css) %>
|
10
|
+
<%= tag.link rel: "stylesheet", href: asset_path(:application, format: :css) %>
|
11
|
+
<%= tag.script "", src: asset_path(:ariato, format: :js) %>
|
12
|
+
<%= tag.script "", src: asset_path(:application, format: :js) %>
|
11
13
|
</head>
|
12
14
|
|
13
15
|
<body>
|
data/config/routes.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
ActiveAnalytics::Engine.routes.draw do
|
2
|
+
resources :assets, only: [:show]
|
2
3
|
get "/:site", to: "sites#show", as: :site, constraints: {site: /[^\/]+/}
|
3
4
|
|
4
5
|
# Referrers
|
5
6
|
get "/:site/referrers", to: "referrers#index", constraints: {site: /[^\/]+/}, as: :referrers
|
6
|
-
get "/:site/referrers
|
7
|
+
get "/:site/referrers/*referrer", to: "referrers#show", as: :referrer, constraints: {site: /[^\/]+/, referrer: /.+/}
|
7
8
|
|
8
9
|
# Pages
|
9
10
|
get "/:site/pages", to: "pages#index", constraints: {site: /[^\/]+/}, as: :pages
|
@@ -1,9 +1,5 @@
|
|
1
1
|
module ActiveAnalytics
|
2
2
|
class Engine < ::Rails::Engine
|
3
3
|
isolate_namespace ActiveAnalytics
|
4
|
-
|
5
|
-
initializer "active_analytics.assets.precompile" do |app|
|
6
|
-
app.config.assets.precompile += %w[active_analytics/application.js active_analytics/application.css]
|
7
|
-
end
|
8
4
|
end
|
9
5
|
end
|
data/lib/active_analytics.rb
CHANGED
@@ -2,6 +2,22 @@ require "active_analytics/version"
|
|
2
2
|
require "active_analytics/engine"
|
3
3
|
|
4
4
|
module ActiveAnalytics
|
5
|
+
def self.redis_url=(string)
|
6
|
+
@redis_url = string
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.redis_url
|
10
|
+
@redis_url ||= ENV["ACTIVE_ANALYTICS_REDIS_URL"] || ENV["REDIS_URL"] || "redis://localhost"
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.redis=(connection)
|
14
|
+
@redis = connection
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.redis
|
18
|
+
@redis ||= Redis.new(url: redis_url)
|
19
|
+
end
|
20
|
+
|
5
21
|
def self.record_request(request)
|
6
22
|
params = {
|
7
23
|
site: request.host,
|
@@ -9,9 +25,7 @@ module ActiveAnalytics
|
|
9
25
|
date: Date.today,
|
10
26
|
}
|
11
27
|
if request.referrer.present?
|
12
|
-
|
13
|
-
params[:referrer_host] = referrer_uri.host
|
14
|
-
params[:referrer_path] = referrer_uri.path
|
28
|
+
params[:referrer_host], params[:referrer_path] = ViewsPerDay.split_referrer(request.referrer)
|
15
29
|
end
|
16
30
|
ViewsPerDay.append(params)
|
17
31
|
rescue => ex
|
@@ -22,4 +36,28 @@ module ActiveAnalytics
|
|
22
36
|
Rails.logger.error(ex.backtrace.join("\n"))
|
23
37
|
end
|
24
38
|
end
|
39
|
+
|
40
|
+
SEPARATOR = "|"
|
41
|
+
QUEUE = "ActiveAnalytics::Queue"
|
42
|
+
OLD_QUEUE = "ActiveAnalytics::OldQueue"
|
43
|
+
|
44
|
+
def self.queue_request(request)
|
45
|
+
keys = [request.host, request.path]
|
46
|
+
if request.referrer.present?
|
47
|
+
keys.concat(ViewsPerDay.split_referrer(request.referrer))
|
48
|
+
end
|
49
|
+
redis.hincrby(QUEUE, keys.join(SEPARATOR).downcase, 1)
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.flush_queue
|
53
|
+
return if !redis.exists?(QUEUE)
|
54
|
+
cursor = 0
|
55
|
+
date = Date.today
|
56
|
+
redis.rename(QUEUE, OLD_QUEUE)
|
57
|
+
redis.hscan_each(OLD_QUEUE) do |key, count|
|
58
|
+
site, page, referrer_host, referrer_path = key.split(SEPARATOR)
|
59
|
+
ViewsPerDay.append(date: date, site: site, page: page, referrer_host: referrer_host, referrer_path: referrer_path, total: count.to_i)
|
60
|
+
end
|
61
|
+
redis.del(OLD_QUEUE)
|
62
|
+
end
|
25
63
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_analytics
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexis Bernard
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2023-09-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -39,13 +39,8 @@ files:
|
|
39
39
|
- app/assets/config/active_analytics_manifest.js
|
40
40
|
- app/assets/images/active_analytics.png
|
41
41
|
- app/assets/images/active_analytics_screenshot.png
|
42
|
-
- app/assets/javascripts/active_analytics/application.js
|
43
|
-
- app/assets/javascripts/active_analytics/ariato.js
|
44
|
-
- app/assets/stylesheets/active_analytics/application.css
|
45
|
-
- app/assets/stylesheets/active_analytics/ariato.css
|
46
|
-
- app/assets/stylesheets/active_analytics/charts.css
|
47
|
-
- app/assets/stylesheets/active_analytics/style.css
|
48
42
|
- app/controllers/active_analytics/application_controller.rb
|
43
|
+
- app/controllers/active_analytics/assets_controller.rb
|
49
44
|
- app/controllers/active_analytics/pages_controller.rb
|
50
45
|
- app/controllers/active_analytics/referrers_controller.rb
|
51
46
|
- app/controllers/active_analytics/sites_controller.rb
|
@@ -57,6 +52,12 @@ files:
|
|
57
52
|
- app/mailers/active_analytics/application_mailer.rb
|
58
53
|
- app/models/active_analytics/application_record.rb
|
59
54
|
- app/models/active_analytics/views_per_day.rb
|
55
|
+
- app/views/active_analytics/assets/_charts.css
|
56
|
+
- app/views/active_analytics/assets/_style.css
|
57
|
+
- app/views/active_analytics/assets/application.css.erb
|
58
|
+
- app/views/active_analytics/assets/application.js
|
59
|
+
- app/views/active_analytics/assets/ariato.css
|
60
|
+
- app/views/active_analytics/assets/ariato.js
|
60
61
|
- app/views/active_analytics/pages/_table.html.erb
|
61
62
|
- app/views/active_analytics/pages/index.html.erb
|
62
63
|
- app/views/active_analytics/pages/show.html.erb
|
@@ -64,6 +65,7 @@ files:
|
|
64
65
|
- app/views/active_analytics/referrers/index.html.erb
|
65
66
|
- app/views/active_analytics/referrers/show.html.erb
|
66
67
|
- app/views/active_analytics/sites/_histogram.html.erb
|
68
|
+
- app/views/active_analytics/sites/_histogram_header.html.erb
|
67
69
|
- app/views/active_analytics/sites/index.html.erb
|
68
70
|
- app/views/active_analytics/sites/show.html.erb
|
69
71
|
- app/views/layouts/active_analytics/_footer.html.erb
|
@@ -98,7 +100,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
98
100
|
- !ruby/object:Gem::Version
|
99
101
|
version: '0'
|
100
102
|
requirements: []
|
101
|
-
rubygems_version: 3.
|
103
|
+
rubygems_version: 3.2.22
|
102
104
|
signing_key:
|
103
105
|
specification_version: 4
|
104
106
|
summary: First-party, privacy-focused traffic analytics for Ruby on Rails applications
|
@@ -1,15 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
-
* listed below.
|
4
|
-
*
|
5
|
-
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
-
* or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
|
7
|
-
*
|
8
|
-
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
9
|
-
* compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
|
10
|
-
* files in this directory. Styles in this file should be added after the last require_* statement.
|
11
|
-
* It is generally better to create a new file per style scope.
|
12
|
-
*
|
13
|
-
*= require_tree .
|
14
|
-
*= require_self
|
15
|
-
*/
|