berkeley_library-tind 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/build.yml +1 -1
  3. data/.idea/inspectionProfiles/Project_Default.xml +18 -0
  4. data/.idea/tind.iml +91 -91
  5. data/.ruby-version +1 -1
  6. data/CHANGES.md +33 -1
  7. data/README.md +15 -1
  8. data/berkeley_library-tind.gemspec +3 -2
  9. data/lib/berkeley_library/tind/api/api.rb +17 -11
  10. data/lib/berkeley_library/tind/api/collection.rb +1 -1
  11. data/lib/berkeley_library/tind/api/search.rb +2 -2
  12. data/lib/berkeley_library/tind/export/exporter.rb +1 -1
  13. data/lib/berkeley_library/tind/export/table.rb +1 -1
  14. data/lib/berkeley_library/tind/export/table_metrics.rb +1 -1
  15. data/lib/berkeley_library/tind/marc/xml_builder.rb +62 -0
  16. data/lib/berkeley_library/tind/marc/xml_reader.rb +32 -19
  17. data/lib/berkeley_library/tind/marc/xml_writer.rb +152 -0
  18. data/lib/berkeley_library/tind/module_info.rb +1 -1
  19. data/lib/berkeley_library/util/files.rb +39 -0
  20. data/lib/berkeley_library/util/ods/spreadsheet.rb +1 -1
  21. data/lib/berkeley_library/util/ods/xml/element_node.rb +1 -1
  22. data/spec/berkeley_library/tind/export/export_spec.rb +3 -1
  23. data/spec/berkeley_library/tind/export/table_spec.rb +2 -0
  24. data/spec/berkeley_library/tind/marc/xml_reader_spec.rb +42 -1
  25. data/spec/berkeley_library/tind/marc/xml_writer_spec.rb +156 -0
  26. data/spec/data/new-records.xml +46 -0
  27. metadata +36 -39
  28. data/Jenkinsfile +0 -18
  29. data/lib/berkeley_library/util/arrays.rb +0 -178
  30. data/lib/berkeley_library/util/logging.rb +0 -1
  31. data/lib/berkeley_library/util/paths.rb +0 -111
  32. data/lib/berkeley_library/util/stringios.rb +0 -30
  33. data/lib/berkeley_library/util/strings.rb +0 -42
  34. data/lib/berkeley_library/util/sys_exits.rb +0 -15
  35. data/lib/berkeley_library/util/times.rb +0 -22
  36. data/lib/berkeley_library/util/uris/appender.rb +0 -162
  37. data/lib/berkeley_library/util/uris/requester.rb +0 -62
  38. data/lib/berkeley_library/util/uris/validator.rb +0 -32
  39. data/lib/berkeley_library/util/uris.rb +0 -44
  40. data/spec/berkeley_library/util/arrays_spec.rb +0 -340
  41. data/spec/berkeley_library/util/paths_spec.rb +0 -90
  42. data/spec/berkeley_library/util/stringios_spec.rb +0 -34
  43. data/spec/berkeley_library/util/strings_spec.rb +0 -27
  44. data/spec/berkeley_library/util/times_spec.rb +0 -39
  45. data/spec/berkeley_library/util/uris_spec.rb +0 -118
@@ -1,90 +0,0 @@
1
- require 'spec_helper'
2
- require 'berkeley_library/util/paths'
3
-
4
- module BerkeleyLibrary::Util
5
- describe Paths do
6
- describe :clean do
7
- {
8
- # nil
9
- nil => nil,
10
-
11
- # Already clean
12
- '' => '.',
13
- 'abc' => 'abc',
14
- 'abc/def' => 'abc/def',
15
- 'a/b/c' => 'a/b/c',
16
- '.' => '.',
17
- '..' => '..',
18
- '../..' => '../..',
19
- '../../abc' => '../../abc',
20
- '/abc' => '/abc',
21
- '/' => '/',
22
-
23
- # Remove trailing slash
24
- 'abc/' => 'abc',
25
- 'abc/def/' => 'abc/def',
26
- 'a/b/c/' => 'a/b/c',
27
- './' => '.',
28
- '../' => '..',
29
- '../../' => '../..',
30
- '/abc/' => '/abc',
31
-
32
- # Remove doubled slash
33
- 'abc//def//ghi' => 'abc/def/ghi',
34
- '//abc' => '/abc',
35
- '///abc' => '/abc',
36
- '//abc//' => '/abc',
37
- 'abc//' => 'abc',
38
-
39
- # Remove . elements
40
- 'abc/./def' => 'abc/def',
41
- '/./abc/def' => '/abc/def',
42
- 'abc/.' => 'abc',
43
-
44
- # Remove .. elements
45
- 'abc/def/ghi/../jkl' => 'abc/def/jkl',
46
- 'abc/def/../ghi/../jkl' => 'abc/jkl',
47
- 'abc/def/..' => 'abc',
48
- 'abc/def/../..' => '.',
49
- '/abc/def/../..' => '/',
50
- 'abc/def/../../..' => '..',
51
- '/abc/def/../../..' => '/',
52
- 'abc/def/../../../ghi/jkl/../../../mno' => '../../mno',
53
-
54
- # Combinations
55
- 'abc/./../def' => 'def',
56
- 'abc//./../def' => 'def',
57
- 'abc/../../././../def' => '../../def'
58
- }.each do |orig, expected|
59
- it "clean(#{orig.inspect}) -> #{expected.inspect}" do
60
- expect(Paths.clean(orig)).to eq(expected)
61
- end
62
- end
63
- end
64
-
65
- describe :join do
66
- {
67
- # zero parameters
68
- [] => '',
69
-
70
- # one parameter
71
- [''] => '',
72
- ['a'] => 'a',
73
-
74
- # two parameters
75
- ['a', 'b'] => 'a/b',
76
- ['a', ''] => 'a',
77
- ['', 'b'] => 'b',
78
- ['/', 'a'] => '/a',
79
- ['/', ''] => '/',
80
- ['a/', 'b'] => 'a/b',
81
- ['a/', ''] => 'a',
82
- ['', ''] => ''
83
- }.each do |orig, expected|
84
- it "join(#{orig.map(&:inspect).join(', ')}) -> #{expected.inspect}" do
85
- expect(Paths.join(*orig)).to eq(expected)
86
- end
87
- end
88
- end
89
- end
90
- end
@@ -1,34 +0,0 @@
1
- require 'spec_helper'
2
-
3
- require 'berkeley_library/util/stringios'
4
-
5
- module BerkeleyLibrary
6
- module Util
7
- describe StringIOs do
8
- describe :getbyte do
9
- let(:s) { '祇園精舎の鐘の声、諸行無常の響きあり。' }
10
- let(:bytes) { s.bytes }
11
- let(:sio) { StringIO.new(s) }
12
-
13
- it 'gets the byte at the specified byte index' do
14
- bytes.each_with_index do |b, i|
15
- expect(StringIOs.getbyte(sio, i)).to eq(b)
16
- end
17
- end
18
-
19
- it 'resets the current offset' do
20
- StringIOs.getbyte(sio, bytes.size / 2)
21
- expect(sio.pos).to eq(0)
22
- end
23
-
24
- it 'returns nil for a too-large positive offset' do
25
- expect(StringIOs.getbyte(s, bytes.size)).to be_nil
26
- end
27
-
28
- it 'returns nil for a too-large negative offset' do
29
- expect(StringIOs.getbyte(s, -(1 + bytes.size))).to be_nil
30
- end
31
- end
32
- end
33
- end
34
- end
@@ -1,27 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module BerkeleyLibrary
4
- module Util
5
- describe Strings do
6
- describe :diff_index do
7
- it 'returns nil for identical strings' do
8
- s = 'elvis'
9
- expect(Strings.diff_index(s, s)).to be_nil
10
- end
11
-
12
- it 'returns the index for different strings' do
13
- s1 = 'elvis aaron presley'
14
- s2 = 'elvis nikita presley'
15
- expect(Strings.diff_index(s1, s2)).to eq(6)
16
- end
17
-
18
- it 'returns the length of the shorter string for prefixes' do
19
- s1 = 'elvis'
20
- s2 = 'elvis aaron presley'
21
- expect(Strings.diff_index(s1, s2)).to eq(5)
22
- expect(Strings.diff_index(s2, s1)).to eq(5)
23
- end
24
- end
25
- end
26
- end
27
- end
@@ -1,39 +0,0 @@
1
- require 'spec_helper'
2
- require 'berkeley_library/util/times'
3
-
4
- module BerkeleyLibrary
5
- module Util
6
- describe Times do
7
- describe :ensure_utc do
8
- it 'returns a UTC time unchanged' do
9
- time = Time.parse('2021-02-05 16:19:11.37707 -0800')
10
- utc_time = time.getutc
11
- expect(Times.ensure_utc(utc_time)).to be(utc_time)
12
- end
13
-
14
- it 'converts a non-UTC time' do
15
- time = Time.parse('2021-02-06 08:19:11.37707 +0800')
16
- expect(Times.ensure_utc(time)).to eq(time.getutc)
17
- expect(time.gmt_offset).to eq(28_800), 'Times.ensure_utc() should not modify its argument'
18
- end
19
-
20
- it 'accepts a Date' do
21
- date = Date.new(2021, 2, 6)
22
- utc_time = Time.new(2021, 2, 6).getutc
23
- expect(Times.ensure_utc(date)).to eq(utc_time)
24
- end
25
-
26
- it 'accepts a Datetime' do
27
- datetime = DateTime.parse('2021-02-05 16:19:11.37707 -0800')
28
- utc_time = Time.parse('2021-02-06 00:19:11.37707 UTC')
29
- expect(Times.ensure_utc(datetime)).to eq(utc_time)
30
- end
31
-
32
- it 'rejects non-date/time objects' do
33
- # noinspection RubyYardParamTypeMatch
34
- expect { Times.ensure_utc(Object.new) }.to raise_error(ArgumentError)
35
- end
36
- end
37
- end
38
- end
39
- end
@@ -1,118 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module BerkeleyLibrary::Util
4
- describe URIs do
5
- describe :append do
6
- it 'appends paths' do
7
- original_uri = URI('https://example.org/foo/bar')
8
- new_uri = URIs.append(original_uri, 'qux', 'corge', 'garply')
9
- expect(new_uri).to eq(URI('https://example.org/foo/bar/qux/corge/garply'))
10
- end
11
-
12
- it 'does not modify the original URI' do
13
- original_uri = URI('https://example.org/foo/bar')
14
- original_url = original_uri.to_s
15
- new_uri = URIs.append(original_uri, 'qux', 'corge', 'garply')
16
- expect(new_uri).not_to be(original_uri)
17
- expect(original_uri.to_s).to eq(original_url)
18
- end
19
-
20
- it 'removes extraneous slashes' do
21
- original_uri = URI('https://example.org/foo/bar')
22
- new_uri = URIs.append(original_uri, '/qux', '/corge/', '//garply')
23
- expect(new_uri).to eq(URI('https://example.org/foo/bar/qux/corge/garply'))
24
- end
25
-
26
- it 'preserves queries' do
27
- original_uri = URI('https://example.org/foo/bar?baz=qux')
28
- new_uri = URIs.append(original_uri, '/qux', '/corge/', '//garply')
29
- expect(new_uri).to eq(URI('https://example.org/foo/bar/qux/corge/garply?baz=qux'))
30
- end
31
-
32
- it 'preserves fragments' do
33
- original_uri = URI('https://example.org/foo/bar#baz')
34
- new_uri = URIs.append(original_uri, '/qux', '/corge/', '//garply')
35
- expect(new_uri).to eq(URI('https://example.org/foo/bar/qux/corge/garply#baz'))
36
- end
37
-
38
- it 'accepts a query string if no previous query present' do
39
- original_uri = URI('https://example.org/foo/bar#baz')
40
- new_uri = URIs.append(original_uri, '/qux', '/corge/', '//garply?grault=xyzzy')
41
- expect(new_uri).to eq(URI('https://example.org/foo/bar/qux/corge/garply?grault=xyzzy#baz'))
42
- end
43
-
44
- it 'allows the ? to be passed separately' do
45
- original_uri = URI('https://example.org/foo/bar#baz')
46
- new_uri = URIs.append(original_uri, '/qux', '/corge/', '//garply', '?', 'grault=xyzzy')
47
- expect(new_uri).to eq(URI('https://example.org/foo/bar/qux/corge/garply?grault=xyzzy#baz'))
48
- end
49
-
50
- it 'appends query parameters with &' do
51
- original_uri = URI('https://example.org/foo/bar#baz')
52
- new_uri = URIs.append(original_uri, '/qux', '/corge/', '//garply?grault=xyzzy', '&plugh=flob')
53
- expect(new_uri).to eq(URI('https://example.org/foo/bar/qux/corge/garply?grault=xyzzy&plugh=flob#baz'))
54
- end
55
-
56
- it 'appends query parameters to original URI query' do
57
- original_uri = URI('https://example.org/foo/bar/qux/corge/garply?grault=xyzzy')
58
- new_uri = URIs.append(original_uri, '&plugh=flob')
59
- expect(new_uri).to eq(URI('https://example.org/foo/bar/qux/corge/garply?grault=xyzzy&plugh=flob'))
60
- end
61
-
62
- it 'treats & as a path element if no query is present' do
63
- original_uri = URI('https://example.org/foo/bar#baz')
64
- new_uri = URIs.append(original_uri, '/qux', '/corge/', 'garply', '&plugh=flob')
65
- expect(new_uri).to eq(URI('https://example.org/foo/bar/qux/corge/garply/&plugh=flob#baz'))
66
- end
67
-
68
- it 'accepts a fragment if no previous fragment present' do
69
- original_uri = URI('https://example.org/foo/bar?baz=qux')
70
- new_uri = URIs.append(original_uri, '/qux', '/corge/', '//garply#grault')
71
- expect(new_uri).to eq(URI('https://example.org/foo/bar/qux/corge/garply?baz=qux#grault'))
72
- end
73
-
74
- it 'rejects a query string if the original URI already has one' do
75
- original_uri = URI('https://example.org/foo/bar?baz=qux')
76
- expect { URIs.append(original_uri, '/qux?corge') }.to raise_error(URI::InvalidComponentError)
77
- end
78
-
79
- it 'rejects a fragment if the original URI already has one' do
80
- original_uri = URI('https://example.org/foo/bar#baz')
81
- expect { URIs.append(original_uri, '/qux#corge') }.to raise_error(URI::InvalidComponentError)
82
- end
83
-
84
- it 'rejects appending multiple queries' do
85
- original_uri = URI('https://example.org/foo/bar')
86
- expect { URIs.append(original_uri, 'baz?qux=corge', 'grault?plugh=xyzzy') }.to raise_error(URI::InvalidComponentError)
87
- end
88
-
89
- it 'rejects appending multiple fragments' do
90
- original_uri = URI('https://example.org/foo/bar')
91
- expect { URIs.append(original_uri, 'baz#qux', 'grault#plugh') }.to raise_error(URI::InvalidComponentError)
92
- end
93
-
94
- it 'rejects queries after fragments' do
95
- original_uri = URI('https://example.org/foo/bar')
96
- expect { URIs.append(original_uri, 'baz#qux', '?grault=plugh') }.to raise_error(URI::InvalidComponentError)
97
- end
98
-
99
- it 'correctly handles fragments in mid-path-segment' do
100
- original_uri = URI('https://example.org/foo/bar')
101
- new_uri = URIs.append(original_uri, 'qux#corge')
102
- expect(new_uri).to eq(URI('https://example.org/foo/bar/qux#corge'))
103
- end
104
-
105
- it 'correctly handles fragments in query start' do
106
- original_uri = URI('https://example.org/foo/bar')
107
- new_uri = URIs.append(original_uri, '?qux=corge&grault=plugh#xyzzy')
108
- expect(new_uri).to eq(URI('https://example.org/foo/bar?qux=corge&grault=plugh#xyzzy'))
109
- end
110
-
111
- it 'correctly handles fragments in mid-query' do
112
- original_uri = URI('https://example.org/foo/bar')
113
- new_uri = URIs.append(original_uri, '?qux=corge', '&grault=plugh#xyzzy')
114
- expect(new_uri).to eq(URI('https://example.org/foo/bar?qux=corge&grault=plugh#xyzzy'))
115
- end
116
- end
117
- end
118
- end