mergent 0.1.2 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 642ea17eb70a5ca0ff84a2925c80fa1e733500ab83e27cfeba9b88daf2ded004
4
- data.tar.gz: 2866865e873ec4122c4bda14f2b7e003293679c452745ff7897375a11a318b4b
3
+ metadata.gz: cc06e24825269b013a4a16a36b4efbacce4bff7072a3f477d315a2662b6e9d1b
4
+ data.tar.gz: e1827059fe19cce91e14bacea197db6d56d9faafb4499103e2a03515491064be
5
5
  SHA512:
6
- metadata.gz: 61903d6cdb937faaa6a30c77f6088dd766825a14ee72b4e8234b228d84bb56e44fea75f9b36d7e7aff17f3bdabad1881d3514ea6ee0b8f1e722b3489862eecb3
7
- data.tar.gz: 7309d2edd09df2c59dec2fb22df1e5cfa82caa2e6faba27e42f03999f35093b913df83a7ee4e23385b1ddd7d498e3aba663e7f0cc1a3fabd78e01521383f0364
6
+ metadata.gz: 2b205d9443bb5589e6425969bc735fdfb01b43f14b60c5b94b5409e8ce4113c11c3504f2f28dd1898030a4ca2364d7162367ff59f4483ea1d0d299ac4182b953
7
+ data.tar.gz: baeff3cb6c216746c0b39007b4271282cdc85a9c2ef9de0d7953a0ad6cd46e0a09b4bbec8b231377f72ae2ee977b6d0255ff58f3292d00002faacf507682a57b
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.2.0] - 2022-01-20
4
+
5
+ - Add `Mergent::RequestValidator` to validate that webhooks came from Mergent's API
6
+
3
7
  ## [0.1.2] - 2022-1-13
4
8
 
5
9
  - Define explicit methods in `Mergent::Task`, to allow for use of verifying doubles when testing against them.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mergent (0.1.2)
4
+ mergent (0.2.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -17,7 +17,7 @@ GEM
17
17
  parser (3.1.0.0)
18
18
  ast (~> 2.4.1)
19
19
  public_suffix (4.0.6)
20
- rainbow (3.0.0)
20
+ rainbow (3.1.1)
21
21
  rake (13.0.6)
22
22
  regexp_parser (2.2.0)
23
23
  rexml (3.2.5)
@@ -27,7 +27,7 @@ GEM
27
27
  rspec-mocks (~> 3.10.0)
28
28
  rspec-core (3.10.1)
29
29
  rspec-support (~> 3.10.0)
30
- rspec-expectations (3.10.1)
30
+ rspec-expectations (3.10.2)
31
31
  diff-lcs (>= 1.2.0, < 2.0)
32
32
  rspec-support (~> 3.10.0)
33
33
  rspec-mocks (3.10.2)
@@ -45,7 +45,7 @@ GEM
45
45
  unicode-display_width (>= 1.4.0, < 3.0)
46
46
  rubocop-ast (1.15.1)
47
47
  parser (>= 3.0.1.1)
48
- rubocop-performance (1.13.1)
48
+ rubocop-performance (1.13.2)
49
49
  rubocop (>= 1.7.0, < 2.0)
50
50
  rubocop-ast (>= 0.4.0)
51
51
  rubocop-rake (0.6.0)
data/README.md CHANGED
@@ -47,10 +47,11 @@ After checking out the repo, run `bundle` to install dependencies. Then, run
47
47
  `rake spec` to run the tests.
48
48
 
49
49
  To install this gem onto your local machine, run `bundle exec rake install`.
50
- To release a new version, update the version number in `version.rb`, and then
51
- run `bundle exec rake release`, which will create a git tag for the version,
52
- push git commits and the created tag, and push the `.gem` file to
53
- [rubygems.org](https://rubygems.org).
50
+
51
+ To release a new version, update the changelog, bump the version number in
52
+ `version.rb`, commit that change, and then run `bundle exec rake release`, which
53
+ will create a git tag for the version, push git commits and the created tag, and
54
+ push the `.gem` file to [rubygems.org](https://rubygems.org).
54
55
 
55
56
  ## Contributing
56
57
 
@@ -6,7 +6,7 @@ require "json"
6
6
  module Mergent
7
7
  class Client
8
8
  def self.post(resource, params) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
9
- uri = URI("https://api.mergent.co/v1/#{resource}")
9
+ uri = URI("#{Mergent.endpoint}/#{resource}")
10
10
  headers = {
11
11
  Authorization: "Bearer #{Mergent.api_key}",
12
12
  "Content-Type": "application/json"
@@ -15,7 +15,7 @@ module Mergent
15
15
  request.body = params.to_json
16
16
 
17
17
  https = Net::HTTP.new(uri.host, uri.port)
18
- https.use_ssl = true
18
+ https.use_ssl = Mergent.endpoint.start_with?("https")
19
19
  response = https.request(request)
20
20
 
21
21
  case response
@@ -27,10 +27,20 @@ module Mergent
27
27
  rescue JSON::ParserError
28
28
  body = {}
29
29
  end
30
- raise Mergent::Error, body["message"]
30
+ raise Mergent::Error, error_message(body)
31
31
  end
32
32
  rescue EOFError, Errno::ECONNREFUSED, Errno::ECONNRESET, Errno::EHOSTUNREACH, Errno::ETIMEDOUT, SocketError
33
33
  raise Mergent::ConnectionError
34
34
  end
35
+
36
+ private
37
+
38
+ def self.error_message(body)
39
+ breakdown = body.fetch("errors", []).map { |error| error.fetch("message", nil) }.compact.join(", ")
40
+ msg = body["message"]
41
+ msg << " - #{breakdown}" unless breakdown.empty?
42
+ msg
43
+ end
44
+ private_class_method :error_message
35
45
  end
36
46
  end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mergent
4
+ class RequestValidator
5
+ def initialize(api_key)
6
+ @api_key = api_key || Mergent.api_key
7
+ end
8
+
9
+ def build_signature_for(url, body)
10
+ data = (url || "") + (body || "")
11
+ digest = OpenSSL::Digest.new("sha1")
12
+ Base64.strict_encode64(OpenSSL::HMAC.digest(digest, @api_key, data))
13
+ end
14
+
15
+ def valid_signature?(url, body, signature)
16
+ build_signature_for(url, body) == signature
17
+ end
18
+ end
19
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Mergent
4
- VERSION = "0.1.2"
4
+ VERSION = "0.2.0"
5
5
  end
data/lib/mergent.rb CHANGED
@@ -1,11 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "mergent/errors"
4
+ require_relative "mergent/request_validator"
4
5
  require_relative "mergent/task"
5
6
  require_relative "mergent/version"
6
7
 
7
8
  module Mergent
9
+ ENDPOINT = "https://api.mergent.co/v1"
10
+
8
11
  class << self
9
- attr_accessor :api_key
12
+ attr_accessor :api_key, :endpoint
10
13
  end
11
14
  end
15
+
16
+ Mergent.endpoint = Mergent::ENDPOINT
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mergent
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mergent
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-13 00:00:00.000000000 Z
11
+ date: 2022-01-20 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Ruby library for the Mergent API. See https://mergent.co for details.
14
14
  email: support@mergent.co
@@ -29,6 +29,7 @@ files:
29
29
  - lib/mergent/client.rb
30
30
  - lib/mergent/errors.rb
31
31
  - lib/mergent/object.rb
32
+ - lib/mergent/request_validator.rb
32
33
  - lib/mergent/task.rb
33
34
  - lib/mergent/version.rb
34
35
  - mergent.gemspec