mab2 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/mab2/aleph_sequential_adapter.rb +10 -0
- data/lib/mab2/document/datafield.rb +15 -0
- data/lib/mab2/document/scope.rb +89 -0
- data/lib/mab2/document/subfield.rb +10 -0
- data/lib/mab2/document.rb +27 -19
- data/lib/mab2/mab_xml_adapter.rb +50 -0
- data/lib/mab2/version.rb +1 -1
- data/lib/mab2.rb +4 -2
- data/mab2.gemspec +1 -1
- data/test/mab2/test_controlfield.rb +6 -0
- data/test/mab2/test_datafield.rb +111 -1
- data/test/mab_files/dsl_1.xml +14 -0
- data/test/mab_files/dsl_2.xml +37 -0
- metadata +13 -5
- data/lib/mab2/document_scope.rb +0 -64
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d1659413e48d57b2b853237962d2763d20bf6288
|
4
|
+
data.tar.gz: cd5bbecc8442e0769c27539e40283b41e361dc96
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bfde3b1e18c169f751db9faf12fa988c614ef63dcd76600ea9b143a1e9ecc95deebbce608579843b80dbdb3c517d1abfd7f242d7468294a2ea24108bcd684d37
|
7
|
+
data.tar.gz: 54e634c0052d6594bb3cc6e8920d2452baf901f5250bc8de34d0611088a222fb36ca83c63fbe060946d828c640a60b79ac42ba5d16111caf1413c304bdf1671d
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class Mab2::Document::Datafield
|
2
|
+
|
3
|
+
attr_accessor :indicators, :subfields, :tag
|
4
|
+
|
5
|
+
def initialize(tag, indicators, subfields)
|
6
|
+
@tag = tag
|
7
|
+
@indicators = indicators
|
8
|
+
@subfields = subfields.map { |subfield| Mab2::Document::Subfield.new(subfield) }
|
9
|
+
end
|
10
|
+
|
11
|
+
def get_subfield(code)
|
12
|
+
@subfields.find { |subfield| subfield.name == code.to_sym }
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
class Mab2::Document::Scope
|
2
|
+
|
3
|
+
attr_accessor :scope_subfields
|
4
|
+
|
5
|
+
def initialize(document)
|
6
|
+
@document = document
|
7
|
+
end
|
8
|
+
|
9
|
+
def controlfield(tag)
|
10
|
+
@document.controlfields[tag.to_sym].try(:chars) || []
|
11
|
+
end
|
12
|
+
|
13
|
+
def datafield(tag, indicators)
|
14
|
+
@scope_datafields = []
|
15
|
+
indicators = sanitize_indicators(indicators)
|
16
|
+
|
17
|
+
selected_datafields = if !(datafields_by_tag = @document.datafields[tag.to_sym]).nil?
|
18
|
+
datafields_by_tag.select do |indicator_one_key, indicator_one_value|
|
19
|
+
indicators[:ind1].nil? || (indicators[:ind1].any? { |ind1| ind1.length > 1 && ind1.to_s.starts_with?('-') } ^ indicators[:ind1].include?(indicator_one_key)) && indicator_one_value.any? do |indicator_two_key, indicator_two_value|
|
20
|
+
indicators[:ind2].nil? || indicators[:ind2].include?(indicator_two_key)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
if !selected_datafields.nil?
|
26
|
+
selected_datafields.each_pair do |indicator_one_key, indicator_one_value|
|
27
|
+
indicator_one_value.each_pair do |indicator_two_key, indicator_two_value|
|
28
|
+
indicator_two_value.each do |subfields|
|
29
|
+
@scope_datafields.push Mab2::Document::Datafield.new(tag, indicators, subfields)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
self
|
36
|
+
end
|
37
|
+
|
38
|
+
def get
|
39
|
+
self
|
40
|
+
end
|
41
|
+
|
42
|
+
def fields
|
43
|
+
@scope_datafields
|
44
|
+
end
|
45
|
+
|
46
|
+
def scope_subfields
|
47
|
+
@scope_subfields || @scope_datafields.map { |datafield| datafield.subfields }.flatten.presence
|
48
|
+
end
|
49
|
+
|
50
|
+
def subfield(subfield_codes)
|
51
|
+
# make subfield_codes an array (always)
|
52
|
+
subfield_codes = subfield_codes.is_a?(Array) ? subfield_codes : [subfield_codes]
|
53
|
+
|
54
|
+
@scope_subfields = []
|
55
|
+
|
56
|
+
@scope_datafields.each do |datafield|
|
57
|
+
@scope_subfields.push datafield.subfields.select { |subfield| subfield_codes.include? subfield.name.to_s }
|
58
|
+
end
|
59
|
+
|
60
|
+
@scope_subfields.flatten!
|
61
|
+
|
62
|
+
self
|
63
|
+
end
|
64
|
+
|
65
|
+
def subfields
|
66
|
+
scope_subfields
|
67
|
+
end
|
68
|
+
|
69
|
+
def value(options = {})
|
70
|
+
if !(_values = values(options)).nil?
|
71
|
+
_values.first
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def values(options = {})
|
76
|
+
if !scope_subfields.nil?
|
77
|
+
subfield_values = scope_subfields.map { |subfield| subfield.value }
|
78
|
+
@scope_values = (join_string = options[:join_subfields]) ? subfield_values.join(join_string == true ? '' : join_string) : subfield_values
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
private
|
83
|
+
|
84
|
+
# ensure a hash with array values
|
85
|
+
def sanitize_indicators(indicators)
|
86
|
+
indicators.inject({}) { |hash, (k, v)| hash[k] = (v.is_a?(Array) ? v.map(&:to_sym) : [v.to_sym]); hash }
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
data/lib/mab2/document.rb
CHANGED
@@ -1,28 +1,36 @@
|
|
1
|
-
require 'mab2/
|
2
|
-
require '
|
1
|
+
require 'mab2/aleph_sequential_adapter'
|
2
|
+
require 'mab2/mab_xml_adapter'
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
class Mab2::Document
|
5
|
+
require_relative 'document/datafield'
|
6
|
+
require_relative 'document/scope'
|
7
|
+
require_relative 'document/subfield'
|
6
8
|
|
7
|
-
|
9
|
+
attr_accessor :controlfields
|
10
|
+
attr_accessor :datafields
|
8
11
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
+
def initialize(input)
|
13
|
+
mab = if input.is_a?(Mab2::MabXmlAdapter) || input.is_a?(Mab2::AlephSequentialAdapter)
|
14
|
+
input
|
15
|
+
elsif input.is_a?(String) && input.starts_with?('<?xml')
|
16
|
+
Mab2::MabXmlAdapter.new(input)
|
17
|
+
elsif input.is_a?(String) && input.starts_with?('LEADER')
|
18
|
+
Mab2::AlephSequentialAdapter.new(input)
|
19
|
+
else
|
20
|
+
raise 'Unknown input format or adapter!'
|
12
21
|
end
|
13
22
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
def datafield(tag, options = {})
|
19
|
-
Mab2::DocumentScope.new(self).datafield(tag, options)
|
20
|
-
end
|
23
|
+
@controlfields = mab.controlfields
|
24
|
+
@datafields = mab.datafields
|
25
|
+
end
|
21
26
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
end
|
27
|
+
def controlfield(tag)
|
28
|
+
Mab2::Document::Scope.new(self).controlfield(tag)
|
29
|
+
end
|
26
30
|
|
31
|
+
# mabmapper uses field instead of datafield
|
32
|
+
def field(tag, options = {})
|
33
|
+
Mab2::Document::Scope.new(self).datafield(tag, options)
|
27
34
|
end
|
35
|
+
|
28
36
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
|
3
|
+
class Mab2::MabXmlAdapter
|
4
|
+
|
5
|
+
attr_accessor :controlfields, :datafields
|
6
|
+
|
7
|
+
def initialize(xml)
|
8
|
+
record = Nokogiri::XML(xml).remove_namespaces!.xpath('//OAI-PMH/ListRecords/record/metadata/record')
|
9
|
+
|
10
|
+
@controlfields = controlfields_from_mabxml(record)
|
11
|
+
@datafields = datafields_from_mabxml(record)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def controlfields_from_mabxml(mabxml)
|
17
|
+
if mabxml.is_a? Nokogiri::XML::NodeSet
|
18
|
+
mabxml.xpath('//controlfield').inject({}) do |controlfields, xml_node|
|
19
|
+
controlfields[xml_node.attr('tag').to_sym] = xml_node.content
|
20
|
+
|
21
|
+
# return resulting hash for inject's sake
|
22
|
+
controlfields
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def datafields_from_mabxml(mabxml)
|
28
|
+
if mabxml.is_a? Nokogiri::XML::NodeSet
|
29
|
+
mabxml.xpath('//datafield').inject({}) do |datafields, xml_node|
|
30
|
+
tag = xml_node.attr('tag').to_sym
|
31
|
+
ind1 = xml_node.attr('ind1').to_sym
|
32
|
+
ind2 = xml_node.attr('ind2').to_sym
|
33
|
+
|
34
|
+
existing_subfields = datafields[tag].try(:[], ind1).try(:[], ind2)
|
35
|
+
|
36
|
+
datafields[tag] = {
|
37
|
+
ind1 => {
|
38
|
+
ind2 => (existing_subfields.nil? ? [] : existing_subfields).push(xml_node.xpath('subfield').map do |subfield|
|
39
|
+
{ subfield.attr('code').to_sym => subfield.content }
|
40
|
+
end)
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
# return resulting hash for inject's sake
|
45
|
+
datafields
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
data/lib/mab2/version.rb
CHANGED
data/lib/mab2.rb
CHANGED
data/mab2.gemspec
CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_dependency 'nokogiri', '~> 1.6.0'
|
22
22
|
|
23
|
-
spec.add_development_dependency 'activesupport', '>= 3.2.0', '<
|
23
|
+
spec.add_development_dependency 'activesupport', '>= 3.2.0', '< 4.0.0'
|
24
24
|
spec.add_development_dependency 'bundler', '~> 1.3'
|
25
25
|
spec.add_development_dependency 'minitest', '~> 5.0.6'
|
26
26
|
spec.add_development_dependency 'pry', '~> 0.9.12.2'
|
@@ -15,4 +15,10 @@ module TestControlfield
|
|
15
15
|
assert_equal doc.controlfield('050').at(3), 'c'
|
16
16
|
end
|
17
17
|
|
18
|
+
# accessing non-existing controlfields
|
19
|
+
def test_controlfield_4
|
20
|
+
doc = Mab2::Document.new(load_mab('PAD01.000806191.PRIMO.xml'))
|
21
|
+
assert_equal doc.controlfield('052').at(0), nil
|
22
|
+
end
|
23
|
+
|
18
24
|
end
|
data/test/mab2/test_datafield.rb
CHANGED
@@ -1,21 +1,131 @@
|
|
1
1
|
module TestDatafield
|
2
2
|
|
3
|
+
#
|
4
|
+
# Synthetic dsl tests
|
5
|
+
#
|
6
|
+
# full blown path, single value
|
7
|
+
def test_dsl_1
|
8
|
+
doc = Mab2::Document.new(load_mab('dsl_1.xml'))
|
9
|
+
assert_equal 'Some string', doc.field('100', ind1: '1', ind2: '2').subfield('a').get.value
|
10
|
+
end
|
11
|
+
|
12
|
+
# missing ind2, single value
|
13
|
+
def test_dsl_1a
|
14
|
+
doc = Mab2::Document.new(load_mab('dsl_1.xml'))
|
15
|
+
assert_equal 'Some string', doc.field('100', ind1: '1').subfield('a').get.value
|
16
|
+
end
|
17
|
+
|
18
|
+
# missing ind1 + ind2, single value
|
19
|
+
def test_dsl_1b
|
20
|
+
doc = Mab2::Document.new(load_mab('dsl_1.xml'))
|
21
|
+
assert_equal 'Some string', doc.field('100').subfield('a').get.value
|
22
|
+
end
|
23
|
+
|
24
|
+
# missing ind1 + ind2, missing subfield, single value
|
25
|
+
def test_dsl_1c
|
26
|
+
doc = Mab2::Document.new(load_mab('dsl_1.xml'))
|
27
|
+
assert_equal 'Some string', doc.field('100').get.value
|
28
|
+
end
|
29
|
+
|
30
|
+
# missing ind1 + ind2, missing subfield, no get, single value
|
31
|
+
def test_dsl_1d
|
32
|
+
doc = Mab2::Document.new(load_mab('dsl_1.xml'))
|
33
|
+
assert_equal 'Some string', doc.field('100').value
|
34
|
+
end
|
35
|
+
|
36
|
+
# missing ind1 + ind2, missing subfield, no get, explicite values
|
37
|
+
def test_dsl_1e
|
38
|
+
doc = Mab2::Document.new(load_mab('dsl_1.xml'))
|
39
|
+
assert_equal ['Some string'], doc.field('100').values
|
40
|
+
end
|
41
|
+
|
42
|
+
# missing ind1 + ind2, missing subfield, get fields
|
43
|
+
def test_dsl_1f
|
44
|
+
doc = Mab2::Document.new(load_mab('dsl_1.xml'))
|
45
|
+
fields = doc.field('100').get.fields
|
46
|
+
assert_equal 'Some string', fields.first.get_subfield('a').value
|
47
|
+
end
|
48
|
+
|
49
|
+
# multiple datafields with same tag
|
50
|
+
def test_dsl_2
|
51
|
+
doc = Mab2::Document.new(load_mab('dsl_2.xml'))
|
52
|
+
assert_equal ["Politik", "Theorie", "(DE-588)4046563-9", "Politiktheorie", "(DE-588)4046563-9", "Politische Theorien", "(DE-588)4046563-9", "Politik", "Theorie", "(DE-588)4046563-9", "Politiktheorie", "(DE-588)4046563-9", "Politische Theorien", "(DE-588)4046563-9"], doc.field('PSW', ind1: '-', ind2: '1').get.values
|
53
|
+
end
|
54
|
+
|
55
|
+
# multiple datafields with same tag, filtered by subfield
|
56
|
+
def test_dsl_2a
|
57
|
+
doc = Mab2::Document.new(load_mab('dsl_2.xml'))
|
58
|
+
assert_equal ["Politik", "Politiktheorie", "Politische Theorien", "Politik", "Politiktheorie", "Politische Theorien"], doc.field('PSW', ind1: '-', ind2: '1').subfield('s').get.values
|
59
|
+
end
|
60
|
+
|
61
|
+
# multiple datafields with same tag, filtered by subfield only existent in two of n datafields
|
62
|
+
def test_dsl_2b
|
63
|
+
doc = Mab2::Document.new(load_mab('dsl_2.xml'))
|
64
|
+
assert_equal ["Theorie", "Theorie"], doc.field('PSW', ind1: '-', ind2: '1').subfield('x').get.values
|
65
|
+
end
|
66
|
+
|
67
|
+
# multiple datafields with same tag, filtered by subfield only existent in two of n datafields, only first value
|
68
|
+
def test_dsl_2c
|
69
|
+
doc = Mab2::Document.new(load_mab('dsl_2.xml'))
|
70
|
+
assert_equal "Theorie", doc.field('PSW', ind1: '-', ind2: '1').subfield('x').get.value
|
71
|
+
end
|
72
|
+
|
73
|
+
#
|
74
|
+
# Real world mab files
|
75
|
+
#
|
76
|
+
|
3
77
|
# ind1 missing
|
4
78
|
def test_datafield_1
|
5
79
|
doc = Mab2::Document.new(load_mab('PAD01.000806191.PRIMO.xml'))
|
6
80
|
assert_equal '20000217', doc.field('LOC', ind2: ' ').subfield('k').get.value
|
7
81
|
end
|
8
82
|
|
9
|
-
# ind1 missing,
|
83
|
+
# ind1 missing, multi ind2/subfield, first value
|
10
84
|
def test_datafield_2
|
11
85
|
doc = Mab2::Document.new(load_mab('PAD01.000806191.PRIMO.xml'))
|
12
86
|
assert_equal 'Gockel, Simone', doc.field("100", ind2: ['1', '2']).subfield(['a','p','c','n','b']).get.value
|
13
87
|
end
|
14
88
|
|
89
|
+
# ind1/ind2 missing, all values
|
15
90
|
def test_datafield_3
|
16
91
|
doc = Mab2::Document.new(load_mab('PAD01.000978177.PRIMO.xml'))
|
17
92
|
assert_equal ["Bajme, Klaus", "Beyme, Klaus", "Beyme, K. <<von>>", "Bajme, Klaus", "Beyme, Klaus", "Beyme, K. <<von>>"], doc.field('PPE').subfield(['a', 'p']).get.values
|
18
93
|
end
|
19
94
|
|
95
|
+
# ind1 negated '-z' => all but 'z', all values
|
96
|
+
def test_datafield_4
|
97
|
+
doc = Mab2::Document.new(load_mab('PAD01.000978177.PRIMO.xml'))
|
98
|
+
assert_equal ["978-3-518-28569-5"], doc.field('540', ind1: '-z', ind2: '1').subfield('a').get.values
|
99
|
+
end
|
100
|
+
|
101
|
+
# simple fields
|
102
|
+
def test_datafield_5
|
103
|
+
doc = Mab2::Document.new(load_mab('PAD01.000978177.PRIMO.xml'))
|
104
|
+
fields = doc.field('655').subfield(['u', '3', 'z', 't']).get.fields
|
105
|
+
assert_equal 'http://digitool.hbz-nrw.de:1801/webclient/DeliveryManager?pid=2280738&custom_att_2=simple_viewer', fields.first.get_subfield('u').value
|
106
|
+
end
|
107
|
+
|
108
|
+
# iterating over fields
|
109
|
+
def test_datafield_5
|
110
|
+
doc = Mab2::Document.new(load_mab('PAD01.000978177.PRIMO.xml'))
|
111
|
+
fields = doc.field('655').subfield(['u', '3', 'z', 't']).get.fields
|
112
|
+
fields.each do |field|
|
113
|
+
assert_equal 'VIEW', field.get_subfield('t').value
|
114
|
+
assert_equal 'http://digitool.hbz-nrw.de:1801/webclient/DeliveryManager?pid=2280738&custom_att_2=simple_viewer', field.get_subfield('u').value
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
#def test_datafield_6
|
119
|
+
# doc = Mab2::Document.new(load_mab('PAD01.000978177.PRIMO.xml'))
|
120
|
+
# fields = doc.field('PSW').subfield(['s', '9']).get.fields
|
121
|
+
# binding.pry
|
122
|
+
#end
|
123
|
+
|
124
|
+
# join_subfields
|
125
|
+
#def test_datafield_4
|
126
|
+
# doc = Mab2::Document.new(load_mab('PAD01.000978177.PRIMO.xml'))
|
127
|
+
# w = doc.field('525', ind2: '1').subfield(['p','a']).get.value(join_subfields: ': ')
|
128
|
+
# binding.pry
|
129
|
+
#end
|
20
130
|
|
21
131
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<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">
|
3
|
+
<ListRecords>
|
4
|
+
<record>
|
5
|
+
<metadata>
|
6
|
+
<record xmlns="http://www.ddb.de/professionell/mabxml/mabxml-1.xsd">
|
7
|
+
<datafield tag="100" ind1="1" ind2="2">
|
8
|
+
<subfield code="a">Some string</subfield>
|
9
|
+
</datafield>
|
10
|
+
</record>
|
11
|
+
</metadata>
|
12
|
+
</record>
|
13
|
+
</ListRecords>
|
14
|
+
</OAI-PMH>
|
@@ -0,0 +1,37 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<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">
|
3
|
+
<ListRecords>
|
4
|
+
<record>
|
5
|
+
<metadata>
|
6
|
+
<record xmlns="http://www.ddb.de/professionell/mabxml/mabxml-1.xsd">
|
7
|
+
<datafield tag="PSW" ind1="-" ind2="1">
|
8
|
+
<subfield code="s">Politik</subfield>
|
9
|
+
<subfield code="x">Theorie</subfield>
|
10
|
+
<subfield code="9">(DE-588)4046563-9</subfield>
|
11
|
+
</datafield>
|
12
|
+
<datafield tag="PSW" ind1="-" ind2="1">
|
13
|
+
<subfield code="s">Politiktheorie</subfield>
|
14
|
+
<subfield code="9">(DE-588)4046563-9</subfield>
|
15
|
+
</datafield>
|
16
|
+
<datafield tag="PSW" ind1="-" ind2="1">
|
17
|
+
<subfield code="s">Politische Theorien</subfield>
|
18
|
+
<subfield code="9">(DE-588)4046563-9</subfield>
|
19
|
+
</datafield>
|
20
|
+
<datafield tag="PSW" ind1="-" ind2="1">
|
21
|
+
<subfield code="s">Politik</subfield>
|
22
|
+
<subfield code="x">Theorie</subfield>
|
23
|
+
<subfield code="9">(DE-588)4046563-9</subfield>
|
24
|
+
</datafield>
|
25
|
+
<datafield tag="PSW" ind1="-" ind2="1">
|
26
|
+
<subfield code="s">Politiktheorie</subfield>
|
27
|
+
<subfield code="9">(DE-588)4046563-9</subfield>
|
28
|
+
</datafield>
|
29
|
+
<datafield tag="PSW" ind1="-" ind2="1">
|
30
|
+
<subfield code="s">Politische Theorien</subfield>
|
31
|
+
<subfield code="9">(DE-588)4046563-9</subfield>
|
32
|
+
</datafield>
|
33
|
+
</record>
|
34
|
+
</metadata>
|
35
|
+
</record>
|
36
|
+
</ListRecords>
|
37
|
+
</OAI-PMH>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mab2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Sievers
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-11-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -33,7 +33,7 @@ dependencies:
|
|
33
33
|
version: 3.2.0
|
34
34
|
- - <
|
35
35
|
- !ruby/object:Gem::Version
|
36
|
-
version:
|
36
|
+
version: 4.0.0
|
37
37
|
type: :development
|
38
38
|
prerelease: false
|
39
39
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: 3.2.0
|
44
44
|
- - <
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version:
|
46
|
+
version: 4.0.0
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: bundler
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -127,14 +127,20 @@ files:
|
|
127
127
|
- README.md
|
128
128
|
- Rakefile
|
129
129
|
- lib/mab2.rb
|
130
|
+
- lib/mab2/aleph_sequential_adapter.rb
|
130
131
|
- lib/mab2/document.rb
|
131
|
-
- lib/mab2/
|
132
|
+
- lib/mab2/document/datafield.rb
|
133
|
+
- lib/mab2/document/scope.rb
|
134
|
+
- lib/mab2/document/subfield.rb
|
135
|
+
- lib/mab2/mab_xml_adapter.rb
|
132
136
|
- lib/mab2/version.rb
|
133
137
|
- mab2.gemspec
|
134
138
|
- test/mab2/test_controlfield.rb
|
135
139
|
- test/mab2/test_datafield.rb
|
136
140
|
- test/mab_files/PAD01.000806191.PRIMO.xml
|
137
141
|
- test/mab_files/PAD01.000978177.PRIMO.xml
|
142
|
+
- test/mab_files/dsl_1.xml
|
143
|
+
- test/mab_files/dsl_2.xml
|
138
144
|
- test/test_helper.rb
|
139
145
|
- test/test_mab2.rb
|
140
146
|
homepage: https://github.com/msievers/mab2
|
@@ -166,5 +172,7 @@ test_files:
|
|
166
172
|
- test/mab2/test_datafield.rb
|
167
173
|
- test/mab_files/PAD01.000806191.PRIMO.xml
|
168
174
|
- test/mab_files/PAD01.000978177.PRIMO.xml
|
175
|
+
- test/mab_files/dsl_1.xml
|
176
|
+
- test/mab_files/dsl_2.xml
|
169
177
|
- test/test_helper.rb
|
170
178
|
- test/test_mab2.rb
|
data/lib/mab2/document_scope.rb
DELETED
@@ -1,64 +0,0 @@
|
|
1
|
-
class Mab2::DocumentScope
|
2
|
-
|
3
|
-
def initialize(scoped_document)
|
4
|
-
@doc = scoped_document.nokogiri_document
|
5
|
-
end
|
6
|
-
|
7
|
-
def controlfield(tag)
|
8
|
-
@doc.css("controlfield[tag='#{tag}']").text.chars
|
9
|
-
end
|
10
|
-
|
11
|
-
def datafield(tag, indicators)
|
12
|
-
@tag = tag
|
13
|
-
@indicators = indicators.inject({}) { |hash, (k, v)| hash[k] = (v.is_a?(Array) ? v : [v]); hash }
|
14
|
-
self
|
15
|
-
end
|
16
|
-
|
17
|
-
def get
|
18
|
-
self
|
19
|
-
end
|
20
|
-
|
21
|
-
def subfield(subfield_codes)
|
22
|
-
@subfield_codes = subfield_codes.is_a?(Array) ? subfield_codes : [subfield_codes]
|
23
|
-
self
|
24
|
-
end
|
25
|
-
|
26
|
-
def value
|
27
|
-
values.first
|
28
|
-
end
|
29
|
-
|
30
|
-
def values
|
31
|
-
datafield_selectors = []
|
32
|
-
|
33
|
-
if @indicators[:ind1].present? && @indicators[:ind2].blank?
|
34
|
-
@indicators[:ind1].each do |ind1_value|
|
35
|
-
datafield_selectors.push("datafield[tag='#{@tag}'][ind1='#{ind1_value}']")
|
36
|
-
end
|
37
|
-
elsif @indicators[:ind1].blank? && @indicators[:ind2].present?
|
38
|
-
@indicators[:ind2].each do |ind2_value|
|
39
|
-
datafield_selectors.push("datafield[tag='#{@tag}'][ind2='#{ind2_value}']")
|
40
|
-
end
|
41
|
-
elsif @indicators[:ind1].present? && @indicators[:ind2].present?
|
42
|
-
@indicators[:ind1].each do |ind1_value|
|
43
|
-
@indicators[:ind2].each do |ind2_value|
|
44
|
-
datafield_selectors.push("datafield[tag='#{@tag}'][ind1='#{ind1_value}'][ind2='#{ind2_value}']")
|
45
|
-
end
|
46
|
-
end
|
47
|
-
else
|
48
|
-
datafield_selectors.push("datafield[tag='#{@tag}']")
|
49
|
-
end
|
50
|
-
|
51
|
-
css_selector = if @subfield_codes.present?
|
52
|
-
datafield_selectors.map do |selector|
|
53
|
-
@subfield_codes.map do |subfield_code|
|
54
|
-
"#{selector} subfield[code='#{subfield_code}']"
|
55
|
-
end
|
56
|
-
end
|
57
|
-
else
|
58
|
-
indicator_selectors
|
59
|
-
end.flatten.join(', ')
|
60
|
-
|
61
|
-
@doc.css(css_selector).map(&:text)
|
62
|
-
end
|
63
|
-
|
64
|
-
end
|