backspin 0.9.0 → 0.11.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 +4 -4
- data/CHANGELOG.md +14 -0
- data/Gemfile.lock +1 -1
- data/MATCHERS.md +18 -0
- data/README.md +57 -0
- data/docs/backspin-result-api-sketch.md +13 -9
- data/fixtures/backspin/.gitkeep +1 -0
- data/lib/backspin/command_diff.rb +70 -13
- data/lib/backspin/matcher.rb +59 -51
- data/lib/backspin/record.rb +60 -6
- data/lib/backspin/recorder.rb +6 -3
- data/lib/backspin/snapshot.rb +52 -19
- data/lib/backspin/version.rb +1 -1
- data/lib/backspin.rb +38 -21
- metadata +2 -56
- data/fixtures/backspin/all_and_fields.yml +0 -15
- data/fixtures/backspin/all_bypass_equality.yml +0 -14
- data/fixtures/backspin/all_checks_equality.yml +0 -17
- data/fixtures/backspin/all_for_logging.yml +0 -14
- data/fixtures/backspin/all_matcher_basic.yml +0 -14
- data/fixtures/backspin/all_matcher_custom.yml +0 -17
- data/fixtures/backspin/all_matcher_demo.yml +0 -14
- data/fixtures/backspin/all_matcher_test.yml +0 -14
- data/fixtures/backspin/all_mode_filter.yml +0 -14
- data/fixtures/backspin/all_no_short_circuit.yml +0 -14
- data/fixtures/backspin/all_pass_field_fail.yml +0 -14
- data/fixtures/backspin/all_short_circuit.yml +0 -14
- data/fixtures/backspin/all_skips_equality.yml +0 -17
- data/fixtures/backspin/all_with_equality.yml +0 -17
- data/fixtures/backspin/all_with_fields.yml +0 -17
- data/fixtures/backspin/combined_fail_demo.yml +0 -14
- data/fixtures/backspin/combined_matcher_demo.yml +0 -14
- data/fixtures/backspin/credential_filter.yml +0 -18
- data/fixtures/backspin/echo_hello.yml +0 -14
- data/fixtures/backspin/echo_verify.yml +0 -14
- data/fixtures/backspin/episodes_filter.yml +0 -26
- data/fixtures/backspin/failure_test.yml +0 -14
- data/fixtures/backspin/field_matcher_demo.yml +0 -17
- data/fixtures/backspin/field_matcher_values.yml +0 -14
- data/fixtures/backspin/full_data_filter.yml +0 -17
- data/fixtures/backspin/key_confusion_test.yml +0 -14
- data/fixtures/backspin/match_on_any_fail.yml +0 -21
- data/fixtures/backspin/match_on_bad_format.yml +0 -14
- data/fixtures/backspin/match_on_fail.yml +0 -15
- data/fixtures/backspin/match_on_invalid.yml +0 -14
- data/fixtures/backspin/match_on_multiple.yml +0 -28
- data/fixtures/backspin/match_on_nil.yml +0 -14
- data/fixtures/backspin/match_on_other_fields.yml +0 -23
- data/fixtures/backspin/match_on_run_bang.yml +0 -16
- data/fixtures/backspin/match_on_run_bang_fail.yml +0 -15
- data/fixtures/backspin/match_on_single.yml +0 -17
- data/fixtures/backspin/mixed_calls.yml +0 -24
- data/fixtures/backspin/multi_command.yml +0 -34
- data/fixtures/backspin/multi_command_filter.yml +0 -26
- data/fixtures/backspin/multi_field_filter.yml +0 -13
- data/fixtures/backspin/multi_system.yml +0 -20
- data/fixtures/backspin/nil_filter.yml +0 -14
- data/fixtures/backspin/none_mode_test.yml +0 -14
- data/fixtures/backspin/path_test.yml +0 -17
- data/fixtures/backspin/playback_system.yml +0 -12
- data/fixtures/backspin/playback_test.yml +0 -14
- data/fixtures/backspin/stderr_test.yml +0 -19
- data/fixtures/backspin/strict_test.yml +0 -14
- data/fixtures/backspin/string_symbol_test.yml +0 -14
- data/fixtures/backspin/system_echo.yml +0 -12
- data/fixtures/backspin/system_false.yml +0 -18
- data/fixtures/backspin/timestamp_test.yml +0 -18
- data/fixtures/backspin/verify_system.yml +0 -12
- data/fixtures/backspin/verify_system_diff.yml +0 -11
- data/fixtures/backspin/version_test.yml +0 -14
data/lib/backspin/snapshot.rb
CHANGED
|
@@ -7,12 +7,13 @@ module Backspin
|
|
|
7
7
|
|
|
8
8
|
def initialize(command_type:, args:, env: nil, stdout: "", stderr: "", status: 0, recorded_at: nil)
|
|
9
9
|
@command_type = command_type
|
|
10
|
-
@args = args
|
|
11
|
-
@env = env
|
|
12
|
-
@stdout = stdout || ""
|
|
13
|
-
@stderr = stderr || ""
|
|
10
|
+
@args = sanitize_args(args)
|
|
11
|
+
@env = env.nil? ? nil : sanitize_env(env)
|
|
12
|
+
@stdout = Backspin.scrub_text((stdout || "").dup).freeze
|
|
13
|
+
@stderr = Backspin.scrub_text((stderr || "").dup).freeze
|
|
14
14
|
@status = status || 0
|
|
15
|
-
@recorded_at = recorded_at
|
|
15
|
+
@recorded_at = recorded_at.nil? ? nil : recorded_at.dup.freeze
|
|
16
|
+
@serialized_hash = build_serialized_hash
|
|
16
17
|
end
|
|
17
18
|
|
|
18
19
|
def success?
|
|
@@ -23,20 +24,8 @@ module Backspin
|
|
|
23
24
|
!success?
|
|
24
25
|
end
|
|
25
26
|
|
|
26
|
-
def to_h
|
|
27
|
-
|
|
28
|
-
"command_type" => command_type.name,
|
|
29
|
-
"args" => scrub_args(args),
|
|
30
|
-
"stdout" => Backspin.scrub_text(stdout),
|
|
31
|
-
"stderr" => Backspin.scrub_text(stderr),
|
|
32
|
-
"status" => status,
|
|
33
|
-
"recorded_at" => recorded_at
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
data["env"] = scrub_env(env) if env
|
|
37
|
-
data = filter.call(data) if filter
|
|
38
|
-
|
|
39
|
-
data
|
|
27
|
+
def to_h
|
|
28
|
+
@serialized_hash
|
|
40
29
|
end
|
|
41
30
|
|
|
42
31
|
def self.from_h(data)
|
|
@@ -62,6 +51,19 @@ module Backspin
|
|
|
62
51
|
|
|
63
52
|
private
|
|
64
53
|
|
|
54
|
+
def build_serialized_hash
|
|
55
|
+
data = {
|
|
56
|
+
"command_type" => command_type.name,
|
|
57
|
+
"args" => args,
|
|
58
|
+
"stdout" => stdout,
|
|
59
|
+
"stderr" => stderr,
|
|
60
|
+
"status" => status,
|
|
61
|
+
"recorded_at" => recorded_at
|
|
62
|
+
}
|
|
63
|
+
data["env"] = env if env
|
|
64
|
+
deep_freeze(data)
|
|
65
|
+
end
|
|
66
|
+
|
|
65
67
|
def scrub_args(value)
|
|
66
68
|
return value unless Backspin.configuration.scrub_credentials && value
|
|
67
69
|
|
|
@@ -82,6 +84,37 @@ module Backspin
|
|
|
82
84
|
|
|
83
85
|
value.transform_values { |entry| entry.is_a?(String) ? Backspin.scrub_text(entry) : entry }
|
|
84
86
|
end
|
|
87
|
+
|
|
88
|
+
def sanitize_args(value)
|
|
89
|
+
deep_freeze(scrub_args(deep_dup(value)))
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def sanitize_env(value)
|
|
93
|
+
deep_freeze(scrub_env(deep_dup(value)))
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def deep_freeze(value)
|
|
97
|
+
case value
|
|
98
|
+
when Hash
|
|
99
|
+
value.each_value { |v| deep_freeze(v) }
|
|
100
|
+
when Array
|
|
101
|
+
value.each { |v| deep_freeze(v) }
|
|
102
|
+
end
|
|
103
|
+
value.freeze
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def deep_dup(value)
|
|
107
|
+
case value
|
|
108
|
+
when Hash
|
|
109
|
+
value.transform_values { |entry| deep_dup(entry) }
|
|
110
|
+
when Array
|
|
111
|
+
value.map { |entry| deep_dup(entry) }
|
|
112
|
+
when String
|
|
113
|
+
value.dup
|
|
114
|
+
else
|
|
115
|
+
value
|
|
116
|
+
end
|
|
117
|
+
end
|
|
85
118
|
end
|
|
86
119
|
end
|
|
87
120
|
|
data/lib/backspin/version.rb
CHANGED
data/lib/backspin.rb
CHANGED
|
@@ -71,19 +71,30 @@ module Backspin
|
|
|
71
71
|
# @param env [Hash] Environment variables to pass to Open3.capture3
|
|
72
72
|
# @param mode [Symbol] Recording mode - :auto, :record, :verify
|
|
73
73
|
# @param matcher [Proc, Hash] Custom matcher for verification
|
|
74
|
-
# @param filter [Proc] Custom filter for recorded data
|
|
74
|
+
# @param filter [Proc] Custom filter for recorded data/canonicalization
|
|
75
|
+
# @param filter_on [Symbol] Filter application mode - :both (default), :record
|
|
75
76
|
# @return [BackspinResult] Aggregate result for this run
|
|
76
|
-
def run(command = nil, name:, env: nil, mode: :auto, matcher: nil, filter: nil, &block)
|
|
77
|
+
def run(command = nil, name:, env: nil, mode: :auto, matcher: nil, filter: nil, filter_on: :both, &block)
|
|
78
|
+
validate_filter_on!(filter_on)
|
|
79
|
+
|
|
77
80
|
if block_given?
|
|
78
81
|
raise ArgumentError, "command must be omitted when using a block" unless command.nil?
|
|
79
82
|
raise ArgumentError, "env is not supported when using a block" unless env.nil?
|
|
80
83
|
|
|
81
|
-
return perform_capture(name, mode: mode, matcher: matcher, filter: filter, &block)
|
|
84
|
+
return perform_capture(name, mode: mode, matcher: matcher, filter: filter, filter_on: filter_on, &block)
|
|
82
85
|
end
|
|
83
86
|
|
|
84
87
|
raise ArgumentError, "command is required" if command.nil?
|
|
85
88
|
|
|
86
|
-
perform_command_run(
|
|
89
|
+
perform_command_run(
|
|
90
|
+
command,
|
|
91
|
+
name: name,
|
|
92
|
+
env: env,
|
|
93
|
+
mode: mode,
|
|
94
|
+
matcher: matcher,
|
|
95
|
+
filter: filter,
|
|
96
|
+
filter_on: filter_on
|
|
97
|
+
)
|
|
87
98
|
end
|
|
88
99
|
|
|
89
100
|
# Captures all stdout/stderr output from a block
|
|
@@ -91,29 +102,27 @@ module Backspin
|
|
|
91
102
|
# @param record_name [String] Name for the record file
|
|
92
103
|
# @param mode [Symbol] Recording mode - :auto, :record, :verify
|
|
93
104
|
# @param matcher [Proc, Hash] Custom matcher for verification
|
|
94
|
-
# @param filter [Proc] Custom filter for recorded data
|
|
105
|
+
# @param filter [Proc] Custom filter for recorded data/canonicalization
|
|
106
|
+
# @param filter_on [Symbol] Filter application mode - :both (default), :record
|
|
95
107
|
# @return [BackspinResult] Aggregate result for this run
|
|
96
|
-
def capture(record_name, mode: :auto, matcher: nil, filter: nil, &block)
|
|
108
|
+
def capture(record_name, mode: :auto, matcher: nil, filter: nil, filter_on: :both, &block)
|
|
97
109
|
raise ArgumentError, "record_name is required" if record_name.nil? || record_name.empty?
|
|
98
110
|
raise ArgumentError, "block is required" unless block_given?
|
|
111
|
+
validate_filter_on!(filter_on)
|
|
99
112
|
|
|
100
|
-
perform_capture(record_name, mode: mode, matcher: matcher, filter: filter, &block)
|
|
113
|
+
perform_capture(record_name, mode: mode, matcher: matcher, filter: filter, filter_on: filter_on, &block)
|
|
101
114
|
end
|
|
102
115
|
|
|
103
116
|
private
|
|
104
117
|
|
|
105
|
-
def perform_capture(record_name, mode:, matcher:, filter:, &block)
|
|
118
|
+
def perform_capture(record_name, mode:, matcher:, filter:, filter_on:, &block)
|
|
106
119
|
record_path = Record.build_record_path(record_name)
|
|
107
120
|
mode = determine_mode(mode, record_path)
|
|
108
121
|
validate_mode!(mode)
|
|
109
122
|
|
|
110
|
-
record =
|
|
111
|
-
Record.create(record_name)
|
|
112
|
-
else
|
|
113
|
-
Record.load_or_create(record_path)
|
|
114
|
-
end
|
|
123
|
+
record = Record.load_or_create(record_path)
|
|
115
124
|
|
|
116
|
-
recorder = Recorder.new(record: record, mode: mode, matcher: matcher, filter: filter)
|
|
125
|
+
recorder = Recorder.new(record: record, mode: mode, matcher: matcher, filter: filter, filter_on: filter_on)
|
|
117
126
|
|
|
118
127
|
result = case mode
|
|
119
128
|
when :record
|
|
@@ -129,16 +138,12 @@ module Backspin
|
|
|
129
138
|
result
|
|
130
139
|
end
|
|
131
140
|
|
|
132
|
-
def perform_command_run(command, name:, env:, mode:, matcher:, filter:)
|
|
141
|
+
def perform_command_run(command, name:, env:, mode:, matcher:, filter:, filter_on:)
|
|
133
142
|
record_path = Record.build_record_path(name)
|
|
134
143
|
mode = determine_mode(mode, record_path)
|
|
135
144
|
validate_mode!(mode)
|
|
136
145
|
|
|
137
|
-
record =
|
|
138
|
-
Record.create(name)
|
|
139
|
-
else
|
|
140
|
-
Record.load_or_create(record_path)
|
|
141
|
-
end
|
|
146
|
+
record = Record.load_or_create(record_path)
|
|
142
147
|
|
|
143
148
|
normalized_env = env.nil? ? nil : normalize_env(env)
|
|
144
149
|
|
|
@@ -180,7 +185,13 @@ module Backspin
|
|
|
180
185
|
stderr: stderr,
|
|
181
186
|
status: status.exitstatus
|
|
182
187
|
)
|
|
183
|
-
command_diff = CommandDiff.new(
|
|
188
|
+
command_diff = CommandDiff.new(
|
|
189
|
+
expected: expected_snapshot,
|
|
190
|
+
actual: actual_snapshot,
|
|
191
|
+
matcher: matcher,
|
|
192
|
+
filter: filter,
|
|
193
|
+
filter_on: filter_on
|
|
194
|
+
)
|
|
184
195
|
BackspinResult.new(
|
|
185
196
|
mode: :verify,
|
|
186
197
|
record_path: record.path,
|
|
@@ -242,5 +253,11 @@ module Backspin
|
|
|
242
253
|
|
|
243
254
|
raise ArgumentError, "Unknown mode: #{mode}"
|
|
244
255
|
end
|
|
256
|
+
|
|
257
|
+
def validate_filter_on!(filter_on)
|
|
258
|
+
return if %i[both record].include?(filter_on)
|
|
259
|
+
|
|
260
|
+
raise ArgumentError, "Unknown filter_on: #{filter_on}. Must be :both or :record"
|
|
261
|
+
end
|
|
245
262
|
end
|
|
246
263
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: backspin
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.11.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Rob Sanheim
|
|
@@ -39,61 +39,7 @@ files:
|
|
|
39
39
|
- bin/setup
|
|
40
40
|
- docs/backspin-result-api-sketch.md
|
|
41
41
|
- examples/match_on_example.rb
|
|
42
|
-
- fixtures/backspin
|
|
43
|
-
- fixtures/backspin/all_bypass_equality.yml
|
|
44
|
-
- fixtures/backspin/all_checks_equality.yml
|
|
45
|
-
- fixtures/backspin/all_for_logging.yml
|
|
46
|
-
- fixtures/backspin/all_matcher_basic.yml
|
|
47
|
-
- fixtures/backspin/all_matcher_custom.yml
|
|
48
|
-
- fixtures/backspin/all_matcher_demo.yml
|
|
49
|
-
- fixtures/backspin/all_matcher_test.yml
|
|
50
|
-
- fixtures/backspin/all_mode_filter.yml
|
|
51
|
-
- fixtures/backspin/all_no_short_circuit.yml
|
|
52
|
-
- fixtures/backspin/all_pass_field_fail.yml
|
|
53
|
-
- fixtures/backspin/all_short_circuit.yml
|
|
54
|
-
- fixtures/backspin/all_skips_equality.yml
|
|
55
|
-
- fixtures/backspin/all_with_equality.yml
|
|
56
|
-
- fixtures/backspin/all_with_fields.yml
|
|
57
|
-
- fixtures/backspin/combined_fail_demo.yml
|
|
58
|
-
- fixtures/backspin/combined_matcher_demo.yml
|
|
59
|
-
- fixtures/backspin/credential_filter.yml
|
|
60
|
-
- fixtures/backspin/echo_hello.yml
|
|
61
|
-
- fixtures/backspin/echo_verify.yml
|
|
62
|
-
- fixtures/backspin/episodes_filter.yml
|
|
63
|
-
- fixtures/backspin/failure_test.yml
|
|
64
|
-
- fixtures/backspin/field_matcher_demo.yml
|
|
65
|
-
- fixtures/backspin/field_matcher_values.yml
|
|
66
|
-
- fixtures/backspin/full_data_filter.yml
|
|
67
|
-
- fixtures/backspin/key_confusion_test.yml
|
|
68
|
-
- fixtures/backspin/match_on_any_fail.yml
|
|
69
|
-
- fixtures/backspin/match_on_bad_format.yml
|
|
70
|
-
- fixtures/backspin/match_on_fail.yml
|
|
71
|
-
- fixtures/backspin/match_on_invalid.yml
|
|
72
|
-
- fixtures/backspin/match_on_multiple.yml
|
|
73
|
-
- fixtures/backspin/match_on_nil.yml
|
|
74
|
-
- fixtures/backspin/match_on_other_fields.yml
|
|
75
|
-
- fixtures/backspin/match_on_run_bang.yml
|
|
76
|
-
- fixtures/backspin/match_on_run_bang_fail.yml
|
|
77
|
-
- fixtures/backspin/match_on_single.yml
|
|
78
|
-
- fixtures/backspin/mixed_calls.yml
|
|
79
|
-
- fixtures/backspin/multi_command.yml
|
|
80
|
-
- fixtures/backspin/multi_command_filter.yml
|
|
81
|
-
- fixtures/backspin/multi_field_filter.yml
|
|
82
|
-
- fixtures/backspin/multi_system.yml
|
|
83
|
-
- fixtures/backspin/nil_filter.yml
|
|
84
|
-
- fixtures/backspin/none_mode_test.yml
|
|
85
|
-
- fixtures/backspin/path_test.yml
|
|
86
|
-
- fixtures/backspin/playback_system.yml
|
|
87
|
-
- fixtures/backspin/playback_test.yml
|
|
88
|
-
- fixtures/backspin/stderr_test.yml
|
|
89
|
-
- fixtures/backspin/strict_test.yml
|
|
90
|
-
- fixtures/backspin/string_symbol_test.yml
|
|
91
|
-
- fixtures/backspin/system_echo.yml
|
|
92
|
-
- fixtures/backspin/system_false.yml
|
|
93
|
-
- fixtures/backspin/timestamp_test.yml
|
|
94
|
-
- fixtures/backspin/verify_system.yml
|
|
95
|
-
- fixtures/backspin/verify_system_diff.yml
|
|
96
|
-
- fixtures/backspin/version_test.yml
|
|
42
|
+
- fixtures/backspin/.gitkeep
|
|
97
43
|
- lib/backspin.rb
|
|
98
44
|
- lib/backspin/backspin_result.rb
|
|
99
45
|
- lib/backspin/command_diff.rb
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
first_recorded_at: '2025-06-10T11:27:40-05:00'
|
|
3
|
-
format_version: '2.0'
|
|
4
|
-
commands:
|
|
5
|
-
- command_type: Open3::Capture3
|
|
6
|
-
args:
|
|
7
|
-
- sh
|
|
8
|
-
- "-c"
|
|
9
|
-
- echo 'valid'; exit 0
|
|
10
|
-
stdout: 'valid
|
|
11
|
-
|
|
12
|
-
'
|
|
13
|
-
stderr: ''
|
|
14
|
-
status: 0
|
|
15
|
-
recorded_at: '2025-06-10T11:27:40-05:00'
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
first_recorded_at: '2025-06-10T11:02:03-05:00'
|
|
3
|
-
format_version: '2.0'
|
|
4
|
-
commands:
|
|
5
|
-
- command_type: Open3::Capture3
|
|
6
|
-
args:
|
|
7
|
-
- echo
|
|
8
|
-
- first output
|
|
9
|
-
stdout: 'first output
|
|
10
|
-
|
|
11
|
-
'
|
|
12
|
-
stderr: ''
|
|
13
|
-
status: 0
|
|
14
|
-
recorded_at: '2025-06-10T11:02:03-05:00'
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
first_recorded_at: '2025-05-01T12:00:00Z'
|
|
3
|
-
format_version: '2.0'
|
|
4
|
-
commands:
|
|
5
|
-
- command_type: Open3::Capture3
|
|
6
|
-
args:
|
|
7
|
-
- sh
|
|
8
|
-
- "-c"
|
|
9
|
-
- echo 'original'; echo 'original error' >&2
|
|
10
|
-
stdout: 'original
|
|
11
|
-
|
|
12
|
-
'
|
|
13
|
-
stderr: 'original error
|
|
14
|
-
|
|
15
|
-
'
|
|
16
|
-
status: 0
|
|
17
|
-
recorded_at: '2025-05-01T12:00:00Z'
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
first_recorded_at: '2025-05-01T12:00:00Z'
|
|
3
|
-
format_version: '2.0'
|
|
4
|
-
commands:
|
|
5
|
-
- command_type: Open3::Capture3
|
|
6
|
-
args:
|
|
7
|
-
- echo
|
|
8
|
-
- 'test output with : colons'
|
|
9
|
-
stdout: 'test output with : colons
|
|
10
|
-
|
|
11
|
-
'
|
|
12
|
-
stderr: ''
|
|
13
|
-
status: 0
|
|
14
|
-
recorded_at: '2025-05-01T12:00:00Z'
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
first_recorded_at: '2025-05-01T12:00:00Z'
|
|
3
|
-
format_version: '2.0'
|
|
4
|
-
commands:
|
|
5
|
-
- command_type: Open3::Capture3
|
|
6
|
-
args:
|
|
7
|
-
- sh
|
|
8
|
-
- "-c"
|
|
9
|
-
- 'echo ''PASS: test 1''; echo ''WARNING: minor issue'' >&2'
|
|
10
|
-
stdout: 'PASS: test 1
|
|
11
|
-
|
|
12
|
-
'
|
|
13
|
-
stderr: 'WARNING: minor issue
|
|
14
|
-
|
|
15
|
-
'
|
|
16
|
-
status: 0
|
|
17
|
-
recorded_at: '2025-05-01T12:00:00Z'
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
first_recorded_at: '2025-05-01T12:00:00Z'
|
|
3
|
-
format_version: '2.0'
|
|
4
|
-
commands:
|
|
5
|
-
- command_type: Open3::Capture3
|
|
6
|
-
args:
|
|
7
|
-
- sh
|
|
8
|
-
- "-c"
|
|
9
|
-
- echo 'original'; echo 'original error' >&2
|
|
10
|
-
stdout: 'original
|
|
11
|
-
|
|
12
|
-
'
|
|
13
|
-
stderr: 'original error
|
|
14
|
-
|
|
15
|
-
'
|
|
16
|
-
status: 0
|
|
17
|
-
recorded_at: '2025-05-01T12:00:00Z'
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
first_recorded_at: '2025-06-10T11:27:40-05:00'
|
|
3
|
-
format_version: '2.0'
|
|
4
|
-
commands:
|
|
5
|
-
- command_type: Open3::Capture3
|
|
6
|
-
args:
|
|
7
|
-
- sh
|
|
8
|
-
- "-c"
|
|
9
|
-
- echo 'output1'; echo 'error1' >&2
|
|
10
|
-
stdout: 'output1
|
|
11
|
-
|
|
12
|
-
'
|
|
13
|
-
stderr: 'error1
|
|
14
|
-
|
|
15
|
-
'
|
|
16
|
-
status: 0
|
|
17
|
-
recorded_at: '2025-06-10T11:27:40-05:00'
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
first_recorded_at: '2025-05-01T12:00:00Z'
|
|
3
|
-
format_version: '2.0'
|
|
4
|
-
commands:
|
|
5
|
-
- command_type: Open3::Capture3
|
|
6
|
-
args:
|
|
7
|
-
- sh
|
|
8
|
-
- "-c"
|
|
9
|
-
- echo 'output'; echo 'error' >&2
|
|
10
|
-
stdout: 'output
|
|
11
|
-
|
|
12
|
-
'
|
|
13
|
-
stderr: 'error
|
|
14
|
-
|
|
15
|
-
'
|
|
16
|
-
status: 0
|
|
17
|
-
recorded_at: '2025-05-01T12:00:00Z'
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
first_recorded_at: '2025-05-01T12:00:00Z'
|
|
3
|
-
format_version: '2.0'
|
|
4
|
-
commands:
|
|
5
|
-
- command_type: Open3::Capture3
|
|
6
|
-
args:
|
|
7
|
-
- echo
|
|
8
|
-
- "'My"
|
|
9
|
-
- API
|
|
10
|
-
- key
|
|
11
|
-
- is
|
|
12
|
-
- "********************'"
|
|
13
|
-
stdout: 'MY API KEY IS ********************
|
|
14
|
-
|
|
15
|
-
'
|
|
16
|
-
stderr: ''
|
|
17
|
-
status: 0
|
|
18
|
-
recorded_at: '2025-05-01T12:00:00Z'
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
first_recorded_at: '2025-05-01T12:00:00Z'
|
|
3
|
-
format_version: '2.0'
|
|
4
|
-
commands:
|
|
5
|
-
- command_type: Open3::Capture3
|
|
6
|
-
args:
|
|
7
|
-
- echo
|
|
8
|
-
- "'episode"
|
|
9
|
-
- 1'
|
|
10
|
-
stdout: 'EPISODE 1
|
|
11
|
-
|
|
12
|
-
'
|
|
13
|
-
stderr: ''
|
|
14
|
-
status: 0
|
|
15
|
-
recorded_at: '2025-05-01T12:00:00Z'
|
|
16
|
-
- command_type: Open3::Capture3
|
|
17
|
-
args:
|
|
18
|
-
- echo
|
|
19
|
-
- "'episode"
|
|
20
|
-
- 2'
|
|
21
|
-
stdout: 'EPISODE 2
|
|
22
|
-
|
|
23
|
-
'
|
|
24
|
-
stderr: ''
|
|
25
|
-
status: 0
|
|
26
|
-
recorded_at: '2025-05-01T12:00:00Z'
|