rika 2.0.4-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 +81 -11
- data/RELEASE_NOTES.md +16 -0
- data/{bin → exe}/rika +1 -1
- data/lib/rika/cli/args_parser.rb +124 -22
- 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} +92 -4
- data/spec/rika/cli/args_parser/url_filespec_spec.rb +134 -0
- data/spec/rika/cli/rika_command_spec.rb +81 -13
- metadata +15 -10
@@ -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
|
@@ -6,12 +6,11 @@ require 'rika/cli/args_parser'
|
|
6
6
|
|
7
7
|
describe ArgsParser do
|
8
8
|
let(:versions_regex) { /Versions:.*Rika: (\d+\.\d+\.\d+(-\w+)?).*Tika: (\d+\.\d+\.\d+(-\w+)?)/ }
|
9
|
+
let(:fixtures_dir) { File.expand_path(File.join(File.dirname(__FILE__), '../../fixtures')) }
|
9
10
|
|
10
11
|
specify 'returns a hash of options, a target array, and help text' do
|
11
|
-
options, targets, help_text = described_class.call([])
|
12
|
-
expect(options).to
|
13
|
-
expect(targets).to be_an(Array)
|
14
|
-
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])
|
15
14
|
end
|
16
15
|
|
17
16
|
context 'when parsing options' do
|
@@ -114,4 +113,93 @@ describe ArgsParser do
|
|
114
113
|
expect(described_class::DEFAULT_OPTIONS).to be_frozen
|
115
114
|
end
|
116
115
|
end
|
116
|
+
|
117
|
+
describe '#process_args_for_targets' do
|
118
|
+
let(:args_parser) { described_class.new }
|
119
|
+
|
120
|
+
it 'removes directories from the target array' do
|
121
|
+
allow(args_parser).to receive(:args).and_return([fixtures_dir])
|
122
|
+
targets, _ = args_parser.send(:process_args_for_targets)
|
123
|
+
expect(targets).to be_empty
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'keeps regular files in the target array' do
|
127
|
+
tiny_filespec = fixture_path('tiny.txt')
|
128
|
+
allow(args_parser).to receive(:args).and_return([tiny_filespec])
|
129
|
+
targets, _ = args_parser.send(:process_args_for_targets)
|
130
|
+
expect(targets).to eq([tiny_filespec])
|
131
|
+
end
|
132
|
+
|
133
|
+
context 'with wildcard patterns' do
|
134
|
+
it 'expands wildcard patterns using Dir.glob' do
|
135
|
+
pattern = fixture_path('*.txt')
|
136
|
+
allow(args_parser).to receive(:args).and_return([pattern])
|
137
|
+
|
138
|
+
targets, _ = args_parser.send(:process_args_for_targets)
|
139
|
+
# Verify we got at least one .txt file and no directories
|
140
|
+
expect(targets).not_to be_empty
|
141
|
+
expect(targets.all? { |f| f.end_with?('.txt') }).to be true
|
142
|
+
end
|
143
|
+
|
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
|
+
|
152
|
+
# Use a pattern that will match both files and the fixtures dir
|
153
|
+
pattern = File.join(fixtures_dir, '*')
|
154
|
+
allow(args_parser).to receive(:args).and_return([pattern])
|
155
|
+
|
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)
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
117
205
|
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,17 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rika
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.2.0
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Richard Nyström
|
8
8
|
- Keith Bennett
|
9
|
-
|
10
|
-
bindir: bin
|
9
|
+
bindir: exe
|
11
10
|
cert_chain: []
|
12
|
-
date: 2025-
|
11
|
+
date: 2025-04-28 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
14
|
+
name: awesome_print
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
@@ -20,9 +20,8 @@ dependencies:
|
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
22
|
version: 1.9.2
|
23
|
-
name: awesome_print
|
24
|
-
prerelease: false
|
25
23
|
type: :runtime
|
24
|
+
prerelease: false
|
26
25
|
version_requirements: !ruby/object:Gem::Requirement
|
27
26
|
requirements:
|
28
27
|
- - "~>"
|
@@ -49,7 +48,7 @@ files:
|
|
49
48
|
- README.md
|
50
49
|
- RELEASE_NOTES.md
|
51
50
|
- Rakefile
|
52
|
-
-
|
51
|
+
- exe/rika
|
53
52
|
- lib/rika.rb
|
54
53
|
- lib/rika/cli/args_parser.rb
|
55
54
|
- lib/rika/cli/rika_command.rb
|
@@ -77,7 +76,14 @@ files:
|
|
77
76
|
- spec/fixtures/something.txt
|
78
77
|
- spec/fixtures/tiny.txt
|
79
78
|
- spec/fixtures/unknown.bin
|
80
|
-
- 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
|
81
87
|
- spec/rika/cli/rika_command_spec.rb
|
82
88
|
- spec/rika/formatters_spec.rb
|
83
89
|
- spec/rika/parse_result_spec.rb
|
@@ -112,8 +118,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
112
118
|
- !ruby/object:Gem::Version
|
113
119
|
version: '0'
|
114
120
|
requirements: []
|
115
|
-
rubygems_version: 3.
|
116
|
-
signing_key:
|
121
|
+
rubygems_version: 3.6.3
|
117
122
|
specification_version: 4
|
118
123
|
summary: A JRuby wrapper for Apache Tika to extract text and metadata from files of
|
119
124
|
various formats.
|