cul_scv_hydra 0.8.0 → 0.9.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.
- data/config/fedora.yml +5 -5
- data/config/solr_value_maps.yml +7 -3
- data/lib/cul_scv_hydra/active_fedora/model.rb +2 -0
- data/lib/cul_scv_hydra/active_fedora/model/aggregator.rb +1 -0
- data/lib/cul_scv_hydra/active_fedora/model/common.rb +13 -8
- data/lib/cul_scv_hydra/active_fedora/model/nokogiri_datastreams.rb +142 -0
- data/lib/cul_scv_hydra/active_fedora/model/resource.rb +0 -2
- data/lib/cul_scv_hydra/active_fedora/model/struct_metadata.rb +118 -0
- data/lib/cul_scv_hydra/om/dc_metadata.rb +2 -1
- data/lib/cul_scv_hydra/om/scv_mods_document.rb +20 -12
- data/lib/cul_scv_hydra/solrizer.rb +5 -4
- data/lib/cul_scv_hydra/solrizer/field_mapper.rb +54 -16
- data/lib/cul_scv_hydra/solrizer/scv_mods_fieldable.rb +162 -0
- data/lib/cul_scv_hydra/solrizer/terminology_based_solrizer.rb +0 -13
- data/lib/cul_scv_hydra/solrizer/value_mapper.rb +14 -3
- data/lib/cul_scv_hydra/version.rb +1 -1
- data/lib/tasks/cmodel.rake +5 -5
- metadata +66 -19
- checksums.yaml +0 -15
data/config/fedora.yml
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
development:
|
2
|
-
:url: http://127.0.0.1:8983/fedora
|
3
|
-
:user: fedoraAdmin
|
4
|
-
:password: fedoraAdmin
|
5
|
-
# :url: http://sayers.cul.columbia.edu:8080/fedora
|
2
|
+
# :url: http://127.0.0.1:8983/fedora
|
6
3
|
# :user: fedoraAdmin
|
7
|
-
# :password:
|
4
|
+
# :password: fedoraAdmin
|
5
|
+
:url: http://sayers.cul.columbia.edu:8080/fedora
|
6
|
+
:user: fedoraAdmin
|
7
|
+
:password: f+BULUS*^
|
8
8
|
test:
|
9
9
|
:url: http://127.0.0.1:8983/fedora
|
10
10
|
:user: fedoraAdmin
|
data/config/solr_value_maps.yml
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
:marc_to_facet :
|
2
|
+
'NNC' : 'General Collections'
|
2
3
|
'NNC-A' : 'Avery'
|
3
4
|
'NNC-ART' : 'Office of Art Properties'
|
4
5
|
'NNBa' : 'Barnard College Library'
|
@@ -10,6 +11,7 @@
|
|
10
11
|
'NyNyCBL' : 'Burke Library'
|
11
12
|
'NyNyCOH' : 'CCOH'
|
12
13
|
:marc_to_display :
|
14
|
+
'NNC' : 'General Collections'
|
13
15
|
'NNC-A' : 'Avery Architectural & Fine Arts Library'
|
14
16
|
'NNC-ART' : 'Office of Art Properties'
|
15
17
|
'NNBa' : 'Barnard College Library'
|
@@ -21,9 +23,11 @@
|
|
21
23
|
'NyNyCBL' : 'Burke Library at Union Theological Seminary'
|
22
24
|
'NyNyCOH' : 'Columbia Center for Oral History Collections'
|
23
25
|
:project_to_facet :
|
24
|
-
'Customer Order Collection' : '
|
26
|
+
'Customer Order Collection' : 'Pres Orders'
|
25
27
|
"Children's Drawings of the Spanish Civil War (online exhibition)" : 'Spanish Civil War'
|
26
28
|
"Jewels in her crown: treasures of Columbia University Libraries special collections" : 'Jewels in her Crown'
|
27
29
|
"Russian Imperial Corps of Pages" : 'Russian Corps of Pages'
|
28
|
-
"
|
29
|
-
|
30
|
+
"Preserving Historic Audio Content" : 'Audio Preservation'
|
31
|
+
'Papers of John Jay' : 'John Jay Papers'
|
32
|
+
'Project Facet Mapping Test' : 'Successful Project Mapping'
|
33
|
+
'G.E.E. Lindquist Native American Photographs' : 'Lindquist Photographs'
|
@@ -5,3 +5,5 @@ end
|
|
5
5
|
require 'cul_scv_hydra/active_fedora/model/aggregator'
|
6
6
|
require 'cul_scv_hydra/active_fedora/model/common'
|
7
7
|
require 'cul_scv_hydra/active_fedora/model/resource'
|
8
|
+
require 'cul_scv_hydra/active_fedora/model/nokogiri_datastreams'
|
9
|
+
require 'cul_scv_hydra/active_fedora/model/struct_metadata'
|
@@ -3,6 +3,7 @@ module Aggregator
|
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
5
|
included do
|
6
|
+
has_metadata :name => "structMetadata", :type=>Cul::Scv::Hydra::ActiveFedora::Model::StructMetadata, :versionable => true, :controlGroup => 'M'
|
6
7
|
has_many :parts, :property => :cul_member_of, :class_name=>'ActiveFedora::Base'
|
7
8
|
after_create :aggregator!
|
8
9
|
end
|
@@ -138,14 +138,15 @@ module Common
|
|
138
138
|
solr_doc["descriptor_ssi"] = ["dublin core"]
|
139
139
|
end
|
140
140
|
# if no mods, pull some values from DC
|
141
|
-
if (solr_doc["
|
142
|
-
if self.
|
143
|
-
solr_doc["
|
141
|
+
if (solr_doc["title_display_ssm"].nil? or solr_doc["title_display_ssm"].length == 0)
|
142
|
+
if self.datastreams["DC"].term_values(:dc_title).first
|
143
|
+
solr_doc["title_display_ssm"] = self.datastreams["DC"].term_values(:dc_title)
|
144
144
|
else
|
145
|
-
solr_doc["
|
145
|
+
solr_doc["title_display_ssm"] = self.datastreams["DC"].term_values(:dc_identifier).reject {|dcid| dcid.eql? self.id}
|
146
146
|
end
|
147
|
-
|
148
|
-
|
147
|
+
solr_doc["title_si"] = self.datastreams["DC"].term_values(:dc_title).first
|
148
|
+
if self.datastreams["DC"].term_values(:dc_relation).first
|
149
|
+
self.datastreams["DC"].term_values(:dc_relation).each {|val|
|
149
150
|
if val =~ /clio:/
|
150
151
|
solr_doc["clio_ssim"] ||= []
|
151
152
|
solr_doc["clio_ssim"] << val.split(':')[-1]
|
@@ -153,8 +154,11 @@ module Common
|
|
153
154
|
}
|
154
155
|
end
|
155
156
|
end
|
156
|
-
if (solr_doc["
|
157
|
-
|
157
|
+
if (solr_doc["identifier_ssim"].nil? or solr_doc["identifier_ssim"].length == 0)
|
158
|
+
solr_doc["identifier_ssim"] = self.datastreams["DC"].term_values(:dc_identifier).reject {|dcid| dcid.eql? self.id}
|
159
|
+
end
|
160
|
+
if (solr_doc["title_display_ssm"].length > 1)
|
161
|
+
solr_doc["title_display_ssm"].uniq!
|
158
162
|
end
|
159
163
|
solr_doc["format_ssi"] = [self.route_as]
|
160
164
|
solr_doc["index_type_label_ssi"] = [self.index_type_label]
|
@@ -166,6 +170,7 @@ module Common
|
|
166
170
|
value.strip!
|
167
171
|
end
|
168
172
|
}
|
173
|
+
solr_doc[:structured_bsi] = 'false' unless solr_doc.has_key? :structured_bsi
|
169
174
|
solr_doc
|
170
175
|
end
|
171
176
|
|
@@ -0,0 +1,142 @@
|
|
1
|
+
module Cul::Scv::Hydra::ActiveFedora::Model::NokogiriDatastreams
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
|
4
|
+
included do
|
5
|
+
self.extend ClassMethods
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
# Create an instance of this class based on xml content
|
10
|
+
# @param [String, File, Nokogiri::XML::Node] xml the xml content to build from
|
11
|
+
# @param [ActiveFedora::OmDatastream] tmpl the Datastream object that you are building @default a new instance of this class
|
12
|
+
# Careful! If you call this from a constructor, be sure to provide something 'ie. self' as the @tmpl. Otherwise, you will get an infinite loop!
|
13
|
+
def from_xml(xml, tmpl=nil)
|
14
|
+
tmpl = self.new if tmpl.nil? ## This path is used only for unit testing (e.g. MarpaDCDatastream.from_xml(fixture("data.xml")) )
|
15
|
+
|
16
|
+
if !xml.present?
|
17
|
+
tmpl.ng_xml = self.xml_template
|
18
|
+
elsif xml.kind_of? Nokogiri::XML::Node || xml.kind_of?(Nokogiri::XML::Document)
|
19
|
+
tmpl.ng_xml = xml
|
20
|
+
else
|
21
|
+
tmpl.ng_xml = Nokogiri::XML::Document.parse(xml)
|
22
|
+
end
|
23
|
+
|
24
|
+
tmpl.ng_xml_doesnt_change!
|
25
|
+
|
26
|
+
return tmpl
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def local_or_remote_content(ensure_fetch = true)
|
31
|
+
@content = to_xml if ng_xml_changed? || autocreate?
|
32
|
+
super
|
33
|
+
end
|
34
|
+
|
35
|
+
def datastream_content
|
36
|
+
@datastream_content ||= Nokogiri::XML(super).to_xml {|config| config.no_declaration}.strip
|
37
|
+
end
|
38
|
+
|
39
|
+
def ng_xml
|
40
|
+
@ng_xml ||= begin
|
41
|
+
if new?
|
42
|
+
## Load up the template
|
43
|
+
self.class.xml_template
|
44
|
+
else
|
45
|
+
Nokogiri::XML::Document.parse(datastream_content)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def ng_xml=(new_xml)
|
51
|
+
# before we set ng_xml, we load the datastream so we know if the new value differs.
|
52
|
+
local_or_remote_content(true)
|
53
|
+
|
54
|
+
case new_xml
|
55
|
+
when Nokogiri::XML::Document
|
56
|
+
self.content=new_xml.to_xml
|
57
|
+
when Nokogiri::XML::Node
|
58
|
+
## Cast a fragment to a document
|
59
|
+
self.content=new_xml.to_s
|
60
|
+
when String
|
61
|
+
self.content=new_xml
|
62
|
+
else
|
63
|
+
raise TypeError, "You passed a #{new_xml.class} into the ng_xml of the #{self.dsid} datastream. OmDatastream.ng_xml= only accepts Nokogiri::XML::Document, Nokogiri::XML::Element, Nokogiri::XML::Node, or raw XML (String) as inputs."
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# don't want content eagerly loaded by proxy, so implementing methods that would be implemented by define_attribute_methods
|
68
|
+
def ng_xml_will_change!
|
69
|
+
changed_attributes['ng_xml'] = nil
|
70
|
+
end
|
71
|
+
|
72
|
+
def ng_xml_doesnt_change!
|
73
|
+
changed_attributes.delete('ng_xml')
|
74
|
+
end
|
75
|
+
|
76
|
+
# don't want content eagerly loaded by proxy, so implementing methods that would be implemented by define_attribute_methods
|
77
|
+
def ng_xml_changed?
|
78
|
+
changed_attributes.has_key? 'ng_xml'
|
79
|
+
end
|
80
|
+
|
81
|
+
def datastream_content
|
82
|
+
@datastream_content ||= Nokogiri::XML(super).to_xml {|config| config.no_declaration}.strip
|
83
|
+
end
|
84
|
+
|
85
|
+
def content=(new_content)
|
86
|
+
if inline?
|
87
|
+
# inline datastreams may be transformed by fedora 3, so we test for equivalence instead of equality
|
88
|
+
if !EquivalentXml.equivalent?(datastream_content, new_content)
|
89
|
+
ng_xml_will_change!
|
90
|
+
@ng_xml = Nokogiri::XML::Document.parse(new_content)
|
91
|
+
super(@ng_xml.to_s)
|
92
|
+
end
|
93
|
+
else
|
94
|
+
if datastream_content != new_content
|
95
|
+
ng_xml_will_change!
|
96
|
+
@ng_xml = Nokogiri::XML::Document.parse(new_content)
|
97
|
+
super(@ng_xml.to_s)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def content_changed?
|
103
|
+
return false if !xml_loaded
|
104
|
+
super
|
105
|
+
end
|
106
|
+
|
107
|
+
def xml_loaded
|
108
|
+
instance_variable_defined? :@ng_xml
|
109
|
+
end
|
110
|
+
|
111
|
+
def to_xml(xml = nil)
|
112
|
+
xml = self.ng_xml if xml.nil?
|
113
|
+
ng_xml = self.ng_xml
|
114
|
+
if ng_xml.respond_to?(:root) && ng_xml.root.nil? && self.class.respond_to?(:root_property_ref) && !self.class.root_property_ref.nil?
|
115
|
+
ng_xml = self.class.generate(self.class.root_property_ref, "")
|
116
|
+
if xml.root.nil?
|
117
|
+
xml = ng_xml
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
unless xml == ng_xml || ng_xml.root.nil?
|
122
|
+
if xml.kind_of?(Nokogiri::XML::Document)
|
123
|
+
xml.root.add_child(ng_xml.root)
|
124
|
+
elsif xml.kind_of?(Nokogiri::XML::Node)
|
125
|
+
xml.add_child(ng_xml.root)
|
126
|
+
else
|
127
|
+
raise "You can only pass instances of Nokogiri::XML::Node into this method. You passed in #{xml}"
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
return xml.to_xml {|config| config.no_declaration}.strip
|
132
|
+
end
|
133
|
+
|
134
|
+
def method_missing method, *args, &block
|
135
|
+
if ng_xml.respond_to? method
|
136
|
+
ng_xml.send(method, *args, &block)
|
137
|
+
else
|
138
|
+
super
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
end
|
@@ -51,7 +51,6 @@ module Resource
|
|
51
51
|
image_properties = Cul::Image::Properties.identify(blob)
|
52
52
|
if image_properties
|
53
53
|
image_prop_nodes = image_properties.nodeset
|
54
|
-
puts image_properties.instance_variable_get(:@ng_xml).to_xml
|
55
54
|
relsext = datastreams['RELS-EXT']
|
56
55
|
image_prop_nodes.each { |node|
|
57
56
|
if node["resource"]
|
@@ -63,7 +62,6 @@ module Resource
|
|
63
62
|
end
|
64
63
|
subject = RDF::URI(internal_uri)
|
65
64
|
predicate = RDF::URI("#{node.namespace.href}#{node.name}")
|
66
|
-
puts "Adding a resource predicate : #{predicate}"
|
67
65
|
query = RDF::Query.new({ :subject => {predicate => :object}})
|
68
66
|
relationships(predicate).dup.each { |stmt|
|
69
67
|
relationships.delete(stmt)
|
@@ -0,0 +1,118 @@
|
|
1
|
+
module Cul::Scv::Hydra::ActiveFedora::Model
|
2
|
+
class StructMetadata < ::ActiveFedora::Datastream
|
3
|
+
include NokogiriDatastreams
|
4
|
+
|
5
|
+
def self.default_attributes
|
6
|
+
super.merge(:controlGroup => 'M', :mimeType => 'text/xml')
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.xml_template
|
10
|
+
Nokogiri::XML::Document.parse("<mets:structMap xmlns:mets=\"http://www.loc.gov/METS/\">")
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.div_template(prefix="mets")
|
14
|
+
prefix.nil? ? '<div/>' : "<#{prefix}:div/>"
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(digital_object=nil, dsid=nil, options={})
|
18
|
+
super
|
19
|
+
end
|
20
|
+
|
21
|
+
# Indicates that this datastream has metadata content.
|
22
|
+
# @return true
|
23
|
+
def metadata?
|
24
|
+
true
|
25
|
+
end
|
26
|
+
|
27
|
+
def autocreate?
|
28
|
+
changed_attributes.has_key? :profile
|
29
|
+
end
|
30
|
+
|
31
|
+
def label=(value)
|
32
|
+
struct_map["LABEL"] = value
|
33
|
+
ng_xml_will_change!
|
34
|
+
end
|
35
|
+
|
36
|
+
def label
|
37
|
+
struct_map["LABEL"]
|
38
|
+
end
|
39
|
+
|
40
|
+
def type=(value)
|
41
|
+
struct_map["TYPE"] = value
|
42
|
+
ng_xml_will_change!
|
43
|
+
end
|
44
|
+
|
45
|
+
def type
|
46
|
+
struct_map["TYPE"]
|
47
|
+
end
|
48
|
+
|
49
|
+
def prefix
|
50
|
+
prefix = nil
|
51
|
+
ng_xml.namespaces.each do |p, href|
|
52
|
+
prefix = p.sub(/xmlns:/,'') if href == "http://www.loc.gov/METS/"
|
53
|
+
end
|
54
|
+
prefix
|
55
|
+
end
|
56
|
+
|
57
|
+
def struct_map
|
58
|
+
prefix = self.prefix
|
59
|
+
path = prefix.nil? ? 'xmlns:structMap' : "#{prefix}:structMap"
|
60
|
+
ng_xml.xpath(path, ng_xml.namespaces).first
|
61
|
+
end
|
62
|
+
|
63
|
+
def create_div_node(parent=nil, atts={})
|
64
|
+
if parent.nil?
|
65
|
+
parent = struct_map
|
66
|
+
end
|
67
|
+
divNode = parent.add_child(StructMetadata.div_template(parent.namespace.prefix)).first
|
68
|
+
[:label, :order, :contentids]. each do |key|
|
69
|
+
divNode[key.to_s.upcase] = atts[key].to_s if atts.has_key? key
|
70
|
+
end
|
71
|
+
ng_xml_will_change! if (divNode.document == ng_xml.document)
|
72
|
+
divNode
|
73
|
+
end
|
74
|
+
|
75
|
+
def divs_with_attribute(descend=true, name=nil, value=nil)
|
76
|
+
prefix = self.prefix || 'xmlns'
|
77
|
+
xpath = descend ? "//#{prefix}:div" : "/#{prefix}:structMap/#{prefix}:div"
|
78
|
+
if !name.nil?
|
79
|
+
xpath << "[@#{name}"
|
80
|
+
if !value.nil?
|
81
|
+
xpath << "='#{value}'"
|
82
|
+
end
|
83
|
+
xpath << ']'
|
84
|
+
end
|
85
|
+
ng_xml.xpath(xpath, ng_xml.namespaces)
|
86
|
+
end
|
87
|
+
|
88
|
+
# a convenience method for setting attributes and creating divs (if necessary) for R/V structure
|
89
|
+
# returns the mets:structMap node
|
90
|
+
def recto_verso!
|
91
|
+
self.type= 'physical' unless self.type == 'physical'
|
92
|
+
self.label= 'Sides' unless self.label == 'Sides'
|
93
|
+
create_div_node struct_map, {:order=>'1'} unless divs_with_attribute(false,'ORDER','1').first
|
94
|
+
create_div_node struct_map, {:order=>'2'} unless divs_with_attribute(false,'ORDER','2').first
|
95
|
+
if (div = divs_with_attribute(false,'ORDER','1').first)
|
96
|
+
div['LABEL'] = 'Recto' unless div['LABEL'] == 'Recto'
|
97
|
+
end
|
98
|
+
if (div = divs_with_attribute(false,'ORDER','2').first)
|
99
|
+
div['LABEL'] = 'Verso' unless div['LABEL'] == 'Verso'
|
100
|
+
end
|
101
|
+
struct_map
|
102
|
+
end
|
103
|
+
|
104
|
+
def recto
|
105
|
+
divs_with_attribute(false, 'LABEL', 'Recto').first
|
106
|
+
end
|
107
|
+
|
108
|
+
def verso
|
109
|
+
divs_with_attribute(false, 'LABEL', 'Verso').first
|
110
|
+
end
|
111
|
+
|
112
|
+
def to_solr(doc={})
|
113
|
+
doc[:structured_bsi] = (has_content? ? 'true' : 'false')
|
114
|
+
doc
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
end
|
@@ -31,7 +31,8 @@ module Om
|
|
31
31
|
:index_as=>[:displayable, :searchable])
|
32
32
|
t.dc_identifier(:path=>"identifier",
|
33
33
|
:namespace_prefix=>"dc",
|
34
|
-
:
|
34
|
+
:type=>:string,
|
35
|
+
:index_as=>[:symbol])
|
35
36
|
t.dc_language(:path=>"language",
|
36
37
|
:namespace_prefix=>"dc",
|
37
38
|
:index_as=>[:displayable, :searchable])
|
@@ -8,6 +8,11 @@ module Om
|
|
8
8
|
class ModsDocument < ::ActiveFedora::OmDatastream
|
9
9
|
include ::OM::XML::TerminologyBasedSolrizer
|
10
10
|
include Cul::Scv::Hydra::Solrizer::TerminologyBasedSolrizer
|
11
|
+
include Cul::Scv::Hydra::Solrizer::ScvModsFieldable
|
12
|
+
|
13
|
+
map_field("lib_repo_sim", :marc_to_facet)
|
14
|
+
map_field("lib_repo_ssm", :marc_to_display)
|
15
|
+
map_field("lib_project_sim", :project_to_facet)
|
11
16
|
|
12
17
|
set_terminology do |t|
|
13
18
|
t.root(:path=>"mods",
|
@@ -16,11 +21,14 @@ module Om
|
|
16
21
|
}
|
17
22
|
|
18
23
|
t.main_title_info(:path=>'titleInfo', :index_as=>[], :attributes=>{:type=>:none}){
|
24
|
+
t.non_sort(:path=>"nonSort", :index_as=>[])
|
19
25
|
t.main_title(:path=>"title", :index_as=>[])
|
20
26
|
}
|
21
27
|
|
22
|
-
t.title(:proxy=>[:mods, :main_title_info, :main_title],
|
23
|
-
:index_as=>[:
|
28
|
+
t.title(:proxy=>[:mods, :main_title_info, :main_title], :type=>:string,
|
29
|
+
:index_as=>[:searchable, :sortable, :textable])
|
30
|
+
t.title_display(:proxy=>[:mods, :main_title_info], :type=>:string,
|
31
|
+
:index_as=>[:displayable])
|
24
32
|
|
25
33
|
t.search_title_info(:path=>'titleInfo', :index_as=>[]){
|
26
34
|
t.search_title(:path=>'title', :index_as=>[:searchable])
|
@@ -31,16 +39,16 @@ module Om
|
|
31
39
|
}
|
32
40
|
}
|
33
41
|
t.collection(:path=>"relatedItem", :attributes=>{:type=>"host", :displayLabel=>"Collection"}, :index_as=>[]){
|
34
|
-
t.collection_title_info(:path=>'titleInfo', :index_as=>[]){
|
35
|
-
t.lib_collection(:path=>'title', :index_as=>[
|
42
|
+
t.collection_title_info(:path=>'titleInfo', :index_as=>[:facetable, :displayable]){
|
43
|
+
t.lib_collection(:path=>'title', :index_as=>[])
|
36
44
|
}
|
37
45
|
}
|
38
|
-
t.lib_project(:proxy=>[:project,:project_title_info
|
46
|
+
t.lib_project(:proxy=>[:project,:project_title_info],
|
39
47
|
:index_as=>[:displayable, :searchable, :project_facetable, :textable])
|
40
|
-
t.lib_collection(:proxy=>[:collection,:collection_title_info
|
48
|
+
t.lib_collection(:proxy=>[:collection,:collection_title_info])
|
41
49
|
# pattern matches
|
42
|
-
t.identifier(:path=>"identifier", :attributes=>{:type=>"local"}, :index_as=>[:symbol, :textable])
|
43
|
-
t.clio(:path=>"identifier", :attributes=>{:type=>"CLIO"}, :data_type=>:symbol, :index_as=>[:
|
50
|
+
t.identifier(:path=>"identifier", :attributes=>{:type=>"local"}, :type=>:string, :index_as=>[:symbol, :textable])
|
51
|
+
t.clio(:path=>"identifier", :attributes=>{:type=>"CLIO"}, :data_type=>:symbol, :index_as=>[:symbol, :textable])
|
44
52
|
t.abstract
|
45
53
|
t.subject {
|
46
54
|
t.topic
|
@@ -64,9 +72,8 @@ module Om
|
|
64
72
|
:index_as=>[])
|
65
73
|
t.shelf_locator(:path=>"shelfLocator", :index_as=>[:textable])
|
66
74
|
}
|
67
|
-
t.lib_repo(:proxy=>[:location, :lib_repo],
|
68
|
-
:index_as=>[:marc_code_facetable, :marc_code_displayable,
|
69
|
-
:marc_code_textable])
|
75
|
+
t.lib_repo(:proxy=>[:location, :lib_repo], :type=>:text,
|
76
|
+
:index_as=>[:marc_code_facetable, :marc_code_displayable, :marc_code_textable])
|
70
77
|
t.lib_name(
|
71
78
|
:path=>'name',:attributes=>{:type=>'personal'},
|
72
79
|
:index_as=>[:facetable, :displayable, :searchable, :textable]){
|
@@ -98,7 +105,8 @@ module Om
|
|
98
105
|
|
99
106
|
t.origin_info(:path=>"originInfo", :index_as=>[]){
|
100
107
|
t.date(:path=>"dateIssued", :attributes=>{:encoding=>'w3cdtf'}, :index_as=>[])
|
101
|
-
t.
|
108
|
+
t.lib_date(:path=>"dateIssued", :attributes=>{:encoding=>'w3cdtf',:keyDate=>'yes'},
|
109
|
+
:index_as=>[:date_sortable])
|
102
110
|
t.start_date(:path=>"dateIssued", :attributes=>{:encoding=>'w3cdtf',:keyDate=>'yes',:point=>'start'}, :index_as=>[])
|
103
111
|
t.end_date(:path=>"dateIssued", :attributes=>{:encoding=>'w3cdtf',:point=>'end'}, :index_as=>[])
|
104
112
|
}
|
@@ -2,11 +2,12 @@ module Cul
|
|
2
2
|
module Scv
|
3
3
|
module Hydra
|
4
4
|
module Solrizer
|
5
|
+
autoload :Extractor, "cul_scv_hydra/solrizer/extractor"
|
6
|
+
autoload :TerminologyBasedSolrizer, "cul_scv_hydra/solrizer/terminology_based_solrizer"
|
7
|
+
autoload :ValueMapper, "cul_scv_hydra/solrizer/value_mapper"
|
8
|
+
autoload :ScvModsFieldable, "cul_scv_hydra/solrizer/scv_mods_fieldable"
|
5
9
|
end
|
6
10
|
end
|
7
11
|
end
|
8
12
|
end
|
9
|
-
require "cul_scv_hydra/solrizer/
|
10
|
-
require "cul_scv_hydra/solrizer/field_mapper"
|
11
|
-
require "cul_scv_hydra/solrizer/terminology_based_solrizer"
|
12
|
-
require "cul_scv_hydra/solrizer/value_mapper"
|
13
|
+
require "cul_scv_hydra/solrizer/field_mapper"
|
@@ -1,23 +1,32 @@
|
|
1
1
|
require 'solrizer'
|
2
2
|
module Solrizer::DefaultDescriptors
|
3
|
+
def self.date_sortable
|
4
|
+
@date_sortable ||= Solrizer::Descriptor.new(:date, :stored, :indexed, converter: date_sortable_converter)
|
5
|
+
end
|
6
|
+
|
7
|
+
# Produces the field name 'all_text_teim'
|
3
8
|
def self.textable
|
4
|
-
@textable_type ||= TextableDescriptor.new(:
|
9
|
+
@textable_type ||= TextableDescriptor.new(:text_en, :indexed, :multivalued)
|
5
10
|
end
|
6
11
|
|
12
|
+
# Produces _sim suffix
|
7
13
|
def self.project_facetable
|
8
14
|
@project_facet_type ||= ProjectFacetDescriptor.new(:string, :indexed, :multivalued)
|
9
15
|
end
|
10
16
|
|
17
|
+
# Produces _sim suffix and a value-mapping converter
|
11
18
|
def self.marc_code_facetable
|
12
19
|
@marc_code_facet_type ||= MarcCodeFacetDescriptor.new(:string, :indexed, :multivalued)
|
13
20
|
end
|
14
21
|
|
22
|
+
# Produces _ssm suffix and a value-mapping converter
|
15
23
|
def self.marc_code_displayable
|
16
24
|
@marc_code_type ||= MarcCodeDisplayDescriptor.new(:string, :stored, :indexed, :multivalued)
|
17
25
|
end
|
18
26
|
|
27
|
+
# Produces all_text_timv fieldname and a value-mapping converter
|
19
28
|
def self.marc_code_textable
|
20
|
-
@marc_code_map_text_type ||= MarcCodeTextableDescriptor.new(:
|
29
|
+
@marc_code_map_text_type ||= MarcCodeTextableDescriptor.new(:text_en, :indexed, :multivalued)
|
21
30
|
end
|
22
31
|
|
23
32
|
def self.load_value_maps(config_path=nil)
|
@@ -43,52 +52,81 @@ module Solrizer::DefaultDescriptors
|
|
43
52
|
@@value_maps ||= load_value_maps
|
44
53
|
end
|
45
54
|
|
55
|
+
def self.date_sortable_converter
|
56
|
+
lambda do |type|
|
57
|
+
lambda do |val|
|
58
|
+
begin
|
59
|
+
d = val.length < 11 ? Date.new(*(val.split('-').collect {|s| s.to_i})) : Date.parse(val)
|
60
|
+
iso8601_date(d)
|
61
|
+
rescue ArgumentError
|
62
|
+
nil
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
module Normal
|
69
|
+
def normal!(value)
|
70
|
+
value.gsub!(/\s+/,' ')
|
71
|
+
value.strip!
|
72
|
+
true
|
73
|
+
end
|
74
|
+
end
|
46
75
|
|
47
76
|
class TextableDescriptor < Solrizer::Descriptor
|
48
|
-
def name_and_converter(field_name,
|
49
|
-
|
77
|
+
def name_and_converter(field_name, args=nil)
|
78
|
+
super('all_text', args)
|
50
79
|
end
|
51
80
|
end
|
52
81
|
|
53
82
|
class ProjectFacetDescriptor < Solrizer::Descriptor
|
83
|
+
include Normal
|
54
84
|
def converter(field_type)
|
55
85
|
map = Solrizer::DefaultDescriptors.value_maps[:project_to_facet] || {}
|
56
|
-
lambda {|value| (map.has_key? value) ? map[value] : value}
|
86
|
+
lambda {|value| (normal!(value) and map.has_key? value) ? map[value] : value}
|
57
87
|
end
|
58
88
|
end
|
59
89
|
|
60
90
|
class MarcCodeFacetDescriptor < Solrizer::Descriptor
|
91
|
+
include Normal
|
61
92
|
def converter(field_type)
|
62
93
|
map = Solrizer::DefaultDescriptors.value_maps[:marc_to_facet] || {}
|
63
|
-
lambda {|value| (map.has_key? value) ? map[value] : value}
|
94
|
+
lambda {|value| (normal!(value) and map.has_key? value) ? map[value] : value}
|
64
95
|
end
|
65
96
|
end
|
66
97
|
|
67
98
|
class MarcCodeDisplayDescriptor < Solrizer::Descriptor
|
99
|
+
include Normal
|
68
100
|
def converter(field_type)
|
69
101
|
map = Solrizer::DefaultDescriptors.value_maps[:marc_to_display] || {}
|
70
|
-
lambda {|value| (map.has_key? value) ? map[value] : value}
|
71
|
-
end
|
102
|
+
lambda {|value| (normal!(value) and map.has_key? value) ? map[value] : value}
|
103
|
+
end
|
72
104
|
end
|
73
105
|
|
74
106
|
class MarcCodeTextableDescriptor < Solrizer::Descriptor
|
75
|
-
|
76
|
-
|
107
|
+
include Normal
|
108
|
+
def name_and_converter(field_name, args=nil)
|
109
|
+
super('all_text', args)
|
77
110
|
end
|
78
111
|
def converter(field_type)
|
79
112
|
fmap = Solrizer::DefaultDescriptors.value_maps[:marc_to_facet] || {}
|
80
113
|
dmap = Solrizer::DefaultDescriptors.value_maps[:marc_to_display] || {}
|
81
114
|
lambda do |value|
|
82
|
-
|
83
|
-
|
84
|
-
|
115
|
+
if value.is_a? String
|
116
|
+
normal!(value)
|
117
|
+
r = (fmap.has_key? value) ? [fmap[value]] : []
|
118
|
+
r << dmap[value] if (dmap.has_key? value)
|
119
|
+
r.uniq!
|
120
|
+
r.join(' ')
|
121
|
+
else
|
122
|
+
value
|
123
|
+
end
|
85
124
|
end
|
86
125
|
end
|
87
126
|
end
|
88
127
|
class MarcCodeDisplayTextableDescriptor < MarcCodeDisplayDescriptor
|
89
|
-
def name_and_converter(field_name,
|
90
|
-
|
91
|
-
['all_text_timv', converter(field_type)]
|
128
|
+
def name_and_converter(field_name, args=nil)
|
129
|
+
super('all_text', args)
|
92
130
|
end
|
93
131
|
end
|
94
132
|
end
|
@@ -0,0 +1,162 @@
|
|
1
|
+
module Cul::Scv::Hydra::Solrizer
|
2
|
+
module ScvModsFieldable
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
MODS_NS = {'mods'=>'http://www.loc.gov/mods/v3'}
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
def value_mapper(maps=nil)
|
9
|
+
@value_mapper ||= ValueMapper.new(maps)
|
10
|
+
end
|
11
|
+
|
12
|
+
def map_field(field_key, map_key)
|
13
|
+
value_mapper.map_field(field_key, map_key)
|
14
|
+
end
|
15
|
+
|
16
|
+
def map_value(field_key, value_key)
|
17
|
+
value_mapper.map_value(field_key, value_key)
|
18
|
+
end
|
19
|
+
|
20
|
+
def maps_field?(field_key)
|
21
|
+
value_mapper.maps_field? field_key
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def mods
|
26
|
+
ng_xml.xpath('/mods:mods', MODS_NS).first
|
27
|
+
end
|
28
|
+
|
29
|
+
def projects
|
30
|
+
mods.xpath("./mods:relatedItem[@type='host' and @displayLabel='Project']", MODS_NS).collect do |p_node|
|
31
|
+
ScvModsFieldable.normalize(main_title(p_node), true)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def collections
|
36
|
+
mods.xpath("./mods:relatedItem[@type='host' and @displayLabel='Collection']", MODS_NS).collect do |p_node|
|
37
|
+
ScvModsFieldable.normalize(main_title(p_node), true)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def sort_title(node=mods)
|
42
|
+
# include only the untyped [!@type] titleInfo, exclude noSort
|
43
|
+
base_text = ''
|
44
|
+
t = node.xpath('./mods:titleInfo[not(@type)]', MODS_NS).first
|
45
|
+
if t
|
46
|
+
t.children.each do |child|
|
47
|
+
base_text << child.text unless child.name == 'nonSort'
|
48
|
+
end
|
49
|
+
end
|
50
|
+
base_text = ScvModsFieldable.normalize(base_text, true)
|
51
|
+
base_text = nil if base_text.empty?
|
52
|
+
base_text
|
53
|
+
end
|
54
|
+
|
55
|
+
def main_title(node=mods)
|
56
|
+
# include only the untyped [!@type] titleInfo
|
57
|
+
t = node.xpath('./mods:titleInfo[not(@type)]', MODS_NS).first
|
58
|
+
if t
|
59
|
+
ScvModsFieldable.normalize(t.text)
|
60
|
+
else
|
61
|
+
nil
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def titles(node=mods)
|
66
|
+
# all titles without descending into relatedItems
|
67
|
+
node.xpath('./mods:titleInfo', MODS_NS).collect do |t|
|
68
|
+
ScvModsFieldable.normalize(t.text)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def names(role_authority=nil, role=nil)
|
73
|
+
# get all the name nodes
|
74
|
+
# reject the ones that aren't type 'personal' or 'corporate'
|
75
|
+
# keep all child text except the role terms
|
76
|
+
xpath = "./mods:name[@type = 'personal' or @type = 'corporate']"
|
77
|
+
unless role_authority.nil?
|
78
|
+
xpath << "/mods:role/mods:roleTerm[@authority='#{role_authority.to_s}'"
|
79
|
+
unless role.nil?
|
80
|
+
xpath << " and normalize-space(text()) = '#{role.to_s.strip}'"
|
81
|
+
end
|
82
|
+
xpath << "]/ancestor::mods:name"
|
83
|
+
end
|
84
|
+
names = mods.xpath(xpath, MODS_NS).collect do |node|
|
85
|
+
base_text = node.xpath('./mods:namePart', MODS_NS).collect { |c| c.text }.join(' ')
|
86
|
+
ScvModsFieldable.normalize(base_text, true)
|
87
|
+
end
|
88
|
+
xpath = "./mods:subject" + xpath[1,xpath.length]
|
89
|
+
mods.xpath(xpath, MODS_NS).each do |node|
|
90
|
+
base_text = node.xpath('./mods:namePart', MODS_NS).collect { |c| c.text }.join(' ')
|
91
|
+
names << ScvModsFieldable.normalize(base_text, true)
|
92
|
+
end
|
93
|
+
names
|
94
|
+
end
|
95
|
+
|
96
|
+
def dates(node=mods)
|
97
|
+
# get all the dateIssued with keyDate = 'yes', but not point = 'end'
|
98
|
+
end
|
99
|
+
|
100
|
+
def formats(node=mods)
|
101
|
+
# get all the form values with authority != 'marcform'
|
102
|
+
node.xpath("./mods:physicalDescription/mods:form[@authority != 'marcform']", MODS_NS).collect do |n|
|
103
|
+
ScvModsFieldable.normalize(n.text)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def repositories(node=mods)
|
108
|
+
# get all the location/physicalLocation[@authority = 'marcorg']
|
109
|
+
node.xpath("./mods:location/mods:physicalLocation[@authority = 'marcorg']", MODS_NS).collect do |n|
|
110
|
+
ScvModsFieldable.normalize(n.text)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def shelf_locators(node=mods)
|
115
|
+
node.xpath("./mods:location/mods:shelfLocator", MODS_NS).collect do |n|
|
116
|
+
ScvModsFieldable.normalize(n.text, true)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def to_solr(solr_doc={})
|
121
|
+
solr_doc = (defined? super) ? super : solr_doc
|
122
|
+
solr_doc["title_si"] = sort_title
|
123
|
+
solr_doc["title_ssm"] = titles
|
124
|
+
solr_doc["lib_collection_sim"] = collections
|
125
|
+
solr_doc["lib_project_sim"] = projects
|
126
|
+
solr_doc["lib_name_sim"] = names
|
127
|
+
solr_doc["lib_name_ssm"] = solr_doc["lib_name_sim"]
|
128
|
+
solr_doc["lib_author_sim"] = names(:marcrelator, 'aut')
|
129
|
+
solr_doc["lib_recipient_sim"] = names(:marcrelator, 'rcp')
|
130
|
+
solr_doc["lib_format_sim"] = formats
|
131
|
+
solr_doc["lib_repo_sim"] = repositories
|
132
|
+
solr_doc["lib_shelf_sim"] = shelf_locators
|
133
|
+
solr_doc.each do |k, v|
|
134
|
+
if self.class.maps_field? k
|
135
|
+
solr_doc[k] = self.class.map_value(k, v)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
solr_doc
|
139
|
+
end
|
140
|
+
|
141
|
+
def self.normalize(t, strip_punctuation=false)
|
142
|
+
# strip whitespace
|
143
|
+
n_t = t.dup.strip
|
144
|
+
# collapse intermediate whitespace
|
145
|
+
n_t.gsub!(/\s+/, ' ')
|
146
|
+
# pull off paired punctuation, and any leading punctuation
|
147
|
+
if strip_punctuation
|
148
|
+
n_t = n_t.sub(/^\((.*)\)$/, "\\1")
|
149
|
+
n_t = n_t.sub(/^\{(.*)\}$/, "\\1")
|
150
|
+
n_t = n_t.sub(/^\[(.*)\]$/, "\\1")
|
151
|
+
n_t = n_t.sub(/^"(.*)"$/, "\\1")
|
152
|
+
n_t = n_t.sub(/^'(.*)'$/, "\\1")
|
153
|
+
n_t = n_t.sub(/^<(.*)>$/, "\\1")
|
154
|
+
#n_t = n_t.sub(/^\p{Ps}(.*)\p{Pe}/u, "\\1")
|
155
|
+
n_t = n_t.sub(/^[[:punct:]]+/, '')
|
156
|
+
# this may have 'created' leading/trailing space, so strip
|
157
|
+
n_t.strip!
|
158
|
+
end
|
159
|
+
n_t
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
@@ -9,18 +9,6 @@ module Cul::Scv::Hydra::Solrizer::TerminologyBasedSolrizer
|
|
9
9
|
# Module Methods
|
10
10
|
|
11
11
|
module ClassMethods
|
12
|
-
# Build a solr document from +doc+ based on its terminology
|
13
|
-
# @param [OM::XML::Document] doc
|
14
|
-
# @param [Hash] solr_doc (optional) solr_doc (values hash) to populate
|
15
|
-
def solrize(doc, solr_doc=Hash.new, field_mapper = nil)
|
16
|
-
unless doc.class.terminology.nil?
|
17
|
-
doc.class.terminology.terms.each_pair do |term_name,term|
|
18
|
-
doc.solrize_term(term, solr_doc, field_mapper) unless term.is_root_term?
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
return solr_doc
|
23
|
-
end
|
24
12
|
# Populate a solr document with solr fields corresponding to the given xml node
|
25
13
|
# Field names are generated using settings from the term in the +doc+'s terminology corresponding to +term_pointer+
|
26
14
|
# @param [Nokogiri::XML::Node] node to solrize
|
@@ -31,7 +19,6 @@ module Cul::Scv::Hydra::Solrizer::TerminologyBasedSolrizer
|
|
31
19
|
return solr_doc unless term.index_as && !term.index_as.empty?
|
32
20
|
generic_field_name_base = OM::XML::Terminology.term_generic_name(*term_pointer)
|
33
21
|
create_and_insert_terms(generic_field_name_base, node_value, term.index_as, solr_doc)
|
34
|
-
|
35
22
|
if term_pointer.length > 1
|
36
23
|
#hierarchical_field_name_base = OM::XML::Terminology.term_hierarchical_name(*term_pointer)
|
37
24
|
#create_and_insert_terms(hierarchical_field_name_base, node_value, term.index_as, solr_doc)
|
@@ -21,10 +21,21 @@ class ValueMapper
|
|
21
21
|
# Instance methods
|
22
22
|
|
23
23
|
def initialize(value_maps=nil)
|
24
|
-
@value_maps = value_maps || Cul::Scv::Hydra::Solrizer::ValueMapper.default_value_maps
|
24
|
+
@value_maps = (value_maps || Cul::Scv::Hydra::Solrizer::ValueMapper.default_value_maps).with_indifferent_access
|
25
|
+
@mapped_fields = {}.with_indifferent_access
|
25
26
|
end
|
26
|
-
|
27
|
-
|
27
|
+
|
28
|
+
def maps_field?(field_key)
|
29
|
+
@mapped_fields.has_key? field_key
|
30
|
+
end
|
31
|
+
|
32
|
+
def map_field(field_key, map_key)
|
33
|
+
@mapped_fields[field_key] = map_key
|
34
|
+
end
|
35
|
+
|
36
|
+
def map_value(field_key, value_key)
|
37
|
+
map_key = @mapped_fields[field_key]
|
38
|
+
return value_key unless @mapped_fields.has_key? field_key and @value_maps.has_key? map_key
|
28
39
|
if value_key.is_a? Array
|
29
40
|
value_key.collect{ |val| @value_maps[map_key].fetch(val, val) }
|
30
41
|
else
|
data/lib/tasks/cmodel.rake
CHANGED
@@ -73,27 +73,27 @@ end
|
|
73
73
|
|
74
74
|
namespace :cul_scv_hydra do
|
75
75
|
namespace :cmodel do
|
76
|
-
task :test
|
76
|
+
task :test do #=> :environment do
|
77
77
|
pid = ENV["PID"]
|
78
78
|
puts content_for(pid)
|
79
79
|
end
|
80
80
|
|
81
|
-
task :load
|
81
|
+
task :load do #=> :environment do
|
82
82
|
pid = ENV["PID"]
|
83
83
|
load_content(content_for(pid),pid)
|
84
84
|
end
|
85
85
|
|
86
|
-
task :purge
|
86
|
+
task :purge do #=> :environment do
|
87
87
|
pid = ENV["PID"]
|
88
88
|
purge(pid)
|
89
89
|
end
|
90
90
|
|
91
|
-
task :reload
|
91
|
+
task :reload do #=> :environment do
|
92
92
|
pid = ENV["PID"]
|
93
93
|
reload(pid)
|
94
94
|
end
|
95
95
|
|
96
|
-
task :reload_all
|
96
|
+
task :reload_all do #=> :environment do
|
97
97
|
pattern = ENV["PATTERN"]
|
98
98
|
pattern = Regexp.compile(pattern) if pattern
|
99
99
|
reload("ldpd:nullbind")
|
metadata
CHANGED
@@ -1,18 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cul_scv_hydra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Benjamin Armintor
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date:
|
12
|
+
date: 2014-02-21 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: blacklight
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
16
18
|
requirements:
|
17
19
|
- - ! '>='
|
18
20
|
- !ruby/object:Gem::Version
|
@@ -20,6 +22,7 @@ dependencies:
|
|
20
22
|
type: :runtime
|
21
23
|
prerelease: false
|
22
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
23
26
|
requirements:
|
24
27
|
- - ! '>='
|
25
28
|
- !ruby/object:Gem::Version
|
@@ -27,34 +30,39 @@ dependencies:
|
|
27
30
|
- !ruby/object:Gem::Dependency
|
28
31
|
name: active-fedora
|
29
32
|
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
30
34
|
requirements:
|
31
35
|
- - ~>
|
32
36
|
- !ruby/object:Gem::Version
|
33
|
-
version: 6.1
|
37
|
+
version: '6.1'
|
34
38
|
type: :runtime
|
35
39
|
prerelease: false
|
36
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
37
42
|
requirements:
|
38
43
|
- - ~>
|
39
44
|
- !ruby/object:Gem::Version
|
40
|
-
version: 6.1
|
45
|
+
version: '6.1'
|
41
46
|
- !ruby/object:Gem::Dependency
|
42
47
|
name: hydra-head
|
43
48
|
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
44
50
|
requirements:
|
45
51
|
- - '='
|
46
52
|
- !ruby/object:Gem::Version
|
47
|
-
version: 6.
|
53
|
+
version: 6.4.1
|
48
54
|
type: :runtime
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
51
58
|
requirements:
|
52
59
|
- - '='
|
53
60
|
- !ruby/object:Gem::Version
|
54
|
-
version: 6.
|
61
|
+
version: 6.4.1
|
55
62
|
- !ruby/object:Gem::Dependency
|
56
63
|
name: active_fedora_finders
|
57
64
|
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
58
66
|
requirements:
|
59
67
|
- - ! '>='
|
60
68
|
- !ruby/object:Gem::Version
|
@@ -62,6 +70,7 @@ dependencies:
|
|
62
70
|
type: :runtime
|
63
71
|
prerelease: false
|
64
72
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
65
74
|
requirements:
|
66
75
|
- - ! '>='
|
67
76
|
- !ruby/object:Gem::Version
|
@@ -69,6 +78,7 @@ dependencies:
|
|
69
78
|
- !ruby/object:Gem::Dependency
|
70
79
|
name: active_fedora_relsint
|
71
80
|
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
72
82
|
requirements:
|
73
83
|
- - ! '>='
|
74
84
|
- !ruby/object:Gem::Version
|
@@ -76,6 +86,7 @@ dependencies:
|
|
76
86
|
type: :runtime
|
77
87
|
prerelease: false
|
78
88
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
79
90
|
requirements:
|
80
91
|
- - ! '>='
|
81
92
|
- !ruby/object:Gem::Version
|
@@ -83,6 +94,7 @@ dependencies:
|
|
83
94
|
- !ruby/object:Gem::Dependency
|
84
95
|
name: cul_image_props
|
85
96
|
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
86
98
|
requirements:
|
87
99
|
- - ! '>='
|
88
100
|
- !ruby/object:Gem::Version
|
@@ -90,6 +102,23 @@ dependencies:
|
|
90
102
|
type: :runtime
|
91
103
|
prerelease: false
|
92
104
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: mods
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
93
122
|
requirements:
|
94
123
|
- - ! '>='
|
95
124
|
- !ruby/object:Gem::Version
|
@@ -97,62 +126,71 @@ dependencies:
|
|
97
126
|
- !ruby/object:Gem::Dependency
|
98
127
|
name: om
|
99
128
|
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
100
130
|
requirements:
|
101
|
-
- -
|
131
|
+
- - ! '>='
|
102
132
|
- !ruby/object:Gem::Version
|
103
|
-
version:
|
133
|
+
version: '0'
|
104
134
|
type: :runtime
|
105
135
|
prerelease: false
|
106
136
|
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
107
138
|
requirements:
|
108
|
-
- -
|
139
|
+
- - ! '>='
|
109
140
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
141
|
+
version: '0'
|
111
142
|
- !ruby/object:Gem::Dependency
|
112
143
|
name: solrizer
|
113
144
|
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
114
146
|
requirements:
|
115
147
|
- - ~>
|
116
148
|
- !ruby/object:Gem::Version
|
117
|
-
version: 3.0
|
149
|
+
version: '3.0'
|
118
150
|
type: :runtime
|
119
151
|
prerelease: false
|
120
152
|
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
121
154
|
requirements:
|
122
155
|
- - ~>
|
123
156
|
- !ruby/object:Gem::Version
|
124
|
-
version: 3.0
|
157
|
+
version: '3.0'
|
125
158
|
- !ruby/object:Gem::Dependency
|
126
159
|
name: rspec
|
127
160
|
requirement: !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
128
162
|
requirements:
|
129
163
|
- - ~>
|
130
164
|
- !ruby/object:Gem::Version
|
131
|
-
version: 2.10
|
165
|
+
version: '2.10'
|
132
166
|
type: :development
|
133
167
|
prerelease: false
|
134
168
|
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
135
170
|
requirements:
|
136
171
|
- - ~>
|
137
172
|
- !ruby/object:Gem::Version
|
138
|
-
version: 2.10
|
173
|
+
version: '2.10'
|
139
174
|
- !ruby/object:Gem::Dependency
|
140
175
|
name: rspec-rails
|
141
176
|
requirement: !ruby/object:Gem::Requirement
|
177
|
+
none: false
|
142
178
|
requirements:
|
143
179
|
- - ~>
|
144
180
|
- !ruby/object:Gem::Version
|
145
|
-
version: 2.10
|
181
|
+
version: '2.10'
|
146
182
|
type: :development
|
147
183
|
prerelease: false
|
148
184
|
version_requirements: !ruby/object:Gem::Requirement
|
185
|
+
none: false
|
149
186
|
requirements:
|
150
187
|
- - ~>
|
151
188
|
- !ruby/object:Gem::Version
|
152
|
-
version: 2.10
|
189
|
+
version: '2.10'
|
153
190
|
- !ruby/object:Gem::Dependency
|
154
191
|
name: mocha
|
155
192
|
requirement: !ruby/object:Gem::Requirement
|
193
|
+
none: false
|
156
194
|
requirements:
|
157
195
|
- - '='
|
158
196
|
- !ruby/object:Gem::Version
|
@@ -160,6 +198,7 @@ dependencies:
|
|
160
198
|
type: :development
|
161
199
|
prerelease: false
|
162
200
|
version_requirements: !ruby/object:Gem::Requirement
|
201
|
+
none: false
|
163
202
|
requirements:
|
164
203
|
- - '='
|
165
204
|
- !ruby/object:Gem::Version
|
@@ -167,6 +206,7 @@ dependencies:
|
|
167
206
|
- !ruby/object:Gem::Dependency
|
168
207
|
name: equivalent-xml
|
169
208
|
requirement: !ruby/object:Gem::Requirement
|
209
|
+
none: false
|
170
210
|
requirements:
|
171
211
|
- - ! '>='
|
172
212
|
- !ruby/object:Gem::Version
|
@@ -174,6 +214,7 @@ dependencies:
|
|
174
214
|
type: :development
|
175
215
|
prerelease: false
|
176
216
|
version_requirements: !ruby/object:Gem::Requirement
|
217
|
+
none: false
|
177
218
|
requirements:
|
178
219
|
- - ! '>='
|
179
220
|
- !ruby/object:Gem::Version
|
@@ -181,6 +222,7 @@ dependencies:
|
|
181
222
|
- !ruby/object:Gem::Dependency
|
182
223
|
name: rbx-require-relative
|
183
224
|
requirement: !ruby/object:Gem::Requirement
|
225
|
+
none: false
|
184
226
|
requirements:
|
185
227
|
- - ! '>='
|
186
228
|
- !ruby/object:Gem::Version
|
@@ -188,6 +230,7 @@ dependencies:
|
|
188
230
|
type: :development
|
189
231
|
prerelease: false
|
190
232
|
version_requirements: !ruby/object:Gem::Requirement
|
233
|
+
none: false
|
191
234
|
requirements:
|
192
235
|
- - ! '>='
|
193
236
|
- !ruby/object:Gem::Version
|
@@ -202,7 +245,9 @@ files:
|
|
202
245
|
- lib/cul_scv_hydra/access_controls_enforcement.rb
|
203
246
|
- lib/cul_scv_hydra/active_fedora/model/aggregator.rb
|
204
247
|
- lib/cul_scv_hydra/active_fedora/model/common.rb
|
248
|
+
- lib/cul_scv_hydra/active_fedora/model/nokogiri_datastreams.rb
|
205
249
|
- lib/cul_scv_hydra/active_fedora/model/resource.rb
|
250
|
+
- lib/cul_scv_hydra/active_fedora/model/struct_metadata.rb
|
206
251
|
- lib/cul_scv_hydra/active_fedora/model.rb
|
207
252
|
- lib/cul_scv_hydra/active_fedora.rb
|
208
253
|
- lib/cul_scv_hydra/controllers/aggregates.rb
|
@@ -230,6 +275,7 @@ files:
|
|
230
275
|
- lib/cul_scv_hydra/om.rb
|
231
276
|
- lib/cul_scv_hydra/solrizer/extractor.rb
|
232
277
|
- lib/cul_scv_hydra/solrizer/field_mapper.rb
|
278
|
+
- lib/cul_scv_hydra/solrizer/scv_mods_fieldable.rb
|
233
279
|
- lib/cul_scv_hydra/solrizer/terminology_based_solrizer.rb
|
234
280
|
- lib/cul_scv_hydra/solrizer/value_mapper.rb
|
235
281
|
- lib/cul_scv_hydra/solrizer.rb
|
@@ -268,25 +314,26 @@ files:
|
|
268
314
|
- config/subs.yml
|
269
315
|
homepage: https://github.com/cul/cul_scv_hydra
|
270
316
|
licenses: []
|
271
|
-
metadata: {}
|
272
317
|
post_install_message:
|
273
318
|
rdoc_options: []
|
274
319
|
require_paths:
|
275
320
|
- lib
|
276
321
|
required_ruby_version: !ruby/object:Gem::Requirement
|
322
|
+
none: false
|
277
323
|
requirements:
|
278
324
|
- - ! '>='
|
279
325
|
- !ruby/object:Gem::Version
|
280
326
|
version: 1.9.3
|
281
327
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
328
|
+
none: false
|
282
329
|
requirements:
|
283
330
|
- - ! '>='
|
284
331
|
- !ruby/object:Gem::Version
|
285
332
|
version: '0'
|
286
333
|
requirements: []
|
287
334
|
rubyforge_project:
|
288
|
-
rubygems_version:
|
335
|
+
rubygems_version: 1.8.24
|
289
336
|
signing_key:
|
290
|
-
specification_version:
|
337
|
+
specification_version: 3
|
291
338
|
summary: ActiveFedora, OM, and Solrizer implementations for CUL Staff Collection Viewer
|
292
339
|
test_files: []
|
checksums.yaml
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
---
|
2
|
-
!binary "U0hBMQ==":
|
3
|
-
metadata.gz: !binary |-
|
4
|
-
YTI5YWY3ZWFjMWVhYjdjNjI4Mzc4MGRjYWNkNTg5MTk0MmNiZjY3Mg==
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
YzU5YzY4YjY3OWFjYWM5NzllOWRiNDU2ZThiYTk0ZTgwMjg4ZWE4MQ==
|
7
|
-
!binary "U0hBNTEy":
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
YWU1Y2U2ZGQ5Zjg1ZDlhNmUxNzFmNDBjYTdhZjlmNDdjYjQ1MjhjYjc2YzVj
|
10
|
-
ZjBjYTcwMTY5NTViNTZiZTNhY2U3OTk1Yjc2YWFkODYxYTQyMzE4MjkwZDUz
|
11
|
-
YzBkNWM4ZTA4ZWNmNjk5NDA3M2YyY2JlNjNmNzNmZjk5NTYwNTM=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
ZTI1ZjY5ZDRmYzM0MWVhZDQ5MmVmNWQwZDVlZWVjODJmNTVjZDBmMzA3ZWQ2
|
14
|
-
YTRhODNhYTI1Yjc5MmJkNGJmN2Y2OTBjOWM2NzRiM2FhODM1NzhjZjdkZTFi
|
15
|
-
ZmNlNzA2ZWM0NTFjODRjYWYwYWViMWRlNTRlZGE3NTM0ZGJjZjA=
|