dennis-client 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 4a1f20fe7792d9b35ebd46ef5534abce7aa58e95e0c6d426b8999d88a39d9080
4
+ data.tar.gz: 26fb26887882aed7c9572e508267a48f9cf62179e3bfbe2c5d26a834f54d3ac8
5
+ SHA512:
6
+ metadata.gz: 94e51088eb391d0cbe4d0837fe95da4eafb601c9fd42ff0fa2db58727927094868dcab1bdaaa17b68f9f025a1fc5e0b043ca5b12d0d21933a45ce05181957544
7
+ data.tar.gz: e28bc9ea027f5d667ba87a786b0a986595a20d31c064ccb12c6e870f009c51facbffa445b5fb65f911cab473af29fbd6cdff5521eba6356b4265cb9c531c095f
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.1.1
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'apia_client'
4
+ require 'dennis/group'
5
+ require 'dennis/zone'
6
+ require 'dennis/nameserver'
7
+ require 'dennis/record'
8
+ require 'dennis/record_type'
9
+
10
+ module Dennis
11
+ class Client
12
+
13
+ attr_reader :hostname
14
+ attr_reader :api_key
15
+ attr_reader :api
16
+
17
+ def initialize(hostname, api_key, **options)
18
+ @hostname = hostname
19
+ @api_key = api_key
20
+
21
+ @api = ApiaClient.load(hostname, namespace: 'api/v1', **options)
22
+ @api.headers['Authorization'] = "Bearer #{api_key}"
23
+ end
24
+
25
+ def record_types
26
+ RecordType.all(self)
27
+ end
28
+
29
+ def groups(**opts)
30
+ Group.all(self, **opts)
31
+ end
32
+
33
+ def group(id, field: :id)
34
+ Group.find_by(self, field, id)
35
+ end
36
+
37
+ def create_group(**opts)
38
+ Group.create(self, **opts)
39
+ end
40
+
41
+ def zones(**opts)
42
+ Zone.all(self, **opts)
43
+ end
44
+
45
+ def zone(id, field: :id)
46
+ Zone.find_by(self, field, id)
47
+ end
48
+
49
+ def record(id, field: :id)
50
+ Record.find_by(self, field, id)
51
+ end
52
+
53
+ def tagged_records(tags, group: nil)
54
+ Record.all_by_tag(self, tags, group: group)
55
+ end
56
+
57
+ def nameservers
58
+ Nameserver.all(self)
59
+ end
60
+
61
+ def nameserver(id, field: :id)
62
+ Nameserver.find_by(self, field, id)
63
+ end
64
+
65
+ def create_nameserver(**opts)
66
+ Nameserver.create(self, **opts)
67
+ end
68
+
69
+ end
70
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dennis
4
+
5
+ class Error < StandardError
6
+ end
7
+
8
+ class ExternalReferenceRequiredError < Error
9
+ end
10
+
11
+ end
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dennis/nameserver'
4
+ require 'dennis/validation_error'
5
+
6
+ module Dennis
7
+ class Group
8
+
9
+ class << self
10
+
11
+ def all(client, page: nil, per_page: nil)
12
+ request = client.api.create_request(:get, 'groups')
13
+ request.arguments[:page] = page if page
14
+ request.arguments[:per_page] = per_page if per_page
15
+ PaginatedArray.create(request.perform.hash, 'groups') do |hash|
16
+ new(client, hash)
17
+ end
18
+ end
19
+
20
+ def find_by(client, field, value)
21
+ request = client.api.create_request(:get, 'groups/:group')
22
+ request.arguments[:group] = { field => value }
23
+ Group.new(client, request.perform.hash['group'])
24
+ rescue ApiaClient::RequestError => e
25
+ e.code == 'group_not_found' ? nil : raise
26
+ end
27
+
28
+ def create(client, name:, external_reference: nil)
29
+ request = client.api.create_request(:post, 'groups')
30
+ request.arguments[:properties] = { name: name, external_reference: external_reference }
31
+ Group.new(client, request.perform.hash['group'])
32
+ rescue ApiaClient::RequestError => e
33
+ raise ValidationError, e.detail['errors'] if e.code == 'validation_error'
34
+
35
+ raise
36
+ end
37
+
38
+ end
39
+
40
+ def initialize(client, hash)
41
+ @client = client
42
+ @hash = hash
43
+ end
44
+
45
+ def id
46
+ @hash['id']
47
+ end
48
+
49
+ def name
50
+ @hash['name']
51
+ end
52
+
53
+ def external_reference
54
+ @hash['external_reference']
55
+ end
56
+
57
+ def created_at
58
+ return nil if @hash['created_at'].nil?
59
+ return @hash['created_at'] if @hash['created_at'].is_a?(Time)
60
+
61
+ Time.at(@hash['created_at'])
62
+ end
63
+
64
+ def updated_at
65
+ return nil if @hash['updated_at'].nil?
66
+ return @hash['updated_at'] if @hash['updated_at'].is_a?(Time)
67
+
68
+ Time.at(@hash['updated_at'])
69
+ end
70
+
71
+ def nameservers
72
+ @nameservers ||= @hash['nameservers'].map do |hash|
73
+ Nameserver.new(@client, hash)
74
+ end
75
+ end
76
+
77
+ def create_zone(**properties)
78
+ Zone.create(@client, group: { id: id }, **properties)
79
+ end
80
+
81
+ def create_or_update_zone(**properties)
82
+ Zone.create_or_update(@client, group: { id: id }, **properties)
83
+ end
84
+
85
+ def zones(**options)
86
+ Zone.all_for_group(@client, { id: id }, **options)
87
+ end
88
+
89
+ def zone(id, field: :id)
90
+ zone = Zone.find_by(@client, field, id)
91
+ return nil if zone.nil?
92
+ return nil if zone.group.id != self.id
93
+
94
+ zone
95
+ end
96
+
97
+ def tagged_records(tags)
98
+ Record.all_by_tag(@client, tags, group: { id: id })
99
+ end
100
+
101
+ def update(properties)
102
+ req = @client.api.create_request(:patch, 'groups/:group')
103
+ req.arguments['group'] = { id: id }
104
+ req.arguments['properties'] = properties
105
+ @hash = req.perform.hash['group']
106
+ true
107
+ rescue ApiaClient::RequestError => e
108
+ raise ValidationError, e.detail['errors'] if e.code == 'validation_error'
109
+
110
+ raise
111
+ end
112
+
113
+ def delete
114
+ req = @client.api.create_request(:delete, 'groups/:group')
115
+ req.arguments['group'] = { id: id }
116
+ req.perform
117
+ true
118
+ end
119
+
120
+ end
121
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dennis/error'
4
+
5
+ module Dennis
6
+ class GroupNotFoundError < Error
7
+ end
8
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dennis
4
+ class Nameserver
5
+
6
+ class << self
7
+
8
+ def all(client)
9
+ nameservers = client.api.perform(:get, 'nameservers')
10
+ nameservers.hash['nameservers'].map { |hash| new(client, hash) }
11
+ end
12
+
13
+ def find_by(client, field, value)
14
+ request = client.api.create_request(:get, 'nameservers/:nameserver')
15
+ request.arguments[:nameserver] = { field => value }
16
+ new(client, request.perform.hash['nameserver'])
17
+ rescue ApiaClient::RequestError => e
18
+ e.code == 'nameserver_not_found' ? nil : raise
19
+ end
20
+
21
+ def create(client, name:, server: nil)
22
+ request = client.api.create_request(:post, 'nameservers')
23
+ request.arguments[:properties] = { name: name, server: server }
24
+ new(client, request.perform.hash['nameserver'])
25
+ rescue ApiaClient::RequestError => e
26
+ raise ValidationError, e.detail['errors'] if e.code == 'validation_error'
27
+
28
+ raise
29
+ end
30
+
31
+ end
32
+
33
+ def initialize(client, hash)
34
+ @client = client
35
+ @hash = hash
36
+ end
37
+
38
+ def id
39
+ @hash['id']
40
+ end
41
+
42
+ def name
43
+ @hash['name']
44
+ end
45
+
46
+ def server
47
+ @hash['server']
48
+ end
49
+
50
+ def created_at
51
+ return nil if @hash['created_at'].nil?
52
+ return @hash['created_at'] if @hash['created_at'].is_a?(Time)
53
+
54
+ Time.at(@hash['created_at'])
55
+ end
56
+
57
+ def updated_at
58
+ return nil if @hash['updated_at'].nil?
59
+ return @hash['updated_at'] if @hash['updated_at'].is_a?(Time)
60
+
61
+ Time.at(@hash['updated_at'])
62
+ end
63
+
64
+ def update(properties)
65
+ req = @client.api.create_request(:patch, 'nameservers/:nameserver')
66
+ req.arguments['nameserver'] = { id: id }
67
+ req.arguments['properties'] = properties
68
+ @hash = req.perform.hash['nameserver']
69
+ true
70
+ rescue ApiaClient::RequestError => e
71
+ raise ValidationError, e.detail['errors'] if e.code == 'validation_error'
72
+
73
+ raise
74
+ end
75
+
76
+ def delete
77
+ req = @client.api.create_request(:delete, 'nameservers/:nameserver')
78
+ req.arguments['nameserver'] = { id: id }
79
+ req.perform
80
+ true
81
+ end
82
+
83
+ end
84
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dennis/pagination'
4
+
5
+ module Dennis
6
+ class PaginatedArray < Array
7
+
8
+ attr_accessor :pagination
9
+
10
+ class << self
11
+
12
+ def create(result, key, &block)
13
+ result_hash = result[key]
14
+ array = new(result_hash.map(&block))
15
+ array.pagination = Pagination.new(result['pagination'])
16
+ array
17
+ end
18
+
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dennis
4
+ class Pagination
5
+
6
+ def initialize(hash)
7
+ @hash = hash
8
+ end
9
+
10
+ def current_page
11
+ @hash['current_page']
12
+ end
13
+
14
+ def total_pages
15
+ @hash['total_pages']
16
+ end
17
+
18
+ def total
19
+ @hash['total']
20
+ end
21
+
22
+ def per_page
23
+ @hash['per_page']
24
+ end
25
+
26
+ def large_set?
27
+ @hash['large_set']
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,178 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dennis/error'
4
+ require 'dennis/validation_error'
5
+ require 'dennis/zone_not_found_error'
6
+
7
+ module Dennis
8
+ class Record
9
+
10
+ class << self
11
+
12
+ def all(client, zone, **options)
13
+ request = client.api.create_request(:get, 'zones/:zone/records')
14
+ request.arguments[:zone] = zone
15
+ options.each do |field, value|
16
+ request.arguments[field] = value
17
+ end
18
+ request.perform.hash['records'].map { |hash| new(client, hash) }
19
+ end
20
+
21
+ def all_by_tag(client, tags, group: nil)
22
+ request = client.api.create_request(:get, 'records/tagged')
23
+ request.arguments[:tags] = tags
24
+ request.arguments[:group] = group if group
25
+ request.perform.hash['records'].map { |hash| new(client, hash) }
26
+ end
27
+
28
+ def find_by(client, field, value)
29
+ request = client.api.create_request(:get, 'records/:record')
30
+ request.arguments[:record] = { field => value }
31
+ new(client, request.perform.hash['record'])
32
+ rescue ApiaClient::RequestError => e
33
+ e.code == 'record_not_found' ? nil : raise
34
+ end
35
+
36
+ def create(client, zone:, **properties)
37
+ request = client.api.create_request(:post, 'records')
38
+ request.arguments[:zone] = zone
39
+ request.arguments[:properties] = properties_to_argument(properties)
40
+ new(client, request.perform.hash['record'])
41
+ rescue ApiaClient::RequestError => e
42
+ raise ZoneNotFoundError if e.code == 'zone_not_found'
43
+ raise ValidationError, e.detail['errors'] if e.code == 'validation_error'
44
+
45
+ raise
46
+ end
47
+
48
+ def create_or_update(client, zone_id, **properties)
49
+ if properties[:external_reference].nil?
50
+ raise Dennis::ExternalReferenceRequiredError, 'An external_reference must be provided to use create_or_update'
51
+ end
52
+
53
+ record = find_by(client, :external_reference, properties[:external_reference])
54
+ if record.nil?
55
+ create(client, zone: { id: zone_id }, **properties)
56
+ else
57
+ record.update(properties)
58
+ record
59
+ end
60
+ end
61
+
62
+ def properties_to_argument(hash, type: nil)
63
+ arguments = {}
64
+ [:name, :type, :ttl, :priority, :external_reference, :tags].each do |field_name|
65
+ arguments[field_name] = hash[field_name] if hash.key?(field_name)
66
+
67
+ type = hash[field_name] if field_name == :type && hash.key?(field_name)
68
+ end
69
+
70
+ if hash.key?(:content)
71
+ if type.nil?
72
+ raise Error, 'Cannot generate record properties without a type'
73
+ end
74
+
75
+ arguments[:content] = { type.to_s.upcase => hash[:content] }
76
+ end
77
+ arguments
78
+ end
79
+
80
+ end
81
+
82
+ def initialize(client, hash)
83
+ @client = client
84
+ @hash = hash
85
+ end
86
+
87
+ def id
88
+ @hash['id']
89
+ end
90
+
91
+ def name
92
+ @hash['name']
93
+ end
94
+
95
+ def full_name
96
+ @hash['full_name']
97
+ end
98
+
99
+ def type
100
+ @hash['type']
101
+ end
102
+
103
+ def ttl
104
+ @hash['ttl']
105
+ end
106
+
107
+ def priority
108
+ @hash['priority']
109
+ end
110
+
111
+ def external_reference
112
+ @hash['external_reference']
113
+ end
114
+
115
+ def managed?
116
+ @hash['managed']
117
+ end
118
+
119
+ def tags
120
+ @hash['tags']
121
+ end
122
+
123
+ def created_at
124
+ return nil if @hash['created_at'].nil?
125
+ return @hash['created_at'] if @hash['created_at'].is_a?(Time)
126
+
127
+ Time.at(@hash['created_at'])
128
+ end
129
+
130
+ def updated_at
131
+ return nil if @hash['updated_at'].nil?
132
+ return @hash['updated_at'] if @hash['updated_at'].is_a?(Time)
133
+
134
+ Time.at(@hash['updated_at'])
135
+ end
136
+
137
+ def zone
138
+ return @zone if @zone
139
+ return nil unless @hash['zone']
140
+
141
+ @zone = Zone.new(@client, @hash['zone'])
142
+ end
143
+
144
+ def raw_content
145
+ @hash['raw_content']
146
+ end
147
+
148
+ def display_content
149
+ @hash['display_content']
150
+ end
151
+
152
+ def content
153
+ return nil if type.nil?
154
+
155
+ @hash.dig('content', type.to_s.upcase)&.transform_keys(&:to_sym)
156
+ end
157
+
158
+ def update(properties)
159
+ req = @client.api.create_request(:patch, 'records/:record')
160
+ req.arguments['record'] = { id: id }
161
+ req.arguments['properties'] = self.class.properties_to_argument(properties, type: type)
162
+ @hash = req.perform.hash['record']
163
+ true
164
+ rescue ApiaClient::RequestError => e
165
+ raise ValidationError, e.detail['errors'] if e.code == 'validation_error'
166
+
167
+ raise
168
+ end
169
+
170
+ def delete
171
+ req = @client.api.create_request(:delete, 'records/:record')
172
+ req.arguments['record'] = { id: id }
173
+ req.perform
174
+ true
175
+ end
176
+
177
+ end
178
+ end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dennis
4
+ class RecordType
5
+
6
+ class << self
7
+
8
+ def all(client)
9
+ request = client.api.create_request(:get, 'record_types')
10
+ request.perform.hash['record_types'].each_with_object({}) do |rt, hash|
11
+ type = new(rt)
12
+ hash[type.name] = type
13
+ end
14
+ end
15
+
16
+ end
17
+
18
+ def initialize(hash)
19
+ @hash = hash
20
+ end
21
+
22
+ def name
23
+ @hash['name']
24
+ end
25
+
26
+ def requires_priority?
27
+ @hash['requires_priority'] == true
28
+ end
29
+
30
+ def managed_only?
31
+ @hash['managed_only'] == true
32
+ end
33
+
34
+ def exposed?
35
+ @hash['exposed'] == true
36
+ end
37
+
38
+ def content_attributes
39
+ @hash['content_attributes'].map do |hash|
40
+ ContentAttribute.new(hash)
41
+ end
42
+ end
43
+
44
+ class ContentAttribute
45
+
46
+ def initialize(hash)
47
+ @hash = hash
48
+ end
49
+
50
+ def name
51
+ @hash['name']
52
+ end
53
+
54
+ def label
55
+ @hash['label']
56
+ end
57
+
58
+ def type
59
+ @hash['type']
60
+ end
61
+
62
+ def options
63
+ return [] if @hash['options'].nil?
64
+
65
+ @hash['options'].map do |hash|
66
+ ContentAttributeOption.new(hash)
67
+ end
68
+ end
69
+
70
+ end
71
+
72
+ class ContentAttributeOption
73
+
74
+ def initialize(hash)
75
+ @hash = hash
76
+ end
77
+
78
+ def label
79
+ @hash['label']
80
+ end
81
+
82
+ def value
83
+ @hash['value']
84
+ end
85
+
86
+ end
87
+
88
+ end
89
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dennis/error'
4
+ require 'dennis/validation_error_detail'
5
+
6
+ module Dennis
7
+ class ValidationError < Error
8
+
9
+ attr_reader :errors
10
+
11
+ def initialize(errors)
12
+ super
13
+ @errors = errors.map { |e| ValidationErrorDetail.new(e) }
14
+ end
15
+
16
+ def to_s
17
+ "Validation error: #{errors.map(&:message).join(', ')}"
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dennis
4
+ class ValidationErrorDetail
5
+
6
+ def initialize(hash)
7
+ @hash = hash
8
+ end
9
+
10
+ def attribute
11
+ @hash['attribute']
12
+ end
13
+
14
+ def type
15
+ @hash['type']
16
+ end
17
+
18
+ def message
19
+ @hash['message']
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dennis
4
+
5
+ VERSION_FILE_ROOT = File.expand_path('../../VERSION', __dir__)
6
+ if File.file?(VERSION_FILE_ROOT)
7
+ VERSION = File.read(VERSION_FILE_ROOT).strip.sub(/\Av/, '')
8
+ else
9
+ VERSION = '0.0.0.dev'
10
+ end
11
+
12
+ end
@@ -0,0 +1,214 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dennis/validation_error'
4
+ require 'dennis/group_not_found_error'
5
+ require 'dennis/record'
6
+ require 'dennis/paginated_array'
7
+
8
+ module Dennis
9
+ class Zone
10
+
11
+ class << self
12
+
13
+ def all(client, query: nil, view: nil, tags: nil, page: nil, per_page: nil)
14
+ request = client.api.create_request(:get, 'zones')
15
+ request.arguments[:query] = query if query
16
+ request.arguments[:view] = view if view
17
+ request.arguments[:tags] = tags if tags
18
+ request.arguments[:page] = page if page
19
+ request.arguments[:per_page] = per_page if per_page
20
+ PaginatedArray.create(request.perform.hash, 'zones') do |hash|
21
+ new(client, hash)
22
+ end
23
+ end
24
+
25
+ def all_for_group(client, group, query: nil, view: nil, tags: nil, page: nil, per_page: nil)
26
+ request = client.api.create_request(:get, 'groups/:group/zones')
27
+ request.arguments[:group] = group
28
+ request.arguments[:query] = query if query
29
+ request.arguments[:view] = view if view
30
+ request.arguments[:tags] = tags if tags
31
+ request.arguments[:page] = page if page
32
+ request.arguments[:per_page] = per_page if per_page
33
+ PaginatedArray.create(request.perform.hash, 'zones') do |hash|
34
+ new(client, hash)
35
+ end
36
+ end
37
+
38
+ def find_by(client, field, value)
39
+ request = client.api.create_request(:get, 'zones/:zone')
40
+ request.arguments[:zone] = { field => value }
41
+ new(client, request.perform.hash['zone'])
42
+ rescue ApiaClient::RequestError => e
43
+ e.code == 'zone_not_found' ? nil : raise
44
+ end
45
+
46
+ def create(client,
47
+ group:,
48
+ allow_sub_domains_of_zones_in_other_groups: nil,
49
+ **properties)
50
+ request = client.api.create_request(:post, 'zones')
51
+ request.arguments[:group] = group
52
+ request.arguments[:properties] = properties
53
+ unless allow_sub_domains_of_zones_in_other_groups.nil?
54
+ request.arguments[:allow_sub_domains_of_zones_in_other_groups] = allow_sub_domains_of_zones_in_other_groups
55
+ end
56
+ new(client, request.perform.hash['zone'])
57
+ rescue ApiaClient::RequestError => e
58
+ raise GroupNotFoundError if e.code == 'group_not_found'
59
+ raise ValidationError, e.detail['errors'] if e.code == 'validation_error'
60
+
61
+ raise
62
+ end
63
+
64
+ def create_or_update(client, group:, **properties)
65
+ if properties[:external_reference].nil?
66
+ raise Dennis::ExternalReferenceRequiredError, 'An external_reference must be provided to use create_or_update'
67
+ end
68
+
69
+ zone = find_by(client, :external_reference, properties[:external_reference])
70
+ if zone.nil?
71
+ create(client, group: group, **properties)
72
+ else
73
+ zone.update(properties)
74
+ zone
75
+ end
76
+ end
77
+
78
+ end
79
+
80
+ def initialize(client, hash)
81
+ @client = client
82
+ @hash = hash
83
+ end
84
+
85
+ def id
86
+ @hash['id']
87
+ end
88
+
89
+ def name
90
+ @hash['name']
91
+ end
92
+
93
+ def external_reference
94
+ @hash['external_reference']
95
+ end
96
+
97
+ def nameservers_verified_at
98
+ parse_time(@hash['nameservers_verified_at'])
99
+ end
100
+
101
+ def nameservers_checked_at
102
+ parse_time(@hash['nameservers_checked_at'])
103
+ end
104
+
105
+ def nameservers_verified?
106
+ @hash['nameservers_verified']
107
+ end
108
+
109
+ def verified?
110
+ @hash['verified']
111
+ end
112
+
113
+ def always_verified?
114
+ @hash['always_verified']
115
+ end
116
+
117
+ def reverse_dns?
118
+ @hash['reverse_dns']
119
+ end
120
+
121
+ def stale_verification?
122
+ @hash['stale_verification']
123
+ end
124
+
125
+ def default_ttl
126
+ @hash['default_ttl']
127
+ end
128
+
129
+ def tags
130
+ @hash['tags']
131
+ end
132
+
133
+ def group
134
+ return @group if @group
135
+ return nil unless @hash['group']
136
+
137
+ @group = Group.new(@client, @hash['group'])
138
+ end
139
+
140
+ def created_at
141
+ return nil if @hash['created_at'].nil?
142
+ return @hash['created_at'] if @hash['created_at'].is_a?(Time)
143
+
144
+ Time.at(@hash['created_at'])
145
+ end
146
+
147
+ def updated_at
148
+ return nil if @hash['updated_at'].nil?
149
+ return @hash['updated_at'] if @hash['updated_at'].is_a?(Time)
150
+
151
+ Time.at(@hash['updated_at'])
152
+ end
153
+
154
+ def create_record(**properties)
155
+ Record.create(@client, zone: { id: id }, **properties)
156
+ end
157
+
158
+ def create_or_update_record(**properties)
159
+ Record.create_or_update(@client, id, **properties)
160
+ end
161
+
162
+ def records(**options)
163
+ Record.all(@client, { id: id }, **options)
164
+ end
165
+
166
+ def record(value, field: :id)
167
+ record = Record.find_by(@client, field, value)
168
+ return nil if record.nil?
169
+ return nil if record.zone.id != id
170
+
171
+ record
172
+ end
173
+
174
+ def update(properties)
175
+ req = @client.api.create_request(:patch, 'zones/:zone')
176
+ req.arguments['zone'] = { id: id }
177
+ req.arguments['properties'] = properties
178
+ @hash = req.perform.hash['zone']
179
+ true
180
+ rescue ApiaClient::RequestError => e
181
+ raise ValidationError, e.detail['errors'] if e.code == 'validation_error'
182
+
183
+ raise
184
+ end
185
+
186
+ def delete
187
+ req = @client.api.create_request(:delete, 'zones/:zone')
188
+ req.arguments['zone'] = { id: id }
189
+ req.perform
190
+ true
191
+ end
192
+
193
+ def verify_nameservers
194
+ req = @client.api.create_request(:post, 'zones/:zone/verify_nameservers')
195
+ req.arguments['zone'] = { id: id }
196
+ @hash = req.perform.hash['zone']
197
+ verified?
198
+ rescue ApiaClient::RequestError => e
199
+ raise unless e.code == 'nameservers_already_verified'
200
+
201
+ true
202
+ end
203
+
204
+ private
205
+
206
+ def parse_time(time)
207
+ return nil if time.nil?
208
+ return time if time.is_a?(Time)
209
+
210
+ Time.at(time.to_i)
211
+ end
212
+
213
+ end
214
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dennis/error'
4
+
5
+ module Dennis
6
+ class ZoneNotFoundError < Error
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ # rubocop:disable Naming/FileName
2
+ # frozen_string_literal: true
3
+
4
+ require 'dennis'
5
+ # rubocop:enable Naming/FileName
data/lib/dennis.rb ADDED
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dennis/client'
4
+
5
+ module Dennis
6
+
7
+ class << self
8
+
9
+ def new(hostname, api_key)
10
+ Client.new(hostname, api_key)
11
+ end
12
+
13
+ end
14
+
15
+ end
metadata ADDED
@@ -0,0 +1,74 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dennis-client
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Adam Cooke
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-10-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: apia-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: A client library for talking to the Dennis DNS API.
28
+ email:
29
+ - adam@krystal.uk
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - VERSION
35
+ - lib/dennis-client.rb
36
+ - lib/dennis.rb
37
+ - lib/dennis/client.rb
38
+ - lib/dennis/error.rb
39
+ - lib/dennis/group.rb
40
+ - lib/dennis/group_not_found_error.rb
41
+ - lib/dennis/nameserver.rb
42
+ - lib/dennis/paginated_array.rb
43
+ - lib/dennis/pagination.rb
44
+ - lib/dennis/record.rb
45
+ - lib/dennis/record_type.rb
46
+ - lib/dennis/validation_error.rb
47
+ - lib/dennis/validation_error_detail.rb
48
+ - lib/dennis/version.rb
49
+ - lib/dennis/zone.rb
50
+ - lib/dennis/zone_not_found_error.rb
51
+ homepage: https://github.com/krystal/dennis-client
52
+ licenses:
53
+ - MIT
54
+ metadata: {}
55
+ post_install_message:
56
+ rdoc_options: []
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '2.5'
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ requirements: []
70
+ rubygems_version: 3.1.6
71
+ signing_key:
72
+ specification_version: 4
73
+ summary: A client library for talking to the Dennis DNS API.
74
+ test_files: []