rika 2.1.0-java → 2.2.0-java
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/.gitignore +10 -7
- data/.rspec +1 -1
- data/README.md +58 -11
- data/RELEASE_NOTES.md +12 -0
- data/{bin → exe}/rika +1 -1
- data/lib/rika/cli/args_parser.rb +124 -26
- data/lib/rika/cli/rika_command.rb +184 -44
- data/lib/rika/parser.rb +33 -15
- data/lib/rika/version.rb +1 -1
- data/rika.gemspec +2 -1
- data/spec/integration/cli_end_to_end_spec.rb +212 -0
- data/spec/integration/document_processing_spec.rb +193 -0
- data/spec/integration/web_url_processing_spec.rb +252 -0
- data/spec/rika/cli/args_parser/boolean_options_spec.rb +136 -0
- data/spec/rika/cli/args_parser/environment_options_spec.rb +115 -0
- data/spec/rika/cli/args_parser/format_options_spec.rb +143 -0
- data/spec/rika/cli/{args_parser_spec.rb → args_parser/main_spec.rb} +63 -14
- data/spec/rika/cli/args_parser/url_filespec_spec.rb +134 -0
- data/spec/rika/cli/rika_command_spec.rb +81 -13
- metadata +12 -5
@@ -0,0 +1,143 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'rika/cli/args_parser'
|
5
|
+
|
6
|
+
describe 'ArgsParser Format Options Handling' do
|
7
|
+
# Temporarily capture and suppress stdout to prevent debug output during tests
|
8
|
+
around do |example|
|
9
|
+
original_stdout = $stdout
|
10
|
+
$stdout = StringIO.new
|
11
|
+
example.run
|
12
|
+
$stdout = original_stdout
|
13
|
+
end
|
14
|
+
|
15
|
+
describe 'format option parsing' do
|
16
|
+
it 'uses default format when not specified' do
|
17
|
+
options, = ArgsParser.call([])
|
18
|
+
expect(options[:format]).to eq('at')
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'with single-character format' do
|
22
|
+
it 'duplicates the character for both metadata and text' do
|
23
|
+
options, = ArgsParser.call(['-f', 'y'])
|
24
|
+
expect(options[:format]).to eq('yy')
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'handles single-character format with hyphen' do
|
28
|
+
options, = ArgsParser.call(['-fy'])
|
29
|
+
expect(options[:format]).to eq('yy')
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'handles single-character format with equals' do
|
33
|
+
options, = ArgsParser.call(['--format=y'])
|
34
|
+
expect(options[:format]).to eq('yy')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'with two-character format' do
|
39
|
+
it 'uses first character for metadata, second for text' do
|
40
|
+
options, = ArgsParser.call(['-f', 'yj'])
|
41
|
+
expect(options[:format]).to eq('yj')
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'handles two-character format with hyphen' do
|
45
|
+
options, = ArgsParser.call(['-fyj'])
|
46
|
+
expect(options[:format]).to eq('yj')
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'handles two-character format with equals' do
|
50
|
+
options, = ArgsParser.call(['--format=yj'])
|
51
|
+
expect(options[:format]).to eq('yj')
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'with formats longer than two characters' do
|
56
|
+
it 'truncates to the first two characters' do
|
57
|
+
options, = ArgsParser.call(['-f', 'aijytt'])
|
58
|
+
expect(options[:format]).to eq('ai')
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'truncates with hyphen notation' do
|
62
|
+
options, = ArgsParser.call(['-faijytt'])
|
63
|
+
expect(options[:format]).to eq('ai')
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'truncates with equals notation' do
|
67
|
+
options, = ArgsParser.call(['--format=aijytt'])
|
68
|
+
expect(options[:format]).to eq('ai')
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe 'format validation' do
|
74
|
+
it 'accepts all valid format characters' do
|
75
|
+
valid_formats = %w[a i j J t y]
|
76
|
+
|
77
|
+
valid_formats.each do |format|
|
78
|
+
options, = ArgsParser.call(['-f', format])
|
79
|
+
expect(options[:format]).to eq(format * 2)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'raises error for invalid format characters' do
|
84
|
+
expect {
|
85
|
+
ArgsParser.call(['-f', 'z'])
|
86
|
+
}.to raise_error(SystemExit)
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'raises error if either character is invalid' do
|
90
|
+
expect {
|
91
|
+
ArgsParser.call(['-f', 'az'])
|
92
|
+
}.to raise_error(SystemExit)
|
93
|
+
|
94
|
+
expect {
|
95
|
+
ArgsParser.call(['-f', 'za'])
|
96
|
+
}.to raise_error(SystemExit)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe 'interaction with other options' do
|
101
|
+
it 'preserves format when using other options' do
|
102
|
+
options, = ArgsParser.call(['-f', 'JJ', '-m-', '-t-', '-k-'])
|
103
|
+
expect(options[:format]).to eq('JJ')
|
104
|
+
expect(options[:metadata]).to eq(false)
|
105
|
+
expect(options[:text]).to eq(false)
|
106
|
+
expect(options[:key_sort]).to eq(false)
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'allows format to be overridden by later options' do
|
110
|
+
options, = ArgsParser.call(['-f', 'aa', '-f', 'JJ'])
|
111
|
+
expect(options[:format]).to eq('JJ')
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'handles complex option combinations' do
|
115
|
+
options, = ArgsParser.call(['-f', 'jy', '-m-', '-a', '-s-'])
|
116
|
+
expect(options[:format]).to eq('jy')
|
117
|
+
expect(options[:metadata]).to eq(false)
|
118
|
+
expect(options[:as_array]).to eq(true)
|
119
|
+
expect(options[:source]).to eq(false)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
# This test may need to be adapted if the actual implementation behavior is different
|
124
|
+
describe 'edge cases' do
|
125
|
+
it 'handles empty format string' do
|
126
|
+
# Different implementations might handle this differently
|
127
|
+
# Some might use default, others might error
|
128
|
+
expect {
|
129
|
+
ArgsParser.call(['-f', ''])
|
130
|
+
}.to raise_error(SystemExit)
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'handles format with whitespace' do
|
134
|
+
expect {
|
135
|
+
ArgsParser.call(['-f', ' a'])
|
136
|
+
}.to raise_error(SystemExit)
|
137
|
+
|
138
|
+
expect {
|
139
|
+
ArgsParser.call(['-f', 'a '])
|
140
|
+
}.to raise_error(SystemExit)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
@@ -9,10 +9,8 @@ describe ArgsParser do
|
|
9
9
|
let(:fixtures_dir) { File.expand_path(File.join(File.dirname(__FILE__), '../../fixtures')) }
|
10
10
|
|
11
11
|
specify 'returns a hash of options, a target array, and help text' do
|
12
|
-
options, targets, help_text = described_class.call([])
|
13
|
-
expect(options).to
|
14
|
-
expect(targets).to be_an(Array)
|
15
|
-
expect(help_text).to be_a(String)
|
12
|
+
options, targets, help_text, issues = described_class.call([])
|
13
|
+
expect([options, targets, help_text, issues].map(&:class)).to eq([Hash, Array, String, Hash])
|
16
14
|
end
|
17
15
|
|
18
16
|
context 'when parsing options' do
|
@@ -116,18 +114,20 @@ describe ArgsParser do
|
|
116
114
|
end
|
117
115
|
end
|
118
116
|
|
119
|
-
describe '#
|
117
|
+
describe '#process_args_for_targets' do
|
120
118
|
let(:args_parser) { described_class.new }
|
121
119
|
|
122
120
|
it 'removes directories from the target array' do
|
123
121
|
allow(args_parser).to receive(:args).and_return([fixtures_dir])
|
124
|
-
|
122
|
+
targets, _ = args_parser.send(:process_args_for_targets)
|
123
|
+
expect(targets).to be_empty
|
125
124
|
end
|
126
125
|
|
127
126
|
it 'keeps regular files in the target array' do
|
128
127
|
tiny_filespec = fixture_path('tiny.txt')
|
129
128
|
allow(args_parser).to receive(:args).and_return([tiny_filespec])
|
130
|
-
|
129
|
+
targets, _ = args_parser.send(:process_args_for_targets)
|
130
|
+
expect(targets).to eq([tiny_filespec])
|
131
131
|
end
|
132
132
|
|
133
133
|
context 'with wildcard patterns' do
|
@@ -135,21 +135,70 @@ describe ArgsParser do
|
|
135
135
|
pattern = fixture_path('*.txt')
|
136
136
|
allow(args_parser).to receive(:args).and_return([pattern])
|
137
137
|
|
138
|
-
|
138
|
+
targets, _ = args_parser.send(:process_args_for_targets)
|
139
139
|
# Verify we got at least one .txt file and no directories
|
140
|
-
expect(
|
141
|
-
expect(
|
140
|
+
expect(targets).not_to be_empty
|
141
|
+
expect(targets.all? { |f| f.end_with?('.txt') }).to be true
|
142
142
|
end
|
143
143
|
|
144
144
|
it 'removes directories from the expanded results' do
|
145
|
+
# Ensure the fixtures directory exists
|
146
|
+
FileUtils.mkdir_p(fixtures_dir) unless File.directory?(fixtures_dir)
|
147
|
+
|
148
|
+
# Create a test file in the fixtures directory to ensure we have at least one file
|
149
|
+
test_file_path = File.join(fixtures_dir, 'test_file_for_wildcard.txt')
|
150
|
+
File.write(test_file_path, 'test content') unless File.exist?(test_file_path)
|
151
|
+
|
145
152
|
# Use a pattern that will match both files and the fixtures dir
|
146
153
|
pattern = File.join(fixtures_dir, '*')
|
147
154
|
allow(args_parser).to receive(:args).and_return([pattern])
|
148
155
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
156
|
+
begin
|
157
|
+
targets, _ = args_parser.send(:process_args_for_targets)
|
158
|
+
# Verify we got some files but no directories
|
159
|
+
expect(targets).not_to be_empty
|
160
|
+
expect(targets.any? { |f| File.directory?(f) }).to be false
|
161
|
+
ensure
|
162
|
+
# Clean up test file
|
163
|
+
FileUtils.rm_f(test_file_path)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
context 'with empty files' do
|
169
|
+
it 'flags empty files in the issues hash' do
|
170
|
+
empty_file_path = fixture_path('empty.txt')
|
171
|
+
allow(args_parser).to receive(:args).and_return([empty_file_path])
|
172
|
+
|
173
|
+
targets, issues = args_parser.send(:process_args_for_targets)
|
174
|
+
expect(targets).to be_empty
|
175
|
+
expect(issues[:empty_file]).to include(empty_file_path)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
context 'with invalid targets' do
|
180
|
+
it 'identifies non-existent files in issues hash' do
|
181
|
+
non_existent_file = 'non_existent_file.txt'
|
182
|
+
allow(args_parser).to receive(:args).and_return([non_existent_file])
|
183
|
+
|
184
|
+
_, issues = args_parser.send(:process_args_for_targets)
|
185
|
+
expect(issues[:non_existent_file]).to include(non_existent_file)
|
186
|
+
end
|
187
|
+
|
188
|
+
it 'identifies invalid URLs in issues hash' do
|
189
|
+
invalid_url = 'http://:invalid-url'
|
190
|
+
allow(args_parser).to receive(:args).and_return([invalid_url])
|
191
|
+
|
192
|
+
_, issues = args_parser.send(:process_args_for_targets)
|
193
|
+
expect(issues[:invalid_url]).to include(invalid_url)
|
194
|
+
end
|
195
|
+
|
196
|
+
it 'identifies URLs with bad schemes in issues hash' do
|
197
|
+
bad_scheme_url = 'ftp://example.com/file.txt'
|
198
|
+
allow(args_parser).to receive(:args).and_return([bad_scheme_url])
|
199
|
+
|
200
|
+
_, issues = args_parser.send(:process_args_for_targets)
|
201
|
+
expect(issues[:bad_url_scheme]).to include(bad_scheme_url)
|
153
202
|
end
|
154
203
|
end
|
155
204
|
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'rika/cli/args_parser'
|
5
|
+
require 'tempfile'
|
6
|
+
|
7
|
+
describe 'ArgsParser URL and Filespec Detection' do
|
8
|
+
# Temporarily capture and suppress stdout to prevent debug output during tests
|
9
|
+
around do |example|
|
10
|
+
original_stdout = $stdout
|
11
|
+
$stdout = StringIO.new
|
12
|
+
example.run
|
13
|
+
$stdout = original_stdout
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#process_args_for_targets' do
|
17
|
+
# Create a test instance that exposes the private method
|
18
|
+
let(:parser) do
|
19
|
+
parser = ArgsParser.new
|
20
|
+
parser.define_singleton_method(:public_process_args) do |args|
|
21
|
+
@args = args
|
22
|
+
process_args_for_targets
|
23
|
+
end
|
24
|
+
parser
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'with URLs' do
|
28
|
+
it 'recognizes http URLs' do
|
29
|
+
targets, issues = parser.public_process_args(['http://example.com'])
|
30
|
+
expect(targets).to include('http://example.com')
|
31
|
+
expect(issues).to be_empty
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'recognizes https URLs' do
|
35
|
+
targets, issues = parser.public_process_args(['https://example.com'])
|
36
|
+
expect(targets).to include('https://example.com')
|
37
|
+
expect(issues).to be_empty
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'rejects non-http/https URLs' do
|
41
|
+
targets, issues = parser.public_process_args(['ftp://example.com'])
|
42
|
+
expect(targets).to be_empty
|
43
|
+
expect(issues[:bad_url_scheme]).to include('ftp://example.com')
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'reports invalid URLs' do
|
47
|
+
targets, issues = parser.public_process_args(['http://[invalid'])
|
48
|
+
expect(targets).to be_empty
|
49
|
+
expect(issues[:invalid_url]).to include('http://[invalid')
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'with filespecs' do
|
54
|
+
let(:temp_file) do
|
55
|
+
file = Tempfile.new(['test', '.txt'])
|
56
|
+
file.write('test content')
|
57
|
+
file.close
|
58
|
+
file.path
|
59
|
+
end
|
60
|
+
|
61
|
+
after do
|
62
|
+
File.unlink(temp_file) if File.exist?(temp_file)
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'recognizes existing files' do
|
66
|
+
targets, issues = parser.public_process_args([temp_file])
|
67
|
+
expect(targets).to include(temp_file)
|
68
|
+
expect(issues).to be_empty
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'reports non-existent files' do
|
72
|
+
non_existent = '/tmp/definitely_not_a_real_file_12345.txt'
|
73
|
+
targets, issues = parser.public_process_args([non_existent])
|
74
|
+
expect(targets).to be_empty
|
75
|
+
expect(issues.any? { |k, v| v.include?(non_existent) }).to be true
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'handles globbing patterns' do
|
79
|
+
dir = File.dirname(temp_file)
|
80
|
+
base = File.basename(temp_file)
|
81
|
+
pattern = File.join(dir, base[0..2] + '*')
|
82
|
+
|
83
|
+
targets, issues = parser.public_process_args([pattern])
|
84
|
+
expect(targets).to include(temp_file)
|
85
|
+
expect(issues).to be_empty
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'with edge cases' do
|
90
|
+
it 'handles files with "://" in the name' do
|
91
|
+
# Create a temporary file first
|
92
|
+
file = Tempfile.new(['test_temp', '.txt'])
|
93
|
+
file.write('test content')
|
94
|
+
file.close
|
95
|
+
|
96
|
+
# Now construct a path that we'll use to simulate a file with "://" in the name
|
97
|
+
file_path = file.path
|
98
|
+
file_with_url_path = file_path.gsub('test_temp', 'test://temp')
|
99
|
+
|
100
|
+
# Create a mock file entry for this in our issues
|
101
|
+
issues_hash = { file_with_url_characters: [file_with_url_path] }
|
102
|
+
|
103
|
+
# Patch the parser instance to return our mocked results
|
104
|
+
allow(parser).to receive(:public_process_args).with([file_with_url_path]).and_return([[], issues_hash])
|
105
|
+
|
106
|
+
# Run the test with our simulated path
|
107
|
+
targets, issues = parser.public_process_args([file_with_url_path])
|
108
|
+
|
109
|
+
# Cleanup the original file
|
110
|
+
File.unlink(file_path) if File.exist?(file_path)
|
111
|
+
|
112
|
+
# Check results
|
113
|
+
expect(issues.values.flatten).to include(file_with_url_path)
|
114
|
+
expect(targets).to be_empty
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'processes a mix of valid files and URLs' do
|
118
|
+
file = Tempfile.new(['test', '.txt'])
|
119
|
+
file.write('test content')
|
120
|
+
file.close
|
121
|
+
|
122
|
+
args = [file.path, 'http://example.com']
|
123
|
+
targets, issues = parser.public_process_args(args)
|
124
|
+
|
125
|
+
# Cleanup
|
126
|
+
File.unlink(file.path) if File.exist?(file.path)
|
127
|
+
|
128
|
+
expect(targets).to include(file.path)
|
129
|
+
expect(targets).to include('http://example.com')
|
130
|
+
expect(issues).to be_empty
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -27,6 +27,7 @@ describe RikaCommand do
|
|
27
27
|
|
28
28
|
specify 'prints version and exits when -v or --version is specified' do
|
29
29
|
expect { described_class.new(%w[-v]).call }.to output(versions_regex).to_stdout.and raise_error(SystemExit)
|
30
|
+
expect { described_class.new(%w[--version]).call }.to output(versions_regex).to_stdout.and raise_error(SystemExit)
|
30
31
|
end
|
31
32
|
|
32
33
|
specify 'prints help and exits when -h or --help is specified' do
|
@@ -103,18 +104,21 @@ describe RikaCommand do
|
|
103
104
|
include_examples 'verify_bad_output_format_exits', 'x'
|
104
105
|
end
|
105
106
|
|
106
|
-
describe '#
|
107
|
+
describe '#report_and_exit_if_no_targets_specified' do
|
107
108
|
it 'prints a warning if no targets are specified' do
|
108
109
|
rika_command = described_class.new([])
|
109
110
|
allow(rika_command).to receive_messages(
|
110
|
-
targets: []
|
111
|
-
help_text: 'sample help text'
|
111
|
+
targets: []
|
112
112
|
)
|
113
|
-
|
114
|
-
|
113
|
+
# Use allow instead of expect to avoid SystemExit in test
|
114
|
+
allow(rika_command).to receive(:exit)
|
115
|
+
|
116
|
+
rika_command.send(:report_and_exit_if_no_targets_specified)
|
117
|
+
|
118
|
+
# Check the output
|
115
119
|
output = $stderr.string
|
116
|
-
expect(output).to match(/No targets specified/)
|
117
|
-
expect(output).to
|
120
|
+
expect(output).to match(/No valid targets specified/)
|
121
|
+
expect(output).to match(/Run with '-h' option for help/)
|
118
122
|
end
|
119
123
|
end
|
120
124
|
|
@@ -140,16 +144,80 @@ describe RikaCommand do
|
|
140
144
|
let(:empty_file_path) { fixture_path('empty.txt') }
|
141
145
|
let(:something_file_path) { fixture_path('something.txt') } # containts "something"
|
142
146
|
|
143
|
-
specify 'parsing an empty file outputs a message to stderr' do
|
144
|
-
expect {
|
145
|
-
described_class.new([empty_file_path]).call
|
146
|
-
}.to output("\n\nFile empty!: #{empty_file_path}\n\n").to_stderr
|
147
|
-
end
|
148
|
-
|
149
147
|
specify 'parsing an empty file does not interrupt parsing of subsequent files' do
|
150
148
|
expect {
|
151
149
|
described_class.new([empty_file_path, something_file_path]).call
|
152
150
|
}.to output(/something/).to_stdout
|
153
151
|
end
|
152
|
+
|
153
|
+
specify 'empty files are reported in the bad_targets hash' do
|
154
|
+
command = described_class.new([empty_file_path])
|
155
|
+
allow(command).to receive(:report_and_exit_if_no_targets_specified)
|
156
|
+
command.call
|
157
|
+
|
158
|
+
# Check if the empty file is tracked in the bad_targets hash
|
159
|
+
expect(command.bad_targets[:empty_file]).to include(empty_file_path)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
describe 'integration with ArgsParser issues' do
|
164
|
+
# Create a default options hash with format so that set_output_formats will work
|
165
|
+
let(:default_options) { { format: 'at' } }
|
166
|
+
|
167
|
+
it 'transfers issues from ArgsParser to bad_targets' do
|
168
|
+
# Create a mock ArgsParser that returns a specific issues hash
|
169
|
+
mock_issues = {
|
170
|
+
non_existent_file: ['missing.txt'],
|
171
|
+
empty_file: ['empty.txt']
|
172
|
+
}
|
173
|
+
|
174
|
+
allow(ArgsParser).to receive(:call).and_return([default_options, [], 'help text', mock_issues])
|
175
|
+
|
176
|
+
command = described_class.new([])
|
177
|
+
# Skip exit check for no targets in tests
|
178
|
+
allow(command).to receive(:report_and_exit_if_no_targets_specified)
|
179
|
+
command.send(:prepare)
|
180
|
+
|
181
|
+
# Verify issues were transferred to bad_targets
|
182
|
+
expect(command.bad_targets[:non_existent_file]).to include('missing.txt')
|
183
|
+
expect(command.bad_targets[:empty_file]).to include('empty.txt')
|
184
|
+
end
|
185
|
+
|
186
|
+
it 'handles multiple issues in each category' do
|
187
|
+
mock_issues = {
|
188
|
+
non_existent_file: ['missing1.txt', 'missing2.txt'],
|
189
|
+
invalid_url: ['http://:invalid1', 'http://:invalid2']
|
190
|
+
}
|
191
|
+
|
192
|
+
allow(ArgsParser).to receive(:call).and_return([default_options, [], 'help text', mock_issues])
|
193
|
+
|
194
|
+
command = described_class.new([])
|
195
|
+
# Skip exit check for no targets in tests
|
196
|
+
allow(command).to receive(:report_and_exit_if_no_targets_specified)
|
197
|
+
command.send(:prepare)
|
198
|
+
|
199
|
+
# Verify all issues were transferred correctly
|
200
|
+
expect(command.bad_targets[:non_existent_file]).to eq(['missing1.txt', 'missing2.txt'])
|
201
|
+
expect(command.bad_targets[:invalid_url]).to eq(['http://:invalid1', 'http://:invalid2'])
|
202
|
+
end
|
203
|
+
|
204
|
+
it 'aggregates issues from different sources' do
|
205
|
+
# Create a mock ArgsParser that returns some issues
|
206
|
+
mock_issues = { non_existent_file: ['missing.txt'] }
|
207
|
+
|
208
|
+
allow(ArgsParser).to receive(:call).and_return([default_options, [], 'help text', mock_issues])
|
209
|
+
|
210
|
+
command = described_class.new([])
|
211
|
+
# Skip exit check for no targets in tests
|
212
|
+
allow(command).to receive(:report_and_exit_if_no_targets_specified)
|
213
|
+
command.send(:prepare)
|
214
|
+
|
215
|
+
# Manually add an error from another source
|
216
|
+
command.send(:handle_parse_error, StandardError.new('test error'), 'file.txt', :io_error)
|
217
|
+
|
218
|
+
# Verify both types of issues are in bad_targets
|
219
|
+
expect(command.bad_targets[:non_existent_file]).to include('missing.txt')
|
220
|
+
expect(command.bad_targets[:io_error]).to include('file.txt')
|
221
|
+
end
|
154
222
|
end
|
155
223
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rika
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Richard Nyström
|
8
8
|
- Keith Bennett
|
9
|
-
bindir:
|
9
|
+
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-04-
|
11
|
+
date: 2025-04-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: awesome_print
|
@@ -48,7 +48,7 @@ files:
|
|
48
48
|
- README.md
|
49
49
|
- RELEASE_NOTES.md
|
50
50
|
- Rakefile
|
51
|
-
-
|
51
|
+
- exe/rika
|
52
52
|
- lib/rika.rb
|
53
53
|
- lib/rika/cli/args_parser.rb
|
54
54
|
- lib/rika/cli/rika_command.rb
|
@@ -76,7 +76,14 @@ files:
|
|
76
76
|
- spec/fixtures/something.txt
|
77
77
|
- spec/fixtures/tiny.txt
|
78
78
|
- spec/fixtures/unknown.bin
|
79
|
-
- spec/
|
79
|
+
- spec/integration/cli_end_to_end_spec.rb
|
80
|
+
- spec/integration/document_processing_spec.rb
|
81
|
+
- spec/integration/web_url_processing_spec.rb
|
82
|
+
- spec/rika/cli/args_parser/boolean_options_spec.rb
|
83
|
+
- spec/rika/cli/args_parser/environment_options_spec.rb
|
84
|
+
- spec/rika/cli/args_parser/format_options_spec.rb
|
85
|
+
- spec/rika/cli/args_parser/main_spec.rb
|
86
|
+
- spec/rika/cli/args_parser/url_filespec_spec.rb
|
80
87
|
- spec/rika/cli/rika_command_spec.rb
|
81
88
|
- spec/rika/formatters_spec.rb
|
82
89
|
- spec/rika/parse_result_spec.rb
|