vero 0.9.1 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
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