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.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +14 -0
  3. data/Gemfile.lock +1 -1
  4. data/MATCHERS.md +18 -0
  5. data/README.md +57 -0
  6. data/docs/backspin-result-api-sketch.md +13 -9
  7. data/fixtures/backspin/.gitkeep +1 -0
  8. data/lib/backspin/command_diff.rb +70 -13
  9. data/lib/backspin/matcher.rb +59 -51
  10. data/lib/backspin/record.rb +60 -6
  11. data/lib/backspin/recorder.rb +6 -3
  12. data/lib/backspin/snapshot.rb +52 -19
  13. data/lib/backspin/version.rb +1 -1
  14. data/lib/backspin.rb +38 -21
  15. metadata +2 -56
  16. data/fixtures/backspin/all_and_fields.yml +0 -15
  17. data/fixtures/backspin/all_bypass_equality.yml +0 -14
  18. data/fixtures/backspin/all_checks_equality.yml +0 -17
  19. data/fixtures/backspin/all_for_logging.yml +0 -14
  20. data/fixtures/backspin/all_matcher_basic.yml +0 -14
  21. data/fixtures/backspin/all_matcher_custom.yml +0 -17
  22. data/fixtures/backspin/all_matcher_demo.yml +0 -14
  23. data/fixtures/backspin/all_matcher_test.yml +0 -14
  24. data/fixtures/backspin/all_mode_filter.yml +0 -14
  25. data/fixtures/backspin/all_no_short_circuit.yml +0 -14
  26. data/fixtures/backspin/all_pass_field_fail.yml +0 -14
  27. data/fixtures/backspin/all_short_circuit.yml +0 -14
  28. data/fixtures/backspin/all_skips_equality.yml +0 -17
  29. data/fixtures/backspin/all_with_equality.yml +0 -17
  30. data/fixtures/backspin/all_with_fields.yml +0 -17
  31. data/fixtures/backspin/combined_fail_demo.yml +0 -14
  32. data/fixtures/backspin/combined_matcher_demo.yml +0 -14
  33. data/fixtures/backspin/credential_filter.yml +0 -18
  34. data/fixtures/backspin/echo_hello.yml +0 -14
  35. data/fixtures/backspin/echo_verify.yml +0 -14
  36. data/fixtures/backspin/episodes_filter.yml +0 -26
  37. data/fixtures/backspin/failure_test.yml +0 -14
  38. data/fixtures/backspin/field_matcher_demo.yml +0 -17
  39. data/fixtures/backspin/field_matcher_values.yml +0 -14
  40. data/fixtures/backspin/full_data_filter.yml +0 -17
  41. data/fixtures/backspin/key_confusion_test.yml +0 -14
  42. data/fixtures/backspin/match_on_any_fail.yml +0 -21
  43. data/fixtures/backspin/match_on_bad_format.yml +0 -14
  44. data/fixtures/backspin/match_on_fail.yml +0 -15
  45. data/fixtures/backspin/match_on_invalid.yml +0 -14
  46. data/fixtures/backspin/match_on_multiple.yml +0 -28
  47. data/fixtures/backspin/match_on_nil.yml +0 -14
  48. data/fixtures/backspin/match_on_other_fields.yml +0 -23
  49. data/fixtures/backspin/match_on_run_bang.yml +0 -16
  50. data/fixtures/backspin/match_on_run_bang_fail.yml +0 -15
  51. data/fixtures/backspin/match_on_single.yml +0 -17
  52. data/fixtures/backspin/mixed_calls.yml +0 -24
  53. data/fixtures/backspin/multi_command.yml +0 -34
  54. data/fixtures/backspin/multi_command_filter.yml +0 -26
  55. data/fixtures/backspin/multi_field_filter.yml +0 -13
  56. data/fixtures/backspin/multi_system.yml +0 -20
  57. data/fixtures/backspin/nil_filter.yml +0 -14
  58. data/fixtures/backspin/none_mode_test.yml +0 -14
  59. data/fixtures/backspin/path_test.yml +0 -17
  60. data/fixtures/backspin/playback_system.yml +0 -12
  61. data/fixtures/backspin/playback_test.yml +0 -14
  62. data/fixtures/backspin/stderr_test.yml +0 -19
  63. data/fixtures/backspin/strict_test.yml +0 -14
  64. data/fixtures/backspin/string_symbol_test.yml +0 -14
  65. data/fixtures/backspin/system_echo.yml +0 -12
  66. data/fixtures/backspin/system_false.yml +0 -18
  67. data/fixtures/backspin/timestamp_test.yml +0 -18
  68. data/fixtures/backspin/verify_system.yml +0 -12
  69. data/fixtures/backspin/verify_system_diff.yml +0 -11
  70. data/fixtures/backspin/version_test.yml +0 -14
@@ -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(filter: nil)
27
- data = {
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
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Backspin
4
- VERSION = "0.9.0"
4
+ VERSION = "0.11.0"
5
5
  end
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(command, name: name, env: env, mode: mode, matcher: matcher, filter: filter)
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 = if mode == :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 = if mode == :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(expected: expected_snapshot, actual: actual_snapshot, matcher: matcher)
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.9.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'
@@ -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'