ahoy_matey 2.0.0 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +112 -37
  3. data/CONTRIBUTING.md +9 -7
  4. data/LICENSE.txt +1 -1
  5. data/README.md +377 -63
  6. data/app/controllers/ahoy/base_controller.rb +14 -10
  7. data/app/controllers/ahoy/events_controller.rb +1 -1
  8. data/app/controllers/ahoy/visits_controller.rb +1 -0
  9. data/app/jobs/ahoy/geocode_v2_job.rb +3 -4
  10. data/lib/ahoy.rb +57 -2
  11. data/lib/ahoy/base_store.rb +32 -3
  12. data/lib/ahoy/controller.rb +21 -8
  13. data/lib/ahoy/database_store.rb +33 -16
  14. data/lib/ahoy/engine.rb +3 -1
  15. data/lib/ahoy/helper.rb +40 -0
  16. data/lib/ahoy/model.rb +2 -2
  17. data/lib/ahoy/query_methods.rb +46 -1
  18. data/lib/ahoy/tracker.rb +59 -27
  19. data/lib/ahoy/utils.rb +7 -0
  20. data/lib/ahoy/version.rb +1 -1
  21. data/lib/ahoy/visit_properties.rb +73 -37
  22. data/lib/generators/ahoy/activerecord_generator.rb +17 -26
  23. data/lib/generators/ahoy/base_generator.rb +1 -1
  24. data/lib/generators/ahoy/install_generator.rb +1 -1
  25. data/lib/generators/ahoy/mongoid_generator.rb +1 -5
  26. data/lib/generators/ahoy/templates/active_record_event_model.rb.tt +10 -0
  27. data/lib/generators/ahoy/templates/{active_record_migration.rb → active_record_migration.rb.tt} +14 -7
  28. data/lib/generators/ahoy/templates/active_record_visit_model.rb.tt +6 -0
  29. data/lib/generators/ahoy/templates/{base_store_initializer.rb → base_store_initializer.rb.tt} +8 -0
  30. data/lib/generators/ahoy/templates/database_store_initializer.rb.tt +10 -0
  31. data/lib/generators/ahoy/templates/{mongoid_event_model.rb → mongoid_event_model.rb.tt} +1 -1
  32. data/lib/generators/ahoy/templates/{mongoid_visit_model.rb → mongoid_visit_model.rb.tt} +9 -7
  33. data/vendor/assets/javascripts/ahoy.js +539 -552
  34. metadata +27 -204
  35. data/.github/ISSUE_TEMPLATE.md +0 -7
  36. data/.gitignore +0 -17
  37. data/Gemfile +0 -6
  38. data/Rakefile +0 -9
  39. data/ahoy_matey.gemspec +0 -36
  40. data/docs/Ahoy-2-Upgrade.md +0 -147
  41. data/docs/Data-Store-Examples.md +0 -240
  42. data/lib/generators/ahoy/templates/active_record_event_model.rb +0 -10
  43. data/lib/generators/ahoy/templates/active_record_visit_model.rb +0 -6
  44. data/lib/generators/ahoy/templates/database_store_initializer.rb +0 -5
  45. data/test/query_methods/mongoid_test.rb +0 -23
  46. data/test/query_methods/mysql_json_test.rb +0 -18
  47. data/test/query_methods/mysql_text_test.rb +0 -19
  48. data/test/query_methods/postgresql_hstore_test.rb +0 -20
  49. data/test/query_methods/postgresql_json_test.rb +0 -18
  50. data/test/query_methods/postgresql_jsonb_test.rb +0 -19
  51. data/test/query_methods/postgresql_text_test.rb +0 -19
  52. data/test/test_helper.rb +0 -100
@@ -1,240 +0,0 @@
1
- # Data Store Examples
2
-
3
- - [Kafka](#kafka)
4
- - [RabbitMQ](#rabbitmq)
5
- - [Fluentd](#fluentd)
6
- - [NATS](#nats)
7
- - [NSQ](#nsq)
8
- - [Amazon Kinesis Firehose](#amazon-kinesis-firehose)
9
-
10
- ### Kafka
11
-
12
- Add [ruby-kafka](https://github.com/zendesk/ruby-kafka) to your Gemfile.
13
-
14
- ```ruby
15
- class Ahoy::Store < Ahoy::BaseStore
16
- def track_visit(data)
17
- post("ahoy_visits", data)
18
- end
19
-
20
- def track_event(data)
21
- post("ahoy_events", data)
22
- end
23
-
24
- def geocode(data)
25
- post("ahoy_geocode", data)
26
- end
27
-
28
- def authenticate(data)
29
- post("ahoy_auth", data)
30
- end
31
-
32
- private
33
-
34
- def post(topic, data)
35
- producer.produce(data.to_json, topic: topic)
36
- end
37
-
38
- def producer
39
- @producer ||= begin
40
- client =
41
- Kafka.new(
42
- seed_brokers: ENV["KAFKA_URL"] || "localhost:9092",
43
- logger: Rails.logger
44
- )
45
- producer = client.async_producer(delivery_interval: 3)
46
- at_exit { producer.shutdown }
47
- producer
48
- end
49
- end
50
- end
51
- ```
52
-
53
- ### RabbitMQ
54
-
55
- Add [bunny](https://github.com/ruby-amqp/bunny) to your Gemfile.
56
-
57
- ```ruby
58
- class Ahoy::Store < Ahoy::BaseStore
59
- def track_visit(data)
60
- post("ahoy_visits", data)
61
- end
62
-
63
- def track_event(data)
64
- post("ahoy_events", data)
65
- end
66
-
67
- def geocode(data)
68
- post("ahoy_geocode", data)
69
- end
70
-
71
- def authenticate(data)
72
- post("ahoy_auth", data)
73
- end
74
-
75
- private
76
-
77
- def post(topic, message)
78
- channel.queue(topic, durable: true).publish(message.to_json)
79
- end
80
-
81
- def channel
82
- @channel ||= begin
83
- conn = Bunny.new
84
- conn.start
85
- conn.create_channel
86
- end
87
- end
88
- end
89
- ```
90
-
91
- ### Fluentd
92
-
93
- Add [fluent-logger](https://github.com/fluent/fluent-logger-ruby) to your Gemfile.
94
-
95
- ```ruby
96
- class Ahoy::Store < Ahoy::BaseStore
97
- def track_visit(data)
98
- post("ahoy_visits", data)
99
- end
100
-
101
- def track_event(data)
102
- post("ahoy_events", data)
103
- end
104
-
105
- def geocode(data)
106
- post("ahoy_geocode", data)
107
- end
108
-
109
- def authenticate(data)
110
- post("ahoy_auth", data)
111
- end
112
-
113
- private
114
-
115
- def post(topic, message)
116
- logger.post(topic, message)
117
- end
118
-
119
- def logger
120
- @logger ||= Fluent::Logger::FluentLogger.new("ahoy", host: "localhost", port: 24224)
121
- end
122
- end
123
- ```
124
-
125
- ### NATS
126
-
127
- Add [nats-pure](https://github.com/nats-io/pure-ruby-nats) to your Gemfile.
128
-
129
- ```ruby
130
- class Ahoy::Store < Ahoy::BaseStore
131
- def track_visit(data)
132
- post("ahoy_visits", data)
133
- end
134
-
135
- def track_event(data)
136
- post("ahoy_events", data)
137
- end
138
-
139
- def geocode(data)
140
- post("ahoy_geocode", data)
141
- end
142
-
143
- def authenticate(data)
144
- post("ahoy_auth", data)
145
- end
146
-
147
- private
148
-
149
- def post(topic, data)
150
- client.publish(topic, data.to_json)
151
- end
152
-
153
- def client
154
- @client ||= begin
155
- require "nats/io/client"
156
- client = NATS::IO::Client.new
157
- client.connect(servers: (ENV["NATS_URL"] || "nats://127.0.0.1:4222").split(","))
158
- client
159
- end
160
- end
161
- end
162
- ```
163
-
164
- ### NSQ
165
-
166
- Add [nsq-ruby](https://github.com/wistia/nsq-ruby) to your Gemfile.
167
-
168
- ```ruby
169
- class Ahoy::Store < Ahoy::BaseStore
170
- def track_visit(data)
171
- post("ahoy_visits", data)
172
- end
173
-
174
- def track_event(data)
175
- post("ahoy_events", data)
176
- end
177
-
178
- def geocode(data)
179
- post("ahoy_geocode", data)
180
- end
181
-
182
- def authenticate(data)
183
- post("ahoy_auth", data)
184
- end
185
-
186
- private
187
-
188
- def post(topic, data)
189
- client.write_to_topic(topic, data.to_json)
190
- end
191
-
192
- def client
193
- @client ||= begin
194
- require "nsq"
195
- client = Nsq::Producer.new(
196
- nsqd: ENV["NSQ_URL"] || "127.0.0.1:4150"
197
- )
198
- at_exit { client.terminate }
199
- client
200
- end
201
- end
202
- end
203
- ```
204
-
205
- ### Amazon Kinesis Firehose
206
-
207
- Add [aws-sdk-firehose](https://github.com/aws/aws-sdk-ruby) to your Gemfile.
208
-
209
- ```ruby
210
- class Ahoy::Store < Ahoy::BaseStore
211
- def track_visit(data)
212
- post("ahoy_visits", data)
213
- end
214
-
215
- def track_event(data)
216
- post("ahoy_events", data)
217
- end
218
-
219
- def geocode(data)
220
- post("ahoy_geocode", data)
221
- end
222
-
223
- def authenticate(data)
224
- post("ahoy_auth", data)
225
- end
226
-
227
- private
228
-
229
- def post(topic, data)
230
- client.put_record(
231
- delivery_stream_name: topic,
232
- record: {data: "#{data.to_json}\n"}
233
- )
234
- end
235
-
236
- def client
237
- @client ||= Aws::Firehose::Client.new
238
- end
239
- end
240
- ```
@@ -1,10 +0,0 @@
1
- class Ahoy::Event < <%= rails5? ? "ApplicationRecord" : "ActiveRecord::Base" %>
2
- include Ahoy::QueryMethods
3
-
4
- self.table_name = "ahoy_events"
5
-
6
- belongs_to :visit
7
- belongs_to :user<%= rails5? ? ", optional: true" : nil %><% if properties_type == "text" %>
8
-
9
- serialize :properties, JSON<% end %>
10
- end
@@ -1,6 +0,0 @@
1
- class Ahoy::Visit < <%= rails5? ? "ApplicationRecord" : "ActiveRecord::Base" %>
2
- self.table_name = "ahoy_visits"
3
-
4
- has_many :events, class_name: "Ahoy::Event"
5
- belongs_to :user<%= rails5? ? ", optional: true" : nil %>
6
- end
@@ -1,5 +0,0 @@
1
- class Ahoy::Store < Ahoy::DatabaseStore
2
- end
3
-
4
- # set to true for JavaScript tracking
5
- Ahoy.api = false
@@ -1,23 +0,0 @@
1
- require_relative "../test_helper"
2
-
3
- Mongoid.logger.level = Logger::WARN
4
- Mongo::Logger.logger.level = Logger::WARN
5
-
6
- Mongoid.configure do |config|
7
- config.connect_to("ahoy_test")
8
- end
9
-
10
- class MongoidEvent
11
- include Mongoid::Document
12
- include Ahoy::QueryMethods
13
-
14
- field :properties, type: Hash
15
- end
16
-
17
- class MongoidTest < Minitest::Test
18
- include QueryMethodsTest
19
-
20
- def model
21
- MongoidEvent
22
- end
23
- 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 QueryMethodsTest
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 QueryMethodsTest
15
-
16
- def model
17
- MysqlTextEvent
18
- end
19
- end
@@ -1,20 +0,0 @@
1
- require_relative "../test_helper"
2
-
3
- ActiveRecord::Base.establish_connection adapter: "postgresql", database: "ahoy_test"
4
-
5
- ActiveRecord::Migration.enable_extension "hstore"
6
-
7
- ActiveRecord::Migration.create_table :postgresql_hstore_events, force: true do |t|
8
- t.hstore :properties
9
- end
10
-
11
- class PostgresqlHstoreEvent < PostgresqlBase
12
- end
13
-
14
- class PostgresqlHstoreTest < Minitest::Test
15
- include QueryMethodsTest
16
-
17
- def model
18
- PostgresqlHstoreEvent
19
- end
20
- 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 QueryMethodsTest
14
-
15
- def model
16
- PostgresqlJsonEvent
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_jsonb_events, force: true do |t|
6
- t.jsonb :properties
7
- t.index :properties, using: 'gin'
8
- end
9
-
10
- class PostgresqlJsonbEvent < PostgresqlBase
11
- end
12
-
13
- class PostgresqlJsonbTest < Minitest::Test
14
- include QueryMethodsTest
15
-
16
- def model
17
- PostgresqlJsonbEvent
18
- end
19
- 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 QueryMethodsTest
15
-
16
- def model
17
- PostgresqlTextEvent
18
- end
19
- end
data/test/test_helper.rb DELETED
@@ -1,100 +0,0 @@
1
- require "bundler/setup"
2
- Bundler.require(:default)
3
- require "minitest/autorun"
4
- require "minitest/pride"
5
- require "active_record"
6
- require "mongoid"
7
-
8
- ActiveRecord::Base.logger = ActiveSupport::Logger.new(STDOUT) if ENV["VERBOSE"]
9
-
10
- class PostgresqlBase < ActiveRecord::Base
11
- include Ahoy::QueryMethods
12
- establish_connection adapter: "postgresql", database: "ahoy_test"
13
- self.abstract_class = true
14
- end
15
-
16
- class MysqlBase < ActiveRecord::Base
17
- include Ahoy::QueryMethods
18
- establish_connection adapter: "mysql2", username: "root", database: "ahoy_test"
19
- self.abstract_class = true
20
- end
21
-
22
- module QueryMethodsTest
23
- def setup
24
- model.delete_all
25
- end
26
-
27
- def test_empty
28
- assert_equal 0, count_events({})
29
- end
30
-
31
- def test_string
32
- create_event value: "world"
33
- assert_equal 1, count_events(value: "world")
34
- end
35
-
36
- def test_number
37
- create_event value: 1
38
- assert_equal 1, count_events(value: 1)
39
- end
40
-
41
- def test_date
42
- today = Date.today
43
- create_event value: today
44
- assert_equal 1, count_events(value: today)
45
- end
46
-
47
- def test_time
48
- now = Time.now
49
- create_event value: now
50
- assert_equal 1, count_events(value: now)
51
- end
52
-
53
- def test_true
54
- create_event value: true
55
- assert_equal 1, count_events(value: true)
56
- end
57
-
58
- def test_false
59
- create_event value: false
60
- assert_equal 1, count_events(value: false)
61
- end
62
-
63
- def test_nil
64
- create_event value: nil
65
- assert_equal 1, count_events(value: nil)
66
- end
67
-
68
- def test_any
69
- create_event hello: "world", prop2: "hi"
70
- assert_equal 1, count_events(hello: "world")
71
- end
72
-
73
- def test_multiple
74
- create_event prop1: "hi", prop2: "bye"
75
- assert_equal 1, count_events(prop1: "hi", prop2: "bye")
76
- end
77
-
78
- def test_multiple_order
79
- create_event prop2: "bye", prop1: "hi"
80
- assert_equal 1, count_events(prop1: "hi", prop2: "bye")
81
- end
82
-
83
- def test_partial
84
- create_event hello: "world"
85
- assert_equal 0, count_events(hello: "world", prop2: "hi")
86
- end
87
-
88
- def test_prefix
89
- create_event value: 123
90
- assert_equal 0, count_events(value: 1)
91
- end
92
-
93
- def create_event(properties)
94
- model.create(properties: properties)
95
- end
96
-
97
- def count_events(properties)
98
- model.where_properties(properties).count
99
- end
100
- end