mei 0.0.1 → 0.0.3

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.
@@ -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