mei 0.0.1 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.rdoc +19 -1
- data/app/assets/javascripts/custom_form_functions.js +110 -0
- data/app/assets/stylesheets/mei/mei_styles.scss +80 -0
- data/app/controllers/mei/application_controller.rb +4 -0
- data/app/controllers/mei/terms_controller.rb +55 -0
- data/app/helpers/mei/application_helper.rb +2 -0
- data/app/inputs/lcsh_lookup_input.rb +40 -0
- data/app/inputs/mei_multi_lookup_input.rb +60 -0
- data/app/inputs/with_help_icon.rb +32 -0
- data/app/models/mei/geo_names_resource.rb +14 -0
- data/app/models/mei/homosaurus_subject_resource.rb +132 -0
- data/app/models/mei/lcsh_subject_resource.rb +14 -0
- data/app/views/mei/_form.html.erb +227 -0
- data/config/mei.yml.sample +17 -0
- data/config/routes.rb +3 -0
- data/lib/generators/mei/install_generator.rb +36 -0
- data/lib/generators/mei/localassets_generator.rb +17 -0
- data/lib/generators/mei/routes_generator.rb +27 -0
- data/lib/generators/mei/templates/config/mei.yml.sample +17 -0
- data/lib/generators/mei/templates/mei.scss +1 -0
- data/lib/generators/mei/yml_generator.rb +15 -0
- data/lib/mei.rb +9 -0
- data/lib/mei/engine.rb +5 -0
- data/lib/mei/geonames.rb +96 -0
- data/lib/mei/helper.rb +9 -0
- data/lib/mei/loc.rb +203 -0
- data/lib/mei/version.rb +1 -1
- data/lib/mei/web_service_base.rb +32 -0
- metadata +143 -6
data/lib/mei/helper.rb
ADDED
data/lib/mei/loc.rb
ADDED
@@ -0,0 +1,203 @@
|
|
1
|
+
require 'uri'
|
2
|
+
|
3
|
+
module Mei
|
4
|
+
class Loc
|
5
|
+
|
6
|
+
include Mei::WebServiceBase
|
7
|
+
|
8
|
+
def self.pop_graph(value)
|
9
|
+
RDF::Graph.load("#{Mei::Loc.ldf_config[:ldf_server]}#{value}.ttl", format: :ttl)
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.ldf_config
|
13
|
+
@ldf_config ||= YAML::load(File.open(ldf_config_path))[env]
|
14
|
+
.with_indifferent_access
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.app_root
|
18
|
+
return @app_root if @app_root
|
19
|
+
@app_root = Rails.root if defined?(Rails) and defined?(Rails.root)
|
20
|
+
@app_root ||= APP_ROOT if defined?(APP_ROOT)
|
21
|
+
@app_root ||= '.'
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.env
|
25
|
+
return @env if @env
|
26
|
+
#The following commented line always returns "test" in a rails c production console. Unsure of how to fix this yet...
|
27
|
+
#@env = ENV["RAILS_ENV"] = "test" if ENV
|
28
|
+
@env ||= Rails.env if defined?(Rails) and defined?(Rails.root)
|
29
|
+
@env ||= 'development'
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.ldf_config_path
|
33
|
+
File.join(app_root, 'config', 'mei.yml')
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.qskos value
|
37
|
+
if value.match(/^sh\d+/)
|
38
|
+
return ::RDF::URI.new("http://id.loc.gov/authorities/subjects/#{value}")
|
39
|
+
else
|
40
|
+
return ::RDF::URI.new("http://www.w3.org/2004/02/skos/core##{value}")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def initialize(subauthority, solr_field)
|
45
|
+
@subauthority = subauthority
|
46
|
+
@solr_field = solr_field
|
47
|
+
#RestClient.enable Rack::Cache
|
48
|
+
end
|
49
|
+
|
50
|
+
def search q
|
51
|
+
@raw_response = get_json(build_query_url(q))
|
52
|
+
parse_authority_response
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
def build_query_url q
|
57
|
+
escaped_query = URI.escape(q)
|
58
|
+
authority_fragment = Qa::Authorities::Loc.get_url_for_authority(@subauthority) + URI.escape(@subauthority)
|
59
|
+
return "http://id.loc.gov/search/?q=#{escaped_query}&q=#{authority_fragment}&format=json"
|
60
|
+
end
|
61
|
+
|
62
|
+
# Reformats the data received from the LOC service
|
63
|
+
def parse_authority_response
|
64
|
+
threaded_responses = []
|
65
|
+
#end_response = Array.new(20)
|
66
|
+
end_response = []
|
67
|
+
position_counter = 0
|
68
|
+
@raw_response.select {|response| response[0] == "atom:entry"}.map do |response|
|
69
|
+
threaded_responses << Thread.new(position_counter) { |local_pos|
|
70
|
+
end_response[local_pos] = loc_response_to_qa(response_to_struct(response), position_counter)
|
71
|
+
}
|
72
|
+
position_counter+=1
|
73
|
+
#sleep(0.05)
|
74
|
+
|
75
|
+
#loc_response_to_qa(response_to_struct(response))
|
76
|
+
end
|
77
|
+
threaded_responses.each { |thr| thr.join }
|
78
|
+
end_response
|
79
|
+
end
|
80
|
+
|
81
|
+
# Simple conversion from LoC-based struct to QA hash
|
82
|
+
def loc_response_to_qa(data, counter)
|
83
|
+
json_link = data.links.select { |link| link.first == 'application/json' }
|
84
|
+
if json_link.present?
|
85
|
+
json_link = json_link[0][1]
|
86
|
+
|
87
|
+
broader, narrower, variants = get_skos_concepts(json_link.gsub('.json',''))
|
88
|
+
end
|
89
|
+
|
90
|
+
#count = ActiveFedora::Base.find_with_conditions("subject_tesim:#{data.id.gsub('info:lc', 'http://id.loc.gov').gsub(':','\:')}", rows: '100', fl: 'id' ).length
|
91
|
+
#FIXME
|
92
|
+
count = ActiveFedora::Base.search_with_conditions("#{@solr_field}:#{solr_clean(data.id.gsub('info:lc', 'http://id.loc.gov'))}", rows: '100', fl: 'id' ).length
|
93
|
+
#count = 0
|
94
|
+
if count >= 99
|
95
|
+
count = "99+"
|
96
|
+
else
|
97
|
+
count = count.to_s
|
98
|
+
end
|
99
|
+
|
100
|
+
|
101
|
+
|
102
|
+
{
|
103
|
+
"uri_link" => data.id.gsub('info:lc', 'http://id.loc.gov') || data.title,
|
104
|
+
"label" => data.title,
|
105
|
+
"broader" => broader,
|
106
|
+
"narrower" => narrower,
|
107
|
+
"variants" => variants,
|
108
|
+
"count" => count
|
109
|
+
}
|
110
|
+
end
|
111
|
+
|
112
|
+
|
113
|
+
def solr_clean(term)
|
114
|
+
return term.gsub('\\', '\\\\').gsub(':', '\\:').gsub(' ', '\ ')
|
115
|
+
end
|
116
|
+
|
117
|
+
def response_to_struct response
|
118
|
+
result = response.each_with_object({}) do |result_parts, result|
|
119
|
+
next unless result_parts[0]
|
120
|
+
key = result_parts[0].sub('atom:', '').sub('dcterms:', '')
|
121
|
+
info = result_parts[1]
|
122
|
+
val = result_parts[2]
|
123
|
+
|
124
|
+
case key
|
125
|
+
when 'title', 'id', 'name', 'updated', 'created'
|
126
|
+
result[key] = val
|
127
|
+
when 'link'
|
128
|
+
result["links"] ||= []
|
129
|
+
result["links"] << [info["type"], info["href"]]
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
OpenStruct.new(result)
|
134
|
+
end
|
135
|
+
|
136
|
+
def get_skos_concepts subject
|
137
|
+
broader_list = []
|
138
|
+
narrower_list = []
|
139
|
+
variant_list = []
|
140
|
+
|
141
|
+
#xml_response = Nokogiri::XML(response).remove_namespaces!
|
142
|
+
|
143
|
+
repo = pop_graph(subject)
|
144
|
+
repo.query(:subject=>::RDF::URI.new(subject), :predicate=>Mei::Loc.qskos('broader')).each_statement do |result_statement|
|
145
|
+
if !result_statement.object.literal? and result_statement.object.uri?
|
146
|
+
broader_label = nil
|
147
|
+
broader_uri = result_statement.object.to_s
|
148
|
+
#if Mei::Loc.repo.query(:subject=>::RDF::URI.new(broader_uri), :predicate=>Mei::Loc.qskos('narrower'), :object=>::RDF::URI.new(subject)).count > 0
|
149
|
+
valid = false
|
150
|
+
|
151
|
+
broader_repo = pop_graph(broader_uri)
|
152
|
+
broader_repo.query(:subject=>::RDF::URI.new(broader_uri)).each_statement do |broader_statement|
|
153
|
+
if broader_statement.predicate.to_s == Mei::Loc.qskos('prefLabel')
|
154
|
+
broader_label ||= broader_statement.object.value if broader_statement.object.literal?
|
155
|
+
end
|
156
|
+
|
157
|
+
if broader_statement.predicate.to_s == Mei::Loc.qskos('member')
|
158
|
+
valid = true if broader_statement.object.to_s == 'http://id.loc.gov/authorities/subjects/collection_LCSHAuthorizedHeadings'
|
159
|
+
end
|
160
|
+
end
|
161
|
+
broader_label ||= broader_uri
|
162
|
+
broader_list << {:uri_link=>broader_uri, :label=>broader_label} if valid
|
163
|
+
#end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
puts 'pre-a'
|
168
|
+
repo.query(:subject=>::RDF::URI.new(subject), :predicate=>Mei::Loc.qskos('narrower')).each_statement do |result_statement|
|
169
|
+
puts 'a'
|
170
|
+
if !result_statement.object.literal? and result_statement.object.uri?
|
171
|
+
narrower_label = nil
|
172
|
+
narrower_uri = result_statement.object.to_s
|
173
|
+
valid = false
|
174
|
+
|
175
|
+
narrower_repo = pop_graph(narrower_uri)
|
176
|
+
puts 'b'
|
177
|
+
puts narrower_uri
|
178
|
+
narrower_repo.query(:subject=>::RDF::URI.new(narrower_uri)).each_statement do |narrower_statement|
|
179
|
+
if narrower_statement.predicate.to_s == Mei::Loc.qskos('prefLabel')
|
180
|
+
narrower_label ||= narrower_statement.object.value if narrower_statement.object.literal?
|
181
|
+
end
|
182
|
+
|
183
|
+
if narrower_statement.predicate.to_s == Mei::Loc.qskos('member')
|
184
|
+
valid = true if narrower_statement.object.to_s == 'http://id.loc.gov/authorities/subjects/collection_LCSHAuthorizedHeadings'
|
185
|
+
end
|
186
|
+
end
|
187
|
+
narrower_label ||= narrower_uri
|
188
|
+
narrower_list << {:uri_link=>narrower_uri, :label=>narrower_label} if valid
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
repo.query(:subject=>::RDF::URI.new(subject), :predicate=>Mei::Loc.qskos('altLabel')).each_statement do |result_statement|
|
193
|
+
variant_list << result_statement.object.value if result_statement.object.literal?
|
194
|
+
end
|
195
|
+
|
196
|
+
return broader_list, narrower_list, variant_list
|
197
|
+
end
|
198
|
+
|
199
|
+
|
200
|
+
|
201
|
+
|
202
|
+
end
|
203
|
+
end
|
data/lib/mei/version.rb
CHANGED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'rest_client'
|
2
|
+
require 'restclient/components'
|
3
|
+
require 'rack/cache'
|
4
|
+
|
5
|
+
module Mei
|
6
|
+
module WebServiceBase
|
7
|
+
attr_accessor :raw_response
|
8
|
+
|
9
|
+
# mix-in to retreive and parse JSON content from the web
|
10
|
+
def get_json(url)
|
11
|
+
RestClient.enable Rack::Cache
|
12
|
+
r = RestClient.get url, request_options
|
13
|
+
RestClient.disable Rack::Cache
|
14
|
+
JSON.parse(r)
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
def request_options
|
19
|
+
{ accept: :json }
|
20
|
+
end
|
21
|
+
|
22
|
+
def get_xml(url)
|
23
|
+
RestClient.enable Rack::Cache
|
24
|
+
r = RestClient.get url
|
25
|
+
RestClient.disable Rack::Cache
|
26
|
+
r
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
metadata
CHANGED
@@ -1,29 +1,141 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mei
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steven Anderson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-10-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: simple_form
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: active-fedora
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: gon
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: curation_concerns
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
18
74
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
75
|
+
version: 1.6.1
|
20
76
|
type: :runtime
|
21
77
|
prerelease: false
|
22
78
|
version_requirements: !ruby/object:Gem::Requirement
|
23
79
|
requirements:
|
24
|
-
- - "
|
80
|
+
- - ">="
|
25
81
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
82
|
+
version: 1.6.1
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: qa
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.5.0
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.5.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rest-client
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 1.8.0
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 1.8.0
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rest-client-components
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
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
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rack-cache
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
27
139
|
- !ruby/object:Gem::Dependency
|
28
140
|
name: sqlite3
|
29
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -48,8 +160,33 @@ files:
|
|
48
160
|
- MIT-LICENSE
|
49
161
|
- README.rdoc
|
50
162
|
- Rakefile
|
163
|
+
- app/assets/javascripts/custom_form_functions.js
|
164
|
+
- app/assets/stylesheets/mei/mei_styles.scss
|
165
|
+
- app/controllers/mei/application_controller.rb
|
166
|
+
- app/controllers/mei/terms_controller.rb
|
167
|
+
- app/helpers/mei/application_helper.rb
|
168
|
+
- app/inputs/lcsh_lookup_input.rb
|
169
|
+
- app/inputs/mei_multi_lookup_input.rb
|
170
|
+
- app/inputs/with_help_icon.rb
|
171
|
+
- app/models/mei/geo_names_resource.rb
|
172
|
+
- app/models/mei/homosaurus_subject_resource.rb
|
173
|
+
- app/models/mei/lcsh_subject_resource.rb
|
174
|
+
- app/views/mei/_form.html.erb
|
175
|
+
- config/mei.yml.sample
|
176
|
+
- config/routes.rb
|
177
|
+
- lib/generators/mei/install_generator.rb
|
178
|
+
- lib/generators/mei/localassets_generator.rb
|
179
|
+
- lib/generators/mei/routes_generator.rb
|
180
|
+
- lib/generators/mei/templates/config/mei.yml.sample
|
181
|
+
- lib/generators/mei/templates/mei.scss
|
182
|
+
- lib/generators/mei/yml_generator.rb
|
51
183
|
- lib/mei.rb
|
184
|
+
- lib/mei/engine.rb
|
185
|
+
- lib/mei/geonames.rb
|
186
|
+
- lib/mei/helper.rb
|
187
|
+
- lib/mei/loc.rb
|
52
188
|
- lib/mei/version.rb
|
189
|
+
- lib/mei/web_service_base.rb
|
53
190
|
- lib/tasks/mei_tasks.rake
|
54
191
|
- test/dummy/README.rdoc
|
55
192
|
- test/dummy/Rakefile
|