wavefront-cli 5.1.0 → 5.1.1

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: 2500c3c1046355e74eaa41f1e612a2f05054ffc54f752f79cac8f4c8f47dfd07
4
- data.tar.gz: 9676df59ed6592399703de971ea8b2f691fe09443c74147d60096b3789d83ae5
3
+ metadata.gz: 44f481275247e98780e57065df2166e93158382c03dea0d9dbc627b2d1756777
4
+ data.tar.gz: b225b2ba3668cc00c6e3e873064bcf54b79c1dbc6638009cba09cfb6de7874c8
5
5
  SHA512:
6
- metadata.gz: 441cf573c9c17603679bd39d3b1f9d0dcf15ca0fc68f8f0b72fa2969fc9384931d9b549e54b0659e5103f0f09f04d50b45987758ddcd54115ceb450bda832366
7
- data.tar.gz: d4236668320cc4167100784cc7c265c22a5d6bddf5e1a44da54c4b20c8b657e782582046551989800b0c4548f611c06aa900f5eb5ed3daaa46e1472d62f0f35a
6
+ metadata.gz: 42c775a15f3a74a7ffbaa45ebff0d38755996c64afeca494496c4707a26734733e6f18f7469be9ac3b82786697e1d773748057c96789ea470e8a7d8022c851f1
7
+ data.tar.gz: 1945c8a72ce0cc6fb6c4cdda8a8f8baabad6f020175d25f8109fb240f58c3cf175cd1b846c9fc7830c6bba31356f83975e69eac8736b3cf7aa0fbf7c88d8d7fb
data/HISTORY.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # Changelog
2
2
 
3
+ ## 5.2.1 (2020-02-20)
4
+ * Say whether `--upsert` did and update or an import.
5
+
3
6
  ## 5.1.0 (2020-02-20)
4
7
  * Add `-U` (`--upsert`) option to `import` sub-commands.
5
8
 
@@ -46,7 +46,7 @@ module WavefrontCli
46
46
  end
47
47
 
48
48
  # Normally we map the class name to a similar one in the SDK.
49
- # Overriding his method lets you map to something else.
49
+ # Overriding this method lets you map to something else.
50
50
  #
51
51
  def _sdk_class
52
52
  self.class.name.sub(/Cli/, '')
@@ -349,60 +349,6 @@ module WavefrontCli
349
349
  raise(WavefrontCli::Exception::CredentialError, 'Missing API endpoint.')
350
350
  end
351
351
 
352
- # Give it a path to a file (as a string) and it will return the
353
- # contents of that file as a Ruby object. Automatically detects
354
- # JSON and YAML. Raises an exception if it doesn't look like
355
- # either. If path is '-' then it will read STDIN.
356
- #
357
- # @param path [String] the file to load
358
- # @return [Hash] a Ruby object of the loaded file
359
- # @raise WavefrontCli::Exception::UnsupportedFileFormat if the
360
- # filetype is unknown.
361
- # @raise pass through any error loading or parsing the file
362
- #
363
- def load_file(path)
364
- return load_from_stdin if path == '-'
365
-
366
- file = Pathname.new(path)
367
- extname = file.extname.downcase
368
-
369
- raise WavefrontCli::Exception::FileNotFound unless file.exist?
370
-
371
- return load_json(file) if extname == '.json'
372
- return load_yaml(file) if %w[.yaml .yml].include?(extname)
373
-
374
- raise WavefrontCli::Exception::UnsupportedFileFormat
375
- end
376
-
377
- def load_json(file)
378
- read_json(IO.read(file))
379
- end
380
-
381
- def load_yaml(file)
382
- read_yaml(IO.read(file))
383
- end
384
-
385
- # Read STDIN and return a Ruby object, assuming that STDIN is
386
- # valid JSON or YAML. This is a dumb method, it does no
387
- # buffering, so STDIN must be a single block of data. This
388
- # appears to be a valid assumption for use-cases of this CLI.
389
- #
390
- # @return [Object]
391
- # @raise Wavefront::Exception::UnparseableInput if the input
392
- # does not parse
393
- #
394
- def load_from_stdin
395
- raw = STDIN.read
396
-
397
- if raw.start_with?('---')
398
- read_yaml(raw)
399
- else
400
- read_json(raw)
401
- end
402
- rescue RuntimeError
403
- raise Wavefront::Exception::UnparseableInput
404
- end
405
-
406
352
  # Below here are common methods. Most are used by most classes,
407
353
  # but if they don't match a command described in the docopt
408
354
  # text, the dispatcher will never call them. So, there's no
@@ -451,50 +397,8 @@ module WavefrontCli
451
397
  end
452
398
 
453
399
  def do_import
454
- raw = load_file(options[:'<file>'])
455
- errs = 0
456
-
457
- [raw].flatten.each do |obj|
458
- resp = import_object(obj)
459
- next if options[:noop]
460
-
461
- errs += 1 unless resp.ok?
462
- puts import_message(obj, resp)
463
- end
464
-
465
- exit errs
466
- end
467
-
468
- def import_message(obj, resp)
469
- format('%-15<id>s %-10<status>s %<message>s',
470
- id: obj[:id] || obj[:url],
471
- status: resp.ok? ? 'IMPORTED' : 'FAILED',
472
- message: resp.status.message)
473
- end
474
-
475
- def import_object(raw)
476
- raw = preprocess_rawfile(raw) if respond_to?(:preprocess_rawfile)
477
- prepped = import_to_create(raw)
478
-
479
- if options[:upsert]
480
- import_upsert(raw, prepped)
481
- elsif options[:update]
482
- import_update(raw)
483
- else
484
- wf.create(prepped)
485
- end
486
- end
487
-
488
- def import_upsert(raw, prepped)
489
- update_call = import_update(raw)
490
- return update_call if update_call.ok?
491
-
492
- puts 'update failed, inserting' if options[:verbose] || options[:debug]
493
- wf.create(prepped)
494
- end
495
-
496
- def import_update(raw)
497
- wf.update(raw[:id], raw, false)
400
+ require_relative 'subcommands/import'
401
+ WavefrontCli::Subcommand::Import.new(self, options).run!
498
402
  end
499
403
 
500
404
  def do_delete
@@ -604,18 +508,6 @@ module WavefrontCli
604
508
  # rubocop:enable Metrics/MethodLength
605
509
  # rubocop:enable Metrics/CyclomaticComplexity
606
510
 
607
- # Most things will re-import with the POST method if you remove
608
- # the ID.
609
- #
610
- def import_to_create(raw)
611
- raw.each_with_object({}) do |(k, v), a|
612
- a[k.to_sym] = v unless k == :id
613
- end
614
- rescue StandardError => e
615
- puts e if options[:debug]
616
- raise WavefrontCli::Exception::UnparseableInput
617
- end
618
-
619
511
  # Return a detailed description of one item, if an ID has been
620
512
  # given, or all items if it has not.
621
513
  #
@@ -665,14 +557,16 @@ module WavefrontCli
665
557
  end
666
558
  # rubocop:enable Metrics/MethodLength
667
559
 
668
- private
669
-
670
- def read_json(io)
671
- JSON.parse(io, symbolize_names: true)
672
- end
673
-
674
- def read_yaml(io)
675
- YAML.safe_load(io, symbolize_names: true)
560
+ # Most things will re-import with the POST method if you remove
561
+ # the ID.
562
+ #
563
+ def import_to_create(raw)
564
+ raw.each_with_object({}) do |(k, v), a|
565
+ a[k.to_sym] = v unless k == :id
566
+ end
567
+ rescue StandardError => e
568
+ puts e if options[:debug]
569
+ raise WavefrontCli::Exception::UnparseableInput
676
570
  end
677
571
  end
678
572
  end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../exception'
4
+
5
+ module WavefrontCli
6
+ module Helper
7
+ #
8
+ # Give it a path to a file (as a string) and it will return the
9
+ # contents of that file as a Ruby object. Automatically detects
10
+ # JSON and YAML. Raises an exception if it doesn't look like
11
+ # either. If path is '-' then it will read STDIN.
12
+ #
13
+ # @param path [String] the file to load
14
+ # @return [Hash] a Ruby object of the loaded file
15
+ # @raise WavefrontCli::Exception::UnsupportedFileFormat if the
16
+ # filetype is unknown.
17
+ # @raise pass through any error loading or parsing the file
18
+ #
19
+ class LoadFile
20
+ attr_reader :path
21
+
22
+ def initialize(path)
23
+ @path = path
24
+ end
25
+
26
+ def load
27
+ return load_from_stdin if path == '-'
28
+
29
+ file = Pathname.new(path)
30
+ extname = file.extname.downcase
31
+
32
+ raise WavefrontCli::Exception::FileNotFound unless file.exist?
33
+
34
+ return load_json(file) if extname == '.json'
35
+ return load_yaml(file) if %w[.yaml .yml].include?(extname)
36
+
37
+ raise WavefrontCli::Exception::UnsupportedFileFormat
38
+ end
39
+
40
+ private
41
+
42
+ def load_json(file)
43
+ read_json(IO.read(file))
44
+ end
45
+
46
+ def load_yaml(file)
47
+ read_yaml(IO.read(file))
48
+ end
49
+
50
+ # Read STDIN and return a Ruby object, assuming that STDIN is
51
+ # valid JSON or YAML. This is a dumb method, it does no
52
+ # buffering, so STDIN must be a single block of data. This
53
+ # appears to be a valid assumption for use-cases of this CLI.
54
+ #
55
+ # @return [Object]
56
+ # @raise Wavefront::Exception::UnparseableInput if the input
57
+ # does not parse
58
+ #
59
+ def load_from_stdin
60
+ raw = STDIN.read
61
+
62
+ if raw.start_with?('---')
63
+ read_yaml(raw)
64
+ else
65
+ read_json(raw)
66
+ end
67
+ rescue RuntimeError
68
+ raise Wavefront::Exception::UnparseableInput
69
+ end
70
+
71
+ def read_json(io)
72
+ JSON.parse(io, symbolize_names: true)
73
+ end
74
+
75
+ def read_yaml(io)
76
+ YAML.safe_load(io, symbolize_names: true)
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../helpers/load_file'
4
+
5
+ module WavefrontCli
6
+ module Subcommand
7
+ #
8
+ # Stuff to import an object
9
+ #
10
+ class Import
11
+ attr_reader :wf, :options
12
+
13
+ def initialize(calling_class, options)
14
+ @calling_class = calling_class
15
+ @wf = calling_class.wf
16
+ @options = options
17
+ @message = 'IMPORTED'
18
+ end
19
+
20
+ def run!
21
+ errs = 0
22
+
23
+ [raw_input].flatten.each do |obj|
24
+ resp = import_object(obj)
25
+ next if options[:noop]
26
+
27
+ errs += 1 unless resp.ok?
28
+ puts import_message(obj, resp)
29
+ end
30
+
31
+ exit errs
32
+ end
33
+
34
+ private
35
+
36
+ def raw_input
37
+ WavefrontCli::Helper::LoadFile.new(options[:'<file>']).load
38
+ end
39
+
40
+ def import_message(obj, resp)
41
+ format('%-15<id>s %-10<status>s %<message>s',
42
+ id: obj[:id] || obj[:url],
43
+ status: resp.ok? ? @message : 'FAILED',
44
+ message: resp.status.message)
45
+ end
46
+
47
+ def import_object(raw)
48
+ raw = preprocess_rawfile(raw) if respond_to?(:preprocess_rawfile)
49
+ prepped = @calling_class.import_to_create(raw)
50
+
51
+ if options[:upsert]
52
+ import_upsert(raw, prepped)
53
+ elsif options[:update]
54
+ @message = 'UPDATED'
55
+ import_update(raw)
56
+ else
57
+ wf.create(prepped)
58
+ end
59
+ end
60
+
61
+ def import_upsert(raw, prepped)
62
+ update_call = import_update(raw)
63
+
64
+ if update_call.ok?
65
+ @message = 'UPDATED'
66
+ return update_call
67
+ end
68
+
69
+ puts 'update failed, inserting' if options[:verbose] || options[:debug]
70
+ wf.create(prepped)
71
+ end
72
+
73
+ def import_update(raw)
74
+ wf.update(raw[:id], raw, false)
75
+ end
76
+ end
77
+ end
78
+ end
@@ -1,3 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- WF_CLI_VERSION = '5.1.0'
3
+ WF_CLI_VERSION = '5.1.1'
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../../lib/wavefront-cli/helpers/load_file'
4
+
3
5
  module WavefrontCliTest
4
6
  #
5
7
  # Mixin to test standard 'import' commands
@@ -25,7 +27,7 @@ module WavefrontCliTest
25
27
  assert_abort_on_missing_creds("import #{import_file}")
26
28
  end
27
29
 
28
- def test_import_update
30
+ def _test_import_update
29
31
  Spy.teardown
30
32
 
31
33
  out, err = capture_io do
@@ -38,15 +40,19 @@ module WavefrontCliTest
38
40
  end
39
41
 
40
42
  assert_empty(err)
41
- assert_equal('1556812163465 IMPORTED', out.strip)
43
+ assert_equal('1556812163465 UPDATED', out.strip)
42
44
 
43
45
  assert_exits_with('File not found.', 'import /no/such/file')
44
46
  assert_usage('import -u')
45
47
  assert_abort_on_missing_creds("import -u #{import_file}")
46
48
  end
47
49
 
50
+ def load_file(file)
51
+ WavefrontCli::Helper::LoadFile.new(file).load
52
+ end
53
+
48
54
  def test_import_fields
49
- x = cmd_instance.import_to_create(cmd_instance.load_file(import_file))
55
+ x = cmd_instance.import_to_create(load_file(import_file))
50
56
  assert_instance_of(Hash, x)
51
57
  import_fields.each { |f| assert_includes(x.keys, f) }
52
58
  blocked_import_fields.each { |f| refute_includes(x.keys, f) }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wavefront-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.1.0
4
+ version: 5.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Fisher
@@ -239,6 +239,7 @@ files:
239
239
  - lib/wavefront-cli/event.rb
240
240
  - lib/wavefront-cli/exception.rb
241
241
  - lib/wavefront-cli/externallink.rb
242
+ - lib/wavefront-cli/helpers/load_file.rb
242
243
  - lib/wavefront-cli/ingestionpolicy.rb
243
244
  - lib/wavefront-cli/integration.rb
244
245
  - lib/wavefront-cli/maintenancewindow.rb
@@ -272,6 +273,7 @@ files:
272
273
  - lib/wavefront-cli/spy.rb
273
274
  - lib/wavefront-cli/stdlib/array.rb
274
275
  - lib/wavefront-cli/stdlib/string.rb
276
+ - lib/wavefront-cli/subcommands/import.rb
275
277
  - lib/wavefront-cli/usage.rb
276
278
  - lib/wavefront-cli/user.rb
277
279
  - lib/wavefront-cli/usergroup.rb