mei 0.0.1 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,9 @@
1
+ module Mei
2
+ class Helper
3
+ def self.strip_uri(s)
4
+ left_paran = s.rindex(/\(/)
5
+ right_paran = s.rindex(/\)/)
6
+ s[left_paran+1..right_paran-1]
7
+ end
8
+ end
9
+ end
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Mei
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -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.1
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: 2015-12-04 00:00:00.000000000 Z
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: 4.2.5
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: 4.2.5
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