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 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