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.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +3 -0
  3. data/CHANGELOG.md +11 -1
  4. data/Gemfile.lock +3 -1
  5. data/README.md +82 -0
  6. data/Rakefile +27 -0
  7. data/backspin.gemspec +2 -0
  8. data/docs/backspin-result-api-sketch.md +8 -6
  9. data/fixtures/backspin/.gitkeep +1 -0
  10. data/fixtures/projects/dummy_cli_gem/.rspec +3 -0
  11. data/fixtures/projects/dummy_cli_gem/Gemfile +12 -0
  12. data/fixtures/projects/dummy_cli_gem/Gemfile.lock +55 -0
  13. data/fixtures/projects/dummy_cli_gem/LICENSE.txt +1 -0
  14. data/fixtures/projects/dummy_cli_gem/README.md +7 -0
  15. data/fixtures/projects/dummy_cli_gem/Rakefile +8 -0
  16. data/fixtures/projects/dummy_cli_gem/dummy_cli_gem.gemspec +22 -0
  17. data/fixtures/projects/dummy_cli_gem/exe/dummy_cli_gem +8 -0
  18. data/fixtures/projects/dummy_cli_gem/fixtures/backspin/dummy_echo.yml +18 -0
  19. data/fixtures/projects/dummy_cli_gem/fixtures/backspin/dummy_ls.yml +18 -0
  20. data/fixtures/projects/dummy_cli_gem/lib/dummy_cli_gem/cli.rb +35 -0
  21. data/fixtures/projects/dummy_cli_gem/lib/dummy_cli_gem/version.rb +5 -0
  22. data/fixtures/projects/dummy_cli_gem/lib/dummy_cli_gem.rb +7 -0
  23. data/fixtures/projects/dummy_cli_gem/mise.toml +2 -0
  24. data/fixtures/projects/dummy_cli_gem/spec/dummy_cli_gem_backspin_spec.rb +46 -0
  25. data/fixtures/projects/dummy_cli_gem/spec/fixtures/backspin/dummy_echo.yml +18 -0
  26. data/fixtures/projects/dummy_cli_gem/spec/fixtures/backspin/dummy_ls.yml +18 -0
  27. data/fixtures/projects/dummy_cli_gem/spec/fixtures/listing_target/alpha.txt +1 -0
  28. data/fixtures/projects/dummy_cli_gem/spec/spec_helper.rb +22 -0
  29. data/lib/backspin/configuration.rb +13 -0
  30. data/lib/backspin/record.rb +42 -5
  31. data/lib/backspin/version.rb +1 -1
  32. data/lib/backspin.rb +24 -12
  33. data/mise.toml +2 -0
  34. metadata +37 -57
  35. data/fixtures/backspin/all_and_fields.yml +0 -15
  36. data/fixtures/backspin/all_bypass_equality.yml +0 -14
  37. data/fixtures/backspin/all_checks_equality.yml +0 -17
  38. data/fixtures/backspin/all_for_logging.yml +0 -14
  39. data/fixtures/backspin/all_matcher_basic.yml +0 -14
  40. data/fixtures/backspin/all_matcher_custom.yml +0 -17
  41. data/fixtures/backspin/all_matcher_demo.yml +0 -14
  42. data/fixtures/backspin/all_matcher_test.yml +0 -14
  43. data/fixtures/backspin/all_mode_filter.yml +0 -14
  44. data/fixtures/backspin/all_no_short_circuit.yml +0 -14
  45. data/fixtures/backspin/all_pass_field_fail.yml +0 -14
  46. data/fixtures/backspin/all_short_circuit.yml +0 -14
  47. data/fixtures/backspin/all_skips_equality.yml +0 -17
  48. data/fixtures/backspin/all_with_equality.yml +0 -17
  49. data/fixtures/backspin/all_with_fields.yml +0 -17
  50. data/fixtures/backspin/combined_fail_demo.yml +0 -14
  51. data/fixtures/backspin/combined_matcher_demo.yml +0 -14
  52. data/fixtures/backspin/credential_filter.yml +0 -18
  53. data/fixtures/backspin/echo_hello.yml +0 -14
  54. data/fixtures/backspin/echo_verify.yml +0 -14
  55. data/fixtures/backspin/episodes_filter.yml +0 -26
  56. data/fixtures/backspin/failure_test.yml +0 -14
  57. data/fixtures/backspin/field_matcher_demo.yml +0 -17
  58. data/fixtures/backspin/field_matcher_values.yml +0 -14
  59. data/fixtures/backspin/full_data_filter.yml +0 -17
  60. data/fixtures/backspin/key_confusion_test.yml +0 -14
  61. data/fixtures/backspin/match_on_any_fail.yml +0 -21
  62. data/fixtures/backspin/match_on_bad_format.yml +0 -14
  63. data/fixtures/backspin/match_on_fail.yml +0 -15
  64. data/fixtures/backspin/match_on_invalid.yml +0 -14
  65. data/fixtures/backspin/match_on_multiple.yml +0 -28
  66. data/fixtures/backspin/match_on_nil.yml +0 -14
  67. data/fixtures/backspin/match_on_other_fields.yml +0 -23
  68. data/fixtures/backspin/match_on_run_bang.yml +0 -16
  69. data/fixtures/backspin/match_on_run_bang_fail.yml +0 -15
  70. data/fixtures/backspin/match_on_single.yml +0 -17
  71. data/fixtures/backspin/mixed_calls.yml +0 -24
  72. data/fixtures/backspin/multi_command.yml +0 -34
  73. data/fixtures/backspin/multi_command_filter.yml +0 -26
  74. data/fixtures/backspin/multi_field_filter.yml +0 -13
  75. data/fixtures/backspin/multi_system.yml +0 -20
  76. data/fixtures/backspin/nil_filter.yml +0 -14
  77. data/fixtures/backspin/none_mode_test.yml +0 -14
  78. data/fixtures/backspin/path_test.yml +0 -17
  79. data/fixtures/backspin/playback_system.yml +0 -12
  80. data/fixtures/backspin/playback_test.yml +0 -14
  81. data/fixtures/backspin/stderr_test.yml +0 -19
  82. data/fixtures/backspin/strict_test.yml +0 -14
  83. data/fixtures/backspin/string_symbol_test.yml +0 -14
  84. data/fixtures/backspin/system_echo.yml +0 -12
  85. data/fixtures/backspin/system_false.yml +0 -18
  86. data/fixtures/backspin/timestamp_test.yml +0 -18
  87. data/fixtures/backspin/verify_system.yml +0 -12
  88. data/fixtures/backspin/verify_system_diff.yml +0 -11
  89. data/fixtures/backspin/version_test.yml +0 -14
@@ -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.12.0"
5
5
  end
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 = if mode == :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 = if mode == :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
- # Auto mode: record if file doesn't exist, verify if it does
254
- File.exist?(record_path) ? :verify : :record
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
@@ -0,0 +1,2 @@
1
+ [tools]
2
+ ruby = "4.0.0"
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.10.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/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
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,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'
@@ -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'
@@ -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
- - expected
9
- stdout: 'expected
10
-
11
- '
12
- stderr: ''
13
- status: 0
14
- recorded_at: '2025-05-01T12:00:00Z'