umlaut 3.1.1 → 3.2.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/README.md CHANGED
@@ -88,5 +88,5 @@ https://github.com/team-umlaut/umlaut/
88
88
  ## Listserv
89
89
 
90
90
  You can join the umlaut listserv at:
91
- http://rubyforge.org/mail/?group_id=4382
91
+ https://groups.google.com/forum/#!forum/umlaut-software
92
92
 
@@ -48,6 +48,9 @@
48
48
  if (context_object == undefined)
49
49
  context_object = "";
50
50
 
51
+ // Remove query string (if present)
52
+ umlaut_base = umlaut_base.replace(/\?.*$/, '')
53
+ // Remove trailing slash
51
54
  umlaut_base = umlaut_base.replace(/\/$/,'');
52
55
  this.umlaut_uri = umlaut_base + '/resolve/partial_html_sections?umlaut.response_format=json&' + context_object;
53
56
 
@@ -25,6 +25,8 @@ class LinkRouterController < UmlautController
25
25
  redirect_to calculate_url_for_response(svc_response)
26
26
  end
27
27
 
28
+ protected
29
+
28
30
  # Used to calculate a destination/target url for an Umlaut response item.
29
31
  #
30
32
  # Pass in a ServiceType join object (not actually a ServiceResponse, sorry)
@@ -39,6 +41,8 @@ class LinkRouterController < UmlautController
39
41
  svc = ServiceStore.instantiate_service!(svc_response.service_id, nil)
40
42
  destination = svc.response_url(svc_response, params)
41
43
 
44
+ raise_missing_url!(svc_response) if destination.blank?
45
+
42
46
  # if response_url returned a string, it's an external url and we're
43
47
  # done. If it's something else, usually a hash, then pass it to
44
48
  # url_for to generate a url.
@@ -59,4 +63,15 @@ class LinkRouterController < UmlautController
59
63
  end
60
64
  end
61
65
  protected :calculate_url_for_response
62
- end
66
+ end
67
+
68
+ def raise_missing_url!(service_response)
69
+ svc_rsp_id = service_response.try(:id)
70
+ service_id = service_response.try(:service_id)
71
+ type = service_response.try(:service_type_value_name)
72
+ text = service_response.try(:display_text)
73
+ request_id = service_response.try(:request).try(:id)
74
+ request_url = service_response.try(:request).try(:http_env).try {|h| h["REQUEST_URI"] }
75
+
76
+ raise ArgumentError.new("LinkRouterController#index missing URL to redirect to for ServiceResponse:#{svc_rsp_id} (#{service_id}/#{type}/#{text}) from original request url: #{request_url}")
77
+ end
@@ -321,6 +321,7 @@ module UmlautConfigurable
321
321
 
322
322
  add_resolve_sections! do
323
323
  div_id "help"
324
+ section_title "Question? Problem? Contact:"
324
325
  html_area :sidebar
325
326
  bg_update false
326
327
  partial "help"
@@ -3,37 +3,37 @@
3
3
  module MarcHelper
4
4
 
5
5
  # Takes an array of ruby MARC objects, adds ServiceResponses
6
- # for the 856 links contained.
6
+ # for the 856 links contained.
7
7
  # Returns a hash of arrays of ServiceResponse objects added, keyed
8
- # by service type value string.
8
+ # by service type value string.
9
9
  def add_856_links(request, marc_records, options = {})
10
10
  options[:default_service_type] ||= "fulltext"
11
11
  options[:match_reliability] ||= ServiceResponse::MatchExact
12
12
 
13
13
  responses_added = Hash.new
14
-
14
+
15
15
  # Keep track of urls to avoid putting the exact same url in twice
16
16
  urls_seen = Array.new
17
-
17
+
18
18
  marc_records.each do |marc_xml|
19
-
19
+
20
20
  marc_xml.find_all {|f| '856' === f.tag}.each do |field|
21
21
  # Might have more than one $u, in which case we want to
22
22
  # possibly add each of them. Might have 0 $u in which case
23
- # we skip.
24
- field.subfields.find_all {|sf| sf.code == 'u'}.each do |sf|
25
- url = sf.value
26
-
23
+ # we skip.
24
+ field.subfields.find_all {|sf| sf.code == 'u'}.each do |sf|
25
+ url = sf.value
26
+
27
27
  # Already got it from another catalog record?
28
28
  next if urls_seen.include?(url)
29
-
30
- # Trying to avoid duplicates with SFX/link resolver.
29
+
30
+ # Trying to avoid duplicates with SFX/link resolver.
31
31
  skip = should_skip_856_link?(request, marc_xml, url)
32
32
  next if skip
33
-
33
+
34
34
  urls_seen.push(url)
35
-
36
-
35
+
36
+
37
37
  display_name = nil
38
38
  if field['y']
39
39
  display_name = field['y']
@@ -50,46 +50,46 @@ module MarcHelper
50
50
  # But if we've got a $3, the closest MARC comes to a field
51
51
  # that explains what this actually IS, use that too please.
52
52
  display_name = field['3'] + ' from ' + display_name if field['3']
53
-
54
- # Build the response.
55
-
53
+
54
+ # Build the response.
55
+
56
56
  response_params = {:service=>self, :display_text=>display_name, :url=>url}
57
- # get all those $z subfields and put em in notes.
57
+ # get all those $z subfields and put em in notes.
58
58
  response_params[:url] = url
59
-
59
+
60
60
  # subfield 3 is being used for OCA records loaded in our catalog.
61
61
  response_params[:notes] =
62
62
  field.subfields.collect {|f| f.value if (f.code == 'z') }.compact.join('; ')
63
-
63
+
64
64
  is_journal = (marc_xml.leader[7,1] == 's')
65
- unless ( field['3'] || ! is_journal ) # subfield 3 is in fact some kind of coverage note, usually
66
- response_params[:notes] += "; " unless response_params[:notes].blank?
65
+ unless ( field['3'] || ! is_journal ) # subfield 3 is in fact some kind of coverage note, usually
66
+ response_params[:notes] += "; " unless response_params[:notes].blank?
67
67
  response_params[:notes] += "Dates of coverage unknown."
68
68
  end
69
-
70
-
69
+
70
+
71
71
  unless ( options[:match_reliability] == ServiceResponse::MatchExact )
72
72
  response_params[:match_reliability] = options[:match_reliability]
73
-
73
+
74
74
  response_params[:edition_str] = edition_statement(marc_xml)
75
75
  end
76
-
76
+
77
77
  # Figure out the right service type value for this, fulltext, ToC,
78
78
  # whatever.
79
- response_params[:service_type_value] = service_type_for_856( field, options )
80
-
79
+ response_params[:service_type_value] = service_type_for_856( field, options )
80
+
81
81
  # fulltext urls from MARC are always marked as specially stupid.
82
82
  response_params[:coverage_checked] = false
83
83
  response_params[:can_link_to_article] = false
84
-
84
+
85
85
  # Some debugging info, add the 001 bibID if we have one.
86
-
86
+
87
87
  response_params[:debug_info] = "BibID: #{marc_xml['001'].value}" if marc_xml['001']
88
-
89
-
88
+
89
+
90
90
  # Add the response
91
91
  response = request.add_service_response(response_params)
92
-
92
+
93
93
  responses_added[response_params[:service_type_value]] ||= Array.new
94
94
  responses_added[response_params[:service_type_value]].push(response)
95
95
  end
@@ -118,17 +118,17 @@ module MarcHelper
118
118
  # SFX. We use MARC leader byte 7 to tell if it's a journal. Confusing enough?
119
119
  # Not yet! Even if it is a journal, if this isn't an article-level
120
120
  # cite and there are no other full text already provided, we
121
- # still include.
121
+ # still include.
122
122
  def should_skip_856_link?(request, marc_record, url)
123
123
  is_journal = (marc_record.leader[7,1] == 's')
124
-
124
+
125
125
  sfx_controlled = SfxUrl.sfx_controls_url?(url)
126
-
126
+
127
127
  # Do NOT skip if it's a title-level citation with no
128
- # existing full text entries.
129
- not_title_level_empty = !( request.title_level_citation? &&
130
- request.get_service_type("fulltext").length == 0
131
- )
128
+ # existing full text entries.
129
+ not_title_level_empty = !( request.title_level_citation? &&
130
+ request.get_service_type("fulltext").length == 0
131
+ )
132
132
 
133
133
  result = ( is_journal && sfx_controlled && not_title_level_empty )
134
134
  return result
@@ -137,43 +137,47 @@ module MarcHelper
137
137
  # Take a ruby Marc Field object representing an 856 field,
138
138
  # decide what umlaut service type value to map it to. Fulltext, ToC, etc.
139
139
  # This is neccesarily a heuristic guess, Marc doesn't have enough granularity
140
- # to really let us know for sure.
140
+ # to really let us know for sure --
141
+ # although if indicator2 is '2' for 'related resource', we decide it is
142
+ # NOT fulltext.
141
143
  def service_type_for_856(field, options)
142
144
  options[:default_service_type] ||= "fulltext_title_level"
143
145
 
144
146
  # LC records here at hopkins have "Table of contents only" in the 856$3
145
- # Think that's a convention from LC?
146
- if (field['3'] && field['3'].downcase =~ /table of contents( only)?/)
147
- return "table_of_contents"
148
- elsif (field['3'] && field['3'].downcase =~ /description/)
149
- # If it contains the word 'description', it's probably an abstract.
150
- # That's the best we can do, sadly.
151
- return "abstract"
152
- elsif (field['3'] && field['3'].downcase == 'sample text')
153
- # LC records often include these links.
154
- return "excerpts"
155
- elsif ( field['u'] =~ /www\.loc\.gov/ )
156
- # Any other loc.gov link, we know it's not full text, don't put
157
- # it in full text field, put it as "see also".
158
- return "highlighted_link"
159
- else
160
- return options[:default_service_type]
161
- end
147
+ # Think that's a convention from LC?
148
+ if (field['3'] && field['3'].downcase =~ /table of contents( only)?/)
149
+ return "table_of_contents"
150
+ elsif (field['3'] && field['3'].downcase =~ /description/)
151
+ # If it contains the word 'description', it's probably an abstract.
152
+ # That's the best we can do, sadly.
153
+ return "abstract"
154
+ elsif (field['3'] && field['3'].downcase == 'sample text')
155
+ # LC records often include these links.
156
+ return "excerpts"
157
+ elsif ( field['u'] =~ /www\.loc\.gov/ )
158
+ # Any other loc.gov link, we know it's not full text, don't put
159
+ # it in full text field, put it as "see also".
160
+ return "highlighted_link"
161
+ elsif field.indicator2 == '2' # 'related resource'
162
+ return "highlighted_link"
163
+ else
164
+ return options[:default_service_type]
165
+ end
162
166
  end
163
167
 
164
168
  # A MARC record has two dates in it, date1 and date2. Exactly
165
169
  # what they represent is something of an esoteric mystery.
166
- # But this will return them both, in an array.
170
+ # But this will return them both, in an array.
167
171
  def get_years(marc)
168
172
  array = []
169
-
170
- # no marc 008? Weird, but okay.
171
- return array unless marc['008']
172
-
173
+
174
+ # no marc 008? Weird, but okay.
175
+ return array unless marc['008']
176
+
173
177
  date1 = marc['008'].value[7,4]
174
178
  date1.strip! if date1
175
179
  array.push(date1) unless date1.blank?
176
-
180
+
177
181
  date2 = marc['008'].value[11,4]
178
182
  date2.strip! if date2
179
183
  array.push(date2) unless date2.blank?
@@ -186,9 +190,9 @@ module MarcHelper
186
190
  marc['245'].find_all {|sf| sf.code == "a" || sf.code == "b" || sf.code == "k"}.collect {|sf| sf.text}.join(" ").sub(/\s*[;:\/.,]\s*$/)
187
191
  end
188
192
 
189
-
193
+
190
194
  # From a marc record, get a string useful to display for identifying
191
- # which edition/version of a work this represents.
195
+ # which edition/version of a work this represents.
192
196
  def edition_statement(marc, options = {})
193
197
  options[:include_repro_info] ||= true
194
198
  options[:exclude_533_fields] = ['7','f','b', 'e']
@@ -196,7 +200,7 @@ module MarcHelper
196
200
  parts = Array.new
197
201
 
198
202
  return "" unless marc
199
-
203
+
200
204
  #245$h GMD
201
205
  unless ( marc['245'].blank? || marc['245']['h'].blank? )
202
206
  parts.push('(' + marc['245']['h'].gsub(/[^\w\s]/, '').strip.titlecase + ')')
@@ -207,7 +211,7 @@ module MarcHelper
207
211
  parts.push( marc['250']['a'] ) unless marc['250']['a'].blank?
208
212
  parts.push( marc['250']['b'] ) unless marc['250']['b'].blank?
209
213
  end
210
-
214
+
211
215
  # 260
212
216
  if ( marc['260'])
213
217
  if (marc['260']['b'] =~ /s\.n\./)
@@ -217,18 +221,18 @@ module MarcHelper
217
221
  end
218
222
  parts.push( marc['260']['c'] ) unless marc['260']['c'].blank?
219
223
  end
220
-
224
+
221
225
  # 533
222
226
  if options[:include_repro_info] && marc['533']
223
227
  marc['533'].subfields.each do |s|
224
228
  if ( s.code == 'a' )
225
- parts.push(s.value.gsub(/[^\w\s]/, '') + ':' )
229
+ parts.push(s.value.gsub(/[^\w\s]/, '') + ':' )
226
230
  elsif (! options[:exclude_533_fields].include?( s.code ))
227
231
  parts.push(s.value)
228
- end
232
+ end
229
233
  end
230
234
  end
231
-
235
+
232
236
  return nil if parts.length == 0
233
237
 
234
238
  return parts.join(' ')
@@ -236,24 +240,24 @@ module MarcHelper
236
240
 
237
241
  # AACR2 "General Material Designation" . While these are (I think?)
238
242
  # controlled, it's actually really hard to find the list. Maybe they're
239
- # only semi-controlled.
243
+ # only semi-controlled.
240
244
  # ONE list can be found here: http://www.oclc.org/bibformats/en/onlinecataloging/default.shtm#BCGFECEG
241
245
  def gmd_values
242
- # 'computer file' is an old one that may still be found in data.
243
- return ['activity card',
246
+ # 'computer file' is an old one that may still be found in data.
247
+ return ['activity card',
244
248
  'art original','art reproduction','braille','chart','diorama','electronic resource','computer file', 'filmstrip','flash card','game','globe','kit','manuscript','map','microform','microscope slides','model','motion picture','music','picture','realia','slide','sound recording','technical drawing','text','toy','transparency','videorecording']
245
249
  end
246
250
 
247
251
  # removes something that looks like an AACR2 GMD in square brackets from
248
- # the string. Pretty kludgey.
252
+ # the string. Pretty kludgey.
249
253
  def strip_gmd(arg_string, options = {})
250
254
  options[:replacement] ||= ':'
251
-
255
+
252
256
  gmd_values.each do |gmd_val|
253
257
  arg_string = arg_string.sub(/\[#{gmd_val}( \((tactile|braile|large print)\))?\]/, options[:replacement])
254
258
  end
255
259
  return arg_string
256
260
  end
257
261
 
258
-
262
+
259
263
  end
@@ -25,14 +25,14 @@ class DissertationCatch < ReferentFilter
25
25
 
26
26
 
27
27
 
28
- # input: ropenurl ContextObject
28
+ # input: Umlaut Referent object
29
29
  # Is this a citation to a Dissertation Abstracts
30
30
  # issn, or do we otherwise think it's a dissertation citation? Then change
31
31
  # it to a dissertation citation.
32
32
  def filter(referent)
33
33
  issn = get_identifier(:urn, "issn", referent)
34
-
35
34
  return unless issn
35
+
36
36
 
37
37
  # normalize removing hyphen
38
38
  issn.gsub!('-', '')
@@ -43,10 +43,16 @@ class DissertationCatch < ReferentFilter
43
43
  referent.enhance_referent("genre", "dissertation")
44
44
 
45
45
  metadata = referent.metadata
46
+
46
47
  # Reset it's title to the dissertation title
47
- title = metadata['atitle'] || metadata['title']
48
- referent.enhance_referent("btitle", title)
49
- referent.enhance_referent("title", title, true, false, :overwrite => true)
48
+ title = if metadata['atitle'].present?
49
+ metadata['atitle']
50
+ elsif metadata['title'].present?
51
+ metadata['title']
52
+ end
53
+ referent.enhance_referent("btitle", title) if title.present?
54
+ referent.enhance_referent("title", title, true, false, :overwrite => true) if title.present?
55
+
50
56
  # Now erase titles that do not apply
51
57
  referent.remove_value("atitle")
52
58
  referent.remove_value("jtitle")
@@ -1,25 +1,27 @@
1
- <%-
1
+ <%-
2
2
  # Include this partial to put the background updater device on your page.
3
3
  # This actually just sets up the Umlaut JQuery background updater, for
4
- # unobtrusive adding of background html content to menu page.
5
- -%><%
6
- # only include if we have any background services. We could check to make
4
+ # unobtrusive adding of background html content to menu page.
5
+
6
+ # Only include if we have any background services. We could check to make
7
7
  # sure we only have background services we care about, but it's more work--
8
8
  # the updater will only run ONCE at most wrongly, then the
9
- # background_update action will stop it.
10
- if (any_services_in_progress?) %>
9
+ # background_update action will stop it.
10
+ -%>
11
+ <% if (any_services_in_progress?) %>
11
12
  <script type="text/javascript">
12
13
  //<![CDATA[
13
- jQuery(document).ready(function($) {
14
- var updater = new Umlaut.HtmlUpdater("<%= root_url %>", "umlaut.request_id=<%= @user_request.id %>");<%
15
- bg_update_sections.collect do |section| %>
16
- updater.add_section_target({ umlaut_section_id: "<%= section[:div_id] %>" });<%
17
- end
18
- # Wait the designated number of seconds before kicking off the first bg
19
- # update request. Future requests will be automatically made with delay.
20
- %>
21
- setTimeout(function() { updater.update(); }, <%= umlaut_config.lookup!("initial_poll_wait_seconds", 4)*1000 %>);
14
+ jQuery(document).ready(function ($) {
15
+ var updater = new Umlaut.HtmlUpdater("<%= root_url %>", "umlaut.request_id=<%= user_request.id %>");
16
+ <% bg_update_sections.collect do |section| %>
17
+ updater.add_section_target({ umlaut_section_id: "<%= section[:div_id] %>" });
18
+ <% end %>
19
+ <%-
20
+ # Wait the designated number of seconds before kicking off the first bg
21
+ # update request. Future requests will be automatically made with delay.
22
+ -%>
23
+ setTimeout(function () { updater.update(); }, <%= umlaut_config.lookup!("initial_poll_wait_seconds", 4)*1000 %>);
22
24
  });
23
25
  //]]>
24
- </script><%
25
- end %>
26
+ </script>
27
+ <% end %>
@@ -1,49 +1,40 @@
1
1
  <%
2
- cite = @user_request.referent.to_citation
2
+ # Get the citation from the user request
3
+ cite = user_request.referent.to_citation
4
+ # Set the page title to the citation's title
3
5
  @page_title = cite[:title] %>
4
-
5
- <% if @user_request.referent.type_of_thing.present? %>
6
- <p class="resource-type"><%=@user_request.referent.type_of_thing.titlecase %></p>
6
+ <% if user_request.referent.type_of_thing.present? %>
7
+ <p class="resource-type"><%= user_request.referent.type_of_thing.titlecase %></p>
7
8
  <% end %>
8
-
9
9
  <h2 class="title"><%= cite[:title] %></h2>
10
-
11
10
  <% if cite[:author].present? || cite[:date].present? %>
12
11
  <p class="author-and-date">
13
12
  <% if cite[:author].present? %>
14
13
  <span class="author"><%= cite[:author] %></span>
15
14
  <% end %>
16
-
17
15
  <% if cite[:author].present? && cite[:date].present? %>
18
16
  <span class="sep">•</span>
19
17
  <% end %>
20
-
21
18
  <% if cite[:date].present? %>
22
19
  <span class="date"><%= date_format(cite[:date]) %></span>
23
20
  <% end %>
24
21
  </p>
25
22
  <% end %>
26
-
27
23
  <p class="published_in">
28
24
  <% if [:container_title, :volume, :issue, :page].find {|k| cite[k].present? } %>
29
-
30
- <span class="published-label">Published in <%= cite[:container_label] %></span> <span class="container-title">
31
- <%= cite[:container_title] %></span>.
25
+ <span class="published-label">Published in <%= cite[:container_label] %></span>
26
+ <span class="container-title"><%= cite[:container_title] %></span>.
32
27
  <% end %>
33
-
34
28
  <% if cite[:volume].present? %>
35
- <span class="volume">Volume <%= cite[:volume] %></span>.
29
+ <span class="volume">Volume <%= cite[:volume] %></span>.
36
30
  <% end %>
37
-
38
31
  <% if cite[:issue].present? %>
39
- <span class="issue">Issue <%= cite[:issue] %></span>.
32
+ <span class="issue">Issue <%= cite[:issue] %></span>.
40
33
  <% end %>
41
-
42
34
  <% if cite[:page].present? %>
43
- <span class="page">Page <%= cite[:page] %></span>.
35
+ <span class="page">Page <%= cite[:page] %></span>.
44
36
  <% end %>
45
37
  </p>
46
-
47
38
  <dl class="citation-info">
48
39
  <%= if cite[:pub].present?
49
40
  content_tag(:dt, "Publisher:", :class => "publisher") +
@@ -57,7 +48,5 @@ cite = @user_request.referent.to_citation
57
48
  content_tag(:dt, "ISBN:", :class => "isbn") +
58
49
  content_tag(:dd, cite[:isbn], :class => "isbn")
59
50
  end %>
60
-
61
51
  <%# todo, doi %>
62
-
63
- </dl>
52
+ </dl>
@@ -1,32 +1,34 @@
1
1
  <%
2
2
  all_responses = fulltext
3
- (title_level_fulltxt, fulltxt) =
4
- all_responses.partition {|i| i.view_data[:coverage_checked] == false || i.view_data[:can_link_to_article] == false}
3
+ (title_level_fulltxt, fulltxt) = all_responses.partition do |i|
4
+ i.view_data[:coverage_checked] == false || i.view_data[:can_link_to_article] == false
5
+ end
5
6
  # order em with full fulltxt before title_level_fulltxt
6
- all_responses = fulltxt + title_level_fulltxt %>
7
+ all_responses = fulltxt + title_level_fulltxt
8
+ %>
7
9
  <div class="<%= section_css_classes(@user_request, "fulltext", all_responses).join(" ") %>">
8
-
9
- <%= render :partial => 'section_heading', :locals => {:presenter => renderer, :force_render => true} %>
10
-
11
- <div class="umlaut_section_content"><%=
12
- list_with_limit('umlaut_fulltext', all_responses,
13
- :ul_class => "response_list", :limit => renderer.list_visible_limit ) do |item, index | %><%
14
- # Display special warnign header if it's title-level only,
15
- # and it's an article or issue level link. Are we
16
- # at the beginning of title level display?
17
- if (index == fulltxt.length && !title_level_request?) %>
10
+ <%= render 'section_heading', :presenter => renderer, :force_render => true %>
11
+ <div class="umlaut_section_content">
12
+ <%= list_with_limit('umlaut_fulltext', all_responses,
13
+ :ul_class => "response_list", :limit => renderer.list_visible_limit ) do |item, index | %>
14
+ <%-
15
+ # Display special warning header if it's title-level only,
16
+ # and it's an article or issue level link. Are we
17
+ # at the beginning of title level display?
18
+ -%>
19
+ <% if (index == fulltxt.length && !title_level_request?) %>
18
20
  </ul>
19
21
  <div class="section-subheading title-level-link-warning">
20
22
  <h4><%= (@user_request.referent.container_type_of_thing || "Container").titlecase %>-level Page Only</h4>
21
23
  <p><span class="notice">Can not link directly to citation. Dates or extent of coverage may be unknown.</span></p>
22
24
  </div>
23
- <ul class="response_list"><%
24
- end %>
25
- <%= render(:partial => "standard_response_item", :object=> item) %><%
26
- end
27
- if (fulltxt.empty? && title_level_fulltxt.empty? && !service_type_in_progress?('fulltext')) %>
28
- <p class="umlaut-unavailable umlaut-content-indent">Not Available</p><%
29
- end %>
30
- <%= render( renderer.spinner_render_hash) if renderer.services_in_progress? %>
25
+ <ul class="response_list">
26
+ <% end %>
27
+ <%= render :partial => "standard_response_item", :object => item %>
28
+ <% end %>
29
+ <% if (fulltxt.empty? && title_level_fulltxt.empty? && !service_type_in_progress?('fulltext')) %>
30
+ <p class="umlaut-unavailable umlaut-content-indent">Not Available</p>
31
+ <% end %>
32
+ <%= render renderer.spinner_render_hash if renderer.services_in_progress? %>
31
33
  </div>
32
34
  </div>
@@ -1,20 +1,13 @@
1
- <div class="help-text-icon">?</div>
2
-
3
- <div class="section_heading">
4
- <h3>
5
- Question? Problem? Contact:
6
- </h3>
7
- </div>
8
-
9
- <ul class="response_list umlaut-help-list">
10
- <% help.each do |help|
11
- value_hash = help.view_data %>
12
- <li><%= link_to value_hash[:display_text], {:controller=>'link_router', :id=>help.id}, 'target'=>"_blank" %>
13
- <% unless value_hash[:note].blank? %>
14
- <br />
15
- <%= value_hash[:note] %>
16
- <% end %>
17
- </li>
18
- <% end %>
19
- </ul>
20
-
1
+ <div class="help-text-icon">?</div>
2
+ <%= render 'section_heading', :presenter => renderer, :force_render => true %>
3
+ <ul class="response_list umlaut-help-list">
4
+ <% help.each do |help|
5
+ value_hash = help.view_data %>
6
+ <li><%= link_to value_hash[:display_text], {:controller=>'link_router', :id=>help.id}, 'target'=>"_blank" %>
7
+ <% unless value_hash[:note].blank? %>
8
+ <br />
9
+ <%= value_hash[:note] %>
10
+ <% end %>
11
+ </li>
12
+ <% end %>
13
+ </ul>
@@ -3,5 +3,5 @@
3
3
  # SFX recognized it as an actually existing journal. If not, then it
4
4
  # might be a typo. If it came from a manually entered citation, warn them.
5
5
  content_tag(:div, content_tag(:i, "", :class => "umlaut_icons-famfamfam-error") +
6
- " Warning: #{umlaut_config.app_name} does not know about a #{@user_request.referent.format.downcase} with this name. Please check your entry.",
7
- :class=>"alert alert-error") if display_not_found_warning?(@user_request) %>
6
+ " Warning: #{umlaut_config.app_name} does not know about a #{user_request.referent.format.downcase} with this name. Please check your entry.",
7
+ :class=>"alert alert-error") if display_not_found_warning?(user_request) %>
@@ -16,4 +16,4 @@
16
16
  <span class="content"></span>
17
17
  <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
18
18
  </div>
19
- </div>
19
+ </div>
@@ -12,7 +12,7 @@
12
12
  <div class="umlaut_section_content">
13
13
  <%= content_tag("form", :target => "_blank", :action => url_for(:controller=>'link_router', :action=>'index')) do %>
14
14
 
15
- <div class="source input-prepend input-append">
15
+ <div class="search-inside-source input-prepend input-append">
16
16
  <span class="add-on"> via </span>
17
17
 
18
18
  <% if search_providers.length > 1 %>
@@ -24,7 +24,7 @@
24
24
  <% end %>
25
25
 
26
26
  </div>
27
- <div class="source input-append">
27
+ <div class="search-inside-query input-append">
28
28
  <input name="query" type="text" />
29
29
  <input value="search" type="submit" class="btn add-on">
30
30
  </div>
@@ -1,37 +1,35 @@
1
- <%
1
+ <%-
2
2
  # You generally shoudln't call this partial directly, it's called through
3
3
  # the render_section helper method in resolve_helper.rb
4
- if presenter.visible?
5
- unless presenter.show_partial_only? %>
4
+ -%>
5
+ <% if presenter.visible? %>
6
+ <% unless presenter.show_partial_only? %>
6
7
  <div class="<%= section_css_classes(@user_request, presenter.div_id, []).join(" ") %>">
7
- <% end %>
8
-
9
- <%= render :partial => 'section_heading', :locals => {:presenter => presenter} %>
10
-
11
- <% unless presenter.show_partial_only? %>
12
- <div class="umlaut_section_content"><%
13
- end
14
- if presenter.custom_partial? %><%=
15
- render(presenter.content_render_hash) %><%
16
- elsif presenter.list_visible_limit %><%=
17
- list_with_limit("#{presenter.div_id}_list_with_limit", presenter.responses_list,
18
- :limit => presenter.list_visible_limit, :ul_class => "response_list #{presenter.div_id}") do |item, index| %><%=
19
- render(presenter.item_render_hash(item)) %><%
20
- end
21
- elsif presenter.responses_list.length == 0 && ! presenter.services_in_progress?%>
8
+ <% end %>
9
+ <%= render 'section_heading', :presenter => presenter %>
10
+ <% unless presenter.show_partial_only? %>
11
+ <div class="umlaut_section_content">
12
+ <% end %>
13
+ <% if presenter.custom_partial? %>
14
+ <%= render presenter.content_render_hash %>
15
+ <% elsif presenter.list_visible_limit %>
16
+ <%= list_with_limit("#{presenter.div_id}_list_with_limit", presenter.responses_list,
17
+ :limit => presenter.list_visible_limit, :ul_class => "response_list #{presenter.div_id}") do |item, index|
18
+ render presenter.item_render_hash(item)
19
+ end %>
20
+ <% elsif presenter.responses_list.length == 0 && ! presenter.services_in_progress? %>
22
21
  <ul class="response_list">
23
22
  <li>None available.</li>
24
- </ul><%
25
- else %>
26
- <ul class="response_list <%= presenter.div_id %>"><%=
27
- render( presenter.content_render_hash ) %>
28
- </ul><%
29
- end
30
- if presenter.show_spinner? %><%=
31
- render(presenter.spinner_render_hash) %><%
32
- end
33
- unless presenter.show_partial_only? %>
34
- </div>
35
- </div><%
36
- end
37
- end %>
23
+ </ul>
24
+ <% else %>
25
+ <ul class="response_list <%= presenter.div_id %>">
26
+ <%= render presenter.content_render_hash %>
27
+ </ul>
28
+ <% end %>
29
+ <% if presenter.show_spinner? %>
30
+ <%= render presenter.spinner_render_hash %>
31
+ <% end %>
32
+ <% unless presenter.show_partial_only? %>
33
+ </div></div>
34
+ <% end %>
35
+ <% end %>
@@ -1,17 +1,14 @@
1
- <%# requires local :presenter with a SectionRenderer
2
- optional local :force_render=> true to ignore presentation logic. legacy. %>
3
-
4
- <% if presenter.show_heading? || local_assigns[:force_render] == true %>
5
-
6
- <div class="section_heading">
7
- <% if presenter.section_title %>
8
- <h3><%= presenter.section_title %></h3>
9
- <% if presenter.section_prompt %>
10
- <p class="section_prompt">
11
- <%= presenter.section_prompt %>
12
- </p>
13
- <% end %>
14
- <% end %>
15
- </div>
16
-
17
- <% end %>
1
+ <%# requires local :presenter with a SectionRenderer
2
+ optional local :force_render=> true to ignore presentation logic. legacy. %>
3
+ <% if presenter.show_heading? || local_assigns[:force_render] == true %>
4
+ <div class="section_heading">
5
+ <% if presenter.section_title %>
6
+ <h3><%= presenter.section_title %></h3>
7
+ <% if presenter.section_prompt %>
8
+ <p class="section_prompt">
9
+ <%= presenter.section_prompt %>
10
+ </p>
11
+ <% end %>
12
+ <% end %>
13
+ </div>
14
+ <% end %>
@@ -1,27 +1,21 @@
1
- <%= render :partial=>'background_updater' %>
1
+ <%= render 'background_updater', :user_request => @user_request %>
2
2
  <div class="row-fluid">
3
-
4
3
  <div class="span8 umlaut-main">
5
-
6
4
  <div class="umlaut-resource-info">
7
- <div class="resource_info_sections">
8
- <%= render :partial=> "manually_entered_warning" %>
9
-
10
- <%= render :partial=>'citation' %>
11
- <% html_sections(:resource_info).each do |section| %>
12
- <%= content_tag "div", :id => section[:div_id] do %>
13
- <%= render_section(section) %>
14
- <% end %>
15
- <% end %>
16
- </div>
17
-
18
- <%# need a div here for ajax bg loader to put bg loaded cover into %>
19
- <div id="cover_image">
20
- <%= render_section(html_section_by_div_id("cover_image")) %>
21
- </div>
22
-
5
+ <div class="resource_info_sections">
6
+ <%= render 'manually_entered_warning', :user_request => @user_request %>
7
+ <%= render 'citation', :user_request => @user_request %>
8
+ <% html_sections(:resource_info).each do |section| %>
9
+ <%= content_tag "div", :id => section[:div_id] do %>
10
+ <%= render_section(section) %>
11
+ <% end %>
12
+ <% end %>
13
+ </div>
14
+ <%# need a div here for ajax bg loader to put bg loaded cover into %>
15
+ <div id="cover_image">
16
+ <%= render_section(html_section_by_div_id("cover_image")) %>
17
+ </div>
23
18
  </div>
24
-
25
19
  <div class="main_response_list">
26
20
  <% html_sections(:main).each do |section| %>
27
21
  <%= content_tag "div", :id => section[:div_id] do %>
@@ -29,8 +23,7 @@
29
23
  <% end %>
30
24
  <% end %>
31
25
  </div>
32
- </div>
33
-
26
+ </div>
34
27
  <div class="span4 umlaut-sidebar">
35
28
  <% html_sections(:sidebar).each do |section| %>
36
29
  <%= content_tag "div", :id => section[:div_id] do %>
@@ -43,5 +36,5 @@
43
36
  <% end %>
44
37
  </div>
45
38
  </div>
46
- <%= render :partial=>"modal" %>
47
- </div>
39
+ <%= render 'modal' %>
40
+ </div>
@@ -1,3 +1,3 @@
1
1
  module Umlaut
2
- VERSION = "3.1.1"
2
+ VERSION = "3.2.0"
3
3
  end
@@ -487,3 +487,36 @@ coffeemakers5:
487
487
  normalized_value: "25"
488
488
  metadata: true
489
489
  private_data: false
490
+
491
+ manually_entered1:
492
+ referent: manually_entered
493
+ normalized_value: ""
494
+ key_name: object_id
495
+ metadata: true
496
+ value: ""
497
+ private_data: false
498
+
499
+ manually_entered2:
500
+ referent: manually_entered
501
+ normalized_value: journal
502
+ key_name: format
503
+ metadata: false
504
+ value: journal
505
+ private_data: false
506
+
507
+ manually_entered3:
508
+ referent: manually_entered
509
+ key_name: genre
510
+ value: article
511
+ normalized_value: article
512
+ metadata: true
513
+ private_data: false
514
+
515
+ manually_entered4:
516
+ referent: manually_entered
517
+ normalized_value: entry manual
518
+ key_name: jtitle
519
+ metadata: true
520
+ value: Entry Manual
521
+ private_data: false
522
+
@@ -32,3 +32,6 @@ coffeemakers:
32
32
  issn: 0265-8135
33
33
  year: 1998
34
34
  volume: 25
35
+
36
+ manually_entered:
37
+ title: Entry Manual
@@ -40,3 +40,7 @@ advocate:
40
40
 
41
41
  coffeemakers:
42
42
  referent: coffeemakers
43
+
44
+ manually_entered:
45
+ referent: manually_entered
46
+ referrer_id: info:sid/sfxit.com:citation
@@ -167,3 +167,15 @@ service_response10:
167
167
  :citation_issue:
168
168
  :citation_spage:
169
169
  :debug_info: ! ' Target: GALEGROUP_IT_NEWSSTAND ; SFX object ID: 2670000000017711'
170
+
171
+ service_response11:
172
+ service_id: SFX
173
+ display_text: Ask a Librarian
174
+ url: "http://library.edu/ask"
175
+ notes:
176
+ request: nytimes
177
+ service_type_value_name: help
178
+ service_data: |
179
+ ---
180
+ :display_text: Ask a Librarian
181
+ :url: http://library.edu/ask
@@ -7,19 +7,28 @@ require 'rack/utils'
7
7
  class ResolveControllerTest < ActionController::TestCase
8
8
  extend TestWithCassette
9
9
  fixtures :requests, :referents, :referent_values, :dispatched_services, :service_responses
10
-
10
+
11
11
  setup do
12
12
  @controller = ResolveController.new
13
13
  end
14
-
14
+
15
15
  test_with_cassette("nytimes by issn", :resolve, :match_requests_on => [:method, :uri_without_ctx_tim]) do
16
16
  umlaut_request = requests(:nytimes)
17
17
  get :index, "umlaut.request_id" => umlaut_request.id
18
18
  assert_response :success
19
19
  assert_select "title", "Find It | The New York times"
20
20
  assert_select "h1", "Find It"
21
+ # Resource title assertion
21
22
  assert_select "h2.title", "The New York times"
22
-
23
+ # Background updater assertions
24
+ assert_select ".umlaut-resolve-container > script" do |scripts|
25
+ assert_equal 1, scripts.size
26
+ # Make sure we have an HtmlUpdater in our script
27
+ scripts.each do |script|
28
+ assert_match /var updater = new Umlaut.HtmlUpdater\("http:\/\/test\.host\/", "umlaut\.request_id=#{umlaut_request.id}"\);/, script.to_s
29
+ end
30
+ end
31
+ # Citation section assertions
23
32
  assert_select ".umlaut-main .umlaut-resource-info dl.citation-info" do |dls|
24
33
  assert_equal 1, dls.size
25
34
  dls.each do |dl|
@@ -33,16 +42,18 @@ class ResolveControllerTest < ActionController::TestCase
33
42
  end
34
43
  end
35
44
  end
36
- # puts @response.body
45
+ # Fulltext section assertions
37
46
  assert_select ".umlaut-main .umlaut-section.fulltext" do |sections|
38
47
  assert_equal 1, sections.size
39
48
  sections.each do |section|
40
49
  assert_select section, ".response_list", 1
41
50
  assert_select section, ".response_list" do |response_lists|
51
+ assert_select section, ".section_heading h3", { :count => 1, :text => "Online Access" }
42
52
  assert_select section, "li.response_item", 4
43
53
  end
44
54
  end
45
55
  end
56
+ # Holding section assertions
46
57
  assert_select ".umlaut-main .umlaut-section.holding" do |sections|
47
58
  assert_equal 1, sections.size
48
59
  sections.each do |section|
@@ -62,18 +73,39 @@ class ResolveControllerTest < ActionController::TestCase
62
73
  end
63
74
  end
64
75
  end
76
+ # Export citation section assertions
65
77
  assert_select ".umlaut-sidebar .umlaut-section.export_citation" do |sections|
66
78
  assert_equal 1, sections.size
67
79
  sections.each do |section|
80
+ assert_select section, ".section_heading h3", { :count => 1, :text => "Export tool" }
68
81
  assert_select section, ".response_list", 1
69
82
  end
70
83
  end
84
+ # Highlighted link section assertions
71
85
  assert_select ".umlaut-sidebar .umlaut-section.highlighted_link" do |sections|
72
86
  assert_equal 1, sections.size
73
87
  sections.each do |section|
88
+ assert_select section, ".section_heading h3", { :count => 1, :text => "See also" }
89
+ assert_select section, ".response_list", 1
90
+ end
91
+ end
92
+ # Help section assertions
93
+ assert_select ".umlaut-sidebar .umlaut-section.help" do |sections|
94
+ assert_equal 1, sections.size
95
+ sections.each do |section|
96
+ assert_select section, ".section_heading h3", { :count => 1, :text => "Question? Problem? Contact:" }
74
97
  assert_select section, ".response_list", 1
75
98
  end
76
99
  end
100
+ # Modal assertions
101
+ assert_select ".modal" do |modals|
102
+ assert_equal 1, modals.size
103
+ modals.each do |modal|
104
+ assert_select modal, ".modal-header", { :count => 1 }
105
+ assert_select modal, ".modal-body", { :count => 1 }
106
+ assert_select modal, ".modal-footer", { :count => 1 }
107
+ end
108
+ end
77
109
  end
78
110
 
79
111
  test_with_cassette("POSTed OpenURL redirects to GET", :resolve, :match_requests_on => [:method, :uri_without_ctx_tim]) do
@@ -85,10 +117,10 @@ class ResolveControllerTest < ActionController::TestCase
85
117
 
86
118
  redirect_uri = URI.parse(@response.redirect_url)
87
119
 
88
- assert_equal "/resolve", redirect_uri.path
120
+ assert_equal "/resolve", redirect_uri.path
89
121
 
90
122
  # Redirected params is a subset of pparams, pparams can have extra
91
- # stuff maybe, we don't care.
123
+ # stuff maybe, we don't care.
92
124
  redirected_params = Rack::Utils.parse_nested_query redirect_uri.query
93
125
  assert (redirected_params.to_a - pparams.to_a).empty?, "Redirected params include all of original POSTed params"
94
126
  end
@@ -109,7 +141,7 @@ class ResolveControllerTest < ActionController::TestCase
109
141
 
110
142
  test_with_cassette("no holdings", :resolve, :match_requests_on => [:method, :uri_without_ctx_tim]) do
111
143
  umlaut_request = requests(:advocate)
112
- get(:index, {'umlaut.request_id' => umlaut_request.id, "umlaut.institution" => "NYU"})
144
+ get(:index, {'umlaut.request_id' => umlaut_request.id})
113
145
  assert_response :success
114
146
  assert_select 'div#fulltext ul.response_list li.response_item' do |elements|
115
147
  assert_equal(1, elements.size)
@@ -121,4 +153,17 @@ class ResolveControllerTest < ActionController::TestCase
121
153
  # Assert no holdings
122
154
  assert_select 'div#holding div.umlaut-holdings', :count => 0
123
155
  end
124
- end
156
+
157
+ test_with_cassette("manually entered", :resolve, :match_requests_on => [:method, :uri_without_ctx_tim]) do
158
+ umlaut_request = requests(:manually_entered)
159
+ get(:index, {'umlaut.request_id' => umlaut_request.id})
160
+ assert_response :success
161
+ assert_select('.resource_info_sections > div.alert.alert-error',
162
+ {:text => "Warning: Find It does not know about a journal with this name. Please check your entry."}) do |error_divs|
163
+ assert_equal 1, error_divs.size, "More than one error div"
164
+ error_divs.each do |error_div|
165
+ assert_select error_div, 'i.umlaut_icons-famfamfam-error', 1
166
+ end
167
+ end
168
+ end
169
+ end
@@ -0,0 +1,22 @@
1
+ require 'test_helper'
2
+
3
+ require 'referent'
4
+ require 'dissertation_catch'
5
+
6
+
7
+ class DissertationCatchTest < ActiveSupport::TestCase
8
+ # this was a regression
9
+ def test_blank_atitle
10
+ context_object = OpenURL::ContextObject.new_from_kev("atitle=&title=Between+Us+and+Artistic+Appreciation%3a+Nabokov+and+the+Problem+of+Distortion&issn=04194209")
11
+
12
+ # Not sure how we get a blank atitle in there, but we want DissertationCatch to handle it
13
+ referent = Referent.new
14
+ referent.set_values_from_context_object(context_object)
15
+ referent.ensure_value!("atitle", "")
16
+ referent.referent_values(true) # reload
17
+
18
+ DissertationCatch.new.filter(referent)
19
+
20
+ assert_equal "Between Us and Artistic Appreciation: Nabokov and the Problem of Distortion", referent.metadata['title']
21
+ end
22
+ end
@@ -0,0 +1,84 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: http://worldcat.org/identities/search/PersonalIdentities?maximumRecords=1&query=local.Name%20all%20%22Michael%20Ende%22&sortKeys=holdingscount
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept:
11
+ - text/xml
12
+ User-Agent:
13
+ - Ruby
14
+ response:
15
+ status:
16
+ code: 200
17
+ message: OK
18
+ headers:
19
+ Date:
20
+ - Thu, 09 Jan 2014 15:32:33 GMT
21
+ Server:
22
+ - Apache
23
+ Content-Length:
24
+ - '1582'
25
+ Content-Type:
26
+ - text/xml
27
+ body:
28
+ encoding: US-ASCII
29
+ string: ! "<?xml version=\"1.0\" encoding=\"UTF-8\"?> \n<?xml-stylesheet type=\"text/xsl\"
30
+ href=\"/identities/NameFinderResponse.xsl\"?>\n<searchRetrieveResponse xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
31
+ xsi:schemaLocation=\"http://www.loc.gov/zing/srw/ http://www.loc.gov/standards/sru/sru1-1archive/xml-files/srw-types.xsd\"
32
+ xmlns=\"http://www.loc.gov/zing/srw/\"><version xsi:type=\"xsd:string\">1.1</version><numberOfRecords
33
+ xsi:type=\"xsd:nonNegativeInteger\">0</numberOfRecords><echoedSearchRetrieveRequest
34
+ xsi:type=\"ns1:echoedSearchRetrieveRequestType\" xmlns:ns1=\"http://www.loc.gov/zing/srw/\"><version
35
+ xsi:type=\"xsd:string\">1.1</version><query xsi:type=\"xsd:string\">local.Name
36
+ all &quot;Michael Ende&quot;</query><xQuery><ns2:searchClause xsi:type=\"ns2:searchClauseType\"
37
+ xmlns:ns2=\"http://www.loc.gov/zing/cql/xcql/\"><ns2:index xsi:type=\"xsd:string\">local.Name</ns2:index><ns2:relation
38
+ xsi:type=\"ns2:relationType\"><ns2:value xsi:type=\"xsd:string\">all</ns2:value></ns2:relation><ns2:term
39
+ xsi:type=\"xsd:string\">Michael Ende</ns2:term></ns2:searchClause></xQuery><maximumRecords
40
+ xsi:type=\"xsd:nonNegativeInteger\">1</maximumRecords><recordSchema xsi:type=\"xsd:string\">default</recordSchema><sortKeys
41
+ xsi:type=\"xsd:string\">holdingscount</sortKeys></echoedSearchRetrieveRequest><extraResponseData
42
+ xsi:type=\"ns3:extraDataType\" xmlns:ns3=\"http://www.loc.gov/zing/srw/\"><ns4:extraData
43
+ xmlns=\"http://oclc.org/srw/extraData\" xmlns:ns4=\"http://oclc.org/srw/extraData\"><ns4:databaseTitle>WorldCat
44
+ Personal Identity Records</ns4:databaseTitle></ns4:extraData></extraResponseData></searchRetrieveResponse>"
45
+ http_version:
46
+ recorded_at: Thu, 09 Jan 2014 15:32:33 GMT
47
+ - request:
48
+ method: get
49
+ uri: http://catalog.hathitrust.org/api/volumes/brief/json/isbn:038519093X
50
+ body:
51
+ encoding: US-ASCII
52
+ string: ''
53
+ headers:
54
+ Accept:
55
+ - ! '*/*'
56
+ User-Agent:
57
+ - Ruby
58
+ response:
59
+ status:
60
+ code: 200
61
+ message: OK
62
+ headers:
63
+ Date:
64
+ - Thu, 09 Jan 2014 15:32:33 GMT
65
+ Server:
66
+ - Apache/2.2.22 (Debian) mod_fastcgi/mod_fastcgi-SNAP-0910052141 PHP/5.4.4-14+deb7u5
67
+ X-Powered-By:
68
+ - PHP/5.4.4-14+deb7u5
69
+ Content-Length:
70
+ - '495'
71
+ Content-Type:
72
+ - application/json; charset=UTF-8
73
+ Set-Cookie:
74
+ - NSC_mchspvq-iu=ffffffff854c63df45525d5f4f58455e445a4a423660;expires=Thu, 09-Jan-2014
75
+ 15:42:33 GMT;path=/;httponly
76
+ body:
77
+ encoding: US-ASCII
78
+ string: ! '{"isbn:038519093X":{"records":{"000346062":{"recordURL":"http:\/\/catalog.hathitrust.org\/Record\/000346062","titles":["Momo
79
+ \/"],"isbns":["9780385190930"],"issns":[],"oclcs":["10779071"],"lccns":["84010157"],"publishDates":["1985"]}},"items":[{"orig":"University
80
+ of Michigan","fromRecord":"000346062","htid":"mdp.39015054080638","itemURL":"http:\/\/hdl.handle.net\/2027\/mdp.39015054080638","rightsCode":"ic","lastUpdate":"20130802","enumcron":false,"usRightsString":"Limited
81
+ (search-only)"}]}}'
82
+ http_version:
83
+ recorded_at: Thu, 09 Jan 2014 15:32:33 GMT
84
+ recorded_with: VCR 2.5.0
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: umlaut
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.1
4
+ version: 3.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-10-14 00:00:00.000000000 Z
12
+ date: 2014-02-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -672,6 +672,7 @@ files:
672
672
  - ./test/unit/bx_test.rb
673
673
  - ./test/unit/collection_test.rb
674
674
  - ./test/unit/determine_services_test.rb
675
+ - ./test/unit/dissertation_catch_test.rb
675
676
  - ./test/unit/google_book_search_test.rb
676
677
  - ./test/unit/google_scholar_link_test.rb
677
678
  - ./test/unit/internet_archive_test.rb
@@ -689,6 +690,7 @@ files:
689
690
  - ./test/vcr_cassettes/google_book_search/frankenstein_by_OCLC_number.yml
690
691
  - ./test/vcr_cassettes/internet_archive/momo_by_title_author.yml
691
692
  - ./test/vcr_cassettes/resolve/fulltext_with_edition_warning.yml
693
+ - ./test/vcr_cassettes/resolve/manually_entered.yml
692
694
  - ./test/vcr_cassettes/resolve/no_holdings.yml
693
695
  - ./test/vcr_cassettes/resolve/nytimes_by_issn.yml
694
696
  - ./test/vcr_cassettes/sfx/nytimes_by_issn.yml
@@ -711,7 +713,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
711
713
  version: '0'
712
714
  segments:
713
715
  - 0
714
- hash: 337207309997432952
716
+ hash: -3449280870636764014
715
717
  required_rubygems_version: !ruby/object:Gem::Requirement
716
718
  none: false
717
719
  requirements:
@@ -720,7 +722,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
720
722
  version: '0'
721
723
  segments:
722
724
  - 0
723
- hash: 337207309997432952
725
+ hash: -3449280870636764014
724
726
  requirements: []
725
727
  rubyforge_project:
726
728
  rubygems_version: 1.8.23
@@ -891,6 +893,7 @@ test_files:
891
893
  - ./test/unit/bx_test.rb
892
894
  - ./test/unit/collection_test.rb
893
895
  - ./test/unit/determine_services_test.rb
896
+ - ./test/unit/dissertation_catch_test.rb
894
897
  - ./test/unit/google_book_search_test.rb
895
898
  - ./test/unit/google_scholar_link_test.rb
896
899
  - ./test/unit/internet_archive_test.rb
@@ -908,6 +911,7 @@ test_files:
908
911
  - ./test/vcr_cassettes/google_book_search/frankenstein_by_OCLC_number.yml
909
912
  - ./test/vcr_cassettes/internet_archive/momo_by_title_author.yml
910
913
  - ./test/vcr_cassettes/resolve/fulltext_with_edition_warning.yml
914
+ - ./test/vcr_cassettes/resolve/manually_entered.yml
911
915
  - ./test/vcr_cassettes/resolve/no_holdings.yml
912
916
  - ./test/vcr_cassettes/resolve/nytimes_by_issn.yml
913
917
  - ./test/vcr_cassettes/sfx/nytimes_by_issn.yml