mab2 0.0.2 → 0.0.3
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.
- 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
|