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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cbecb44d9edd1e649510ee35cc401277ba3cff9d
4
- data.tar.gz: 9aabd361f1ba9b69727b08435176d8a2e9c37d37
3
+ metadata.gz: d1659413e48d57b2b853237962d2763d20bf6288
4
+ data.tar.gz: cd5bbecc8442e0769c27539e40283b41e361dc96
5
5
  SHA512:
6
- metadata.gz: a3f6292cd094c7a5834cd34e63e5983b9f47de5eef2520f1d47dc8dc4f6da073545052b2b570e7e36892c467dba377694cac7756eb8edbe00437d9e26907b680
7
- data.tar.gz: e696b3d6612c4f1840db905eed35a0873de66c2c684806e1f5e245b2eac55b436f5ba0c80b86e8d59c0cc89887aea1c64d8bc5682c7a7641e6019283ca5cbd44
6
+ metadata.gz: bfde3b1e18c169f751db9faf12fa988c614ef63dcd76600ea9b143a1e9ecc95deebbce608579843b80dbdb3c517d1abfd7f242d7468294a2ea24108bcd684d37
7
+ data.tar.gz: 54e634c0052d6594bb3cc6e8920d2452baf901f5250bc8de34d0611088a222fb36ca83c63fbe060946d828c640a60b79ac42ba5d16111caf1413c304bdf1671d
@@ -0,0 +1,10 @@
1
+ class Mab2::AlephSequentialAdapter
2
+
3
+ attr_accessor :controlfields, :datafields
4
+
5
+ def initialize(aleph_sequential)
6
+ @controlfields = {}
7
+ @datafields = {}
8
+ end
9
+
10
+ end
@@ -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
@@ -0,0 +1,10 @@
1
+ class Mab2::Document::Subfield
2
+
3
+ attr_accessor :name, :value
4
+
5
+ def initialize(hash)
6
+ @name = hash.keys.first
7
+ @value = hash.values.first
8
+ end
9
+
10
+ end
data/lib/mab2/document.rb CHANGED
@@ -1,28 +1,36 @@
1
- require 'mab2/document_scope'
2
- require 'nokogiri'
1
+ require 'mab2/aleph_sequential_adapter'
2
+ require 'mab2/mab_xml_adapter'
3
3
 
4
- module Mab2
5
- class Document
4
+ class Mab2::Document
5
+ require_relative 'document/datafield'
6
+ require_relative 'document/scope'
7
+ require_relative 'document/subfield'
6
8
 
7
- attr_accessor :nokogiri_document
9
+ attr_accessor :controlfields
10
+ attr_accessor :datafields
8
11
 
9
- # we assume someone calls us like this Mab2::Document.new('<xml>...'</xml>')
10
- def initialize(xml)
11
- @nokogiri_document = Nokogiri::XML(xml).remove_namespaces!.css('OAI-PMH ListRecords record metadata record')
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
- def controlfield(tag)
15
- Mab2::DocumentScope.new(self).controlfield(tag)
16
- end
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
- # mabmapper uses field instead of datafield
23
- def field(tag, options = {})
24
- datafield(tag, options)
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
@@ -1,3 +1,3 @@
1
1
  module Mab2
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
data/lib/mab2.rb CHANGED
@@ -1,2 +1,4 @@
1
- require 'mab2/document'
2
- require 'mab2/version'
1
+ module Mab2
2
+ require 'mab2/document'
3
+ require 'mab2/version'
4
+ end
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', '< 5.0.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
@@ -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, first value of multi ind2/subfield query
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.2
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-09-25 00:00:00.000000000 Z
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: 5.0.0
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: 5.0.0
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/document_scope.rb
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
@@ -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