vero 0.9.1 → 0.10.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.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +15 -1
  3. data/Gemfile.lock +95 -73
  4. data/README.markdown +145 -121
  5. data/lib/generators/vero_generator.rb +18 -19
  6. data/lib/vero.rb +7 -3
  7. data/lib/vero/api.rb +14 -4
  8. data/lib/vero/api/base_api.rb +11 -10
  9. data/lib/vero/api/events/track_api.rb +5 -3
  10. data/lib/vero/api/users/delete_api.rb +21 -0
  11. data/lib/vero/api/users/edit_api.rb +5 -3
  12. data/lib/vero/api/users/edit_tags_api.rb +7 -5
  13. data/lib/vero/api/users/reidentify_api.rb +5 -3
  14. data/lib/vero/api/users/resubscribe_api.rb +3 -1
  15. data/lib/vero/api/users/track_api.rb +5 -3
  16. data/lib/vero/api/users/unsubscribe_api.rb +3 -1
  17. data/lib/vero/app.rb +4 -2
  18. data/lib/vero/config.rb +11 -8
  19. data/lib/vero/context.rb +9 -11
  20. data/lib/vero/context/api.rb +9 -7
  21. data/lib/vero/dsl.rb +3 -1
  22. data/lib/vero/railtie.rb +5 -3
  23. data/lib/vero/sender.rb +12 -31
  24. data/lib/vero/senders/base.rb +3 -1
  25. data/lib/vero/senders/delayed_job.rb +7 -7
  26. data/lib/vero/senders/invalid.rb +5 -3
  27. data/lib/vero/senders/resque.rb +8 -8
  28. data/lib/vero/senders/sidekiq.rb +3 -1
  29. data/lib/vero/senders/{thread.rb → sucker_punch.rb} +5 -3
  30. data/lib/vero/trackable.rb +4 -2
  31. data/lib/vero/trackable/base.rb +10 -9
  32. data/lib/vero/trackable/interface.rb +3 -1
  33. data/lib/vero/utility/ext.rb +3 -1
  34. data/lib/vero/utility/logger.rb +4 -6
  35. data/lib/vero/version.rb +3 -1
  36. data/lib/vero/view_helpers/javascript.rb +20 -20
  37. data/spec/lib/api/base_api_spec.rb +10 -8
  38. data/spec/lib/api/events/track_api_spec.rb +23 -21
  39. data/spec/lib/api/users/delete_api_spec.rb +33 -0
  40. data/spec/lib/api/users/edit_api_spec.rb +12 -10
  41. data/spec/lib/api/users/edit_tags_api_spec.rb +22 -20
  42. data/spec/lib/api/users/reidentify_spec.rb +16 -14
  43. data/spec/lib/api/users/resubscribe_api_spec.rb +16 -10
  44. data/spec/lib/api/users/track_api_spec.rb +21 -19
  45. data/spec/lib/api/users/unsubscribe_api_spec.rb +12 -10
  46. data/spec/lib/api_spec.rb +29 -24
  47. data/spec/lib/app_spec.rb +12 -10
  48. data/spec/lib/config_spec.rb +31 -29
  49. data/spec/lib/context_spec.rb +13 -11
  50. data/spec/lib/dsl_spec.rb +3 -1
  51. data/spec/lib/sender_spec.rb +12 -24
  52. data/spec/lib/senders/sidekiq_spec.rb +16 -9
  53. data/spec/lib/trackable_spec.rb +88 -114
  54. data/spec/lib/view_helpers_spec.rb +12 -8
  55. data/spec/spec_helper.rb +10 -4
  56. data/spec/support/base_config_shared_examples.rb +5 -3
  57. data/spec/support/user_support.rb +15 -7
  58. data/spec/support/vero_user_support.rb +4 -2
  59. data/vero.gemspec +14 -30
  60. metadata +30 -125
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class VeroGenerator < Rails::Generators::Base
2
4
  class_option :heroku
3
5
  class_option :api_key
@@ -6,30 +8,27 @@ class VeroGenerator < Rails::Generators::Base
6
8
  def create_initializer_file
7
9
  type = options[:heroku] || 'standard'
8
10
 
9
- if options[:heroku].blank? && (options[:api_key].blank? || options[:api_secret].blank?)
10
- abort("You must provide an API KEY and API SECRET to proceed.")
11
- end
12
- create_file "config/initializers/vero.rb", self.send("#{type}_initializer_content".to_sym)
11
+ abort('You must provide an API KEY and API SECRET to proceed.') if options[:heroku].blank? && (options[:api_key].blank? || options[:api_secret].blank?)
12
+ create_file 'config/initializers/vero.rb', send("#{type}_initializer_content".to_sym)
13
13
  end
14
14
 
15
15
  private
16
+
16
17
  def standard_initializer_content
17
- text = <<-END_TEXT
18
- Vero::App.init do |config|
19
- config.api_key = '#{options[:api_key]}'
20
- config.secret = '#{options[:api_secret]}'
21
- end
22
- END_TEXT
23
- text
18
+ <<~END_TEXT
19
+ Vero::App.init do |config|
20
+ config.api_key = '#{options[:api_key]}'
21
+ config.secret = '#{options[:api_secret]}'
22
+ end
23
+ END_TEXT
24
24
  end
25
25
 
26
26
  def heroku_initializer_content
27
- text = <<-END_TEXT
28
- Vero::App.init do |config|
29
- config.api_key = ENV['VERO_API_KEY']
30
- config.secret = ENV['VERO_API_SECRET']
31
- end
32
- END_TEXT
33
- text
27
+ <<~END_TEXT
28
+ Vero::App.init do |config|
29
+ config.api_key = ENV['VERO_API_KEY']
30
+ config.secret = ENV['VERO_API_SECRET']
31
+ end
32
+ END_TEXT
34
33
  end
35
- end
34
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rest-client'
2
4
  require 'vero/utility/ext'
3
5
 
@@ -9,12 +11,13 @@ module Vero
9
11
  autoload :Trackable, 'vero/trackable'
10
12
  autoload :DSL, 'vero/dsl'
11
13
  autoload :Sender, 'vero/sender'
14
+ autoload :SuckerPunchWorker, 'vero/senders/sucker_punch'
12
15
  autoload :ResqueWorker, 'vero/senders/resque'
13
16
  autoload :SidekiqWorker, 'vero/senders/sidekiq'
14
17
 
15
18
  module Api
16
19
  module Workers
17
- autoload :BaseAPI, 'vero/api/base_api'
20
+ autoload :BaseAPI, 'vero/api/base_api'
18
21
 
19
22
  module Events
20
23
  autoload :TrackAPI, 'vero/api/events/track_api'
@@ -27,6 +30,7 @@ module Vero
27
30
  autoload :UnsubscribeAPI, 'vero/api/users/unsubscribe_api'
28
31
  autoload :ResubscribeAPI, 'vero/api/users/resubscribe_api'
29
32
  autoload :ReidentifyAPI, 'vero/api/users/reidentify_api'
33
+ autoload :DeleteAPI, 'vero/api/users/delete_api'
30
34
  end
31
35
  end
32
36
 
@@ -40,11 +44,11 @@ module Vero
40
44
  autoload :Resque, 'vero/senders/resque'
41
45
  autoload :Sidekiq, 'vero/senders/sidekiq'
42
46
  autoload :Invalid, 'vero/senders/invalid'
43
- autoload :Thread, 'vero/senders/thread'
47
+ autoload :SuckerPunch, 'vero/senders/sucker_punch'
44
48
  end
45
49
 
46
50
  module Utility
47
- autoload :Logger, 'vero/utility/logger'
51
+ autoload :Logger, 'vero/utility/logger'
48
52
  end
49
53
  end
50
54
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Vero
2
4
  module Api
3
5
  class Base
@@ -8,21 +10,21 @@ module Vero
8
10
  end
9
11
 
10
12
  def config
11
- self.context.config
13
+ context.config
12
14
  end
13
15
 
14
16
  def run_api(api_klass, options)
15
17
  return if config.disabled
18
+
16
19
  validate_configured!
17
20
  options.merge!(config.request_params)
18
21
  Vero::Sender.send(api_klass, config.async, config.domain, options)
19
22
  end
20
23
 
21
24
  protected
25
+
22
26
  def validate_configured!
23
- unless config.configured?
24
- raise "You must configure the 'vero' gem. Visit https://github.com/getvero/vero for more details."
25
- end
27
+ raise "You must configure the 'vero' gem. Visit https://github.com/getvero/vero for more details." unless config.configured?
26
28
  end
27
29
  end
28
30
 
@@ -61,6 +63,10 @@ module Vero
61
63
  new(context).resubscribe!(options)
62
64
  end
63
65
 
66
+ def self.delete!(options, context = Vero::App.default_context)
67
+ new(context).delete!(options)
68
+ end
69
+
64
70
  def track!(options)
65
71
  run_api(Vero::Api::Workers::Users::TrackAPI, options)
66
72
  end
@@ -84,6 +90,10 @@ module Vero
84
90
  def reidentify!(options)
85
91
  run_api(Vero::Api::Workers::Users::ReidentifyAPI, options)
86
92
  end
93
+
94
+ def delete!(options)
95
+ run_api(Vero::Api::Workers::Users::DeleteAPI, options)
96
+ end
87
97
  end
88
98
  end
89
99
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'json'
2
4
  require 'rest-client'
3
5
 
@@ -5,10 +7,11 @@ module Vero
5
7
  module Api
6
8
  module Workers
7
9
  class BaseAPI
8
- attr_accessor :domain, :options
10
+ attr_accessor :domain
11
+ attr_reader :options
9
12
 
10
13
  def self.perform(domain, options)
11
- caller = self.new(domain, options)
14
+ caller = new(domain, options)
12
15
  caller.perform
13
16
  end
14
17
 
@@ -28,6 +31,7 @@ module Vero
28
31
  end
29
32
 
30
33
  protected
34
+
31
35
  def setup_logging
32
36
  return unless Vero::App.logger
33
37
 
@@ -38,18 +42,16 @@ module Vero
38
42
  end
39
43
  end
40
44
 
41
- def url
42
- end
45
+ def url; end
43
46
 
44
47
  def validate!
45
48
  raise "#{self.class.name}#validate! should be overridden"
46
49
  end
47
50
 
48
- def request
49
- end
51
+ def request; end
50
52
 
51
53
  def request_content_type
52
- {:content_type => :json, :accept => :json}
54
+ { content_type: :json, accept: :json }
53
55
  end
54
56
 
55
57
  def request_params_as_json
@@ -57,12 +59,11 @@ module Vero
57
59
  end
58
60
 
59
61
  def options_with_symbolized_keys(val)
60
- val.inject({}) do |h,(k,v)|
62
+ val.each_with_object({}) do |(k, v), h|
61
63
  h[k.to_sym] = v
62
- h
63
64
  end
64
65
  end
65
66
  end
66
67
  end
67
68
  end
68
- end
69
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Vero
2
4
  module Api
3
5
  module Workers
@@ -8,12 +10,12 @@ module Vero
8
10
  end
9
11
 
10
12
  def request
11
- RestClient.post(self.url, self.request_params_as_json, self.request_content_type)
13
+ RestClient.post(url, request_params_as_json, request_content_type)
12
14
  end
13
15
 
14
16
  def validate!
15
- raise ArgumentError.new("Missing :event_name") if options[:event_name].to_s.blank?
16
- raise ArgumentError.new(":data must be either nil or a Hash") unless (options[:data].nil? || options[:data].is_a?(Hash))
17
+ raise ArgumentError, 'Missing :event_name' if options[:event_name].to_s.blank?
18
+ raise ArgumentError, ':data must be either nil or a Hash' unless options[:data].nil? || options[:data].is_a?(Hash)
17
19
  end
18
20
  end
19
21
  end
@@ -0,0 +1,21 @@
1
+ module Vero
2
+ module Api
3
+ module Workers
4
+ module Users
5
+ class DeleteAPI < BaseAPI
6
+ def url
7
+ "#{@domain}/api/v2/users/delete.json"
8
+ end
9
+
10
+ def request
11
+ RestClient.post(url, @options)
12
+ end
13
+
14
+ def validate!
15
+ raise ArgumentError.new("Missing :id") if options[:id].to_s.blank?
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Vero
2
4
  module Api
3
5
  module Workers
@@ -8,12 +10,12 @@ module Vero
8
10
  end
9
11
 
10
12
  def request
11
- RestClient.put(url, self.request_params_as_json, self.request_content_type)
13
+ RestClient.put(url, request_params_as_json, request_content_type)
12
14
  end
13
15
 
14
16
  def validate!
15
- raise ArgumentError.new("Missing :id or :email") if options[:id].to_s.blank? && options[:email].to_s.blank?
16
- raise ArgumentError.new(":changes must be a Hash") unless options[:changes].is_a?(Hash)
17
+ raise ArgumentError, 'Missing :id or :email' if options[:id].to_s.blank? && options[:email].to_s.blank?
18
+ raise ArgumentError, ':changes must be a Hash' unless options[:changes].is_a?(Hash)
17
19
  end
18
20
  end
19
21
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Vero
2
4
  module Api
3
5
  module Workers
@@ -8,14 +10,14 @@ module Vero
8
10
  end
9
11
 
10
12
  def request
11
- RestClient.put(url, self.request_params_as_json, self.request_content_type)
13
+ RestClient.put(url, request_params_as_json, request_content_type)
12
14
  end
13
15
 
14
16
  def validate!
15
- raise ArgumentError.new("Missing :id or :email") if options[:id].to_s.blank? && options[:email].to_s.blank?
16
- raise ArgumentError.new(":add must an Array if present") unless options[:add].nil? || options[:add].is_a?(Array)
17
- raise ArgumentError.new(":remove must an Array if present") unless options[:remove].nil? || options[:remove].is_a?(Array)
18
- raise ArgumentError.new("Either :add or :remove must be present") if (options[:remove].nil? && options[:add].nil?)
17
+ raise ArgumentError, 'Missing :id or :email' if options[:id].to_s.blank? && options[:email].to_s.blank?
18
+ raise ArgumentError, ':add must an Array if present' unless options[:add].nil? || options[:add].is_a?(Array)
19
+ raise ArgumentError, ':remove must an Array if present' unless options[:remove].nil? || options[:remove].is_a?(Array)
20
+ raise ArgumentError, 'Either :add or :remove must be present' if options[:remove].nil? && options[:add].nil?
19
21
  end
20
22
  end
21
23
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Vero
2
4
  module Api
3
5
  module Workers
@@ -8,12 +10,12 @@ module Vero
8
10
  end
9
11
 
10
12
  def request
11
- RestClient.put(url, self.request_params_as_json, self.request_content_type)
13
+ RestClient.put(url, request_params_as_json, request_content_type)
12
14
  end
13
15
 
14
16
  def validate!
15
- raise ArgumentError.new("Missing :id") if options[:id].to_s.blank?
16
- raise ArgumentError.new("Missing :new_id") if options[:new_id].to_s.blank?
17
+ raise ArgumentError, 'Missing :id' if options[:id].to_s.blank?
18
+ raise ArgumentError, 'Missing :new_id' if options[:new_id].to_s.blank?
17
19
  end
18
20
  end
19
21
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Vero
2
4
  module Api
3
5
  module Workers
@@ -12,7 +14,7 @@ module Vero
12
14
  end
13
15
 
14
16
  def validate!
15
- raise ArgumentError.new("Missing :id or :email") if options[:id].to_s.blank? && options[:email].to_s.blank?
17
+ raise ArgumentError, 'Missing :id or :email' if options[:id].to_s.blank? && options[:email].to_s.blank?
16
18
  end
17
19
  end
18
20
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Vero
2
4
  module Api
3
5
  module Workers
@@ -8,12 +10,12 @@ module Vero
8
10
  end
9
11
 
10
12
  def request
11
- RestClient.post(url, self.request_params_as_json, self.request_content_type)
13
+ RestClient.post(url, request_params_as_json, request_content_type)
12
14
  end
13
15
 
14
16
  def validate!
15
- raise ArgumentError.new("Missing :id or :email") if options[:id].to_s.blank? && options[:email].to_s.blank?
16
- raise ArgumentError.new(":data must be either nil or a Hash") unless (options[:data].nil? || options[:data].is_a?(Hash))
17
+ raise ArgumentError, 'Missing :id or :email' if options[:id].to_s.blank? && options[:email].to_s.blank?
18
+ raise ArgumentError, ':data must be either nil or a Hash' unless options[:data].nil? || options[:data].is_a?(Hash)
17
19
  end
18
20
  end
19
21
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Vero
2
4
  module Api
3
5
  module Workers
@@ -12,7 +14,7 @@ module Vero
12
14
  end
13
15
 
14
16
  def validate!
15
- raise ArgumentError.new("Missing :id or :email") if options[:id].to_s.blank? && options[:email].to_s.blank?
17
+ raise ArgumentError, 'Missing :id or :email' if options[:id].to_s.blank? && options[:email].to_s.blank?
16
18
  end
17
19
  end
18
20
  end
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Vero
2
4
  class App
3
5
  include Vero::Utility::Logger
4
6
 
5
7
  def self.default_context
6
- @@default_context ||= Context.new
8
+ @@default_context ||= Context.new # rubocop:disable Style/ClassVars
7
9
  end
8
10
 
9
11
  def self.init(&block)
@@ -22,4 +24,4 @@ module Vero
22
24
  default_context.configured?
23
25
  end
24
26
  end
25
- end
27
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'base64'
2
4
 
3
5
  module Vero
@@ -6,21 +8,21 @@ module Vero
6
8
  attr_accessor :api_key, :secret, :development_mode, :async, :disabled, :logging
7
9
 
8
10
  def self.available_attributes
9
- [:api_key, :secret, :development_mode, :async, :disabled, :logging, :domain]
11
+ %i[api_key secret development_mode async disabled logging domain]
10
12
  end
11
13
 
12
14
  def initialize
13
- self.reset!
15
+ reset!
14
16
  end
15
17
 
16
18
  def config_params
17
- options = {:api_key => self.api_key, :secret => self.secret}
19
+ { api_key: api_key, secret: secret }
18
20
  end
19
21
 
20
22
  def request_params
21
23
  {
22
- :auth_token => self.auth_token,
23
- :development_mode => self.development_mode
24
+ auth_token: auth_token,
25
+ development_mode: development_mode
24
26
  }.reject { |_, v| v.nil? }
25
27
  end
26
28
 
@@ -28,13 +30,14 @@ module Vero
28
30
  if @domain.blank?
29
31
  'https://api.getvero.com'
30
32
  else
31
- @domain =~ /http[s]?\:\/\/.+/ ? @domain : "http://#{@domain}"
33
+ @domain =~ %r{https?://.+} ? @domain : "http://#{@domain}"
32
34
  end
33
35
  end
34
36
 
35
37
  def auth_token
36
38
  return unless auth_token?
37
- ::Base64::encode64("#{api_key}:#{secret}").gsub(/[\n ]/, '')
39
+
40
+ ::Base64.encode64("#{api_key}:#{secret}").gsub(/[\n ]/, '')
38
41
  end
39
42
 
40
43
  def auth_token?
@@ -63,7 +66,7 @@ module Vero
63
66
 
64
67
  Vero::Config.available_attributes.each do |symbol|
65
68
  method_name = "#{symbol}=".to_sym
66
- self.send(method_name, attributes[symbol]) if self.respond_to?(method_name) && attributes.has_key?(symbol)
69
+ send(method_name, attributes[symbol]) if respond_to?(method_name) && attributes.key?(symbol)
67
70
  end
68
71
  end
69
72
  end