backspin 0.10.0 → 0.12.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/.circleci/config.yml +3 -0
- data/CHANGELOG.md +11 -1
- data/Gemfile.lock +3 -1
- data/README.md +82 -0
- data/Rakefile +27 -0
- data/backspin.gemspec +2 -0
- data/docs/backspin-result-api-sketch.md +8 -6
- data/fixtures/backspin/.gitkeep +1 -0
- data/fixtures/projects/dummy_cli_gem/.rspec +3 -0
- data/fixtures/projects/dummy_cli_gem/Gemfile +12 -0
- data/fixtures/projects/dummy_cli_gem/Gemfile.lock +55 -0
- data/fixtures/projects/dummy_cli_gem/LICENSE.txt +1 -0
- data/fixtures/projects/dummy_cli_gem/README.md +7 -0
- data/fixtures/projects/dummy_cli_gem/Rakefile +8 -0
- data/fixtures/projects/dummy_cli_gem/dummy_cli_gem.gemspec +22 -0
- data/fixtures/projects/dummy_cli_gem/exe/dummy_cli_gem +8 -0
- data/fixtures/projects/dummy_cli_gem/fixtures/backspin/dummy_echo.yml +18 -0
- data/fixtures/projects/dummy_cli_gem/fixtures/backspin/dummy_ls.yml +18 -0
- data/fixtures/projects/dummy_cli_gem/lib/dummy_cli_gem/cli.rb +35 -0
- data/fixtures/projects/dummy_cli_gem/lib/dummy_cli_gem/version.rb +5 -0
- data/fixtures/projects/dummy_cli_gem/lib/dummy_cli_gem.rb +7 -0
- data/fixtures/projects/dummy_cli_gem/mise.toml +2 -0
- data/fixtures/projects/dummy_cli_gem/spec/dummy_cli_gem_backspin_spec.rb +46 -0
- data/fixtures/projects/dummy_cli_gem/spec/fixtures/backspin/dummy_echo.yml +18 -0
- data/fixtures/projects/dummy_cli_gem/spec/fixtures/backspin/dummy_ls.yml +18 -0
- data/fixtures/projects/dummy_cli_gem/spec/fixtures/listing_target/alpha.txt +1 -0
- data/fixtures/projects/dummy_cli_gem/spec/spec_helper.rb +22 -0
- data/lib/backspin/configuration.rb +13 -0
- data/lib/backspin/record.rb +42 -5
- data/lib/backspin/version.rb +1 -1
- data/lib/backspin.rb +24 -12
- data/mise.toml +2 -0
- metadata +37 -57
- 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/record.rb
CHANGED
|
@@ -4,8 +4,9 @@ module Backspin
|
|
|
4
4
|
class RecordFormatError < StandardError; end
|
|
5
5
|
|
|
6
6
|
class Record
|
|
7
|
-
FORMAT_VERSION = "4.
|
|
8
|
-
|
|
7
|
+
FORMAT_VERSION = "4.1"
|
|
8
|
+
SUPPORTED_FORMAT_VERSIONS = ["4.0", FORMAT_VERSION].freeze
|
|
9
|
+
attr_reader :path, :snapshot, :first_recorded_at, :recorded_at, :record_count
|
|
9
10
|
|
|
10
11
|
def self.load_or_create(path)
|
|
11
12
|
record = new(path)
|
|
@@ -36,12 +37,16 @@ module Backspin
|
|
|
36
37
|
def initialize(path)
|
|
37
38
|
@path = path
|
|
38
39
|
@snapshot = nil
|
|
40
|
+
@first_recorded_at = nil
|
|
39
41
|
@recorded_at = nil
|
|
42
|
+
@record_count = nil
|
|
40
43
|
end
|
|
41
44
|
|
|
42
45
|
def set_snapshot(snapshot)
|
|
43
46
|
@snapshot = snapshot
|
|
44
|
-
|
|
47
|
+
snapshot_recorded_at = snapshot.recorded_at || Time.now.iso8601
|
|
48
|
+
@first_recorded_at ||= snapshot_recorded_at
|
|
49
|
+
@recorded_at = snapshot_recorded_at
|
|
45
50
|
self
|
|
46
51
|
end
|
|
47
52
|
|
|
@@ -49,17 +54,23 @@ module Backspin
|
|
|
49
54
|
FileUtils.mkdir_p(File.dirname(@path))
|
|
50
55
|
snapshot_data = @snapshot&.to_h
|
|
51
56
|
snapshot_data = filter.call(deep_dup(snapshot_data)) if snapshot_data && filter
|
|
57
|
+
next_record_count = (@record_count || 0) + 1
|
|
52
58
|
record_data = {
|
|
53
59
|
"format_version" => FORMAT_VERSION,
|
|
60
|
+
"first_recorded_at" => @first_recorded_at,
|
|
54
61
|
"recorded_at" => @recorded_at,
|
|
62
|
+
"record_count" => next_record_count,
|
|
55
63
|
"snapshot" => snapshot_data
|
|
56
64
|
}
|
|
57
65
|
File.write(@path, record_data.to_yaml)
|
|
66
|
+
@record_count = next_record_count
|
|
58
67
|
end
|
|
59
68
|
|
|
60
69
|
def reload
|
|
61
70
|
@snapshot = nil
|
|
71
|
+
@first_recorded_at = nil
|
|
62
72
|
@recorded_at = nil
|
|
73
|
+
@record_count = nil
|
|
63
74
|
load_from_file if File.exist?(@path)
|
|
64
75
|
end
|
|
65
76
|
|
|
@@ -73,13 +84,15 @@ module Backspin
|
|
|
73
84
|
|
|
74
85
|
def clear
|
|
75
86
|
@snapshot = nil
|
|
87
|
+
@first_recorded_at = nil
|
|
76
88
|
@recorded_at = nil
|
|
89
|
+
@record_count = nil
|
|
77
90
|
end
|
|
78
91
|
|
|
79
92
|
def load_from_file
|
|
80
93
|
data = YAML.load_file(@path.to_s)
|
|
81
94
|
|
|
82
|
-
unless data.is_a?(Hash) && data["format_version"]
|
|
95
|
+
unless data.is_a?(Hash) && SUPPORTED_FORMAT_VERSIONS.include?(data["format_version"])
|
|
83
96
|
raise RecordFormatError, "Invalid record format: expected format version #{FORMAT_VERSION}"
|
|
84
97
|
end
|
|
85
98
|
|
|
@@ -88,7 +101,17 @@ module Backspin
|
|
|
88
101
|
raise RecordFormatError, "Invalid record format: missing snapshot"
|
|
89
102
|
end
|
|
90
103
|
|
|
91
|
-
|
|
104
|
+
format_version = data["format_version"]
|
|
105
|
+
@recorded_at = data["recorded_at"] || snapshot_data["recorded_at"]
|
|
106
|
+
if format_version == FORMAT_VERSION
|
|
107
|
+
@first_recorded_at = data["first_recorded_at"]
|
|
108
|
+
@record_count = data["record_count"]
|
|
109
|
+
else
|
|
110
|
+
# Backfill metadata for v4.0 records.
|
|
111
|
+
@first_recorded_at = data["first_recorded_at"] || @recorded_at
|
|
112
|
+
@record_count = data.fetch("record_count", 1)
|
|
113
|
+
end
|
|
114
|
+
validate_metadata!
|
|
92
115
|
@snapshot = Snapshot.from_h(snapshot_data)
|
|
93
116
|
rescue Psych::SyntaxError => e
|
|
94
117
|
raise RecordFormatError, "Invalid record format: #{e.message}"
|
|
@@ -96,6 +119,20 @@ module Backspin
|
|
|
96
119
|
|
|
97
120
|
private
|
|
98
121
|
|
|
122
|
+
def validate_metadata!
|
|
123
|
+
unless @first_recorded_at.is_a?(String) && !@first_recorded_at.empty?
|
|
124
|
+
raise RecordFormatError, "Invalid record format: missing first_recorded_at"
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
unless @recorded_at.is_a?(String) && !@recorded_at.empty?
|
|
128
|
+
raise RecordFormatError, "Invalid record format: missing recorded_at"
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
unless @record_count.is_a?(Integer) && @record_count.positive?
|
|
132
|
+
raise RecordFormatError, "Invalid record format: record_count must be a positive integer"
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
99
136
|
def deep_dup(value)
|
|
100
137
|
case value
|
|
101
138
|
when Hash
|
data/lib/backspin/version.rb
CHANGED
data/lib/backspin.rb
CHANGED
|
@@ -14,6 +14,8 @@ require "backspin/backspin_result"
|
|
|
14
14
|
require "backspin/recorder"
|
|
15
15
|
|
|
16
16
|
module Backspin
|
|
17
|
+
VALID_MODES = %i[auto record verify].freeze
|
|
18
|
+
|
|
17
19
|
class RecordNotFoundError < StandardError; end
|
|
18
20
|
|
|
19
21
|
class VerificationError < StandardError
|
|
@@ -120,11 +122,7 @@ module Backspin
|
|
|
120
122
|
mode = determine_mode(mode, record_path)
|
|
121
123
|
validate_mode!(mode)
|
|
122
124
|
|
|
123
|
-
record =
|
|
124
|
-
Record.create(record_name)
|
|
125
|
-
else
|
|
126
|
-
Record.load_or_create(record_path)
|
|
127
|
-
end
|
|
125
|
+
record = Record.load_or_create(record_path)
|
|
128
126
|
|
|
129
127
|
recorder = Recorder.new(record: record, mode: mode, matcher: matcher, filter: filter, filter_on: filter_on)
|
|
130
128
|
|
|
@@ -147,11 +145,7 @@ module Backspin
|
|
|
147
145
|
mode = determine_mode(mode, record_path)
|
|
148
146
|
validate_mode!(mode)
|
|
149
147
|
|
|
150
|
-
record =
|
|
151
|
-
Record.create(name)
|
|
152
|
-
else
|
|
153
|
-
Record.load_or_create(record_path)
|
|
154
|
-
end
|
|
148
|
+
record = Record.load_or_create(record_path)
|
|
155
149
|
|
|
156
150
|
normalized_env = env.nil? ? nil : normalize_env(env)
|
|
157
151
|
|
|
@@ -250,8 +244,26 @@ module Backspin
|
|
|
250
244
|
def determine_mode(mode_option, record_path)
|
|
251
245
|
return mode_option if mode_option && mode_option != :auto
|
|
252
246
|
|
|
253
|
-
|
|
254
|
-
|
|
247
|
+
env_mode = mode_from_env
|
|
248
|
+
if env_mode && env_mode != :auto
|
|
249
|
+
configuration.logger&.debug { "event=mode_resolved mode=#{env_mode} source=env record=#{record_path}" }
|
|
250
|
+
return env_mode
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
resolved = File.exist?(record_path) ? :verify : :record
|
|
254
|
+
configuration.logger&.debug { "event=mode_resolved mode=#{resolved} source=auto record=#{record_path}" }
|
|
255
|
+
resolved
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
def mode_from_env
|
|
259
|
+
raw = ENV["BACKSPIN_MODE"]
|
|
260
|
+
return if raw.nil? || raw.strip.empty?
|
|
261
|
+
|
|
262
|
+
mode = raw.strip.downcase.to_sym
|
|
263
|
+
return mode if VALID_MODES.include?(mode)
|
|
264
|
+
|
|
265
|
+
raise ArgumentError,
|
|
266
|
+
"Invalid BACKSPIN_MODE value: #{raw.inspect}. Allowed values: auto, record, verify"
|
|
255
267
|
end
|
|
256
268
|
|
|
257
269
|
def validate_mode!(mode)
|
data/mise.toml
ADDED
metadata
CHANGED
|
@@ -1,14 +1,28 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: backspin
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.12.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Rob Sanheim
|
|
8
8
|
bindir: exe
|
|
9
9
|
cert_chain: []
|
|
10
10
|
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
-
dependencies:
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: logger
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '0'
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - ">="
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '0'
|
|
12
26
|
description: Backspin is a Ruby library for characterization testing of command-line
|
|
13
27
|
interfaces. Inspired by VCR's cassette-based approach, it records and replays CLI
|
|
14
28
|
interactions to make testing faster and more deterministic.
|
|
@@ -39,61 +53,26 @@ files:
|
|
|
39
53
|
- bin/setup
|
|
40
54
|
- docs/backspin-result-api-sketch.md
|
|
41
55
|
- examples/match_on_example.rb
|
|
42
|
-
- fixtures/backspin
|
|
43
|
-
- fixtures/
|
|
44
|
-
- fixtures/
|
|
45
|
-
- fixtures/
|
|
46
|
-
- fixtures/
|
|
47
|
-
- fixtures/
|
|
48
|
-
- fixtures/
|
|
49
|
-
- fixtures/
|
|
50
|
-
- fixtures/
|
|
51
|
-
- fixtures/backspin/
|
|
52
|
-
- fixtures/backspin/
|
|
53
|
-
- fixtures/
|
|
54
|
-
- fixtures/
|
|
55
|
-
- fixtures/
|
|
56
|
-
- fixtures/
|
|
57
|
-
- fixtures/
|
|
58
|
-
- fixtures/backspin/
|
|
59
|
-
- fixtures/backspin/
|
|
60
|
-
- fixtures/
|
|
61
|
-
- fixtures/
|
|
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
|
|
56
|
+
- fixtures/backspin/.gitkeep
|
|
57
|
+
- fixtures/projects/dummy_cli_gem/.rspec
|
|
58
|
+
- fixtures/projects/dummy_cli_gem/Gemfile
|
|
59
|
+
- fixtures/projects/dummy_cli_gem/Gemfile.lock
|
|
60
|
+
- fixtures/projects/dummy_cli_gem/LICENSE.txt
|
|
61
|
+
- fixtures/projects/dummy_cli_gem/README.md
|
|
62
|
+
- fixtures/projects/dummy_cli_gem/Rakefile
|
|
63
|
+
- fixtures/projects/dummy_cli_gem/dummy_cli_gem.gemspec
|
|
64
|
+
- fixtures/projects/dummy_cli_gem/exe/dummy_cli_gem
|
|
65
|
+
- fixtures/projects/dummy_cli_gem/fixtures/backspin/dummy_echo.yml
|
|
66
|
+
- fixtures/projects/dummy_cli_gem/fixtures/backspin/dummy_ls.yml
|
|
67
|
+
- fixtures/projects/dummy_cli_gem/lib/dummy_cli_gem.rb
|
|
68
|
+
- fixtures/projects/dummy_cli_gem/lib/dummy_cli_gem/cli.rb
|
|
69
|
+
- fixtures/projects/dummy_cli_gem/lib/dummy_cli_gem/version.rb
|
|
70
|
+
- fixtures/projects/dummy_cli_gem/mise.toml
|
|
71
|
+
- fixtures/projects/dummy_cli_gem/spec/dummy_cli_gem_backspin_spec.rb
|
|
72
|
+
- fixtures/projects/dummy_cli_gem/spec/fixtures/backspin/dummy_echo.yml
|
|
73
|
+
- fixtures/projects/dummy_cli_gem/spec/fixtures/backspin/dummy_ls.yml
|
|
74
|
+
- fixtures/projects/dummy_cli_gem/spec/fixtures/listing_target/alpha.txt
|
|
75
|
+
- fixtures/projects/dummy_cli_gem/spec/spec_helper.rb
|
|
97
76
|
- lib/backspin.rb
|
|
98
77
|
- lib/backspin/backspin_result.rb
|
|
99
78
|
- lib/backspin/command_diff.rb
|
|
@@ -103,6 +82,7 @@ files:
|
|
|
103
82
|
- lib/backspin/recorder.rb
|
|
104
83
|
- lib/backspin/snapshot.rb
|
|
105
84
|
- lib/backspin/version.rb
|
|
85
|
+
- mise.toml
|
|
106
86
|
- release.rake
|
|
107
87
|
- script/lint
|
|
108
88
|
- script/run_affected_tests
|
|
@@ -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'
|