marcspec 0.7.3 → 0.8.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +6 -0
- data/VERSION +1 -1
- data/lib/marcspec/controlfieldspec.rb +6 -2
- data/lib/marcspec/customspec.rb +1 -1
- data/lib/marcspec/leaderspec.rb +1 -1
- data/lib/marcspec/solrfieldspec.rb +4 -2
- data/lib/marcspec/specset.rb +1 -1
- data/lib/marcspec/variablefieldspec.rb +4 -4
- data/spec/{variablefieldspec_spec.rb → marcfieldspecs_spec.rb} +88 -0
- data/spec/solrfieldspec_spec.rb +20 -0
- data/spec/specset_spec.rb +6 -8
- metadata +7 -11
- data/spec/controlfieldspec_spec.rb +0 -52
- data/spec/leaderspec_spec.rb +0 -35
data/CHANGES
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
0.8.1
|
2
|
+
* Added some specs, squashed some bugs. In particular, make sure the Range passed to a ControlField
|
3
|
+
makes sense (x..y, where x<=y and x > 0)
|
4
|
+
0.8.0
|
5
|
+
* Changed the syntax for a variable field from ['245', '*', '*', 'ab'] to just ['245', 'ab']. We'll worry
|
6
|
+
about indicators when that bridge gets crossed.
|
1
7
|
0.7.3
|
2
8
|
* Squashed a bug where I forgot to deal with escaping in java .properties files. Now I'm just using
|
3
9
|
a real Java Properties object so I don't have to worry about it.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.8.1
|
@@ -21,7 +21,7 @@ module MARCSpec
|
|
21
21
|
|
22
22
|
def initialize (tag, range=nil)
|
23
23
|
unless MARC4J4R::ControlField.control_tag? tag
|
24
|
-
raise ArgumentError "Tag must be a control tag"
|
24
|
+
raise ArgumentError, "Tag must be a control tag"
|
25
25
|
end
|
26
26
|
@tag = tag
|
27
27
|
self.range = range
|
@@ -53,7 +53,11 @@ module MARCSpec
|
|
53
53
|
@range = range..range
|
54
54
|
|
55
55
|
elsif range.is_a? Range
|
56
|
-
|
56
|
+
if range.begin < 1 or range.begin > range.end
|
57
|
+
raise ArgumentError "Range must be one-based, with the start before the end, not #{range}"
|
58
|
+
else
|
59
|
+
@range = range
|
60
|
+
end
|
57
61
|
else
|
58
62
|
raise ArgumentError, "Range must be nil, an integer offset (1-based), or a Range, not #{range.inspect}"
|
59
63
|
end
|
data/lib/marcspec/customspec.rb
CHANGED
@@ -54,7 +54,7 @@ module MARCSpec
|
|
54
54
|
@functionSymbol = opts[:functionSymbol]
|
55
55
|
|
56
56
|
unless @solrField and @module and @functionSymbol
|
57
|
-
raise ArgumentError, "Custom solr spec must have a field name in :solrField, module in :module, and the
|
57
|
+
raise ArgumentError, "Custom solr spec must have a field name in :solrField, module in :module, and the function name as a symbol in :functionSymbol"
|
58
58
|
end
|
59
59
|
|
60
60
|
|
data/lib/marcspec/leaderspec.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'stringio'
|
2
|
+
require 'marc4j4r/controlfield'
|
3
|
+
|
2
4
|
module MARCSpec
|
3
5
|
class SolrFieldSpec
|
4
6
|
attr_accessor :solrField, :first, :map, :noMapKeyDefault, :marcfieldspecs, :default, :arity
|
@@ -77,10 +79,10 @@ module MARCSpec
|
|
77
79
|
def self.fromHash h
|
78
80
|
sfs = self.new(h)
|
79
81
|
h[:specs].each do |s|
|
80
|
-
if
|
82
|
+
if MARC4J4R::ControlField.control_tag? s[0]
|
81
83
|
sfs << MARCSpec::ControlFieldSpec.new(*s)
|
82
84
|
else
|
83
|
-
sfs << MARCSpec::VariableFieldSpec.new(s[0], s[
|
85
|
+
sfs << MARCSpec::VariableFieldSpec.new(s[0], s[1], s[2])
|
84
86
|
end
|
85
87
|
end
|
86
88
|
return sfs
|
data/lib/marcspec/specset.rb
CHANGED
@@ -15,7 +15,7 @@ module MARCSpec
|
|
15
15
|
|
16
16
|
class VariableFieldSpec
|
17
17
|
|
18
|
-
attr_accessor :tag, :codes, :joiner
|
18
|
+
attr_accessor :tag, :codes, :joiner, :ind1, :ind2
|
19
19
|
|
20
20
|
def initialize tag, codes=nil, joiner=' '
|
21
21
|
@tag = tag
|
@@ -63,16 +63,16 @@ module MARCSpec
|
|
63
63
|
def asPPString
|
64
64
|
s = StringIO.new
|
65
65
|
if @joiner and @joiner != ' '
|
66
|
-
PP.pp([@tag,
|
66
|
+
PP.pp([@tag, @codes.join(''), @joiner], s)
|
67
67
|
else
|
68
|
-
PP.pp([@tag,
|
68
|
+
PP.pp([@tag, @codes.join('')], s)
|
69
69
|
end
|
70
70
|
return s.string
|
71
71
|
end
|
72
72
|
|
73
73
|
def self.fromPPString str
|
74
74
|
a = eval(str)
|
75
|
-
return self.new(a[0], a[
|
75
|
+
return self.new(a[0], a[1], a[2])
|
76
76
|
end
|
77
77
|
|
78
78
|
end
|
@@ -18,6 +18,94 @@ require 'spec_helper'
|
|
18
18
|
# 852 $a American Folklife Center, Library of Congress
|
19
19
|
# 852 $a DLC
|
20
20
|
|
21
|
+
describe "ControlFieldSpec" do
|
22
|
+
|
23
|
+
before do
|
24
|
+
@one = MARC4J4R::Reader.new("#{DIR}/data/one.dat").first
|
25
|
+
# @batch = MARC4J4R::Reader.new("#{DIR}/batch.dat").collect
|
26
|
+
end
|
27
|
+
|
28
|
+
# afc99990058366 # data
|
29
|
+
# 01234567890123 # index
|
30
|
+
it "gets a single full value" do
|
31
|
+
cfs = MARCSpec::ControlFieldSpec.new('001')
|
32
|
+
cfs.marc_values(@one).should.equal ["afc99990058366"]
|
33
|
+
end
|
34
|
+
|
35
|
+
it "gets a single character" do
|
36
|
+
cfs = MARCSpec::ControlFieldSpec.new('001', 10 )
|
37
|
+
cfs.marc_values(@one).should.equal ['8']
|
38
|
+
end
|
39
|
+
|
40
|
+
it "gets a range of characters" do
|
41
|
+
cfs = MARCSpec::ControlFieldSpec.new('001', 6..10 )
|
42
|
+
cfs.marc_values(@one).should.equal ['90058']
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should round trip" do
|
46
|
+
cfs = MARCSpec::ControlFieldSpec.new('001', 6..10 )
|
47
|
+
cfs2 = MARCSpec::ControlFieldSpec.fromPPString(cfs.asPPString)
|
48
|
+
cfs.should.equal cfs2
|
49
|
+
end
|
50
|
+
|
51
|
+
it "throws an error if you try to use a datafield tag" do
|
52
|
+
lambda{
|
53
|
+
cfs = MARCSpec::ControlFieldSpec.new('010', 6..10 )
|
54
|
+
}.should.raise ArgumentError
|
55
|
+
end
|
56
|
+
|
57
|
+
it "accepts various forms for the range" do
|
58
|
+
cfs1 = MARCSpec::ControlFieldSpec.new('001')
|
59
|
+
cfs2 = MARCSpec::ControlFieldSpec.new('001')
|
60
|
+
cfs3 = MARCSpec::ControlFieldSpec.new('001')
|
61
|
+
|
62
|
+
# Range 4-7 is 9999
|
63
|
+
cfs1.range = 4
|
64
|
+
cfs2.range = 4..4
|
65
|
+
cfs1.marc_values(@one).should.equal ['9']
|
66
|
+
cfs2.marc_values(@one).should.equal ['9']
|
67
|
+
end
|
68
|
+
|
69
|
+
it "rejects bad ranges" do
|
70
|
+
lambda{
|
71
|
+
cfs = MARCSpec::ControlFieldSpec.new('010', -1)
|
72
|
+
}.should.raise ArgumentError
|
73
|
+
|
74
|
+
lambda{
|
75
|
+
cfs = MARCSpec::ControlFieldSpec.new('010', -1..3)
|
76
|
+
}.should.raise ArgumentError
|
77
|
+
|
78
|
+
lambda{
|
79
|
+
cfs = MARCSpec::ControlFieldSpec.new('010', [1,2,3])
|
80
|
+
}.should.raise ArgumentError
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
describe "LeaderSpec" do
|
86
|
+
before do
|
87
|
+
@one = MARC4J4R::Reader.new("#{DIR}/data/one.dat").first
|
88
|
+
end
|
89
|
+
|
90
|
+
it "must use LDR as the tag" do
|
91
|
+
lambda{
|
92
|
+
cfs = MARCSpec::LeaderSpec.new('008')
|
93
|
+
}.should.raise ArgumentError
|
94
|
+
end
|
95
|
+
|
96
|
+
it "Works with full leader" do
|
97
|
+
cfs = MARCSpec::LeaderSpec.new('LDR')
|
98
|
+
cfs.marc_values(@one).should.equal @one.leader
|
99
|
+
end
|
100
|
+
|
101
|
+
it "Works with substring of leader" do
|
102
|
+
cfs = MARCSpec::LeaderSpec.new('LDR', 3..5)
|
103
|
+
cfs.marc_values(@one).should.equal @one.leader[3..5]
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
|
108
|
+
|
21
109
|
describe "VariableFieldSpec" do
|
22
110
|
before do
|
23
111
|
@one = MARC4J4R::Reader.new("#{DIR}/data/one.dat").first
|
data/spec/solrfieldspec_spec.rb
CHANGED
@@ -164,6 +164,18 @@ describe "CustomSolrSpec" do
|
|
164
164
|
@map = MARCSpec::KVMap.new('nameOfTheMap', {@titleACValue.upcase => @mapValue, @default=>@mapValueForDefault})
|
165
165
|
end
|
166
166
|
|
167
|
+
it "requires solrfield, module, and function" do
|
168
|
+
lambda{
|
169
|
+
css = MARCSpec::CustomSolrSpec.new(:solrField=>'solrField')
|
170
|
+
}.should.raise ArgumentError
|
171
|
+
lambda{
|
172
|
+
css = MARCSpec::CustomSolrSpec.new(:solrField=>'solrField', :module=>A::B)
|
173
|
+
}.should.raise ArgumentError
|
174
|
+
lambda{
|
175
|
+
css = MARCSpec::CustomSolrSpec.new(:module=>A::B, :functionSymbol=>:titleUp)
|
176
|
+
}.should.raise ArgumentError
|
177
|
+
end
|
178
|
+
|
167
179
|
it "works with no args or map" do
|
168
180
|
css = MARCSpec::CustomSolrSpec.new(:solrField=>'solrField', :module=>A::B, :functionSymbol=>:titleUp)
|
169
181
|
css.marc_values(@one).should.equal [@one['245'].value.upcase]
|
@@ -191,6 +203,14 @@ describe "CustomSolrSpec" do
|
|
191
203
|
css.marc_values(@one).should.equal ['two', 'one']
|
192
204
|
end
|
193
205
|
|
206
|
+
it "disallows multispecs with maps or default values" do
|
207
|
+
lambda{
|
208
|
+
css = MARCSpec::CustomSolrSpec.new(:solrField=>['s1', 's2'], :module=>A::B, :functionSymbol=>:titleUp, :map=>@map)
|
209
|
+
}.should.raise ArgumentError
|
210
|
+
lambda{
|
211
|
+
css = MARCSpec::CustomSolrSpec.new(:solrField=>['s1', 's2'], :module=>A::B, :functionSymbol=>:titleUp, :default=>"bill")
|
212
|
+
}.should.raise ArgumentError
|
213
|
+
end
|
194
214
|
|
195
215
|
end
|
196
216
|
|
data/spec/specset_spec.rb
CHANGED
@@ -41,15 +41,15 @@ describe "SpecSet Basics" do
|
|
41
41
|
{
|
42
42
|
:solrField=> "places",
|
43
43
|
:specs => [
|
44
|
-
["260",
|
45
|
-
["651",
|
46
|
-
["651",
|
44
|
+
["260", "a"],
|
45
|
+
["651", "a"],
|
46
|
+
["651", "z"],
|
47
47
|
]
|
48
48
|
},
|
49
|
-
{:solrField=>'title', :specs=>[['245'
|
49
|
+
{:solrField=>'title', :specs=>[['245']]},
|
50
50
|
{
|
51
51
|
:solrField => 'titleA',
|
52
|
-
:specs => [['245',
|
52
|
+
:specs => [['245', 'a']]
|
53
53
|
}
|
54
54
|
]
|
55
55
|
end
|
@@ -74,7 +74,7 @@ describe "SpecSet Basics" do
|
|
74
74
|
end
|
75
75
|
|
76
76
|
it "should allow repeated solrFields" do
|
77
|
-
@speclist << {:solrField=>'titleA', :specs=>[['260',
|
77
|
+
@speclist << {:solrField=>'titleA', :specs=>[['260', 'c']]} # '1939.'
|
78
78
|
expected = @titleA
|
79
79
|
expected << '1939.'
|
80
80
|
ss = MARCSpec::SpecSet.new
|
@@ -95,8 +95,6 @@ describe "SpecSet Basics" do
|
|
95
95
|
h['two'].should.equal [2]
|
96
96
|
h['letters'].should.equal ['a', 'b']
|
97
97
|
end
|
98
|
-
|
99
|
-
|
100
98
|
end
|
101
99
|
|
102
100
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: marcspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 61
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 8
|
9
|
+
- 1
|
10
|
+
version: 0.8.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- BillDueber
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-09-04 00:00:00 -04:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -123,12 +123,10 @@ files:
|
|
123
123
|
- spec/data/umich/translation_maps/location_map.properties
|
124
124
|
- spec/data/umich/umich_index.properties
|
125
125
|
- spec/maps_spec.rb
|
126
|
+
- spec/marcfieldspecs_spec.rb
|
126
127
|
- spec/solrfieldspec_spec.rb
|
127
128
|
- spec/spec_helper.rb
|
128
129
|
- spec/specset_spec.rb
|
129
|
-
- spec/controlfieldspec_spec.rb
|
130
|
-
- spec/leaderspec_spec.rb
|
131
|
-
- spec/variablefieldspec_spec.rb
|
132
130
|
has_rdoc: true
|
133
131
|
homepage: http://github.com/billdueber/marcspec
|
134
132
|
licenses: []
|
@@ -164,10 +162,8 @@ signing_key:
|
|
164
162
|
specification_version: 3
|
165
163
|
summary: Extract data from MARC records and send to Solr
|
166
164
|
test_files:
|
167
|
-
- spec/controlfieldspec_spec.rb
|
168
|
-
- spec/leaderspec_spec.rb
|
169
165
|
- spec/maps_spec.rb
|
166
|
+
- spec/marcfieldspecs_spec.rb
|
170
167
|
- spec/solrfieldspec_spec.rb
|
171
168
|
- spec/spec_helper.rb
|
172
169
|
- spec/specset_spec.rb
|
173
|
-
- spec/variablefieldspec_spec.rb
|
@@ -1,52 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
# LEADER 00734njm a2200217uu 4500
|
4
|
-
# 001 afc99990058366
|
5
|
-
# 003 DLC
|
6
|
-
# 005 20071104155141.9
|
7
|
-
# 007 sd ummunniauub
|
8
|
-
# 008 071103s1939 xxufmnne||||||||| u eng||
|
9
|
-
# 010 $a afc99990058366
|
10
|
-
# 040 $a DLC $c DLC
|
11
|
-
# 245 04 $a The Texas ranger $h [sound recording] / $c Sung by Beale D. Taylor.
|
12
|
-
# 260 $a Medina, Texas, $c 1939.
|
13
|
-
# 300 $a 1 sound disc : $b analog, 33 1/3 rpm, mono. ; $c 12 in.
|
14
|
-
# 651 0 $a Medina $z Texas $z United States of America.
|
15
|
-
# 700 1 $a Lomax, John Avery, 1867-1948 $e Recording engineer.
|
16
|
-
# 700 1 $a Lomax, Ruby T. (Ruby Terrill) $e Recording engineer.
|
17
|
-
# 700 1 $a Taylor, Beale D. $e Singer.
|
18
|
-
# 852 $a American Folklife Center, Library of Congress
|
19
|
-
# 852 $a DLC
|
20
|
-
|
21
|
-
describe "ControlFieldSpec" do
|
22
|
-
|
23
|
-
before do
|
24
|
-
@one = MARC4J4R::Reader.new("#{DIR}/data/one.dat").first
|
25
|
-
# @batch = MARC4J4R::Reader.new("#{DIR}/batch.dat").collect
|
26
|
-
end
|
27
|
-
|
28
|
-
# afc99990058366 # data
|
29
|
-
# 01234567890123 # index
|
30
|
-
it "gets a single full value" do
|
31
|
-
cfs = MARCSpec::ControlFieldSpec.new('001')
|
32
|
-
cfs.marc_values(@one).should.equal ["afc99990058366"]
|
33
|
-
end
|
34
|
-
|
35
|
-
it "gets a single character" do
|
36
|
-
cfs = MARCSpec::ControlFieldSpec.new('001', 10 )
|
37
|
-
cfs.marc_values(@one).should.equal ['8']
|
38
|
-
end
|
39
|
-
|
40
|
-
it "gets a range of characters" do
|
41
|
-
cfs = MARCSpec::ControlFieldSpec.new('001', 6..10 )
|
42
|
-
cfs.marc_values(@one).should.equal ['90058']
|
43
|
-
end
|
44
|
-
|
45
|
-
it "should round trip" do
|
46
|
-
cfs = MARCSpec::ControlFieldSpec.new('001', 6..10 )
|
47
|
-
cfs2 = MARCSpec::ControlFieldSpec.fromPPString(cfs.asPPString)
|
48
|
-
cfs.should.equal cfs2
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
|
data/spec/leaderspec_spec.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
# LEADER 00734njm a2200217uu 4500
|
4
|
-
# 001 afc99990058366
|
5
|
-
# 003 DLC
|
6
|
-
# 005 20071104155141.9
|
7
|
-
# 007 sd ummunniauub
|
8
|
-
# 008 071103s1939 xxufmnne||||||||| u eng||
|
9
|
-
# 010 $a afc99990058366
|
10
|
-
# 040 $a DLC $c DLC
|
11
|
-
# 245 04 $a The Texas ranger $h [sound recording] / $c Sung by Beale D. Taylor.
|
12
|
-
# 260 $a Medina, Texas, $c 1939.
|
13
|
-
# 300 $a 1 sound disc : $b analog, 33 1/3 rpm, mono. ; $c 12 in.
|
14
|
-
# 651 0 $a Medina $z Texas $z United States of America.
|
15
|
-
# 700 1 $a Lomax, John Avery, 1867-1948 $e Recording engineer.
|
16
|
-
# 700 1 $a Lomax, Ruby T. (Ruby Terrill) $e Recording engineer.
|
17
|
-
# 700 1 $a Taylor, Beale D. $e Singer.
|
18
|
-
# 852 $a American Folklife Center, Library of Congress
|
19
|
-
# 852 $a DLC
|
20
|
-
|
21
|
-
describe "LeaderSpec" do
|
22
|
-
before do
|
23
|
-
@one = MARC4J4R::Reader.new("#{DIR}/data/one.dat").first
|
24
|
-
end
|
25
|
-
|
26
|
-
it "Works with full leader" do
|
27
|
-
cfs = MARCSpec::LeaderSpec.new('LDR')
|
28
|
-
cfs.marc_values(@one).should.equal @one.leader
|
29
|
-
end
|
30
|
-
|
31
|
-
it "Works with substring of leader" do
|
32
|
-
cfs = MARCSpec::LeaderSpec.new('LDR', 3..5)
|
33
|
-
cfs.marc_values(@one).should.equal @one.leader[3..5]
|
34
|
-
end
|
35
|
-
end
|