trueandco_analytics 0.3.0 → 0.4.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 +3 -6
- data/app/assets/javascripts/analitics_in_point.js +28 -0
- data/app/assets/javascripts/analitics_script.js +165 -0
- data/app/assets/javascripts/trueandco_analytics.js +2 -169
- data/app/views/trueandco_analytics/{receiver → site/receiver}/pull_user_statistic.erb +0 -0
- data/config/routes.rb +1 -1
- data/db/migrate/20170802133950_create_metric_users.rb +1 -1
- data/exe/trueandco_analytics +1 -10
- data/lib/generators/trueandco_analytics/templates/trueandco_analytics.rb +3 -3
- data/lib/trueandco_analytics.rb +44 -26
- data/lib/trueandco_analytics/{locales → common/locales}/en.yml +0 -0
- data/{app/models/trueandco_analytics → lib/trueandco_analytics/common/models}/application_record.rb +0 -0
- data/{app/models/trueandco_analytics → lib/trueandco_analytics/common/models}/metric_user.rb +0 -0
- data/{app/models/trueandco_analytics → lib/trueandco_analytics/common/models}/metric_user_session.rb +0 -0
- data/lib/trueandco_analytics/common/models/metric_user_visit.rb +8 -0
- data/lib/trueandco_analytics/{modules → common/modules}/info.rb +0 -0
- data/lib/trueandco_analytics/{reports → common/reports}/application_report.rb +0 -0
- data/lib/trueandco_analytics/{reports → common/reports}/details_report.rb +0 -0
- data/lib/trueandco_analytics/{reports → common/reports}/page_buy_in_date_range_report.rb +0 -0
- data/lib/trueandco_analytics/{services → common/services}/logger.rb +0 -0
- data/lib/trueandco_analytics/{services → common/services}/redis_connect.rb +0 -0
- data/lib/trueandco_analytics/{services → common/services}/reports.rb +1 -6
- data/lib/trueandco_analytics/{services → common/services}/workers.rb +0 -0
- data/lib/trueandco_analytics/config/params.rb +7 -7
- data/lib/trueandco_analytics/{cli → console/cli}/common.rb +0 -0
- data/lib/trueandco_analytics/{cli → console/cli}/report.rb +0 -0
- data/lib/trueandco_analytics/console/commands/report_c/generate.rb +29 -0
- data/lib/{extension_string.rb → trueandco_analytics/console/extension_string.rb} +0 -0
- data/lib/trueandco_analytics/engine.rb +2 -6
- data/{app/commands/trueandco_analytics → lib/trueandco_analytics/site/commands}/arr_jsons_to_arr_hash.rb +1 -1
- data/lib/trueandco_analytics/site/commands/metric_c/add_list.rb +63 -0
- data/lib/trueandco_analytics/site/commands/session_c/create.rb +63 -0
- data/lib/trueandco_analytics/site/commands/session_c/put_data.rb +49 -0
- data/lib/trueandco_analytics/site/commands/user_c/create_or_update_user_if_exist.rb +39 -0
- data/{app/controllers/trueandco_analytics → lib/trueandco_analytics/site/controllers}/application_controller.rb +2 -2
- data/{app/controllers/trueandco_analytics → lib/trueandco_analytics/site/controllers}/reciver_controller.rb +5 -7
- data/lib/trueandco_analytics/site/helpers/trueandco_analytics_helper.rb +18 -0
- data/lib/trueandco_analytics/site/workers/user_session_metric_worker.rb +20 -0
- data/lib/trueandco_analytics/version.rb +1 -1
- metadata +31 -29
- data/app/commands/trueandco_analytics/metric_c/add_list.rb +0 -65
- data/app/commands/trueandco_analytics/report_c/generate.rb +0 -31
- data/app/commands/trueandco_analytics/session_c/create.rb +0 -65
- data/app/commands/trueandco_analytics/session_c/put_data.rb +0 -46
- data/app/commands/trueandco_analytics/user_c/create_or_update_user_if_exist.rb +0 -41
- data/app/models/trueandco_analytics/metric_user_visit.rb +0 -8
- data/app/workers/trueandco_analytics/user_session_metric_worker.rb +0 -21
- data/lib/trueandco_analytics/helpers/trueandco_analytics_helper.rb +0 -35
data/lib/trueandco_analytics.rb
CHANGED
@@ -1,31 +1,49 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
if defined?(Rails) == 'constant'
|
7
|
-
require 'sidekiq/api'
|
8
|
-
require 'sidekiq'
|
9
|
-
require 'ipaddress'
|
10
|
-
require 'browser'
|
11
|
-
require 'browser/aliases'
|
12
|
-
require 'trueandco_analytics/engine'
|
13
|
-
else
|
14
|
-
require 'extension_string'
|
15
|
-
end
|
16
|
-
require 'trueandco_analytics/config/params'
|
17
|
-
require 'trueandco_analytics/modules/info'
|
1
|
+
module TrueandcoAnalytics
|
2
|
+
ROOT = File.expand_path('../..', __FILE__)
|
3
|
+
COMMON_PATH = "#{TrueandcoAnalytics::ROOT}/lib/trueandco_analytics/common"
|
4
|
+
SITE_PATH = "#{TrueandcoAnalytics::ROOT}/lib/trueandco_analytics/site"
|
5
|
+
CONSOLE_PATH = "#{TrueandcoAnalytics::ROOT}/lib/trueandco_analytics/console"
|
18
6
|
|
19
|
-
|
20
|
-
|
21
|
-
|
7
|
+
require 'colorize'
|
8
|
+
require 'csv'
|
9
|
+
require 'fnv'
|
10
|
+
require 'byebug'
|
11
|
+
require 'trueandco_analytics/config/params'
|
12
|
+
require 'trueandco_analytics/common/modules/info'
|
22
13
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
14
|
+
# Add the translations
|
15
|
+
I18n.available_locales = [:en]
|
16
|
+
I18n.config.enforce_available_locales = true
|
17
|
+
I18n.load_path += Dir[File.join(File.dirname(__FILE__), 'trueandco_analytics/common/locales', '*.yml').to_s]
|
18
|
+
|
19
|
+
# Add models
|
20
|
+
require "#{COMMON_PATH}/models/application_record"
|
21
|
+
Dir["#{COMMON_PATH}/models/*.rb"].each { |f| require f }
|
22
|
+
|
23
|
+
if defined?(Rails) == 'constant'
|
24
|
+
require 'sidekiq/api'
|
25
|
+
require 'sidekiq'
|
26
|
+
require 'ipaddress'
|
27
|
+
require 'browser'
|
28
|
+
require 'browser/aliases'
|
29
|
+
|
30
|
+
require "#{SITE_PATH}/controllers/application_controller"
|
31
|
+
Dir["#{SITE_PATH}/**/*.rb"].each { |f| require f }
|
32
|
+
|
33
|
+
require 'trueandco_analytics/engine'
|
34
|
+
else
|
35
|
+
Dir["#{CONSOLE_PATH}/**/*.rb"].each { |f| require f }
|
36
|
+
end
|
37
|
+
# Add service for reports
|
38
|
+
autoload :Reports, 'trueandco_analytics/common/services/reports'
|
39
|
+
# Add list of reports
|
40
|
+
autoload :ApplicationReport, 'trueandco_analytics/common/reports/application_report'
|
41
|
+
autoload :DetailsReport, 'trueandco_analytics/common/reports/details_report'
|
42
|
+
autoload :PageBuyInDateRangeReport, 'trueandco_analytics/common/reports/page_buy_in_date_range_report'
|
43
|
+
|
44
|
+
autoload :Logger, 'trueandco_analytics/common/services/logger'
|
45
|
+
autoload :Workers, 'trueandco_analytics/common/services/workers'
|
46
|
+
autoload :RedisConnect, 'trueandco_analytics/common/services/redis_connect'
|
29
47
|
|
30
48
|
def self.table_name_prefix
|
31
49
|
'metric_'
|
File without changes
|
data/{app/models/trueandco_analytics → lib/trueandco_analytics/common/models}/application_record.rb
RENAMED
File without changes
|
data/{app/models/trueandco_analytics → lib/trueandco_analytics/common/models}/metric_user.rb
RENAMED
File without changes
|
data/{app/models/trueandco_analytics → lib/trueandco_analytics/common/models}/metric_user_session.rb
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -1,14 +1,9 @@
|
|
1
|
-
report_dir = "#{TrueandcoAnalytics::ROOT}/lib/trueandco_analytics/reports"
|
2
|
-
require "#{report_dir}/application_report"
|
3
|
-
Dir["#{report_dir}/*.rb"].each do |f|
|
4
|
-
require f
|
5
|
-
end
|
6
|
-
|
7
1
|
module TrueandcoAnalytics
|
8
2
|
class Reports
|
9
3
|
include TrueandcoAnalytics::Modules::Info
|
10
4
|
|
11
5
|
def self.available_reports
|
6
|
+
Dir["#{COMMON_PATH}/reports/*.rb"].each { |f| require f }
|
12
7
|
TrueandcoAnalytics::ApplicationReport.reports
|
13
8
|
end
|
14
9
|
|
File without changes
|
@@ -8,8 +8,8 @@ module TrueandcoAnalytics
|
|
8
8
|
@time_dead_session = Rails.env.development? ? 30 : 600
|
9
9
|
end
|
10
10
|
@user_method_check = false
|
11
|
-
@
|
12
|
-
@
|
11
|
+
@buy_selector = ''
|
12
|
+
@buy_selector_check = false
|
13
13
|
@connect_redis = { redis_db: 1, }
|
14
14
|
@connect_redis_check = false
|
15
15
|
@sidekiq_configure_client_url = 'redis://localhost:6379/1'
|
@@ -41,18 +41,18 @@ module TrueandcoAnalytics
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
-
attr_reader :time_survey, :time_dead_session, :
|
44
|
+
attr_reader :time_survey, :time_dead_session, :buy_selector,
|
45
45
|
:sidekiq_configure_client_url, :sidekiq_configure_server_url, :sidekiq_configure_namespace,
|
46
46
|
:connect_db, :connect_redis
|
47
47
|
|
48
48
|
attr_writer_only_once :time_survey, :user_method,
|
49
49
|
:sidekiq_configure_client_url, :sidekiq_configure_server_url, :sidekiq_configure_namespace,
|
50
|
-
:connect_db
|
50
|
+
:connect_db, :connect_redis
|
51
51
|
|
52
|
-
def
|
52
|
+
def buy_selector=(value)
|
53
53
|
return if value.nil?
|
54
|
-
@
|
55
|
-
@
|
54
|
+
@buy_selector = value.delete('.') unless @buy_selector_check
|
55
|
+
@buy_selector_check = true
|
56
56
|
end
|
57
57
|
|
58
58
|
def user_method
|
File without changes
|
File without changes
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module TrueandcoAnalytics::ReportC
|
2
|
+
class Generate
|
3
|
+
include TrueandcoAnalytics::Modules::Info
|
4
|
+
|
5
|
+
def initialize(name: nil, format: nil, datetime_start: nil, datetime_end: nil, path: nil)
|
6
|
+
@name = name
|
7
|
+
@format = format
|
8
|
+
@datetime_start = datetime_start
|
9
|
+
@datetime_end = datetime_end
|
10
|
+
@path = path || CURRENT_PATH
|
11
|
+
end
|
12
|
+
|
13
|
+
def execute
|
14
|
+
report = ::TrueandcoAnalytics::Reports.get_report_obj(name, format, datetime_start, datetime_end)
|
15
|
+
return if report.nil? || report.data.empty?
|
16
|
+
@path += report.report_name if File.directory?(path)
|
17
|
+
dirname = File.dirname(path)
|
18
|
+
unless File.directory?(dirname)
|
19
|
+
FileUtils.mkdir_p(dirname)
|
20
|
+
end
|
21
|
+
File.open(path, 'w+') {|f| f.write(report.data)}
|
22
|
+
result(I18n.t('trueandco_analytics.result.done', path: path))
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
attr_reader :name, :format, :datetime_start, :datetime_end, :path
|
28
|
+
end
|
29
|
+
end
|
File without changes
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require "trueandco_analytics/helpers/trueandco_analytics_helper"
|
2
|
-
|
3
1
|
module TrueandcoAnalytics
|
4
2
|
|
5
3
|
class Engine < ::Rails::Engine
|
@@ -16,14 +14,12 @@ module TrueandcoAnalytics
|
|
16
14
|
initializer :action_controller do
|
17
15
|
::TrueandcoAnalytics::Workers.init
|
18
16
|
ActiveSupport.on_load(:action_controller) do
|
19
|
-
self.try(:helper, ::TrueandcoAnalytics::TrueandcoAnalyticsHelper) ||
|
20
|
-
self.try(:include, ::TrueandcoAnalytics::TrueandcoAnalyticsHelper)
|
17
|
+
self.try(:helper, ::TrueandcoAnalytics::Site::TrueandcoAnalyticsHelper) ||
|
18
|
+
self.try(:include, ::TrueandcoAnalytics::Site::TrueandcoAnalyticsHelper)
|
21
19
|
end
|
22
20
|
end
|
23
21
|
|
24
22
|
config.generators do |g|
|
25
|
-
g.test_framework :rspec, :fixture => false
|
26
|
-
g.fixture_replacement :factory_girl, :dir => 'spec/factories'
|
27
23
|
g.assets false
|
28
24
|
g.helper false
|
29
25
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module TrueandcoAnalytics::Site::MetricC
|
2
|
+
class AddList
|
3
|
+
|
4
|
+
def initialize(metric_user, session, user_session_data)
|
5
|
+
if metric_user.nil? || session.nil? || user_session_data.nil?
|
6
|
+
raise ArgumentError.new("#{self.to_s} metric_user=#{metric_user}
|
7
|
+
session=#{session} user_session_data=#{user_session_data}")
|
8
|
+
end
|
9
|
+
@metric_user = metric_user
|
10
|
+
@session = session
|
11
|
+
@user_session_data = user_session_data
|
12
|
+
end
|
13
|
+
|
14
|
+
def execute
|
15
|
+
uniq_pages = info_uniq_page
|
16
|
+
return if uniq_pages.nil?
|
17
|
+
uniq_pages.each do |page|
|
18
|
+
data = {
|
19
|
+
metric_user: metric_user,
|
20
|
+
metric_user_session: session,
|
21
|
+
page_path: page['page_path'],
|
22
|
+
user_action: page['clicks']['clickDetails'].to_json,
|
23
|
+
time_s: page['time']['timeOnPage'],
|
24
|
+
is_buy: page['clicks']['clickDetails'].length > 0
|
25
|
+
}
|
26
|
+
::TrueandcoAnalytics::MetricUserVisit.create(data)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
attr_reader :metric_user, :session, :user_session_data
|
33
|
+
|
34
|
+
def info_uniq_page
|
35
|
+
length = user_session_data.length
|
36
|
+
return user_session_data if length < 2
|
37
|
+
results = []
|
38
|
+
page = user_session_data[0]['page_path']
|
39
|
+
clickDetails = []
|
40
|
+
index = 0
|
41
|
+
while index < length - 1
|
42
|
+
unless user_session_data[index]['clicks']['clickDetails'].empty?
|
43
|
+
clickDetails = user_session_data[index]['clicks']['clickDetails']
|
44
|
+
end
|
45
|
+
index += 1
|
46
|
+
unless page == user_session_data[index]['page_path']
|
47
|
+
data = user_session_data[index - 1]
|
48
|
+
data['clicks']['clickDetails'] = clickDetails
|
49
|
+
results << data
|
50
|
+
page = user_session_data[index]['page_path']
|
51
|
+
clickDetails = []
|
52
|
+
end
|
53
|
+
end
|
54
|
+
data = user_session_data[index]
|
55
|
+
unless data['clicks']['clickDetails'].empty?
|
56
|
+
clickDetails = data['clicks']['clickDetails']
|
57
|
+
end
|
58
|
+
data['clicks']['clickDetails'] = clickDetails
|
59
|
+
results << data
|
60
|
+
results
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module TrueandcoAnalytics::Site::SessionC
|
2
|
+
class Create
|
3
|
+
def initialize(metric_user, first_point, timestamp_end, request_info)
|
4
|
+
|
5
|
+
if metric_user.nil? || first_point.nil? || timestamp_end.nil? ||request_info.nil?
|
6
|
+
raise ArgumentError.new("#{self.to_s} metric_user=#{metric_user}
|
7
|
+
first_point=#{first_point} timestamp_end=#{timestamp_end} request_info=#{request_info}")
|
8
|
+
end
|
9
|
+
|
10
|
+
@metric_user = metric_user
|
11
|
+
@ip = request_info['remote_ip']
|
12
|
+
@user_agent = request_info['user_agent']
|
13
|
+
@session_start = first_point['time']['timestamp']
|
14
|
+
@referer = first_point['userReferrer']
|
15
|
+
@live_time_s = timestamp_end - @session_start
|
16
|
+
end
|
17
|
+
|
18
|
+
def execute
|
19
|
+
Browser::Base.include(Browser::Aliases)
|
20
|
+
browser = Browser.new(user_agent, accept_language: "en-us")
|
21
|
+
data = {
|
22
|
+
metric_user: metric_user,
|
23
|
+
user_agent: user_agent,
|
24
|
+
referer: referer,
|
25
|
+
session_start: datetime_session_start,
|
26
|
+
live_time_s: 60,
|
27
|
+
ip_4: ip_v4(ip),
|
28
|
+
ip_6: ip_v6(ip),
|
29
|
+
browser: browser.name,
|
30
|
+
is_mobile: browser.mobile? || false
|
31
|
+
}
|
32
|
+
::TrueandcoAnalytics::MetricUserSession.create(data)
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
attr_reader :metric_user, :ip, :user_agent, :session_start, :live_time_s, :referer
|
38
|
+
|
39
|
+
def datetime_session_start
|
40
|
+
DateTime.strptime(session_start.to_s, '%s')
|
41
|
+
end
|
42
|
+
|
43
|
+
def ip_v4(ip)
|
44
|
+
ip_o = get_ip_object(ip)
|
45
|
+
result = 0
|
46
|
+
result = ip_o.to_i if ip_o.ipv4?
|
47
|
+
result
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
def ip_v6(ip)
|
52
|
+
ip_o = get_ip_object(ip)
|
53
|
+
result = 0
|
54
|
+
result = ip_o.data if ip_o.ipv6?
|
55
|
+
result
|
56
|
+
end
|
57
|
+
|
58
|
+
def get_ip_object(ip)
|
59
|
+
@ip_o ||= IPAddress.parse ip
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module TrueandcoAnalytics::Site::SessionC
|
2
|
+
class PutData
|
3
|
+
|
4
|
+
def initialize(json_data, request_info, userInfo)
|
5
|
+
@json_data = json_data
|
6
|
+
@userInfo = userInfo
|
7
|
+
@request_info = request_info
|
8
|
+
@redis = ::TrueandcoAnalytics::RedisConnect.get
|
9
|
+
@time_survey = ::TrueandcoAnalytics::Config::Params.time_survey
|
10
|
+
@time_dead_session = ::TrueandcoAnalytics::Config::Params.time_dead_session
|
11
|
+
end
|
12
|
+
|
13
|
+
def execute
|
14
|
+
1.times do
|
15
|
+
break if userInfo.nil? || userInfo.empty?
|
16
|
+
user_key = ::FNV.new.fnv1_32 userInfo.to_s
|
17
|
+
mange_job(user_key)
|
18
|
+
redis.rpush(user_key, json_data)
|
19
|
+
redis.expire(user_key, time_dead_session + 3)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
attr_reader :json_data, :userInfo, :request_info, :redis, :time_dead_session, :time_survey
|
26
|
+
|
27
|
+
def datetime_dead_session
|
28
|
+
::DateTime.now + time_dead_session.seconds
|
29
|
+
end
|
30
|
+
|
31
|
+
def mange_job(user_key)
|
32
|
+
user_job_key = "#{user_key}:job_key"
|
33
|
+
unless redis.exists user_job_key
|
34
|
+
create_job(user_key, user_job_key)
|
35
|
+
end
|
36
|
+
if redis.ttl(user_job_key) < time_survey * 3
|
37
|
+
job_id = redis.get(user_job_key)
|
38
|
+
Sidekiq::ScheduledSet.new.find_job(job_id)&.delete
|
39
|
+
create_job(user_key, user_job_key)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def create_job(user_key, user_job_key)
|
44
|
+
job_id = ::TrueandcoAnalytics::Site::UserSessionMetricWorker.perform_at(time_dead_session.seconds.from_now, user_key, request_info)
|
45
|
+
redis.setex(user_job_key, time_dead_session, job_id)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module TrueandcoAnalytics::Site::UserC
|
2
|
+
class CreateOrUpdateUserIfExist
|
3
|
+
|
4
|
+
def initialize(user_agent, timestamp_end)
|
5
|
+
if user_agent.nil? || timestamp_end.nil?
|
6
|
+
raise ArgumentError.new("#{self.to_s} user_agent=#{user_agent} timestamp_end=#{timestamp_end}")
|
7
|
+
end
|
8
|
+
@user_agent = user_agent
|
9
|
+
@timestamp_end = timestamp_end
|
10
|
+
@user_id = ::TrueandcoAnalytics::Config::Params.user_method&.id
|
11
|
+
end
|
12
|
+
|
13
|
+
def execute
|
14
|
+
user = nil
|
15
|
+
user = ::TrueandcoAnalytics::MetricUser.find_by(user_id: user_id) if user_id
|
16
|
+
user = ::TrueandcoAnalytics::MetricUser.find_by(hash_id: hash_id) if user.nil?
|
17
|
+
user = if user.nil?
|
18
|
+
::TrueandcoAnalytics::MetricUser.create(user_id: user_id || 0, datetime_create: datetime_end,
|
19
|
+
last_active_datetime: datetime_end, hash_id: hash_id)
|
20
|
+
else
|
21
|
+
user.update_attribute(:last_active_datetime, datetime_end)
|
22
|
+
user
|
23
|
+
end
|
24
|
+
user
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
attr_reader :user_agent, :timestamp_end, :user_id
|
30
|
+
|
31
|
+
def datetime_end
|
32
|
+
DateTime.strptime(timestamp_end.to_s, '%s')
|
33
|
+
end
|
34
|
+
|
35
|
+
def hash_id
|
36
|
+
@hash_id ||= FNV.new.fnv1_32(user_agent)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|