marcspec 1.0.0 → 1.1.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/VERSION +1 -1
- data/lib/marcspec/map.rb +1 -1
- data/lib/marcspec/multivaluemap.rb +22 -3
- data/spec/maps_spec.rb +32 -2
- metadata +4 -4
data/CHANGES
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.1.0
|
data/lib/marcspec/map.rb
CHANGED
@@ -60,7 +60,7 @@ module MARCSpec
|
|
60
60
|
|
61
61
|
# Check for map equality
|
62
62
|
def == other
|
63
|
-
return ((other.mapname ==
|
63
|
+
return ((other.mapname == @mapname) and (other.map == @map))
|
64
64
|
end
|
65
65
|
|
66
66
|
# Generic pretty_print; used mostly for translating from solrmarc
|
@@ -13,15 +13,27 @@ module MARCSpec
|
|
13
13
|
#
|
14
14
|
# Keys can be either strings or regular expressions (e.g., /^Bil/).
|
15
15
|
#
|
16
|
+
# IF the key is a regexp, the value may then be a Proc object that takes a single argument: the
|
17
|
+
# MatchData object produced by calling key.match(passed_in_value)
|
18
|
+
#
|
16
19
|
# Again, note that if several keys are === to the passed argument, all the values will be returned.
|
17
20
|
|
18
21
|
class MultiValueMap < Map
|
19
22
|
|
20
23
|
attr_accessor :mapname,:map
|
21
24
|
|
22
|
-
|
25
|
+
# Given a passed_in_key (and optional default) return the set of values that match, as described
|
26
|
+
# above.
|
23
27
|
def [] key, default=nil
|
24
|
-
rv =
|
28
|
+
rv = []
|
29
|
+
@map.each do |pv|
|
30
|
+
if pv[1].is_a? Proc
|
31
|
+
match = pv[0].match key
|
32
|
+
rv << pv[1].call(match) if match
|
33
|
+
else
|
34
|
+
rv << pv[1] if pv[0] === key
|
35
|
+
end
|
36
|
+
end
|
25
37
|
rv.flatten!
|
26
38
|
rv.compact!
|
27
39
|
rv.uniq!
|
@@ -32,6 +44,9 @@ module MARCSpec
|
|
32
44
|
end
|
33
45
|
end
|
34
46
|
|
47
|
+
# Try to produce a valid MVMap from a solrmarc file
|
48
|
+
# @param [String] filename The file to read
|
49
|
+
# @return [MARCSpec::MultiValueMap] A new mvmap
|
35
50
|
def self.from_solrmarc_file filename
|
36
51
|
mapname = File.basename(filename).sub(/\..+?$/, '')
|
37
52
|
kvlist = []
|
@@ -50,12 +65,16 @@ module MARCSpec
|
|
50
65
|
return self.new(mapname, kvlist)
|
51
66
|
end
|
52
67
|
|
68
|
+
# Produce a string suitable for pretty-printing. Unfortunately, we need to just plain
|
69
|
+
# delete the procs before doing so
|
70
|
+
|
53
71
|
def asPPString
|
72
|
+
map = @map.reject {|kv| kv[1].is_a? Proc}
|
54
73
|
s = StringIO.new
|
55
74
|
s.print "{\n :maptype=>:multi,\n :mapname=>"
|
56
75
|
PP.singleline_pp(@mapname, s)
|
57
76
|
s.print ",\n :map => "
|
58
|
-
PP.pp(
|
77
|
+
PP.pp(map, s)
|
59
78
|
s.puts "\n}"
|
60
79
|
return s.string
|
61
80
|
end
|
data/spec/maps_spec.rb
CHANGED
@@ -3,7 +3,14 @@ require 'spec_helper'
|
|
3
3
|
describe "Maps" do
|
4
4
|
before do
|
5
5
|
@kvmap = MARCSpec::KVMap.new('kvmap', {'one' => '1', 'two' => ['2', 'zwei']})
|
6
|
-
@mvmap = MARCSpec::MultiValueMap.new('mvmap', [
|
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
|
+
)
|
7
14
|
end
|
8
15
|
|
9
16
|
it "knows its name" do
|
@@ -44,12 +51,35 @@ describe "Maps" do
|
|
44
51
|
newkvmap.should.equal @kvmap
|
45
52
|
end
|
46
53
|
|
47
|
-
it "should round trip a multivaluemap" do
|
54
|
+
it "should round trip a multivaluemap without a Proc" do
|
55
|
+
cleanmap = []
|
56
|
+
@mvmap.map.each do |kv|
|
57
|
+
cleanmap.push kv unless kv[1].is_a? Proc
|
58
|
+
end
|
59
|
+
@mvmap.map = cleanmap
|
48
60
|
s = @mvmap.asPPString
|
49
61
|
newmvmap = MARCSpec::MultiValueMap.fromPPString s
|
50
62
|
newmvmap.should.equal @mvmap
|
51
63
|
end
|
52
64
|
|
65
|
+
it "can't round-trip a multivaluemap with a Proc" do
|
66
|
+
s = @mvmap.asPPString
|
67
|
+
puts s
|
68
|
+
newmvmap = MARCSpec::MultiValueMap.fromPPString s
|
69
|
+
newmvmap.should.not.equal @mvmap
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
it "can use a proc in a multivaluemap" do
|
74
|
+
@mvmap['Molly Dueber'].sort.should.equal ['Molly', 'Bill', 'Dueber', 'One', 'Two'].sort
|
75
|
+
end
|
76
|
+
|
77
|
+
it "can use a simple passthrough in a multivaluemap" do
|
78
|
+
@mvmap = MARCSpec::MultiValueMap.new('mvmap', [[/.*/, Proc.new {|m| m[0]}]])
|
79
|
+
@mvmap['one'].should.equal ['one']
|
80
|
+
@mvmap['two'].should.equal ['two']
|
81
|
+
end
|
82
|
+
|
53
83
|
it "should read a kv solrmarc file" do
|
54
84
|
map = MARCSpec::KVMap.from_solrmarc_file "#{DIR}/data/umich/translation_maps/country_map.properties"
|
55
85
|
map.mapname.should.equal 'country_map'
|
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: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
+
- 1
|
8
9
|
- 0
|
9
|
-
|
10
|
-
version: 1.0.0
|
10
|
+
version: 1.1.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-15 00:00:00 -04:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|