bugsnag-maze-runner 8.20.3 → 9.0.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a928b65bbbf37b2eab57476e07128da1a3d9687df05067af815b61f07e1fda4a
4
- data.tar.gz: bcc382e705d7ad894efb774c45df46c8a0e11c54196c2f95d4ec75eb1c3a645a
3
+ metadata.gz: b7294cf169ef0a66ead9789be570496771a20734bb793340653b4235aa016f07
4
+ data.tar.gz: 30bfe8f408345f79524c37165e9760b97a9acfb1c546628a1cac3b0aa3063f1f
5
5
  SHA512:
6
- metadata.gz: ded12f7dc2d5a1b7946bf3946ada2adbd0f5fa8f09963d25a8f369ffa2cf9dba6871d6a6b7aeebcb7d9cbac028bd6f5214d1459c12a7aa38273d92cf730f2fde
7
- data.tar.gz: a4611075356879b4217883ae3aef1ad9105935e57e02fb6f439accf74cd9f68d9a6039e6423fb833c5e14b45986ecdcf58ae5896b75c65c857e63a2f9c3d7f88
6
+ metadata.gz: ec4f97ffe50aa33479d9c3f36748ffe72932798d165e71f25072c69613cbb30c485a2efe0aec792aac6c50149ee885d9ecc52dc11a71c813313e79d7b2bfb4d5
7
+ data.tar.gz: dd0e9a17df5d6298b59d5932777f423486ab8aed01b95625c47e72450325b61a71df0b417c984cf73a9c3fe029f29ec383defa29fd168270a0658abec418ff19
data/bin/download-logs CHANGED
@@ -6,7 +6,7 @@ require 'em/pure_ruby'
6
6
 
7
7
  require_relative '../lib/maze'
8
8
  require_relative '../lib/maze/client/bs_client_utils'
9
- require_relative '../lib/maze/loggers/logger'
9
+ require_relative '../lib/maze/logger'
10
10
  require 'net/http'
11
11
  require 'json'
12
12
  require 'uri'
data/bin/maze-runner CHANGED
@@ -40,6 +40,7 @@ require_relative '../lib/maze/errors'
40
40
  require_relative '../lib/maze/generator'
41
41
  require_relative '../lib/maze/helper'
42
42
  require_relative '../lib/maze/http_request'
43
+ require_relative '../lib/maze/logger'
43
44
  require_relative '../lib/maze/macos_utils'
44
45
  require_relative '../lib/maze/maze_output'
45
46
  require_relative '../lib/maze/metrics_processor'
@@ -52,8 +53,6 @@ require_relative '../lib/maze/repeaters/bugsnag_repeater'
52
53
  require_relative '../lib/maze/runner'
53
54
  require_relative '../lib/maze/terminating_server'
54
55
 
55
- require_relative '../lib/maze/loggers/logger'
56
-
57
56
  require_relative '../lib/maze/servlets/base_servlet'
58
57
  require_relative '../lib/maze/servlets/all_commands_servlet'
59
58
  require_relative '../lib/maze/servlets/command_servlet'
@@ -86,7 +85,6 @@ require_relative '../lib/maze/hooks/appium_hooks'
86
85
  require_relative '../lib/maze/hooks/browser_hooks'
87
86
  require_relative '../lib/maze/hooks/command_hooks'
88
87
  require_relative '../lib/maze/hooks/error_code_hook'
89
- require_relative '../lib/maze/hooks/logger_hooks'
90
88
 
91
89
  require_relative '../lib/maze/driver/appium'
92
90
  require_relative '../lib/maze/driver/browser'
@@ -95,7 +93,6 @@ require_relative '../lib/maze/plugins/bugsnag_reporting_plugin'
95
93
  require_relative '../lib/maze/plugins/error_code_plugin'
96
94
  require_relative '../lib/maze/plugins/global_retry_plugin'
97
95
  require_relative '../lib/maze/plugins/datadog_metrics_plugin'
98
- require_relative '../lib/maze/plugins/logging_scenarios_plugin'
99
96
 
100
97
  # Require monkey-patches after everything else
101
98
  require_relative '../lib/utils/selenium_money_patch'
data/bin/purge-projects CHANGED
@@ -6,7 +6,7 @@ require 'em/pure_ruby'
6
6
 
7
7
  require_relative '../lib/maze'
8
8
  require_relative '../lib/maze/client/bb_api_client'
9
- require_relative '../lib/maze/loggers/logger'
9
+ require_relative '../lib/maze/logger'
10
10
  require_relative '../lib/maze/helper'
11
11
  require 'optimist'
12
12
  require 'uri'
data/bin/upload-app CHANGED
@@ -7,7 +7,7 @@ require 'em/pure_ruby'
7
7
  require_relative '../lib/maze'
8
8
  require_relative '../lib/maze/client/bs_client_utils'
9
9
  require_relative '../lib/maze/client/bb_client_utils'
10
- require_relative '../lib/maze/loggers/logger'
10
+ require_relative '../lib/maze/logger'
11
11
  require_relative '../lib/maze/helper'
12
12
  require 'optimist'
13
13
  require 'uri'
@@ -92,11 +92,8 @@ InstallPlugin do |config|
92
92
  # Only add the retry plugin if --retry is not used on the command line
93
93
  config.filters << Maze::Plugins::GlobalRetryPlugin.new(config) if config.options[:retry].zero?
94
94
 
95
- # Add step logging
96
- config.filters << Maze::Plugins::LoggingScenariosPlugin.new(config)
97
-
98
- # Add bugsnag failed scenario reporting only if ENV['MAZE_SCENARIO_BUGSNAG_API_KEY'] is present
99
- config.filters << Maze::Plugins::BugsnagReportingPlugin.new(config) unless ENV['MAZE_SCENARIO_BUGSNAG_API_KEY'].nil?
95
+ # TODO: Reporting of test failures as errors deactivated pending PLAT-10963
96
+ #config.filters << Maze::Plugins::BugsnagReportingPlugin.new(config)
100
97
  end
101
98
 
102
99
  # Before each scenario
@@ -116,9 +113,6 @@ Before do |scenario|
116
113
 
117
114
  # Call any blocks registered by the client
118
115
  Maze.hooks.call_before scenario
119
-
120
- # Invoke the logger hook for the scenario
121
- Maze::Hooks::LoggerHooks.before scenario
122
116
  end
123
117
 
124
118
  # General processing to be run after each scenario
@@ -128,9 +122,6 @@ After do |scenario|
128
122
  Maze::MacosUtils.capture_screen(scenario)
129
123
  end
130
124
 
131
- # Invoke the logger hook for the scenario
132
- Maze::Hooks::LoggerHooks.after scenario
133
-
134
125
  # Call any blocks registered by the client
135
126
  Maze.hooks.call_after scenario
136
127
 
@@ -193,17 +184,17 @@ def output_received_requests(request_type)
193
184
  $stdout.puts "--- #{request_type} #{number} of #{count}"
194
185
 
195
186
  $logger.info 'Request body:'
196
- Maze::Loggers::LogUtil.log_hash(Logger::Severity::INFO, request[:body])
187
+ Maze::LogUtil.log_hash(Logger::Severity::INFO, request[:body])
197
188
 
198
189
  $logger.info 'Request headers:'
199
- Maze::Loggers::LogUtil.log_hash(Logger::Severity::INFO, request[:request].header)
190
+ Maze::LogUtil.log_hash(Logger::Severity::INFO, request[:request].header)
200
191
 
201
192
  $logger.info 'Request digests:'
202
- Maze::Loggers::LogUtil.log_hash(Logger::Severity::INFO, request[:digests])
193
+ Maze::LogUtil.log_hash(Logger::Severity::INFO, request[:digests])
203
194
 
204
195
  $logger.info "Response body: #{request[:response].body}"
205
196
  $logger.info 'Response headers:'
206
- Maze::Loggers::LogUtil.log_hash(Logger::Severity::INFO, request[:response].header)
197
+ Maze::LogUtil.log_hash(Logger::Severity::INFO, request[:response].header)
207
198
  end
208
199
  end
209
200
  end
@@ -235,9 +226,6 @@ end
235
226
 
236
227
  # After all tests
237
228
  AfterAll do
238
- # Ensure the logger output is in the correct location
239
- Maze::Hooks::LoggerHooks.after_all
240
-
241
229
  maze_output = File.join(Dir.pwd, 'maze_output')
242
230
  maze_output_zip = File.join(Dir.pwd, 'maze_output.zip')
243
231
  # zip a folder with files and subfolders
@@ -12,8 +12,6 @@ module Maze
12
12
  TUNNEL_FAILURE = 101
13
13
  SESSION_CREATION_FAILURE = 102
14
14
  APPIUM_SESSION_FAILURE = 103
15
- # A catch-all for certain errors related to Appium failures when the app is running app hang or ANR tests
16
- APPIUM_APP_HANG_FAILURE = 104
17
15
  end
18
16
  end
19
17
  end
@@ -11,6 +11,7 @@ module Maze
11
11
  Bugsnag.configure do |config|
12
12
  config.api_key = ENV['MAZE_BUGSNAG_API_KEY']
13
13
  config.app_version = Maze::VERSION
14
+ config.discard_classes << 'Test::Unit::AssertionFailedError'
14
15
  config.add_metadata(:'test driver', {
15
16
  'driver type': Maze.driver.class,
16
17
  'device farm': Maze.config.farm,
@@ -31,7 +32,6 @@ module Maze
31
32
  metadata['job url'] = ENV['BUILDKITE_BUILD_URL'] + "#" + ENV['BUILDKITE_JOB_ID']
32
33
  end
33
34
  end
34
- config.middleware.use(AssertErrorMiddleware)
35
35
  config.add_metadata(:'buildkite', metadata)
36
36
  config.project_root = Dir.pwd
37
37
  end
@@ -45,27 +45,5 @@ module Maze
45
45
  end
46
46
  end
47
47
  end
48
-
49
- class AssertErrorMiddleware
50
- IGNORE_CLASS_NAME = 'Test::Unit::AssertionFailedError'
51
-
52
- # @param middleware [#call] The next middleware to call
53
- def initialize(middleware)
54
- @middleware = middleware
55
- end
56
-
57
- def call(report)
58
- # Only ignore automated notifies with assertion errors
59
- automated = report.unhandled
60
-
61
- class_match = report.raw_exceptions.any? do |ex|
62
- ex.class.name.eql?(IGNORE_CLASS_NAME)
63
- end
64
-
65
- report.ignore! if automated && class_match
66
-
67
- @middleware.call(report)
68
- end
69
- end
70
48
  end
71
49
  end
@@ -22,10 +22,7 @@ module Maze
22
22
  when 'android'
23
23
  Maze.driver.session_capabilities['appPackage']
24
24
  when 'ios'
25
- unless app_id = Maze.driver.session_capabilities['CFBundleIdentifier']
26
- app_id = Maze.driver.session_capabilities['bundleID']
27
- end
28
- app_id
25
+ Maze.driver.session_capabilities['CFBundleIdentifier'] # Present on BS and locally
29
26
  end
30
27
 
31
28
  # Ensure the device is unlocked
@@ -30,10 +30,6 @@ module Maze
30
30
  interval = 300
31
31
  elsif error.message.include? 'There are no devices available'
32
32
  interval = 120
33
- elsif error.message.include? 'Appium Settings app is not running'
34
- interval = 10
35
- elsif error.message.include? 'Could not proxy command to the remote server'
36
- interval = 10
37
33
  else
38
34
  # Do not retry in any other case
39
35
  end
@@ -77,9 +73,7 @@ module Maze
77
73
  }
78
74
  capabilities.deep_merge! BitBarClientUtils.dashboard_capabilities
79
75
  capabilities.deep_merge! BitBarDevices.get_available_device(config.device)
80
- capabilities['bitbar:options']['appiumVersion'] = config.appium_version unless config.appium_version.nil?
81
76
  capabilities.deep_merge! JSON.parse(config.capabilities_option)
82
-
83
77
  capabilities
84
78
  end
85
79
 
@@ -93,7 +87,7 @@ module Maze
93
87
  $logger.info 'Appium session(s) created:'
94
88
  @session_ids.each do |id|
95
89
  link = api_client.get_device_session_ui_link(id)
96
- $logger.info Maze::Loggers::LogUtil.linkify(link, "BitBar session: #{id}") if link
90
+ $logger.info Maze::LogUtil.linkify(link, "BitBar session: #{id}") if link
97
91
  end
98
92
  end
99
93
 
@@ -68,7 +68,7 @@ module Maze
68
68
  def log_run_intro
69
69
  # Log a link to the BrowserStack session search dashboard
70
70
  url = "https://app-automate.browserstack.com/dashboard/v2/search?query=#{Maze.run_uuid}&type=builds"
71
- $logger.info Maze::Loggers::LogUtil.linkify(url, 'BrowserStack session(s)')
71
+ $logger.info Maze::LogUtil.linkify(url, 'BrowserStack session(s)')
72
72
  end
73
73
 
74
74
  def log_run_outro
@@ -82,10 +82,12 @@ module Maze
82
82
  # iOS devices
83
83
  'IOS_17' => make_ios_hash('iPhone 15', '17'),
84
84
  'IOS_16' => make_ios_hash('iPhone 14', '16'),
85
- 'IOS_15' => make_ios_hash('iPhone 13', '15'),
85
+ 'IOS_15' => make_ios_hash('iPhone 11 Pro', '15'),
86
86
  'IOS_14' => make_ios_hash('iPhone 11', '14'),
87
- 'IOS_13' => make_ios_hash('iPhone 11', '13'),
87
+ 'IOS_13' => make_ios_hash('iPhone 8', '13'),
88
88
  'IOS_12' => make_ios_hash('iPhone 8', '12'),
89
+ 'IOS_11' => make_ios_hash('iPhone 8', '11'),
90
+ 'IOS_10' => make_ios_hash('iPhone 7', '10')
89
91
  }
90
92
 
91
93
  # Specific Android devices
@@ -98,8 +100,10 @@ module Maze
98
100
 
99
101
  add_android 'Google Pixel 2', '9.0', hash # ANDROID_9_0_GOOGLE_PIXEL_2
100
102
  add_android 'Samsung Galaxy Note 9', '8.1', hash # ANDROID_8_1_SAMSUNG_GALAXY_NOTE_9
103
+ add_android 'Samsung Galaxy J7 Prime', '8.1', hash # ANDROID_8_1_SAMSUNG_GALAXY_J7_PRIME
101
104
  add_android 'Samsung Galaxy Tab S4', '8.1', hash # ANDROID_8_1_SAMSUNG_GALAXY_TAB_S4
102
105
  add_android 'Samsung Galaxy Tab S3', '8.0', hash # ANDROID_8_0_SAMSUNG_GALAXY_TAB_S3
106
+ add_android 'Google Pixel 2', '8.0', hash # ANDROID_8_0_GOOGLE_PIXEL_2
103
107
  add_android 'Samsung Galaxy S9', '8.0', hash # ANDROID_8_0_SAMSUNG_GALAXY_S9
104
108
  add_android 'Samsung Galaxy S9 Plus', '8.0', hash # ANDROID_8_0_SAMSUNG_GALAXY_S9_PLUS
105
109
 
@@ -115,6 +119,18 @@ module Maze
115
119
  add_ios 'iPhone 14 Pro', '16.0', hash # IOS_16_0_IPHONE_14_PRO
116
120
  add_ios 'iPhone 14 Pro Max', '16.0', hash # IOS_16_0_IPHONE_14_PRO_MAX
117
121
 
122
+ add_ios 'iPhone 8 Plus', '11.0', hash # IOS_11_0_IPHONE_8_PLUS
123
+ add_ios 'iPhone X', '11.0', hash # IOS_11_0_IPHONE_X
124
+ add_ios 'iPhone SE', '11.0', hash # IOS_11_0_IPHONE_SE
125
+ add_ios 'iPhone 6', '11.0', hash # IOS_11_0_IPHONE_6
126
+ add_ios 'iPhone 6S', '11.0', hash # IOS_11_0_IPHONE_6S
127
+ add_ios 'iPhone 6S Plus', '11.0', hash # IOS_11_0_IPHONE_6S_PLUS
128
+ add_ios 'iPad 5th', '11.0', hash # IOS_11_0_IPAD_5TH
129
+ add_ios 'iPad Mini 4', '11.0', hash # IOS_11_0_IPAD_MINI_4
130
+ add_ios 'iPad Pro 9.7 2016', '11.0', hash # IOS_11_0_IPAD_PRO_9_7_2016
131
+ add_ios 'iPad 6th', '11.0', hash # IOS_11_0_IPAD_6TH
132
+ add_ios 'iPad Pro 12.9', '11.0', hash # IOS_11_0_IPAD_PRO_12_9
133
+
118
134
  hash
119
135
  end
120
136
  end
@@ -34,7 +34,7 @@ module Maze
34
34
  $logger.info 'Selenium session created:'
35
35
  id = Maze.driver.session_id
36
36
  link = api_client.get_device_session_ui_link(id)
37
- $logger.info Maze::Loggers::LogUtil.linkify link, 'BitBar session(s)' if link
37
+ $logger.info Maze::LogUtil.linkify link, 'BitBar session(s)' if link
38
38
  end
39
39
 
40
40
  def stop_session
@@ -85,7 +85,7 @@ module Maze
85
85
  def log_session_info
86
86
  # Log a link to the BrowserStack session search dashboard
87
87
  url = "https://automate.browserstack.com/dashboard/v2/search?query=#{Maze.run_uuid}&type=builds"
88
- $logger.info Maze::Loggers::LogUtil.linkify url, 'BrowserStack session(s)'
88
+ $logger.info Maze::LogUtil.linkify url, 'BrowserStack session(s)'
89
89
  end
90
90
  end
91
91
  end
@@ -3,7 +3,7 @@ require 'bugsnag'
3
3
  require 'json'
4
4
  require 'open3'
5
5
  require 'securerandom'
6
- require_relative '../loggers/logger'
6
+ require_relative '../logger'
7
7
  require_relative '../../maze'
8
8
 
9
9
  module Maze
@@ -30,14 +30,11 @@ module Maze
30
30
  elsif [:bb, :bs, :local].include? Maze.config.farm
31
31
  write_device_logs(scenario) if scenario.failed?
32
32
 
33
- # TODO: PLAT-10300 - Review our general approach to resetting the app between scenarios
34
- re = Regexp.new('^1\.1[56]\.\d$')
35
- if re.match? Maze.config.appium_version
36
- Maze.driver.close_app
37
- Maze.driver.launch_app
38
- else
39
- Maze.driver.reset
40
- end
33
+ # Reset the server to ensure that test fixtures cannot fetch
34
+ # commands from the previous scenario (in idempotent mode).
35
+ Maze.driver.terminate_app Maze.driver.app_id
36
+ Maze::Server.reset!
37
+ Maze.driver.activate_app Maze.driver.app_id
41
38
  end
42
39
  rescue => error
43
40
  # Notify and re-raise for Cucumber to handle
@@ -46,6 +43,7 @@ module Maze
46
43
  end
47
44
 
48
45
  def after_all
46
+ @client&.log_run_outro
49
47
  if $success
50
48
  Maze::Plugins::DatadogMetricsPlugin.send_increment('appium.test_succeeded')
51
49
  else
@@ -59,7 +57,6 @@ module Maze
59
57
 
60
58
  def at_exit
61
59
  if @client
62
- @client.log_run_outro
63
60
  $logger.info 'Stopping the Appium session'
64
61
  @client.stop_session
65
62
  end
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bugsnag'
4
+ require 'logger'
5
+ require 'singleton'
6
+
7
+ # Monkey patch a 'trace' log level into the standard Logger
8
+ class Logger
9
+ remove_const(:SEV_LABEL)
10
+ SEV_LABEL = {
11
+ -1 => 'TRACE',
12
+ 0 => 'DEBUG',
13
+ 1 => 'INFO',
14
+ 2 => 'WARN',
15
+ 3 => 'ERROR',
16
+ 4 => 'FATAL',
17
+ 5 => 'ANY'
18
+ }
19
+
20
+ module Severity
21
+ TRACE=-1
22
+ end
23
+
24
+ def trace(name = nil, &block)
25
+ add(TRACE, nil, name, &block)
26
+ end
27
+
28
+ def trace?
29
+ @level <= TRACE
30
+ end
31
+ end
32
+
33
+ # Logger classes
34
+ module Maze
35
+ # A logger, with level configured according to the environment
36
+ class Logger < Logger
37
+ include Singleton
38
+
39
+ attr_accessor :datetime_format
40
+
41
+ def initialize
42
+ if ENV['TRACE']
43
+ super(STDOUT, level: Logger::TRACE)
44
+ elsif ENV['DEBUG']
45
+ super(STDOUT, level: Logger::DEBUG)
46
+ elsif ENV['QUIET']
47
+ super(STDOUT, level: Logger::ERROR)
48
+ else
49
+ super(STDOUT, level: Logger::INFO)
50
+ end
51
+
52
+ @datetime_format = '%H:%M:%S'
53
+
54
+ @formatter = proc do |severity, time, _name, message|
55
+ formatted_time = time.strftime(@datetime_format)
56
+
57
+ "\e[2m[#{formatted_time}]\e[0m #{severity.rjust(5)}: #{message}\n"
58
+ end
59
+ end
60
+ end
61
+
62
+ $logger = Maze::Logger.instance
63
+
64
+ # A collection of logging utilities
65
+ class LogUtil
66
+ class << self
67
+ # Logs Hash-based data, accounting for things like file upload requests that are too big to log meaningfully.
68
+ #
69
+ # @param severity [Integer] A constant from Logger::Severity
70
+ # @param data [Hash] The data to log (currently needs to be a Hash)
71
+ def log_hash(severity, data)
72
+ return unless data.is_a? Hash
73
+
74
+ # Try to pretty print as JSON, if not too big
75
+ begin
76
+ json = JSON.pretty_generate data
77
+ if json.length < 128 * 1024
78
+ $logger.add severity, json
79
+ else
80
+ log_hash_by_field severity, data
81
+ end
82
+ rescue Encoding::UndefinedConversionError => error
83
+ # Just give up, we don't want to risk a further error trying to log garbage
84
+ Bugsnag.notify error
85
+ $logger.error 'Unable to log hash as JSON'
86
+ end
87
+ end
88
+
89
+ # Logs a hash field by field,
90
+ #
91
+ # @param severity [Integer] A Logger::Severity
92
+ # @param hash [Hash] The Hash
93
+ def log_hash_by_field(severity, hash)
94
+ hash.keys.each do |key|
95
+ value = hash[key].to_s
96
+ if value.length < 1024
97
+ $logger.add severity, " #{key}: #{value}"
98
+ else
99
+ $logger.add severity, " #{key} (length): #{value.length}"
100
+ $logger.add severity, " #{key} (start): #{value[0, 1024]}"
101
+ end
102
+ end
103
+ end
104
+
105
+ # Produces a clickable link when logged in Buildkite
106
+ # @param url [String] Link URL
107
+ # @param text [String] Link text
108
+ def linkify(url, text)
109
+ if ENV['BUILDKITE']
110
+ "\033]1339;url='#{url}';content='#{text}'\a"
111
+ else
112
+ "#{text}: #{url}"
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -42,7 +42,7 @@ module Maze
42
42
  default: true
43
43
 
44
44
  opt Option::BUGSNAG,
45
- 'Enables reporting to Bugsnag on scenario failure (requires MAZE_BUGSNAG_API_KEY for errors, MAZE_SCENARIO_BUGSNAG_API_KEY for test failures)',
45
+ 'Enables reporting to Bugsnag on scenario failure (requires MAZE_BUGSNAG_API_KEY)',
46
46
  type: :boolean,
47
47
  short: :none,
48
48
  default: true
@@ -25,9 +25,6 @@ module Maze
25
25
  next unless event.test_case.eql?(test_case) && event.result.failed?
26
26
 
27
27
  Bugsnag.notify(event.result.exception) do |bsg_event|
28
-
29
- bsg_event.api_key = ENV['MAZE_SCENARIO_BUGSNAG_API_KEY']
30
-
31
28
  unless @last_test_step.nil?
32
29
 
33
30
  repo = ENV['BUILDKITE_PIPELINE_SLUG']
data/lib/maze/server.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  require 'bugsnag'
4
4
  require 'json'
5
5
  require 'webrick'
6
- require_relative 'loggers/logger'
6
+ require_relative './logger'
7
7
  require_relative './request_list'
8
8
 
9
9
  module Maze
data/lib/maze.rb CHANGED
@@ -7,7 +7,7 @@ require_relative 'maze/timers'
7
7
  # Glues the various parts of MazeRunner together that need to be accessed globally,
8
8
  # providing an alternative to the proliferation of global variables or singletons.
9
9
  module Maze
10
- VERSION = '8.20.3'
10
+ VERSION = '9.0.0'
11
11
 
12
12
  class << self
13
13
  attr_accessor :check, :driver, :internal_hooks, :mode, :start_time, :dynamic_retry, :public_address,
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bugsnag-maze-runner
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.20.3
4
+ version: 9.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve Kirkland
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-08-01 00:00:00.000000000 Z
11
+ date: 2024-01-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cucumber
@@ -409,13 +409,9 @@ files:
409
409
  - lib/maze/hooks/command_hooks.rb
410
410
  - lib/maze/hooks/error_code_hook.rb
411
411
  - lib/maze/hooks/hooks.rb
412
- - lib/maze/hooks/logger_hooks.rb
413
412
  - lib/maze/http_request.rb
414
413
  - lib/maze/interactive_cli.rb
415
- - lib/maze/loggers/file_logger.rb
416
- - lib/maze/loggers/log_util.rb
417
- - lib/maze/loggers/logger.rb
418
- - lib/maze/loggers/stdout_logger.rb
414
+ - lib/maze/logger.rb
419
415
  - lib/maze/macos_utils.rb
420
416
  - lib/maze/maze_output.rb
421
417
  - lib/maze/metrics_processor.rb
@@ -428,7 +424,6 @@ files:
428
424
  - lib/maze/plugins/datadog_metrics_plugin.rb
429
425
  - lib/maze/plugins/error_code_plugin.rb
430
426
  - lib/maze/plugins/global_retry_plugin.rb
431
- - lib/maze/plugins/logging_scenarios_plugin.rb
432
427
  - lib/maze/proxy.rb
433
428
  - lib/maze/repeaters/aspecto_repeater.rb
434
429
  - lib/maze/repeaters/bugsnag_repeater.rb
@@ -454,11 +449,11 @@ files:
454
449
  - lib/maze/wait.rb
455
450
  - lib/utils/deep_merge.rb
456
451
  - lib/utils/selenium_money_patch.rb
457
- homepage:
452
+ homepage:
458
453
  licenses:
459
454
  - MIT
460
455
  metadata: {}
461
- post_install_message:
456
+ post_install_message:
462
457
  rdoc_options: []
463
458
  require_paths:
464
459
  - lib
@@ -473,8 +468,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
473
468
  - !ruby/object:Gem::Version
474
469
  version: '0'
475
470
  requirements: []
476
- rubygems_version: 3.5.3
477
- signing_key:
471
+ rubygems_version: 3.1.6
472
+ signing_key:
478
473
  specification_version: 4
479
474
  summary: Bugsnag API request validation harness
480
475
  test_files: []
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Maze
4
- module Hooks
5
- # Hooks for Browser mode use
6
- class LoggerHooks
7
- class << self
8
- def before(scenario)
9
- location = "\"# #{scenario.location}\""
10
- $logger.trace ''
11
- $logger.trace "\n--- Begin Scenario: #{scenario.name} #{location}"
12
- end
13
-
14
- def after(scenario)
15
- location = "\"# #{scenario.location}\""
16
- $logger.trace "--- End Scenario: #{scenario.name} #{location}"
17
- $logger.trace ''
18
- end
19
-
20
- def after_all
21
- if ENV['BUILDKITE']
22
- FileUtils.mv("#{Dir.pwd}/#{Maze::Loggers::FileLogger::LOG_LOCATION}", "#{Dir.pwd}/maze_output/maze-runner.log")
23
- end
24
- end
25
- end
26
- end
27
- end
28
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'logger'
4
-
5
- module Maze
6
- module Loggers
7
- # A logger to file, always logging at TRACE level
8
- class FileLogger < Logger
9
-
10
- LOG_LOCATION = 'maze-runner.log'
11
-
12
- include Singleton
13
-
14
- attr_accessor :datetime_format
15
-
16
- def initialize
17
- # Remove the previous log file if it exists
18
- File.delete(LOG_LOCATION) if File.exist?(LOG_LOCATION)
19
-
20
- super(LOG_LOCATION, level: ::Logger::TRACE)
21
-
22
- @datetime_format = '%H:%M:%S'
23
-
24
- @formatter = proc do |severity, time, _name, message|
25
- formatted_time = time.strftime(@datetime_format)
26
-
27
- "\e[2m[#{formatted_time}]\e[0m #{severity.rjust(5)}: #{message}\n"
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,59 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Maze
4
- module Loggers
5
- # A collection of logging utilities
6
- class LogUtil
7
- class << self
8
- # Logs Hash-based data, accounting for things like file upload requests that are too big to log meaningfully.
9
- #
10
- # @param severity [Integer] A constant from Logger::Severity
11
- # @param data [Hash] The data to log (currently needs to be a Hash)
12
- def log_hash(severity, data)
13
- return unless data.is_a? Hash
14
-
15
- # Try to pretty print as JSON, if not too big
16
- begin
17
- json = JSON.pretty_generate data
18
- if json.length < 128 * 1024
19
- $logger.add severity, json
20
- else
21
- log_hash_by_field severity, data
22
- end
23
- rescue Encoding::UndefinedConversionError => error
24
- # Just give up, we don't want to risk a further error trying to log garbage
25
- Bugsnag.notify error
26
- $logger.error 'Unable to log hash as JSON'
27
- end
28
- end
29
-
30
- # Logs a hash field by field,
31
- #
32
- # @param severity [Integer] A Logger::Severity
33
- # @param hash [Hash] The Hash
34
- def log_hash_by_field(severity, hash)
35
- hash.keys.each do |key|
36
- value = hash[key].to_s
37
- if value.length < 1024
38
- $logger.add severity, " #{key}: #{value}"
39
- else
40
- $logger.add severity, " #{key} (length): #{value.length}"
41
- $logger.add severity, " #{key} (start): #{value[0, 1024]}"
42
- end
43
- end
44
- end
45
-
46
- # Produces a clickable link when logged in Buildkite
47
- # @param url [String] Link URL
48
- # @param text [String] Link text
49
- def linkify(url, text)
50
- if ENV['BUILDKITE']
51
- "\033]1339;url='#{url}';content='#{text}'\a"
52
- else
53
- "#{text}: #{url}"
54
- end
55
- end
56
- end
57
- end
58
- end
59
- end
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'bugsnag'
4
- require 'logger'
5
- require 'singleton'
6
- require_relative 'file_logger'
7
- require_relative 'log_util'
8
- require_relative 'stdout_logger'
9
-
10
- # Monkey patch a 'trace' log level into the standard Logger
11
- class Logger
12
- remove_const(:SEV_LABEL)
13
- SEV_LABEL = {
14
- -1 => 'TRACE',
15
- 0 => 'DEBUG',
16
- 1 => 'INFO',
17
- 2 => 'WARN',
18
- 3 => 'ERROR',
19
- 4 => 'FATAL',
20
- 5 => 'ANY'
21
- }
22
-
23
- module Severity
24
- TRACE=-1
25
- end
26
-
27
- def trace(name = nil, &block)
28
- add(TRACE, nil, name, &block)
29
- end
30
-
31
- def trace?
32
- @level <= TRACE
33
- end
34
- end
35
-
36
- module Maze
37
- module Loggers
38
- class Logger
39
- include Singleton
40
-
41
- attr_accessor :stdout_logger, :file_logger
42
-
43
- def initialize
44
- @stdout_logger = Maze::Loggers::STDOUTLogger.instance
45
- @file_logger = Maze::Loggers::FileLogger.instance
46
- end
47
-
48
- # Attempts to forward all method calls to both loggers
49
- def method_missing(method, *args, &block)
50
- if @stdout_logger.respond_to?(method) && @file_logger.respond_to?(method)
51
- @stdout_logger.send(method, *args, &block)
52
- @file_logger.send(method, *args, &block)
53
- else
54
- super
55
- end
56
- end
57
- end
58
- end
59
- end
60
-
61
- $logger = Maze::Loggers::Logger.instance
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'logger'
4
-
5
- module Maze
6
- module Loggers
7
- # A logger to STDOUT, with level configured according to the environment
8
- class STDOUTLogger < Logger
9
- include Singleton
10
-
11
- attr_accessor :datetime_format
12
-
13
- def initialize
14
- if ENV['TRACE']
15
- super(STDOUT, level: ::Logger::TRACE)
16
- elsif ENV['DEBUG']
17
- super(STDOUT, level: ::Logger::DEBUG)
18
- elsif ENV['QUIET']
19
- super(STDOUT, level: ::Logger::ERROR)
20
- else
21
- super(STDOUT, level: ::Logger::INFO)
22
- end
23
-
24
- @datetime_format = '%H:%M:%S'
25
-
26
- @formatter = proc do |severity, time, _name, message|
27
- formatted_time = time.strftime(@datetime_format)
28
-
29
- "\e[2m[#{formatted_time}]\e[0m #{severity.rjust(5)}: #{message}\n"
30
- end
31
- end
32
- end
33
- end
34
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'bugsnag'
4
- require 'cucumber/core/filter'
5
-
6
- module Maze
7
- module Plugins
8
- class LoggingScenariosPlugin < Cucumber::Core::Filter.new(:configuration)
9
-
10
- def test_case(test_case)
11
- configuration.on_event(:test_step_started) do |event|
12
- $logger.trace "Step started: #{event.test_step.to_s}"
13
- end
14
-
15
- super
16
- end
17
- end
18
- end
19
- end