metacrunch-marcxml 2.0.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.
- checksums.yaml +7 -0
- data/.gitignore +24 -0
- data/.rspec +3 -0
- data/.travis.yml +9 -0
- data/.yardopts +9 -0
- data/Gemfile +17 -0
- data/License.txt +22 -0
- data/Rakefile +6 -0
- data/Readme.md +92 -0
- data/bin/console +14 -0
- data/lib/metacrunch/marcxml/document/controlfield.rb +17 -0
- data/lib/metacrunch/marcxml/document/datafield.rb +50 -0
- data/lib/metacrunch/marcxml/document/datafield_set.rb +39 -0
- data/lib/metacrunch/marcxml/document/subfield.rb +17 -0
- data/lib/metacrunch/marcxml/document/subfield_set.rb +42 -0
- data/lib/metacrunch/marcxml/document.rb +111 -0
- data/lib/metacrunch/marcxml/parser.rb +81 -0
- data/lib/metacrunch/marcxml/version.rb +5 -0
- data/lib/metacrunch/marcxml.rb +38 -0
- data/metacrunch-marcxml.gemspec +24 -0
- metadata +104 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 108b2f6697c4cc1fd07f61231da1a5b0219e7fe1
|
4
|
+
data.tar.gz: 8ca7bdf5edc53577c1dd700e00af500b388bb386
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 80c1d9f509ee566035a76f62429662fd524d4f123b50a303776aea4e301479ad41c380e89f9622d3063b96733fec6fdaf72b4ce146ca027a7ef07836dc6e55b1
|
7
|
+
data.tar.gz: dd1abb2e6f24dd197ffdcb3b8e1b774d127d9b5a3fc13cb7e464f5e6fcb1ffa83f8054bef2a132ce4fed31236333947d6be3970d6047b59621a38417c1616bab
|
data/.gitignore
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
.DS_Store
|
2
|
+
/doc
|
3
|
+
*.gem
|
4
|
+
*.rbc
|
5
|
+
.bundle
|
6
|
+
.config
|
7
|
+
.yardoc
|
8
|
+
Gemfile.lock
|
9
|
+
InstalledFiles
|
10
|
+
_yardoc
|
11
|
+
coverage
|
12
|
+
doc/
|
13
|
+
lib/bundler/man
|
14
|
+
pkg
|
15
|
+
rdoc
|
16
|
+
spec/reports
|
17
|
+
test/tmp
|
18
|
+
test/version_tmp
|
19
|
+
tmp
|
20
|
+
*.bundle
|
21
|
+
*.so
|
22
|
+
*.o
|
23
|
+
*.a
|
24
|
+
mkmf.log
|
data/.rspec
ADDED
data/.travis.yml
ADDED
data/.yardopts
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
source "https://rubygems.org"
|
2
|
+
|
3
|
+
gemspec
|
4
|
+
|
5
|
+
group :development do
|
6
|
+
gem "bundler", ">= 1.15"
|
7
|
+
gem "rake", ">= 12.1"
|
8
|
+
gem "rspec", ">= 3.5.0", "< 4.0.0"
|
9
|
+
|
10
|
+
if !ENV["CI"]
|
11
|
+
gem "pry-byebug", ">= 3.5.0"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
group :test do
|
16
|
+
gem "simplecov", ">= 0.15.0"
|
17
|
+
end
|
data/License.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2017 René Sprotte
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
data/Readme.md
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
metacrunch-marcxml
|
2
|
+
==================
|
3
|
+
|
4
|
+
[](https://travis-ci.org/ubpb/metacrunch-marcxml)
|
5
|
+
[](https://codeclimate.com/github/ubpb/metacrunch-marcxml)
|
6
|
+
|
7
|
+
This is the official [MARCXML](http://www.loc.gov/standards/marcxml/) package for the [metacrunch ETL toolkit](https://github.com/ubpb/metacrunch). It allows you to access MARCXML data by a simple and powerful Ruby API.
|
8
|
+
|
9
|
+
There is no runtime dependency to metacrunch, so it's fine to use this gem in any Ruby application where you need to access MARCXML data.
|
10
|
+
|
11
|
+
*Note: Before 2.0 this package was incorrectly named `metacrunch-mab2` and has been renamed to `metacrunch-marcxml`. Due to this renaming and further development there are breaking API changes if you upgrade from 1.x to 2.x.*
|
12
|
+
|
13
|
+
|
14
|
+
Installation
|
15
|
+
------------
|
16
|
+
|
17
|
+
Include the gem in your `Gemfile`
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
gem "metacrunch-marcxml", "~> 2.0.0"
|
21
|
+
```
|
22
|
+
|
23
|
+
and run `$ bundle install` to install it.
|
24
|
+
|
25
|
+
Or install it manually
|
26
|
+
|
27
|
+
```
|
28
|
+
$ gem install metacrunch-marcxml
|
29
|
+
```
|
30
|
+
|
31
|
+
|
32
|
+
Usage example
|
33
|
+
-------------
|
34
|
+
|
35
|
+
**Loading the library**
|
36
|
+
```ruby
|
37
|
+
require "metacrunch/marcxml"
|
38
|
+
```
|
39
|
+
|
40
|
+
**Parsing a [MARCXML file](http://d-nb.info/982392028/about/marcxml)**
|
41
|
+
```ruby
|
42
|
+
# Load a MARCXML file (from a remote location in this example).
|
43
|
+
require "open-uri"
|
44
|
+
marcxml = open("http://d-nb.info/982392028/about/marcxml"){|io| io.read}
|
45
|
+
|
46
|
+
# Now parse the file
|
47
|
+
document = Metacrunch::Marcxml.parse(marcxml)
|
48
|
+
# .. or use the convenience method
|
49
|
+
document = Metacrunch::Marcxml(marcxml)
|
50
|
+
```
|
51
|
+
|
52
|
+
**Accessing control fields**
|
53
|
+
```ruby
|
54
|
+
controlfield = document.controlfield("005")
|
55
|
+
# same as ...
|
56
|
+
controlfield = document.controlfield(5)
|
57
|
+
# => #<Metacrunch::Marcxml::Document::Controlfield:0x007fd4c5120ec0 ...>
|
58
|
+
|
59
|
+
tag = controlfield.tag
|
60
|
+
# => "005"
|
61
|
+
value = controlfield.value
|
62
|
+
# => "20130926112144.0"
|
63
|
+
```
|
64
|
+
|
65
|
+
**Accessing data fields / sub fields**
|
66
|
+
```ruby
|
67
|
+
# Find fields matching tag=100 and indicator1=1 (author)
|
68
|
+
datafield_set = document.datafields(100, ind1: "1")
|
69
|
+
# => #<Metacrunch::Marcxml::Document::DatafieldSet:0x007fd4c4ce4b40 ...>
|
70
|
+
|
71
|
+
first_author = datafield_set.first # set is an Enumerable
|
72
|
+
# => #<Metacrunch::Marcxml::Document::Datafield:0x007fd4c5129480 ...>
|
73
|
+
|
74
|
+
# Get the subfields matching code=a (author name)
|
75
|
+
subfield_set = first_author.subfields("a")
|
76
|
+
# => #<Metacrunch::Marcxml::Document::SubfieldSet:0x007fd4c4c779f0 ...>
|
77
|
+
|
78
|
+
# because sub field "a" is not repeatable we know there can only be one match
|
79
|
+
first_author_subfield = subfield_set.first # subfield_set is an Enumerable
|
80
|
+
# => #<Metacrunch::Marcxml::Document::Subfield:0x007fd4c5129660 ...>
|
81
|
+
|
82
|
+
first_author_name = first_author_subfield.value
|
83
|
+
# => "Orwell, George"
|
84
|
+
|
85
|
+
# ... there is a shortcut for this case
|
86
|
+
first_author_name = document.datafields(100, ind1: "1").subfields("a").first_value
|
87
|
+
```
|
88
|
+
|
89
|
+
License
|
90
|
+
-------
|
91
|
+
|
92
|
+
metacrunch-marcxml is available at [github](https://github.com/ubpb/metacrunch-marcxml) under [MIT license](https://github.com/ubpb/metacrunch-marcxml/blob/master/License.txt).
|
data/bin/console
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
module Metacrunch
|
2
|
+
module Marcxml
|
3
|
+
class Document
|
4
|
+
class Datafield
|
5
|
+
|
6
|
+
attr_reader :tag
|
7
|
+
attr_reader :ind1, :ind2
|
8
|
+
|
9
|
+
def initialize(tag, ind1:nil, ind2:nil)
|
10
|
+
@tag = tag
|
11
|
+
@ind1 = ind1
|
12
|
+
@ind2 = ind2
|
13
|
+
@subfields_map = {}
|
14
|
+
end
|
15
|
+
|
16
|
+
#
|
17
|
+
# Returns the sub fields matching the given code.
|
18
|
+
#
|
19
|
+
# @param [String, nil, Array<String>] code of the sub field
|
20
|
+
# @return [Metacrunch::Marcxml::Document::SubfieldSet] sub field with the given code. The set
|
21
|
+
# is empty if the sub field doesn't exists.
|
22
|
+
#
|
23
|
+
def subfields(code = nil)
|
24
|
+
matched_subfields = if code.nil?
|
25
|
+
@subfields_map.values.flatten(1)
|
26
|
+
else
|
27
|
+
if (codes = code).is_a?(Array)
|
28
|
+
codes.map{ |_code| @subfields_map[_code] }.compact.flatten(1)
|
29
|
+
else
|
30
|
+
@subfields_map[code]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
SubfieldSet.new(matched_subfields)
|
35
|
+
end
|
36
|
+
|
37
|
+
#
|
38
|
+
# Adds a new sub field.
|
39
|
+
#
|
40
|
+
# @param [Metacrunch::Marcxml::Document::Subfield] subfield
|
41
|
+
#
|
42
|
+
def add_subfield(subfield)
|
43
|
+
(@subfields_map[subfield.code] ||= []) << subfield
|
44
|
+
subfield
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Metacrunch
|
2
|
+
module Marcxml
|
3
|
+
class Document
|
4
|
+
class DatafieldSet
|
5
|
+
include Enumerable
|
6
|
+
|
7
|
+
def initialize(datafields)
|
8
|
+
@datafields = datafields || []
|
9
|
+
end
|
10
|
+
|
11
|
+
def each(&block)
|
12
|
+
@datafields.each(&block)
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_a
|
16
|
+
@datafields
|
17
|
+
end
|
18
|
+
|
19
|
+
def empty?
|
20
|
+
@datafields.empty?
|
21
|
+
end
|
22
|
+
|
23
|
+
def present?
|
24
|
+
!empty?
|
25
|
+
end
|
26
|
+
|
27
|
+
# @return [Metacrunch::Marcxml::Document::SubfieldSet]
|
28
|
+
def subfields(code = nil)
|
29
|
+
subfields = @datafields.map do |datafield|
|
30
|
+
datafield.subfields(code).to_a
|
31
|
+
end.flatten(1)
|
32
|
+
|
33
|
+
Metacrunch::Marcxml::Document::SubfieldSet.new(subfields)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Metacrunch
|
2
|
+
module Marcxml
|
3
|
+
class Document
|
4
|
+
class SubfieldSet
|
5
|
+
include Enumerable
|
6
|
+
|
7
|
+
def initialize(subfields)
|
8
|
+
@subfields = subfields || []
|
9
|
+
end
|
10
|
+
|
11
|
+
def each(&block)
|
12
|
+
@subfields.each(&block)
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_a
|
16
|
+
@subfields
|
17
|
+
end
|
18
|
+
|
19
|
+
def empty?
|
20
|
+
@subfields.empty?
|
21
|
+
end
|
22
|
+
|
23
|
+
def present?
|
24
|
+
!empty?
|
25
|
+
end
|
26
|
+
|
27
|
+
def values
|
28
|
+
@subfields.map{ |subfield| subfield.value }
|
29
|
+
end
|
30
|
+
|
31
|
+
def present_values
|
32
|
+
values.map{ |v| v.presence }.compact
|
33
|
+
end
|
34
|
+
|
35
|
+
def first_value
|
36
|
+
present_values[0]
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require_relative "document/controlfield"
|
2
|
+
require_relative "document/datafield"
|
3
|
+
require_relative "document/datafield_set"
|
4
|
+
require_relative "document/subfield"
|
5
|
+
require_relative "document/subfield_set"
|
6
|
+
|
7
|
+
module Metacrunch
|
8
|
+
module Marcxml
|
9
|
+
class Document
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@controlfields_map = {}
|
13
|
+
@datafields_map = {}
|
14
|
+
end
|
15
|
+
|
16
|
+
# ------------------------------------------------------------------------------
|
17
|
+
# Control fields
|
18
|
+
# ------------------------------------------------------------------------------
|
19
|
+
|
20
|
+
#
|
21
|
+
# Returns the control field matching the given tag or nil if a control field
|
22
|
+
# with the given tag does not exist.
|
23
|
+
#
|
24
|
+
# @param tag [String, Integer] the tag of the control field. The tag can be
|
25
|
+
# a string or an integer.
|
26
|
+
# @return [Controlfield, nil] the control field with the matching tag or nil
|
27
|
+
# if a control field with a matching tag does not exist.
|
28
|
+
#
|
29
|
+
def controlfield(tag)
|
30
|
+
@controlfields_map[normalize_tag(tag)]
|
31
|
+
end
|
32
|
+
|
33
|
+
#
|
34
|
+
# @!visibility private
|
35
|
+
#
|
36
|
+
def add_controlfield(controlfield)
|
37
|
+
@controlfields_map[controlfield.tag] = controlfield
|
38
|
+
end
|
39
|
+
|
40
|
+
# ------------------------------------------------------------------------------
|
41
|
+
# Data fields
|
42
|
+
# ------------------------------------------------------------------------------
|
43
|
+
|
44
|
+
#
|
45
|
+
# Returns the data fields matching the given tag(s) and/or ind1/ind2.
|
46
|
+
#
|
47
|
+
# @param tag [String, Integer, #each, nil] filter by tag(s). Can be `nil`
|
48
|
+
# to match all data fields. The tag can be a string or an integer. To filter for
|
49
|
+
# more than a single tag, `tag` also accepts any object that responds to `#each` like
|
50
|
+
# `Array` and `Range`.
|
51
|
+
#
|
52
|
+
# @param ind1 [String, nil, Array<String>] filter by indicator 1. Can be nil to match
|
53
|
+
# any indicator.
|
54
|
+
# @param ind2 [String, nil, Array<String>] filter by indicator 2. Can be nil to match
|
55
|
+
# any indicator.
|
56
|
+
#
|
57
|
+
# @return [Metacrunch::Marcxml::Document::DatafieldSet] Set of data fields matching the
|
58
|
+
# given tag(s) and ind1/ind2. The set is empty if a matching field doesn't exist.
|
59
|
+
#
|
60
|
+
def datafields(tag = nil, ind1: nil, ind2: nil)
|
61
|
+
matched_datafields = case tag
|
62
|
+
when nil
|
63
|
+
@datafields_map.values.flatten(1)
|
64
|
+
when Enumerable
|
65
|
+
tag.map{ |_tag| @datafields_map[normalize_tag(_tag)] }.compact.flatten(1)
|
66
|
+
else
|
67
|
+
@datafields_map[normalize_tag(tag)]
|
68
|
+
end
|
69
|
+
|
70
|
+
matched_datafields = (matched_datafields || []).select do |datafield|
|
71
|
+
match_indicator(ind1, datafield.ind1) && match_indicator(ind2, datafield.ind2)
|
72
|
+
end
|
73
|
+
|
74
|
+
DatafieldSet.new(matched_datafields)
|
75
|
+
end
|
76
|
+
|
77
|
+
#
|
78
|
+
# @!visibility private
|
79
|
+
#
|
80
|
+
def add_datafield(datafield)
|
81
|
+
(@datafields_map[datafield.tag] ||= []) << datafield
|
82
|
+
datafield
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
def match_indicator(requested_ind, datafield_ind)
|
88
|
+
[*[requested_ind]].flatten.map do |_requested_ind|
|
89
|
+
if !_requested_ind
|
90
|
+
true
|
91
|
+
elsif _requested_ind == :blank && (datafield_ind == " " || datafield_ind == "-" || datafield_ind.nil?)
|
92
|
+
true
|
93
|
+
elsif _requested_ind == datafield_ind
|
94
|
+
true
|
95
|
+
else
|
96
|
+
false
|
97
|
+
end
|
98
|
+
end.any?
|
99
|
+
end
|
100
|
+
|
101
|
+
def normalize_tag(tag)
|
102
|
+
case tag
|
103
|
+
when Integer then tag.to_s.rjust(3, "0")
|
104
|
+
when String then tag
|
105
|
+
else tag.to_s
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module Metacrunch
|
2
|
+
module Marcxml
|
3
|
+
class Parser < Ox::Sax
|
4
|
+
|
5
|
+
def parse(mab_xml)
|
6
|
+
# initialize state machine
|
7
|
+
@in_controlfield = @in_datafield = @in_subfield = false
|
8
|
+
|
9
|
+
@controlfield = @datafield = @subfield = nil
|
10
|
+
@document = Document.new
|
11
|
+
@html_entities_coder = HTMLEntities.new
|
12
|
+
|
13
|
+
# convert_special tells ox to convert some html entities already during
|
14
|
+
# parsing, which minifies the amount of entities we have to decode ourself
|
15
|
+
Ox.sax_parse(self, mab_xml, convert_special: true)
|
16
|
+
|
17
|
+
return @document
|
18
|
+
end
|
19
|
+
|
20
|
+
def start_element(name)
|
21
|
+
if name == :subfield
|
22
|
+
@in_subfield = true
|
23
|
+
@subfield = {}
|
24
|
+
elsif name == :datafield
|
25
|
+
@in_datafield = true
|
26
|
+
@datafield = {subfields: []}
|
27
|
+
elsif name == :controlfield
|
28
|
+
@in_controlfield = true
|
29
|
+
@controlfield = {}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def end_element(name)
|
34
|
+
if @in_subfield
|
35
|
+
@in_subfield = false
|
36
|
+
|
37
|
+
subfield = Document::Subfield.new(@subfield[:code], @subfield[:value])
|
38
|
+
@datafield[:subfields] << subfield
|
39
|
+
elsif @in_datafield
|
40
|
+
@in_datafield = false
|
41
|
+
|
42
|
+
datafield = Document::Datafield.new(@datafield[:tag], ind1: @datafield[:ind1], ind2: @datafield[:ind2])
|
43
|
+
@datafield[:subfields].each do |subfield|
|
44
|
+
datafield.add_subfield(subfield)
|
45
|
+
end
|
46
|
+
|
47
|
+
@document.add_datafield(datafield)
|
48
|
+
elsif @in_controlfield
|
49
|
+
@in_controlfield = false
|
50
|
+
|
51
|
+
controlfield = Document::Controlfield.new(@controlfield[:tag], @controlfield[:values])
|
52
|
+
@document.add_controlfield(controlfield)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def attr(name, value)
|
57
|
+
if @in_subfield
|
58
|
+
@subfield[:code] = value if name == :code
|
59
|
+
elsif @in_datafield
|
60
|
+
if name == :tag
|
61
|
+
@datafield[:tag] = value
|
62
|
+
elsif name == :ind1
|
63
|
+
@datafield[:ind1] = value
|
64
|
+
elsif name == :ind2
|
65
|
+
@datafield[:ind2] = value
|
66
|
+
end
|
67
|
+
elsif @in_controlfield
|
68
|
+
@controlfield[:tag] = value if name == :tag
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def text(value)
|
73
|
+
if @in_subfield
|
74
|
+
@subfield[:value] = value.include?("&") ? @html_entities_coder.decode(value) : value
|
75
|
+
elsif @in_controlfield
|
76
|
+
@controlfield[:values] = value
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require "active_support"
|
2
|
+
require "active_support/core_ext"
|
3
|
+
require "htmlentities"
|
4
|
+
require "ox"
|
5
|
+
|
6
|
+
module Metacrunch
|
7
|
+
require_relative "marcxml/version"
|
8
|
+
require_relative "marcxml/parser"
|
9
|
+
require_relative "marcxml/document"
|
10
|
+
|
11
|
+
class << self
|
12
|
+
#
|
13
|
+
# Convenience method for Metacrunch::Marcxml.parse
|
14
|
+
#
|
15
|
+
# @return [Metacrunch::Marcxml::Document] the parsed {Metacrunch::Marcxml::Document}
|
16
|
+
# @see Metacrunch::Marcxml#parse
|
17
|
+
#
|
18
|
+
def Marcxml(xml)
|
19
|
+
Metacrunch::Marcxml.parse(xml)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
module Marcxml
|
25
|
+
class << self
|
26
|
+
#
|
27
|
+
# Parses a MARCXML string into a {Metacrunch::Marcxml::Document}.
|
28
|
+
#
|
29
|
+
# @param xml [String] the MARCXML document as a string
|
30
|
+
# @return [Metacrunch::Marcxml::Document] the parsed {Metacrunch::Marcxml::Document}
|
31
|
+
#
|
32
|
+
def parse(xml)
|
33
|
+
Parser.new.parse(xml)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require "metacrunch/marcxml/version"
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "metacrunch-marcxml"
|
8
|
+
spec.version = Metacrunch::Marcxml::VERSION
|
9
|
+
spec.authors = ["René Sprotte"]
|
10
|
+
spec.email = "r.sprotte@ub.uni-paderborn.de"
|
11
|
+
spec.summary = %q{MARCXML package for the metacrunch ETL toolkit.}
|
12
|
+
spec.homepage = "http://github.com/ubpb/metacrunch-marcxml"
|
13
|
+
spec.license = "MIT"
|
14
|
+
|
15
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
16
|
+
spec.bindir = "exe"
|
17
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.add_dependency "activesupport", ">= 5.1"
|
21
|
+
spec.add_dependency "htmlentities", ">= 4.3"
|
22
|
+
spec.add_dependency "ox", ">= 2.8"
|
23
|
+
end
|
24
|
+
|
metadata
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: metacrunch-marcxml
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- René Sprotte
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-09-27 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '5.1'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '5.1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: htmlentities
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '4.3'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '4.3'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: ox
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.8'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.8'
|
55
|
+
description:
|
56
|
+
email: r.sprotte@ub.uni-paderborn.de
|
57
|
+
executables: []
|
58
|
+
extensions: []
|
59
|
+
extra_rdoc_files: []
|
60
|
+
files:
|
61
|
+
- ".gitignore"
|
62
|
+
- ".rspec"
|
63
|
+
- ".travis.yml"
|
64
|
+
- ".yardopts"
|
65
|
+
- Gemfile
|
66
|
+
- License.txt
|
67
|
+
- Rakefile
|
68
|
+
- Readme.md
|
69
|
+
- bin/console
|
70
|
+
- lib/metacrunch/marcxml.rb
|
71
|
+
- lib/metacrunch/marcxml/document.rb
|
72
|
+
- lib/metacrunch/marcxml/document/controlfield.rb
|
73
|
+
- lib/metacrunch/marcxml/document/datafield.rb
|
74
|
+
- lib/metacrunch/marcxml/document/datafield_set.rb
|
75
|
+
- lib/metacrunch/marcxml/document/subfield.rb
|
76
|
+
- lib/metacrunch/marcxml/document/subfield_set.rb
|
77
|
+
- lib/metacrunch/marcxml/parser.rb
|
78
|
+
- lib/metacrunch/marcxml/version.rb
|
79
|
+
- metacrunch-marcxml.gemspec
|
80
|
+
homepage: http://github.com/ubpb/metacrunch-marcxml
|
81
|
+
licenses:
|
82
|
+
- MIT
|
83
|
+
metadata: {}
|
84
|
+
post_install_message:
|
85
|
+
rdoc_options: []
|
86
|
+
require_paths:
|
87
|
+
- lib
|
88
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '0'
|
93
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
requirements: []
|
99
|
+
rubyforge_project:
|
100
|
+
rubygems_version: 2.6.11
|
101
|
+
signing_key:
|
102
|
+
specification_version: 4
|
103
|
+
summary: MARCXML package for the metacrunch ETL toolkit.
|
104
|
+
test_files: []
|