marcspec 1.1.1 → 1.5.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.
- data/CHANGES +2 -0
- data/README.rdoc +4 -1
- data/VERSION +1 -1
- data/lib/marcspec/controlfieldspec.rb +4 -2
- data/lib/marcspec/customspec.rb +6 -11
- data/lib/marcspec/dsl.rb +139 -0
- data/lib/marcspec/map.rb +7 -0
- data/lib/marcspec/multivaluemap.rb +42 -10
- data/lib/marcspec/solrfieldspec.rb +8 -6
- data/lib/marcspec/specset.rb +30 -2
- data/lib/marcspec/variablefieldspec.rb +3 -1
- data/lib/marcspec.rb +1 -1
- data/spec/data/simplemap.rb +14 -0
- data/spec/dsl_spec.rb +370 -0
- data/spec/maps_spec.rb +87 -52
- data/spec/solrfieldspec_spec.rb +0 -11
- data/spec/specset_spec.rb +6 -0
- metadata +10 -5
data/CHANGES
CHANGED
data/README.rdoc
CHANGED
@@ -4,7 +4,10 @@ The MARCSpec contains classes designed to make it (relatively) easy to specify
|
|
4
4
|
a data field (my use case specifically is solr) in terms of sets of MARC fields and subfields.
|
5
5
|
|
6
6
|
|
7
|
-
== Docs and examples
|
7
|
+
== Docs and examples
|
8
|
+
|
9
|
+
Docs are hosted at the [[wiki|http://github.com/billdueber/marcspec/wiki/]]
|
10
|
+
|
8
11
|
|
9
12
|
Documented samples are available as part of the marc2solr project
|
10
13
|
at http://github.com/billdueber/marc2solr -- look in the simple_sample area.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.5.0
|
@@ -17,7 +17,7 @@ module MARCSpec
|
|
17
17
|
# substrings are specified.
|
18
18
|
|
19
19
|
class ControlFieldSpec
|
20
|
-
attr_accessor :tag, :range
|
20
|
+
attr_accessor :tag, :range, :rangehistory
|
21
21
|
|
22
22
|
def initialize (tag, range=nil)
|
23
23
|
unless MARC4J4R::ControlField.control_tag? tag
|
@@ -25,11 +25,12 @@ module MARCSpec
|
|
25
25
|
end
|
26
26
|
@tag = tag
|
27
27
|
self.range = range
|
28
|
+
@rangehistory = []
|
28
29
|
end
|
29
30
|
|
30
31
|
def == other
|
31
32
|
return ((self.tag == other.tag) and
|
32
|
-
(self.range
|
33
|
+
(self.range == other.range))
|
33
34
|
end
|
34
35
|
|
35
36
|
|
@@ -41,6 +42,7 @@ module MARCSpec
|
|
41
42
|
# @return [MARCSpec::ControlFieldSpec] self
|
42
43
|
|
43
44
|
def range= range
|
45
|
+
@rangehistory << @range if @range
|
44
46
|
if range.nil?
|
45
47
|
@range = nil
|
46
48
|
return self
|
data/lib/marcspec/customspec.rb
CHANGED
@@ -50,24 +50,19 @@ module MARCSpec
|
|
50
50
|
|
51
51
|
def initialize(opts)
|
52
52
|
@solrField = opts[:solrField]
|
53
|
-
@module = opts[:module]
|
54
|
-
@functionSymbol = opts[:functionSymbol]
|
53
|
+
@module = opts[:module] || nil
|
54
|
+
@functionSymbol = opts[:functionSymbol] || nil
|
55
55
|
|
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 function name as a symbol in :functionSymbol"
|
58
|
-
end
|
59
|
-
|
60
|
-
|
61
56
|
@functionArgs = opts[:functionArgs] || []
|
62
57
|
|
63
58
|
@first = opts[:firstOnly] || false
|
64
|
-
@
|
59
|
+
@defaultValue = opts[:default] || nil
|
65
60
|
@map = opts[:map] || nil
|
66
61
|
@noMapKeyDefault = opts[:noMapKeyDefault] || nil
|
67
62
|
|
68
63
|
if @solrField.is_a? Array
|
69
64
|
@arity = @solrField.size
|
70
|
-
if @first or @
|
65
|
+
if @first or @defaultValue or @map or @noMapKeyDefault
|
71
66
|
raise ArgumentError, "Custom spec with multiple solrFields can't have :first, :map, :default, or :noMapKeyDefault set"
|
72
67
|
end
|
73
68
|
else
|
@@ -101,9 +96,9 @@ module MARCSpec
|
|
101
96
|
PP.singleline_pp(@solrField, s)
|
102
97
|
s.print(",\n ")
|
103
98
|
s.print ":firstOnly => true,\n " if @first
|
104
|
-
if @
|
99
|
+
if @defaultValue
|
105
100
|
s.print(":default => ")
|
106
|
-
PP.singleline_pp(@
|
101
|
+
PP.singleline_pp(@defaultValue, s)
|
107
102
|
s.print(",\n ")
|
108
103
|
end
|
109
104
|
if @map
|
data/lib/marcspec/dsl.rb
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
module MARCSpec
|
2
|
+
# Here's where we put a simple DSL hook for SpecSet
|
3
|
+
|
4
|
+
def self.build (&blk)
|
5
|
+
ss = SpecSet.new
|
6
|
+
ss.instance_eval(&blk)
|
7
|
+
return ss
|
8
|
+
end
|
9
|
+
|
10
|
+
# Re-open SpecSet to add the necessary methods
|
11
|
+
|
12
|
+
class SpecSet
|
13
|
+
|
14
|
+
# create a normal field
|
15
|
+
def field(name, &blk)
|
16
|
+
$LOG.debug "Creating regular field #{name}"
|
17
|
+
sfs = SolrFieldSpec.new(:solrField=>name)
|
18
|
+
sfs.instance_eval(&blk)
|
19
|
+
self << sfs
|
20
|
+
return sfs
|
21
|
+
end
|
22
|
+
|
23
|
+
# Create a constant field
|
24
|
+
def constant(name, &blk)
|
25
|
+
$LOG.debug "Creating constant field #{name}"
|
26
|
+
|
27
|
+
constant = ConstantSolrSpec.new(:solrField=>name)
|
28
|
+
constant.instance_eval(&blk)
|
29
|
+
self << constant
|
30
|
+
return constant
|
31
|
+
end
|
32
|
+
|
33
|
+
def custom(name, &blk)
|
34
|
+
$LOG.debug "Creating custom field #{name}"
|
35
|
+
custom = CustomSolrSpec.new(:solrField=>name)
|
36
|
+
custom.instance_eval(&blk)
|
37
|
+
|
38
|
+
##### Check to make sure it's all ok in here#####
|
39
|
+
self << custom
|
40
|
+
return custom
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
class SolrFieldSpec
|
47
|
+
def spec(tag, &blk)
|
48
|
+
if tag.to_i == tag
|
49
|
+
tag = '%03d' % tag
|
50
|
+
end
|
51
|
+
|
52
|
+
marcfieldspec = nil
|
53
|
+
if MARC4J4R::ControlField.control_tag? tag
|
54
|
+
marcfieldspec = MARCSpec::ControlFieldSpec.new(tag)
|
55
|
+
else
|
56
|
+
marcfieldspec = MARCSpec::VariableFieldSpec.new(tag)
|
57
|
+
end
|
58
|
+
|
59
|
+
marcfieldspec.instance_eval(&blk) if block_given?
|
60
|
+
|
61
|
+
# If we had multiple sub calls, get them from the codehistory
|
62
|
+
if marcfieldspec.is_a? MARCSpec::VariableFieldSpec
|
63
|
+
marcfieldspec.codehistory.uniq.compact.each do |c|
|
64
|
+
newmfs = marcfieldspec.clone
|
65
|
+
newmfs.codes = c
|
66
|
+
self << newmfs
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
if marcfieldspec.is_a? MARCSpec::ControlFieldSpec
|
71
|
+
marcfieldspec.rangehistory.uniq.compact.each do |r|
|
72
|
+
newcfs = marcfieldspec.clone
|
73
|
+
newcfs.range = r
|
74
|
+
self << newcfs
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
self << marcfieldspec
|
79
|
+
return marcfieldspec
|
80
|
+
end
|
81
|
+
|
82
|
+
def firstOnly val=true
|
83
|
+
@first = val
|
84
|
+
end
|
85
|
+
|
86
|
+
def default val
|
87
|
+
@defaultValue = val
|
88
|
+
end
|
89
|
+
|
90
|
+
def mapname str
|
91
|
+
@_mapname = str
|
92
|
+
end
|
93
|
+
|
94
|
+
def mapMissDefault str
|
95
|
+
@noMapKeyDefault = str
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
class ControlFieldSpec
|
101
|
+
def char c
|
102
|
+
self.range = c
|
103
|
+
return self
|
104
|
+
end
|
105
|
+
|
106
|
+
alias_method :chars, :char
|
107
|
+
end
|
108
|
+
|
109
|
+
class VariableFieldSpec
|
110
|
+
def sub c
|
111
|
+
self.codes = c
|
112
|
+
return self
|
113
|
+
end
|
114
|
+
|
115
|
+
alias_method :subs, :sub
|
116
|
+
end
|
117
|
+
|
118
|
+
|
119
|
+
class CustomSolrSpec
|
120
|
+
def function(name, &blk)
|
121
|
+
self.functionSymbol = name.to_sym
|
122
|
+
self.instance_eval(&blk)
|
123
|
+
end
|
124
|
+
|
125
|
+
def mod(constant)
|
126
|
+
self.module = constant
|
127
|
+
end
|
128
|
+
|
129
|
+
def args(*arg_or_args)
|
130
|
+
self.functionArgs = arg_or_args
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
class ConstantSolrSpec
|
135
|
+
def value(val)
|
136
|
+
self.constantValue = val
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
data/lib/marcspec/map.rb
CHANGED
@@ -45,6 +45,13 @@ module MARCSpec
|
|
45
45
|
raise e
|
46
46
|
end
|
47
47
|
|
48
|
+
# Derive a name if there isn't one
|
49
|
+
unless rawmap[:mapname]
|
50
|
+
name = File.basename(filename)
|
51
|
+
name.gsub! /\..*$/, '' # remove the extension
|
52
|
+
rawmap[:mapname] = name
|
53
|
+
end
|
54
|
+
|
48
55
|
case rawmap[:maptype]
|
49
56
|
when :kv
|
50
57
|
return KVMap.new(rawmap[:mapname], rawmap[:map])
|
@@ -19,24 +19,56 @@ module MARCSpec
|
|
19
19
|
# Again, note that if several keys are === to the passed argument, all the values will be returned.
|
20
20
|
|
21
21
|
class MultiValueMap < Map
|
22
|
+
|
23
|
+
# Override initialize and map= so we can do some optimization
|
24
|
+
|
25
|
+
def initialize *args
|
26
|
+
super(*args)
|
27
|
+
self.optimize
|
28
|
+
end
|
29
|
+
|
30
|
+
def map= map
|
31
|
+
@map = map
|
32
|
+
self.optimize
|
33
|
+
end
|
22
34
|
|
23
|
-
|
35
|
+
|
36
|
+
def optimize
|
37
|
+
@super_regexp = Regexp.union @map.map{|pv| pv[0]}
|
38
|
+
inverted = {}
|
39
|
+
@map.each do |pv|
|
40
|
+
inverted[pv[1]] ||= []
|
41
|
+
inverted[pv[1]] << pv[0]
|
42
|
+
end
|
43
|
+
inverted.each_pair do |vals, patterns|
|
44
|
+
next unless patterns.size > 1
|
45
|
+
newpat = Regexp.union patterns
|
46
|
+
patterns.each do |p|
|
47
|
+
@map.delete_if{|pv| p == pv[0]}
|
48
|
+
end
|
49
|
+
@map << [newpat, vals]
|
50
|
+
end
|
51
|
+
end
|
24
52
|
|
25
53
|
# Given a passed_in_key (and optional default) return the set of values that match, as described
|
26
54
|
# above.
|
27
55
|
def [] key, default=nil
|
28
56
|
rv = []
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
57
|
+
|
58
|
+
if @super_regexp.match key # do *any* of them match?
|
59
|
+
@map.each do |pv|
|
60
|
+
if pv[1].is_a? Proc
|
61
|
+
match = pv[0].match key
|
62
|
+
rv << pv[1].call(match) if match
|
63
|
+
else
|
64
|
+
rv << pv[1] if pv[0] === key
|
65
|
+
end
|
35
66
|
end
|
67
|
+
rv.flatten!
|
68
|
+
rv.compact!
|
69
|
+
rv.uniq!
|
36
70
|
end
|
37
|
-
|
38
|
-
rv.compact!
|
39
|
-
rv.uniq!
|
71
|
+
|
40
72
|
if rv.size > 0
|
41
73
|
return rv
|
42
74
|
else
|
@@ -3,12 +3,13 @@ require 'marc4j4r/controlfield'
|
|
3
3
|
|
4
4
|
module MARCSpec
|
5
5
|
class SolrFieldSpec
|
6
|
-
attr_accessor :solrField, :first, :map, :noMapKeyDefault, :marcfieldspecs, :
|
6
|
+
attr_accessor :solrField, :first, :map, :noMapKeyDefault, :marcfieldspecs, :defaultValue, :_mapname
|
7
|
+
attr_reader :arity
|
7
8
|
|
8
9
|
def initialize(opts)
|
9
10
|
@solrField = opts[:solrField]
|
10
11
|
@first = opts[:firstOnly] || false
|
11
|
-
@
|
12
|
+
@defaultValue = opts[:default] || nil
|
12
13
|
@map = opts[:map] || nil
|
13
14
|
@noMapKeyDefault = opts[:noMapKeyDefault] || nil
|
14
15
|
@arity = 1
|
@@ -42,10 +43,10 @@ module MARCSpec
|
|
42
43
|
# If we got nothing, just return either nothing or the defualt,
|
43
44
|
# if there is one. Don't screw around with mapping.
|
44
45
|
if vals.size == 0
|
45
|
-
if @
|
46
|
+
if @defaultValue.nil? # unless there's a default value, just return nothing
|
46
47
|
return []
|
47
48
|
else
|
48
|
-
return [@
|
49
|
+
return [@defaultValue]
|
49
50
|
end
|
50
51
|
end
|
51
52
|
|
@@ -68,6 +69,7 @@ module MARCSpec
|
|
68
69
|
return ((other.solrField == self.solrField) and
|
69
70
|
(other.first == self.first) and
|
70
71
|
(other.map == self.map) and
|
72
|
+
(other.defaultValue == self.defaultValue) and
|
71
73
|
(other.noMapKeyDefault == self.noMapKeyDefault) and
|
72
74
|
(other.marcfieldspecs == self.marcfieldspecs))
|
73
75
|
end
|
@@ -98,9 +100,9 @@ module MARCSpec
|
|
98
100
|
PP.singleline_pp(@solrField, s)
|
99
101
|
s.print(",\n ")
|
100
102
|
s.print ":firstOnly => true,\n " if @first
|
101
|
-
if @
|
103
|
+
if @defaultValue
|
102
104
|
s.print(":default => ")
|
103
|
-
PP.singleline_pp(@
|
105
|
+
PP.singleline_pp(@defaultValue, s)
|
104
106
|
s.print(",\n ")
|
105
107
|
end
|
106
108
|
if @map
|
data/lib/marcspec/specset.rb
CHANGED
@@ -24,6 +24,8 @@ module MARCSpec
|
|
24
24
|
end
|
25
25
|
|
26
26
|
end
|
27
|
+
|
28
|
+
|
27
29
|
|
28
30
|
class SpecSet
|
29
31
|
attr_accessor :tmaps, :solrfieldspecs, :benchmarks
|
@@ -54,6 +56,31 @@ module MARCSpec
|
|
54
56
|
end
|
55
57
|
|
56
58
|
|
59
|
+
def buildSpecsFromDSLFile file
|
60
|
+
f = File.open(file)
|
61
|
+
$LOG.fatal("Can't open file #{file}") unless f
|
62
|
+
self.instance_eval(f.read)
|
63
|
+
self.check_and_fill_maps
|
64
|
+
end
|
65
|
+
|
66
|
+
def check_and_fill_maps
|
67
|
+
@solrfieldspecs.each do |sfs|
|
68
|
+
if sfs._mapname
|
69
|
+
map = self.map(sfs._mapname)
|
70
|
+
if map
|
71
|
+
$LOG.debug " Found map #{map.mapname} for solr field #{sfs.solrField}"
|
72
|
+
sfs.map = map
|
73
|
+
else
|
74
|
+
$LOG.error " Cannot find map #{sfs._mapname} for solr field #{sfs.solrField}"
|
75
|
+
STDERR.puts "FATAL Cannot find map #{sfs._mapname} for solr field #{sfs.solrField}"
|
76
|
+
Process.exit
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
|
57
84
|
def buildSpecsFromList speclist
|
58
85
|
speclist.each do |spechash|
|
59
86
|
if spechash[:module]
|
@@ -67,6 +94,7 @@ module MARCSpec
|
|
67
94
|
map = self.map(spechash[:mapname])
|
68
95
|
unless map
|
69
96
|
$LOG.error " Cannot find map #{spechash[:mapname]} for field #{spechash[:solrField]}"
|
97
|
+
Process.exit
|
70
98
|
else
|
71
99
|
$LOG.debug " Found map #{spechash[:mapname]} for field #{spechash[:solrField]}"
|
72
100
|
solrspec.map = map
|
@@ -80,7 +108,7 @@ module MARCSpec
|
|
80
108
|
|
81
109
|
def add_spec solrfieldspec
|
82
110
|
self.solrfieldspecs << solrfieldspec
|
83
|
-
@benchmarks[solrfieldspec.solrField] = Benchmark::Tms.new(0,0,0,0, 0, solrfieldspec.solrField)
|
111
|
+
@benchmarks[solrfieldspec.solrField.to_s] = Benchmark::Tms.new(0,0,0,0, 0, solrfieldspec.solrField)
|
84
112
|
end
|
85
113
|
|
86
114
|
alias_method :<<, :add_spec
|
@@ -106,7 +134,7 @@ module MARCSpec
|
|
106
134
|
|
107
135
|
def fill_hashlike_from_marc_benchmark r, hashlike
|
108
136
|
@solrfieldspecs.each do |sfs|
|
109
|
-
@benchmarks[sfs.solrField] += Benchmark.measure do
|
137
|
+
@benchmarks[sfs.solrField.to_s] += Benchmark.measure do
|
110
138
|
if sfs.arity == 1
|
111
139
|
hashlike.add(sfs.solrField,sfs.marc_values(r, hashlike))
|
112
140
|
else
|
@@ -15,12 +15,13 @@ module MARCSpec
|
|
15
15
|
|
16
16
|
class VariableFieldSpec
|
17
17
|
|
18
|
-
attr_accessor :tag, :codes, :joiner, :ind1, :ind2
|
18
|
+
attr_accessor :tag, :codes, :joiner, :ind1, :ind2, :codehistory
|
19
19
|
|
20
20
|
def initialize tag, codes=nil, joiner=' '
|
21
21
|
@tag = tag
|
22
22
|
@joiner = joiner || ' '
|
23
23
|
self.codes = codes
|
24
|
+
@codehistory = []
|
24
25
|
end
|
25
26
|
|
26
27
|
def == other
|
@@ -30,6 +31,7 @@ module MARCSpec
|
|
30
31
|
end
|
31
32
|
|
32
33
|
def codes= c
|
34
|
+
@codehistory << @codes if @codes
|
33
35
|
if c.nil?
|
34
36
|
@codes = nil
|
35
37
|
return nil
|
data/lib/marcspec.rb
CHANGED
@@ -11,7 +11,7 @@ require "marcspec/kvmap"
|
|
11
11
|
require "marcspec/multivaluemap"
|
12
12
|
require "marcspec/specset"
|
13
13
|
require "marcspec/marcfieldspec"
|
14
|
-
|
14
|
+
require "marcspec/dsl"
|
15
15
|
|
16
16
|
# Build up a little module to include in MARC4J4R::Record that
|
17
17
|
# gives us a way to cache computed values within the record itself
|
@@ -0,0 +1,14 @@
|
|
1
|
+
{
|
2
|
+
:maptype=>:kv,
|
3
|
+
:map => {"mdp"=>"University of Michigan",
|
4
|
+
"wu"=>"University of Wisconsin",
|
5
|
+
"gwla"=>"University of Michigan",
|
6
|
+
"miua"=>"University of Michigan",
|
7
|
+
"miun"=>"University of Michigan",
|
8
|
+
"inu"=>"Indiana University",
|
9
|
+
"uc1"=>"University of California",
|
10
|
+
"uc2"=>"University of California",
|
11
|
+
"pst"=>"Penn State University",
|
12
|
+
"umn"=>"University of Minnesota"}
|
13
|
+
|
14
|
+
}
|
data/spec/dsl_spec.rb
ADDED
@@ -0,0 +1,370 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
# The contents of @one
|
4
|
+
#
|
5
|
+
#
|
6
|
+
# LEADER 00734njm a2200217uu 4500
|
7
|
+
# 001 afc99990058366
|
8
|
+
# 003 DLC
|
9
|
+
# 005 20071104155141.9
|
10
|
+
# 007 sd ummunniauub
|
11
|
+
# 008 071103s1939 xxufmnne||||||||| u eng||
|
12
|
+
# 010 $a afc99990058366
|
13
|
+
# 040 $a DLC $c DLC
|
14
|
+
# 245 04 $a The Texas ranger $h [sound recording] / $c Sung by Beale D. Taylor.
|
15
|
+
# 260 $a Medina, Texas, $c 1939.
|
16
|
+
# 300 $a 1 sound disc : $b analog, 33 1/3 rpm, mono. ; $c 12 in.
|
17
|
+
# 651 0 $a Medina $z Texas $z United States of America.
|
18
|
+
# 700 1 $a Lomax, John Avery, 1867-1948 $e Recording engineer.
|
19
|
+
# 700 1 $a Lomax, Ruby T. (Ruby Terrill) $e Recording engineer.
|
20
|
+
# 700 1 $a Taylor, Beale D. $e Singer.
|
21
|
+
# 852 $a American Folklife Center, Library of Congress
|
22
|
+
# 852 $a DLC
|
23
|
+
|
24
|
+
|
25
|
+
# Create a helper for the custom functions
|
26
|
+
|
27
|
+
module SPECHelper
|
28
|
+
def self.test doc, r
|
29
|
+
return 'Hello'
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.single doc, r, arg
|
33
|
+
return "Hello " + arg.to_s
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.double doc, r, one, two
|
37
|
+
return ["Hello", one, two].join(' ')
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.any doc, r, *args
|
41
|
+
return 'Hello ' + args.map{|s| s.to_s}.join(' ')
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.multihead doc, r
|
45
|
+
return ['one', 'two']
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "DSL" do
|
51
|
+
before do
|
52
|
+
@one = MARC4J4R::Reader.new("#{DIR}/data/one.dat").first
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "constant DSL" do
|
56
|
+
|
57
|
+
it "can add a constant solrfieldspec" do
|
58
|
+
ss = MARCSpec.build do
|
59
|
+
constant('id') do
|
60
|
+
value "Bill"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
ss.solrfieldspecs.size.should.equal 1
|
64
|
+
ss.hash_from_marc(@one)['id'].should.equal ['Bill']
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "custom DSL" do
|
69
|
+
|
70
|
+
# before do
|
71
|
+
# @one = MARC4J4R::Reader.new("#{DIR}/data/one.dat").first
|
72
|
+
# end
|
73
|
+
|
74
|
+
it "builds a bare-bones custom" do
|
75
|
+
ss = MARCSpec.build do
|
76
|
+
custom('hello') do
|
77
|
+
function(:test) {
|
78
|
+
mod SPECHelper
|
79
|
+
}
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
ss.hash_from_marc(@one)['hello'].should.equal ['Hello']
|
84
|
+
end
|
85
|
+
|
86
|
+
it "builds a custom that can take a single argument" do
|
87
|
+
ss = MARCSpec.build do
|
88
|
+
custom('hello') do
|
89
|
+
function(:single) {
|
90
|
+
mod SPECHelper
|
91
|
+
args 'Bill'
|
92
|
+
}
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
ss.hash_from_marc(@one)['hello'].should.equal ['Hello Bill']
|
97
|
+
end
|
98
|
+
|
99
|
+
it "builds a custom that can take two arguments" do
|
100
|
+
ss = MARCSpec.build do
|
101
|
+
custom('hello') do
|
102
|
+
function(:double) {
|
103
|
+
mod SPECHelper
|
104
|
+
args 'Bill', 'Dueber'
|
105
|
+
}
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
ss.hash_from_marc(@one)['hello'].should.equal ['Hello Bill Dueber']
|
110
|
+
end
|
111
|
+
|
112
|
+
it "builds a custom that can take two arguments" do
|
113
|
+
ss = MARCSpec.build do
|
114
|
+
custom('hello') do
|
115
|
+
function(:any) {
|
116
|
+
mod SPECHelper
|
117
|
+
args 1,2,3,4,5
|
118
|
+
}
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
ss.hash_from_marc(@one)['hello'].should.equal ['Hello 1 2 3 4 5']
|
123
|
+
end
|
124
|
+
|
125
|
+
it "works with multihead" do
|
126
|
+
ss = MARCSpec.build do
|
127
|
+
custom(['a', 'b']) do
|
128
|
+
function(:multihead) {
|
129
|
+
mod SPECHelper
|
130
|
+
}
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
ss.hash_from_marc(@one)['a'].should.equal ['one']
|
135
|
+
ss.hash_from_marc(@one)['b'].should.equal ['two']
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
|
140
|
+
describe "control fields DSL" do
|
141
|
+
# before do
|
142
|
+
# @one = MARC4J4R::Reader.new("#{DIR}/data/one.dat").first
|
143
|
+
# end
|
144
|
+
|
145
|
+
it "should get a standard with a single whole control spec" do
|
146
|
+
ss = MARCSpec.build do
|
147
|
+
field("id") do
|
148
|
+
spec('001')
|
149
|
+
end
|
150
|
+
end
|
151
|
+
ss.hash_from_marc(@one)['id'].should.equal ['afc99990058366']
|
152
|
+
end
|
153
|
+
|
154
|
+
it "should allow integer tags" do
|
155
|
+
ss = MARCSpec.build do
|
156
|
+
field("id") do
|
157
|
+
spec(001)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
ss.hash_from_marc(@one)['id'].should.equal ['afc99990058366']
|
161
|
+
end
|
162
|
+
|
163
|
+
it "can get a single char" do
|
164
|
+
ss = MARCSpec.build do
|
165
|
+
field("tst") do
|
166
|
+
spec(001) {
|
167
|
+
char 2
|
168
|
+
}
|
169
|
+
end
|
170
|
+
end
|
171
|
+
ss.hash_from_marc(@one)['tst'].should.equal ['c']
|
172
|
+
end
|
173
|
+
|
174
|
+
it "can get a range" do
|
175
|
+
ss = MARCSpec.build do
|
176
|
+
field("tst") do
|
177
|
+
spec(001) {
|
178
|
+
chars 2..6
|
179
|
+
}
|
180
|
+
end
|
181
|
+
end
|
182
|
+
ss.hash_from_marc(@one)['tst'].should.equal ['c9999']
|
183
|
+
end
|
184
|
+
|
185
|
+
it "allows multiple char/chars per control field" do
|
186
|
+
ss = MARCSpec.build do
|
187
|
+
field("tst") do
|
188
|
+
spec(001) {
|
189
|
+
char 2
|
190
|
+
chars 2..6
|
191
|
+
}
|
192
|
+
end
|
193
|
+
end
|
194
|
+
ss.hash_from_marc(@one)['tst'].should.equal ['c', 'c9999']
|
195
|
+
end
|
196
|
+
|
197
|
+
|
198
|
+
end
|
199
|
+
|
200
|
+
|
201
|
+
describe "variable fields DSL" do
|
202
|
+
# before do
|
203
|
+
# @one = MARC4J4R::Reader.new("#{DIR}/data/one.dat").first
|
204
|
+
# end
|
205
|
+
|
206
|
+
it "can get a whole variable field" do
|
207
|
+
ss = MARCSpec.build do
|
208
|
+
field("tst") do
|
209
|
+
spec(260)
|
210
|
+
end
|
211
|
+
end
|
212
|
+
ss.hash_from_marc(@one)['tst'].should.equal ['Medina, Texas, 1939.']
|
213
|
+
end
|
214
|
+
|
215
|
+
it "can get a single subfield" do
|
216
|
+
ss = MARCSpec.build do
|
217
|
+
field("tst") do
|
218
|
+
spec(260) {
|
219
|
+
sub 'a'
|
220
|
+
}
|
221
|
+
end
|
222
|
+
end
|
223
|
+
ss.hash_from_marc(@one)['tst'].should.equal ['Medina, Texas,']
|
224
|
+
end
|
225
|
+
|
226
|
+
|
227
|
+
it "can get multiple subfields" do
|
228
|
+
ss = MARCSpec.build do
|
229
|
+
field("tst") do
|
230
|
+
spec(245) {
|
231
|
+
sub 'ac'
|
232
|
+
}
|
233
|
+
end
|
234
|
+
end
|
235
|
+
ss.hash_from_marc(@one)['tst'].should.equal ['The Texas ranger Sung by Beale D. Taylor.']
|
236
|
+
end
|
237
|
+
|
238
|
+
it "can get multiple subfields as array" do
|
239
|
+
ss = MARCSpec.build do
|
240
|
+
field("tst") do
|
241
|
+
spec(245) {
|
242
|
+
subs ['a', 'c']
|
243
|
+
}
|
244
|
+
end
|
245
|
+
end
|
246
|
+
ss.hash_from_marc(@one)['tst'].should.equal ['The Texas ranger Sung by Beale D. Taylor.']
|
247
|
+
end
|
248
|
+
|
249
|
+
it "can get multiple different subfields from the same field" do
|
250
|
+
ss = MARCSpec.build do
|
251
|
+
field("tst") do
|
252
|
+
spec(245) {
|
253
|
+
sub 'a'
|
254
|
+
sub 'c'
|
255
|
+
}
|
256
|
+
end
|
257
|
+
end
|
258
|
+
ss.hash_from_marc(@one)['tst'].should.equal ['The Texas ranger', 'Sung by Beale D. Taylor.']
|
259
|
+
end
|
260
|
+
|
261
|
+
it "can handle multiple specs" do
|
262
|
+
ss = MARCSpec.build do
|
263
|
+
field('tst') do
|
264
|
+
spec(245) {
|
265
|
+
sub 'a'
|
266
|
+
}
|
267
|
+
spec(245) {
|
268
|
+
sub 'c'
|
269
|
+
}
|
270
|
+
end
|
271
|
+
end
|
272
|
+
ss.hash_from_marc(@one)['tst'].should.equal ['The Texas ranger', 'Sung by Beale D. Taylor.']
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
describe "SolrFieldSpec modifiers DSL" do
|
277
|
+
it "works with firstOnly" do
|
278
|
+
ss = MARCSpec.build do
|
279
|
+
field('tst') do
|
280
|
+
firstOnly
|
281
|
+
|
282
|
+
spec(700) {
|
283
|
+
sub 'a'
|
284
|
+
}
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
ss.hash_from_marc(@one)['tst'].should.equal ['Lomax, John Avery, 1867-1948']
|
289
|
+
end
|
290
|
+
|
291
|
+
it "works with default" do
|
292
|
+
ss = MARCSpec.build do
|
293
|
+
field('tst') do
|
294
|
+
default 'Default value'
|
295
|
+
|
296
|
+
spec(777) {
|
297
|
+
sub 'a'
|
298
|
+
}
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
ss.hash_from_marc(@one)['tst'].should.equal ['Default value']
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
describe "use as config file" do
|
307
|
+
it "works in practice" do
|
308
|
+
string = %q|
|
309
|
+
field('tst') do
|
310
|
+
default 'Default'
|
311
|
+
spec(999)
|
312
|
+
end
|
313
|
+
|
314
|
+
field('id') do
|
315
|
+
spec(001) {
|
316
|
+
chars 2..6
|
317
|
+
}
|
318
|
+
end
|
319
|
+
|
|
320
|
+
|
321
|
+
ss = MARCSpec::SpecSet.new
|
322
|
+
ss.instance_eval(string)
|
323
|
+
ss.hash_from_marc(@one)['tst'].should.equal ['Default']
|
324
|
+
ss.hash_from_marc(@one)['id'].should.equal ['c9999']
|
325
|
+
end
|
326
|
+
|
327
|
+
it "works in compact form" do
|
328
|
+
string = %q|
|
329
|
+
field('tst') do
|
330
|
+
default 'Default'
|
331
|
+
spec(999)
|
332
|
+
end
|
333
|
+
|
334
|
+
field('id') do
|
335
|
+
spec(001) {chars 2..6}
|
336
|
+
end
|
337
|
+
|
|
338
|
+
|
339
|
+
ss = MARCSpec::SpecSet.new
|
340
|
+
ss.instance_eval(string)
|
341
|
+
ss.hash_from_marc(@one)['tst'].should.equal ['Default']
|
342
|
+
ss.hash_from_marc(@one)['id'].should.equal ['c9999']
|
343
|
+
end
|
344
|
+
|
345
|
+
it "bails on a missing map" do
|
346
|
+
string = %q|
|
347
|
+
field('tst') do
|
348
|
+
default 'Default'
|
349
|
+
mapname 'nosuchmap'
|
350
|
+
spec(999)
|
351
|
+
end
|
352
|
+
|
353
|
+
field('id') do
|
354
|
+
spec(001) {chars 2..6}
|
355
|
+
end
|
356
|
+
|
|
357
|
+
f = Tempfile.new('ss')
|
358
|
+
f.puts string
|
359
|
+
path = f.path
|
360
|
+
f.close
|
361
|
+
ss = MARCSpec::SpecSet.new
|
362
|
+
lambda{ss.buildSpecsFromDSLFile(path)}.should.raise SystemExit
|
363
|
+
f.unlink
|
364
|
+
|
365
|
+
end
|
366
|
+
|
367
|
+
end
|
368
|
+
|
369
|
+
|
370
|
+
end
|
data/spec/maps_spec.rb
CHANGED
@@ -1,21 +1,12 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe "Maps" do
|
3
|
+
describe "KV Maps" do
|
4
4
|
before do
|
5
5
|
@kvmap = MARCSpec::KVMap.new('kvmap', {'one' => '1', 'two' => ['2', 'zwei']})
|
6
|
-
@mvmap = MARCSpec::MultiValueMap.new('mvmap', [
|
7
|
-
[/bi/, 'Bill'],
|
8
|
-
[/mo/i, 'Molly'],
|
9
|
-
[/ll/, 'Bill'],
|
10
|
-
[/lly/i, ['One', 'Two']],
|
11
|
-
[/^.*?\s+(.*)$/, Proc.new{|m| m[1]}]
|
12
|
-
]
|
13
|
-
)
|
14
6
|
end
|
15
7
|
|
16
8
|
it "knows its name" do
|
17
9
|
@kvmap.mapname.should.equal 'kvmap'
|
18
|
-
@mvmap.mapname.should.equal 'mvmap'
|
19
10
|
end
|
20
11
|
|
21
12
|
it "gets simple value from a kv map" do
|
@@ -30,21 +21,90 @@ describe "Maps" do
|
|
30
21
|
@kvmap['ddd'].should.equal nil
|
31
22
|
end
|
32
23
|
|
33
|
-
it "gets
|
34
|
-
@
|
24
|
+
it "gets default if set for nonmatches with KVMap" do
|
25
|
+
@kvmap['ddd', 'default'].should.equal 'default'
|
26
|
+
end
|
27
|
+
|
28
|
+
it "gets key if default is :passthrough for nonmatches with KVMap" do
|
29
|
+
@kvmap['ddd', :passthrough].should.equal 'ddd'
|
35
30
|
end
|
31
|
+
|
36
32
|
|
37
|
-
it "
|
33
|
+
it "correctly uses default value" do
|
38
34
|
@kvmap['ddd', 'default'].should.equal 'default'
|
35
|
+
@kvmap['one', 'default'].should.equal '1'
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should round-trip a kvmap" do
|
39
|
+
s = @kvmap.asPPString
|
40
|
+
newkvmap = MARCSpec::KVMap.fromPPString s
|
41
|
+
newkvmap.should.equal @kvmap
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
it "should read a kv solrmarc file" do
|
46
|
+
map = MARCSpec::KVMap.from_solrmarc_file "#{DIR}/data/umich/translation_maps/country_map.properties"
|
47
|
+
map.mapname.should.equal 'country_map'
|
48
|
+
map["nl"].should.equal "New Caledonia"
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should correctly deal with solrmarc files with escaped chars (via \\)" do
|
52
|
+
map = MARCSpec::KVMap.from_solrmarc_file "#{DIR}/data/umich/translation_maps/location_map.properties"
|
53
|
+
map['AAEL'].should.equal 'AAEL'
|
54
|
+
map['AAEL MICE'].should.equal 'AAEL MICE'
|
55
|
+
map['BUHR AAEL'].should.equal 'BUHR'
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
it "can dump/load a kv map via generic map interface" do
|
60
|
+
map = MARCSpec::KVMap.from_solrmarc_file "#{DIR}/data/umich/translation_maps/country_map.properties"
|
61
|
+
f = Tempfile.new('kvmap')
|
62
|
+
f.puts map.asPPString
|
63
|
+
path = f.path
|
64
|
+
f.close
|
65
|
+
map2 = MARCSpec::Map.fromFile(path)
|
66
|
+
f.unlink
|
67
|
+
map.class.should.equal MARCSpec::KVMap
|
68
|
+
map.should.equal map2
|
69
|
+
end
|
70
|
+
|
71
|
+
it "can name a map based on the filename when using fromFile(path)" do
|
72
|
+
map = MARCSpec::Map.fromFile("#{DIR}/data/simplemap.rb")
|
73
|
+
map.mapname.should.equal 'simplemap'
|
39
74
|
end
|
40
75
|
|
76
|
+
end
|
77
|
+
|
78
|
+
describe "MVMaps" do
|
79
|
+
before do
|
80
|
+
@mvmap = MARCSpec::MultiValueMap.new('mvmap', [
|
81
|
+
[/bi/, 'Bill'],
|
82
|
+
[/mo/i, 'Molly'],
|
83
|
+
[/ll/, 'Bill'],
|
84
|
+
[/lly/i, ['One', 'Two']],
|
85
|
+
[/^.*?\s+(.*)$/, Proc.new{|m| m[1]}]
|
86
|
+
]
|
87
|
+
)
|
88
|
+
@mvmapCollapse = MARCSpec::MultiValueMap.new('mvmap', [
|
89
|
+
[/^bill/i, 'William'],
|
90
|
+
[/^will.*/i, 'William'],
|
91
|
+
[/dueber/i, 'Dueber'],
|
92
|
+
[/duebs/i, 'Dueber']
|
93
|
+
])
|
94
|
+
end
|
95
|
+
|
96
|
+
it "knows its name" do
|
97
|
+
@mvmap.mapname.should.equal 'mvmap'
|
98
|
+
end
|
99
|
+
|
100
|
+
it "gets nothing on nonmatches for mvmap" do
|
101
|
+
@mvmap['ddd'].should.equal nil
|
102
|
+
end
|
103
|
+
|
41
104
|
it "gets default if set for nonmatches with MVMap" do
|
42
105
|
@mvmap['ddd', 'default'].should.equal 'default'
|
43
106
|
end
|
44
107
|
|
45
|
-
it "gets key if default is :passthrough for nonmatches with KVMap" do
|
46
|
-
@kvmap['ddd', :passthrough].should.equal 'ddd'
|
47
|
-
end
|
48
108
|
|
49
109
|
it "gets key if default is :passthrough for nonmatches with KVMap" do
|
50
110
|
@mvmap['ddd', :passthrough].should.equal 'ddd'
|
@@ -57,18 +117,10 @@ describe "Maps" do
|
|
57
117
|
@mvmap['mobi'].sort.should.equal ['Bill', 'Molly'].sort
|
58
118
|
@mvmap['Molly'].sort.should.equal ['Molly', 'Bill', 'One', 'Two'].sort
|
59
119
|
end
|
60
|
-
|
120
|
+
|
61
121
|
it "correctly uses default value" do
|
62
122
|
@mvmap['bi', 'default'].should.equal ['Bill']
|
63
123
|
@mvmap['ddd', 'default'].should.equal 'default'
|
64
|
-
@kvmap['ddd', 'default'].should.equal 'default'
|
65
|
-
@kvmap['one', 'default'].should.equal '1'
|
66
|
-
end
|
67
|
-
|
68
|
-
it "should round-trip a kvmap" do
|
69
|
-
s = @kvmap.asPPString
|
70
|
-
newkvmap = MARCSpec::KVMap.fromPPString s
|
71
|
-
newkvmap.should.equal @kvmap
|
72
124
|
end
|
73
125
|
|
74
126
|
it "should round trip a multivaluemap without a Proc" do
|
@@ -98,38 +150,13 @@ describe "Maps" do
|
|
98
150
|
@mvmap['one'].should.equal ['one']
|
99
151
|
@mvmap['two'].should.equal ['two']
|
100
152
|
end
|
101
|
-
|
102
|
-
it "should read a kv solrmarc file" do
|
103
|
-
map = MARCSpec::KVMap.from_solrmarc_file "#{DIR}/data/umich/translation_maps/country_map.properties"
|
104
|
-
map.mapname.should.equal 'country_map'
|
105
|
-
map["nl"].should.equal "New Caledonia"
|
106
|
-
end
|
107
|
-
|
108
|
-
it "should correctly deal with solrmarc files with escaped chars (via \\)" do
|
109
|
-
map = MARCSpec::KVMap.from_solrmarc_file "#{DIR}/data/umich/translation_maps/location_map.properties"
|
110
|
-
map['AAEL'].should.equal 'AAEL'
|
111
|
-
map['AAEL MICE'].should.equal 'AAEL MICE'
|
112
|
-
map['BUHR AAEL'].should.equal 'BUHR'
|
113
|
-
end
|
114
|
-
|
153
|
+
|
115
154
|
it "should read a pattern solrmarc file" do
|
116
155
|
map = MARCSpec::MultiValueMap.from_solrmarc_file "#{DIR}/data/umich/translation_maps/library_map.properties"
|
117
156
|
map.mapname.should.equal 'library_map'
|
118
157
|
map['UMTRI Stuff'].should.equal ['Transportation Research Institute Library (UMTRI)']
|
119
158
|
map['HATCH DOCS'].should.equal ['Hatcher Graduate', 'Hatcher Graduate Documents Center']
|
120
159
|
end
|
121
|
-
|
122
|
-
it "can dump/load a kv map via generic map interface" do
|
123
|
-
map = MARCSpec::KVMap.from_solrmarc_file "#{DIR}/data/umich/translation_maps/country_map.properties"
|
124
|
-
f = Tempfile.new('kvmap')
|
125
|
-
f.puts map.asPPString
|
126
|
-
path = f.path
|
127
|
-
f.close
|
128
|
-
map2 = MARCSpec::Map.fromFile(path)
|
129
|
-
f.unlink
|
130
|
-
map.class.should.equal MARCSpec::KVMap
|
131
|
-
map.should.equal map2
|
132
|
-
end
|
133
160
|
|
134
161
|
it "can dump/load a multivalue map via generic map interface" do
|
135
162
|
map = MARCSpec::MultiValueMap.from_solrmarc_file "#{DIR}/data/umich/translation_maps/library_map.properties"
|
@@ -143,5 +170,13 @@ describe "Maps" do
|
|
143
170
|
map.should.equal map2
|
144
171
|
end
|
145
172
|
|
173
|
+
it "collapses ok" do
|
174
|
+
@mvmapCollapse['bill'].should.equal ['William']
|
175
|
+
@mvmapCollapse['william'].should.equal ['William']
|
176
|
+
@mvmapCollapse['bill dueber'].sort.should.equal ['William', 'Dueber'].sort
|
177
|
+
@mvmapCollapse['Will "duebes" Dueber'].sort.should.equal ['William', 'Dueber'].sort
|
178
|
+
@mvmapCollapse['notinthere'].should.equal nil
|
179
|
+
end
|
180
|
+
|
146
181
|
|
147
|
-
end
|
182
|
+
end
|
data/spec/solrfieldspec_spec.rb
CHANGED
@@ -189,17 +189,6 @@ describe "CustomSolrSpec" do
|
|
189
189
|
@map = MARCSpec::KVMap.new('nameOfTheMap', {@titleACValue.upcase => @mapValue, @default=>@mapValueForDefault})
|
190
190
|
end
|
191
191
|
|
192
|
-
it "requires solrfield, module, and function" do
|
193
|
-
lambda{
|
194
|
-
css = MARCSpec::CustomSolrSpec.new(:solrField=>'solrField')
|
195
|
-
}.should.raise ArgumentError
|
196
|
-
lambda{
|
197
|
-
css = MARCSpec::CustomSolrSpec.new(:solrField=>'solrField', :module=>A::B)
|
198
|
-
}.should.raise ArgumentError
|
199
|
-
lambda{
|
200
|
-
css = MARCSpec::CustomSolrSpec.new(:module=>A::B, :functionSymbol=>:titleUp)
|
201
|
-
}.should.raise ArgumentError
|
202
|
-
end
|
203
192
|
|
204
193
|
it "works with no args or map" do
|
205
194
|
css = MARCSpec::CustomSolrSpec.new(:solrField=>'solrField', :module=>A::B, :functionSymbol=>:titleUp)
|
data/spec/specset_spec.rb
CHANGED
@@ -118,6 +118,12 @@ describe "SpecSet Basics" do
|
|
118
118
|
h['two'].should.equal [2]
|
119
119
|
h['letters'].should.equal ['a', 'b']
|
120
120
|
end
|
121
|
+
|
122
|
+
it "bails if it can't find a map" do
|
123
|
+
@speclist << {:solrField => 'tst', :mapname=>'nosuch', :specs => [['245']]}
|
124
|
+
lambda{@ss.buildSpecsFromList(@speclist)}.should.raise SystemExit
|
125
|
+
end
|
126
|
+
|
121
127
|
end
|
122
128
|
|
123
129
|
|
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: 3
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 1.
|
8
|
+
- 5
|
9
|
+
- 0
|
10
|
+
version: 1.5.0
|
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-09-
|
18
|
+
date: 2010-09-20 00:00:00 -04:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -99,6 +99,7 @@ files:
|
|
99
99
|
- lib/marcspec/constantspec.rb
|
100
100
|
- lib/marcspec/controlfieldspec.rb
|
101
101
|
- lib/marcspec/customspec.rb
|
102
|
+
- lib/marcspec/dsl.rb
|
102
103
|
- lib/marcspec/kvmap.rb
|
103
104
|
- lib/marcspec/leaderspec.rb
|
104
105
|
- lib/marcspec/map.rb
|
@@ -111,6 +112,7 @@ files:
|
|
111
112
|
- spec/controlfieldspec_spec.rb
|
112
113
|
- spec/data/batch.dat
|
113
114
|
- spec/data/one.dat
|
115
|
+
- spec/data/simplemap.rb
|
114
116
|
- spec/data/umich/translation_maps/area_map.properties
|
115
117
|
- spec/data/umich/translation_maps/availability_map_ht.properties
|
116
118
|
- spec/data/umich/translation_maps/availability_map_umich.properties
|
@@ -125,6 +127,7 @@ files:
|
|
125
127
|
- spec/data/umich/translation_maps/library_map.properties
|
126
128
|
- spec/data/umich/translation_maps/location_map.properties
|
127
129
|
- spec/data/umich/umich_index.properties
|
130
|
+
- spec/dsl_spec.rb
|
128
131
|
- spec/leaderspec_spec.rb
|
129
132
|
- spec/maps_spec.rb
|
130
133
|
- spec/marcfieldspecs_spec.rb
|
@@ -169,6 +172,8 @@ summary: Extract data from MARC records and send to Solr
|
|
169
172
|
test_files:
|
170
173
|
- spec/cachespot_spec.rb
|
171
174
|
- spec/controlfieldspec_spec.rb
|
175
|
+
- spec/data/simplemap.rb
|
176
|
+
- spec/dsl_spec.rb
|
172
177
|
- spec/leaderspec_spec.rb
|
173
178
|
- spec/maps_spec.rb
|
174
179
|
- spec/marcfieldspecs_spec.rb
|