ahoy_matey 1.4.0 → 1.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 181105196800b983c765eacf7faa0ad9280a1553
4
- data.tar.gz: 67a7a2cb8dea093d979323b384b18d3b7f4e4ba7
3
+ metadata.gz: 3f3a81162866c03a621491abb0194ebe878a7f48
4
+ data.tar.gz: 050571dcc31a26851ee56da2b373503507d3547c
5
5
  SHA512:
6
- metadata.gz: a3dd6aeb1bd934d5ae71b84b38188c8c991a28c764aeecebf1566e3f675c120953c3a443ad38330e5db68d530e7fd1bce7ad2d5f3e469fe8e6b403f4381a6257
7
- data.tar.gz: ea652c7992e43801a5f6dc5bfac7284c336a6ab11e544a1298b96bf100807251f4059355f6650932f42a85ade1a6a2eac9e3204f14a32186289feabf26d03165
6
+ metadata.gz: 7259821c2286af301fcc08ca16fa6b9ef284668740d5d4e7c136adc27c250521458da9a97a859c0ecf724ab2e469a78ff4670459333e08c594af658abb6b4707
7
+ data.tar.gz: 918d05e4515f41a79991324a93bb240965bb60d685279fcb53893228a87a6954c1dfd1ae4dbe162e5366d8d270fd5625546d2656795f4d51f0f839af0c6d8c85
@@ -1,3 +1,10 @@
1
+ ## 1.4.1
2
+
3
+ - Added `where_properties` method
4
+ - Added Kafka store
5
+ - Added `mount` option
6
+ - Use less intrusive version of `safely`
7
+
1
8
  ## 1.4.0
2
9
 
3
10
  - Use `ActiveRecordTokenStore` by default (integer instead of uuid for id)
data/README.md CHANGED
@@ -27,6 +27,7 @@ Ahoy supports a number of data stores out of the box. You can start with one of
27
27
 
28
28
  - [PostgreSQL, MySQL, or SQLite](#postgresql-mysql-or-sqlite)
29
29
  - [MongoDB](#mongodb)
30
+ - [Kafka](#kafka-master) [master]
30
31
  - [Fluentd](#fluentd)
31
32
  - [RabbitMQ](#rabbitmq)
32
33
  - [Amazon Kinesis Firehose](#amazon-kinesis-firehose)
@@ -48,6 +49,22 @@ rake db:migrate
48
49
  rails generate ahoy:stores:mongoid
49
50
  ```
50
51
 
52
+ ### Kafka [master]
53
+
54
+ Add [ruby-kafka](https://github.com/zendesk/ruby-kafka) to your Gemfile.
55
+
56
+ ```ruby
57
+ gem 'ruby-kafka'
58
+ ```
59
+
60
+ And run:
61
+
62
+ ```sh
63
+ rails generate ahoy:stores:kafka
64
+ ```
65
+
66
+ Use `ENV["KAFKA_URL"]` to configure.
67
+
51
68
  ### Fluentd
52
69
 
53
70
  Add [fluent-logger](https://github.com/fluent/fluent-logger-ruby) to your Gemfile.
@@ -470,6 +487,14 @@ viewed_checkout_ids = Ahoy::Event.where(user_id: added_item_ids, name: "Viewed c
470
487
 
471
488
  The same approach also works with visitor tokens.
472
489
 
490
+ ### Querying Properties
491
+
492
+ ```ruby
493
+ Ahoy::Event.where_properties(store_id: 1).count
494
+ ```
495
+
496
+ **Note:** If you get a `NoMethodError`, upgrade Ahoy and add to your model `include Ahoy::Properties`.
497
+
473
498
  ## Native Apps
474
499
 
475
500
  ### Visits
@@ -501,6 +526,14 @@ Send a `POST` request as `Content-Type: application/json` to `/ahoy/events` with
501
526
 
502
527
  Use an array to pass multiple events at once.
503
528
 
529
+ ## Reference
530
+
531
+ By default, Ahoy create endpoints at `/ahoy/visits` and `/ahoy/events`. To disable, use:
532
+
533
+ ```ruby
534
+ Ahoy.mount = false
535
+ ```
536
+
504
537
  ## Upgrading
505
538
 
506
539
  ### 1.4.0
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
26
26
  spec.add_dependency "user_agent_parser"
27
27
  spec.add_dependency "request_store"
28
28
  spec.add_dependency "uuidtools"
29
- spec.add_dependency "safely_block"
29
+ spec.add_dependency "safely_block", ">= 0.1.1"
30
30
  spec.add_dependency "rack-attack"
31
31
 
32
32
  spec.add_development_dependency "bundler", "~> 1.5"
@@ -1,5 +1,5 @@
1
1
  Rails.application.routes.draw do
2
- mount Ahoy::Engine => "/ahoy"
2
+ mount Ahoy::Engine => "/ahoy" if Ahoy.mount
3
3
  end
4
4
 
5
5
  Ahoy::Engine.routes.draw do
@@ -6,13 +6,14 @@ require "referer-parser"
6
6
  require "user_agent_parser"
7
7
  require "request_store"
8
8
  require "uuidtools"
9
- require "safely_block"
9
+ require "safely/core"
10
10
 
11
11
  require "ahoy/version"
12
12
  require "ahoy/tracker"
13
13
  require "ahoy/controller"
14
14
  require "ahoy/model"
15
15
  require "ahoy/visit_properties"
16
+ require "ahoy/properties"
16
17
  require "ahoy/deckhands/location_deckhand"
17
18
  require "ahoy/deckhands/request_deckhand"
18
19
  require "ahoy/deckhands/technology_deckhand"
@@ -24,6 +25,7 @@ require "ahoy/stores/active_record_token_store"
24
25
  require "ahoy/stores/log_store"
25
26
  require "ahoy/stores/fluentd_store"
26
27
  require "ahoy/stores/mongoid_store"
28
+ require "ahoy/stores/kafka_store"
27
29
  require "ahoy/stores/kinesis_firehose_store"
28
30
  require "ahoy/stores/bunny_store"
29
31
  require "ahoy/engine"
@@ -66,6 +68,9 @@ module Ahoy
66
68
  mattr_accessor :max_events_per_request
67
69
  self.max_events_per_request = 10
68
70
 
71
+ mattr_accessor :mount
72
+ self.mount = true
73
+
69
74
  mattr_accessor :throttle
70
75
  self.throttle = true
71
76
 
@@ -0,0 +1,24 @@
1
+ module Ahoy
2
+ module Properties
3
+ extend ActiveSupport::Concern
4
+
5
+ module ClassMethods
6
+ def where_properties(properties)
7
+ relation = self
8
+ column_type = columns_hash["properties"].type
9
+ case column_type
10
+ when :jsonb, :json
11
+ properties.each do |k, v|
12
+ relation = relation.where("properties ->> ? = ?", k, v)
13
+ end
14
+ else
15
+ properties.each do |k, v|
16
+ # not 100%, but will do
17
+ relation = relation.where("properties LIKE ?", "%#{{k => v}.to_json.sub(/\A\{/, "").sub(/\}\z/, "")}%")
18
+ end
19
+ end
20
+ relation
21
+ end
22
+ end
23
+ end
24
+ end
@@ -2,7 +2,7 @@ module Ahoy
2
2
  module Stores
3
3
  class ActiveRecordStore < BaseStore
4
4
  def track_visit(options, &block)
5
- visit =
5
+ @visit =
6
6
  visit_model.new do |v|
7
7
  v.id = ahoy.visit_id
8
8
  v.visitor_id = ahoy.visitor_id
@@ -2,7 +2,7 @@ module Ahoy
2
2
  module Stores
3
3
  class ActiveRecordTokenStore < BaseStore
4
4
  def track_visit(options, &block)
5
- visit =
5
+ @visit =
6
6
  visit_model.new do |v|
7
7
  v.visit_token = ahoy.visit_token
8
8
  v.visitor_token = ahoy.visitor_token
@@ -0,0 +1,40 @@
1
+ module Ahoy
2
+ module Stores
3
+ class KafkaStore < LogStore
4
+ def log_visit(data)
5
+ post(visits_topic, data)
6
+ end
7
+
8
+ def log_event(data)
9
+ post(events_topic, data)
10
+ end
11
+
12
+ def client
13
+ @client ||= begin
14
+ client = Kafka.new(
15
+ seed_brokers: ENV["KAFKA_URL"],
16
+ logger: Rails.logger
17
+ )
18
+ at_exit { client.shutdown }
19
+ client
20
+ end
21
+ end
22
+
23
+ def producer
24
+ @producer ||= client.async_producer(delivery_interval: 3)
25
+ end
26
+
27
+ def post(topic, data)
28
+ producer.produce(data.to_json, topic: topic)
29
+ end
30
+
31
+ def visits_topic
32
+ "ahoy_visits"
33
+ end
34
+
35
+ def events_topic
36
+ "ahoy_events"
37
+ end
38
+ end
39
+ end
40
+ end
@@ -2,7 +2,7 @@ module Ahoy
2
2
  module Stores
3
3
  class MongoidStore < BaseStore
4
4
  def track_visit(options, &block)
5
- visit =
5
+ @visit =
6
6
  visit_model.new do |v|
7
7
  v.id = binary(ahoy.visit_id)
8
8
  v.visitor_id = binary(ahoy.visitor_id)
@@ -127,7 +127,7 @@ module Ahoy
127
127
  # odd pattern for backwards compatibility
128
128
  # TODO remove this method in next major release
129
129
  def report_exception(e)
130
- safely do
130
+ Safely.safely do
131
131
  @store.report_exception(e)
132
132
  if Rails.env.development? || Rails.env.test?
133
133
  raise e
@@ -1,3 +1,3 @@
1
1
  module Ahoy
2
- VERSION = "1.4.0"
2
+ VERSION = "1.4.1"
3
3
  end
@@ -0,0 +1,15 @@
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,5 +1,7 @@
1
1
  module Ahoy
2
2
  class Event < ActiveRecord::Base
3
+ include Ahoy::Properties
4
+
3
5
  self.table_name = "ahoy_events"
4
6
 
5
7
  belongs_to :visit
@@ -0,0 +1,9 @@
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
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ahoy_matey
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-23 00:00:00.000000000 Z
11
+ date: 2016-06-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -128,14 +128,14 @@ dependencies:
128
128
  requirements:
129
129
  - - ">="
130
130
  - !ruby/object:Gem::Version
131
- version: '0'
131
+ version: 0.1.1
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - ">="
137
137
  - !ruby/object:Gem::Version
138
- version: '0'
138
+ version: 0.1.1
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: rack-attack
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -221,11 +221,13 @@ files:
221
221
  - lib/ahoy/geocode_job.rb
222
222
  - lib/ahoy/logger_silencer.rb
223
223
  - lib/ahoy/model.rb
224
+ - lib/ahoy/properties.rb
224
225
  - lib/ahoy/stores/active_record_store.rb
225
226
  - lib/ahoy/stores/active_record_token_store.rb
226
227
  - lib/ahoy/stores/base_store.rb
227
228
  - lib/ahoy/stores/bunny_store.rb
228
229
  - lib/ahoy/stores/fluentd_store.rb
230
+ - lib/ahoy/stores/kafka_store.rb
229
231
  - lib/ahoy/stores/kinesis_firehose_store.rb
230
232
  - lib/ahoy/stores/log_store.rb
231
233
  - lib/ahoy/stores/mongoid_store.rb
@@ -242,6 +244,7 @@ files:
242
244
  - lib/generators/ahoy/stores/bunny_generator.rb
243
245
  - lib/generators/ahoy/stores/custom_generator.rb
244
246
  - lib/generators/ahoy/stores/fluentd_generator.rb
247
+ - lib/generators/ahoy/stores/kafka_generator.rb
245
248
  - lib/generators/ahoy/stores/kinesis_firehose_generator.rb
246
249
  - lib/generators/ahoy/stores/log_generator.rb
247
250
  - lib/generators/ahoy/stores/mongoid_events_generator.rb
@@ -255,6 +258,7 @@ files:
255
258
  - lib/generators/ahoy/stores/templates/bunny_initializer.rb
256
259
  - lib/generators/ahoy/stores/templates/custom_initializer.rb
257
260
  - lib/generators/ahoy/stores/templates/fluentd_initializer.rb
261
+ - lib/generators/ahoy/stores/templates/kafka_initializer.rb
258
262
  - lib/generators/ahoy/stores/templates/kinesis_firehose_initializer.rb
259
263
  - lib/generators/ahoy/stores/templates/log_initializer.rb
260
264
  - lib/generators/ahoy/stores/templates/mongoid_event_model.rb
@@ -283,11 +287,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
283
287
  version: '0'
284
288
  requirements: []
285
289
  rubyforge_project:
286
- rubygems_version: 2.6.1
290
+ rubygems_version: 2.4.5.1
287
291
  signing_key:
288
292
  specification_version: 4
289
293
  summary: Simple, powerful visit tracking for Rails
290
294
  test_files:
291
295
  - test/test_helper.rb
292
296
  - test/visit_properties_test.rb
293
- has_rdoc: