active_analytics 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
*/
|