record_store 5.7.1 → 5.7.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 76a9b267be27d4f9f0f013f7bbfd4ea2b55f5e364bf720abd614244ae0943c04
4
- data.tar.gz: d638f51c612e9e45aca478400ddd7f3b42d20bc4de0cf8575bd26efd6d8d9002
3
+ metadata.gz: 7d36a7207b563630aaad6b46c14ea53bcd101ecab97a080626c5f352e52820af
4
+ data.tar.gz: 91c4744ccf18f391f82fccf47663d4706222944029131a9a0d00d42c37360a5e
5
5
  SHA512:
6
- metadata.gz: aa98bccefee0aedecde5a2ea5582205fe8abdd4324220e76a3e728dfd43fef909be0e4561d828f6a41e91e908ea5d9f481fc8e1714d0adb80c3ffc38ef67f1ec
7
- data.tar.gz: b2b8bde921e73d537a48edc9fc8f9ae731f2af91555b713ad565e5f4deb6e9b05d7d55cee3f9d8e9dffb1dc8ed70cfa5e000570186fffc9477fa4efb41985ec4
6
+ metadata.gz: 4a34d35d02f00de085fe658ec928b8407f5470a4ab3e1679957de94bf3311bbb289eec0a2cb2281a1309565011a8522159abeeeb924237b55db8c0a7d7e3f982
7
+ data.tar.gz: '09f3ae5443ef6a06ac977002c79fbc6e37f8c8524bc310a3e4e43b954c8446de1a2dca18c673a33be727156669a00bb19789f0bfef1fe4341f2114f56d0b5697'
@@ -20,7 +20,7 @@ Style/Alias:
20
20
  - prefer_alias
21
21
  - prefer_alias_method
22
22
 
23
- Layout/AlignHash:
23
+ Layout/HashAlignment:
24
24
  EnforcedHashRocketStyle: key
25
25
  EnforcedColonStyle: key
26
26
  EnforcedLastArgumentHashStyle: ignore_implicit
@@ -30,7 +30,7 @@ Layout/AlignHash:
30
30
  - ignore_implicit
31
31
  - ignore_explicit
32
32
 
33
- Layout/AlignParameters:
33
+ Layout/ParameterAlignment:
34
34
  EnforcedStyle: with_fixed_indentation
35
35
  SupportedStyles:
36
36
  - with_first_parameter
@@ -172,7 +172,7 @@ Naming/FileName:
172
172
  Regex:
173
173
  IgnoreExecutableScripts: true
174
174
 
175
- Layout/IndentFirstArgument:
175
+ Layout/FirstArgumentIndentation:
176
176
  EnforcedStyle: consistent
177
177
  SupportedStyles:
178
178
  - consistent
@@ -225,7 +225,7 @@ Layout/IndentationConsistency:
225
225
  Layout/IndentationWidth:
226
226
  Width: 2
227
227
 
228
- Layout/IndentFirstArrayElement:
228
+ Layout/FirstArrayElementIndentation:
229
229
  EnforcedStyle: consistent
230
230
  SupportedStyles:
231
231
  - special_inside_parentheses
@@ -233,10 +233,10 @@ Layout/IndentFirstArrayElement:
233
233
  - align_brackets
234
234
  IndentationWidth:
235
235
 
236
- Layout/IndentAssignment:
236
+ Layout/AssignmentIndentation:
237
237
  IndentationWidth:
238
238
 
239
- Layout/IndentFirstHashElement:
239
+ Layout/FirstHashElementIndentation:
240
240
  EnforcedStyle: consistent
241
241
  SupportedStyles:
242
242
  - special_inside_parentheses
@@ -340,9 +340,9 @@ Style/PercentQLiterals:
340
340
  Naming/PredicateName:
341
341
  NamePrefix:
342
342
  - is_
343
- NamePrefixBlacklist:
343
+ ForbiddenPrefixes:
344
344
  - is_
345
- NameWhitelist:
345
+ AllowedMethods:
346
346
  - is_a?
347
347
  Exclude:
348
348
  - 'spec/**/*'
@@ -467,7 +467,7 @@ Style/TernaryParentheses:
467
467
  - require_no_parentheses
468
468
  AllowSafeAssignment: true
469
469
 
470
- Layout/TrailingBlankLines:
470
+ Layout/TrailingEmptyLines:
471
471
  EnforcedStyle: final_newline
472
472
  SupportedStyles:
473
473
  - final_newline
@@ -478,7 +478,7 @@ Style/TrivialAccessors:
478
478
  AllowPredicates: true
479
479
  AllowDSLWriters: false
480
480
  IgnoreClassMethods: false
481
- Whitelist:
481
+ AllowedMethod:
482
482
  - to_ary
483
483
  - to_a
484
484
  - to_c
@@ -561,7 +561,7 @@ Lint/UnusedMethodArgument:
561
561
  Naming/AccessorMethodName:
562
562
  Enabled: true
563
563
 
564
- Layout/AlignArray:
564
+ Layout/ArrayAlignment:
565
565
  Enabled: true
566
566
 
567
567
  Style/ArrayJoin:
@@ -840,7 +840,7 @@ Style/WhileUntilDo:
840
840
  Style/ZeroLengthPredicate:
841
841
  Enabled: true
842
842
 
843
- Layout/IndentHeredoc:
843
+ Layout/HeredocIndentation:
844
844
  EnforcedStyle: squiggly
845
845
 
846
846
  Lint/AmbiguousOperator:
@@ -864,7 +864,7 @@ Lint/DeprecatedClassMethods:
864
864
  Lint/DuplicateMethods:
865
865
  Enabled: true
866
866
 
867
- Lint/DuplicatedKey:
867
+ Lint/DuplicateHashKey:
868
868
  Enabled: true
869
869
 
870
870
  Lint/EachWithObjectArgument:
@@ -891,7 +891,7 @@ Lint/FloatOutOfRange:
891
891
  Lint/FormatParameterMismatch:
892
892
  Enabled: true
893
893
 
894
- Lint/HandleExceptions:
894
+ Lint/SuppressedException:
895
895
  AllowComments: true
896
896
 
897
897
  Lint/ImplicitStringConcatenation:
@@ -947,7 +947,7 @@ Lint/ShadowedException:
947
947
  Lint/ShadowingOuterLocalVariable:
948
948
  Enabled: true
949
949
 
950
- Lint/StringConversionInInterpolation:
950
+ Lint/RedundantStringCoercion:
951
951
  Enabled: true
952
952
 
953
953
  Lint/UnderscorePrefixedVariableName:
@@ -5,6 +5,41 @@ module RecordStore
5
5
  class Provider::NS1 < Provider
6
6
  class Error < StandardError; end
7
7
 
8
+ class ApiAnswer
9
+ class << self
10
+ def from_full_api_answer(type:, record_id:, answer:)
11
+ ApiAnswer.new(type: type, record_id: record_id, rrdata: answer['answer'])
12
+ end
13
+
14
+ def from_short_api_answer(type:, record_id:, answer:)
15
+ rrdata_fields = case type
16
+ when 'SPF', 'TXT'
17
+ [answer]
18
+ else
19
+ answer.split
20
+ end
21
+
22
+ ApiAnswer.new(type: type, record_id: record_id, rrdata: rrdata_fields)
23
+ end
24
+ end
25
+
26
+ attr_accessor :type, :record_id, :rrdata
27
+
28
+ def initialize(type:, record_id:, rrdata:)
29
+ @type = type
30
+ @record_id = record_id
31
+ @rrdata = rrdata
32
+ end
33
+
34
+ def rrdata_string
35
+ rrdata.join(' ')
36
+ end
37
+
38
+ def id
39
+ [record_id, type, *rrdata]
40
+ end
41
+ end
42
+
8
43
  class << self
9
44
  def client
10
45
  Provider::NS1::Client.new(api_key: secrets['api_key'])
@@ -14,16 +49,9 @@ module RecordStore
14
49
  #
15
50
  # Returns: an array of `Record` for each record in the provider's zone
16
51
  def retrieve_current_records(zone:, stdout: $stdout) # rubocop:disable Lint/UnusedMethodArgument
17
- full_api_records = records_for_zone(zone).map do |short_record|
18
- client.record(
19
- zone: zone,
20
- fqdn: short_record["domain"],
21
- type: short_record["type"],
22
- must_exist: true,
23
- )
24
- end
25
-
26
- full_api_records.map { |r| build_from_api(r) }.flatten.compact
52
+ records_for_zone(zone)
53
+ .flat_map { |short_record| build_from_api(short_record) }
54
+ .compact
27
55
  end
28
56
 
29
57
  # Returns an array of the zones managed by provider as strings
@@ -35,7 +63,7 @@ module RecordStore
35
63
 
36
64
  # Fetches simplified records for the provided zone
37
65
  def records_for_zone(zone)
38
- client.zone(zone)["records"]
66
+ client.zone(zone)['records']
39
67
  end
40
68
 
41
69
  # Creates a new record to the zone. It is expected this call modifies external state.
@@ -124,10 +152,17 @@ module RecordStore
124
152
 
125
153
  # Identify the answer in this record with the matching ID, and update it
126
154
  updated = false
127
- existing_record["answers"].each do |answer|
128
- next if answer["id"] != id
155
+ existing_record['answers'].each do |existing_answer|
156
+ existing_answer_id = ApiAnswer.from_full_api_answer(
157
+ record_id: existing_record['id'],
158
+ type: existing_record['type'],
159
+ answer: existing_answer,
160
+ ).id
161
+
162
+ next if existing_answer_id != id
163
+
129
164
  updated = true
130
- answer["answer"] = build_api_answer_from_record(record)
165
+ existing_answer['answer'] = build_api_answer_from_record(record)
131
166
  end
132
167
 
133
168
  unless updated
@@ -140,31 +175,38 @@ module RecordStore
140
175
  zone: zone,
141
176
  fqdn: record_fqdn,
142
177
  type: record.type,
143
- params: { answers: existing_record["answers"], ttl: record.ttl }
178
+ params: { answers: existing_record['answers'], ttl: record.ttl }
144
179
  )
145
180
  end
146
181
 
147
182
  def build_from_api(api_record)
148
- fqdn = Record.ensure_ends_with_dot(api_record["domain"])
183
+ fqdn = Record.ensure_ends_with_dot(api_record['domain'])
149
184
 
150
- record_type = api_record["type"]
185
+ record_type = api_record['type']
151
186
  return if record_type == 'SOA'
152
187
 
153
- api_record["answers"].map do |api_answer|
154
- answer = api_answer["answer"]
188
+ answers = api_record['short_answers'].map do |raw_answer|
189
+ ApiAnswer.from_short_api_answer(
190
+ record_id: api_record['id'],
191
+ type: api_record['type'],
192
+ answer: raw_answer,
193
+ )
194
+ end
195
+
196
+ answers.map do |answer|
155
197
  record = {
156
- ttl: api_record["ttl"],
198
+ ttl: api_record['ttl'],
157
199
  fqdn: fqdn.downcase,
158
- record_id: api_answer["id"],
200
+ record_id: answer.id,
159
201
  }
160
202
 
161
203
  case record_type
162
204
  when 'A', 'AAAA'
163
- record.merge!(address: answer.first)
205
+ record.merge!(address: answer.rrdata_string)
164
206
  when 'ALIAS'
165
- record.merge!(alias: answer.first)
207
+ record.merge!(alias: answer.rrdata_string)
166
208
  when 'CAA'
167
- flags, tag, value = answer
209
+ flags, tag, value = answer.rrdata
168
210
 
169
211
  record.merge!(
170
212
  flags: flags.to_i,
@@ -172,21 +214,21 @@ module RecordStore
172
214
  value: Record.unquote(value),
173
215
  )
174
216
  when 'CNAME'
175
- record.merge!(cname: answer.first)
217
+ record.merge!(cname: answer.rrdata_string)
176
218
  when 'MX'
177
219
 
178
- preference, exchange = answer
220
+ preference, exchange = answer.rrdata
179
221
 
180
222
  record.merge!(
181
223
  preference: preference.to_i,
182
224
  exchange: exchange,
183
225
  )
184
226
  when 'NS'
185
- record.merge!(nsdname: answer.first)
227
+ record.merge!(nsdname: answer.rrdata_string)
186
228
  when 'SPF', 'TXT'
187
- record.merge!(txtdata: Record.unlong_quote(Record.unescape(answer.first).gsub(';', '\;')))
229
+ record.merge!(txtdata: Record.unlong_quote(Record.unescape(answer.rrdata_string).gsub(';', '\;')))
188
230
  when 'SRV'
189
- priority, weight, port, host = answer
231
+ priority, weight, port, host = answer.rrdata
190
232
 
191
233
  record.merge!(
192
234
  priority: priority.to_i,
@@ -1,3 +1,3 @@
1
1
  module RecordStore
2
- VERSION = '5.7.1'.freeze
2
+ VERSION = '5.7.2'.freeze
3
3
  end
@@ -43,4 +43,5 @@ Gem::Specification.new do |spec|
43
43
  spec.add_development_dependency 'pry'
44
44
  spec.add_development_dependency 'webmock'
45
45
  spec.add_development_dependency 'rubocop'
46
+ spec.add_development_dependency 'minitest-focus'
46
47
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: record_store
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.7.1
4
+ version: 5.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Willem van Bergen
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-11-11 00:00:00.000000000 Z
12
+ date: 2019-12-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: thor
@@ -311,6 +311,20 @@ dependencies:
311
311
  - - ">="
312
312
  - !ruby/object:Gem::Version
313
313
  version: '0'
314
+ - !ruby/object:Gem::Dependency
315
+ name: minitest-focus
316
+ requirement: !ruby/object:Gem::Requirement
317
+ requirements:
318
+ - - ">="
319
+ - !ruby/object:Gem::Version
320
+ version: '0'
321
+ type: :development
322
+ prerelease: false
323
+ version_requirements: !ruby/object:Gem::Requirement
324
+ requirements:
325
+ - - ">="
326
+ - !ruby/object:Gem::Version
327
+ version: '0'
314
328
  description: Manage DNS through a git-based workflow. If you're looking for the original
315
329
  'record_store', that has been renamed to 'sequel_record_store'.
316
330
  email: