umlaut 3.3.1 → 4.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (555) hide show
  1. data/README.md +13 -12
  2. data/active_record_patch/connection_pool.rb +41 -449
  3. data/app/assets/javascripts/bootstrap3-typeahead.js +415 -0
  4. data/app/assets/javascripts/umlaut.js +8 -4
  5. data/app/assets/javascripts/umlaut/ajax_windows.js +15 -21
  6. data/app/assets/javascripts/umlaut/search_autocomplete.js +95 -90
  7. data/app/assets/javascripts/umlaut/update_html.js +12 -4
  8. data/app/assets/stylesheets/umlaut.css.scss +2 -4
  9. data/app/assets/stylesheets/umlaut/_az.scss +6 -6
  10. data/app/assets/stylesheets/umlaut/_forms.scss +21 -15
  11. data/app/assets/stylesheets/umlaut/_layout.scss +4 -5
  12. data/app/assets/stylesheets/umlaut/_misc.scss +12 -9
  13. data/app/assets/stylesheets/umlaut/_mixins.scss +2 -3
  14. data/app/assets/stylesheets/umlaut/_resolve.scss +45 -24
  15. data/app/assets/stylesheets/umlaut/_results.scss +7 -7
  16. data/app/assets/stylesheets/umlaut/_search.scss +16 -5
  17. data/app/assets/stylesheets/umlaut/_spinner.scss +1 -1
  18. data/app/assets/stylesheets/umlaut/_variables.scss +2 -2
  19. data/app/controllers/export_email_controller.rb +11 -4
  20. data/app/controllers/resolve_controller.rb +14 -30
  21. data/app/controllers/search_controller.rb +3 -8
  22. data/app/controllers/umlaut/controller_behavior.rb +30 -1
  23. data/app/controllers/umlaut/error_handling.rb +1 -1
  24. data/app/controllers/umlaut_configurable.rb +13 -10
  25. data/app/controllers/umlaut_controller.rb +4 -0
  26. data/app/helpers/emailer_helper.rb +10 -10
  27. data/app/helpers/export_email_helper.rb +1 -1
  28. data/app/helpers/resolve_helper.rb +3 -2
  29. data/app/helpers/search_helper.rb +26 -29
  30. data/app/helpers/umlaut/footer_helper.rb +4 -6
  31. data/app/helpers/umlaut/helper.rb +41 -7
  32. data/app/helpers/umlaut/url_generation.rb +10 -29
  33. data/app/mixin_logic/umlaut_http.rb +5 -2
  34. data/app/models/collection.rb +21 -6
  35. data/app/models/dispatched_service.rb +13 -0
  36. data/app/models/referent.rb +66 -88
  37. data/app/models/referent_value.rb +6 -5
  38. data/app/models/request.rb +35 -22
  39. data/app/models/service_response.rb +132 -66
  40. data/app/models/service_type_value.rb +22 -5
  41. data/app/models/service_wave.rb +30 -9
  42. data/app/models/sfx4/local/base.rb +0 -2
  43. data/app/models/sfx_url.rb +2 -2
  44. data/app/presentation/section_renderer.rb +68 -22
  45. data/app/service_adaptors/ajax_export.rb +1 -0
  46. data/app/service_adaptors/amazon.rb +7 -3
  47. data/app/service_adaptors/email_export.rb +1 -0
  48. data/app/service_adaptors/google_book_search.rb +8 -3
  49. data/app/service_adaptors/google_scholar_link.rb +6 -4
  50. data/app/service_adaptors/hathi_trust.rb +23 -18
  51. data/app/service_adaptors/hip_holding_search.rb +1 -1
  52. data/app/service_adaptors/internet_archive.rb +2 -0
  53. data/app/service_adaptors/isi.rb +2 -2
  54. data/app/service_adaptors/service.rb +31 -41
  55. data/app/service_adaptors/txt_holding_export.rb +3 -2
  56. data/app/service_adaptors/ulrichs_link.rb +5 -5
  57. data/app/service_adaptors/worldcat.rb +3 -1
  58. data/app/views/export_email/email.html.erb +10 -9
  59. data/app/views/export_email/send_txt.html.erb +4 -2
  60. data/app/views/export_email/txt.html.erb +44 -22
  61. data/app/views/feedback/new.html.erb +5 -5
  62. data/app/views/resolve/_background_progress.html.erb +23 -4
  63. data/app/views/resolve/_background_updater.html.erb +8 -8
  64. data/app/views/resolve/_citation.html.erb +11 -10
  65. data/app/views/resolve/_compact_citation.html.erb +3 -3
  66. data/app/views/resolve/_cover_image.html.erb +4 -4
  67. data/app/views/resolve/_fulltext.html.erb +1 -1
  68. data/app/views/resolve/_holding.html.erb +13 -13
  69. data/app/views/resolve/_manually_entered_warning.html.erb +9 -5
  70. data/app/views/resolve/_modal.html.erb +19 -15
  71. data/app/views/resolve/_search_inside.html.erb +20 -17
  72. data/app/views/resolve/_service_errors.html.erb +6 -6
  73. data/app/views/resolve/_standard_response_item.html.erb +7 -7
  74. data/app/views/resolve/get_permalink.html.erb +2 -2
  75. data/app/views/resolve/index.html.erb +13 -11
  76. data/app/views/search/_citation.html.erb +16 -16
  77. data/app/views/search/_pager.html.erb +6 -6
  78. data/app/views/search/books.html.erb +59 -19
  79. data/app/views/search/journal_search.html.erb +11 -11
  80. data/app/views/search/journals.html.erb +33 -33
  81. data/app/views/umlaut/_header.html.erb +7 -1
  82. data/app/views/umlaut/error.html.erb +13 -14
  83. data/bin/umlaut +141 -0
  84. data/config/locales/da.yml +122 -0
  85. data/config/locales/en.yml +227 -4
  86. data/db/orig_fixed_data/service_type_values.yml +18 -7
  87. data/lib/generators/templates/umlaut_services.yml +1 -1
  88. data/lib/generators/umlaut/install_generator.rb +0 -12
  89. data/lib/generators/umlaut/remove_turbolinks_generator.rb +14 -0
  90. data/lib/generators/umlaut_app_template.rb +37 -0
  91. data/lib/umlaut.rb +29 -0
  92. data/lib/umlaut/routes.rb +34 -38
  93. data/lib/umlaut/version.rb +6 -1
  94. data/test/dummy/app/assets/javascripts/application.js +1 -1
  95. data/test/dummy/app/controllers/umlaut_controller.rb +4 -2
  96. data/test/dummy/config/application.rb +2 -1
  97. data/test/dummy/config/environments/development.rb +1 -3
  98. data/test/dummy/config/environments/test.rb +2 -2
  99. data/test/dummy/config/travis_database.yml +0 -14
  100. data/test/dummy/config/umlaut_services.yml +9 -0
  101. data/test/dummy/config/umlaut_services.yml-JH +289 -0
  102. data/test/dummy/config/umlaut_services.yml-TEST +250 -0
  103. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_alerts.scssc +0 -0
  104. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_badges.scssc +0 -0
  105. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_breadcrumbs.scssc +0 -0
  106. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_button-groups.scssc +0 -0
  107. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_buttons.scssc +0 -0
  108. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_carousel.scssc +0 -0
  109. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_close.scssc +0 -0
  110. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_code.scssc +0 -0
  111. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_component-animations.scssc +0 -0
  112. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_dropdowns.scssc +0 -0
  113. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_forms.scssc +0 -0
  114. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_glyphicons.scssc +0 -0
  115. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_grid.scssc +0 -0
  116. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_input-groups.scssc +0 -0
  117. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_jumbotron.scssc +0 -0
  118. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_labels.scssc +0 -0
  119. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_list-group.scssc +0 -0
  120. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_media.scssc +0 -0
  121. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_mixins.scssc +0 -0
  122. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_modals.scssc +0 -0
  123. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_navbar.scssc +0 -0
  124. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_navs.scssc +0 -0
  125. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_normalize.scssc +0 -0
  126. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_pager.scssc +0 -0
  127. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_pagination.scssc +0 -0
  128. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_panels.scssc +0 -0
  129. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_popovers.scssc +0 -0
  130. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_print.scssc +0 -0
  131. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_progress-bars.scssc +0 -0
  132. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_responsive-embed.scssc +0 -0
  133. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_responsive-utilities.scssc +0 -0
  134. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_scaffolding.scssc +0 -0
  135. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_tables.scssc +0 -0
  136. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_thumbnails.scssc +0 -0
  137. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_tooltip.scssc +0 -0
  138. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_type.scssc +0 -0
  139. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_utilities.scssc +0 -0
  140. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_variables.scssc +0 -0
  141. data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_wells.scssc +0 -0
  142. data/test/dummy/tmp/cache/assets/development/sass/524eaf90d4782546823a37b80882f8b66bf73010/_admin.scssc +0 -0
  143. data/test/dummy/tmp/cache/assets/development/sass/524eaf90d4782546823a37b80882f8b66bf73010/_az.scssc +0 -0
  144. data/test/dummy/tmp/cache/assets/development/sass/524eaf90d4782546823a37b80882f8b66bf73010/_forms.scssc +0 -0
  145. data/test/dummy/tmp/cache/assets/development/sass/524eaf90d4782546823a37b80882f8b66bf73010/_icons.scssc +0 -0
  146. data/test/dummy/tmp/cache/assets/development/sass/524eaf90d4782546823a37b80882f8b66bf73010/_layout.scssc +0 -0
  147. data/test/dummy/tmp/cache/assets/development/sass/524eaf90d4782546823a37b80882f8b66bf73010/_misc.scssc +0 -0
  148. data/test/dummy/tmp/cache/assets/development/sass/524eaf90d4782546823a37b80882f8b66bf73010/_mixins.scssc +0 -0
  149. data/test/dummy/tmp/cache/assets/development/sass/524eaf90d4782546823a37b80882f8b66bf73010/_modal.scssc +0 -0
  150. data/test/dummy/tmp/cache/assets/development/sass/524eaf90d4782546823a37b80882f8b66bf73010/_resolve.scssc +0 -0
  151. data/test/dummy/tmp/cache/assets/development/sass/524eaf90d4782546823a37b80882f8b66bf73010/_results.scssc +0 -0
  152. data/test/dummy/tmp/cache/assets/development/sass/524eaf90d4782546823a37b80882f8b66bf73010/_search.scssc +0 -0
  153. data/test/dummy/tmp/cache/assets/development/sass/524eaf90d4782546823a37b80882f8b66bf73010/_spinner.scssc +0 -0
  154. data/test/dummy/tmp/cache/assets/development/sass/524eaf90d4782546823a37b80882f8b66bf73010/_variables.scssc +0 -0
  155. data/test/dummy/tmp/cache/assets/development/sass/6e589d45ad6dae7b9687fd7eac1156e517932854/_bootstrap-sprockets.scssc +0 -0
  156. data/test/dummy/tmp/cache/assets/development/sass/6e589d45ad6dae7b9687fd7eac1156e517932854/bootstrap.scssc +0 -0
  157. data/test/dummy/tmp/cache/assets/development/sass/dc1017bdbb6af49581dc35eda2911a13c557c111/umlaut.css.scssc +0 -0
  158. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_alerts.scssc +0 -0
  159. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_background-variant.scssc +0 -0
  160. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_border-radius.scssc +0 -0
  161. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_buttons.scssc +0 -0
  162. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_center-block.scssc +0 -0
  163. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_clearfix.scssc +0 -0
  164. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_forms.scssc +0 -0
  165. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_gradients.scssc +0 -0
  166. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_grid-framework.scssc +0 -0
  167. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_grid.scssc +0 -0
  168. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_hide-text.scssc +0 -0
  169. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_image.scssc +0 -0
  170. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_labels.scssc +0 -0
  171. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_list-group.scssc +0 -0
  172. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_nav-divider.scssc +0 -0
  173. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_nav-vertical-align.scssc +0 -0
  174. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_opacity.scssc +0 -0
  175. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_pagination.scssc +0 -0
  176. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_panels.scssc +0 -0
  177. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_progress-bar.scssc +0 -0
  178. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_reset-filter.scssc +0 -0
  179. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_resize.scssc +0 -0
  180. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_responsive-visibility.scssc +0 -0
  181. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_size.scssc +0 -0
  182. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_tab-focus.scssc +0 -0
  183. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_table-row.scssc +0 -0
  184. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_text-emphasis.scssc +0 -0
  185. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_text-overflow.scssc +0 -0
  186. data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_vendor-prefixes.scssc +0 -0
  187. data/test/dummy/tmp/cache/assets/development/sprockets/00fe8b9f2a1f7a1c312f627c379f5a50 +0 -0
  188. data/test/dummy/tmp/cache/assets/{DCB/620/sprockets%2F2332a294ceeab3ab9b5ee643989dc0eb → development/sprockets/04757b33bf029a112819cf86c6e899db} +0 -0
  189. data/test/dummy/tmp/cache/assets/development/sprockets/0bdc06801d1626641264f7c81f0bb383 +0 -0
  190. data/test/dummy/tmp/cache/assets/development/sprockets/1365f0b692ced0628311ee4566e1b707 +0 -0
  191. data/test/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  192. data/test/dummy/tmp/cache/assets/{C99/040/sprockets%2F84d95490d4855608b8dd8602192f4f9c → development/sprockets/19f5d7a61a156ff3b78882b11cc679dc} +0 -0
  193. data/test/dummy/tmp/cache/assets/development/sprockets/1b2d587ae29ea4eaabb3bab0f022f3d3 +0 -0
  194. data/test/dummy/tmp/cache/assets/development/sprockets/1d9ea1c7ecfa0067960ac916ce4b65ca +0 -0
  195. data/test/dummy/tmp/cache/assets/development/sprockets/1e127abfd1414d0de67e3d78570c8195 +0 -0
  196. data/test/dummy/tmp/cache/assets/development/sprockets/22a2e14590ab60250be8e55802e0416b +0 -0
  197. data/test/dummy/tmp/cache/assets/{D72/1E0/sprockets%2Fdee77a9fb00d0a6229fd6b54a8f14197 → development/sprockets/29512f3dcf5161d055eb24ebcaaf8613} +0 -0
  198. data/test/dummy/tmp/cache/assets/development/sprockets/2b31649bad46580f69b4c7283d75d7da +0 -0
  199. data/test/dummy/tmp/cache/assets/development/sprockets/2b6799917cb806635bb25ceb87199288 +0 -0
  200. data/test/dummy/tmp/cache/assets/development/sprockets/2dcbebcad08aa99d46c19c8dceebc0e8 +0 -0
  201. data/test/dummy/tmp/cache/assets/{DD1/120/sprockets%2Fbee5967b8282dab9fce5c242bcc14c55 → development/sprockets/2e10962ed25d5e106895b21500eed819} +0 -0
  202. data/test/dummy/tmp/cache/assets/development/sprockets/2e7a2009e7fa93a461d747b153241335 +0 -0
  203. data/test/dummy/tmp/cache/assets/development/sprockets/2edf520c0d6a5e6fe31a96ff6249deb3 +0 -0
  204. data/test/dummy/tmp/cache/assets/{DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 → development/sprockets/2f5173deea6c795b8fdde723bb4b63af} +0 -0
  205. data/test/dummy/tmp/cache/assets/development/sprockets/33effed14152fbf68a290dc9bfdacc49 +0 -0
  206. data/test/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  207. data/test/dummy/tmp/cache/assets/development/sprockets/362ddf5dec149d8860307be28f1b6aba +0 -0
  208. data/test/dummy/tmp/cache/assets/development/sprockets/3bb0e2c4964797a92ce18c9265d7c35d +0 -0
  209. data/test/dummy/tmp/cache/assets/development/sprockets/3de79b672a2a13cc1a0ecdb4f14087b6 +0 -0
  210. data/test/dummy/tmp/cache/assets/development/sprockets/4059619b2636e7c20d35170dfe625a63 +0 -0
  211. data/test/dummy/tmp/cache/assets/development/sprockets/43cc6f487d302bad3c176fb117bc8790 +0 -0
  212. data/test/dummy/tmp/cache/assets/development/sprockets/4c4d82da23f69029b0c8346855f2effe +0 -0
  213. data/test/dummy/tmp/cache/assets/development/sprockets/4e00e47769496546d5560ba11077191e +0 -0
  214. data/test/dummy/tmp/cache/assets/development/sprockets/4ed3382d5f8738e189d0fb787a29e487 +0 -0
  215. data/test/dummy/tmp/cache/assets/development/sprockets/50e6046f30d33ebf382887de6500721f +0 -0
  216. data/test/dummy/tmp/cache/assets/development/sprockets/5488b82c680f30f6fd6e237c86e7887a +0 -0
  217. data/test/dummy/tmp/cache/assets/{C9D/060/sprockets%2F5c8956a1666824a1d214531abd22e2a2 → development/sprockets/56381d00a030c7822e9a88c9ddae434f} +0 -0
  218. data/test/dummy/tmp/cache/assets/{D17/BC0/sprockets%2F1ae6578a93a7a3d848319dea314f592d → development/sprockets/5bdde916a6e5824d9c695657aaada893} +0 -0
  219. data/test/dummy/tmp/cache/assets/development/sprockets/5d7a36094a81c5e13f8603581fdcd0a0 +0 -0
  220. data/test/dummy/tmp/cache/assets/development/sprockets/62df0d3ba0011b6ebf283e9e4fd33a59 +0 -0
  221. data/test/dummy/tmp/cache/assets/development/sprockets/685077a71b34728322a6a3df7a818f16 +0 -0
  222. data/test/dummy/tmp/cache/assets/development/sprockets/74007643206dfef480fe67a4ee6a5af9 +0 -0
  223. data/test/dummy/tmp/cache/assets/development/sprockets/747ce3a1a163cd0edc663342abb508c8 +0 -0
  224. data/test/dummy/tmp/cache/assets/development/sprockets/7752e1fdfeb11e34353bb24822e8eddc +0 -0
  225. data/test/dummy/tmp/cache/assets/development/sprockets/7ab84c0db002136373ac7278f78e4d69 +0 -0
  226. data/test/dummy/tmp/cache/assets/{D65/820/sprockets%2Fae5318865ebb4a2b74e84c0e13fb921a → development/sprockets/80f1a2af00dac454055d31d97fa9ea16} +0 -0
  227. data/test/dummy/tmp/cache/assets/development/sprockets/827f39ace148dd5b450c5b5c4f7b7407 +0 -0
  228. data/test/dummy/tmp/cache/assets/{DEF/A60/sprockets%2F3fddcee3e5dbd24f28de1001e5f3a009 → development/sprockets/84bda1ce77f140dbe330abbb9654a389} +0 -0
  229. data/test/dummy/tmp/cache/assets/development/sprockets/91cf221e4f31c9b0e394d61e76e383a6 +0 -0
  230. data/test/dummy/tmp/cache/assets/development/sprockets/91fc9ce33c0477ac8e5c38f43ace64f3 +0 -0
  231. data/test/dummy/tmp/cache/assets/development/sprockets/984eb5d6325666ea28ac61b8f00bbf96 +0 -0
  232. data/test/dummy/tmp/cache/assets/development/sprockets/a5ca1b208ac1648c9233a4f82231cc9d +0 -0
  233. data/test/dummy/tmp/cache/assets/development/sprockets/b0644dc48561692b74e67cfa49f1fccc +0 -0
  234. data/test/dummy/tmp/cache/assets/development/sprockets/b45832a1ef97f445005b6a5ed08ad4e1 +0 -0
  235. data/test/dummy/tmp/cache/assets/development/sprockets/b57b9a3152cba1d2ce51c8890cd2c069 +0 -0
  236. data/test/dummy/tmp/cache/assets/development/sprockets/bf432dfd03a3577b6fecab95f67d3e10 +0 -0
  237. data/test/dummy/tmp/cache/assets/development/sprockets/c10ba9d7ca59eade850d472f4620e679 +0 -0
  238. data/test/dummy/tmp/cache/assets/development/sprockets/c127c56dd327b8471950e4e4eb774d58 +0 -0
  239. data/test/dummy/tmp/cache/assets/development/sprockets/c4883e8efaaa0dd40101433793d62dd0 +0 -0
  240. data/test/dummy/tmp/cache/assets/development/sprockets/ccb8dacf69b5ea6e8638d5659f87e93b +0 -0
  241. data/test/dummy/tmp/cache/assets/{E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af → development/sprockets/cffd775d018f68ce5dba1ee0d951a994} +0 -0
  242. data/test/dummy/tmp/cache/assets/development/sprockets/d06b36a24841048e094f62c017a0e23c +0 -0
  243. data/test/dummy/tmp/cache/assets/development/sprockets/d40077dd950a280248a90c9cd9bf1171 +0 -0
  244. data/test/dummy/tmp/cache/assets/development/sprockets/d49649ea0360b8433251241f77ab88c1 +0 -0
  245. data/test/dummy/tmp/cache/assets/development/sprockets/d6a0c8ca3c8a8f1bde4550db740138b8 +0 -0
  246. data/test/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  247. data/test/dummy/tmp/cache/assets/development/sprockets/d81f215f779ce2609d4dfa76b02df41c +0 -0
  248. data/test/dummy/tmp/cache/assets/development/sprockets/de3f87130aaf9847386d1f5e5c9893f1 +0 -0
  249. data/test/dummy/tmp/cache/assets/development/sprockets/dea953187fcf46b6d47f7653acc099c6 +0 -0
  250. data/test/dummy/tmp/cache/assets/development/sprockets/e1bf78affc4ede54eac4249af8f16e82 +0 -0
  251. data/test/dummy/tmp/cache/assets/development/sprockets/eaff4713f011dd8b1946264e8f120fb6 +0 -0
  252. data/test/dummy/tmp/cache/assets/development/sprockets/ef4a528b7df4e9417e42bc5aaf40ef9b +0 -0
  253. data/test/dummy/tmp/cache/assets/development/sprockets/f6be26089ea600503193ac4a8119a33b +0 -0
  254. data/test/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  255. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_alerts.scssc +0 -0
  256. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_badges.scssc +0 -0
  257. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_breadcrumbs.scssc +0 -0
  258. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_button-groups.scssc +0 -0
  259. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_buttons.scssc +0 -0
  260. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_carousel.scssc +0 -0
  261. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_close.scssc +0 -0
  262. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_code.scssc +0 -0
  263. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_component-animations.scssc +0 -0
  264. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_dropdowns.scssc +0 -0
  265. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_forms.scssc +0 -0
  266. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_glyphicons.scssc +0 -0
  267. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_grid.scssc +0 -0
  268. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_input-groups.scssc +0 -0
  269. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_jumbotron.scssc +0 -0
  270. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_labels.scssc +0 -0
  271. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_list-group.scssc +0 -0
  272. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_media.scssc +0 -0
  273. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_mixins.scssc +0 -0
  274. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_modals.scssc +0 -0
  275. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_navbar.scssc +0 -0
  276. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_navs.scssc +0 -0
  277. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_normalize.scssc +0 -0
  278. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_pager.scssc +0 -0
  279. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_pagination.scssc +0 -0
  280. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_panels.scssc +0 -0
  281. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_popovers.scssc +0 -0
  282. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_print.scssc +0 -0
  283. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_progress-bars.scssc +0 -0
  284. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_responsive-embed.scssc +0 -0
  285. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_responsive-utilities.scssc +0 -0
  286. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_scaffolding.scssc +0 -0
  287. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_tables.scssc +0 -0
  288. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_thumbnails.scssc +0 -0
  289. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_tooltip.scssc +0 -0
  290. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_type.scssc +0 -0
  291. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_utilities.scssc +0 -0
  292. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_variables.scssc +0 -0
  293. data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_wells.scssc +0 -0
  294. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_alerts.scssc +0 -0
  295. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_badges.scssc +0 -0
  296. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_breadcrumbs.scssc +0 -0
  297. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_button-groups.scssc +0 -0
  298. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_buttons.scssc +0 -0
  299. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_carousel.scssc +0 -0
  300. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_close.scssc +0 -0
  301. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_code.scssc +0 -0
  302. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_component-animations.scssc +0 -0
  303. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_dropdowns.scssc +0 -0
  304. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_forms.scssc +0 -0
  305. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_glyphicons.scssc +0 -0
  306. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_grid.scssc +0 -0
  307. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_input-groups.scssc +0 -0
  308. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_jumbotron.scssc +0 -0
  309. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_labels.scssc +0 -0
  310. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_list-group.scssc +0 -0
  311. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_media.scssc +0 -0
  312. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_mixins.scssc +0 -0
  313. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_modals.scssc +0 -0
  314. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_navbar.scssc +0 -0
  315. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_navs.scssc +0 -0
  316. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_normalize.scssc +0 -0
  317. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_pager.scssc +0 -0
  318. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_pagination.scssc +0 -0
  319. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_panels.scssc +0 -0
  320. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_popovers.scssc +0 -0
  321. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_print.scssc +0 -0
  322. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_progress-bars.scssc +0 -0
  323. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_responsive-embed.scssc +0 -0
  324. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_responsive-utilities.scssc +0 -0
  325. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_scaffolding.scssc +0 -0
  326. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_tables.scssc +0 -0
  327. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_thumbnails.scssc +0 -0
  328. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_tooltip.scssc +0 -0
  329. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_type.scssc +0 -0
  330. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_utilities.scssc +0 -0
  331. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_variables.scssc +0 -0
  332. data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_wells.scssc +0 -0
  333. data/test/dummy/tmp/cache/assets/test/sass/524eaf90d4782546823a37b80882f8b66bf73010/_admin.scssc +0 -0
  334. data/test/dummy/tmp/cache/assets/test/sass/524eaf90d4782546823a37b80882f8b66bf73010/_az.scssc +0 -0
  335. data/test/dummy/tmp/cache/assets/test/sass/524eaf90d4782546823a37b80882f8b66bf73010/_forms.scssc +0 -0
  336. data/test/dummy/tmp/cache/assets/test/sass/524eaf90d4782546823a37b80882f8b66bf73010/_icons.scssc +0 -0
  337. data/test/dummy/tmp/cache/assets/test/sass/524eaf90d4782546823a37b80882f8b66bf73010/_layout.scssc +0 -0
  338. data/test/dummy/tmp/cache/assets/test/sass/524eaf90d4782546823a37b80882f8b66bf73010/_misc.scssc +0 -0
  339. data/test/dummy/tmp/cache/assets/test/sass/524eaf90d4782546823a37b80882f8b66bf73010/_mixins.scssc +0 -0
  340. data/test/dummy/tmp/cache/assets/test/sass/524eaf90d4782546823a37b80882f8b66bf73010/_modal.scssc +0 -0
  341. data/test/dummy/tmp/cache/assets/test/sass/524eaf90d4782546823a37b80882f8b66bf73010/_resolve.scssc +0 -0
  342. data/test/dummy/tmp/cache/assets/test/sass/524eaf90d4782546823a37b80882f8b66bf73010/_results.scssc +0 -0
  343. data/test/dummy/tmp/cache/assets/test/sass/524eaf90d4782546823a37b80882f8b66bf73010/_search.scssc +0 -0
  344. data/test/dummy/tmp/cache/assets/test/sass/524eaf90d4782546823a37b80882f8b66bf73010/_spinner.scssc +0 -0
  345. data/test/dummy/tmp/cache/assets/test/sass/524eaf90d4782546823a37b80882f8b66bf73010/_variables.scssc +0 -0
  346. data/test/dummy/tmp/cache/assets/test/sass/6e589d45ad6dae7b9687fd7eac1156e517932854/_bootstrap-sprockets.scssc +0 -0
  347. data/test/dummy/tmp/cache/assets/test/sass/6e589d45ad6dae7b9687fd7eac1156e517932854/bootstrap.scssc +0 -0
  348. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_alerts.scssc +0 -0
  349. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_background-variant.scssc +0 -0
  350. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_border-radius.scssc +0 -0
  351. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_buttons.scssc +0 -0
  352. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_center-block.scssc +0 -0
  353. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_clearfix.scssc +0 -0
  354. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_forms.scssc +0 -0
  355. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_gradients.scssc +0 -0
  356. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_grid-framework.scssc +0 -0
  357. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_grid.scssc +0 -0
  358. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_hide-text.scssc +0 -0
  359. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_image.scssc +0 -0
  360. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_labels.scssc +0 -0
  361. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_list-group.scssc +0 -0
  362. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_nav-divider.scssc +0 -0
  363. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_nav-vertical-align.scssc +0 -0
  364. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_opacity.scssc +0 -0
  365. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_pagination.scssc +0 -0
  366. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_panels.scssc +0 -0
  367. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_progress-bar.scssc +0 -0
  368. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_reset-filter.scssc +0 -0
  369. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_resize.scssc +0 -0
  370. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_responsive-visibility.scssc +0 -0
  371. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_size.scssc +0 -0
  372. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_tab-focus.scssc +0 -0
  373. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_table-row.scssc +0 -0
  374. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_text-emphasis.scssc +0 -0
  375. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_text-overflow.scssc +0 -0
  376. data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_vendor-prefixes.scssc +0 -0
  377. data/test/dummy/tmp/cache/assets/test/sass/d66be29359c981abd965733fad9a31a018759486/_bootstrap-sprockets.scssc +0 -0
  378. data/test/dummy/tmp/cache/assets/test/sass/d66be29359c981abd965733fad9a31a018759486/_bootstrap.scssc +0 -0
  379. data/test/dummy/tmp/cache/assets/test/sass/dc1017bdbb6af49581dc35eda2911a13c557c111/umlaut.css.scssc +0 -0
  380. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_alerts.scssc +0 -0
  381. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_background-variant.scssc +0 -0
  382. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_border-radius.scssc +0 -0
  383. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_buttons.scssc +0 -0
  384. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_center-block.scssc +0 -0
  385. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_clearfix.scssc +0 -0
  386. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_forms.scssc +0 -0
  387. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_gradients.scssc +0 -0
  388. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_grid-framework.scssc +0 -0
  389. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_grid.scssc +0 -0
  390. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_hide-text.scssc +0 -0
  391. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_image.scssc +0 -0
  392. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_labels.scssc +0 -0
  393. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_list-group.scssc +0 -0
  394. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_nav-divider.scssc +0 -0
  395. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_nav-vertical-align.scssc +0 -0
  396. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_opacity.scssc +0 -0
  397. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_pagination.scssc +0 -0
  398. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_panels.scssc +0 -0
  399. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_progress-bar.scssc +0 -0
  400. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_reset-filter.scssc +0 -0
  401. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_resize.scssc +0 -0
  402. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_responsive-visibility.scssc +0 -0
  403. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_size.scssc +0 -0
  404. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_tab-focus.scssc +0 -0
  405. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_table-row.scssc +0 -0
  406. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_text-emphasis.scssc +0 -0
  407. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_text-overflow.scssc +0 -0
  408. data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_vendor-prefixes.scssc +0 -0
  409. data/test/dummy/tmp/cache/assets/test/sprockets/00fe8b9f2a1f7a1c312f627c379f5a50 +0 -0
  410. data/test/dummy/tmp/cache/assets/test/sprockets/04757b33bf029a112819cf86c6e899db +0 -0
  411. data/test/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  412. data/test/dummy/tmp/cache/assets/test/sprockets/1a72ab0727d6b1c53a2425bce68ccd29 +0 -0
  413. data/test/dummy/tmp/cache/assets/{D02/B30/sprockets%2Fb9332ebd1d306cc9120a386ca986034d → test/sprockets/1b2d587ae29ea4eaabb3bab0f022f3d3} +0 -0
  414. data/test/dummy/tmp/cache/assets/test/sprockets/1d9ea1c7ecfa0067960ac916ce4b65ca +0 -0
  415. data/test/dummy/tmp/cache/assets/{D65/0D0/sprockets%2F9fd0b369f009be410bdb0b6e5458b3a6 → test/sprockets/1e127abfd1414d0de67e3d78570c8195} +0 -0
  416. data/test/dummy/tmp/cache/assets/test/sprockets/204c5ef815c91ad1dba36952ada84453 +0 -0
  417. data/test/dummy/tmp/cache/assets/test/sprockets/29512f3dcf5161d055eb24ebcaaf8613 +0 -0
  418. data/test/dummy/tmp/cache/assets/test/sprockets/2b31649bad46580f69b4c7283d75d7da +0 -0
  419. data/test/dummy/tmp/cache/assets/test/sprockets/2b6799917cb806635bb25ceb87199288 +0 -0
  420. data/test/dummy/tmp/cache/assets/test/sprockets/2dcbebcad08aa99d46c19c8dceebc0e8 +0 -0
  421. data/test/dummy/tmp/cache/assets/test/sprockets/2e10962ed25d5e106895b21500eed819 +0 -0
  422. data/test/dummy/tmp/cache/assets/test/sprockets/2e7a2009e7fa93a461d747b153241335 +0 -0
  423. data/test/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  424. data/test/dummy/tmp/cache/assets/test/sprockets/300b3cf1812a5e2ba89266b8198caf8c +0 -0
  425. data/test/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  426. data/test/dummy/tmp/cache/assets/test/sprockets/3bb0e2c4964797a92ce18c9265d7c35d +0 -0
  427. data/test/dummy/tmp/cache/assets/test/sprockets/3de79b672a2a13cc1a0ecdb4f14087b6 +0 -0
  428. data/test/dummy/tmp/cache/assets/test/sprockets/4059619b2636e7c20d35170dfe625a63 +0 -0
  429. data/test/dummy/tmp/cache/assets/test/sprockets/42d8221eac1dc91b1c055df56147f009 +0 -0
  430. data/test/dummy/tmp/cache/assets/test/sprockets/43bdfbe7d60eec9cab5eda9af30fae29 +0 -0
  431. data/test/dummy/tmp/cache/assets/test/sprockets/43cc6f487d302bad3c176fb117bc8790 +0 -0
  432. data/test/dummy/tmp/cache/assets/test/sprockets/4403ea9870ef12ff2940eb16ee72aefd +0 -0
  433. data/test/dummy/tmp/cache/assets/test/sprockets/4c4d82da23f69029b0c8346855f2effe +0 -0
  434. data/test/dummy/tmp/cache/assets/test/sprockets/4e00e47769496546d5560ba11077191e +0 -0
  435. data/test/dummy/tmp/cache/assets/{DAB/C70/sprockets%2Ff8ac0db14f84bce083a7c58f965e806f → test/sprockets/4ed3382d5f8738e189d0fb787a29e487} +0 -0
  436. data/test/dummy/tmp/cache/assets/test/sprockets/50e6046f30d33ebf382887de6500721f +0 -0
  437. data/test/dummy/tmp/cache/assets/test/sprockets/5488b82c680f30f6fd6e237c86e7887a +0 -0
  438. data/test/dummy/tmp/cache/assets/test/sprockets/58901a70c4225a06a7b7402515a9b987 +0 -0
  439. data/test/dummy/tmp/cache/assets/test/sprockets/5bdde916a6e5824d9c695657aaada893 +0 -0
  440. data/test/dummy/tmp/cache/assets/test/sprockets/5d7a36094a81c5e13f8603581fdcd0a0 +0 -0
  441. data/test/dummy/tmp/cache/assets/test/sprockets/62df0d3ba0011b6ebf283e9e4fd33a59 +0 -0
  442. data/test/dummy/tmp/cache/assets/test/sprockets/641d193a017d5c7220a38ee54b714fa3 +0 -0
  443. data/test/dummy/tmp/cache/assets/test/sprockets/65c94ad4022a7bb639254a1716375313 +0 -0
  444. data/test/dummy/tmp/cache/assets/test/sprockets/661a6079c9ca1cbcf6215e9113867d30 +0 -0
  445. data/test/dummy/tmp/cache/assets/test/sprockets/685077a71b34728322a6a3df7a818f16 +0 -0
  446. data/test/dummy/tmp/cache/assets/test/sprockets/74007643206dfef480fe67a4ee6a5af9 +0 -0
  447. data/test/dummy/tmp/cache/assets/test/sprockets/747ce3a1a163cd0edc663342abb508c8 +0 -0
  448. data/test/dummy/tmp/cache/assets/{D47/690/sprockets%2Fd92186d33469ff2bd01ba096f33dfd78 → test/sprockets/7752e1fdfeb11e34353bb24822e8eddc} +0 -0
  449. data/test/dummy/tmp/cache/assets/test/sprockets/7ab84c0db002136373ac7278f78e4d69 +0 -0
  450. data/test/dummy/tmp/cache/assets/test/sprockets/80f1a2af00dac454055d31d97fa9ea16 +0 -0
  451. data/test/dummy/tmp/cache/assets/test/sprockets/84bda1ce77f140dbe330abbb9654a389 +0 -0
  452. data/test/dummy/tmp/cache/assets/test/sprockets/91cf221e4f31c9b0e394d61e76e383a6 +0 -0
  453. data/test/dummy/tmp/cache/assets/test/sprockets/91fc9ce33c0477ac8e5c38f43ace64f3 +0 -0
  454. data/test/dummy/tmp/cache/assets/test/sprockets/9424bf97ebe97817bf589d5409eb1b49 +0 -0
  455. data/test/dummy/tmp/cache/assets/test/sprockets/97197c94037eb886f290e1db6db71839 +0 -0
  456. data/test/dummy/tmp/cache/assets/test/sprockets/984eb5d6325666ea28ac61b8f00bbf96 +0 -0
  457. data/test/dummy/tmp/cache/assets/test/sprockets/9e9540a6ef6178fdc44134b8170b9104 +0 -0
  458. data/test/dummy/tmp/cache/assets/test/sprockets/a4605dfa1ec12c0c0a5fa6149836e146 +0 -0
  459. data/test/dummy/tmp/cache/assets/test/sprockets/a5ca1b208ac1648c9233a4f82231cc9d +0 -0
  460. data/test/dummy/tmp/cache/assets/test/sprockets/a8ae1c833918295d04a2921439ec6dda +0 -0
  461. data/test/dummy/tmp/cache/assets/test/sprockets/b0644dc48561692b74e67cfa49f1fccc +0 -0
  462. data/test/dummy/tmp/cache/assets/test/sprockets/b45832a1ef97f445005b6a5ed08ad4e1 +0 -0
  463. data/test/dummy/tmp/cache/assets/test/sprockets/b530e8eed86f8a06c34ebfba012ced9f +0 -0
  464. data/test/dummy/tmp/cache/assets/test/sprockets/bbff1f14224b48e4d838bcfb3ed8a610 +0 -0
  465. data/test/dummy/tmp/cache/assets/test/sprockets/c10ba9d7ca59eade850d472f4620e679 +0 -0
  466. data/test/dummy/tmp/cache/assets/test/sprockets/c127c56dd327b8471950e4e4eb774d58 +0 -0
  467. data/test/dummy/tmp/cache/assets/test/sprockets/c4883e8efaaa0dd40101433793d62dd0 +0 -0
  468. data/test/dummy/tmp/cache/assets/test/sprockets/c696c2db7d8317ca35a7243d8bd4f3b2 +0 -0
  469. data/test/dummy/tmp/cache/assets/test/sprockets/ccb8dacf69b5ea6e8638d5659f87e93b +0 -0
  470. data/test/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  471. data/test/dummy/tmp/cache/assets/test/sprockets/d40077dd950a280248a90c9cd9bf1171 +0 -0
  472. data/test/dummy/tmp/cache/assets/test/sprockets/d49649ea0360b8433251241f77ab88c1 +0 -0
  473. data/test/dummy/tmp/cache/assets/test/sprockets/d6a0c8ca3c8a8f1bde4550db740138b8 +0 -0
  474. data/test/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  475. data/test/dummy/tmp/cache/assets/test/sprockets/db71108aa3843a309c5247dd6481dd12 +0 -0
  476. data/test/dummy/tmp/cache/assets/test/sprockets/dd484b056ce971aa93a7b69c6ec28fb3 +0 -0
  477. data/test/dummy/tmp/cache/assets/test/sprockets/de3f87130aaf9847386d1f5e5c9893f1 +0 -0
  478. data/test/dummy/tmp/cache/assets/test/sprockets/dea953187fcf46b6d47f7653acc099c6 +0 -0
  479. data/test/dummy/tmp/cache/assets/test/sprockets/df2a44cb5db91d63eb01e3d4a1673b75 +0 -0
  480. data/test/dummy/tmp/cache/assets/test/sprockets/e1bf78affc4ede54eac4249af8f16e82 +0 -0
  481. data/test/dummy/tmp/cache/assets/test/sprockets/e776d52f6ae606355fa1070b2eb7825b +0 -0
  482. data/test/dummy/tmp/cache/assets/test/sprockets/eaff4713f011dd8b1946264e8f120fb6 +0 -0
  483. data/test/dummy/tmp/cache/assets/test/sprockets/f6be26089ea600503193ac4a8119a33b +0 -0
  484. data/test/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  485. data/test/functional/feedback_controller_test.rb +1 -1
  486. data/test/functional/resolve_controller_test-NOFIXTURES.rb +227 -0
  487. data/test/functional/resolve_controller_test.rb +155 -14
  488. data/test/functional/search_controller_test.rb +1 -1
  489. data/test/helper/list_with_limit_test.rb +11 -0
  490. data/test/test_helper.rb +63 -26
  491. data/test/unit/active_record_connection_pool_test.rb +43 -25
  492. data/test/unit/aws_product_sign_test.rb +3 -3
  493. data/test/unit/collection_test.rb +39 -3
  494. data/test/unit/determine_services_test.rb +11 -11
  495. data/test/unit/dispatched_service_test.rb +16 -0
  496. data/test/unit/dissertation_catch_test.rb +1 -2
  497. data/test/unit/google_book_search_test.rb +6 -8
  498. data/test/unit/internet_archive_test.rb +6 -5
  499. data/test/unit/permalink_test.rb +4 -2
  500. data/test/unit/referent_test.rb +60 -0
  501. data/test/unit/referent_to_citation_test.rb +29 -2
  502. data/test/unit/request_test.rb +48 -0
  503. data/test/unit/service_response_test.rb +63 -4
  504. data/test/unit/service_test.rb +35 -5
  505. data/test/unit/service_type_value_test.rb +25 -0
  506. data/test/unit/sfx4_search_test.rb +1 -1
  507. data/test/unit/sfx_test.rb +4 -2
  508. data/test/unit/worldcat_test.rb +1 -3
  509. data/test/vcr_cassettes/collection/live_dispatch.yml +311 -0
  510. data/test/vcr_cassettes/sfx/nytimes_by_issn.yml +1 -1
  511. metadata +831 -145
  512. data/app/controllers/search_methods/sfx4_solr/README.md +0 -57
  513. data/app/controllers/search_methods/sfx4_solr/local.rb +0 -40
  514. data/app/controllers/search_methods/sfx4_solr/searcher.rb +0 -118
  515. data/app/models/sfx4/global/base.rb +0 -24
  516. data/app/models/sfx4/global/kb_objects.rb +0 -34
  517. data/app/views/search/opensearch_description.rxml +0 -10
  518. data/lib/service_adaptors/README.md +0 -0
  519. data/test/dummy/db/migrate/20120927163304_sfx4_global.rb +0 -26
  520. data/test/dummy/tmp/cache/assets/BFF/760/sprockets%2Fe00969069e468419c393709f042b4527 +0 -0
  521. data/test/dummy/tmp/cache/assets/CC7/D80/sprockets%2F62a4c21a1d5bac4064e25082f523f238 +0 -0
  522. data/test/dummy/tmp/cache/assets/CC8/C70/sprockets%2F397590f867a06c2d0595c75ed4269e9b +0 -0
  523. data/test/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
  524. data/test/dummy/tmp/cache/assets/CE3/1F0/sprockets%2F9a3b0380fe964d77f0013845d3d355fd +0 -0
  525. data/test/dummy/tmp/cache/assets/CE7/FA0/sprockets%2F98df08987c1b5c0f643a21538a7182ec +0 -0
  526. data/test/dummy/tmp/cache/assets/CEA/930/sprockets%2F42ebf67295336dfb5725a8bb12881a98 +0 -0
  527. data/test/dummy/tmp/cache/assets/D15/FC0/sprockets%2F8cbf3a8b7acb7fc27a42168846226385 +0 -0
  528. data/test/dummy/tmp/cache/assets/D2D/240/sprockets%2F6610ec2488ff4a57d54efb798f1a9994 +0 -0
  529. data/test/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  530. data/test/dummy/tmp/cache/assets/D33/2C0/sprockets%2F790e9527eead8b020b92b34dc6a600d2 +0 -0
  531. data/test/dummy/tmp/cache/assets/D38/930/sprockets%2F45cee52fe11df0057793a6751aa65a4c +0 -0
  532. data/test/dummy/tmp/cache/assets/D39/B30/sprockets%2Fcb7b9f6963b829c678ff9267c63577ce +0 -0
  533. data/test/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
  534. data/test/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
  535. data/test/dummy/tmp/cache/assets/D5F/690/sprockets%2Febe18c52ead548a955a1f2be191130b3 +0 -0
  536. data/test/dummy/tmp/cache/assets/D6A/A80/sprockets%2F22d5d4e74a9a3f3deb5a92704ae750f3 +0 -0
  537. data/test/dummy/tmp/cache/assets/D6B/020/sprockets%2Ffba640f8143fc0c24e3e6616e2eb93a9 +0 -0
  538. data/test/dummy/tmp/cache/assets/D6B/8C0/sprockets%2Fa0dc07225af433e77fd6a9028a8e3c6e +0 -0
  539. data/test/dummy/tmp/cache/assets/D98/990/sprockets%2F710ede3e7f5ebab14e9772fa88c00c02 +0 -0
  540. data/test/dummy/tmp/cache/assets/DAD/BA0/sprockets%2F193f81f7e4eae26eaaa7d909c0c8e956 +0 -0
  541. data/test/dummy/tmp/cache/assets/DD6/010/sprockets%2F15a8fcbaccc97804fce2ee514e371f79 +0 -0
  542. data/test/dummy/tmp/cache/assets/E2E/350/sprockets%2Fbea81b7c4fdf19664eff44b21ea53dbe +0 -0
  543. data/test/dummy/tmp/cache/assets/EF1/680/sprockets%2Fed8ede7dea4bd22aacb9584fbe7d6cad +0 -0
  544. data/test/fixtures/sfx4/global/KB_OBJECTS.yml +0 -46
  545. data/test/integration/request_test.rb +0 -25
  546. data/test/performance/browsing_test.rb +0 -9
  547. data/test/unit/sfx4_solr_search_test.rb +0 -81
  548. data/test/vcr_cassettes/resolve/fulltext_with_edition_warning.yml +0 -44
  549. data/test/vcr_cassettes/resolve/manually_entered.yml +0 -84
  550. data/test/vcr_cassettes/resolve/no_holdings.yml +0 -649
  551. data/test/vcr_cassettes/resolve/nytimes_by_issn.yml +0 -224
  552. data/test/vcr_cassettes/sfx4_solr/find_by_group.yml +0 -125
  553. data/test/vcr_cassettes/sfx4_solr/find_by_title_begins_with.yml +0 -71
  554. data/test/vcr_cassettes/sfx4_solr/find_by_title_contains.yml +0 -72
  555. data/test/vcr_cassettes/sfx4_solr/find_by_title_exact.yml +0 -36
data/README.md CHANGED
@@ -39,16 +39,18 @@ https://github.com/team-umlaut/umlaut/wiki/Installation.
39
39
 
40
40
  The Rails/Umlaut super-concise expert summary is:
41
41
 
42
- * Rails 3.1+ (but not yet tested with Rails 4), ruby 1.9.3.
43
-
44
- * gem 'umlaut'
45
-
46
- * `bundle install`
47
-
48
- * `$ rails generate umlaut:install`
49
-
50
- * mysql database strongly encouraged, sqlite3 probably won't work.
51
-
42
+ * Rails 3.2+ (Rails 4.1+ highly recommended, Rails 3's days are numbered),
43
+ * ruby 1.9.3+ (Consider ruby 2.0 or 2.1, 1.9.3's days are numbered)
44
+
45
+ * `$ gem install umlaut`
46
+ * Then run the umlaut app generator: `$ umlaut my_new_app`
47
+ ** That will make a new rails app
48
+ ** without spring or turbolinks
49
+ ** using mysql (sqlite3 does not work for umlaut)
50
+ ** it will add the umlaut gem to your app
51
+ ** and it will run umlaut's generator to add a couple more files to your app, equivalent of `$ rails generate umlaut:install`
52
+
53
+ * set up your db in config/databases.yml and run `rake db:migrate`
52
54
  * configuration in `./config/umlaut_services.yml` and `./app/controllers/umlaut_controller.rb`
53
55
 
54
56
  * Umlaut uses multi-threaded concurrency in a way incompatible with development-mode class reloading. You need cache_classes=false even in dev, the Umlaut install generator changes this for you.
@@ -65,7 +67,7 @@ in your application's Gemfile in order to get the described functionality.
65
67
 
66
68
  ## Developing
67
69
 
68
- Only spotty test coverage, sorry, but we're trying to improve. Don't trust
70
+ Some test coverage not yet complete, but we're trying to improve. Don't trust
69
71
  if all tests pass everythings good, but if tests fail, that's an unacceptable
70
72
  commit. Try to add tests with new features, although we understand when
71
73
  nobody can figure out a good way to test (esp our legacy architecture).
@@ -89,4 +91,3 @@ https://github.com/team-umlaut/umlaut/
89
91
 
90
92
  You can join the umlaut listserv at:
91
93
  https://groups.google.com/forum/#!forum/umlaut-software
92
-
@@ -1,467 +1,59 @@
1
1
  ######################
2
2
  #
3
- # ActiveRecord's ConnectionPool in Rails 3.2.3 allows threads to 'steal'
4
- # connections from each other, so some threads get starved out.
3
+ # Monkey patch to ActiveRecord to prevent 'implicit' checkouts.
5
4
  #
6
- # This monkey patch uses an implementation from https://github.com/rails/rails/pull/6492
7
- # that ensures 'fair' queue in ConnectionPool.
5
+ # If you create a thread yourself, if it uses ActiveRecord objects without
6
+ # explicitly checking out a connection, one will still be checked out implicitly.
7
+ # If it is never checked back in with `ActiveRecord::Base.clear_active_connections!`,
8
+ # then it will be leaked.
8
9
  #
9
- # It's actually a weird hybrid which ALSO maintains the clear_stale_cached_connections!
10
- # behavior to reclaim leaked orphaned connections, and calls that method
11
- # in checkout when pool has no avail connections.
10
+ # For some uses, we want to avoid being able to do that kind of implicit checkout,
11
+ # force all ActiveRecord use to be via an explicit checkout using with_connection
12
+ # or checkout.
12
13
  #
13
- # This file referenced from an initializer in our main engine
14
- # class, that loads it to monkey patch AR.
14
+ # With this monkey patch, a thread can call:
15
+ #
16
+ # ActiveRecord::Base.forbid_implicit_checkout_for_thread!
17
+ #
18
+ # And subsequently, if that thread accidentally tries to do an implicit
19
+ # checkout, an exception will be raised.
20
+ #
21
+ # The exception raised is defined here as ImplicitConnectionForbiddenError < ActiveRecord::ConnectionTimeoutError
15
22
  #
16
23
  ##########################
17
24
 
18
- # give a backdoor to disable this patch
19
- unless ENV["NO_AR_PATCH"]
20
-
21
- # make sure it's there so we can monkey patch
22
- require 'active_record'
23
- ActiveRecord::ConnectionAdapters::ConnectionPool
24
-
25
- # Unload it so we can redefine it completely
26
- ActiveRecord::ConnectionAdapters.send(:remove_const, :ConnectionPool)
27
-
28
- # Some require's our new definition will need
29
- require 'thread'
30
- require 'monitor'
31
- require 'set'
32
- require 'active_support/core_ext/module/deprecation'
33
-
34
- # And completely redefine ConnectionPool
35
-
36
- class ActiveRecord::ConnectionAdapters::ConnectionPool
37
- # Threadsafe, fair, FIFO queue. Meant to be used by ConnectionPool
38
- # with which it shares a Monitor. But could be a generic Queue.
39
- #
40
- # The Queue in stdlib's 'thread' could replace this class except
41
- # stdlib's doesn't support waiting with a timeout.
42
- class Queue
43
- def initialize(lock = Monitor.new)
44
- @lock = lock
45
- @cond = @lock.new_cond
46
- @num_waiting = 0
47
- @queue = []
48
- end
49
-
50
- # Test if any threads are currently waiting on the queue.
51
- def any_waiting?
52
- synchronize do
53
- @num_waiting > 0
54
- end
55
- end
56
-
57
- # Return the number of threads currently waiting on this
58
- # queue.
59
- def num_waiting
60
- synchronize do
61
- @num_waiting
62
- end
63
- end
64
-
65
- # Add +element+ to the queue. Never blocks.
66
- def add(element)
67
- synchronize do
68
- @queue.push element
69
- @cond.signal
70
- end
71
- end
72
-
73
- # If +element+ is in the queue, remove and return it, or nil.
74
- def delete(element)
75
- synchronize do
76
- @queue.delete(element)
77
- end
78
- end
79
-
80
- # Remove all elements from the queue.
81
- def clear
82
- synchronize do
83
- @queue.clear
84
- end
85
- end
86
-
87
- # Remove the head of the queue.
88
- #
89
- # If +timeout+ is not given, remove and return the head the
90
- # queue if the number of available elements is strictly
91
- # greater than the number of threads currently waiting (that
92
- # is, don't jump ahead in line). Otherwise, return nil.
93
- #
94
- # If +timeout+ is given, block if it there is no element
95
- # available, waiting up to +timeout+ seconds for an element to
96
- # become available.
97
- #
98
- # Raises:
99
- # - ConnectionTimeoutError if +timeout+ is given and no element
100
- # becomes available after +timeout+ seconds,
101
- def poll(timeout = nil)
102
- synchronize do
103
- if timeout
104
- no_wait_poll || wait_poll(timeout)
105
- else
106
- no_wait_poll
107
- end
108
- end
109
- end
110
-
111
- def num_available
112
- synchronize do
113
- @queue.size
114
- end
115
- end
116
-
117
- private
118
-
119
- def synchronize(&block)
120
- @lock.synchronize(&block)
121
- end
122
-
123
- # Test if the queue currently contains any elements.
124
- def any?
125
- !@queue.empty?
126
- end
127
-
128
- # A thread can remove an element from the queue without
129
- # waiting if an only if the number of currently available
130
- # connections is strictly greater than the number of waiting
131
- # threads.
132
- def can_remove_no_wait?
133
- @queue.size > @num_waiting
134
- end
135
-
136
- # Removes and returns the head of the queue if possible, or nil.
137
- def remove
138
- @queue.shift
139
- end
140
-
141
- # Remove and return the head the queue if the number of
142
- # available elements is strictly greater than the number of
143
- # threads currently waiting. Otherwise, return nil.
144
- def no_wait_poll
145
- remove if can_remove_no_wait?
146
- end
147
-
148
- # Waits on the queue up to +timeout+ seconds, then removes and
149
- # returns the head of the queue.
150
- def wait_poll(timeout)
151
- @num_waiting += 1
152
-
153
- t0 = Time.now
154
- elapsed = 0
155
- loop do
156
- @cond.wait(timeout - elapsed)
157
-
158
- return remove if any?
159
-
160
- elapsed = Time.now - t0
161
- raise ActiveRecord::ConnectionTimeoutError if elapsed >= timeout
162
- end
163
- ensure
164
- @num_waiting -= 1
165
- end
166
- end
167
-
168
- # Every +frequency+ seconds, the reaper will call +reap+ on +pool+.
169
- # A reaper instantiated with a nil frequency will never reap the
170
- # connection pool.
171
- #
172
- # Configure the frequency by setting "reaping_frequency" in your
173
- # database yaml file.
174
- class Reaper
175
- attr_reader :pool, :frequency
176
-
177
- def initialize(pool, frequency)
178
- @pool = pool
179
- @frequency = frequency
180
- end
181
-
182
- def run
183
- return unless frequency
184
- Thread.new(frequency, pool) { |t, p|
185
- while true
186
- sleep t
187
- p.reap
188
- end
189
- }
190
- end
191
- end
192
-
193
- include MonitorMixin
194
-
195
- attr_accessor :automatic_reconnect, :checkout_timeout, :dead_connection_timeout
196
- attr_reader :spec, :connections, :size, :reaper
197
-
198
- # Creates a new ConnectionPool object. +spec+ is a ConnectionSpecification
199
- # object which describes database connection information (e.g. adapter,
200
- # host name, username, password, etc), as well as the maximum size for
201
- # this ConnectionPool.
202
- #
203
- # The default ConnectionPool maximum size is 5.
204
- def initialize(spec)
205
- super()
206
-
207
- @spec = spec
208
-
209
- # The cache of reserved connections mapped to threads
210
- @reserved_connections = {}
211
-
212
- @checkout_timeout = spec.config[:checkout_timeout] || 5
213
- @dead_connection_timeout = spec.config[:dead_connection_timeout]
214
- @reaper = Reaper.new self, spec.config[:reaping_frequency]
215
- @reaper.run
216
-
217
- # default max pool size to 5
218
- @size = (spec.config[:pool] && spec.config[:pool].to_i) || 5
219
-
220
- @connections = []
221
- @automatic_reconnect = true
222
-
223
- @available = Queue.new self
224
- end
225
-
226
- # Hack for tests to be able to add connections. Do not call outside of tests
227
- def insert_connection_for_test!(c) #:nodoc:
228
- synchronize do
229
- @connections << c
230
- @available.add c
231
- end
232
- end
233
-
234
- # Retrieve the connection associated with the current thread, or call
235
- # #checkout to obtain one if necessary.
236
- #
237
- # #connection can be called any number of times; the connection is
238
- # held in a hash keyed by the thread id.
239
- def connection
240
- synchronize do
241
- @reserved_connections[current_connection_id] ||= checkout
242
- end
243
- end
244
-
245
- # Is there an open connection that is being used for the current thread?
246
- def active_connection?
247
- synchronize do
248
- @reserved_connections.fetch(current_connection_id) {
249
- return false
250
- }.in_use?
251
- end
252
- end
253
-
254
- # Signal that the thread is finished with the current connection.
255
- # #release_connection releases the connection-thread association
256
- # and returns the connection to the pool.
257
- def release_connection(with_id = current_connection_id)
258
- synchronize do
259
- conn = @reserved_connections.delete(with_id)
260
- checkin conn if conn
261
- end
25
+ module ActiveRecord
26
+ class Base
27
+ class << self
28
+ def forbid_implicit_checkout_for_thread!
29
+ Thread.current[:active_record_forbid_implicit_connections] = true
262
30
  end
263
31
 
264
- # If a connection already exists yield it to the block. If no connection
265
- # exists checkout a connection, yield it to the block, and checkin the
266
- # connection when finished.
267
- def with_connection
268
- connection_id = current_connection_id
269
- fresh_connection = true unless active_connection?
270
- yield connection
271
- ensure
272
- release_connection(connection_id) if fresh_connection
273
- end
32
+ def connection_with_forbid_implicit(*args, &block)
33
+ if ( Thread.current[:active_record_forbid_implicit_connections] &&
34
+ ! connection_handler.retrieve_connection_pool(self).active_connection?)
274
35
 
275
- # Returns true if a connection has already been opened.
276
- def connected?
277
- synchronize { @connections.any? }
278
- end
36
+ msg = "Implicit ActiveRecord checkout attempted when Thread :force_explicit_connections set!"
279
37
 
280
- # Disconnects all connections in the pool, and clears the pool.
281
- def disconnect!
282
- synchronize do
283
- @reserved_connections = {}
284
- @connections.each do |conn|
285
- checkin conn
286
- conn.disconnect!
38
+ # I want to make SURE I see this error in test output, even though
39
+ # in some cases my code is swallowing the exception. Unless silenced,
40
+ # probably only in the unit test of this function itself
41
+ if Rails.env.test? && (Thread.current[:ar_implicit_checkout_warning_silenced] != true)
42
+ $stderr.puts msg
287
43
  end
288
- @connections = []
289
- @available.clear
290
- end
291
- end
292
-
293
- # Clears the cache which maps classes.
294
- def clear_reloadable_connections!
295
- synchronize do
296
- @reserved_connections = {}
297
- @connections.each do |conn|
298
- checkin conn
299
- conn.disconnect! if conn.requires_reloading?
300
- end
301
- @connections.delete_if do |conn|
302
- conn.requires_reloading?
303
- end
304
- @available.clear
305
- @connections.each do |conn|
306
- @available.add conn
307
- end
308
- end
309
- end
310
44
 
311
- # clear_stale_cached imp from Rails 3.2, still using Threads.
312
- # Yes, we've created a monster.
313
- # Return any checked-out connections back to the pool by threads that
314
- # are no longer alive.
315
- def clear_stale_cached_connections!
316
- keys = @reserved_connections.keys - Thread.list.find_all { |t|
317
- t.alive?
318
- }.map { |thread| thread.object_id }
319
- keys.each do |key|
320
- conn = @reserved_connections[key]
321
- ActiveSupport::Deprecation.warn(<<-eowarn) if conn.in_use?
322
- Database connections will not be closed automatically, please close your
323
- database connection at the end of the thread by calling `close` on your
324
- connection. For example: ActiveRecord::Base.connection.close
325
- eowarn
326
- checkin conn
327
- @reserved_connections.delete(key)
45
+ raise ImplicitConnectionForbiddenError.new(msg)
328
46
  end
329
- end
47
+ connection_without_forbid_implicit(*args, &block)
48
+ end
49
+ alias_method_chain :connection, :forbid_implicit
330
50
 
331
- # Check-out a database connection from the pool, indicating that you want
332
- # to use it. You should call #checkin when you no longer need this.
333
- #
334
- # This is done by either returning and leasing existing connection, or by
335
- # creating a new connection and leasing it.
336
- #
337
- # If all connections are leased and the pool is at capacity (meaning the
338
- # number of currently leased connections is greater than or equal to the
339
- # size limit set), an ActiveRecord::PoolFullError exception will be raised.
340
- #
341
- # Returns: an AbstractAdapter object.
342
- #
343
- # Raises:
344
- # - PoolFullError: no connection can be obtained from the pool.
345
- def checkout
346
- synchronize do
347
- conn = acquire_connection
348
- conn.lease
349
- checkout_and_verify(conn)
350
- end
351
- end
352
-
353
- # Check-in a database connection back into the pool, indicating that you
354
- # no longer need this connection.
355
- #
356
- # +conn+: an AbstractAdapter object, which was obtained by earlier by
357
- # calling +checkout+ on this pool.
358
- def checkin(conn)
359
- synchronize do
360
- conn.run_callbacks :checkin do
361
- conn.expire
362
- end
363
-
364
- release conn
365
-
366
- @available.add conn
367
- end
368
- end
369
-
370
- # Remove a connection from the connection pool. The connection will
371
- # remain open and active but will no longer be managed by this pool.
372
- def remove(conn)
373
- synchronize do
374
- @connections.delete conn
375
- @available.delete conn
376
-
377
- # FIXME: we might want to store the key on the connection so that removing
378
- # from the reserved hash will be a little easier.
379
- release conn
380
-
381
- @available.add checkout_new_connection if @available.any_waiting?
382
- end
383
- end
384
-
385
- # Removes dead connections from the pool. A dead connection can occur
386
- # if a programmer forgets to close a connection at the end of a thread
387
- # or a thread dies unexpectedly.
388
- def reap
389
- synchronize do
390
- stale = Time.now - @dead_connection_timeout
391
- connections.dup.each do |conn|
392
- remove conn if conn.in_use? && stale > conn.last_use && !conn.active?
393
- end
394
- end
395
- end
396
-
397
- private
398
-
399
- # Acquire a connection by one of 1) immediately removing one
400
- # from the queue of available connections, 2) creating a new
401
- # connection if the pool is not at capacity, 3) waiting on the
402
- # queue for a connection to become available.
403
- #
404
- # Raises:
405
- # - PoolFullError if a connection could not be acquired (FIXME:
406
- # why not ConnectionTimeoutError?
407
- def acquire_connection
408
- if conn = @available.poll
409
- conn
410
- elsif @connections.size < @size
411
- checkout_new_connection
412
- else
413
- clear_stale_cached_connections!
414
-
415
- t0 = Time.now
416
-
417
- Rails.logger.info("POLLED_CHECKOUT: num avail connections: #{@available.num_available}; num waiting: #{@available.num_waiting}; total connections: #{@connections.size}")
418
- begin
419
- @available.poll(@checkout_timeout)
420
- rescue ActiveRecord::ConnectionTimeoutError
421
- msg = 'could not obtain a database connection within %0.3f seconds (waited %0.3f seconds)' %
422
- [@checkout_timeout, Time.now - t0]
423
- raise ActiveRecord::ConnectionTimeoutError, msg
424
- end
425
- end
426
- end
427
-
428
- def release(conn)
429
- thread_id = if @reserved_connections[current_connection_id] == conn
430
- current_connection_id
431
- else
432
- @reserved_connections.keys.find { |k|
433
- @reserved_connections[k] == conn
434
- }
435
- end
436
-
437
- @reserved_connections.delete thread_id if thread_id
438
- end
439
-
440
- def new_connection
441
- ActiveRecord::Base.send(spec.adapter_method, spec.config)
442
- end
443
-
444
- def current_connection_id #:nodoc:
445
- ActiveRecord::Base.connection_id ||= Thread.current.object_id
446
- end
447
-
448
- def checkout_new_connection
449
- raise ConnectionNotEstablished unless @automatic_reconnect
450
-
451
- c = new_connection
452
- c.pool = self
453
- @connections << c
454
- c
455
- end
456
-
457
- def checkout_and_verify(c)
458
- c.run_callbacks :checkout do
459
- c.verify!
460
- end
461
- c
462
- end
463
- end
464
-
465
- end
51
+ end
52
+ end
466
53
 
54
+ # We're refusing to give a connection when asked for. Same outcome
55
+ # as if the pool timed out on checkout, so let's subclass the exception
56
+ # used for that.
57
+ class ImplicitConnectionForbiddenError < ActiveRecord::ConnectionTimeoutError ; end
58
+ end
467
59