backspin 0.10.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 +8 -0
- data/Gemfile.lock +1 -1
- data/README.md +22 -0
- data/docs/backspin-result-api-sketch.md +8 -6
- data/fixtures/backspin/.gitkeep +1 -0
- data/lib/backspin/record.rb +42 -5
- data/lib/backspin/version.rb +1 -1
- data/lib/backspin.rb +2 -10
- 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
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a9533baf54aa3ae09b9d483d41149a6ede985f3f974f038e287034928a0ab1e3
|
|
4
|
+
data.tar.gz: 75b9cb2018b1f1ca5878f6ce75af74bc9fc4822319ac2f12e8c654f30624f859
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a8d851c2836d8cd0be15b341a7f2af332c356aaa9688766a5b51f65110539a2d500cac8238abd4bc0a668a689effbef45a8f009829a3cd28ff4acd249bb506b4
|
|
7
|
+
data.tar.gz: 0151e1de9a47285ca75552e97154b57100de50fe691100869144e1ed17e1b7c421a012599c4462a333f6abd0c4779f110a4fbffd2bbe60d14d600469da459bad
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.11.0 - 2026-02-11
|
|
4
|
+
* Added immutable top-level `first_recorded_at` metadata for record files.
|
|
5
|
+
* Added mutable top-level `recorded_at` metadata that updates on each successful re-record.
|
|
6
|
+
* Added top-level `record_count`, incremented on each successful record write.
|
|
7
|
+
* Record format now writes `format_version: 4.1`; loading remains backward-compatible with 4.0 record files.
|
|
8
|
+
* Added acceptance coverage for v4.1 schema and 4.0-to-4.1 upgrade behavior.
|
|
9
|
+
* Removed legacy committed `.yml` record fixtures from old schema versions.
|
|
10
|
+
|
|
3
11
|
## 0.10.0 - 2026-02-11
|
|
4
12
|
* Added `filter_on` to `Backspin.run` and `Backspin.capture` (`:both` default, `:record` opt-out).
|
|
5
13
|
* Changed default filter behavior: `filter` now applies during verify comparisons/diffs when `filter_on: :both`.
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
|
@@ -91,6 +91,28 @@ result = Backspin.run(["echo", "hello"], name: "echo_test", mode: :verify)
|
|
|
91
91
|
expect(result.verified?).to be true
|
|
92
92
|
```
|
|
93
93
|
|
|
94
|
+
### Record Metadata
|
|
95
|
+
|
|
96
|
+
Backspin writes records using `format_version: "4.1"` with top-level metadata:
|
|
97
|
+
|
|
98
|
+
```yaml
|
|
99
|
+
---
|
|
100
|
+
format_version: "4.1"
|
|
101
|
+
first_recorded_at: "2026-01-01T10:00:00Z" # immutable
|
|
102
|
+
recorded_at: "2026-02-01T10:00:00Z" # updates on each write
|
|
103
|
+
record_count: 3 # increments on each write
|
|
104
|
+
snapshot:
|
|
105
|
+
command_type: "Open3::Capture3"
|
|
106
|
+
args: ["echo", "hello"]
|
|
107
|
+
stdout: "hello\n"
|
|
108
|
+
stderr: ""
|
|
109
|
+
status: 0
|
|
110
|
+
recorded_at: "2026-02-01T10:00:00Z"
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
When re-recording with `mode: :record`, Backspin preserves `first_recorded_at`, updates `recorded_at`, and increments `record_count`.
|
|
114
|
+
Existing `4.0` records still load and are upgraded to `4.1` metadata on the next write.
|
|
115
|
+
|
|
94
116
|
### Environment Variables
|
|
95
117
|
|
|
96
118
|
```ruby
|
|
@@ -141,14 +141,16 @@ result.expected.stdout
|
|
|
141
141
|
- Error message is generated from `BackspinResult#error_message`.
|
|
142
142
|
- Do not duplicate `diff` content in exception formatting.
|
|
143
143
|
|
|
144
|
-
## Record Format Sketch (v4)
|
|
144
|
+
## Record Format Sketch (v4.1)
|
|
145
145
|
|
|
146
146
|
Single-snapshot format to match single-snapshot runtime model:
|
|
147
147
|
|
|
148
148
|
```yaml
|
|
149
149
|
---
|
|
150
|
-
format_version: "4.
|
|
150
|
+
format_version: "4.1"
|
|
151
|
+
first_recorded_at: "2026-01-01T00:00:00Z"
|
|
151
152
|
recorded_at: "2026-02-11T00:00:00Z"
|
|
153
|
+
record_count: 3
|
|
152
154
|
snapshot:
|
|
153
155
|
command_type: "Open3::Capture3"
|
|
154
156
|
args: ["echo", "hello"]
|
|
@@ -184,11 +186,11 @@ Status date: 2026-02-11
|
|
|
184
186
|
|
|
185
187
|
1. `Snapshot` and `BackspinResult` classes are implemented and wired into runtime paths.
|
|
186
188
|
2. `Backspin.run` and `Backspin.capture` now return `BackspinResult`.
|
|
187
|
-
3. `Record` persistence moved to v4 single-snapshot format (`snapshot` key, no `commands` array).
|
|
189
|
+
3. `Record` persistence moved to v4 single-snapshot format (`snapshot` key, no `commands` array), with v4.1 top-level metadata.
|
|
188
190
|
4. `Matcher` and `CommandDiff` now operate on expected/actual snapshots.
|
|
189
191
|
5. Legacy result/command layering was removed from `lib/`.
|
|
190
|
-
6. Specs have been migrated to the new result contract and v4 format.
|
|
191
|
-
7. Validation is green: `
|
|
192
|
+
6. Specs have been migrated to the new result contract and v4.1 format.
|
|
193
|
+
7. Validation is green: `89 examples, 0 failures` and Standard lint passes.
|
|
192
194
|
8. Public docs now use `result.actual` / `result.expected` terminology.
|
|
193
195
|
|
|
194
196
|
## Success Criteria
|
|
@@ -198,7 +200,7 @@ Status date: 2026-02-11
|
|
|
198
200
|
3. In `:verify` mode, `result.expected` is present, `result.verified?` is boolean, and mismatch cases populate `result.diff` plus `result.error_message`.
|
|
199
201
|
4. No multi-command result API remains in the public result contract.
|
|
200
202
|
5. Snapshot object exposes a stable single-command shape: `stdout`, `stderr`, `status`, `args`, `env`, `command_type`.
|
|
201
|
-
6. Record format uses one snapshot (v4), not a commands array.
|
|
203
|
+
6. Record format uses one snapshot (v4.x), not a commands array.
|
|
202
204
|
7. Existing strict verification behavior remains: default raises `Backspin::VerificationError`, while `raise_on_verification_failure = false` returns a failed result without raising.
|
|
203
205
|
8. End-to-end Unix command examples are covered in specs: `echo` record/verify, `ls -1` record/verify, `date` mismatch behavior (or matcher override), and captured `grep | wc` pipeline output via `Backspin.capture`.
|
|
204
206
|
9. Matcher behavior is preserved: default matching remains stdout/stderr/status, and custom `matcher:` contract (Proc, hash fields, `:all`) continues to work for both run and capture verification.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
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
|
@@ -120,11 +120,7 @@ module Backspin
|
|
|
120
120
|
mode = determine_mode(mode, record_path)
|
|
121
121
|
validate_mode!(mode)
|
|
122
122
|
|
|
123
|
-
record =
|
|
124
|
-
Record.create(record_name)
|
|
125
|
-
else
|
|
126
|
-
Record.load_or_create(record_path)
|
|
127
|
-
end
|
|
123
|
+
record = Record.load_or_create(record_path)
|
|
128
124
|
|
|
129
125
|
recorder = Recorder.new(record: record, mode: mode, matcher: matcher, filter: filter, filter_on: filter_on)
|
|
130
126
|
|
|
@@ -147,11 +143,7 @@ module Backspin
|
|
|
147
143
|
mode = determine_mode(mode, record_path)
|
|
148
144
|
validate_mode!(mode)
|
|
149
145
|
|
|
150
|
-
record =
|
|
151
|
-
Record.create(name)
|
|
152
|
-
else
|
|
153
|
-
Record.load_or_create(record_path)
|
|
154
|
-
end
|
|
146
|
+
record = Record.load_or_create(record_path)
|
|
155
147
|
|
|
156
148
|
normalized_env = env.nil? ? nil : normalize_env(env)
|
|
157
149
|
|
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'
|