kennel 1.129.0 → 1.130.0

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: c7690d961a150ea0ba0649edcab513c22ec828988fec2ab631636497274305c7
4
- data.tar.gz: c5bc7244c4168466f5167e5c322f3a2cdb8e6b9b8ec23a2d12fb343a7648ae06
3
+ metadata.gz: d6ee3df09b69dd5a7af7285c219f4415c4e94ce2ab4f6533c5fff03be848e9c4
4
+ data.tar.gz: d7f923b69ad9b63774141ac0e9c6c04de7a26a67abd732c41c5f19d478704656
5
5
  SHA512:
6
- metadata.gz: 51b47377a8cf688dafd17600b543cc1734eb8511a6ed1b627d8b1180bf70fc66c86f9d4a8e4b2a3ff5e7223edf366e5483d983d9465c5907aaa07f5b9c36ef46
7
- data.tar.gz: 698c23a4de558382467342b90e7d3eac143a0279653efe9f1b711b3e114a37d8d72f4a9c5d97e652a6646007298f5e93f296c1125caaa4c498195089b0cac730
6
+ metadata.gz: 7c967bf54743cc757a0c0c911e981701d4b5b393f6ebac66538432541c7c6dfecef2cd8c1c0e5389f90c7d0b91a54e79a29e0e1abf9d16fd67adad4bcd6209fe
7
+ data.tar.gz: 297239ea9305e4eadbe40a363160b0ca2aaf70dad237f95a448b00b30d3db9ed9f707b2736b2596ef73e8981d333b600af87da40978f5d1c9fc8e0dee3d7f9ea
data/lib/kennel/api.rb CHANGED
@@ -5,6 +5,14 @@ module Kennel
5
5
  class Api
6
6
  CACHE_FILE = "tmp/cache/details"
7
7
 
8
+ def self.tag(api_resource, reply)
9
+ klass = Models::Record.api_resource_map[api_resource]
10
+ reply.merge(
11
+ klass: klass,
12
+ tracking_id: klass.parse_tracking_id(reply)
13
+ )
14
+ end
15
+
8
16
  def initialize(app_key = nil, api_key = nil)
9
17
  @app_key = app_key || ENV.fetch("DATADOG_APP_KEY")
10
18
  @api_key = api_key || ENV.fetch("DATADOG_API_KEY")
@@ -16,7 +24,7 @@ module Kennel
16
24
  response = request :get, "/api/v1/#{api_resource}/#{id}", params: params
17
25
  response = response.fetch(:data) if api_resource == "slo"
18
26
  response[:id] = response.delete(:public_id) if api_resource == "synthetics/tests"
19
- response
27
+ self.class.tag(api_resource, response)
20
28
  end
21
29
 
22
30
  def list(api_resource, params = {})
@@ -32,7 +40,7 @@ module Kennel
32
40
  # ignore monitor synthetics create and that inherit the kennel_id, we do not directly manage them
33
41
  response.reject! { |m| m[:type] == "synthetics alert" } if api_resource == "monitor"
34
42
 
35
- response
43
+ response.map { |r| self.class.tag(api_resource, r) }
36
44
  end
37
45
  end
38
46
 
@@ -40,13 +48,13 @@ module Kennel
40
48
  response = request :post, "/api/v1/#{api_resource}", body: attributes
41
49
  response = response.fetch(:data).first if api_resource == "slo"
42
50
  response[:id] = response.delete(:public_id) if api_resource == "synthetics/tests"
43
- response
51
+ self.class.tag(api_resource, response)
44
52
  end
45
53
 
46
54
  def update(api_resource, id, attributes)
47
55
  response = request :put, "/api/v1/#{api_resource}/#{id}", body: attributes
48
56
  response[:id] = response.delete(:public_id) if api_resource == "synthetics/tests"
49
- response
57
+ self.class.tag(api_resource, response)
50
58
  end
51
59
 
52
60
  # - force=true to not dead-lock on dependent monitors+slos
@@ -46,13 +46,13 @@ module Kennel
46
46
  Diff::LCS.sdiff(old.split("\n", -1), new.split("\n", -1)).flat_map do |diff|
47
47
  case diff.action
48
48
  when "-"
49
- Utils.color(:red, "- #{diff.old_element}")
49
+ Console.color(:red, "- #{diff.old_element}")
50
50
  when "+"
51
- Utils.color(:green, "+ #{diff.new_element}")
51
+ Console.color(:green, "+ #{diff.new_element}")
52
52
  when "!"
53
53
  [
54
- Utils.color(:red, "- #{diff.old_element}"),
55
- Utils.color(:green, "+ #{diff.new_element}")
54
+ Console.color(:red, "- #{diff.old_element}"),
55
+ Console.color(:green, "+ #{diff.new_element}")
56
56
  ]
57
57
  else
58
58
  " #{diff.old_element}"
@@ -61,12 +61,12 @@ module Kennel
61
61
  end
62
62
 
63
63
  def truncate(message)
64
- warning = Utils.color(
64
+ warning = Console.color(
65
65
  :magenta,
66
66
  " (Diff for this item truncated after #{@max_diff_lines} lines. " \
67
67
  "Rerun with MAX_DIFF_LINES=#{@max_diff_lines * 2} to see more)"
68
68
  )
69
- Utils.truncate_lines(message, to: @max_diff_lines, warning: warning)
69
+ StringUtils.truncate_lines(message, to: @max_diff_lines, warning: warning)
70
70
  end
71
71
 
72
72
  # TODO: use awesome-print or similar, but it has too many monkey-patches
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+ module Kennel
3
+ module Console
4
+ COLORS = { red: 31, green: 32, yellow: 33, cyan: 36, magenta: 35, default: 0 }.freeze
5
+
6
+ class TeeIO < IO
7
+ def initialize(ios)
8
+ super(0) # called with fake file descriptor 0, so we can call super and get a proper class
9
+ @ios = ios
10
+ end
11
+
12
+ def write(string)
13
+ @ios.each { |io| io.write string }
14
+ end
15
+ end
16
+
17
+ class << self
18
+ def ask?(question)
19
+ Kennel.err.printf color(:red, "#{question} - press 'y' to continue: ", force: true)
20
+ begin
21
+ STDIN.gets.chomp == "y"
22
+ rescue Interrupt # do not show a backtrace if user decides to Ctrl+C here
23
+ Kennel.err.print "\n"
24
+ exit 1
25
+ end
26
+ end
27
+
28
+ def color(color, text, force: false)
29
+ return text unless force || Kennel.out.tty?
30
+
31
+ "\e[#{COLORS.fetch(color)}m#{text}\e[0m"
32
+ end
33
+
34
+ def capture_stdout
35
+ old = Kennel.out
36
+ Kennel.out = StringIO.new
37
+ yield
38
+ Kennel.out.string
39
+ ensure
40
+ Kennel.out = old
41
+ end
42
+
43
+ def capture_stderr
44
+ old = Kennel.err
45
+ Kennel.err = StringIO.new
46
+ yield
47
+ Kennel.err.string
48
+ ensure
49
+ Kennel.err = old
50
+ end
51
+
52
+ def tee_output
53
+ old_stdout = Kennel.out
54
+ old_stderr = Kennel.err
55
+ capture = StringIO.new
56
+ Kennel.out = TeeIO.new([capture, Kennel.out])
57
+ Kennel.err = TeeIO.new([capture, Kennel.err])
58
+ yield
59
+ capture.string
60
+ ensure
61
+ Kennel.out = old_stdout
62
+ Kennel.err = old_stderr
63
+ end
64
+ end
65
+ end
66
+ end
@@ -24,7 +24,7 @@ module Kennel
24
24
  end
25
25
 
26
26
  def report(&block)
27
- output = Utils.tee_output(&block).strip
27
+ output = Console.tee_output(&block).strip
28
28
  rescue StandardError
29
29
  output = "Error:\n#{$ERROR_INFO.message}"
30
30
  raise
@@ -33,7 +33,7 @@ module Kennel
33
33
  model.remove_tracking_id(data)
34
34
  tracking_id.split(":").last
35
35
  else
36
- Kennel::Utils.parameterize(title)
36
+ Kennel::StringUtils.parameterize(title)
37
37
  end
38
38
 
39
39
  case resource
@@ -10,7 +10,7 @@ module Kennel
10
10
  SETTING_OVERRIDABLE_METHODS = [:name, :kennel_id].freeze
11
11
 
12
12
  def kennel_id
13
- @kennel_id ||= Utils.snake_case kennel_id_base
13
+ @kennel_id ||= StringUtils.snake_case kennel_id_base
14
14
  end
15
15
 
16
16
  def name
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+ module Kennel
3
+ module StringUtils
4
+ class << self
5
+ def snake_case(string)
6
+ string
7
+ .gsub(/::/, "_") # Foo::Bar -> foo_bar
8
+ .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2') # FOOBar -> foo_bar
9
+ .gsub(/([a-z\d])([A-Z])/, '\1_\2') # fooBar -> foo_bar
10
+ .tr("-", "_") # foo-bar -> foo_bar
11
+ .downcase
12
+ end
13
+
14
+ # for child projects, not used internally
15
+ def title_case(string)
16
+ string.split(/[\s_]/).map(&:capitalize) * " "
17
+ end
18
+
19
+ # simplified version of https://apidock.com/rails/ActiveSupport/Inflector/parameterize
20
+ def parameterize(string)
21
+ string
22
+ .downcase
23
+ .gsub(/[^a-z0-9\-_]+/, "-") # remove unsupported
24
+ .gsub(/-{2,}/, "-") # remove duplicates
25
+ .gsub(/^-|-$/, "") # remove leading/trailing
26
+ end
27
+
28
+ def truncate_lines(text, to:, warning:)
29
+ lines = text.split(/\n/, to + 1)
30
+ lines[-1] = warning if lines.size > to
31
+ lines.join("\n")
32
+ end
33
+ end
34
+ end
35
+ end
data/lib/kennel/syncer.rb CHANGED
@@ -22,7 +22,7 @@ module Kennel
22
22
  validate_changes
23
23
  prevent_irreversible_partial_updates
24
24
 
25
- @warnings.each { |message| Kennel.out.puts Utils.color(:yellow, "Warning: #{message}") }
25
+ @warnings.each { |message| Kennel.out.puts Console.color(:yellow, "Warning: #{message}") }
26
26
  end
27
27
 
28
28
  def plan
@@ -37,7 +37,7 @@ module Kennel
37
37
  def print_plan
38
38
  Kennel.out.puts "Plan:"
39
39
  if noop?
40
- Kennel.out.puts Utils.color(:green, "Nothing to do")
40
+ Kennel.out.puts Console.color(:green, "Nothing to do")
41
41
  else
42
42
  print_changes "Create", @create, :green
43
43
  print_changes "Update", @update, :yellow
@@ -48,7 +48,7 @@ module Kennel
48
48
  def confirm
49
49
  return false if noop?
50
50
  return true if ENV["CI"] || !STDIN.tty? || !Kennel.err.tty?
51
- Utils.ask("Execute Plan ?")
51
+ Console.ask?("Execute Plan ?")
52
52
  end
53
53
 
54
54
  def update
@@ -58,7 +58,6 @@ module Kennel
58
58
  message = "#{e.class.api_resource} #{e.tracking_id}"
59
59
  Kennel.out.puts "Creating #{message}"
60
60
  reply = @api.create e.class.api_resource, e.as_json
61
- Utils.inline_resource_metadata reply, e.class
62
61
  id = reply.fetch(:id)
63
62
  changes << Change.new(:create, e.class.api_resource, e.tracking_id, id)
64
63
  populate_id_map [], [reply] # allow resolving ids we could previously no resolve
@@ -211,7 +210,7 @@ module Kennel
211
210
  return if list.empty?
212
211
  list.each do |_, e, a, diff|
213
212
  klass = (e ? e.class : a.fetch(:klass))
214
- Kennel.out.puts Utils.color(color, "#{step} #{klass.api_resource} #{e&.tracking_id || a.fetch(:tracking_id)}")
213
+ Kennel.out.puts Console.color(color, "#{step} #{klass.api_resource} #{e&.tracking_id || a.fetch(:tracking_id)}")
215
214
  diff&.each { |args| Kennel.out.puts @attribute_differ.format(*args) } # only for update
216
215
  end
217
216
  end
@@ -270,7 +269,7 @@ module Kennel
270
269
  (!@tracking_id_filter || @tracking_id_filter.include?(tracking_id))
271
270
 
272
271
  @id_map.set(api_resource, tracking_id, a.fetch(:id))
273
- if a[:klass].api_resource == "synthetics/tests"
272
+ if a.fetch(:klass).api_resource == "synthetics/tests"
274
273
  @id_map.set(Kennel::Models::Monitor.api_resource, tracking_id, a.fetch(:monitor_id))
275
274
  end
276
275
  end
@@ -22,7 +22,7 @@ module Kennel
22
22
  m[:state][:groups].each do |g|
23
23
  color = COLORS[g[:status]] || :default
24
24
  since = "\t#{time_since(g[:last_triggered_ts])}"
25
- Kennel.out.puts "#{Kennel::Utils.color(color, g[:status])}\t#{g[:name]}#{since}"
25
+ Kennel.out.puts "#{Kennel::Console.color(color, g[:status])}\t#{g[:name]}#{since}"
26
26
  end
27
27
  Kennel.out.puts
28
28
  end
data/lib/kennel/utils.rb CHANGED
@@ -1,100 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
  module Kennel
3
3
  module Utils
4
- COLORS = { red: 31, green: 32, yellow: 33, cyan: 36, magenta: 35, default: 0 }.freeze
5
-
6
- class TeeIO < IO
7
- def initialize(ios)
8
- super(0) # called with fake file descriptor 0, so we can call super and get a proper class
9
- @ios = ios
10
- end
11
-
12
- def write(string)
13
- @ios.each { |io| io.write string }
14
- end
15
- end
16
-
17
4
  class << self
18
- def snake_case(string)
19
- string
20
- .gsub(/::/, "_") # Foo::Bar -> foo_bar
21
- .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2') # FOOBar -> foo_bar
22
- .gsub(/([a-z\d])([A-Z])/, '\1_\2') # fooBar -> foo_bar
23
- .tr("-", "_") # foo-bar -> foo_bar
24
- .downcase
25
- end
26
-
27
- # for child projects, not used internally
28
- def title_case(string)
29
- string.split(/[\s_]/).map(&:capitalize) * " "
30
- end
31
-
32
- # simplified version of https://apidock.com/rails/ActiveSupport/Inflector/parameterize
33
- def parameterize(string)
34
- string
35
- .downcase
36
- .gsub(/[^a-z0-9\-_]+/, "-") # remove unsupported
37
- .gsub(/-{2,}/, "-") # remove duplicates
38
- .gsub(/^-|-$/, "") # remove leading/trailing
39
- end
40
-
41
5
  def presence(value)
42
6
  value.nil? || value.empty? ? nil : value
43
7
  end
44
8
 
45
- def ask(question)
46
- Kennel.err.printf color(:red, "#{question} - press 'y' to continue: ", force: true)
47
- begin
48
- STDIN.gets.chomp == "y"
49
- rescue Interrupt # do not show a backtrace if user decides to Ctrl+C here
50
- Kennel.err.print "\n"
51
- exit 1
52
- end
53
- end
54
-
55
- def color(color, text, force: false)
56
- return text unless force || Kennel.out.tty?
57
-
58
- "\e[#{COLORS.fetch(color)}m#{text}\e[0m"
59
- end
60
-
61
- def truncate_lines(text, to:, warning:)
62
- lines = text.split(/\n/, to + 1)
63
- lines[-1] = warning if lines.size > to
64
- lines.join("\n")
65
- end
66
-
67
- def capture_stdout
68
- old = Kennel.out
69
- Kennel.out = StringIO.new
70
- yield
71
- Kennel.out.string
72
- ensure
73
- Kennel.out = old
74
- end
75
-
76
- def capture_stderr
77
- old = Kennel.err
78
- Kennel.err = StringIO.new
79
- yield
80
- Kennel.err.string
81
- ensure
82
- Kennel.err = old
83
- end
84
-
85
- def tee_output
86
- old_stdout = Kennel.out
87
- old_stderr = Kennel.err
88
- capture = StringIO.new
89
- Kennel.out = TeeIO.new([capture, Kennel.out])
90
- Kennel.err = TeeIO.new([capture, Kennel.err])
91
- yield
92
- capture.string
93
- ensure
94
- Kennel.out = old_stdout
95
- Kennel.err = old_stderr
96
- end
97
-
98
9
  def capture_sh(command)
99
10
  result = `#{command} 2>&1`
100
11
  raise "Command failed:\n#{command}\n#{result}" unless $CHILD_STATUS.success?
@@ -150,11 +61,6 @@ module Kennel
150
61
  else []
151
62
  end
152
63
  end
153
-
154
- def inline_resource_metadata(resource, klass)
155
- resource[:klass] = klass
156
- resource[:tracking_id] = klass.parse_tracking_id(resource)
157
- end
158
64
  end
159
65
  end
160
66
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Kennel
3
- VERSION = "1.129.0"
3
+ VERSION = "1.130.0"
4
4
  end
data/lib/kennel.rb CHANGED
@@ -5,6 +5,8 @@ require "zeitwerk"
5
5
  require "English"
6
6
 
7
7
  require "kennel/version"
8
+ require "kennel/console"
9
+ require "kennel/string_utils"
8
10
  require "kennel/utils"
9
11
  require "kennel/progress"
10
12
  require "kennel/filter"
@@ -133,8 +135,7 @@ module Kennel
133
135
  def definitions(**kwargs)
134
136
  @definitions ||= Progress.progress("Downloading definitions", **kwargs) do
135
137
  Utils.parallel(Models::Record.subclasses) do |klass|
136
- results = api.list(klass.api_resource, with_downtimes: false) # lookup monitors without adding unnecessary downtime information
137
- results.each { |a| Utils.inline_resource_metadata(a, klass) }
138
+ api.list(klass.api_resource, with_downtimes: false) # lookup monitors without adding unnecessary downtime information
138
139
  end.flatten(1)
139
140
  end
140
141
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kennel
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.129.0
4
+ version: 1.130.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Grosser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-16 00:00:00.000000000 Z
11
+ date: 2022-12-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: diff-lcs
@@ -90,6 +90,7 @@ files:
90
90
  - lib/kennel.rb
91
91
  - lib/kennel/api.rb
92
92
  - lib/kennel/attribute_differ.rb
93
+ - lib/kennel/console.rb
93
94
  - lib/kennel/file_cache.rb
94
95
  - lib/kennel/filter.rb
95
96
  - lib/kennel/github_reporter.rb
@@ -108,6 +109,7 @@ files:
108
109
  - lib/kennel/progress.rb
109
110
  - lib/kennel/projects_provider.rb
110
111
  - lib/kennel/settings_as_methods.rb
112
+ - lib/kennel/string_utils.rb
111
113
  - lib/kennel/subclass_tracking.rb
112
114
  - lib/kennel/syncer.rb
113
115
  - lib/kennel/tasks.rb