dnsimple 3.1.0 → 4.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.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +5 -0
  3. data/.rubocop_dnsimple.yml +24 -18
  4. data/CHANGELOG.md +17 -5
  5. data/CONTRIBUTING.md +2 -2
  6. data/Gemfile +0 -1
  7. data/README.md +14 -3
  8. data/dnsimple.gemspec +1 -1
  9. data/lib/dnsimple/client.rb +5 -5
  10. data/lib/dnsimple/client/certificates.rb +89 -0
  11. data/lib/dnsimple/client/clients.rb +37 -0
  12. data/lib/dnsimple/client/collaborators.rb +76 -0
  13. data/lib/dnsimple/client/domains_pushes.rb +97 -0
  14. data/lib/dnsimple/client/registrar.rb +2 -2
  15. data/lib/dnsimple/client/registrar_delegation.rb +42 -0
  16. data/lib/dnsimple/client/services_domains.rb +82 -0
  17. data/lib/dnsimple/client/templates.rb +0 -5
  18. data/lib/dnsimple/client/templates_domains.rb +29 -0
  19. data/lib/dnsimple/client/vanity_name_servers.rb +47 -0
  20. data/lib/dnsimple/client/zones.rb +17 -0
  21. data/lib/dnsimple/client/zones_records.rb +9 -9
  22. data/lib/dnsimple/struct.rb +6 -1
  23. data/lib/dnsimple/struct/certificate.rb +37 -0
  24. data/lib/dnsimple/struct/certificate_bundle.rb +24 -0
  25. data/lib/dnsimple/struct/collaborator.rb +34 -0
  26. data/lib/dnsimple/struct/domain_push.rb +28 -0
  27. data/lib/dnsimple/struct/tld.rb +12 -0
  28. data/lib/dnsimple/struct/zone_file.rb +10 -0
  29. data/lib/dnsimple/struct/{record.rb → zone_record.rb} +4 -1
  30. data/lib/dnsimple/version.rb +1 -1
  31. data/spec/dnsimple/client/accounts_spec.rb +1 -1
  32. data/spec/dnsimple/client/certificates_spec.rb +206 -0
  33. data/spec/dnsimple/client/collaborators_spec.rb +162 -0
  34. data/spec/dnsimple/client/contacts_spec.rb +5 -5
  35. data/spec/dnsimple/client/domains_email_forwards_spec.rb +5 -5
  36. data/spec/dnsimple/client/domains_pushes_spec.rb +162 -0
  37. data/spec/dnsimple/client/domains_spec.rb +6 -6
  38. data/spec/dnsimple/client/registrar_delegation_spec.rb +51 -0
  39. data/spec/dnsimple/client/registrar_spec.rb +6 -6
  40. data/spec/dnsimple/client/registrar_whois_privacy_spec.rb +4 -4
  41. data/spec/dnsimple/client/services_domains_spec.rb +115 -0
  42. data/spec/dnsimple/client/services_spec.rb +1 -1
  43. data/spec/dnsimple/client/templates_domains_spec.rb +32 -0
  44. data/spec/dnsimple/client/templates_records_spec.rb +1 -1
  45. data/spec/dnsimple/client/templates_spec.rb +25 -1
  46. data/spec/dnsimple/client/tlds_spec.rb +8 -4
  47. data/spec/dnsimple/client/vanity_name_servers_spec.rb +54 -0
  48. data/spec/dnsimple/client/webhooks_spec.rb +2 -2
  49. data/spec/dnsimple/client/zones_records_spec.rb +34 -23
  50. data/spec/dnsimple/client/zones_spec.rb +40 -4
  51. data/spec/fixtures.http/acceptPush/success.http +17 -0
  52. data/spec/fixtures.http/addCollaborator/invite-success.http +21 -0
  53. data/spec/fixtures.http/addCollaborator/success.http +21 -0
  54. data/spec/fixtures.http/appliedServices/success.http +21 -0
  55. data/spec/fixtures.http/applyService/created.http +17 -0
  56. data/spec/fixtures.http/applyTemplate/success.http +13 -0
  57. data/spec/fixtures.http/changeDomainDelegationFromVanity/success.http +17 -0
  58. data/spec/fixtures.http/changeDomainDelegationToVanity/success.http +21 -0
  59. data/spec/fixtures.http/createZoneRecord/created.http +13 -9
  60. data/spec/fixtures.http/disableVanityNameServers/success.http +17 -0
  61. data/spec/fixtures.http/downloadCertificate/success.http +21 -0
  62. data/spec/fixtures.http/enableVanityNameServers/success.http +21 -0
  63. data/spec/fixtures.http/getCertificate/success.http +21 -0
  64. data/spec/fixtures.http/getCertificatePrivateKey/success.http +21 -0
  65. data/spec/fixtures.http/getTld/success.http +13 -9
  66. data/spec/fixtures.http/getZoneFile/success.http +21 -0
  67. data/spec/fixtures.http/getZoneRecord/success.http +13 -9
  68. data/spec/fixtures.http/initiatePush/success.http +21 -0
  69. data/spec/fixtures.http/{accounts → listAccounts}/success-account.http +0 -0
  70. data/spec/fixtures.http/{accounts → listAccounts}/success-user.http +0 -0
  71. data/spec/fixtures.http/listCertificates/success.http +21 -0
  72. data/spec/fixtures.http/listCollaborators/success.http +21 -0
  73. data/spec/fixtures.http/listPushes/success.http +21 -0
  74. data/spec/fixtures.http/listTlds/success.http +13 -9
  75. data/spec/fixtures.http/listZoneRecords/success.http +13 -9
  76. data/spec/fixtures.http/notfound-certificate.http +16 -0
  77. data/spec/fixtures.http/notfound-collaborator.http +16 -0
  78. data/spec/fixtures.http/notfound-contact.http +1 -1
  79. data/spec/fixtures.http/notfound-domainpush.http +12 -0
  80. data/spec/fixtures.http/rejectPush/success.http +17 -0
  81. data/spec/fixtures.http/removeCollaborator/success.http +17 -0
  82. data/spec/fixtures.http/unapplyService/success.http +17 -0
  83. data/spec/fixtures.http/updateZoneRecord/success.http +13 -9
  84. metadata +80 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: eb3f3b1fc8b0c99b792b0c1a1d6b27830ff2331f
4
- data.tar.gz: 1c79d167d1d71d3af51981a326494c1a3b02fb53
3
+ metadata.gz: bfd2d022a76ad12b6b4259ce10a2f349c618a31f
4
+ data.tar.gz: 30bb0e50b7d8ed4662c113c70a84c584ae1d9a55
5
5
  SHA512:
6
- metadata.gz: 2f56e2bf1ca4267264aa5730b146de169430497389827745a8ce6bf80bd34dc5f8721454d9c330a83c6684e43f2fbb8ff0d0ec22ad30f70f9892ce64fb952872
7
- data.tar.gz: 2574f383a0a03086b280ded7535153f563364e51d015a5499ea18ca93187f4eaa4c14e76109baab246f2837699426683159ece814c37f930edf8c19f5cc86a31
6
+ metadata.gz: 45b87521f74759ff510845caa7f3b661ce80af3d40aecaa962655296b07b5fab90ceb358e3f180a0a5f736105faadcb38a55078771961073303f496838a5d219
7
+ data.tar.gz: 364c11eb5e67241ff9123e67fa4ce5af26358c8d03eee7f5692b480cf882f56b155144f1c853f92b4b9072a97b69ed55f0fcb9792bb4b7448dd66830c0185b36
@@ -11,3 +11,8 @@ Lint/Loop:
11
11
  # It doesn't seem to work as expected.
12
12
  Style/IfUnlessModifier:
13
13
  Enabled: false
14
+
15
+ # This rule suggest to use safe navigation (&.) operator which was introduced
16
+ # with Ruby 2.3. Because we are supporting Ruby 2.0+ we can't use this operator.
17
+ Style/SafeNavigation:
18
+ Enabled: false
@@ -23,19 +23,6 @@ Metrics/AbcSize:
23
23
  - 'spec/**/*_spec.rb'
24
24
  - 'test/**/*_test.rb'
25
25
 
26
- # For the same reason of EndAlignment, aligning with the case may have a bad impact
27
- # on a case after a very long variable.
28
- #
29
- # invoice_error_message = case error
30
- # when 1 == 1
31
- # do_something
32
- # else
33
- # do_else
34
- # end
35
- #
36
- Style/CaseIndentation:
37
- IndentWhenRelativeTo: end
38
-
39
26
  # [codesmell]
40
27
  Metrics/ClassLength:
41
28
  Enabled: false
@@ -44,27 +31,27 @@ Metrics/ClassLength:
44
31
  - 'test/**/*_test.rb'
45
32
 
46
33
  # [codesmell]
47
- Metrics/MethodLength:
34
+ Metrics/LineLength:
48
35
  Enabled: false
49
36
  Exclude:
50
37
  - 'spec/**/*_spec.rb'
51
38
  - 'test/**/*_test.rb'
52
- Max: 10
39
+ Max: 100
53
40
 
54
41
  # [codesmell]
55
- Metrics/ModuleLength:
42
+ Metrics/MethodLength:
56
43
  Enabled: false
57
44
  Exclude:
58
45
  - 'spec/**/*_spec.rb'
59
46
  - 'test/**/*_test.rb'
47
+ Max: 10
60
48
 
61
49
  # [codesmell]
62
- Metrics/LineLength:
50
+ Metrics/ModuleLength:
63
51
  Enabled: false
64
52
  Exclude:
65
53
  - 'spec/**/*_spec.rb'
66
54
  - 'test/**/*_test.rb'
67
- Max: 100
68
55
 
69
56
  # [codesmell]
70
57
  # I don't really get the point of this cop.
@@ -90,6 +77,19 @@ Style/BlockDelimiters:
90
77
  Style/BracesAroundHashParameters:
91
78
  EnforcedStyle: context_dependent
92
79
 
80
+ # For the same reason of EndAlignment, aligning with the case may have a bad impact
81
+ # on a case after a very long variable.
82
+ #
83
+ # invoice_error_message = case error
84
+ # when 1 == 1
85
+ # do_something
86
+ # else
87
+ # do_else
88
+ # end
89
+ #
90
+ Style/CaseIndentation:
91
+ IndentWhenRelativeTo: end
92
+
93
93
  # I was a big fan of leading, but trailing seems to be more commonly adopted.
94
94
  # At least at the time being.
95
95
  Style/DotPosition:
@@ -131,6 +131,12 @@ Style/FormatString:
131
131
  Style/FirstParameterIndentation:
132
132
  IndentationWidth: 4
133
133
 
134
+ # We don't support frozen strings.
135
+ # This is an experimental feature and we don't know if it will be shipped with
136
+ # Ruby 3.0 or not.
137
+ Style/FrozenStringLiteralComment:
138
+ Enabled: false
139
+
134
140
  # Prefer the latest Hash syntax
135
141
  Style/HashSyntax:
136
142
  Exclude:
@@ -3,20 +3,32 @@
3
3
  This project uses [Semantic Versioning 2.0.0](http://semver.org/).
4
4
 
5
5
 
6
+ #### 4.0.0
7
+
8
+ - NEW: Added domain collaborators support (GH-137).
9
+ - NEW: Added regions support for zone records (GH-135, GH-139).
10
+ - NEW: Added domain services support (GH-122).
11
+ - NEW: Added domain templates support (GH-125).
12
+ - NEW: Added zone file support (GH-124).
13
+ - NEW: Added certificate support (GH-123).
14
+ - NEW: Added domain delegation support (GH-120).
15
+ - NEW: Added domain push support (GH-127).
16
+ - NEW: Added vanity name server support (GH-121).
17
+
18
+ - CHANGED: Record struct renamed to ZoneRecord (GH-117).
19
+ - CHANGED: Updated Tld payload (GH-133, GH-129).
20
+ - CHANGED: Renamed registrar `auth_info` into `auth_code` (GH-136).
21
+
22
+
6
23
  #### 3.1.0
7
24
 
8
25
  - NEW: Added accounts support (GH-113).
9
-
10
26
  - NEW: Added sorting and filtering support (GH-112).
11
-
12
27
  - NEW: Added template record support (GH-104).
13
28
 
14
29
  - CHANGED: Pagination params must be passed as top level options. Previously they were passed inside `:query` options (GH-116).
15
-
16
30
  - CHANGED: Authentication credentials presence is no longer validated on the client as it was causing an error getting the access token (GH-74 and GH-102).
17
-
18
31
  - CHANGED: Setting a custom user-agent no longer overrides the origina user-agent (GH-105).
19
-
20
32
  - CHANGED: Updated client to use Contact#email (GH-108).
21
33
 
22
34
  - REMOVED: Removed support for wildcard accounts (GH-107).
@@ -5,7 +5,7 @@
5
5
  Clone the repository and move into it:
6
6
 
7
7
  ```
8
- $ git clone git@github.com:aetrion/dnsimple-ruby.git
8
+ $ git clone git@github.com:dnsimple/dnsimple-ruby.git
9
9
  $ cd dnsimple-ruby
10
10
  ```
11
11
 
@@ -31,5 +31,5 @@ $ rake
31
31
 
32
32
  Submit unit tests for your changes. You can test your changes on your machine by [running the test suite](#testing).
33
33
 
34
- When you submit a PR, tests will also be run on the continuous integration environment [through Travis](https://travis-ci.org/aetrion/dnsimple-ruby).
34
+ When you submit a PR, tests will also be run on the continuous integration environment [through Travis](https://travis-ci.org/dnsimple/dnsimple-ruby).
35
35
 
data/Gemfile CHANGED
@@ -2,6 +2,5 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
- gem 'rake', '< 11'
6
5
  gem 'coveralls', require: false
7
6
  gem 'rubocop', require: false
data/README.md CHANGED
@@ -2,8 +2,8 @@
2
2
 
3
3
  A Ruby client for the [DNSimple API v2](https://developer.dnsimple.com/v2/).
4
4
 
5
- [![Build Status](https://travis-ci.org/aetrion/dnsimple-ruby.svg?branch=master)](https://travis-ci.org/aetrion/dnsimple-ruby)
6
- [![Coverage Status](https://img.shields.io/coveralls/aetrion/dnsimple-ruby.svg)](https://coveralls.io/r/aetrion/dnsimple-ruby?branch=master)
5
+ [![Build Status](https://travis-ci.org/dnsimple/dnsimple-ruby.svg?branch=master)](https://travis-ci.org/dnsimple/dnsimple-ruby)
6
+ [![Coverage Status](https://img.shields.io/coveralls/dnsimple/dnsimple-ruby.svg)](https://coveralls.io/r/dnsimple/dnsimple-ruby?branch=master)
7
7
 
8
8
  [DNSimple](https://dnsimple.com/) provides DNS hosting and domain registration that is simple and friendly.
9
9
  We provide a full API and an easy-to-use web interface so you can get your domain registered and set up with a minimal amount of effort.
@@ -11,7 +11,7 @@ We provide a full API and an easy-to-use web interface so you can get your domai
11
11
 
12
12
  ## :warning: Beta Warning
13
13
 
14
- This branch targets the development of the API client for the [DNSimple API v2](https://developer.dnsimple.com/v2/). If you are looking for the stable version of the client for [DNSimple API v1](https://developer.dnsimple.com/v1/) then use the [`master-v1`](https://github.com/aetrion/dnsimple-ruby/tree/master-v1) branch.
14
+ This branch targets the development of the API client for the [DNSimple API v2](https://developer.dnsimple.com/v2/). If you are looking for the stable version of the client for [DNSimple API v1](https://developer.dnsimple.com/v1/) then use the [`master-v1`](https://github.com/dnsimple/dnsimple-ruby/tree/master-v1) branch.
15
15
 
16
16
  This library is currently in beta version, the methods and the implementation should be considered a work-in-progress. Changes in the method naming, method signatures, public or internal APIs may happen during the beta period.
17
17
 
@@ -68,6 +68,17 @@ puts response.data
68
68
 
69
69
  For the full library documentation visit http://rubydoc.info/gems/dnsimple
70
70
 
71
+ ## Sandbox Usage
72
+
73
+ If you would like to test the [DNSimple sandbox environment](https://developer.dnsimple.com/sandbox/) then pass the `base_url` named argument when you construct the client. For example:
74
+
75
+ ```ruby
76
+ require 'dnsimple'
77
+
78
+ client = Dnsimple::Client.new(base_url: "https://api.sandbox.dnsimple.com", access_token: "a1b2c3")
79
+ ```
80
+
81
+ You will need to ensure that you are using an access token created in the sandbox environment. Production tokens will *not* work in the sandbox environment.
71
82
 
72
83
  ## License
73
84
 
@@ -7,7 +7,7 @@ Gem::Specification.new do |s|
7
7
  s.version = Dnsimple::VERSION
8
8
  s.authors = ['Anthony Eden', 'Simone Carletti', 'Javier Acero', 'Joseph Caudle', 'Luca Guidi']
9
9
  s.email = ['anthony.eden@dnsimple.com', 'simone.carletti@dnsimple.com', 'javier.acero@dnsimple.com', 'joseph.caudle@dnsimple.com', 'luca.guidi@dnsimple.com']
10
- s.homepage = 'https://github.com/aetrion/dnsimple-ruby'
10
+ s.homepage = 'https://github.com/dnsimple/dnsimple-ruby'
11
11
  s.summary = 'The DNSimple API client for Ruby'
12
12
  s.description = 'The DNSimple API client for Ruby.'
13
13
 
@@ -185,11 +185,11 @@ module Dnsimple
185
185
  end
186
186
 
187
187
  def add_proxy_options!(options)
188
- if proxy
189
- address, port = proxy.split(":")
190
- options[:http_proxyaddr] = address
191
- options[:http_proxyport] = port
192
- end
188
+ return if proxy.nil?
189
+
190
+ address, port = proxy.split(":")
191
+ options[:http_proxyaddr] = address
192
+ options[:http_proxyport] = port
193
193
  end
194
194
 
195
195
  def add_auth_options!(options)
@@ -0,0 +1,89 @@
1
+ module Dnsimple
2
+ class Client
3
+ module Certificates
4
+
5
+ # Lists the certificates associated to the domain.
6
+ #
7
+ # @see https://developer.dnsimple.com/v2/domains/certificates/#list
8
+ # @see #all_certificates
9
+ #
10
+ # @example List certificates in the first page
11
+ # client.certificates.list(1010, "example.com")
12
+ #
13
+ # @example List certificates, provide a specific page
14
+ # client.certificates.list(1010, "example.com", page: 2)
15
+ #
16
+ # @example List certificates, provide a sorting policy
17
+ # client.certificates.list(1010, "example.com", sort: "email:asc")
18
+ #
19
+ # @param [Fixnum] account_id the account ID
20
+ # @param [#to_s] domain_name the domain name
21
+ # @param [Hash] options the filtering and sorting options
22
+ # @option options [Integer] :page current page (pagination)
23
+ # @option options [Integer] :per_page number of entries to return (pagination)
24
+ # @return [Dnsimple::PaginatedResponse<Dnsimple::Struct::Certificate>]
25
+ #
26
+ # @raise [Dnsimple::RequestError]
27
+ def certificates(account_id, domain_name, options = {})
28
+ response = client.get(Client.versioned("/%s/domains/%s/certificates" % [account_id, domain_name]), Options::ListOptions.new(options))
29
+
30
+ Dnsimple::PaginatedResponse.new(response, response["data"].map { |r| Struct::Certificate.new(r) })
31
+ end
32
+
33
+ # Gets a certificate associated to the domain.
34
+ #
35
+ # @see https://developer.dnsimple.com/v2/domains/certificates/#get
36
+ #
37
+ # @param [Fixnum] account_id the account ID
38
+ # @param [#to_s] domain_id the domain ID or domain name
39
+ # @param [Fixnum] certificate_id the certificate ID
40
+ # @param [Hash] options
41
+ # @return [Dnsimple::Response<Dnsimple::Struct::Certificate>]
42
+ #
43
+ # @raise [Dnsimple::NotFoundError]
44
+ # @raise [Dnsimple::RequestError]
45
+ def certificate(account_id, domain_id, certificate_id, options = {})
46
+ response = client.get(Client.versioned("/%s/domains/%s/certificates/%s" % [account_id, domain_id, certificate_id]), options)
47
+
48
+ Dnsimple::Response.new(response, Struct::Certificate.new(response["data"]))
49
+ end
50
+
51
+ # Downloads a certificate associated to the domain.
52
+ #
53
+ # @see https://developer.dnsimple.com/v2/domains/certificates/#download
54
+ #
55
+ # @param [Fixnum] account_id the account ID
56
+ # @param [#to_s] domain_id the domain ID or domain name
57
+ # @param [Fixnum] certificate_id the certificate ID
58
+ # @param [Hash] options
59
+ # @return [Dnsimple::Response<Dnsimple::Struct::CertificateBundle>]
60
+ #
61
+ # @raise [Dnsimple::NotFoundError]
62
+ # @raise [Dnsimple::RequestError]
63
+ def download_certificate(account_id, domain_id, certificate_id, options = {})
64
+ response = client.get(Client.versioned("/%s/domains/%s/certificates/%s/download" % [account_id, domain_id, certificate_id]), options)
65
+
66
+ Dnsimple::Response.new(response, Struct::CertificateBundle.new(response["data"]))
67
+ end
68
+
69
+ # Get certificate private key associated to the domain.
70
+ #
71
+ # @see https://developer.dnsimple.com/v2/domains/certificates/#get-private-key
72
+ #
73
+ # @param [Fixnum] account_id the account ID
74
+ # @param [#to_s] domain_id the domain ID or domain name
75
+ # @param [Fixnum] certificate_id the certificate ID
76
+ # @param [Hash] options
77
+ # @return [Dnsimple::Response<Dnsimple::Struct::CertificateBundle>]
78
+ #
79
+ # @raise [Dnsimple::NotFoundError]
80
+ # @raise [Dnsimple::RequestError]
81
+ def certificate_private_key(account_id, domain_id, certificate_id, options = {})
82
+ response = client.get(Client.versioned("/%s/domains/%s/certificates/%s/private_key" % [account_id, domain_id, certificate_id]), options)
83
+
84
+ Dnsimple::Response.new(response, Struct::CertificateBundle.new(response["data"]))
85
+ end
86
+
87
+ end
88
+ end
89
+ end
@@ -6,6 +6,11 @@ module Dnsimple
6
6
  @services[:accounts] ||= Client::AccountsService.new(self)
7
7
  end
8
8
 
9
+ # @return [Dnsimple::Client::CertificatesService] The certificate-related API proxy.
10
+ def certificates
11
+ @services[:certificates] ||= Client::CertificatesService.new(self)
12
+ end
13
+
9
14
  # @return [Dnsimple::Client::ContactsService] The contact-related API proxy.
10
15
  def contacts
11
16
  @services[:contacts] ||= Client::ContactsService.new(self)
@@ -16,6 +21,11 @@ module Dnsimple
16
21
  @services[:domains] ||= Client::DomainsService.new(self)
17
22
  end
18
23
 
24
+ # @return [Dnsimple::Client::DomainServicesService] The domain-services-related API proxy.
25
+ def domain_services
26
+ @services[:domains] ||= Client::DomainServicesService.new(self)
27
+ end
28
+
19
29
  # @return [Dnsimple::Client::IdentityService] The identity-related API proxy.
20
30
  def identity
21
31
  @services[:auth] ||= Client::IdentityService.new(self)
@@ -46,6 +56,11 @@ module Dnsimple
46
56
  @services[:tlds] ||= Client::TldsService.new(self)
47
57
  end
48
58
 
59
+ # @return [Dnsimple::Client::VanityNameServersService] The vanity-name-server-related API proxy.
60
+ def vanity_name_servers
61
+ @services[:vanity_name_servers] ||= Client::VanityNameServersService.new(self)
62
+ end
63
+
49
64
  # @return [Dnsimple::Client::ZonesService] The zone-related API proxy.
50
65
  def zones
51
66
  @services[:zones] ||= Client::ZonesService.new(self)
@@ -103,6 +118,13 @@ module Dnsimple
103
118
  end
104
119
 
105
120
 
121
+ require_relative 'certificates'
122
+
123
+ class CertificatesService < ClientService
124
+ include Client::Certificates
125
+ end
126
+
127
+
106
128
  require_relative 'contacts'
107
129
 
108
130
  class ContactsService < ClientService
@@ -112,10 +134,14 @@ module Dnsimple
112
134
 
113
135
  require_relative 'domains'
114
136
  require_relative 'domains_email_forwards'
137
+ require_relative 'domains_pushes'
138
+ require_relative 'collaborators'
115
139
 
116
140
  class DomainsService < ClientService
117
141
  include Client::Domains
118
142
  include Client::DomainsEmailForwards
143
+ include Client::DomainsPushes
144
+ include Client::Collaborators
119
145
  end
120
146
 
121
147
 
@@ -147,17 +173,21 @@ module Dnsimple
147
173
 
148
174
 
149
175
  require_relative 'services'
176
+ require_relative 'services_domains'
150
177
 
151
178
  class ServicesService < ClientService
152
179
  include Client::Services
180
+ include Client::ServicesDomains
153
181
  end
154
182
 
155
183
 
156
184
  require_relative 'templates'
185
+ require_relative 'templates_domains'
157
186
  require_relative 'templates_records'
158
187
 
159
188
  class TemplatesService < ClientService
160
189
  include Client::Templates
190
+ include Client::TemplatesDomains
161
191
  include Client::TemplatesRecords
162
192
  end
163
193
 
@@ -169,6 +199,13 @@ module Dnsimple
169
199
  end
170
200
 
171
201
 
202
+ require_relative 'vanity_name_servers'
203
+
204
+ class VanityNameServersService < ClientService
205
+ include Client::VanityNameServers
206
+ end
207
+
208
+
172
209
  require_relative 'zones'
173
210
  require_relative 'zones_records'
174
211
 
@@ -0,0 +1,76 @@
1
+ module Dnsimple
2
+ class Client
3
+ module Collaborators
4
+
5
+ # Lists the collaborators for a domain.
6
+ #
7
+ # @see https://developer.dnsimple.com/v2/domains/collaborators/#list
8
+ #
9
+ # @example List collaborators in the first page
10
+ # client.domains.collaborators(1010, "example.com")
11
+ #
12
+ # @example List collaborators, provide a specific page
13
+ # client.domains.collaborators(1010, "example.com", page: 2)
14
+ #
15
+ # @param [Fixnum] account_id the account ID
16
+ # @param [#to_s] domain_id the domain ID or name
17
+ # @param [Hash] request options
18
+ # @option options [Integer] :page current page (pagination)
19
+ # @option options [Integer] :per_page number of entries to return (pagination)
20
+ # @return [Dnsimple::PaginatedResponse<Dnsimple::Struct::Collaborator>]
21
+ #
22
+ # @raise [Dnsimple::RequestError]
23
+ def collaborators(account_id, domain_id, options = {})
24
+ response = client.get(Client.versioned("/%s/domains/%s/collaborators" % [account_id, domain_id]), Options::ListOptions.new(options))
25
+
26
+ Dnsimple::PaginatedResponse.new(response, response["data"].map { |r| Struct::Collaborator.new(r) })
27
+ end
28
+
29
+ # Add a collaborator to the domain.
30
+ #
31
+ # @see https://developer.dnsimple.com/v2/domains/collaborators/#add
32
+ #
33
+ # @example Add collaborator
34
+ # client.domains.add_collaborator(1010, "example.com", email: "user@example.com")
35
+ #
36
+ # @param [Fixnum] account_id the account ID
37
+ # @param [#to_s] domain_id the domain ID or name
38
+ # @param [Hash] user attributes
39
+ # @param attributes [String] :email user email (mandatory)
40
+ # @param [Hash] request options
41
+ # @return [Dnsimple::PaginatedResponse<Dnsimple::Struct::Collaborator>]
42
+ #
43
+ # @raise [Dnsimple::RequestError]
44
+ def add_collaborator(account_id, domain_id, attributes, options = {})
45
+ Extra.validate_mandatory_attributes(attributes, [:email])
46
+ response = client.post(Client.versioned("/%s/domains/%s/collaborators" % [account_id, domain_id]), attributes, options)
47
+
48
+ Dnsimple::Response.new(response, Struct::Collaborator.new(response["data"]))
49
+ end
50
+
51
+ # Removes a collaborator from the domain.
52
+ #
53
+ # WARNING: this cannot be undone.
54
+ #
55
+ # @see https://developer.dnsimple.com/v2/domains/collaborators/#remove
56
+ #
57
+ # @example Remove collaborator
58
+ # client.domains.remove_collaborator(1010, "example.com", 999)
59
+ #
60
+ # @param [Fixnum] account_id the account ID
61
+ # @param [#to_s] domain_id the domain ID or name
62
+ # @param [#to_s] contact_id the contact ID
63
+ # @param [Hash] request options
64
+ # @return [Dnsimple::Response<nil>]
65
+ #
66
+ # @raise [Dnsimple::NotFoundError]
67
+ # @raise [Dnsimple::RequestError]
68
+ def remove_collaborator(account_id, domain_id, contact_id, options = {})
69
+ response = client.delete(Client.versioned("/%s/domains/%s/collaborators/%s" % [account_id, domain_id, contact_id]), options)
70
+
71
+ Dnsimple::Response.new(response, nil)
72
+ end
73
+
74
+ end
75
+ end
76
+ end