dnsimple 3.1.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
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