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.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/Gemfile.lock +1 -1
  4. data/README.md +22 -0
  5. data/docs/backspin-result-api-sketch.md +8 -6
  6. data/fixtures/backspin/.gitkeep +1 -0
  7. data/lib/backspin/record.rb +42 -5
  8. data/lib/backspin/version.rb +1 -1
  9. data/lib/backspin.rb +2 -10
  10. metadata +2 -56
  11. data/fixtures/backspin/all_and_fields.yml +0 -15
  12. data/fixtures/backspin/all_bypass_equality.yml +0 -14
  13. data/fixtures/backspin/all_checks_equality.yml +0 -17
  14. data/fixtures/backspin/all_for_logging.yml +0 -14
  15. data/fixtures/backspin/all_matcher_basic.yml +0 -14
  16. data/fixtures/backspin/all_matcher_custom.yml +0 -17
  17. data/fixtures/backspin/all_matcher_demo.yml +0 -14
  18. data/fixtures/backspin/all_matcher_test.yml +0 -14
  19. data/fixtures/backspin/all_mode_filter.yml +0 -14
  20. data/fixtures/backspin/all_no_short_circuit.yml +0 -14
  21. data/fixtures/backspin/all_pass_field_fail.yml +0 -14
  22. data/fixtures/backspin/all_short_circuit.yml +0 -14
  23. data/fixtures/backspin/all_skips_equality.yml +0 -17
  24. data/fixtures/backspin/all_with_equality.yml +0 -17
  25. data/fixtures/backspin/all_with_fields.yml +0 -17
  26. data/fixtures/backspin/combined_fail_demo.yml +0 -14
  27. data/fixtures/backspin/combined_matcher_demo.yml +0 -14
  28. data/fixtures/backspin/credential_filter.yml +0 -18
  29. data/fixtures/backspin/echo_hello.yml +0 -14
  30. data/fixtures/backspin/echo_verify.yml +0 -14
  31. data/fixtures/backspin/episodes_filter.yml +0 -26
  32. data/fixtures/backspin/failure_test.yml +0 -14
  33. data/fixtures/backspin/field_matcher_demo.yml +0 -17
  34. data/fixtures/backspin/field_matcher_values.yml +0 -14
  35. data/fixtures/backspin/full_data_filter.yml +0 -17
  36. data/fixtures/backspin/key_confusion_test.yml +0 -14
  37. data/fixtures/backspin/match_on_any_fail.yml +0 -21
  38. data/fixtures/backspin/match_on_bad_format.yml +0 -14
  39. data/fixtures/backspin/match_on_fail.yml +0 -15
  40. data/fixtures/backspin/match_on_invalid.yml +0 -14
  41. data/fixtures/backspin/match_on_multiple.yml +0 -28
  42. data/fixtures/backspin/match_on_nil.yml +0 -14
  43. data/fixtures/backspin/match_on_other_fields.yml +0 -23
  44. data/fixtures/backspin/match_on_run_bang.yml +0 -16
  45. data/fixtures/backspin/match_on_run_bang_fail.yml +0 -15
  46. data/fixtures/backspin/match_on_single.yml +0 -17
  47. data/fixtures/backspin/mixed_calls.yml +0 -24
  48. data/fixtures/backspin/multi_command.yml +0 -34
  49. data/fixtures/backspin/multi_command_filter.yml +0 -26
  50. data/fixtures/backspin/multi_field_filter.yml +0 -13
  51. data/fixtures/backspin/multi_system.yml +0 -20
  52. data/fixtures/backspin/nil_filter.yml +0 -14
  53. data/fixtures/backspin/none_mode_test.yml +0 -14
  54. data/fixtures/backspin/path_test.yml +0 -17
  55. data/fixtures/backspin/playback_system.yml +0 -12
  56. data/fixtures/backspin/playback_test.yml +0 -14
  57. data/fixtures/backspin/stderr_test.yml +0 -19
  58. data/fixtures/backspin/strict_test.yml +0 -14
  59. data/fixtures/backspin/string_symbol_test.yml +0 -14
  60. data/fixtures/backspin/system_echo.yml +0 -12
  61. data/fixtures/backspin/system_false.yml +0 -18
  62. data/fixtures/backspin/timestamp_test.yml +0 -18
  63. data/fixtures/backspin/verify_system.yml +0 -12
  64. data/fixtures/backspin/verify_system_diff.yml +0 -11
  65. data/fixtures/backspin/version_test.yml +0 -14
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: edf2daa2123a270ca28d593b594188db57913b2ca5905a45b6a9e0d1221c0da4
4
- data.tar.gz: 3ec4407d3396e3e8390f62b3c0e7d2124bdf026e4b02e74c036ee37fab8430a4
3
+ metadata.gz: a9533baf54aa3ae09b9d483d41149a6ede985f3f974f038e287034928a0ab1e3
4
+ data.tar.gz: 75b9cb2018b1f1ca5878f6ce75af74bc9fc4822319ac2f12e8c654f30624f859
5
5
  SHA512:
6
- metadata.gz: a851d194aa4f400c9104643b5521e7b5bd5e159708a0d6114c70cfd39907fb6174041a3bccffdc824edb3e224bab7db453b906c35adc7f0a2908d2b034a9b11a
7
- data.tar.gz: 01b1c9b4288f978d9946090afda49e17001732ec0b4f5e47d3831767975d731e5c940cc0fbdd7ccfca4a2bdf54bc8d281eba7d3dc4cbbd137e3f4edb576d9378
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
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- backspin (0.10.0)
4
+ backspin (0.11.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
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.0"
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: `66 examples, 0 failures` and Standard lint passes.
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
+
@@ -4,8 +4,9 @@ module Backspin
4
4
  class RecordFormatError < StandardError; end
5
5
 
6
6
  class Record
7
- FORMAT_VERSION = "4.0"
8
- attr_reader :path, :snapshot, :recorded_at
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
- @recorded_at ||= snapshot.recorded_at
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"] == 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
- @recorded_at = data["recorded_at"]
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Backspin
4
- VERSION = "0.10.0"
4
+ VERSION = "0.11.0"
5
5
  end
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 = if mode == :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 = if mode == :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.10.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/all_and_fields.yml
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,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
- - hello world
9
- stdout: 'hello world
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,14 +0,0 @@
1
- ---
2
- first_recorded_at: '2025-06-10T11:02:02-05:00'
3
- format_version: '2.0'
4
- commands:
5
- - command_type: Open3::Capture3
6
- args:
7
- - echo
8
- - test
9
- stdout: 'test
10
-
11
- '
12
- stderr: ''
13
- status: 0
14
- recorded_at: '2025-06-10T11:02:02-05:00'
@@ -1,14 +0,0 @@
1
- ---
2
- first_recorded_at: '2025-06-10T11:00:57-05:00'
3
- format_version: '2.0'
4
- commands:
5
- - command_type: Open3::Capture3
6
- args:
7
- - echo
8
- - test
9
- stdout: 'test
10
-
11
- '
12
- stderr: ''
13
- status: 0
14
- recorded_at: '2025-06-10T11:00:57-05:00'
@@ -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
- - "'second'"
9
- stdout: 'filtered output 2
10
-
11
- '
12
- stderr: ''
13
- status: 0
14
- recorded_at: '2025-05-01T12:00:00Z'
@@ -1,14 +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
- - echo
8
- - test
9
- stdout: 'test
10
-
11
- '
12
- stderr: ''
13
- status: 0
14
- recorded_at: '2025-06-10T11:27:40-05:00'
@@ -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
- - hello
9
- stdout: 'hello
10
-
11
- '
12
- stderr: ''
13
- status: 0
14
- 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
9
- stdout: 'test
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 '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,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
- - test
9
- stdout: 'test
10
-
11
- '
12
- stderr: ''
13
- status: 0
14
- recorded_at: '2025-06-10T11:02:03-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
- - test
9
- stdout: 'test
10
-
11
- '
12
- stderr: ''
13
- status: 0
14
- recorded_at: '2025-06-10T11:02:03-05:00'
@@ -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,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
- - hello
9
- stdout: 'hello
10
-
11
- '
12
- stderr: ''
13
- status: 0
14
- 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
- - hello
9
- stdout: 'hello
10
-
11
- '
12
- stderr: ''
13
- status: 0
14
- recorded_at: '2025-05-01T12:00:00Z'