mergent 0.2.0 → 1.0.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: cc06e24825269b013a4a16a36b4efbacce4bff7072a3f477d315a2662b6e9d1b
4
- data.tar.gz: e1827059fe19cce91e14bacea197db6d56d9faafb4499103e2a03515491064be
3
+ metadata.gz: 9281f04808d0bf4eb2e778860b8a6b0d3ecd3a14c998a17b73706aac8f020994
4
+ data.tar.gz: a971e955775cbf0786567c001a814ca751c6f82c552cca96308fe5e263c55aaf
5
5
  SHA512:
6
- metadata.gz: 2b205d9443bb5589e6425969bc735fdfb01b43f14b60c5b94b5409e8ce4113c11c3504f2f28dd1898030a4ca2364d7162367ff59f4483ea1d0d299ac4182b953
7
- data.tar.gz: baeff3cb6c216746c0b39007b4271282cdc85a9c2ef9de0d7953a0ad6cd46e0a09b4bbec8b231377f72ae2ee977b6d0255ff58f3292d00002faacf507682a57b
6
+ metadata.gz: e060f3a1fe02989554c49f9023880fe263263ab72c86ec26ef5710f324b201b21518d52d834e9357ab6a85263acbae9ba8e787e344fa7073824f366ed77af40e
7
+ data.tar.gz: 0226c8ea2989c7d120d396961676956a1b813d657e794e2e0b998554310411eb5d78be5866990b77e182e65915093d750fe51721e36617686466b3733279bde2
data/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [1.0] - 2022-03-10
4
+
5
+ - Switch to the V2 API
6
+ - Add `id` attribute to Task
7
+ - Make `name` optional
8
+ - Add optional `queue` attribute to Task that defaults to `default`
9
+ - Remove `description` from Task
10
+ - Add support for creating, deleting, and updating Schedules
11
+
12
+ ## [0.2.2] - 2022-01-20
13
+
14
+ - Add `Mergent::RequestValidator` to validate that webhooks came from Mergent's API
15
+
16
+ ## [0.2.1] - 2022-01-20
17
+
18
+ - Add `Mergent::RequestValidator` to validate that webhooks came from Mergent's API
19
+
3
20
  ## [0.2.0] - 2022-01-20
4
21
 
5
22
  - Add `Mergent::RequestValidator` to validate that webhooks came from Mergent's API
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mergent (0.2.0)
4
+ mergent (1.0.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -14,43 +14,43 @@ GEM
14
14
  diff-lcs (1.5.0)
15
15
  hashdiff (1.0.1)
16
16
  parallel (1.21.0)
17
- parser (3.1.0.0)
17
+ parser (3.1.1.0)
18
18
  ast (~> 2.4.1)
19
19
  public_suffix (4.0.6)
20
20
  rainbow (3.1.1)
21
21
  rake (13.0.6)
22
- regexp_parser (2.2.0)
22
+ regexp_parser (2.2.1)
23
23
  rexml (3.2.5)
24
- rspec (3.10.0)
25
- rspec-core (~> 3.10.0)
26
- rspec-expectations (~> 3.10.0)
27
- rspec-mocks (~> 3.10.0)
28
- rspec-core (3.10.1)
29
- rspec-support (~> 3.10.0)
30
- rspec-expectations (3.10.2)
24
+ rspec (3.11.0)
25
+ rspec-core (~> 3.11.0)
26
+ rspec-expectations (~> 3.11.0)
27
+ rspec-mocks (~> 3.11.0)
28
+ rspec-core (3.11.0)
29
+ rspec-support (~> 3.11.0)
30
+ rspec-expectations (3.11.0)
31
31
  diff-lcs (>= 1.2.0, < 2.0)
32
- rspec-support (~> 3.10.0)
33
- rspec-mocks (3.10.2)
32
+ rspec-support (~> 3.11.0)
33
+ rspec-mocks (3.11.0)
34
34
  diff-lcs (>= 1.2.0, < 2.0)
35
- rspec-support (~> 3.10.0)
36
- rspec-support (3.10.3)
37
- rubocop (1.24.1)
35
+ rspec-support (~> 3.11.0)
36
+ rspec-support (3.11.0)
37
+ rubocop (1.26.0)
38
38
  parallel (~> 1.10)
39
- parser (>= 3.0.0.0)
39
+ parser (>= 3.1.0.0)
40
40
  rainbow (>= 2.2.2, < 4.0)
41
41
  regexp_parser (>= 1.8, < 3.0)
42
42
  rexml
43
- rubocop-ast (>= 1.15.1, < 2.0)
43
+ rubocop-ast (>= 1.16.0, < 2.0)
44
44
  ruby-progressbar (~> 1.7)
45
45
  unicode-display_width (>= 1.4.0, < 3.0)
46
- rubocop-ast (1.15.1)
47
- parser (>= 3.0.1.1)
48
- rubocop-performance (1.13.2)
46
+ rubocop-ast (1.16.0)
47
+ parser (>= 3.1.1.0)
48
+ rubocop-performance (1.13.3)
49
49
  rubocop (>= 1.7.0, < 2.0)
50
50
  rubocop-ast (>= 0.4.0)
51
51
  rubocop-rake (0.6.0)
52
52
  rubocop (~> 1.0)
53
- rubocop-rspec (2.7.0)
53
+ rubocop-rspec (2.9.0)
54
54
  rubocop (~> 1.19)
55
55
  ruby-progressbar (1.11.0)
56
56
  unicode-display_width (2.1.0)
data/README.md CHANGED
@@ -34,8 +34,14 @@ Mergent.api_key = "..."
34
34
  # create a Task
35
35
  task = Mergent::Task.create({ request: { url: "https://example.com" } })
36
36
 
37
- # get the newly created Task's name
38
- task.name
37
+ # get the newly created Task's ID
38
+ task.id
39
+
40
+ # create a Schedule
41
+ schedule = Mergent::Schedule.create({ cron: "0 8 * * *", request: { url: "https://example.com" } })
42
+
43
+ # get the newly created Schedule's cron schedule
44
+ schedule.cron
39
45
  ```
40
46
 
41
47
  See the [Mergent Ruby docs](https://docs.mergent.co/libraries/ruby) for more
@@ -5,25 +5,42 @@ require "json"
5
5
 
6
6
  module Mergent
7
7
  class Client
8
- def self.post(resource, params) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
8
+ def self.post(resource, params)
9
+ request(Net::HTTP::Post, resource, params)
10
+ end
11
+
12
+ def self.delete(resource, params = {})
13
+ request(Net::HTTP::Delete, resource, params)
14
+ end
15
+
16
+ def self.patch(resource, params)
17
+ request(Net::HTTP::Patch, resource, params)
18
+ end
19
+
20
+ private
21
+
22
+ def self.request(request_class, resource, params) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
9
23
  uri = URI("#{Mergent.endpoint}/#{resource}")
10
24
  headers = {
11
25
  Authorization: "Bearer #{Mergent.api_key}",
12
26
  "Content-Type": "application/json"
13
27
  }
14
- request = Net::HTTP::Post.new(uri, headers)
28
+ request = request_class.new(uri, headers)
15
29
  request.body = params.to_json
16
30
 
17
31
  https = Net::HTTP.new(uri.host, uri.port)
18
32
  https.use_ssl = Mergent.endpoint.start_with?("https")
19
33
  response = https.request(request)
20
34
 
35
+ read_body = response.read_body
36
+ response_body = read_body.nil? || read_body.empty? ? "{}" : read_body
37
+
21
38
  case response
22
39
  when Net::HTTPSuccess
23
- JSON.parse(response.read_body)
40
+ JSON.parse(response_body)
24
41
  else
25
42
  begin
26
- body = JSON.parse(response.read_body)
43
+ body = JSON.parse(response_body)
27
44
  rescue JSON::ParserError
28
45
  body = {}
29
46
  end
@@ -32,8 +49,7 @@ module Mergent
32
49
  rescue EOFError, Errno::ECONNREFUSED, Errno::ECONNRESET, Errno::EHOSTUNREACH, Errno::ETIMEDOUT, SocketError
33
50
  raise Mergent::ConnectionError
34
51
  end
35
-
36
- private
52
+ private_class_method :request
37
53
 
38
54
  def self.error_message(body)
39
55
  breakdown = body.fetch("errors", []).map { |error| error.fetch("message", nil) }.compact.join(", ")
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Mergent
4
4
  class Object
5
+ DEFAULT_QUEUE = "default"
6
+
5
7
  attr_reader :_data
6
8
 
7
9
  def initialize(data = {})
@@ -6,14 +6,13 @@ module Mergent
6
6
  @api_key = api_key || Mergent.api_key
7
7
  end
8
8
 
9
- def build_signature_for(url, body)
10
- data = (url || "") + (body || "")
9
+ def build_signature(body)
11
10
  digest = OpenSSL::Digest.new("sha1")
12
- Base64.strict_encode64(OpenSSL::HMAC.digest(digest, @api_key, data))
11
+ Base64.strict_encode64(OpenSSL::HMAC.digest(digest, @api_key, body || ""))
13
12
  end
14
13
 
15
- def valid_signature?(url, body, signature)
16
- build_signature_for(url, body) == signature
14
+ def valid_signature?(body, signature)
15
+ build_signature(body) == signature
17
16
  end
18
17
  end
19
18
  end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "client"
4
+ require_relative "object"
5
+
6
+ module Mergent
7
+ class Schedule < Mergent::Object
8
+ ATTRS = %i[id queue cron rrule dtstart type description request created_at].freeze
9
+
10
+ ATTRS.each do |name|
11
+ define_method(name) do
12
+ @_data[name]
13
+ end
14
+ end
15
+
16
+ def self.create(params = {})
17
+ data = Client.post(
18
+ "schedules",
19
+ { queue: Mergent::Object::DEFAULT_QUEUE }.merge(params)
20
+ )
21
+ new(data)
22
+ end
23
+
24
+ def self.update(id, params)
25
+ data = Client.patch("schedules/#{id}", params)
26
+ new(data)
27
+ end
28
+
29
+ def self.delete(id)
30
+ Client.delete("schedules/#{id}")
31
+ true
32
+ end
33
+ end
34
+ end
data/lib/mergent/task.rb CHANGED
@@ -5,7 +5,7 @@ require_relative "object"
5
5
 
6
6
  module Mergent
7
7
  class Task < Mergent::Object
8
- ATTRS = %i[name description status request scheduled_for created_at].freeze
8
+ ATTRS = %i[id name queue status request scheduled_for created_at].freeze
9
9
 
10
10
  ATTRS.each do |name|
11
11
  define_method(name) do
@@ -14,7 +14,10 @@ module Mergent
14
14
  end
15
15
 
16
16
  def self.create(params = {})
17
- data = Client.post("tasks", params)
17
+ data = Client.post(
18
+ "tasks",
19
+ { queue: Mergent::Object::DEFAULT_QUEUE }.merge(params)
20
+ )
18
21
  new(data)
19
22
  end
20
23
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Mergent
4
- VERSION = "0.2.0"
4
+ VERSION = "1.0.0"
5
5
  end
data/lib/mergent.rb CHANGED
@@ -3,10 +3,11 @@
3
3
  require_relative "mergent/errors"
4
4
  require_relative "mergent/request_validator"
5
5
  require_relative "mergent/task"
6
+ require_relative "mergent/schedule"
6
7
  require_relative "mergent/version"
7
8
 
8
9
  module Mergent
9
- ENDPOINT = "https://api.mergent.co/v1"
10
+ ENDPOINT = "https://api.mergent.co/v2"
10
11
 
11
12
  class << self
12
13
  attr_accessor :api_key, :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.2.0
4
+ version: 1.0.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-20 00:00:00.000000000 Z
11
+ date: 2022-03-10 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
@@ -30,6 +30,7 @@ files:
30
30
  - lib/mergent/errors.rb
31
31
  - lib/mergent/object.rb
32
32
  - lib/mergent/request_validator.rb
33
+ - lib/mergent/schedule.rb
33
34
  - lib/mergent/task.rb
34
35
  - lib/mergent/version.rb
35
36
  - mergent.gemspec