shiftzilla 0.2.17 → 0.2.18
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 +4 -4
- data/lib/shiftzilla/helpers.rb +213 -1
- data/lib/shiftzilla/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 04b96fe5e59a6af07ab19279d5c88d5f77404b9ebaf7ad16c7ca7036dfbe9030
|
4
|
+
data.tar.gz: e748c09421a5cae2ee28188f63d8e92cbc3f8910fcb852afca4b27c2a8e7df88
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 89952488ce6929e7bdad90fa7c020efcea98c37abc1c11dce547df73abc62e2c6bc5727e11fcef44129f9c2a393a2f4b3a0ab036f3b593445feb53489413fe46
|
7
|
+
data.tar.gz: bfe2ab32dab27b347b09d388eef5b7f2f6b8f3aec3f7cb33d3194d8368356deb35e14504f9cc110d71377320ede0b4ad7b0433482efd8ec3816f453459c8a4cb
|
data/lib/shiftzilla/helpers.rb
CHANGED
@@ -43,7 +43,7 @@ module Shiftzilla
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def cfg_file
|
46
|
-
@cfg_file ||= YAML.load_file(CFG_FILE)
|
46
|
+
@cfg_file ||= validated_config_file(YAML.load_file(CFG_FILE))
|
47
47
|
end
|
48
48
|
|
49
49
|
def dbh
|
@@ -170,5 +170,217 @@ module Shiftzilla
|
|
170
170
|
def db_backed_up
|
171
171
|
@db_backed_up ||= false
|
172
172
|
end
|
173
|
+
|
174
|
+
def valid_config_string?(value)
|
175
|
+
return false if value.class == NilClass
|
176
|
+
return false if value.class == String and value.length == 0
|
177
|
+
return true
|
178
|
+
end
|
179
|
+
|
180
|
+
def validated_config_file(raw_cfg)
|
181
|
+
unless raw_cfg.class == Hash
|
182
|
+
puts "#{CFG_FILE} did not get parsed as a hash."
|
183
|
+
exit
|
184
|
+
end
|
185
|
+
missing_keys = ['Groups','Teams','Sources','Releases','SSH'].select{ |k| not raw_cfg.has_key?(k) }
|
186
|
+
if missing_keys.length > 0
|
187
|
+
if missing_keys.length > 1
|
188
|
+
puts "#{CFG_FILE} is missing the following keys: #{missing_keys.join(', ')}"
|
189
|
+
else
|
190
|
+
puts "#{CFG_FILE} is missing the '#{missing_keys[0]}' key."
|
191
|
+
end
|
192
|
+
exit
|
193
|
+
end
|
194
|
+
zero_length_lists = ['Groups','Teams','Releases'].select{ |k| not raw_cfg[k].class == Array or raw_cfg[k].length == 0 }
|
195
|
+
if zero_length_lists.length > 0
|
196
|
+
if zero_length_lists.length > 1
|
197
|
+
puts "#{CFG_FILE} contains some zero-length lists: #{zero_length_lists.join(', ')}"
|
198
|
+
else
|
199
|
+
puts "#{CFG_FILE} contains a zero-length list for #{zero_length_lists[0]}"
|
200
|
+
end
|
201
|
+
exit
|
202
|
+
end
|
203
|
+
|
204
|
+
errors = []
|
205
|
+
|
206
|
+
# Group checks
|
207
|
+
list_idx = 0
|
208
|
+
seen_gids = {}
|
209
|
+
raw_cfg['Groups'].each do |group|
|
210
|
+
if not group.has_key?('id')
|
211
|
+
errors << "Group at index #{list_idx} is missing the 'id' key."
|
212
|
+
elsif not valid_config_string?(group['id'])
|
213
|
+
errors << "Group at index #{list_idx} has a nil or zero-length 'id'."
|
214
|
+
else
|
215
|
+
gid = group['id']
|
216
|
+
if seen_gids.has_key?(gid)
|
217
|
+
errors << "Group at index #{list_idx} has same id ('#{gid}') as group at index #{seen_gids[gid]}"
|
218
|
+
else
|
219
|
+
seen_gids[gid] = list_idx
|
220
|
+
end
|
221
|
+
end
|
222
|
+
if not group.has_key?('lead')
|
223
|
+
errors << "Group at index #{list_idx} is missing the 'lead' key."
|
224
|
+
elsif not valid_config_string?(group['lead'])
|
225
|
+
errors << "Group at index #{list_idx} has a nil or zero-length 'lead'."
|
226
|
+
end
|
227
|
+
list_idx += 1
|
228
|
+
end
|
229
|
+
|
230
|
+
# Team checks
|
231
|
+
list_idx = 0
|
232
|
+
seen_tnms = {}
|
233
|
+
raw_cfg['Teams'].each do |team|
|
234
|
+
if not team.has_key?('name')
|
235
|
+
errors << "Team at index #{list_idx} is missing the 'name' key."
|
236
|
+
elsif not valid_config_string?(team['name'])
|
237
|
+
errors << "Team at index #{list_idx} has a nil or zero-length 'name'."
|
238
|
+
else
|
239
|
+
tnm = team['name']
|
240
|
+
if seen_tnms.has_key?(tnm)
|
241
|
+
errors << "Team at index #{list_idx} has same name ('#{tnm}') as team at index #{seen_tnms[tnm]}"
|
242
|
+
else
|
243
|
+
seen_tnms[tnm] = list_idx
|
244
|
+
end
|
245
|
+
end
|
246
|
+
if not team.has_key?('lead')
|
247
|
+
errors << "Team at index #{list_idx} is missing the 'lead' key."
|
248
|
+
elsif not valid_config_string?(team['lead'])
|
249
|
+
errors << "Team at index #{list_idx} has a nil or zero-length 'lead'."
|
250
|
+
end
|
251
|
+
if not team.has_key?('group')
|
252
|
+
errors << "Team at index #{list_idx} is missing the 'group' key."
|
253
|
+
elsif not valid_config_string?(team['group'])
|
254
|
+
errors << "Team at index #{list_idx} has a nil or zero-length 'group'."
|
255
|
+
elsif not seen_gids.has_key?(team['group'])
|
256
|
+
errors << "Team at index #{list_idx} has a group id ('#{team['group']}') that doesn't map to any Group."
|
257
|
+
end
|
258
|
+
if team.has_key?('components')
|
259
|
+
comps = team['components']
|
260
|
+
if not comps.class == Array
|
261
|
+
errors << "Team at index #{list_idx} has a 'components' key that didn't parse as a list"
|
262
|
+
else
|
263
|
+
comp_idx = 0
|
264
|
+
comps.each do |comp|
|
265
|
+
if not valid_config_string?(comp)
|
266
|
+
errors << "Team at index #{list_idx} has a nil or zero-length BZ component at index #{comp_idx}"
|
267
|
+
end
|
268
|
+
comp_idx += 1
|
269
|
+
end
|
270
|
+
end
|
271
|
+
end
|
272
|
+
list_idx += 1
|
273
|
+
end
|
274
|
+
|
275
|
+
# Release checks
|
276
|
+
list_idx = 0
|
277
|
+
seen_rnms = {}
|
278
|
+
raw_cfg['Releases'].each do |release|
|
279
|
+
if not release.has_key?('name')
|
280
|
+
errors << "Release at index #{list_idx} is missing the 'name' key."
|
281
|
+
elsif not valid_config_string?(release['name'])
|
282
|
+
errors << "Release at index #{list_idx} has a nil or zero-length 'name'."
|
283
|
+
else
|
284
|
+
rnm = release['name']
|
285
|
+
if seen_rnms.has_key?(rnm)
|
286
|
+
errors << "Release at index #{list_idx} has same name ('#{rnm}') as release at index #{seen_rnms[rnm]}"
|
287
|
+
else
|
288
|
+
seen_rnms[rnm] = list_idx
|
289
|
+
end
|
290
|
+
end
|
291
|
+
if not release.has_key?('targets')
|
292
|
+
errors << "Release at index #{list_idx} is missing the 'targets' key."
|
293
|
+
else
|
294
|
+
targets = release['targets']
|
295
|
+
if not targets.class == Array
|
296
|
+
errors << "Release at index #{list_idx} has a 'targets' key that didn't parse as a list"
|
297
|
+
else
|
298
|
+
tgt_idx = 0
|
299
|
+
targets.each do |tgt|
|
300
|
+
if not valid_config_string?(tgt)
|
301
|
+
errors << "Release at index #{list_idx} has a nil or zero-length target at index #{tgt_idx}"
|
302
|
+
end
|
303
|
+
tgt_idx += 1
|
304
|
+
end
|
305
|
+
end
|
306
|
+
end
|
307
|
+
if not release.has_key?('milestones')
|
308
|
+
errors << "Release at index #{list_idx} is missing the 'milestones' key."
|
309
|
+
else
|
310
|
+
milestones = release['milestones']
|
311
|
+
if not milestones.class == Hash
|
312
|
+
errors << "Release at index #{list_idx} has a 'milestones' key that didn't parse as a hash"
|
313
|
+
else
|
314
|
+
['start','feature_complete','code_freeze','ga'].each do |ms|
|
315
|
+
if not milestones.has_key?(ms)
|
316
|
+
errors << "Release at index #{list_idx} is missing the '#{ms}' milestone."
|
317
|
+
else
|
318
|
+
ms_date = milestones[ms].split('-')
|
319
|
+
if ms_date.length == 3 and ms_date[0].length == 4 and ms_date[1].length == 2 and ms_date[2].length == 2
|
320
|
+
else
|
321
|
+
errors << "Release at index #{list_idx}: milestone '#{ms}' is not formatted correctly (YYYY-MM-DD)."
|
322
|
+
end
|
323
|
+
end
|
324
|
+
end
|
325
|
+
end
|
326
|
+
end
|
327
|
+
list_idx += 1
|
328
|
+
end
|
329
|
+
|
330
|
+
# Source checks
|
331
|
+
if not raw_cfg['Sources'].class == Hash
|
332
|
+
errors << "The Sources portion of the config file didn't parse as a hash."
|
333
|
+
else
|
334
|
+
seen_srcs = {}
|
335
|
+
raw_cfg['Sources'].each do |src_id,src_info|
|
336
|
+
['search','sharer','table','external_sub','fields'].each do |key|
|
337
|
+
if not src_info.has_key?(key)
|
338
|
+
errors << "Source '#{src_id}' is missing the '#{key}' key."
|
339
|
+
else
|
340
|
+
if key == 'fields'
|
341
|
+
if not src_info['fields'].class == Array
|
342
|
+
errors << "Source '#{src_id}': the 'fields' value didn't parse as a list."
|
343
|
+
else
|
344
|
+
fld_idx = 0
|
345
|
+
src_info['fields'].each do |fld|
|
346
|
+
if not valid_config_string?(fld)
|
347
|
+
errors << "Source '#{src_id}': the field value at index #{fld_idx} is nil or zero-length."
|
348
|
+
end
|
349
|
+
fld_idx += 1
|
350
|
+
end
|
351
|
+
end
|
352
|
+
elsif not valid_config_string?(src_info[key])
|
353
|
+
errors << "Source '#{src_id}' has nil or zero-length value for '#{key}'"
|
354
|
+
end
|
355
|
+
end
|
356
|
+
end
|
357
|
+
end
|
358
|
+
end
|
359
|
+
|
360
|
+
# SSH checks
|
361
|
+
if not raw_cfg['SSH'].class == Hash
|
362
|
+
errors << "The SSH portion of the config file didn't parse as a hash."
|
363
|
+
else
|
364
|
+
ssh = raw_cfg['SSH']
|
365
|
+
['host','path','url'].each do |key|
|
366
|
+
if not ssh.has_key?(key)
|
367
|
+
errors << "SSH config is missing the '#{key}' key."
|
368
|
+
elsif not valid_config_string?(ssh[key])
|
369
|
+
errors << "SSH config: '#{key}' value is nil or zero-length"
|
370
|
+
end
|
371
|
+
end
|
372
|
+
end
|
373
|
+
|
374
|
+
# Report errors
|
375
|
+
if errors.length > 0
|
376
|
+
puts "Config file at '#{CFG_FILE}' has the following errors:"
|
377
|
+
errors.each do |error|
|
378
|
+
puts "- #{error}"
|
379
|
+
end
|
380
|
+
exit
|
381
|
+
end
|
382
|
+
|
383
|
+
return raw_cfg
|
384
|
+
end
|
173
385
|
end
|
174
386
|
end
|
data/lib/shiftzilla/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shiftzilla
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.18
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- N. Harrison Ripps
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-08-
|
11
|
+
date: 2018-08-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|