drip-ruby 3.2.0 → 3.3.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 (50) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +5 -1
  3. data/.rubocop_todo.yml +17 -9
  4. data/.travis.yml +1 -1
  5. data/CHANGELOG.md +20 -1
  6. data/Gemfile +10 -0
  7. data/drip-ruby.gemspec +3 -11
  8. data/lib/drip/client.rb +44 -66
  9. data/lib/drip/client/accounts.rb +2 -2
  10. data/lib/drip/client/broadcasts.rb +2 -2
  11. data/lib/drip/client/campaign_subscriptions.rb +1 -1
  12. data/lib/drip/client/campaigns.rb +5 -5
  13. data/lib/drip/client/configuration.rb +28 -0
  14. data/lib/drip/client/conversions.rb +2 -2
  15. data/lib/drip/client/custom_fields.rb +1 -1
  16. data/lib/drip/client/events.rb +4 -4
  17. data/lib/drip/client/forms.rb +2 -2
  18. data/lib/drip/client/http_client.rb +64 -0
  19. data/lib/drip/client/orders.rb +3 -3
  20. data/lib/drip/client/shopper_activity.rb +78 -0
  21. data/lib/drip/client/subscribers.rb +13 -13
  22. data/lib/drip/client/tags.rb +3 -3
  23. data/lib/drip/client/webhooks.rb +5 -5
  24. data/lib/drip/client/workflow_triggers.rb +3 -3
  25. data/lib/drip/client/workflows.rb +6 -6
  26. data/lib/drip/request.rb +31 -0
  27. data/lib/drip/response.rb +13 -13
  28. data/lib/drip/version.rb +1 -1
  29. data/test/drip/client/configuration_test.rb +122 -0
  30. data/test/drip/client/http_client_test.rb +96 -0
  31. data/test/drip/client/shopper_activity_test.rb +175 -0
  32. data/test/drip/client_test.rb +32 -97
  33. data/test/drip/collection_test.rb +14 -0
  34. data/test/drip/collections/account_test.rb +8 -0
  35. data/test/drip/collections/broadcasts_test.rb +8 -0
  36. data/test/drip/collections/campaign_subscriptions_test.rb +8 -0
  37. data/test/drip/collections/campaigns_test.rb +8 -0
  38. data/test/drip/collections/errors_test.rb +8 -0
  39. data/test/drip/collections/orders_test.rb +8 -0
  40. data/test/drip/collections/purchases_test.rb +8 -0
  41. data/test/drip/collections/tags_test.rb +8 -0
  42. data/test/drip/collections/webhooks_test.rb +8 -0
  43. data/test/drip/collections/workflow_triggers_test.rb +8 -0
  44. data/test/drip/collections/workflows_test.rb +8 -0
  45. data/test/drip/request_test.rb +58 -0
  46. data/test/drip/resource_test.rb +12 -0
  47. data/test/drip/resources/tag_test.rb +13 -0
  48. data/test/drip/response_test.rb +33 -0
  49. data/test/test_helper.rb +3 -0
  50. metadata +42 -104
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 70f3d91d9c2443f74403c190edb0cf38e67f6659
4
- data.tar.gz: '0759cfde4ef6ed2361b909c6f765a9cec2579a14'
3
+ metadata.gz: da8e0406199eb9a3a9c4d1dc54822dcf8126897a
4
+ data.tar.gz: a4ef8f3a36b59e4a54ed2c7f23895bcedea5d60c
5
5
  SHA512:
6
- metadata.gz: cad33578769c6b1e0d45dec91e9f4fd691eb32f36df440b82b41649ea723bf5906c3bc4fa0a5341920e17e2720857c94e6da1459ebe18df023a12c1fc28686f7
7
- data.tar.gz: c03a67601a4d2cd13154002460576ffe475049d00e5beadb84b49a7b9ba263c6806624aa847767473cf6caaa972d8d46c43edbddf2a7b4f3be55919e680237dc
6
+ metadata.gz: 3c69d1a5f1a6c1749a0d799a4810aef260c875bb0d03c3a975117f15af9108cfb7dc6f3552a8d15eb31c67a44c5709cabbfc026e35efac5f3f0dc002992c013e
7
+ data.tar.gz: 183dad58f6e69ee0f1f8f102308a9b8fc42dc87c164523220d7e9d17e07bee1b3f510b4f89a00f319676c009a85c0e233969ce15a9abe7d4c85c7acf500622f5
@@ -1,7 +1,7 @@
1
1
  inherit_from: .rubocop_todo.yml
2
2
 
3
3
  AllCops:
4
- TargetRubyVersion: '2.1'
4
+ TargetRubyVersion: '2.2'
5
5
  Exclude:
6
6
  - 'test/fixtures/**/*'
7
7
 
@@ -32,3 +32,7 @@ Layout/MultilineMethodCallIndentation:
32
32
  Metrics/ClassLength:
33
33
  Exclude:
34
34
  - 'test/**/*'
35
+
36
+ Metrics/BlockLength:
37
+ Exclude:
38
+ - 'test/**/*'
@@ -1,11 +1,18 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2018-05-24 10:21:33 -0500 using RuboCop version 0.56.0.
3
+ # on 2019-05-02 16:45:21 -0500 using RuboCop version 0.67.2.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
7
7
  # versions of RuboCop, may require this file to be generated again.
8
8
 
9
+ # Offense count: 2
10
+ # Cop supports --auto-correct.
11
+ Layout/EmptyLineAfterGuardClause:
12
+ Exclude:
13
+ - 'lib/drip/client/subscribers.rb'
14
+ - 'lib/drip/response.rb'
15
+
9
16
  # Offense count: 2
10
17
  # Cop supports --auto-correct.
11
18
  # Configuration parameters: AllowUnusedKeywordArguments, IgnoreEmptyMethods.
@@ -14,17 +21,18 @@ Lint/UnusedMethodArgument:
14
21
  - 'lib/drip/client.rb'
15
22
  - 'lib/drip/collection.rb'
16
23
 
17
- # Offense count: 1
24
+ # Offense count: 2
18
25
  Metrics/AbcSize:
19
- Max: 26
26
+ Max: 25
20
27
 
21
- # Offense count: 5
28
+ # Offense count: 8
22
29
  # Configuration parameters: CountComments, ExcludedMethods.
30
+ # ExcludedMethods: refine
23
31
  Metrics/BlockLength:
24
32
  Max: 46
25
33
 
26
34
  # Offense count: 4
27
- # Configuration parameters: CountComments.
35
+ # Configuration parameters: CountComments, ExcludedMethods.
28
36
  Metrics/MethodLength:
29
37
  Max: 26
30
38
 
@@ -39,14 +47,14 @@ Performance/InefficientHashSearch:
39
47
  - 'lib/drip/resource.rb'
40
48
  - 'lib/drip/response.rb'
41
49
 
42
- # Offense count: 23
50
+ # Offense count: 24
43
51
  # Cop supports --auto-correct.
44
52
  # Configuration parameters: AutoCorrect, EnforcedStyle.
45
53
  # SupportedStyles: nested, compact
46
54
  Style/ClassAndModuleChildren:
47
55
  Enabled: false
48
56
 
49
- # Offense count: 45
57
+ # Offense count: 44
50
58
  Style/Documentation:
51
59
  Enabled: false
52
60
 
@@ -81,13 +89,13 @@ Style/MissingRespondToMissing:
81
89
  - 'lib/drip/resource.rb'
82
90
  - 'lib/drip/response.rb'
83
91
 
84
- # Offense count: 10
92
+ # Offense count: 12
85
93
  # Cop supports --auto-correct.
86
94
  # Configuration parameters: Strict.
87
95
  Style/NumericLiterals:
88
96
  MinDigits: 8
89
97
 
90
- # Offense count: 605
98
+ # Offense count: 700
91
99
  # Cop supports --auto-correct.
92
100
  # Configuration parameters: EnforcedStyle, ConsistentQuotesInMultiline.
93
101
  # SupportedStyles: single_quotes, double_quotes
@@ -1,9 +1,9 @@
1
1
  language: ruby
2
2
  sudo: false
3
3
  rvm:
4
+ - 2.6
4
5
  - 2.5
5
6
  - 2.4
6
7
  - 2.3
7
8
  - 2.2
8
- - 2.1
9
9
  - jruby-19mode
@@ -6,10 +6,29 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
- [master]: https://github.com/DripEmail/drip-ruby/compare/v3.2.0...HEAD
9
+ [master]: https://github.com/DripEmail/drip-ruby/compare/v3.3.0...HEAD
10
10
 
11
11
  - Your contribution here!
12
12
 
13
+ ## [3.3.0] - 2019-05-24
14
+
15
+ [3.3.0]: https://github.com/DripEmail/drip-ruby/compare/v3.2.0...v3.3.0
16
+
17
+ ### Added
18
+ - Support for the cart, order, and product endpoints in the shopper activity API.
19
+
20
+ ### Changed
21
+ - `Drip::Client#url_prefix` parameter no longer includes `/vN` part of the URL in order to prepare for Shopper Activity API. This breaks backwards compatibility for this option, but there is no expected production usage of this parameter.
22
+ - `Drip::Client#get`, `Drip::Client#post`, `Drip::Client#put`, and `Drip::Client#delete` are deprecated. If you are using these to hit a Drip API endpoint, please file a ticket or PR to fix the use case.
23
+ - `Drip::Client#generate_resource` is deprecated and will be removed in a future version.
24
+ - `Drip::Client#content_type` is deprecated and will be removed in a future version. It is no longer used internally, effective immediately.
25
+ - When using the block form of parameter initialization, a configuration object is provided instead of the client itself.
26
+ - Calling configuration setters on `Drip::Client` is deprecated.
27
+ - `Drip::Client::REDIRECT_LIMIT` constant is now private. This is supposed to be an implementation detail and shouldn't leak.
28
+
29
+ ### Removed
30
+ - Drop support for Ruby 2.1.
31
+
13
32
  ## [3.2.0] - 2018-08-15
14
33
 
15
34
  [3.2.0]: https://github.com/DripEmail/drip-ruby/compare/v3.1.1...v3.2.0
data/Gemfile CHANGED
@@ -2,3 +2,13 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in drip-ruby.gemspec
4
4
  gemspec
5
+
6
+ gem "bundler", ">= 1.6", "< 3"
7
+ gem "minitest", "~> 5.0"
8
+ gem "mocha", "~> 1.1"
9
+ gem "rake", "~> 12.0"
10
+ gem "rubocop", "~> 0.67.2"
11
+ gem "rubocop-performance", "~> 1.1.0"
12
+ gem "shoulda-context", "~> 1.0"
13
+ gem "simplecov", require: false
14
+ gem "webmock", "~> 3.4"
@@ -7,8 +7,8 @@ require 'drip/version'
7
7
  Gem::Specification.new do |spec|
8
8
  spec.name = "drip-ruby"
9
9
  spec.version = Drip::VERSION
10
- spec.authors = ["Derrick Reimer"]
11
- spec.email = ["derrickreimer@gmail.com"]
10
+ spec.authors = ["Drip"]
11
+ spec.email = ["support@drip.com"]
12
12
  spec.summary = 'A Ruby gem for interacting with the Drip API'
13
13
  spec.description = 'A simple wrapper for the Drip API'
14
14
  spec.homepage = "http://github.com/DripEmail/drip-ruby"
@@ -19,13 +19,5 @@ Gem::Specification.new do |spec|
19
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.required_ruby_version = '>= 2.1'
23
-
24
- spec.add_development_dependency "bundler", "~> 1.6"
25
- spec.add_development_dependency "minitest", "~> 5.0"
26
- spec.add_development_dependency "mocha", "~> 1.1"
27
- spec.add_development_dependency "rake", "~> 10.0"
28
- spec.add_development_dependency "rubocop", "~> 0.56.0"
29
- spec.add_development_dependency "shoulda-context", "~> 1.0"
30
- spec.add_development_dependency "webmock", "~> 3.4"
22
+ spec.required_ruby_version = '>= 2.2'
31
23
  end
@@ -1,14 +1,18 @@
1
1
  require "drip/errors"
2
+ require "drip/request"
2
3
  require "drip/response"
3
4
  require "drip/client/accounts"
4
5
  require "drip/client/broadcasts"
5
6
  require "drip/client/campaigns"
6
7
  require "drip/client/campaign_subscriptions"
8
+ require "drip/client/configuration"
7
9
  require "drip/client/conversions"
8
10
  require "drip/client/custom_fields"
9
11
  require "drip/client/events"
10
12
  require "drip/client/forms"
13
+ require "drip/client/http_client"
11
14
  require "drip/client/orders"
15
+ require "drip/client/shopper_activity"
12
16
  require "drip/client/subscribers"
13
17
  require "drip/client/tags"
14
18
  require "drip/client/webhooks"
@@ -29,88 +33,75 @@ module Drip
29
33
  include Events
30
34
  include Forms
31
35
  include Orders
36
+ include ShopperActivity
32
37
  include Subscribers
33
38
  include Tags
34
39
  include Webhooks
35
40
  include Workflows
36
41
  include WorkflowTriggers
37
42
 
38
- REDIRECT_LIMIT = 10
43
+ Drip::Client::Configuration::CONFIGURATION_FIELDS.each do |config_key|
44
+ define_method(config_key) do
45
+ @config.public_send(config_key)
46
+ end
47
+
48
+ setter_name = "#{config_key}=".to_sym
49
+ define_method(setter_name) do |val|
50
+ warn "[DEPRECATED] Setting configuration on Drip::Client after initialization will be removed in a future version"
51
+ @config.public_send(setter_name, val)
52
+ end
53
+ end
54
+
55
+ JSON_API_CONTENT_TYPE = "application/vnd.api+json".freeze
56
+ private_constant :JSON_API_CONTENT_TYPE
39
57
 
40
- attr_accessor :access_token, :api_key, :account_id, :url_prefix, :http_open_timeout, :http_timeout
58
+ JSON_CONTENT_TYPE = "application/json".freeze
59
+ private_constant :JSON_CONTENT_TYPE
41
60
 
42
61
  def initialize(options = {})
43
- @account_id = options[:account_id]
44
- @access_token = options[:access_token]
45
- @api_key = options[:api_key]
46
- @url_prefix = options[:url_prefix] || "https://api.getdrip.com/v2/"
47
- @http_open_timeout = options[:http_open_timeout]
48
- @http_timeout = options[:http_timeout]
49
- yield(self) if block_given?
62
+ @config = Drip::Client::Configuration.new(options)
63
+ yield(@config) if block_given?
50
64
  end
51
65
 
52
66
  def generate_resource(key, *args)
53
- { key => args }
67
+ warn "[DEPRECATED] Drip::Client#generate_resource is deprecated and will be removed in a future version"
68
+ private_generate_resource(key, *args)
54
69
  end
55
70
 
56
71
  def content_type
57
- 'application/vnd.api+json'
72
+ warn "[DEPRECATED] Drip::Client#content_type is deprecated and will be removed in a future version"
73
+ JSON_API_CONTENT_TYPE
58
74
  end
59
75
 
60
- def get(url, options = {})
61
- make_request(Net::HTTP::Get, make_uri(url), options)
76
+ Drip::Request::VERB_CLASS_MAPPING.keys.each do |verb|
77
+ define_method(verb) do |path, options = {}|
78
+ warn "[DEPRECATED] Drip::Client##{verb} please use the API endpoint specific methods"
79
+ make_json_api_request(verb, "v2/#{path}", options)
80
+ end
62
81
  end
63
82
 
64
- def post(url, options = {})
65
- make_request(Net::HTTP::Post, make_uri(url), options)
66
- end
83
+ private
67
84
 
68
- def put(url, options = {})
69
- make_request(Net::HTTP::Put, make_uri(url), options)
85
+ def make_json_api_request(http_verb, path, options = {})
86
+ make_request Drip::Request.new(http_verb, make_uri(path), options, JSON_API_CONTENT_TYPE)
70
87
  end
71
88
 
72
- def delete(url, options = {})
73
- make_request(Net::HTTP::Delete, make_uri(url), options)
89
+ def make_json_request(http_verb, path, options = {})
90
+ make_request Drip::Request.new(http_verb, make_uri(path), options, JSON_CONTENT_TYPE)
74
91
  end
75
92
 
76
- private
93
+ def private_generate_resource(key, *args)
94
+ # No reason for this to be part of the public API, so making a duplicate method to make it private.
95
+ { key => args }
96
+ end
77
97
 
78
98
  def make_uri(path)
79
- URI(url_prefix) + URI(path)
99
+ URI(@config.url_prefix) + URI(path)
80
100
  end
81
101
 
82
- def make_request(verb_klass, uri, options, step = 0)
83
- raise TooManyRedirectsError, 'too many HTTP redirects' if step >= REDIRECT_LIMIT
84
-
102
+ def make_request(drip_request)
85
103
  build_response do
86
- Net::HTTP.start(uri.host, uri.port, connection_options(uri.scheme)) do |http|
87
- if verb_klass == Net::HTTP::Get
88
- uri.query = URI.encode_www_form(options)
89
- end
90
-
91
- request = verb_klass.new uri
92
-
93
- unless verb_klass == Net::HTTP::Get
94
- request.body = options.to_json
95
- end
96
-
97
- request['User-Agent'] = "Drip Ruby v#{Drip::VERSION}"
98
- request['Content-Type'] = content_type
99
- request['Accept'] = "*/*"
100
-
101
- if access_token
102
- request['Authorization'] = "Bearer #{access_token}"
103
- else
104
- request.basic_auth api_key, ""
105
- end
106
-
107
- response = http.request request
108
- if response.is_a?(Net::HTTPRedirection)
109
- return make_request(verb_klass, URI(response["Location"]), options, step + 1)
110
- else
111
- response
112
- end
113
- end
104
+ Drip::Client::HTTPClient.new(@config).make_request(drip_request)
114
105
  end
115
106
  end
116
107
 
@@ -120,18 +111,5 @@ module Drip
120
111
  rescue JSON::ParserError
121
112
  Drip::Response.new(response.code.to_i, nil)
122
113
  end
123
-
124
- def connection_options(uri_scheme)
125
- options = { use_ssl: uri_scheme == "https" }
126
-
127
- if @http_open_timeout
128
- options[:open_timeout] = @http_open_timeout
129
- options[:ssl_timeout] = @http_open_timeout
130
- end
131
-
132
- options[:read_timeout] = @http_timeout if @http_timeout
133
-
134
- options
135
- end
136
114
  end
137
115
  end
@@ -6,7 +6,7 @@ module Drip
6
6
  # Returns a Drip::Response.
7
7
  # See https://www.getdrip.com/docs/rest-api#accounts
8
8
  def accounts
9
- get "accounts"
9
+ make_json_api_request :get, "v2/accounts"
10
10
  end
11
11
 
12
12
  # Public: Fetch an account.
@@ -16,7 +16,7 @@ module Drip
16
16
  # Returns a Drip::Response.
17
17
  # See https://www.getdrip.com/docs/rest-api#accounts
18
18
  def account(id)
19
- get "accounts/#{id}"
19
+ make_json_api_request :get, "v2/accounts/#{id}"
20
20
  end
21
21
  end
22
22
  end
@@ -12,7 +12,7 @@ module Drip
12
12
  # Returns a Drip::Response
13
13
  # See https://www.getdrip.com/docs/rest-api#broadcasts
14
14
  def broadcasts(options = {})
15
- get "#{account_id}/broadcasts", options
15
+ make_json_api_request :get, "v2/#{account_id}/broadcasts", options
16
16
  end
17
17
 
18
18
  # Public: Fetch a broadcast.
@@ -22,7 +22,7 @@ module Drip
22
22
  # Returns a Drip::Response.
23
23
  # See https://www.getdrip.com/docs/rest-api#broadcasts
24
24
  def broadcast(id)
25
- get "#{account_id}/broadcasts/#{id}"
25
+ make_json_api_request :get, "v2/#{account_id}/broadcasts/#{id}"
26
26
  end
27
27
  end
28
28
  end
@@ -8,7 +8,7 @@ module Drip
8
8
  # Returns a Drip::Response.
9
9
  # See https://www.getdrip.com/docs.rest-api#campaign_subscriptions
10
10
  def campaign_subscriptions(subscriber_id)
11
- get "#{account_id}/subscribers/#{subscriber_id}/campaign_subscriptions"
11
+ make_json_api_request :get, "v2/#{account_id}/subscribers/#{subscriber_id}/campaign_subscriptions"
12
12
  end
13
13
  end
14
14
  end
@@ -14,7 +14,7 @@ module Drip
14
14
  # Returns a Drip::Response.
15
15
  # See https://www.getdrip.com/docs.rest-api#campaigns
16
16
  def campaigns(options = {})
17
- get "#{account_id}/campaigns", options
17
+ make_json_api_request :get, "v2/#{account_id}/campaigns", options
18
18
  end
19
19
 
20
20
  # Public: Fetch a campaign.
@@ -24,7 +24,7 @@ module Drip
24
24
  # Returns a Drip::Response.
25
25
  # See https://www.getdrip.com/docs/rest-api#campaigns
26
26
  def campaign(id)
27
- get "#{account_id}/campaigns/#{id}"
27
+ make_json_api_request :get, "v2/#{account_id}/campaigns/#{id}"
28
28
  end
29
29
 
30
30
  # Public: Activate a campaign.
@@ -34,7 +34,7 @@ module Drip
34
34
  # Returns a Drip::Response.
35
35
  # See https://www.getdrip.com/docs/rest-api#campaigns
36
36
  def activate_campaign(id)
37
- post "#{account_id}/campaigns/#{id}/activate"
37
+ make_json_api_request :post, "v2/#{account_id}/campaigns/#{id}/activate"
38
38
  end
39
39
 
40
40
  # Public: Pause a campaign.
@@ -44,7 +44,7 @@ module Drip
44
44
  # Returns a Drip::Response.
45
45
  # See https://www.getdrip.com/docs/rest-api#campaigns
46
46
  def pause_campaign(id)
47
- post "#{account_id}/campaigns/#{id}/pause"
47
+ make_json_api_request :post, "v2/#{account_id}/campaigns/#{id}/pause"
48
48
  end
49
49
 
50
50
  # Public: List everyone subscribed to a campaign.
@@ -68,7 +68,7 @@ module Drip
68
68
  # Returns a Drip::Response.
69
69
  # See https://www.getdrip.com/docs/rest-api#campaigns
70
70
  def campaign_subscribers(id, options = {})
71
- get "#{account_id}/campaigns/#{id}/subscribers", options
71
+ make_json_api_request :get, "v2/#{account_id}/campaigns/#{id}/subscribers", options
72
72
  end
73
73
  end
74
74
  end
@@ -0,0 +1,28 @@
1
+ module Drip
2
+ class Client
3
+ class Configuration
4
+ DEFAULT_URL_PREFIX = "https://api.getdrip.com/".freeze
5
+ private_constant :DEFAULT_URL_PREFIX
6
+
7
+ CONFIGURATION_FIELDS = %i[access_token api_key account_id url_prefix http_open_timeout http_timeout].freeze
8
+
9
+ attr_accessor(*CONFIGURATION_FIELDS)
10
+
11
+ def initialize(**options)
12
+ remainder = options.keys - CONFIGURATION_FIELDS
13
+ raise ArgumentError, "unknown keyword#{'s' if remainder.size > 1}: #{remainder.join(', ')}" unless remainder.empty?
14
+
15
+ # Initialize this variable to suppress Ruby warning.
16
+ @url_prefix = nil
17
+
18
+ options.each do |k, v|
19
+ public_send("#{k}=", v)
20
+ end
21
+ end
22
+
23
+ def url_prefix
24
+ @url_prefix || DEFAULT_URL_PREFIX
25
+ end
26
+ end
27
+ end
28
+ end