ahoy_matey 1.5.3 → 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +88 -0
  3. data/CONTRIBUTING.md +42 -0
  4. data/LICENSE.txt +1 -1
  5. data/README.md +369 -380
  6. data/app/controllers/ahoy/base_controller.rb +15 -15
  7. data/app/controllers/ahoy/events_controller.rb +8 -2
  8. data/app/controllers/ahoy/visits_controller.rb +8 -1
  9. data/app/jobs/ahoy/geocode_job.rb +10 -0
  10. data/app/jobs/ahoy/geocode_v2_job.rb +28 -0
  11. data/config/routes.rb +1 -1
  12. data/lib/ahoy.rb +68 -86
  13. data/lib/ahoy/base_store.rb +97 -0
  14. data/lib/ahoy/controller.rb +26 -17
  15. data/lib/ahoy/database_store.rb +89 -0
  16. data/lib/ahoy/engine.rb +7 -7
  17. data/lib/ahoy/helper.rb +40 -0
  18. data/lib/ahoy/model.rb +5 -27
  19. data/lib/ahoy/{properties.rb → query_methods.rb} +25 -9
  20. data/lib/ahoy/tracker.rb +101 -42
  21. data/lib/ahoy/utils.rb +7 -0
  22. data/lib/ahoy/version.rb +1 -1
  23. data/lib/ahoy/visit_properties.rb +99 -37
  24. data/lib/generators/ahoy/activerecord_generator.rb +41 -0
  25. data/lib/generators/ahoy/base_generator.rb +13 -0
  26. data/lib/generators/ahoy/install_generator.rb +44 -0
  27. data/lib/generators/ahoy/mongoid_generator.rb +16 -0
  28. data/lib/generators/ahoy/templates/active_record_event_model.rb.tt +10 -0
  29. data/lib/generators/ahoy/templates/active_record_migration.rb.tt +62 -0
  30. data/lib/generators/ahoy/templates/active_record_visit_model.rb.tt +6 -0
  31. data/lib/generators/ahoy/templates/base_store_initializer.rb.tt +20 -0
  32. data/lib/generators/ahoy/templates/database_store_initializer.rb.tt +5 -0
  33. data/lib/generators/ahoy/{stores/templates/mongoid_event_model.rb → templates/mongoid_event_model.rb.tt} +4 -2
  34. data/lib/generators/ahoy/{stores/templates/mongoid_visit_model.rb → templates/mongoid_visit_model.rb.tt} +15 -9
  35. data/vendor/assets/javascripts/ahoy.js +336 -113
  36. metadata +54 -144
  37. data/.gitignore +0 -17
  38. data/Gemfile +0 -6
  39. data/Rakefile +0 -8
  40. data/ahoy_matey.gemspec +0 -38
  41. data/lib/ahoy/deckhands/location_deckhand.rb +0 -49
  42. data/lib/ahoy/deckhands/request_deckhand.rb +0 -52
  43. data/lib/ahoy/deckhands/technology_deckhand.rb +0 -47
  44. data/lib/ahoy/deckhands/traffic_source_deckhand.rb +0 -22
  45. data/lib/ahoy/deckhands/utm_parameter_deckhand.rb +0 -23
  46. data/lib/ahoy/geocode_job.rb +0 -13
  47. data/lib/ahoy/logger_silencer.rb +0 -75
  48. data/lib/ahoy/stores/active_record_store.rb +0 -60
  49. data/lib/ahoy/stores/active_record_token_store.rb +0 -113
  50. data/lib/ahoy/stores/base_store.rb +0 -88
  51. data/lib/ahoy/stores/bunny_store.rb +0 -33
  52. data/lib/ahoy/stores/fluentd_store.rb +0 -17
  53. data/lib/ahoy/stores/kafka_store.rb +0 -40
  54. data/lib/ahoy/stores/kinesis_firehose_store.rb +0 -42
  55. data/lib/ahoy/stores/log_store.rb +0 -53
  56. data/lib/ahoy/stores/mongoid_store.rb +0 -63
  57. data/lib/ahoy/subscribers/active_record.rb +0 -19
  58. data/lib/ahoy/throttle.rb +0 -17
  59. data/lib/generators/ahoy/stores/active_record_events_generator.rb +0 -53
  60. data/lib/generators/ahoy/stores/active_record_generator.rb +0 -16
  61. data/lib/generators/ahoy/stores/active_record_visits_generator.rb +0 -43
  62. data/lib/generators/ahoy/stores/bunny_generator.rb +0 -15
  63. data/lib/generators/ahoy/stores/custom_generator.rb +0 -15
  64. data/lib/generators/ahoy/stores/fluentd_generator.rb +0 -15
  65. data/lib/generators/ahoy/stores/kafka_generator.rb +0 -15
  66. data/lib/generators/ahoy/stores/kinesis_firehose_generator.rb +0 -15
  67. data/lib/generators/ahoy/stores/log_generator.rb +0 -15
  68. data/lib/generators/ahoy/stores/mongoid_events_generator.rb +0 -19
  69. data/lib/generators/ahoy/stores/mongoid_generator.rb +0 -14
  70. data/lib/generators/ahoy/stores/mongoid_visits_generator.rb +0 -27
  71. data/lib/generators/ahoy/stores/templates/active_record_event_model.rb +0 -12
  72. data/lib/generators/ahoy/stores/templates/active_record_events_migration.rb +0 -19
  73. data/lib/generators/ahoy/stores/templates/active_record_initializer.rb +0 -3
  74. data/lib/generators/ahoy/stores/templates/active_record_visit_model.rb +0 -4
  75. data/lib/generators/ahoy/stores/templates/active_record_visits_migration.rb +0 -57
  76. data/lib/generators/ahoy/stores/templates/bunny_initializer.rb +0 -9
  77. data/lib/generators/ahoy/stores/templates/custom_initializer.rb +0 -10
  78. data/lib/generators/ahoy/stores/templates/fluentd_initializer.rb +0 -3
  79. data/lib/generators/ahoy/stores/templates/kafka_initializer.rb +0 -9
  80. data/lib/generators/ahoy/stores/templates/kinesis_firehose_initializer.rb +0 -17
  81. data/lib/generators/ahoy/stores/templates/log_initializer.rb +0 -3
  82. data/lib/generators/ahoy/stores/templates/mongoid_initializer.rb +0 -3
  83. data/test/properties/mysql_json_test.rb +0 -18
  84. data/test/properties/mysql_text_test.rb +0 -19
  85. data/test/properties/postgresql_hstore_test.rb +0 -18
  86. data/test/properties/postgresql_json_test.rb +0 -18
  87. data/test/properties/postgresql_jsonb_test.rb +0 -18
  88. data/test/properties/postgresql_text_test.rb +0 -19
  89. data/test/test_helper.rb +0 -99
  90. data/test/visit_properties_test.rb +0 -44
@@ -1,15 +0,0 @@
1
- require "rails/generators"
2
-
3
- module Ahoy
4
- module Stores
5
- module Generators
6
- class FluentdGenerator < Rails::Generators::Base
7
- source_root File.expand_path("../templates", __FILE__)
8
-
9
- def create_initializer
10
- template "fluentd_initializer.rb", "config/initializers/ahoy.rb"
11
- end
12
- end
13
- end
14
- end
15
- end
@@ -1,15 +0,0 @@
1
- require "rails/generators"
2
-
3
- module Ahoy
4
- module Stores
5
- module Generators
6
- class KafkaGenerator < Rails::Generators::Base
7
- source_root File.expand_path("../templates", __FILE__)
8
-
9
- def create_initializer
10
- template "kafka_initializer.rb", "config/initializers/ahoy.rb"
11
- end
12
- end
13
- end
14
- end
15
- end
@@ -1,15 +0,0 @@
1
- require "rails/generators"
2
-
3
- module Ahoy
4
- module Stores
5
- module Generators
6
- class KinesisFirehoseGenerator < Rails::Generators::Base
7
- source_root File.expand_path("../templates", __FILE__)
8
-
9
- def create_initializer
10
- template "kinesis_firehose_initializer.rb", "config/initializers/ahoy.rb"
11
- end
12
- end
13
- end
14
- end
15
- end
@@ -1,15 +0,0 @@
1
- require "rails/generators"
2
-
3
- module Ahoy
4
- module Stores
5
- module Generators
6
- class LogGenerator < Rails::Generators::Base
7
- source_root File.expand_path("../templates", __FILE__)
8
-
9
- def create_initializer
10
- template "log_initializer.rb", "config/initializers/ahoy.rb"
11
- end
12
- end
13
- end
14
- end
15
- end
@@ -1,19 +0,0 @@
1
- require "rails/generators"
2
-
3
- module Ahoy
4
- module Stores
5
- module Generators
6
- class MongoidEventsGenerator < Rails::Generators::Base
7
- source_root File.expand_path("../templates", __FILE__)
8
-
9
- def generate_model
10
- template "mongoid_event_model.rb", "app/models/ahoy/event.rb"
11
- end
12
-
13
- def create_initializer
14
- template "mongoid_initializer.rb", "config/initializers/ahoy.rb"
15
- end
16
- end
17
- end
18
- end
19
- end
@@ -1,14 +0,0 @@
1
- require "rails/generators"
2
-
3
- module Ahoy
4
- module Stores
5
- module Generators
6
- class MongoidGenerator < Rails::Generators::Base
7
- def boom
8
- invoke "ahoy:stores:mongoid_visits"
9
- invoke "ahoy:stores:mongoid_events"
10
- end
11
- end
12
- end
13
- end
14
- end
@@ -1,27 +0,0 @@
1
- require "rails/generators"
2
-
3
- module Ahoy
4
- module Stores
5
- module Generators
6
- class MongoidVisitsGenerator < Rails::Generators::Base
7
- source_root File.expand_path("../templates", __FILE__)
8
-
9
- def generate_model
10
- @visitor_id_type =
11
- if defined?(::BSON)
12
- "BSON::Binary"
13
- elsif defined?(::Moped::BSON)
14
- "Moped::BSON::Binary"
15
- else
16
- "String"
17
- end
18
- template "mongoid_visit_model.rb", "app/models/visit.rb"
19
- end
20
-
21
- def create_initializer
22
- template "mongoid_initializer.rb", "config/initializers/ahoy.rb"
23
- end
24
- end
25
- end
26
- end
27
- end
@@ -1,12 +0,0 @@
1
- module Ahoy
2
- class Event < ActiveRecord::Base
3
- include Ahoy::Properties
4
-
5
- self.table_name = "ahoy_events"
6
-
7
- belongs_to :visit
8
- belongs_to :user<%= Rails::VERSION::MAJOR >= 5 ? ", optional: true" : nil %><% unless %w(postgresql postgresql-jsonb).include?(@database) %>
9
-
10
- serialize :properties, JSON<% end %>
11
- end
12
- end
@@ -1,19 +0,0 @@
1
- class <%= migration_class_name %> < ActiveRecord::Migration
2
- def change
3
- create_table :ahoy_events do |t|
4
- t.integer :visit_id
5
-
6
- # user
7
- t.integer :user_id
8
- # add t.string :user_type if polymorphic
9
-
10
- t.string :name
11
- t.<% case @database when "postgresql" %>json<% when "postgresql-jsonb" %>jsonb<% else %>text<% end %> :properties
12
- t.timestamp :time
13
- end
14
-
15
- add_index :ahoy_events, [:visit_id, :name]
16
- add_index :ahoy_events, [:user_id, :name]
17
- add_index :ahoy_events, [:name, :time]
18
- end
19
- end
@@ -1,3 +0,0 @@
1
- class Ahoy::Store < Ahoy::Stores::ActiveRecordTokenStore
2
- # customize here
3
- end
@@ -1,4 +0,0 @@
1
- class Visit < ActiveRecord::Base
2
- has_many :ahoy_events, class_name: "Ahoy::Event"
3
- belongs_to :user<%= Rails::VERSION::MAJOR >= 5 ? ", optional: true" : nil %>
4
- end
@@ -1,57 +0,0 @@
1
- class <%= migration_class_name %> < ActiveRecord::Migration
2
- def change
3
- create_table :visits do |t|
4
- t.string :visit_token
5
- t.string :visitor_token
6
-
7
- # the rest are recommended but optional
8
- # simply remove the columns you don't want
9
-
10
- # standard
11
- t.string :ip
12
- t.text :user_agent
13
- t.text :referrer
14
- t.text :landing_page
15
-
16
- # user
17
- t.integer :user_id
18
- # add t.string :user_type if polymorphic
19
-
20
- # traffic source
21
- t.string :referring_domain
22
- t.string :search_keyword
23
-
24
- # technology
25
- t.string :browser
26
- t.string :os
27
- t.string :device_type
28
- t.integer :screen_height
29
- t.integer :screen_width
30
-
31
- # location
32
- t.string :country
33
- t.string :region
34
- t.string :city
35
- t.string :postal_code
36
- t.decimal :latitude
37
- t.decimal :longitude
38
-
39
- # utm parameters
40
- t.string :utm_source
41
- t.string :utm_medium
42
- t.string :utm_term
43
- t.string :utm_content
44
- t.string :utm_campaign
45
-
46
- # native apps
47
- # t.string :platform
48
- # t.string :app_version
49
- # t.string :os_version
50
-
51
- t.timestamp :started_at
52
- end
53
-
54
- add_index :visits, [:visit_token], unique: true
55
- add_index :visits, [:user_id]
56
- end
57
- end
@@ -1,9 +0,0 @@
1
- class Ahoy::Store < Ahoy::Stores::BunnyStore
2
- def visits_queue
3
- "ahoy_visits"
4
- end
5
-
6
- def events_queue
7
- "ahoy_events"
8
- end
9
- end
@@ -1,10 +0,0 @@
1
- class Ahoy::Store < Ahoy::Stores::BaseStore
2
- def track_visit(options)
3
- end
4
-
5
- def track_event(name, properties, options)
6
- end
7
-
8
- def current_visit
9
- end
10
- end
@@ -1,3 +0,0 @@
1
- class Ahoy::Store < Ahoy::Stores::FluentdStore
2
- # customize here
3
- end
@@ -1,9 +0,0 @@
1
- class Ahoy::Store < Ahoy::Stores::KafkaStore
2
- def visits_topic
3
- "ahoy_visits"
4
- end
5
-
6
- def events_topic
7
- "ahoy_events"
8
- end
9
- end
@@ -1,17 +0,0 @@
1
- class Ahoy::Store < Ahoy::Stores::KinesisFirehoseStore
2
- def credentials
3
- {
4
- access_key_id: ENV["AWS_ACCESS_KEY_ID"],
5
- secret_access_key: ENV["AWS_SECRET_ACCESS_KEY"],
6
- region: "us-east-1"
7
- }
8
- end
9
-
10
- def visits_stream
11
- "ahoy_visits"
12
- end
13
-
14
- def events_stream
15
- "ahoy_events"
16
- end
17
- end
@@ -1,3 +0,0 @@
1
- class Ahoy::Store < Ahoy::Stores::LogStore
2
- # customize here
3
- end
@@ -1,3 +0,0 @@
1
- class Ahoy::Store < Ahoy::Stores::MongoidStore
2
- # customize here
3
- end
@@ -1,18 +0,0 @@
1
- require_relative "../test_helper"
2
-
3
- ActiveRecord::Base.establish_connection adapter: "mysql2", username: "root", database: "ahoy_test"
4
-
5
- ActiveRecord::Migration.create_table :mysql_json_events, force: true do |t|
6
- t.json :properties
7
- end
8
-
9
- class MysqlJsonEvent < MysqlBase
10
- end
11
-
12
- class MysqlJsonTest < Minitest::Test
13
- include PropertiesTest
14
-
15
- def model
16
- MysqlJsonEvent
17
- end
18
- end
@@ -1,19 +0,0 @@
1
- require_relative "../test_helper"
2
-
3
- ActiveRecord::Base.establish_connection adapter: "mysql2", username: "root", database: "ahoy_test"
4
-
5
- ActiveRecord::Migration.create_table :mysql_text_events, force: true do |t|
6
- t.text :properties
7
- end
8
-
9
- class MysqlTextEvent < MysqlBase
10
- serialize :properties, JSON
11
- end
12
-
13
- class MysqlTextTest < Minitest::Test
14
- include PropertiesTest
15
-
16
- def model
17
- MysqlTextEvent
18
- end
19
- end
@@ -1,18 +0,0 @@
1
- require_relative "../test_helper"
2
-
3
- ActiveRecord::Base.establish_connection adapter: "postgresql", database: "ahoy_test"
4
-
5
- ActiveRecord::Migration.create_table :postgresql_hstore_events, force: true do |t|
6
- t.hstore :properties
7
- end
8
-
9
- class PostgresqlHstoreEvent < PostgresqlBase
10
- end
11
-
12
- class PostgresqlHstoreTest < Minitest::Test
13
- include PropertiesTest
14
-
15
- def model
16
- PostgresqlHstoreEvent
17
- end
18
- end
@@ -1,18 +0,0 @@
1
- require_relative "../test_helper"
2
-
3
- ActiveRecord::Base.establish_connection adapter: "postgresql", database: "ahoy_test"
4
-
5
- ActiveRecord::Migration.create_table :postgresql_json_events, force: true do |t|
6
- t.json :properties
7
- end
8
-
9
- class PostgresqlJsonEvent < PostgresqlBase
10
- end
11
-
12
- class PostgresqlJsonTest < Minitest::Test
13
- include PropertiesTest
14
-
15
- def model
16
- PostgresqlJsonEvent
17
- end
18
- end
@@ -1,18 +0,0 @@
1
- require_relative "../test_helper"
2
-
3
- ActiveRecord::Base.establish_connection adapter: "postgresql", database: "ahoy_test"
4
-
5
- ActiveRecord::Migration.create_table :postgresql_jsonb_events, force: true do |t|
6
- t.jsonb :properties
7
- end
8
-
9
- class PostgresqlJsonbEvent < PostgresqlBase
10
- end
11
-
12
- class PostgresqlJsonbTest < Minitest::Test
13
- include PropertiesTest
14
-
15
- def model
16
- PostgresqlJsonbEvent
17
- end
18
- end
@@ -1,19 +0,0 @@
1
- require_relative "../test_helper"
2
-
3
- ActiveRecord::Base.establish_connection adapter: "postgresql", database: "ahoy_test"
4
-
5
- ActiveRecord::Migration.create_table :postgresql_text_events, force: true do |t|
6
- t.text :properties
7
- end
8
-
9
- class PostgresqlTextEvent < PostgresqlBase
10
- serialize :properties, JSON
11
- end
12
-
13
- class PostgresqlTextTest < Minitest::Test
14
- include PropertiesTest
15
-
16
- def model
17
- PostgresqlTextEvent
18
- end
19
- end
data/test/test_helper.rb DELETED
@@ -1,99 +0,0 @@
1
- require "bundler/setup"
2
- Bundler.require(:default)
3
- require "minitest/autorun"
4
- require "minitest/pride"
5
- require "active_record"
6
-
7
- ActiveRecord::Base.logger = ActiveSupport::Logger.new(STDOUT) if ENV["VERBOSE"]
8
-
9
- class PostgresqlBase < ActiveRecord::Base
10
- include Ahoy::Properties
11
- establish_connection adapter: "postgresql", database: "ahoy_test"
12
- self.abstract_class = true
13
- end
14
-
15
- class MysqlBase < ActiveRecord::Base
16
- include Ahoy::Properties
17
- establish_connection adapter: "mysql2", username: "root", database: "ahoy_test"
18
- self.abstract_class = true
19
- end
20
-
21
- module PropertiesTest
22
- def setup
23
- model.delete_all
24
- end
25
-
26
- def test_empty
27
- assert_equal 0, count_events({})
28
- end
29
-
30
- def test_string
31
- create_event value: "world"
32
- assert_equal 1, count_events(value: "world")
33
- end
34
-
35
- def test_number
36
- create_event value: 1
37
- assert_equal 1, count_events(value: 1)
38
- end
39
-
40
- def test_date
41
- today = Date.today
42
- create_event value: today
43
- assert_equal 1, count_events(value: today)
44
- end
45
-
46
- def test_time
47
- now = Time.now
48
- create_event value: now
49
- assert_equal 1, count_events(value: now)
50
- end
51
-
52
- def test_true
53
- create_event value: true
54
- assert_equal 1, count_events(value: true)
55
- end
56
-
57
- def test_false
58
- create_event value: false
59
- assert_equal 1, count_events(value: false)
60
- end
61
-
62
- def test_nil
63
- create_event value: nil
64
- assert_equal 1, count_events(value: nil)
65
- end
66
-
67
- def test_any
68
- create_event hello: "world", prop2: "hi"
69
- assert_equal 1, count_events(hello: "world")
70
- end
71
-
72
- def test_multiple
73
- create_event prop1: "hi", prop2: "bye"
74
- assert_equal 1, count_events(prop1: "hi", prop2: "bye")
75
- end
76
-
77
- def test_multiple_order
78
- create_event prop2: "bye", prop1: "hi"
79
- assert_equal 1, count_events(prop1: "hi", prop2: "bye")
80
- end
81
-
82
- def test_partial
83
- create_event hello: "world"
84
- assert_equal 0, count_events(hello: "world", prop2: "hi")
85
- end
86
-
87
- def test_prefix
88
- create_event value: 123
89
- assert_equal 0, count_events(value: 1)
90
- end
91
-
92
- def create_event(properties)
93
- model.create(properties: properties)
94
- end
95
-
96
- def count_events(properties)
97
- model.where_properties(properties).count
98
- end
99
- end