traject 3.1.0 → 3.6.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.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +35 -0
- data/CHANGES.md +46 -0
- data/README.md +18 -2
- data/doc/settings.md +5 -1
- data/doc/xml.md +12 -0
- data/examples/marc/tiny.xml +35 -0
- data/lib/traject/command_line.rb +34 -43
- data/lib/traject/debug_writer.rb +1 -1
- data/lib/traject/indexer.rb +12 -4
- data/lib/traject/macros/marc21.rb +3 -3
- data/lib/traject/macros/marc21_semantics.rb +15 -12
- data/lib/traject/macros/nokogiri_macros.rb +9 -3
- data/lib/traject/marc_extractor.rb +3 -3
- data/lib/traject/nokogiri_reader.rb +10 -1
- data/lib/traject/oai_pmh_nokogiri_reader.rb +9 -3
- data/lib/traject/solr_json_writer.rb +38 -7
- data/lib/traject/version.rb +1 -1
- data/lib/translation_maps/marc_languages.yaml +77 -48
- data/test/command_line_test.rb +52 -0
- data/test/debug_writer_test.rb +13 -0
- data/test/delimited_writer_test.rb +14 -16
- data/test/indexer/class_level_configuration_test.rb +23 -0
- data/test/indexer/macros/macros_marc21_semantics_test.rb +4 -0
- data/test/indexer/nokogiri_indexer_test.rb +35 -0
- data/test/indexer/read_write_test.rb +14 -3
- data/test/nokogiri_reader_test.rb +10 -0
- data/test/solr_json_writer_test.rb +65 -0
- data/test/test_support/date_resort_to_264.marc +1 -0
- data/traject.gemspec +3 -3
- metadata +31 -21
- data/.travis.yml +0 -16
@@ -0,0 +1,52 @@
|
|
1
|
+
# we mostly unit test with a Traject::Indexer itself and lower-level, but
|
2
|
+
# we need at least some basic top-level integration actually command line tests,
|
3
|
+
# this is a start, we can add more.
|
4
|
+
#
|
5
|
+
# Should we be testing Traject::CommandLine as an object instead of/in addition to
|
6
|
+
# actually testing shell-out to command line call? Maybe.
|
7
|
+
|
8
|
+
require 'test_helper'
|
9
|
+
|
10
|
+
describe "Shell out to command line" do
|
11
|
+
# just encapsuluate using the minitest capture helper, but also
|
12
|
+
# getting and returning exit code
|
13
|
+
#
|
14
|
+
# out, err, result = execute_with_args("-c configuration")
|
15
|
+
def execute_with_args(args)
|
16
|
+
out, err = capture_subprocess_io do
|
17
|
+
system("./bin/traject #{args}")
|
18
|
+
end
|
19
|
+
|
20
|
+
return out, err, $?
|
21
|
+
end
|
22
|
+
|
23
|
+
it "can display version" do
|
24
|
+
out, err, result = execute_with_args("-v")
|
25
|
+
|
26
|
+
assert result.success?, "Expected subprocess exit code to be success.\nSTDERR:\n#{err}\n\nSTDOUT:\n#{out}"
|
27
|
+
assert_equal err, "traject version #{Traject::VERSION}\n"
|
28
|
+
end
|
29
|
+
|
30
|
+
it "can display help text" do
|
31
|
+
out, err, result = execute_with_args("-h")
|
32
|
+
|
33
|
+
assert result.success?, "Expected subprocess exit code to be success.\nSTDERR:\n#{err}\n\nSTDOUT:\n#{out}"
|
34
|
+
assert err.start_with?("traject [options] -c configuration.rb [-c config2.rb] file.mrc")
|
35
|
+
end
|
36
|
+
|
37
|
+
it "handles bad argument" do
|
38
|
+
out, err, result = execute_with_args("--no-such-arg")
|
39
|
+
refute result.success?
|
40
|
+
|
41
|
+
assert err.start_with?("Error: unknown option `--no-such-arg'\nExiting...\n")
|
42
|
+
end
|
43
|
+
|
44
|
+
it "does basic dry run" do
|
45
|
+
out, err, result = execute_with_args("--debug-mode -s one=two -s three=four -c test/test_support/demo_config.rb test/test_support/emptyish_record.marc")
|
46
|
+
|
47
|
+
assert result.success?, "Expected subprocess exit code to be success.\nSTDERR:\n#{err}\n\nSTDOUT:\n#{out}"
|
48
|
+
assert_includes err, "executing with: `--debug-mode -s one=two -s three=four"
|
49
|
+
assert_match /bib_1000165 +author_sort +Collection la/, out
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
data/test/debug_writer_test.rb
CHANGED
@@ -73,6 +73,19 @@ describe 'Simple output' do
|
|
73
73
|
|
74
74
|
end
|
75
75
|
|
76
|
+
it "deals ok with nil values" do
|
77
|
+
record_with_nil_value = {"id"=>["2710183"], "title"=>["Manufacturing consent : the political economy of the mass media /"], "xyz"=>nil}
|
78
|
+
@writer.put Traject::Indexer::Context.new(:output_hash => record_with_nil_value)
|
79
|
+
expected = [
|
80
|
+
"#{@id} id #{@id}",
|
81
|
+
"#{@id} title #{@title}",
|
82
|
+
"#{@id} xyz",
|
83
|
+
"\n"
|
84
|
+
]
|
85
|
+
assert_equal expected.join("\n").gsub(/\s/, ''), @io.string.gsub(/\s/, '')
|
86
|
+
@writer.close
|
87
|
+
|
88
|
+
end
|
76
89
|
end
|
77
90
|
|
78
91
|
|
@@ -24,40 +24,40 @@ describe "Delimited/CSV Writers" do
|
|
24
24
|
|
25
25
|
it "creates a dw with defaults" do
|
26
26
|
dw = Traject::DelimitedWriter.new(@settings)
|
27
|
-
dw.delimiter
|
28
|
-
dw.internal_delimiter
|
29
|
-
dw.edelim
|
30
|
-
dw.eidelim
|
27
|
+
assert_equal dw.delimiter, "\t"
|
28
|
+
assert_equal dw.internal_delimiter, '|'
|
29
|
+
assert_equal dw.edelim, ' '
|
30
|
+
assert_equal dw.eidelim, '\\|'
|
31
31
|
end
|
32
32
|
|
33
33
|
it "respects different delimiter" do
|
34
34
|
@settings['delimited_writer.delimiter'] = '^'
|
35
35
|
dw = Traject::DelimitedWriter.new(@settings)
|
36
|
-
dw.delimiter
|
37
|
-
dw.edelim
|
38
|
-
dw.internal_delimiter
|
36
|
+
assert_equal dw.delimiter, '^'
|
37
|
+
assert_equal dw.edelim, '\\^'
|
38
|
+
assert_equal dw.internal_delimiter, '|'
|
39
39
|
end
|
40
40
|
|
41
41
|
it "outputs a header if asked to" do
|
42
42
|
Traject::DelimitedWriter.new(@settings)
|
43
|
-
@out.string.chomp
|
43
|
+
assert_equal @out.string.chomp, %w[four one two].join("\t")
|
44
44
|
end
|
45
45
|
|
46
46
|
it "doesn't output a header if asked not to" do
|
47
47
|
@settings['delimited_writer.header'] = 'false'
|
48
48
|
Traject::DelimitedWriter.new(@settings)
|
49
|
-
@out.string
|
49
|
+
assert_empty @out.string
|
50
50
|
end
|
51
51
|
|
52
52
|
it "deals with multiple values" do
|
53
53
|
dw = Traject::DelimitedWriter.new(@settings)
|
54
54
|
dw.put @context
|
55
|
-
@out.string.split("\n").last
|
55
|
+
assert_equal @out.string.split("\n").last, ['four', 'one', 'two1|two2'].join(dw.delimiter)
|
56
56
|
end
|
57
57
|
|
58
58
|
it "bails if delimited_writer.fields isn't set" do
|
59
59
|
@settings.delete 'delimited_writer.fields'
|
60
|
-
|
60
|
+
assert_raises(ArgumentError) { Traject::DelimitedWriter.new(@settings) }
|
61
61
|
end
|
62
62
|
|
63
63
|
end
|
@@ -65,18 +65,18 @@ describe "Delimited/CSV Writers" do
|
|
65
65
|
describe "Traject::CSVWriter" do
|
66
66
|
it "unsets the delimiter" do
|
67
67
|
cw = Traject::CSVWriter.new(@settings)
|
68
|
-
cw.delimiter
|
68
|
+
assert_nil cw.delimiter
|
69
69
|
end
|
70
70
|
|
71
71
|
it "writes the header" do
|
72
72
|
Traject::CSVWriter.new(@settings)
|
73
|
-
@out.string.chomp
|
73
|
+
assert_equal @out.string.chomp, 'four,one,two'
|
74
74
|
end
|
75
75
|
|
76
76
|
it "uses the internal delimiter" do
|
77
77
|
cw = Traject::CSVWriter.new(@settings)
|
78
78
|
cw.put @context
|
79
|
-
@out.string.split("\n").last
|
79
|
+
assert_equal @out.string.split("\n").last, ['four', 'one', 'two1|two2'].join(',')
|
80
80
|
end
|
81
81
|
|
82
82
|
it "produces complex output" do
|
@@ -97,8 +97,6 @@ describe "Delimited/CSV Writers" do
|
|
97
97
|
traject_csvwriter_output = @out.string.split("\n").last.chomp
|
98
98
|
|
99
99
|
assert_equal(csv_output, traject_csvwriter_output)
|
100
|
-
|
101
100
|
end
|
102
|
-
|
103
101
|
end
|
104
102
|
end
|
@@ -25,6 +25,7 @@ describe "Class-level configuration of Indexer sub-class" do
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
+
|
28
29
|
before do
|
29
30
|
@indexer = TestIndexerSubclass.new
|
30
31
|
end
|
@@ -47,6 +48,28 @@ describe "Class-level configuration of Indexer sub-class" do
|
|
47
48
|
assert_equal ['from-instance-config'], result["instance_field"]
|
48
49
|
end
|
49
50
|
|
51
|
+
describe "multiple class-level configure" do
|
52
|
+
class MultipleConfigureIndexer < Traject::Indexer
|
53
|
+
configure do
|
54
|
+
to_field "field", literal("value")
|
55
|
+
end
|
56
|
+
configure do
|
57
|
+
to_field "field", literal("value from second configure")
|
58
|
+
to_field "second_call", literal("value from second configure")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
before do
|
63
|
+
@indexer = MultipleConfigureIndexer.new
|
64
|
+
end
|
65
|
+
|
66
|
+
it "lets you call class-level configure multiple times and aggregates" do
|
67
|
+
result = @indexer.map_record(Object.new)
|
68
|
+
assert_equal ['value', 'value from second configure'], result['field']
|
69
|
+
assert_equal ['value from second configure'], result['second_call']
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
50
73
|
describe "with multi-level subclass" do
|
51
74
|
class TestIndexerSubclassSubclass < TestIndexerSubclass
|
52
75
|
configure do
|
@@ -197,6 +197,10 @@ describe "Traject::Macros::Marc21Semantics" do
|
|
197
197
|
# we take the first date. And need to deal with the u.
|
198
198
|
assert_equal 1845, Marc21Semantics.publication_date(@record)
|
199
199
|
end
|
200
|
+
it "resorts to 264c" do
|
201
|
+
@record = MARC::Reader.new(support_file_path "date_resort_to_264.marc").to_a.first
|
202
|
+
assert_equal 2015, Marc21Semantics.publication_date(@record)
|
203
|
+
end
|
200
204
|
it "resorts to 260c" do
|
201
205
|
@record = MARC::Reader.new(support_file_path "date_resort_to_260.marc").to_a.first
|
202
206
|
assert_equal 1980, Marc21Semantics.publication_date(@record)
|
@@ -109,6 +109,41 @@ describe "Traject::NokogiriIndexer" do
|
|
109
109
|
result["name"].name == "name"
|
110
110
|
})
|
111
111
|
end
|
112
|
+
end
|
112
113
|
|
114
|
+
describe "xpath to attribute" do
|
115
|
+
let(:indexer) do
|
116
|
+
namespaces = @namespaces
|
117
|
+
Traject::Indexer::NokogiriIndexer.new("nokogiri.namespaces" => namespaces,
|
118
|
+
"nokogiri.each_record_xpath" => "//oai:record") do
|
119
|
+
to_field "status", extract_xpath("//oai:record/oai:header/@status")
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
let(:records) { Traject::NokogiriReader.new(StringIO.new(
|
124
|
+
<<-XML
|
125
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
126
|
+
<OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
|
127
|
+
<responseDate>2020-03-03T04:16:09Z</responseDate>
|
128
|
+
<request verb="ListRecords" metadataPrefix="marc21" set="blacklight" from="2020-03-02T20:47:11Z">https://na02.alma.exlibrisgroup.com/view/oai/01TULI_INST/request</request>
|
129
|
+
<ListRecords>
|
130
|
+
<record>
|
131
|
+
<header status="deleted">
|
132
|
+
<identifier>oai:alma.01TULI_INST:991025803889703811</identifier>
|
133
|
+
<datestamp>2020-03-03T03:54:35Z</datestamp>
|
134
|
+
<setSpec>blacklight</setSpec>
|
135
|
+
<setSpec>rapid_print_journals</setSpec>
|
136
|
+
<setSpec>blacklight_qa</setSpec>
|
137
|
+
</header>
|
138
|
+
</record>
|
139
|
+
</ListRecords>
|
140
|
+
</OAI-PMH>
|
141
|
+
XML
|
142
|
+
), []).to_a }
|
143
|
+
|
144
|
+
it "extracts the correct attribute" do
|
145
|
+
statuses = indexer.map_record(records.first)["status"]
|
146
|
+
assert_equal ["deleted"], statuses
|
147
|
+
end
|
113
148
|
end
|
114
149
|
end
|
@@ -7,7 +7,8 @@ memory_writer_class = Class.new do
|
|
7
7
|
# store them in a class variable so we can test em later
|
8
8
|
# Supress the warning message
|
9
9
|
original_verbose, $VERBOSE = $VERBOSE, nil
|
10
|
-
|
10
|
+
@settings = settings
|
11
|
+
self.class.store_last_writer_settings(@settings)
|
11
12
|
# Activate warning messages again.
|
12
13
|
$VERBOSE = original_verbose
|
13
14
|
@settings["memory_writer.added"] = []
|
@@ -20,6 +21,16 @@ memory_writer_class = Class.new do
|
|
20
21
|
def close
|
21
22
|
@settings["memory_writer.closed"] = true
|
22
23
|
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def self.store_last_writer_settings(settings)
|
28
|
+
@last_writer_settings = settings
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.last_writer_settings
|
32
|
+
@last_writer_settings
|
33
|
+
end
|
23
34
|
end
|
24
35
|
|
25
36
|
describe "Traject::Indexer#process" do
|
@@ -53,7 +64,7 @@ describe "Traject::Indexer#process" do
|
|
53
64
|
|
54
65
|
# Grab the settings out of a class variable where we left em,
|
55
66
|
# as a convenient place to store outcomes so we can test em.
|
56
|
-
writer_settings = memory_writer_class.
|
67
|
+
writer_settings = memory_writer_class.last_writer_settings
|
57
68
|
|
58
69
|
assert writer_settings["memory_writer.added"]
|
59
70
|
assert_equal 30, writer_settings["memory_writer.added"].length
|
@@ -146,7 +157,7 @@ describe "Traject::Indexer#process" do
|
|
146
157
|
it "parses and loads" do
|
147
158
|
@indexer.process([@file1, @file2])
|
148
159
|
# kinda ridic, yeah.
|
149
|
-
output_hashes = memory_writer_class.
|
160
|
+
output_hashes = memory_writer_class.last_writer_settings["memory_writer.added"].collect(&:output_hash)
|
150
161
|
|
151
162
|
assert_length 2, output_hashes
|
152
163
|
assert output_hashes.all? { |hash| hash["title"].length > 0 }
|
@@ -134,6 +134,16 @@ describe "Traject::NokogiriReader" do
|
|
134
134
|
end
|
135
135
|
end
|
136
136
|
|
137
|
+
describe "strict_mode" do
|
138
|
+
it "raises on non-well-formed" do
|
139
|
+
# invalid because two sibling root nodes, XML requiers one root node
|
140
|
+
reader = Traject::NokogiriReader.new(StringIO.new("<doc></doc><doc></doc>"), {"nokogiri.strict_mode" => "true" })
|
141
|
+
assert_raises(Nokogiri::XML::SyntaxError) {
|
142
|
+
reader.each { |r| }
|
143
|
+
}
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
137
147
|
|
138
148
|
def shared_tests
|
139
149
|
@reader = Traject::NokogiriReader.new(File.open(@xml_sample_path), {
|
@@ -170,6 +170,62 @@ describe "Traject::SolrJsonWriter" do
|
|
170
170
|
assert_length 1, @fake_http_client.post_args, "Has flushed to solr"
|
171
171
|
end
|
172
172
|
|
173
|
+
it "defaults to not setting basic authentication" do
|
174
|
+
settings = { "solr.url" => "http://example.com/solr/foo" }
|
175
|
+
writer = Traject::SolrJsonWriter.new(settings)
|
176
|
+
auth = writer.instance_variable_get("@http_client")
|
177
|
+
.www_auth.basic_auth.instance_variable_get("@auth")
|
178
|
+
assert(auth.empty?)
|
179
|
+
end
|
180
|
+
|
181
|
+
describe "HTTP basic auth" do
|
182
|
+
|
183
|
+
it "supports basic authentication settings" do
|
184
|
+
settings = {
|
185
|
+
"solr.url" => "http://example.com/solr/foo",
|
186
|
+
"solr_writer.basic_auth_user" => "foo",
|
187
|
+
"solr_writer.basic_auth_password" => "bar",
|
188
|
+
}
|
189
|
+
|
190
|
+
# testing with some internal implementation of HTTPClient sorry
|
191
|
+
|
192
|
+
writer = Traject::SolrJsonWriter.new(settings)
|
193
|
+
|
194
|
+
auth = writer.instance_variable_get("@http_client")
|
195
|
+
.www_auth.basic_auth.instance_variable_get("@auth")
|
196
|
+
assert(!auth.empty?)
|
197
|
+
assert_equal(auth.values.first, Base64.encode64("foo:bar").chomp)
|
198
|
+
end
|
199
|
+
|
200
|
+
it "supports basic auth from solr.url" do
|
201
|
+
settings = {
|
202
|
+
"solr.url" => "http://foo:bar@example.com/solr/foo",
|
203
|
+
}
|
204
|
+
|
205
|
+
# testing with some internal implementation of HTTPClient sorry
|
206
|
+
|
207
|
+
writer = Traject::SolrJsonWriter.new(settings)
|
208
|
+
auth = writer.instance_variable_get("@http_client")
|
209
|
+
.www_auth.basic_auth.instance_variable_get("@auth")
|
210
|
+
assert(!auth.empty?)
|
211
|
+
assert_equal(auth.values.first, Base64.encode64("foo:bar").chomp)
|
212
|
+
end
|
213
|
+
|
214
|
+
it "does not log basic auth from solr.url" do
|
215
|
+
string_io = StringIO.new
|
216
|
+
settings = {
|
217
|
+
"solr.url" => "http://secret_username:secret_password@example.com/solr/foo",
|
218
|
+
"logger" => Logger.new(string_io)
|
219
|
+
}
|
220
|
+
|
221
|
+
|
222
|
+
writer = Traject::SolrJsonWriter.new(settings)
|
223
|
+
|
224
|
+
refute_includes string_io.string, "secret_username:secret_password"
|
225
|
+
assert_includes string_io.string, "(with HTTP basic auth)"
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
173
229
|
describe "commit" do
|
174
230
|
it "commits on close when set" do
|
175
231
|
@writer = create_writer("solr.url" => "http://example.com", "solr_writer.commit_on_close" => "true")
|
@@ -365,4 +421,13 @@ describe "Traject::SolrJsonWriter" do
|
|
365
421
|
end
|
366
422
|
end
|
367
423
|
end
|
424
|
+
|
425
|
+
describe "#delete_all!" do
|
426
|
+
it "deletes all" do
|
427
|
+
@writer.delete_all!
|
428
|
+
post_args = @fake_http_client.post_args.first
|
429
|
+
assert_equal "http://example.com/solr/update/json", post_args[0]
|
430
|
+
assert_equal JSON.generate({"delete" => { "query" => "*:*"}}), post_args[1]
|
431
|
+
end
|
432
|
+
end
|
368
433
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
01180aam a2200337 a 4500001001000000008004100010015001900051016001800070020002500088020002200113040005900135043001200194050002400206082001400230100003500244245006400279260003800343264003800381264001100419300003600430336002100466336002800487337002500515338002300540504006700563651004000630651005000670651004300720651005600763035002300819a11417842130723t20uu20uuenkb b 001 0 eng d aGBB3854302bnb7 a0164999372Uk a9781849043427 (pbk.) a1849043426 (pbk.) aUKMGBcUKMGBdOCLCOdYDXCPdOCLCOdZWZdOCLCOdCaONFJC aa-ii--- 4aDS485.K25bS64 201504a954.62231 aSnedden, Christopher,eauthor.10aUnderstanding Kashmir and Kashmiris /cChristopher Snedden. 1aLondon :bHurst & Company,c2014. 1aLondon :bHurst & Company,c2015. 4c©2015 axix, 372 pages :bmaps ;c22 cm atext2rdacontent astill image2rdacontent aunmediated2rdamedia avolume2rdacarrier aIncludes bibliographical references (pages 331-355) and index. 0aJammu and Kashmir (India)xHistory. 0aJammu and Kashmir (India)xForeign relations. 0aJammu and Kashmir (India)vBoundaries. 0aJammu and Kashmir (India)xPolitics and government. a(OCoLC-M)858826393
|
data/traject.gemspec
CHANGED
@@ -24,12 +24,12 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_dependency "concurrent-ruby", ">= 0.8.0"
|
25
25
|
spec.add_dependency "marc", "~> 1.0"
|
26
26
|
|
27
|
-
spec.add_dependency "hashie", "
|
28
|
-
spec.add_dependency "slop", "
|
27
|
+
spec.add_dependency "hashie", ">= 3.1", "< 5" # used for Indexer#settings
|
28
|
+
spec.add_dependency "slop", "~> 4.0" # command line parsing
|
29
29
|
spec.add_dependency "yell" # logging
|
30
30
|
spec.add_dependency "dot-properties", ">= 0.1.1" # reading java style .properties
|
31
31
|
spec.add_dependency "httpclient", "~> 2.5"
|
32
|
-
spec.add_dependency "http", "
|
32
|
+
spec.add_dependency "http", ">= 3.0", "< 6" # used in oai_pmh_reader, may use more extensively in future instead of httpclient
|
33
33
|
spec.add_dependency 'marc-fastxmlwriter', '~>1.0' # fast marc->xml
|
34
34
|
spec.add_dependency "nokogiri", "~> 1.9" # NokogiriIndexer
|
35
35
|
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: traject
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Rochkind
|
8
8
|
- Bill Dueber
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2021-06-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: concurrent-ruby
|
@@ -43,34 +43,34 @@ dependencies:
|
|
43
43
|
name: hashie
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- - "
|
46
|
+
- - ">="
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: '3.1'
|
49
|
+
- - "<"
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '5'
|
49
52
|
type: :runtime
|
50
53
|
prerelease: false
|
51
54
|
version_requirements: !ruby/object:Gem::Requirement
|
52
55
|
requirements:
|
53
|
-
- - "
|
56
|
+
- - ">="
|
54
57
|
- !ruby/object:Gem::Version
|
55
58
|
version: '3.1'
|
59
|
+
- - "<"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '5'
|
56
62
|
- !ruby/object:Gem::Dependency
|
57
63
|
name: slop
|
58
64
|
requirement: !ruby/object:Gem::Requirement
|
59
65
|
requirements:
|
60
|
-
- - "
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version: 3.4.5
|
63
|
-
- - "<"
|
66
|
+
- - "~>"
|
64
67
|
- !ruby/object:Gem::Version
|
65
68
|
version: '4.0'
|
66
69
|
type: :runtime
|
67
70
|
prerelease: false
|
68
71
|
version_requirements: !ruby/object:Gem::Requirement
|
69
72
|
requirements:
|
70
|
-
- - "
|
71
|
-
- !ruby/object:Gem::Version
|
72
|
-
version: 3.4.5
|
73
|
-
- - "<"
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '4.0'
|
76
76
|
- !ruby/object:Gem::Dependency
|
@@ -119,16 +119,22 @@ dependencies:
|
|
119
119
|
name: http
|
120
120
|
requirement: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- - "
|
122
|
+
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '3.0'
|
125
|
+
- - "<"
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '6'
|
125
128
|
type: :runtime
|
126
129
|
prerelease: false
|
127
130
|
version_requirements: !ruby/object:Gem::Requirement
|
128
131
|
requirements:
|
129
|
-
- - "
|
132
|
+
- - ">="
|
130
133
|
- !ruby/object:Gem::Version
|
131
134
|
version: '3.0'
|
135
|
+
- - "<"
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: '6'
|
132
138
|
- !ruby/object:Gem::Dependency
|
133
139
|
name: marc-fastxmlwriter
|
134
140
|
requirement: !ruby/object:Gem::Requirement
|
@@ -219,7 +225,7 @@ dependencies:
|
|
219
225
|
- - "~>"
|
220
226
|
- !ruby/object:Gem::Version
|
221
227
|
version: '3.4'
|
222
|
-
description:
|
228
|
+
description:
|
223
229
|
email:
|
224
230
|
- none@nowhere.org
|
225
231
|
executables:
|
@@ -234,8 +240,8 @@ extra_rdoc_files:
|
|
234
240
|
- doc/settings.md
|
235
241
|
- doc/xml.md
|
236
242
|
files:
|
243
|
+
- ".github/workflows/ruby.yml"
|
237
244
|
- ".gitignore"
|
238
|
-
- ".travis.yml"
|
239
245
|
- ".yardopts"
|
240
246
|
- CHANGES.md
|
241
247
|
- Gemfile
|
@@ -251,6 +257,7 @@ files:
|
|
251
257
|
- doc/programmatic_use.md
|
252
258
|
- doc/settings.md
|
253
259
|
- doc/xml.md
|
260
|
+
- examples/marc/tiny.xml
|
254
261
|
- lib/tasks/load_maps.rake
|
255
262
|
- lib/traject.rb
|
256
263
|
- lib/traject/array_writer.rb
|
@@ -295,6 +302,7 @@ files:
|
|
295
302
|
- lib/translation_maps/marc_geographic.yaml
|
296
303
|
- lib/translation_maps/marc_instruments.yaml
|
297
304
|
- lib/translation_maps/marc_languages.yaml
|
305
|
+
- test/command_line_test.rb
|
298
306
|
- test/debug_writer_test.rb
|
299
307
|
- test/delimited_writer_test.rb
|
300
308
|
- test/experimental_nokogiri_streaming_reader_test.rb
|
@@ -330,6 +338,7 @@ files:
|
|
330
338
|
- test/test_support/bad_subfield_code.marc
|
331
339
|
- test/test_support/bad_utf_byte.utf8.marc
|
332
340
|
- test/test_support/date_resort_to_260.marc
|
341
|
+
- test/test_support/date_resort_to_264.marc
|
333
342
|
- test/test_support/date_type_r_missing_date2.marc
|
334
343
|
- test/test_support/date_with_u.marc
|
335
344
|
- test/test_support/demo_config.rb
|
@@ -377,7 +386,7 @@ homepage: http://github.com/traject/traject
|
|
377
386
|
licenses:
|
378
387
|
- MIT
|
379
388
|
metadata: {}
|
380
|
-
post_install_message:
|
389
|
+
post_install_message:
|
381
390
|
rdoc_options: []
|
382
391
|
require_paths:
|
383
392
|
- lib
|
@@ -392,13 +401,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
392
401
|
- !ruby/object:Gem::Version
|
393
402
|
version: '0'
|
394
403
|
requirements: []
|
395
|
-
|
396
|
-
|
397
|
-
signing_key:
|
404
|
+
rubygems_version: 3.0.3
|
405
|
+
signing_key:
|
398
406
|
specification_version: 4
|
399
407
|
summary: An easy to use, high-performance, flexible and extensible metadata transformation
|
400
408
|
system, focused on library-archives-museums input, and indexing to Solr as output.
|
401
409
|
test_files:
|
410
|
+
- test/command_line_test.rb
|
402
411
|
- test/debug_writer_test.rb
|
403
412
|
- test/delimited_writer_test.rb
|
404
413
|
- test/experimental_nokogiri_streaming_reader_test.rb
|
@@ -434,6 +443,7 @@ test_files:
|
|
434
443
|
- test/test_support/bad_subfield_code.marc
|
435
444
|
- test/test_support/bad_utf_byte.utf8.marc
|
436
445
|
- test/test_support/date_resort_to_260.marc
|
446
|
+
- test/test_support/date_resort_to_264.marc
|
437
447
|
- test/test_support/date_type_r_missing_date2.marc
|
438
448
|
- test/test_support/date_with_u.marc
|
439
449
|
- test/test_support/demo_config.rb
|