stanford-mods 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ .travis
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
19
+ .DS_Store
20
+ *.tmproj
21
+ tmtags
22
+ .idea/*
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use ruby-1.9.3@stanford-mods --create
data/.travis.yml ADDED
@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ script: rake rspec
3
+ rvm:
4
+ - 1.9.3
5
+ - 1.9.2
6
+ - jruby-19mode
7
+ notifications:
8
+ email:
9
+ - ndushay@stanford.edu
data/.yardopts ADDED
@@ -0,0 +1,3 @@
1
+ --title 'Stanford-Mods Documentation'
2
+ lib/**/*.rb -
3
+ README.rdoc LICENSE
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # See stanford-mods.gemspec for this gem's dependencies
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,5 @@
1
+ Copyright (c) 20XX-2012. The Board of Trustees of the Leland Stanford Junior University. All rights reserved.
2
+
3
+ Redistribution and use of this distribution in source and binary forms, with or without modification, are permitted provided that: The above copyright notice and this permission notice appear in all copies and supporting documentation; The name, identifiers, and trademarks of The Board of Trustees of the Leland Stanford Junior University are not used in advertising or publicity without the express prior written permission of The Board of Trustees of the Leland Stanford Junior University; Recipients acknowledge that this distribution is made available as a research courtesy, "as is", potentially with defects, without any obligation on the part of The Board of Trustees of the Leland Stanford Junior University to provide support, services, or repair;
4
+
5
+ THE BOARD OF TRUSTEES OF THE LELAND STANFORD JUNIOR UNIVERSITY DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN NO EVENT SHALL THE BOARD OF TRUSTEES OF THE LELAND STANFORD JUNIOR UNIVERSITY BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, TORT (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,40 @@
1
+ = Stanford::Mods
2
+
3
+ {<img src="https://secure.travis-ci.org/sul-dlss/stanford-mods.png?branch=master" alt="Build Status" />}[http://travis-ci.org/sul-dlss/stanford-mods]
4
+
5
+ A Gem with Stanford specific wranglings of MODS (Metadata Object Description Schema) metadata from DOR, the Stanford Digital Object Repository.
6
+
7
+ Source code at https://github.com/sul-dlss/stanford-mods/
8
+
9
+ Generated API docs at http://rubydoc.info/github/sul-dlss/stanford-mods/
10
+
11
+ == Installation
12
+
13
+ Add this line to your application's Gemfile:
14
+
15
+ gem 'stanford-mods'
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install stanford-mods
24
+
25
+ == Usage
26
+
27
+ TODO: Write usage instructions here
28
+
29
+ ## Contributing
30
+
31
+ 1. Fork it
32
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
33
+ 3. Write code and tests.
34
+ 4. Commit your changes (`git commit -am 'Added some feature'`)
35
+ 5. Push to the branch (`git push origin my-new-feature`)
36
+ 6. Create new Pull Request
37
+
38
+ == Releases
39
+
40
+ 0.0.1
data/Rakefile ADDED
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+
4
+ require 'rake'
5
+ require 'bundler'
6
+
7
+ require 'rspec/core/rake_task'
8
+ require 'yard'
9
+ require 'yard/rake/yardoc_task'
10
+
11
+ begin
12
+ Bundler.setup(:default, :development)
13
+ rescue Bundler::BundlerError => e
14
+ $stderr.puts e.message
15
+ $stderr.puts "Run `bundle install` to install missing gems"
16
+ exit e.status_code
17
+ end
18
+
19
+ task :default => :ci
20
+
21
+ desc "run continuous integration suite (tests, coverage, docs)"
22
+ task :ci => [:rspec, :doc]
23
+
24
+ task :spec => :rspec
25
+
26
+ RSpec::Core::RakeTask.new(:rspec) do |spec|
27
+ spec.rspec_opts = ["-c", "-f progress", "-r ./spec/spec_helper.rb"]
28
+ end
29
+
30
+ # Use yard to build docs
31
+ begin
32
+ project_root = File.expand_path(File.dirname(__FILE__) + "/../..")
33
+ doc_dest_dir = File.join(project_root, 'doc')
34
+
35
+ YARD::Rake::YardocTask.new(:doc) do |yt|
36
+ yt.files = Dir.glob(File.join(project_root, 'lib', '**', '*.rb')) +
37
+ [ File.join(project_root, 'README.rdoc') ]
38
+ yt.options = ['--output-dir', doc_dest_dir, '--readme', 'README.rdoc', '--title', 'Stanford-Mods Documentation']
39
+ end
40
+ rescue LoadError
41
+ desc "Generate YARD Documentation"
42
+ task :doc do
43
+ abort "Please install the YARD gem to generate rdoc."
44
+ end
45
+ end
46
+
@@ -0,0 +1,79 @@
1
+ # key: method name
2
+ # value: xpath
3
+ name_to_xpath = {
4
+ # are we deliberately seeking nested values, or just incidentally?
5
+ # some string, some array
6
+ # some return nil if missing -- do all?
7
+
8
+ # TOP_LEVEL_SIMPLE
9
+ 'abstract' => '//abstract/text()', # .to_s
10
+ 'access_condition' => '//accessCondition/text()', # .to_s
11
+ 'genre' => '//genre/text()', #.to_s as array
12
+ 'type_of_resource' => '//typeOfResource/text()', # .to_s
13
+
14
+ # name
15
+ 'corporate_authors' => '//mods/name[@type="corporate"]', # .ea .xpath('namePart').collect{ |a| a.text }.join(' ')
16
+ 'personal_authors' => '//mods/name[@type="personal"]', # .ea .xpath('namePart').collect{ |a| a.text }.join(' ')
17
+
18
+ # titleInfo
19
+ 'title' => '//mods/titleInfo[not(@type="alternative")]', # .first, extract_title_from_title_info(node)
20
+ 'subtitle' => '//mods/titleInfo/subTitle' #.first.text
21
+ 'full_title' => '//mods/titleInfo', # .first, extract_full_title_from_title_info(node)
22
+ 'title_variant' => '//mods/titleInfo[@type="alternative"]', # .first, extract_title_from_title_info(node)
23
+
24
+ # language
25
+ 'language_codes' => "//language/languageTerm[@authority='iso639-2b'][@type='code']/text()",
26
+ 'language_words' => "//language/languageTerm[@type='text']/text()|//language/text()",
27
+
28
+ # physicalDescription
29
+ 'physical_description_extent' => '//physicalDescription/extent/text()', # .to_s
30
+ 'physical_description_form' => '//physicalDescription/form/text()', # .to_s
31
+ 'physical_description_media_type' => '//physicalDescription/internetMediaType/text()', # .to_s
32
+
33
+ # location
34
+ 'physical_location' => '//location/physicalLocation/text()', # .to_s
35
+ 'location_url' => '//location/url/text()', # .to_s
36
+
37
+ # relatedItem
38
+ 'relateditem_location_url' => '//relatedItem/location/url/text()', # .to_s
39
+ 'relateditem_title' => '//relatedItem/titleInfo/title/text()', # .to_s
40
+
41
+ # originInfo
42
+ 'create_start_date' => '//originInfo/dateCreated[@point="start"]/text()', #.to_s - comes from passed node, not root
43
+ 'create_end_date' => '//originInfo/dateCreated[@point="end"]/text()', #.to_s - comes from passed node, not root
44
+ 'date_issued' => '//originInfo/dateIssued/text()', #.to_s - comes from passed node, not root
45
+ 'place_terms' => '//originInfo/place/placeTerm/text()', # .to_s put in array, then .flatten.uniq
46
+ 'publishers' => '//originInfo/publisher/text()', # .to_s put in array, then .flatten.uniq
47
+ # pub_date / pub_year
48
+
49
+ # subject
50
+ 'subject_names' => '//subject/name', # .ea .xpath('namePart/text().to_a.join(' ') then .uniq
51
+ 'subject_topics' => '//subject/topic/text()', # .ea .to_s as array then .uniq
52
+ 'subject_geographic' => '//subject/geographic/text()', # .ea .to_s as array then .uniq
53
+ 'subject_temporal' => '//subject/temporal/text()', # .ea .to_s as array then .uniq
54
+ # # TODO: subject/temporal can be either a string or an iso8601 date
55
+ # At some point we may need to handle date parsing here, but as a first
56
+ # pass, just assume everything is a string
57
+ # if mt.xpath('@encoding="iso8601"')
58
+ # begin
59
+ # d = DateTime.iso8601(mt.xpath('text()').to_s)
60
+ # rescue
61
+ # puts "#{mt.xpath('text()').to_s} is not a valid iso8601 date"
62
+ # end
63
+ # else
64
+ 'subject_title_info' => '//subject/titleInfo', # .ea extract_full_title_from_title_info(node), then .flatten.uniq
65
+
66
+ 'fulltext' => '//text()', # .collect { |n| n.to_s }.join(' ')
67
+
68
+ # TODO: simple element variants:
69
+ #
70
+ # genre authority
71
+ # accessCondition type
72
+ # note displayLabel
73
+ # MISSING:
74
+ # date_created
75
+
76
+ # TODO: collections
77
+
78
+ }
79
+
@@ -0,0 +1,153 @@
1
+ module Stanford
2
+ module Mods
3
+
4
+ def empty?
5
+ mods_xml.xpath('//text()').empty?
6
+ end
7
+
8
+ # Determine what language(s) this record declares
9
+ # Use iso-639 to translate codes into English words
10
+ # @return Array
11
+ def language
12
+ languages = []
13
+ language_codes.each do |code|
14
+ begin
15
+ csv_codes = code.to_s.split(/[,|\ ]/)
16
+ csv_codes = csv_codes.delete_if {|x| x.strip.length==0 }
17
+ csv_codes.each do |c|
18
+ languages << ISO_639.find(c.to_s.strip).english_name
19
+ end
20
+ rescue => e
21
+ SearchWorksOaiHarvester.logger.error "Couldn't find english name for #{code.to_s}"
22
+ # SearchWorksOaiHarvester.logger.error e
23
+ languages << code.to_s
24
+ end
25
+ end
26
+
27
+ language_words.each do |word|
28
+ if word.to_s.strip.length > 0
29
+ languages << word.to_s.strip
30
+ end
31
+ end
32
+ return nil if languages.uniq.empty?
33
+ return languages.uniq
34
+ end
35
+
36
+ # Interpret the various permutations of dateCreated
37
+ # @param [Nokogiri::XML::Element] node
38
+ def date_created
39
+ if create_start_date.length > 0 && create_end_date.length > 0
40
+ return "#{start_date} - #{end_date}"
41
+ else
42
+ return node.xpath('//dateCreated/text()').to_s
43
+ end
44
+ end
45
+
46
+ def date_created_or_issued
47
+ begin
48
+ return date_created unless date_created.nil? or date_created.length == 0
49
+ return date_issued unless date_issued.nil? or date_issued.length == 0
50
+ nil
51
+ rescue
52
+ nil
53
+ end
54
+ end
55
+
56
+ # A single value for publication year (this will need refinement over time)
57
+ # @return String
58
+ def pub_year(year = date_created_or_issued)
59
+ year[/[0-9]{4}/]
60
+ end
61
+
62
+
63
+
64
+
65
+ # TODO: Ask Jessie what the valid values are here
66
+ # @return String
67
+ def display_type
68
+ return "image" if is_an_image?
69
+ return "image" if is_a_map?
70
+ return "collection" if is_a_collection?
71
+ nil
72
+ end
73
+
74
+ # Check to see if this item is a map
75
+ # @return Boolean
76
+ def is_a_map?
77
+ return true if mods_xml.xpath('//typeOfResource/text()').to_s.match(/^[Cc]artographic/)
78
+ return true if mods_xml.xpath('//genre[@authority="marcgt"]/text()').to_s.match(/^[Mm]ap/)
79
+ return true if mods_xml.xpath('//physicalDescription/form/text()').to_s.match(/[Mm]ap/)
80
+ return true if mods_xml.xpath('//physicalDescription/internetMediaType/text()').to_s.match(/[Mm]ap/)
81
+ false
82
+ end
83
+
84
+ # Check to see if this item is an Image
85
+ # @return Boolean
86
+ def is_an_image?
87
+ return true if mods_xml.xpath('//typeOfResource/text()').to_s.match(/still image/)
88
+ false
89
+ end
90
+
91
+ # Objects can belong to a collection by reference (handled in solr_mapper.rb),
92
+ # or they can declare themselves part of a collection in MODS
93
+ # e.g., Revs does it like this:
94
+ # <mods:relatedItem type="host">
95
+ # <mods:titleInfo>
96
+ # <mods:title>The Collier Collection of the Revs Institute for Automotive Research</mods:title>
97
+ # </mods:titleInfo>
98
+ # <mods:typeOfResource collection="yes"/>
99
+ # </mods:relatedItem>
100
+ def declared_collections
101
+ c = []
102
+ collection_nodes = mods_xml.xpath("//relatedItem/typeOfResource[@collection='yes']")
103
+ collection_nodes.each do |node|
104
+ c << node.xpath('../titleInfo/title/text()').to_s
105
+ end
106
+ c
107
+ end
108
+
109
+ # Check to see if this item is a collection
110
+ # @return Boolean
111
+ def is_a_collection?
112
+ return true if mods_xml.xpath("/mods/typeOfResource/@collection").to_s == 'yes'
113
+ false
114
+ end
115
+
116
+ def physical_description_form
117
+ form = mods_xml.xpath('//physicalDescription/form/text()').to_s
118
+ media_type = mods_xml.xpath('//physicalDescription/internetMediaType/text()').to_s
119
+ if form != media_type && form
120
+ form
121
+ elsif media_type
122
+ media_type
123
+ else
124
+ nil
125
+ end
126
+ end
127
+
128
+
129
+
130
+ # Accept a nokogiri representation of a mods titleInfo element
131
+ # Return a formatted string of the title it describes
132
+ # @param node Nokogiri::XML::Element
133
+ # @return String
134
+ def extract_title_from_title_info(node)
135
+ "#{node.xpath('nonSort/text()')} #{node.xpath('title/text()')}".strip
136
+ end
137
+
138
+ # Accept a nokogiri representation of a mods titleInfo element
139
+ # Return a formatted string of the title it describes
140
+ # @param node Nokogiri::XML::Element
141
+ # @return String
142
+ def extract_full_title_from_title_info(node)
143
+ title = "#{node.xpath('nonSort/text()')} #{node.xpath('title/text()')}".strip
144
+ unless node.xpath('subTitle/text()').empty?
145
+ title = "#{title}: #{node.xpath('subTitle/text()')}"
146
+ end
147
+ return title
148
+ end
149
+
150
+
151
+
152
+ end
153
+ end
@@ -0,0 +1,5 @@
1
+ module Stanford
2
+ module Mods
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,18 @@
1
+ require "stanford-mods/mappings"
2
+ require "stanford-mods/version"
3
+ require 'mods'
4
+
5
+ # Stanford specific wranglings of MODS metadata as an extension of the Mods::Record object
6
+ module Stanford
7
+ module Mods
8
+
9
+ class Record < ::Mods::Record
10
+
11
+ # proof of concept method
12
+ def to_be_removed
13
+ puts "in to_be_removed!"
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,37 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/stanford-mods/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.name = "stanford-mods"
6
+ gem.version = Stanford::Mods::VERSION
7
+ gem.authors = ["Naomi Dushay", "Bess Sadler"]
8
+ gem.email = ["ndushay AT stanford.edu", "bess AT stanford.edu"]
9
+ gem.description = "Stanford specific wrangling of MODS metadata from DOR, the Stanford Digital Object Repository"
10
+ gem.summary = "Stanford specific wrangling of MODS metadata"
11
+ gem.homepage = "https://github.com/sul-dlss/stanford-mods"
12
+
13
+ gem.extra_rdoc_files = ["LICENSE", "README.rdoc"]
14
+ gem.files = `git ls-files`.split($\)
15
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
16
+ gem.test_files = gem.files.grep(%r{^spec/})
17
+ gem.require_paths = ["lib"]
18
+
19
+ gem.add_dependency 'mods'
20
+
21
+ # Runtime dependencies
22
+ # gem.add_runtime_dependency 'nokogiri'
23
+
24
+ # Development dependencies
25
+ # Bundler will install these gems too if you've checked out solrmarc-wrapper source from git and run 'bundle install'
26
+ # It will not add these as dependencies if you require solrmarc-wrapper for other projects
27
+ gem.add_development_dependency "rake"
28
+ # docs
29
+ gem.add_development_dependency "rdoc"
30
+ gem.add_development_dependency "yard"
31
+ # tests
32
+ gem.add_development_dependency 'rspec'
33
+ gem.add_development_dependency 'simplecov'
34
+ gem.add_development_dependency 'simplecov-rcov'
35
+ # gem.add_development_dependency 'ruby-debug19'
36
+
37
+ end
metadata ADDED
@@ -0,0 +1,182 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: stanford-mods
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Naomi Dushay
9
+ - Bess Sadler
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2012-11-12 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: mods
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
31
+ - !ruby/object:Gem::Dependency
32
+ name: rake
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ type: :development
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: rdoc
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ - !ruby/object:Gem::Dependency
64
+ name: yard
65
+ requirement: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ - !ruby/object:Gem::Dependency
80
+ name: rspec
81
+ requirement: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ type: :development
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ! '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ - !ruby/object:Gem::Dependency
96
+ name: simplecov
97
+ requirement: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: simplecov-rcov
113
+ requirement: !ruby/object:Gem::Requirement
114
+ none: false
115
+ requirements:
116
+ - - ! '>='
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ none: false
123
+ requirements:
124
+ - - ! '>='
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ description: Stanford specific wrangling of MODS metadata from DOR, the Stanford Digital
128
+ Object Repository
129
+ email:
130
+ - ndushay AT stanford.edu
131
+ - bess AT stanford.edu
132
+ executables: []
133
+ extensions: []
134
+ extra_rdoc_files:
135
+ - LICENSE
136
+ - README.rdoc
137
+ files:
138
+ - .gitignore
139
+ - .rvmrc
140
+ - .travis.yml
141
+ - .yardopts
142
+ - Gemfile
143
+ - LICENSE
144
+ - README.rdoc
145
+ - Rakefile
146
+ - config/mappings_hash.rb
147
+ - lib/stanford-mods.rb
148
+ - lib/stanford-mods/mappings.rb
149
+ - lib/stanford-mods/version.rb
150
+ - stanford-mods.gemspec
151
+ homepage: https://github.com/sul-dlss/stanford-mods
152
+ licenses: []
153
+ post_install_message:
154
+ rdoc_options: []
155
+ require_paths:
156
+ - lib
157
+ required_ruby_version: !ruby/object:Gem::Requirement
158
+ none: false
159
+ requirements:
160
+ - - ! '>='
161
+ - !ruby/object:Gem::Version
162
+ version: '0'
163
+ segments:
164
+ - 0
165
+ hash: -3964216596678128240
166
+ required_rubygems_version: !ruby/object:Gem::Requirement
167
+ none: false
168
+ requirements:
169
+ - - ! '>='
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ segments:
173
+ - 0
174
+ hash: -3964216596678128240
175
+ requirements: []
176
+ rubyforge_project:
177
+ rubygems_version: 1.8.24
178
+ signing_key:
179
+ specification_version: 3
180
+ summary: Stanford specific wrangling of MODS metadata
181
+ test_files: []
182
+ has_rdoc: