dnsimple 8.5.0 → 8.7.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: 446911b281dcecf8ebea06ee9429851c721acb7757b1deee3aef8cd5aa5bf556
4
- data.tar.gz: 3bdc28942ca0dde6156122522849bfac6d03bee431a1b952db37b0b11445ffaa
3
+ metadata.gz: 71cf40738100b3388caeebb75622d78d73a3b1810711cfd9099b3f5fb97fbd43
4
+ data.tar.gz: 812bb20d76f731d08065dfa7703fd77a41e56cd9078f5a8f7c431f36df7d6a7d
5
5
  SHA512:
6
- metadata.gz: e9c8fbf1c0f0a6af73adcf3a2ce7a77755525f60538b3e9ca4d8e6c63642370b480a7b8d3d2d03b2efab18422dc2a111ab677a26700bbffff944c516ec88554c
7
- data.tar.gz: 490ad2dca6043a664a7858fb3a6f91880be430d2221c27b9dcc3f00112aa1d0fdca99216f27975996ad1ed7f1f931516c2844b6da36cde84ea44c28464e82e5b
6
+ metadata.gz: fda1515e6b1d10f098f86c951d6f3d20af9bbbea762b062dd01ab4ebfa90f313c2fcf63718e93b016df05518101653edbb9d7cf0cd28e2d0870106ef9ee07e05
7
+ data.tar.gz: bfad72709061c258c83829366b7aa4fa5758fb3765eac93cc58748c737f644f8d4e35981d33d76104e6b4126f9b6ecb5cf28ea091b95c6e048f0fdbd8ac4738b
@@ -16,7 +16,7 @@ jobs:
16
16
  runs-on: ubuntu-latest
17
17
  steps:
18
18
  - name: Checkout Code
19
- uses: actions/checkout@v3
19
+ uses: actions/checkout@v4
20
20
  - name: Run markdownlint-cli
21
21
  uses: nosborn/github-action-markdown-cli@v3.3.0
22
22
  with:
@@ -37,7 +37,7 @@ jobs:
37
37
  - 'ruby-head'
38
38
  - 'truffleruby-head'
39
39
  steps:
40
- - uses: actions/checkout@v3
40
+ - uses: actions/checkout@v4
41
41
  - name: Set up Ruby
42
42
  uses: ruby/setup-ruby@v1
43
43
  with:
@@ -19,7 +19,7 @@ jobs:
19
19
  wait-interval: 10
20
20
  allowed-conclusions: success
21
21
 
22
- - uses: actions/checkout@v3
22
+ - uses: actions/checkout@v4
23
23
 
24
24
  - name: Release Gem
25
25
  uses: simplyqio/publish-rubygems-action@2.0.0
data/CHANGELOG.md CHANGED
@@ -4,6 +4,20 @@ This project uses [Semantic Versioning 2.0.0](http://semver.org/).
4
4
 
5
5
  ## main
6
6
 
7
+ ## 8.7.0
8
+
9
+ FEATURES:
10
+
11
+ - NEW: Added `Dnsimple::Client::Billing#charges` to retrieve the list of billing charges for an account. (dnsimple/dnsimple-ruby#365)
12
+
13
+ ## 8.6.0
14
+
15
+ FEATURES:
16
+
17
+ - NEW: Added `Dnsimple::Client::Registrar#get_domain_transfer_lock` to retrieves the transfer lock status of a registered domain. (dnsimple/dnsimple-ruby#356)
18
+ - NEW: Added `Dnsimple::Client::Registrar#enable_domain_transfer_lock` to enable the transfer lock for a registered domain. (dnsimple/dnsimple-ruby#356)
19
+ - NEW: Added `Dnsimple::Client::Registrar#disable_domain_transfer_lock` to disable the transfer lock for a registered domain. (dnsimple/dnsimple-ruby#356)
20
+
7
21
  ## 8.5.0
8
22
 
9
23
  FEATURES:
data/Gemfile CHANGED
@@ -5,7 +5,7 @@ source 'https://rubygems.org'
5
5
  gemspec
6
6
 
7
7
  gem 'coveralls', require: false
8
- gem 'rubocop', '1.55.1', require: false
9
- gem 'rubocop-performance', '1.18.0', require: false
8
+ gem 'rubocop', '1.57.1', require: false
9
+ gem 'rubocop-performance', '1.19.1', require: false
10
10
  gem 'rubocop-rake', '0.6.0', require: false
11
- gem 'rubocop-rspec', '2.23.0', require: false
11
+ gem 'rubocop-rspec', '2.24.1', require: false
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dnsimple
4
+ class Client
5
+ module Billing
6
+ # List the billing charges for the account.
7
+ #
8
+ # @see https://developer.dnsimple.com/v2/billing/#listCharges
9
+ #
10
+ # @example List charges in the first page
11
+ # client.charges.list(1010)
12
+ #
13
+ # @example List charges, provide a filter start date
14
+ # client.charges.list(1010, filter: { start_date: "2023-01-01" })
15
+ #
16
+ # @example List charges, provide a sorting policy
17
+ # client.charges.list(1010, sort: "invoiced:asc")
18
+ #
19
+ # @param [Integer] account_id the account ID
20
+ # @param [Hash] options the filtering and sorting options
21
+ # @option options [Integer] :page current page (pagination)
22
+ # @option options [Integer] :per_page number of entries to return (pagination)
23
+ # @option options [String] :sort sorting policy
24
+ # @return [Dnsimple::PaginatedResponse<Dnsimple::Struct::Charge>]
25
+ #
26
+ # @raise [Dnsimple::RequestError]
27
+ def charges(account_id, options = {})
28
+ response = client.get(Client.versioned("/%s/billing/charges" % [account_id]), Options::ListOptions.new(options))
29
+
30
+ Dnsimple::PaginatedResponse.new(response, response["data"].map { |r| Struct::Charge.new(r) })
31
+ end
32
+ alias list_charges charges
33
+ end
34
+ end
35
+ end
@@ -8,6 +8,11 @@ module Dnsimple
8
8
  @services[:accounts] ||= Client::AccountsService.new(self)
9
9
  end
10
10
 
11
+ # @return [Dnsimple::Client::BillingService] The billing-related API proxy.
12
+ def billing
13
+ @services[:billing] ||= Client::BillingService.new(self)
14
+ end
15
+
11
16
  # @return [Dnsimple::Client::CertificatesService] The certificate-related API proxy.
12
17
  def certificates
13
18
  @services[:certificates] ||= Client::CertificatesService.new(self)
@@ -115,6 +120,11 @@ module Dnsimple
115
120
  include Client::Accounts
116
121
  end
117
122
 
123
+ require_relative 'billing'
124
+
125
+ class BillingService < ClientService
126
+ include Client::Billing
127
+ end
118
128
 
119
129
  require_relative 'certificates'
120
130
 
@@ -164,6 +174,7 @@ module Dnsimple
164
174
  require_relative 'registrar_auto_renewal'
165
175
  require_relative 'registrar_whois_privacy'
166
176
  require_relative 'registrar_registrant_changes'
177
+ require_relative 'registrar_transfer_lock'
167
178
  require_relative 'registrar_delegation'
168
179
 
169
180
  class RegistrarService < ClientService
@@ -171,6 +182,7 @@ module Dnsimple
171
182
  include Client::RegistrarAutoRenewal
172
183
  include Client::RegistrarDelegation
173
184
  include Client::RegistrarRegistrantChanges
185
+ include Client::RegistrarTransferLock
174
186
  include Client::RegistrarWhoisPrivacy
175
187
  end
176
188
 
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dnsimple
4
+ class Client
5
+ module RegistrarTransferLock
6
+
7
+ # Gets the transfer lock for the domain.
8
+ #
9
+ # @example Get the transfer lock for "example.com":
10
+ # client.registrar.get_domain_transfer_lock(1010, "example.com")
11
+ #
12
+ # @param [#to_s] account_id the account ID
13
+ # @param [#to_s] domain_name the domain name
14
+ # @param [Hash] options
15
+ # @return [Struct::TransferLock]
16
+ #
17
+ # @raise [Dnsimple::NotFoundError]
18
+ # @raise [RequestError] When the request fails.
19
+ def get_domain_transfer_lock(account_id, domain_name, options = {})
20
+ response = client.get(Client.versioned("/%s/registrar/domains/%s/transfer_lock" % [account_id, domain_name]), options)
21
+
22
+ Dnsimple::Response.new(response, Struct::TransferLock.new(response["data"]))
23
+ end
24
+
25
+ # Enable transfer lock for the domain in the account.
26
+ #
27
+ # @see https://developer.dnsimple.com/v2/registrar/#enableDomainTransferLock
28
+ #
29
+ # @param [Integer] account_id the account ID
30
+ # @param [#to_s] domain_name the domain name
31
+ # @param [Hash] options
32
+ # @return [Struct::TransferLock]
33
+ #
34
+ # @raise [Dnsimple::NotFoundError]
35
+ # @raise [Dnsimple::RequestError]
36
+ def enable_domain_transfer_lock(account_id, domain_name, options = {})
37
+ response = client.post(Client.versioned("/%s/registrar/domains/%s/transfer_lock" % [account_id, domain_name]), nil, options)
38
+
39
+ Dnsimple::Response.new(response, Struct::TransferLock.new(response["data"]))
40
+ end
41
+
42
+ # Disable trasnfer lock for the domain in the account.
43
+ #
44
+ # @see https://developer.dnsimple.com/v2/registrar/#disableDomainTransferLock
45
+ #
46
+ # @param [Integer] account_id the account ID
47
+ # @param [#to_s] domain_name the domain name
48
+ # @param [Hash] options
49
+ # @return [Struct::TransferLock]
50
+ #
51
+ # @raise [Dnsimple::NotFoundError]
52
+ # @raise [Dnsimple::RequestError]
53
+ def disable_domain_transfer_lock(account_id, domain_name, options = {})
54
+ response = client.delete(Client.versioned("/%s/registrar/domains/%s/transfer_lock" % [account_id, domain_name]), nil, options)
55
+
56
+ Dnsimple::Response.new(response, Struct::TransferLock.new(response["data"]))
57
+ end
58
+
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bigdecimal'
4
+
5
+ module Dnsimple
6
+ module Struct
7
+ class Charge < Base
8
+
9
+ class ChargeItem < Base
10
+ # @return [String] The description of the charge item.
11
+ attr_accessor :description
12
+
13
+ # @return [Float] The amount of the charge item.
14
+ attr_reader :amount
15
+
16
+ # @return [Integer] The ID of the product that was charged.
17
+ attr_accessor :product_id
18
+
19
+ # @return [String] The type of the product that was charged.
20
+ attr_accessor :product_type
21
+
22
+ # @return [String] A unique or representative reference.
23
+ attr_accessor :product_reference
24
+
25
+ # Converts amount to a Float and sets it.
26
+ #
27
+ # @param [String] amount
28
+ # @return [void]
29
+ def amount=(amount)
30
+ @amount = BigDecimal(amount)
31
+ end
32
+ end
33
+
34
+ # @return [String] The reference number of the invoice.
35
+ attr_accessor :reference
36
+
37
+ # @return [Float] The aggregate amount of all line items, that need to be paid.
38
+ attr_reader :total_amount
39
+
40
+ # @return [Float] The amount that was paid via wallet.
41
+ attr_reader :balance_amount
42
+
43
+ # @return [String] The state of the charge.
44
+ attr_accessor :state
45
+
46
+ # @return [DateTime] When the charge was invoiced.
47
+ attr_accessor :invoiced_at
48
+
49
+ # @return [Array<ChargeItems>] The charge items.
50
+ attr_reader :items
51
+
52
+ def initialize(*)
53
+ super
54
+ @items ||= []
55
+ end
56
+
57
+ # Converts items to an Array<Struct::Charge::ChargeItem> and sets it.
58
+ #
59
+ # @param [Array<Hash>] charge_items
60
+ # @return [void]
61
+ def items=(charge_items)
62
+ @items = charge_items.map do |charge_item|
63
+ Charge::ChargeItem.new(charge_item)
64
+ end
65
+ end
66
+
67
+ # Converts balance_amount to a Float and sets it.
68
+ #
69
+ # @param [String] balance_amount
70
+ # @return [void]
71
+ def balance_amount=(balance_amount)
72
+ @balance_amount = BigDecimal(balance_amount)
73
+ end
74
+
75
+ # Converts total_amount to a Float and sets it.
76
+ #
77
+ # @param [String] total_amount
78
+ # @return [void]
79
+ def total_amount=(total_amount)
80
+ @total_amount = BigDecimal(total_amount)
81
+ end
82
+ end
83
+
84
+ end
85
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dnsimple
4
+ module Struct
5
+
6
+ class TransferLock < Base
7
+ # @return [Boolean] True if Transfer Lock is enabled on the domain, otherwise false
8
+ attr_accessor :enabled
9
+ end
10
+
11
+ end
12
+ end
@@ -22,6 +22,7 @@ require_relative 'struct/certificate'
22
22
  require_relative 'struct/certificate_bundle'
23
23
  require_relative 'struct/certificate_purchase'
24
24
  require_relative 'struct/certificate_renewal'
25
+ require_relative 'struct/charge'
25
26
  require_relative 'struct/delegation_signer_record'
26
27
  require_relative 'struct/dnssec'
27
28
  require_relative 'struct/domain'
@@ -37,6 +38,7 @@ require_relative 'struct/extended_attribute'
37
38
  require_relative 'struct/oauth_token'
38
39
  require_relative 'struct/registrant_change_check'
39
40
  require_relative 'struct/registrant_change'
41
+ require_relative 'struct/transfer_lock'
40
42
  require_relative 'struct/zone_record'
41
43
  require_relative 'struct/service'
42
44
  require_relative 'struct/template'
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dnsimple
4
- VERSION = "8.5.0"
4
+ VERSION = "8.7.0"
5
5
  end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ require 'bigdecimal/util'
6
+
7
+ describe Dnsimple::Client, ".billing" do
8
+
9
+ subject { described_class.new(base_url: "https://api.dnsimple.test", access_token: "a1b2c3").billing }
10
+
11
+ describe "#charges" do
12
+ let(:account_id) { 1010 }
13
+
14
+ before do
15
+ stub_request(:get, %r{/v2/#{account_id}/billing/charges})
16
+ .to_return(read_http_fixture("listCharges/success.http"))
17
+ end
18
+
19
+ it "builds the correct request" do
20
+ subject.charges(account_id)
21
+
22
+ expect(WebMock).to have_requested(:get, "https://api.dnsimple.test/v2/#{account_id}/billing/charges")
23
+ .with(headers: { 'Accept' => 'application/json' })
24
+ end
25
+
26
+ it "exposes the pagination information" do
27
+ response = subject.charges(account_id)
28
+
29
+ expect(response.respond_to?(:page)).to be(true)
30
+ expect(response.page).to eq(1)
31
+ expect(response.per_page).to be_a(Integer)
32
+ expect(response.total_entries).to be_a(Integer)
33
+ expect(response.total_pages).to be_a(Integer)
34
+ end
35
+
36
+ it "returns the charges" do
37
+ response = subject.charges(account_id)
38
+
39
+ expect(response).to be_a(Dnsimple::PaginatedResponse)
40
+ expect(response.data).to be_a(Array)
41
+ expect(response.data.size).to eq(3)
42
+
43
+ response.data.each do |result|
44
+ expect(result).to be_a(Dnsimple::Struct::Charge)
45
+ expect(result.balance_amount).to be_a(BigDecimal)
46
+ expect(result.reference).to be_a(String)
47
+ expect(result.items).to be_a(Array)
48
+ expect(result.items[0]).to be_a(Dnsimple::Struct::Charge::ChargeItem)
49
+ end
50
+
51
+ expect(response.data[0].total_amount).to be_a(BigDecimal)
52
+ expect(response.data[0].total_amount.to_s("F")).to eq("14.5")
53
+ expect(response.data[0].items[0].amount).to be_a(BigDecimal)
54
+ expect(response.data[0].items[0].amount.to_s("F")).to eq("14.5")
55
+ end
56
+
57
+ it "supports filters" do
58
+ subject.charges(account_id, filter: { start_date: "2023-01-01", end_date: "2023-08-31" })
59
+
60
+ expect(WebMock).to have_requested(:get, "https://api.dnsimple.test/v2/#{account_id}/billing/charges?start_date=2023-01-01&end_date=2023-08-31")
61
+ end
62
+
63
+ it "supports pagination" do
64
+ subject.charges(account_id, page: 2)
65
+
66
+ expect(WebMock).to have_requested(:get, "https://api.dnsimple.test/v2/#{account_id}/billing/charges?page=2")
67
+ end
68
+
69
+ it "supports sorting" do
70
+ subject.charges(account_id, sort: "invoiced:asc")
71
+
72
+ expect(WebMock).to have_requested(:get, "https://api.dnsimple.test/v2/#{account_id}/billing/charges?sort=invoiced:asc")
73
+ end
74
+
75
+ context "when using a bad filter" do
76
+ before do
77
+ stub_request(:get, %r{/v2/#{account_id}/billing/charges})
78
+ .to_return(read_http_fixture("listCharges/fail-400-bad-filter.http"))
79
+ end
80
+
81
+ it "raises error" do
82
+ expect do
83
+ subject.charges(account_id, filter: { start_date: "01-01-2023" })
84
+ end.to raise_error(Dnsimple::RequestError, "Invalid date format must be ISO8601 (YYYY-MM-DD)")
85
+ end
86
+ end
87
+
88
+ context "when account is not authorized" do
89
+ before do
90
+ stub_request(:get, %r{/v2/#{account_id}/billing/charges})
91
+ .to_return(read_http_fixture("listCharges/fail-403.http"))
92
+ end
93
+
94
+ it "raises error" do
95
+ expect do
96
+ subject.charges(account_id)
97
+ end.to raise_error(Dnsimple::RequestError, "Permission Denied. Required Scope: billing:*:read")
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Dnsimple::Client, ".registrar" do
6
+ subject { described_class.new(base_url: "https://api.dnsimple.test", access_token: "a1b2c3").registrar }
7
+
8
+ describe "#get_domain_transfer_lock" do
9
+ let(:account_id) { 1010 }
10
+ let(:domain_id) { "example.com" }
11
+
12
+ before do
13
+ stub_request(:get, %r{/v2/#{account_id}/registrar/domains/#{domain_id}/transfer_lock})
14
+ .to_return(read_http_fixture("getDomainTransferLock/success.http"))
15
+ end
16
+
17
+ it "builds the correct request" do
18
+ subject.get_domain_transfer_lock(account_id, domain_id)
19
+
20
+ expect(WebMock).to have_requested(:get, "https://api.dnsimple.test/v2/#{account_id}/registrar/domains/#{domain_id}/transfer_lock")
21
+ .with(headers: { 'Accept' => 'application/json' })
22
+ end
23
+
24
+ it "returns the transfer lock state" do
25
+ response = subject.get_domain_transfer_lock(account_id, domain_id)
26
+ expect(response).to be_a(Dnsimple::Response)
27
+
28
+ result = response.data
29
+ expect(result).to be_a(Dnsimple::Struct::TransferLock)
30
+ expect(result.enabled).to be(true)
31
+ end
32
+
33
+ context "when the domain does not exist" do
34
+ it "raises NotFoundError" do
35
+ stub_request(:get, %r{/v2})
36
+ .to_return(read_http_fixture("notfound-domain.http"))
37
+
38
+ expect {
39
+ subject.get_domain_transfer_lock(account_id, domain_id)
40
+ }.to raise_error(Dnsimple::NotFoundError)
41
+ end
42
+ end
43
+ end
44
+
45
+ describe "#enable_domain_transfer_lock" do
46
+ let(:account_id) { 1010 }
47
+ let(:domain_id) { "example.com" }
48
+
49
+ before do
50
+ stub_request(:post, %r{/v2/#{account_id}/registrar/domains/#{domain_id}/transfer_lock})
51
+ .to_return(read_http_fixture("enableDomainTransferLock/success.http"))
52
+ end
53
+
54
+ it "builds the correct request" do
55
+ subject.enable_domain_transfer_lock(account_id, domain_id)
56
+
57
+ expect(WebMock).to have_requested(:post, "https://api.dnsimple.test/v2/#{account_id}/registrar/domains/#{domain_id}/transfer_lock")
58
+ .with(headers: { 'Accept' => 'application/json' })
59
+ end
60
+
61
+ it "returns the transfer lock state" do
62
+ response = subject.enable_domain_transfer_lock(account_id, domain_id)
63
+ expect(response).to be_a(Dnsimple::Response)
64
+
65
+ result = response.data
66
+ expect(result).to be_a(Dnsimple::Struct::TransferLock)
67
+ expect(result.enabled).to be(true)
68
+ end
69
+
70
+ context "when the domain does not exist" do
71
+ it "raises NotFoundError" do
72
+ stub_request(:post, %r{/v2})
73
+ .to_return(read_http_fixture("notfound-domain.http"))
74
+
75
+ expect {
76
+ subject.enable_domain_transfer_lock(account_id, domain_id)
77
+ }.to raise_error(Dnsimple::NotFoundError)
78
+ end
79
+ end
80
+ end
81
+
82
+ describe "#disable_domain_transfer_lock" do
83
+ let(:account_id) { 1010 }
84
+ let(:domain_id) { "example.com" }
85
+
86
+ before do
87
+ stub_request(:delete, %r{/v2/#{account_id}/registrar/domains/#{domain_id}})
88
+ .to_return(read_http_fixture("disableDomainTransferLock/success.http"))
89
+ end
90
+
91
+ it "builds the correct request" do
92
+ subject.disable_domain_transfer_lock(account_id, domain_id)
93
+
94
+ expect(WebMock).to have_requested(:delete, "https://api.dnsimple.test/v2/#{account_id}/registrar/domains/#{domain_id}/transfer_lock")
95
+ .with(headers: { 'Accept' => 'application/json' })
96
+ end
97
+
98
+ it "returns the transfer lock state" do
99
+ response = subject.disable_domain_transfer_lock(account_id, domain_id)
100
+ expect(response).to be_a(Dnsimple::Response)
101
+
102
+ result = response.data
103
+ expect(result).to be_a(Dnsimple::Struct::TransferLock)
104
+ expect(result.enabled).to be(false)
105
+ end
106
+
107
+ context "when the domain does not exist" do
108
+ it "raises NotFoundError" do
109
+ stub_request(:delete, %r{/v2})
110
+ .to_return(read_http_fixture("notfound-domain.http"))
111
+
112
+ expect {
113
+ subject.disable_domain_transfer_lock(account_id, domain_id)
114
+ }.to raise_error(Dnsimple::NotFoundError)
115
+ end
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,20 @@
1
+ HTTP/1.1 200 OK
2
+ Server: nginx
3
+ Date: Tue, 15 Aug 2023 09:58:37 GMT
4
+ Content-Type: application/json; charset=utf-8
5
+ Connection: keep-alive
6
+ X-RateLimit-Limit: 2400
7
+ X-RateLimit-Remaining: 2398
8
+ X-RateLimit-Reset: 1488538623
9
+ ETag: W/"fc2368a31a1b6a3afcca33bb37ff6b9d"
10
+ Cache-Control: max-age=0, private, must-revalidate
11
+ X-Request-Id: 8b0fe49a-c810-4552-84ab-a1cd9b4a7786
12
+ X-Runtime: 0.024780
13
+ X-Content-Type-Options: nosniff
14
+ X-Download-Options: noopen
15
+ X-Frame-Options: DENY
16
+ X-Permitted-Cross-Domain-Policies: none
17
+ X-XSS-Protection: 1; mode=block
18
+ Strict-Transport-Security: max-age=31536000
19
+
20
+ {"data":{"enabled":false}}
@@ -0,0 +1,20 @@
1
+ HTTP/1.1 201 Created
2
+ Server: nginx
3
+ Date: Tue, 15 Aug 2023 09:58:37 GMT
4
+ Content-Type: application/json; charset=utf-8
5
+ Connection: keep-alive
6
+ X-RateLimit-Limit: 2400
7
+ X-RateLimit-Remaining: 2398
8
+ X-RateLimit-Reset: 1488538623
9
+ ETag: W/"fc2368a31a1b6a3afcca33bb37ff6b9d"
10
+ Cache-Control: max-age=0, private, must-revalidate
11
+ X-Request-Id: 8b0fe49a-c810-4552-84ab-a1cd9b4a7786
12
+ X-Runtime: 0.024780
13
+ X-Content-Type-Options: nosniff
14
+ X-Download-Options: noopen
15
+ X-Frame-Options: DENY
16
+ X-Permitted-Cross-Domain-Policies: none
17
+ X-XSS-Protection: 1; mode=block
18
+ Strict-Transport-Security: max-age=31536000
19
+
20
+ {"data":{"enabled":true}}
@@ -0,0 +1,20 @@
1
+ HTTP/1.1 200 OK
2
+ Server: nginx
3
+ Date: Tue, 15 Aug 2023 09:58:37 GMT
4
+ Content-Type: application/json; charset=utf-8
5
+ Connection: keep-alive
6
+ X-RateLimit-Limit: 2400
7
+ X-RateLimit-Remaining: 2398
8
+ X-RateLimit-Reset: 1488538623
9
+ ETag: W/"fc2368a31a1b6a3afcca33bb37ff6b9d"
10
+ Cache-Control: max-age=0, private, must-revalidate
11
+ X-Request-Id: 8b0fe49a-c810-4552-84ab-a1cd9b4a7786
12
+ X-Runtime: 0.024780
13
+ X-Content-Type-Options: nosniff
14
+ X-Download-Options: noopen
15
+ X-Frame-Options: DENY
16
+ X-Permitted-Cross-Domain-Policies: none
17
+ X-XSS-Protection: 1; mode=block
18
+ Strict-Transport-Security: max-age=31536000
19
+
20
+ {"data":{"enabled":true}}
@@ -0,0 +1,14 @@
1
+ HTTP/1.1 400 Bad Request
2
+ Date: Tue, 24 Oct 2023 08:13:01 GMT
3
+ Connection: close
4
+ X-RateLimit-Limit: 2400
5
+ X-RateLimit-Remaining: 2392
6
+ X-RateLimit-Reset: 1698136677
7
+ Content-Type: application/json; charset=utf-8
8
+ X-WORK-WITH-US: Love automation? So do we! https://dnsimple.com/jobs
9
+ Cache-Control: no-cache
10
+ X-Request-Id: bdfbf3a7-d9dc-4018-9732-61502be989a3
11
+ X-Runtime: 0.455303
12
+ Transfer-Encoding: chunked
13
+
14
+ {"message":"Invalid date format must be ISO8601 (YYYY-MM-DD)"}
@@ -0,0 +1,14 @@
1
+ HTTP/1.1 403 Forbidden
2
+ Date: Tue, 24 Oct 2023 09:49:29 GMT
3
+ Connection: close
4
+ X-RateLimit-Limit: 2400
5
+ X-RateLimit-Remaining: 2398
6
+ X-RateLimit-Reset: 1698143967
7
+ Content-Type: application/json; charset=utf-8
8
+ X-WORK-WITH-US: Love automation? So do we! https://dnsimple.com/jobs
9
+ Cache-Control: no-cache
10
+ X-Request-Id: 5554e2d3-2652-4ca7-8c5e-92b4c35f28d6
11
+ X-Runtime: 0.035309
12
+ Transfer-Encoding: chunked
13
+
14
+ {"message":"Permission Denied. Required Scope: billing:*:read"}
@@ -0,0 +1,14 @@
1
+ HTTP/1.1 200 OK
2
+ Date: Tue, 24 Oct 2023 09:52:55 GMT
3
+ Connection: close
4
+ X-RateLimit-Limit: 2400
5
+ X-RateLimit-Remaining: 2397
6
+ X-RateLimit-Reset: 1698143967
7
+ Content-Type: application/json; charset=utf-8
8
+ X-WORK-WITH-US: Love automation? So do we! https://dnsimple.com/jobs
9
+ Cache-Control: no-store, must-revalidate, private, max-age=0
10
+ X-Request-Id: a57a87c8-626a-4361-9fb8-b55ca9be8e5d
11
+ X-Runtime: 0.060526
12
+ Transfer-Encoding: chunked
13
+
14
+ {"data":[{"invoiced_at":"2023-08-17T05:53:36Z","total_amount":"14.50","balance_amount":"0.00","reference":"1-2","state":"collected","items":[{"description":"Register bubble-registered.com","amount":"14.50","product_id":1,"product_type":"domain-registration","product_reference":"bubble-registered.com"}]},{"invoiced_at":"2023-08-17T05:57:53Z","total_amount":"14.50","balance_amount":"0.00","reference":"2-2","state":"refunded","items":[{"description":"Register example.com","amount":"14.50","product_id":2,"product_type":"domain-registration","product_reference":"example.com"}]},{"invoiced_at":"2023-10-24T07:49:05Z","total_amount":"1099999.99","balance_amount":"0.00","reference":"4-2","state":"collected","items":[{"description":"Test Line Item 1","amount":"99999.99","product_id":null,"product_type":"manual","product_reference":null},{"description":"Test Line Item 2","amount":"1000000.00","product_id":null,"product_type":"manual","product_reference":null}]}],"pagination":{"current_page":1,"per_page":30,"total_entries":3,"total_pages":1}}
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dnsimple
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.5.0
4
+ version: 8.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - DNSimple
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-08-24 00:00:00.000000000 Z
11
+ date: 2023-11-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -110,6 +110,7 @@ files:
110
110
  - lib/dnsimple.rb
111
111
  - lib/dnsimple/client.rb
112
112
  - lib/dnsimple/client/accounts.rb
113
+ - lib/dnsimple/client/billing.rb
113
114
  - lib/dnsimple/client/certificates.rb
114
115
  - lib/dnsimple/client/clients.rb
115
116
  - lib/dnsimple/client/contacts.rb
@@ -125,6 +126,7 @@ files:
125
126
  - lib/dnsimple/client/registrar_auto_renewal.rb
126
127
  - lib/dnsimple/client/registrar_delegation.rb
127
128
  - lib/dnsimple/client/registrar_registrant_changes.rb
129
+ - lib/dnsimple/client/registrar_transfer_lock.rb
128
130
  - lib/dnsimple/client/registrar_whois_privacy.rb
129
131
  - lib/dnsimple/client/services.rb
130
132
  - lib/dnsimple/client/services_domains.rb
@@ -148,6 +150,7 @@ files:
148
150
  - lib/dnsimple/struct/certificate_bundle.rb
149
151
  - lib/dnsimple/struct/certificate_purchase.rb
150
152
  - lib/dnsimple/struct/certificate_renewal.rb
153
+ - lib/dnsimple/struct/charge.rb
151
154
  - lib/dnsimple/struct/collaborator.rb
152
155
  - lib/dnsimple/struct/contact.rb
153
156
  - lib/dnsimple/struct/delegation_signer_record.rb
@@ -169,6 +172,7 @@ files:
169
172
  - lib/dnsimple/struct/template.rb
170
173
  - lib/dnsimple/struct/template_record.rb
171
174
  - lib/dnsimple/struct/tld.rb
175
+ - lib/dnsimple/struct/transfer_lock.rb
172
176
  - lib/dnsimple/struct/user.rb
173
177
  - lib/dnsimple/struct/vanity_name_server.rb
174
178
  - lib/dnsimple/struct/webhook.rb
@@ -181,6 +185,7 @@ files:
181
185
  - lib/dnsimple/struct/zone_record.rb
182
186
  - lib/dnsimple/version.rb
183
187
  - spec/dnsimple/client/accounts_spec.rb
188
+ - spec/dnsimple/client/billing_spec.rb
184
189
  - spec/dnsimple/client/certificates_spec.rb
185
190
  - spec/dnsimple/client/client_service_spec.rb
186
191
  - spec/dnsimple/client/contacts_spec.rb
@@ -195,6 +200,7 @@ files:
195
200
  - spec/dnsimple/client/registrar_auto_renewal_spec.rb
196
201
  - spec/dnsimple/client/registrar_delegation_spec.rb
197
202
  - spec/dnsimple/client/registrar_spec.rb
203
+ - spec/dnsimple/client/registrar_transfer_lock_spec.rb
198
204
  - spec/dnsimple/client/registrar_whois_privacy_spec.rb
199
205
  - spec/dnsimple/client/services_domains_spec.rb
200
206
  - spec/dnsimple/client/services_spec.rb
@@ -266,11 +272,13 @@ files:
266
272
  - spec/fixtures.http/disableDnssec/not-enabled.http
267
273
  - spec/fixtures.http/disableDnssec/success.http
268
274
  - spec/fixtures.http/disableDomainAutoRenewal/success.http
275
+ - spec/fixtures.http/disableDomainTransferLock/success.http
269
276
  - spec/fixtures.http/disableVanityNameServers/success.http
270
277
  - spec/fixtures.http/disableWhoisPrivacy/success.http
271
278
  - spec/fixtures.http/downloadCertificate/success.http
272
279
  - spec/fixtures.http/enableDnssec/success.http
273
280
  - spec/fixtures.http/enableDomainAutoRenewal/success.http
281
+ - spec/fixtures.http/enableDomainTransferLock/success.http
274
282
  - spec/fixtures.http/enableVanityNameServers/success.http
275
283
  - spec/fixtures.http/enableWhoisPrivacy/created.http
276
284
  - spec/fixtures.http/enableWhoisPrivacy/success.http
@@ -289,6 +297,7 @@ files:
289
297
  - spec/fixtures.http/getDomainRegistration/success.http
290
298
  - spec/fixtures.http/getDomainRenewal/success.http
291
299
  - spec/fixtures.http/getDomainTransfer/success.http
300
+ - spec/fixtures.http/getDomainTransferLock/success.http
292
301
  - spec/fixtures.http/getEmailForward/success.http
293
302
  - spec/fixtures.http/getPrimaryServer/success.http
294
303
  - spec/fixtures.http/getRegistrantChange/success.http
@@ -311,6 +320,9 @@ files:
311
320
  - spec/fixtures.http/listAccounts/success-account.http
312
321
  - spec/fixtures.http/listAccounts/success-user.http
313
322
  - spec/fixtures.http/listCertificates/success.http
323
+ - spec/fixtures.http/listCharges/fail-400-bad-filter.http
324
+ - spec/fixtures.http/listCharges/fail-403.http
325
+ - spec/fixtures.http/listCharges/success.http
314
326
  - spec/fixtures.http/listCollaborators/success.http
315
327
  - spec/fixtures.http/listContacts/success.http
316
328
  - spec/fixtures.http/listDelegationSignerRecords/success.http