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 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
@@ -0,0 +1,3 @@
1
+ --color
2
+ --format documentation
3
+ --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ rvm:
3
+ - ruby-2.3.3
4
+ - ruby-2.4.0
5
+ addons:
6
+ code_climate:
7
+ repo_token: edec9ede0a6915474955b4afc932be887f09bcd5257433adc79a13ef3451f36d
8
+ after_success:
9
+ - bundle exec codeclimate-test-reporter
data/.yardopts ADDED
@@ -0,0 +1,9 @@
1
+ --no-cache
2
+ --no-output
3
+ --verbose
4
+ --markup markdown
5
+ --markup-provider redcarpet
6
+ --asset doc/images:images
7
+ --readme Readme.md
8
+ --hide-void-return
9
+ lib/**/*.rb
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
@@ -0,0 +1,6 @@
1
+ require "rspec/core/rake_task"
2
+ require "bundler/gem_tasks"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/Readme.md ADDED
@@ -0,0 +1,92 @@
1
+ metacrunch-marcxml
2
+ ==================
3
+
4
+ [![Build Status](https://travis-ci.org/ubpb/metacrunch-marcxml.svg)](https://travis-ci.org/ubpb/metacrunch-marcxml)
5
+ [![Code Climate](https://codeclimate.com/github/ubpb/metacrunch-marcxml/badges/gpa.svg)](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,14 @@
1
+ #!/usr/bin/env ruby
2
+ require "bundler/setup"
3
+ require "metacrunch/marcxml"
4
+
5
+ begin
6
+ require "pry"
7
+ rescue LoadError ; end
8
+
9
+ if defined?(Pry)
10
+ Pry.start
11
+ else
12
+ require "irb"
13
+ IRB.start
14
+ end
@@ -0,0 +1,17 @@
1
+ module Metacrunch
2
+ module Marcxml
3
+ class Document
4
+ class Controlfield
5
+
6
+ attr_reader :tag
7
+ attr_reader :value
8
+
9
+ def initialize(tag, value)
10
+ @tag = tag
11
+ @value = value
12
+ end
13
+
14
+ end
15
+ end
16
+ end
17
+ end
@@ -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,17 @@
1
+ module Metacrunch
2
+ module Marcxml
3
+ class Document
4
+ class Subfield
5
+
6
+ attr_reader :code
7
+ attr_reader :value
8
+
9
+ def initialize(code, value)
10
+ @code = code
11
+ @value = value
12
+ end
13
+
14
+ end
15
+ end
16
+ end
17
+ 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,5 @@
1
+ module Metacrunch
2
+ module Marcxml
3
+ VERSION = "2.0.0"
4
+ end
5
+ 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: []