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.
- data/README.md +13 -12
- data/active_record_patch/connection_pool.rb +41 -449
- data/app/assets/javascripts/bootstrap3-typeahead.js +415 -0
- data/app/assets/javascripts/umlaut.js +8 -4
- data/app/assets/javascripts/umlaut/ajax_windows.js +15 -21
- data/app/assets/javascripts/umlaut/search_autocomplete.js +95 -90
- data/app/assets/javascripts/umlaut/update_html.js +12 -4
- data/app/assets/stylesheets/umlaut.css.scss +2 -4
- data/app/assets/stylesheets/umlaut/_az.scss +6 -6
- data/app/assets/stylesheets/umlaut/_forms.scss +21 -15
- data/app/assets/stylesheets/umlaut/_layout.scss +4 -5
- data/app/assets/stylesheets/umlaut/_misc.scss +12 -9
- data/app/assets/stylesheets/umlaut/_mixins.scss +2 -3
- data/app/assets/stylesheets/umlaut/_resolve.scss +45 -24
- data/app/assets/stylesheets/umlaut/_results.scss +7 -7
- data/app/assets/stylesheets/umlaut/_search.scss +16 -5
- data/app/assets/stylesheets/umlaut/_spinner.scss +1 -1
- data/app/assets/stylesheets/umlaut/_variables.scss +2 -2
- data/app/controllers/export_email_controller.rb +11 -4
- data/app/controllers/resolve_controller.rb +14 -30
- data/app/controllers/search_controller.rb +3 -8
- data/app/controllers/umlaut/controller_behavior.rb +30 -1
- data/app/controllers/umlaut/error_handling.rb +1 -1
- data/app/controllers/umlaut_configurable.rb +13 -10
- data/app/controllers/umlaut_controller.rb +4 -0
- data/app/helpers/emailer_helper.rb +10 -10
- data/app/helpers/export_email_helper.rb +1 -1
- data/app/helpers/resolve_helper.rb +3 -2
- data/app/helpers/search_helper.rb +26 -29
- data/app/helpers/umlaut/footer_helper.rb +4 -6
- data/app/helpers/umlaut/helper.rb +41 -7
- data/app/helpers/umlaut/url_generation.rb +10 -29
- data/app/mixin_logic/umlaut_http.rb +5 -2
- data/app/models/collection.rb +21 -6
- data/app/models/dispatched_service.rb +13 -0
- data/app/models/referent.rb +66 -88
- data/app/models/referent_value.rb +6 -5
- data/app/models/request.rb +35 -22
- data/app/models/service_response.rb +132 -66
- data/app/models/service_type_value.rb +22 -5
- data/app/models/service_wave.rb +30 -9
- data/app/models/sfx4/local/base.rb +0 -2
- data/app/models/sfx_url.rb +2 -2
- data/app/presentation/section_renderer.rb +68 -22
- data/app/service_adaptors/ajax_export.rb +1 -0
- data/app/service_adaptors/amazon.rb +7 -3
- data/app/service_adaptors/email_export.rb +1 -0
- data/app/service_adaptors/google_book_search.rb +8 -3
- data/app/service_adaptors/google_scholar_link.rb +6 -4
- data/app/service_adaptors/hathi_trust.rb +23 -18
- data/app/service_adaptors/hip_holding_search.rb +1 -1
- data/app/service_adaptors/internet_archive.rb +2 -0
- data/app/service_adaptors/isi.rb +2 -2
- data/app/service_adaptors/service.rb +31 -41
- data/app/service_adaptors/txt_holding_export.rb +3 -2
- data/app/service_adaptors/ulrichs_link.rb +5 -5
- data/app/service_adaptors/worldcat.rb +3 -1
- data/app/views/export_email/email.html.erb +10 -9
- data/app/views/export_email/send_txt.html.erb +4 -2
- data/app/views/export_email/txt.html.erb +44 -22
- data/app/views/feedback/new.html.erb +5 -5
- data/app/views/resolve/_background_progress.html.erb +23 -4
- data/app/views/resolve/_background_updater.html.erb +8 -8
- data/app/views/resolve/_citation.html.erb +11 -10
- data/app/views/resolve/_compact_citation.html.erb +3 -3
- data/app/views/resolve/_cover_image.html.erb +4 -4
- data/app/views/resolve/_fulltext.html.erb +1 -1
- data/app/views/resolve/_holding.html.erb +13 -13
- data/app/views/resolve/_manually_entered_warning.html.erb +9 -5
- data/app/views/resolve/_modal.html.erb +19 -15
- data/app/views/resolve/_search_inside.html.erb +20 -17
- data/app/views/resolve/_service_errors.html.erb +6 -6
- data/app/views/resolve/_standard_response_item.html.erb +7 -7
- data/app/views/resolve/get_permalink.html.erb +2 -2
- data/app/views/resolve/index.html.erb +13 -11
- data/app/views/search/_citation.html.erb +16 -16
- data/app/views/search/_pager.html.erb +6 -6
- data/app/views/search/books.html.erb +59 -19
- data/app/views/search/journal_search.html.erb +11 -11
- data/app/views/search/journals.html.erb +33 -33
- data/app/views/umlaut/_header.html.erb +7 -1
- data/app/views/umlaut/error.html.erb +13 -14
- data/bin/umlaut +141 -0
- data/config/locales/da.yml +122 -0
- data/config/locales/en.yml +227 -4
- data/db/orig_fixed_data/service_type_values.yml +18 -7
- data/lib/generators/templates/umlaut_services.yml +1 -1
- data/lib/generators/umlaut/install_generator.rb +0 -12
- data/lib/generators/umlaut/remove_turbolinks_generator.rb +14 -0
- data/lib/generators/umlaut_app_template.rb +37 -0
- data/lib/umlaut.rb +29 -0
- data/lib/umlaut/routes.rb +34 -38
- data/lib/umlaut/version.rb +6 -1
- data/test/dummy/app/assets/javascripts/application.js +1 -1
- data/test/dummy/app/controllers/umlaut_controller.rb +4 -2
- data/test/dummy/config/application.rb +2 -1
- data/test/dummy/config/environments/development.rb +1 -3
- data/test/dummy/config/environments/test.rb +2 -2
- data/test/dummy/config/travis_database.yml +0 -14
- data/test/dummy/config/umlaut_services.yml +9 -0
- data/test/dummy/config/umlaut_services.yml-JH +289 -0
- data/test/dummy/config/umlaut_services.yml-TEST +250 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_alerts.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_badges.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_breadcrumbs.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_button-groups.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_buttons.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_carousel.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_close.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_code.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_component-animations.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_dropdowns.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_forms.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_glyphicons.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_grid.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_input-groups.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_jumbotron.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_labels.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_list-group.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_media.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_mixins.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_modals.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_navbar.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_navs.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_normalize.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_pager.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_pagination.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_panels.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_popovers.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_print.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_progress-bars.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_responsive-embed.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_responsive-utilities.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_scaffolding.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_tables.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_thumbnails.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_tooltip.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_type.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_utilities.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_variables.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_wells.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/524eaf90d4782546823a37b80882f8b66bf73010/_admin.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/524eaf90d4782546823a37b80882f8b66bf73010/_az.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/524eaf90d4782546823a37b80882f8b66bf73010/_forms.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/524eaf90d4782546823a37b80882f8b66bf73010/_icons.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/524eaf90d4782546823a37b80882f8b66bf73010/_layout.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/524eaf90d4782546823a37b80882f8b66bf73010/_misc.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/524eaf90d4782546823a37b80882f8b66bf73010/_mixins.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/524eaf90d4782546823a37b80882f8b66bf73010/_modal.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/524eaf90d4782546823a37b80882f8b66bf73010/_resolve.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/524eaf90d4782546823a37b80882f8b66bf73010/_results.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/524eaf90d4782546823a37b80882f8b66bf73010/_search.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/524eaf90d4782546823a37b80882f8b66bf73010/_spinner.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/524eaf90d4782546823a37b80882f8b66bf73010/_variables.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/6e589d45ad6dae7b9687fd7eac1156e517932854/_bootstrap-sprockets.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/6e589d45ad6dae7b9687fd7eac1156e517932854/bootstrap.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/dc1017bdbb6af49581dc35eda2911a13c557c111/umlaut.css.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_alerts.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_background-variant.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_border-radius.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_buttons.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_center-block.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_clearfix.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_forms.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_gradients.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_grid-framework.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_grid.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_hide-text.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_image.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_labels.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_list-group.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_nav-divider.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_nav-vertical-align.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_opacity.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_pagination.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_panels.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_progress-bar.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_reset-filter.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_resize.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_responsive-visibility.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_size.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_tab-focus.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_table-row.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_text-emphasis.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_text-overflow.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_vendor-prefixes.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/00fe8b9f2a1f7a1c312f627c379f5a50 +0 -0
- data/test/dummy/tmp/cache/assets/{DCB/620/sprockets%2F2332a294ceeab3ab9b5ee643989dc0eb → development/sprockets/04757b33bf029a112819cf86c6e899db} +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/0bdc06801d1626641264f7c81f0bb383 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/1365f0b692ced0628311ee4566e1b707 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/test/dummy/tmp/cache/assets/{C99/040/sprockets%2F84d95490d4855608b8dd8602192f4f9c → development/sprockets/19f5d7a61a156ff3b78882b11cc679dc} +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/1b2d587ae29ea4eaabb3bab0f022f3d3 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/1d9ea1c7ecfa0067960ac916ce4b65ca +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/1e127abfd1414d0de67e3d78570c8195 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/22a2e14590ab60250be8e55802e0416b +0 -0
- data/test/dummy/tmp/cache/assets/{D72/1E0/sprockets%2Fdee77a9fb00d0a6229fd6b54a8f14197 → development/sprockets/29512f3dcf5161d055eb24ebcaaf8613} +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/2b31649bad46580f69b4c7283d75d7da +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/2b6799917cb806635bb25ceb87199288 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/2dcbebcad08aa99d46c19c8dceebc0e8 +0 -0
- data/test/dummy/tmp/cache/assets/{DD1/120/sprockets%2Fbee5967b8282dab9fce5c242bcc14c55 → development/sprockets/2e10962ed25d5e106895b21500eed819} +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/2e7a2009e7fa93a461d747b153241335 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/2edf520c0d6a5e6fe31a96ff6249deb3 +0 -0
- data/test/dummy/tmp/cache/assets/{DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 → development/sprockets/2f5173deea6c795b8fdde723bb4b63af} +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/33effed14152fbf68a290dc9bfdacc49 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/362ddf5dec149d8860307be28f1b6aba +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/3bb0e2c4964797a92ce18c9265d7c35d +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/3de79b672a2a13cc1a0ecdb4f14087b6 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/4059619b2636e7c20d35170dfe625a63 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/43cc6f487d302bad3c176fb117bc8790 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/4c4d82da23f69029b0c8346855f2effe +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/4e00e47769496546d5560ba11077191e +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/4ed3382d5f8738e189d0fb787a29e487 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/50e6046f30d33ebf382887de6500721f +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/5488b82c680f30f6fd6e237c86e7887a +0 -0
- data/test/dummy/tmp/cache/assets/{C9D/060/sprockets%2F5c8956a1666824a1d214531abd22e2a2 → development/sprockets/56381d00a030c7822e9a88c9ddae434f} +0 -0
- data/test/dummy/tmp/cache/assets/{D17/BC0/sprockets%2F1ae6578a93a7a3d848319dea314f592d → development/sprockets/5bdde916a6e5824d9c695657aaada893} +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/5d7a36094a81c5e13f8603581fdcd0a0 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/62df0d3ba0011b6ebf283e9e4fd33a59 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/685077a71b34728322a6a3df7a818f16 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/74007643206dfef480fe67a4ee6a5af9 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/747ce3a1a163cd0edc663342abb508c8 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/7752e1fdfeb11e34353bb24822e8eddc +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/7ab84c0db002136373ac7278f78e4d69 +0 -0
- data/test/dummy/tmp/cache/assets/{D65/820/sprockets%2Fae5318865ebb4a2b74e84c0e13fb921a → development/sprockets/80f1a2af00dac454055d31d97fa9ea16} +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/827f39ace148dd5b450c5b5c4f7b7407 +0 -0
- data/test/dummy/tmp/cache/assets/{DEF/A60/sprockets%2F3fddcee3e5dbd24f28de1001e5f3a009 → development/sprockets/84bda1ce77f140dbe330abbb9654a389} +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/91cf221e4f31c9b0e394d61e76e383a6 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/91fc9ce33c0477ac8e5c38f43ace64f3 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/984eb5d6325666ea28ac61b8f00bbf96 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/a5ca1b208ac1648c9233a4f82231cc9d +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/b0644dc48561692b74e67cfa49f1fccc +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/b45832a1ef97f445005b6a5ed08ad4e1 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/b57b9a3152cba1d2ce51c8890cd2c069 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/bf432dfd03a3577b6fecab95f67d3e10 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/c10ba9d7ca59eade850d472f4620e679 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/c127c56dd327b8471950e4e4eb774d58 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/c4883e8efaaa0dd40101433793d62dd0 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/ccb8dacf69b5ea6e8638d5659f87e93b +0 -0
- data/test/dummy/tmp/cache/assets/{E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af → development/sprockets/cffd775d018f68ce5dba1ee0d951a994} +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/d06b36a24841048e094f62c017a0e23c +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/d40077dd950a280248a90c9cd9bf1171 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/d49649ea0360b8433251241f77ab88c1 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/d6a0c8ca3c8a8f1bde4550db740138b8 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/d81f215f779ce2609d4dfa76b02df41c +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/de3f87130aaf9847386d1f5e5c9893f1 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/dea953187fcf46b6d47f7653acc099c6 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/e1bf78affc4ede54eac4249af8f16e82 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/eaff4713f011dd8b1946264e8f120fb6 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/ef4a528b7df4e9417e42bc5aaf40ef9b +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/f6be26089ea600503193ac4a8119a33b +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_alerts.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_badges.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_breadcrumbs.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_button-groups.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_buttons.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_carousel.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_close.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_code.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_component-animations.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_dropdowns.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_forms.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_glyphicons.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_grid.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_input-groups.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_jumbotron.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_labels.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_list-group.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_media.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_mixins.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_modals.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_navbar.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_navs.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_normalize.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_pager.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_pagination.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_panels.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_popovers.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_print.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_progress-bars.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_responsive-embed.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_responsive-utilities.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_scaffolding.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_tables.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_thumbnails.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_tooltip.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_type.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_utilities.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_variables.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/05e2dc436ff96d50f418a3e756bafafe98e914ae/_wells.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_alerts.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_badges.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_breadcrumbs.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_button-groups.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_buttons.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_carousel.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_close.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_code.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_component-animations.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_dropdowns.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_forms.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_glyphicons.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_grid.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_input-groups.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_jumbotron.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_labels.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_list-group.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_media.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_mixins.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_modals.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_navbar.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_navs.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_normalize.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_pager.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_pagination.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_panels.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_popovers.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_print.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_progress-bars.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_responsive-embed.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_responsive-utilities.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_scaffolding.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_tables.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_thumbnails.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_tooltip.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_type.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_utilities.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_variables.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/17fd8969872067ebc37af75de84fcc03527156bc/_wells.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/524eaf90d4782546823a37b80882f8b66bf73010/_admin.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/524eaf90d4782546823a37b80882f8b66bf73010/_az.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/524eaf90d4782546823a37b80882f8b66bf73010/_forms.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/524eaf90d4782546823a37b80882f8b66bf73010/_icons.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/524eaf90d4782546823a37b80882f8b66bf73010/_layout.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/524eaf90d4782546823a37b80882f8b66bf73010/_misc.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/524eaf90d4782546823a37b80882f8b66bf73010/_mixins.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/524eaf90d4782546823a37b80882f8b66bf73010/_modal.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/524eaf90d4782546823a37b80882f8b66bf73010/_resolve.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/524eaf90d4782546823a37b80882f8b66bf73010/_results.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/524eaf90d4782546823a37b80882f8b66bf73010/_search.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/524eaf90d4782546823a37b80882f8b66bf73010/_spinner.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/524eaf90d4782546823a37b80882f8b66bf73010/_variables.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/6e589d45ad6dae7b9687fd7eac1156e517932854/_bootstrap-sprockets.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/6e589d45ad6dae7b9687fd7eac1156e517932854/bootstrap.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_alerts.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_background-variant.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_border-radius.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_buttons.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_center-block.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_clearfix.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_forms.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_gradients.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_grid-framework.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_grid.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_hide-text.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_image.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_labels.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_list-group.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_nav-divider.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_nav-vertical-align.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_opacity.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_pagination.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_panels.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_progress-bar.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_reset-filter.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_resize.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_responsive-visibility.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_size.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_tab-focus.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_table-row.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_text-emphasis.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_text-overflow.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/881c1ba03280ae14123609245e8314b2ba917406/_vendor-prefixes.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/d66be29359c981abd965733fad9a31a018759486/_bootstrap-sprockets.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/d66be29359c981abd965733fad9a31a018759486/_bootstrap.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/dc1017bdbb6af49581dc35eda2911a13c557c111/umlaut.css.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_alerts.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_background-variant.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_border-radius.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_buttons.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_center-block.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_clearfix.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_forms.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_gradients.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_grid-framework.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_grid.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_hide-text.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_image.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_labels.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_list-group.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_nav-divider.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_nav-vertical-align.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_opacity.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_pagination.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_panels.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_progress-bar.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_reset-filter.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_resize.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_responsive-visibility.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_size.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_tab-focus.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_table-row.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_text-emphasis.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_text-overflow.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/f8ee09d7b9a6023c8ba1b1569df57c6a072dd36e/_vendor-prefixes.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/00fe8b9f2a1f7a1c312f627c379f5a50 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/04757b33bf029a112819cf86c6e899db +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/1a72ab0727d6b1c53a2425bce68ccd29 +0 -0
- data/test/dummy/tmp/cache/assets/{D02/B30/sprockets%2Fb9332ebd1d306cc9120a386ca986034d → test/sprockets/1b2d587ae29ea4eaabb3bab0f022f3d3} +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/1d9ea1c7ecfa0067960ac916ce4b65ca +0 -0
- data/test/dummy/tmp/cache/assets/{D65/0D0/sprockets%2F9fd0b369f009be410bdb0b6e5458b3a6 → test/sprockets/1e127abfd1414d0de67e3d78570c8195} +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/204c5ef815c91ad1dba36952ada84453 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/29512f3dcf5161d055eb24ebcaaf8613 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/2b31649bad46580f69b4c7283d75d7da +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/2b6799917cb806635bb25ceb87199288 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/2dcbebcad08aa99d46c19c8dceebc0e8 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/2e10962ed25d5e106895b21500eed819 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/2e7a2009e7fa93a461d747b153241335 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/300b3cf1812a5e2ba89266b8198caf8c +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/3bb0e2c4964797a92ce18c9265d7c35d +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/3de79b672a2a13cc1a0ecdb4f14087b6 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/4059619b2636e7c20d35170dfe625a63 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/42d8221eac1dc91b1c055df56147f009 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/43bdfbe7d60eec9cab5eda9af30fae29 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/43cc6f487d302bad3c176fb117bc8790 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/4403ea9870ef12ff2940eb16ee72aefd +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/4c4d82da23f69029b0c8346855f2effe +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/4e00e47769496546d5560ba11077191e +0 -0
- data/test/dummy/tmp/cache/assets/{DAB/C70/sprockets%2Ff8ac0db14f84bce083a7c58f965e806f → test/sprockets/4ed3382d5f8738e189d0fb787a29e487} +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/50e6046f30d33ebf382887de6500721f +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/5488b82c680f30f6fd6e237c86e7887a +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/58901a70c4225a06a7b7402515a9b987 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/5bdde916a6e5824d9c695657aaada893 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/5d7a36094a81c5e13f8603581fdcd0a0 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/62df0d3ba0011b6ebf283e9e4fd33a59 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/641d193a017d5c7220a38ee54b714fa3 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/65c94ad4022a7bb639254a1716375313 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/661a6079c9ca1cbcf6215e9113867d30 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/685077a71b34728322a6a3df7a818f16 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/74007643206dfef480fe67a4ee6a5af9 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/747ce3a1a163cd0edc663342abb508c8 +0 -0
- data/test/dummy/tmp/cache/assets/{D47/690/sprockets%2Fd92186d33469ff2bd01ba096f33dfd78 → test/sprockets/7752e1fdfeb11e34353bb24822e8eddc} +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/7ab84c0db002136373ac7278f78e4d69 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/80f1a2af00dac454055d31d97fa9ea16 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/84bda1ce77f140dbe330abbb9654a389 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/91cf221e4f31c9b0e394d61e76e383a6 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/91fc9ce33c0477ac8e5c38f43ace64f3 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/9424bf97ebe97817bf589d5409eb1b49 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/97197c94037eb886f290e1db6db71839 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/984eb5d6325666ea28ac61b8f00bbf96 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/9e9540a6ef6178fdc44134b8170b9104 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/a4605dfa1ec12c0c0a5fa6149836e146 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/a5ca1b208ac1648c9233a4f82231cc9d +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/a8ae1c833918295d04a2921439ec6dda +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/b0644dc48561692b74e67cfa49f1fccc +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/b45832a1ef97f445005b6a5ed08ad4e1 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/b530e8eed86f8a06c34ebfba012ced9f +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/bbff1f14224b48e4d838bcfb3ed8a610 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/c10ba9d7ca59eade850d472f4620e679 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/c127c56dd327b8471950e4e4eb774d58 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/c4883e8efaaa0dd40101433793d62dd0 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/c696c2db7d8317ca35a7243d8bd4f3b2 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/ccb8dacf69b5ea6e8638d5659f87e93b +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/d40077dd950a280248a90c9cd9bf1171 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/d49649ea0360b8433251241f77ab88c1 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/d6a0c8ca3c8a8f1bde4550db740138b8 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/db71108aa3843a309c5247dd6481dd12 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/dd484b056ce971aa93a7b69c6ec28fb3 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/de3f87130aaf9847386d1f5e5c9893f1 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/dea953187fcf46b6d47f7653acc099c6 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/df2a44cb5db91d63eb01e3d4a1673b75 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/e1bf78affc4ede54eac4249af8f16e82 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/e776d52f6ae606355fa1070b2eb7825b +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/eaff4713f011dd8b1946264e8f120fb6 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/f6be26089ea600503193ac4a8119a33b +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/test/functional/feedback_controller_test.rb +1 -1
- data/test/functional/resolve_controller_test-NOFIXTURES.rb +227 -0
- data/test/functional/resolve_controller_test.rb +155 -14
- data/test/functional/search_controller_test.rb +1 -1
- data/test/helper/list_with_limit_test.rb +11 -0
- data/test/test_helper.rb +63 -26
- data/test/unit/active_record_connection_pool_test.rb +43 -25
- data/test/unit/aws_product_sign_test.rb +3 -3
- data/test/unit/collection_test.rb +39 -3
- data/test/unit/determine_services_test.rb +11 -11
- data/test/unit/dispatched_service_test.rb +16 -0
- data/test/unit/dissertation_catch_test.rb +1 -2
- data/test/unit/google_book_search_test.rb +6 -8
- data/test/unit/internet_archive_test.rb +6 -5
- data/test/unit/permalink_test.rb +4 -2
- data/test/unit/referent_test.rb +60 -0
- data/test/unit/referent_to_citation_test.rb +29 -2
- data/test/unit/request_test.rb +48 -0
- data/test/unit/service_response_test.rb +63 -4
- data/test/unit/service_test.rb +35 -5
- data/test/unit/service_type_value_test.rb +25 -0
- data/test/unit/sfx4_search_test.rb +1 -1
- data/test/unit/sfx_test.rb +4 -2
- data/test/unit/worldcat_test.rb +1 -3
- data/test/vcr_cassettes/collection/live_dispatch.yml +311 -0
- data/test/vcr_cassettes/sfx/nytimes_by_issn.yml +1 -1
- metadata +831 -145
- data/app/controllers/search_methods/sfx4_solr/README.md +0 -57
- data/app/controllers/search_methods/sfx4_solr/local.rb +0 -40
- data/app/controllers/search_methods/sfx4_solr/searcher.rb +0 -118
- data/app/models/sfx4/global/base.rb +0 -24
- data/app/models/sfx4/global/kb_objects.rb +0 -34
- data/app/views/search/opensearch_description.rxml +0 -10
- data/lib/service_adaptors/README.md +0 -0
- data/test/dummy/db/migrate/20120927163304_sfx4_global.rb +0 -26
- data/test/dummy/tmp/cache/assets/BFF/760/sprockets%2Fe00969069e468419c393709f042b4527 +0 -0
- data/test/dummy/tmp/cache/assets/CC7/D80/sprockets%2F62a4c21a1d5bac4064e25082f523f238 +0 -0
- data/test/dummy/tmp/cache/assets/CC8/C70/sprockets%2F397590f867a06c2d0595c75ed4269e9b +0 -0
- data/test/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
- data/test/dummy/tmp/cache/assets/CE3/1F0/sprockets%2F9a3b0380fe964d77f0013845d3d355fd +0 -0
- data/test/dummy/tmp/cache/assets/CE7/FA0/sprockets%2F98df08987c1b5c0f643a21538a7182ec +0 -0
- data/test/dummy/tmp/cache/assets/CEA/930/sprockets%2F42ebf67295336dfb5725a8bb12881a98 +0 -0
- data/test/dummy/tmp/cache/assets/D15/FC0/sprockets%2F8cbf3a8b7acb7fc27a42168846226385 +0 -0
- data/test/dummy/tmp/cache/assets/D2D/240/sprockets%2F6610ec2488ff4a57d54efb798f1a9994 +0 -0
- data/test/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/test/dummy/tmp/cache/assets/D33/2C0/sprockets%2F790e9527eead8b020b92b34dc6a600d2 +0 -0
- data/test/dummy/tmp/cache/assets/D38/930/sprockets%2F45cee52fe11df0057793a6751aa65a4c +0 -0
- data/test/dummy/tmp/cache/assets/D39/B30/sprockets%2Fcb7b9f6963b829c678ff9267c63577ce +0 -0
- data/test/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/test/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/test/dummy/tmp/cache/assets/D5F/690/sprockets%2Febe18c52ead548a955a1f2be191130b3 +0 -0
- data/test/dummy/tmp/cache/assets/D6A/A80/sprockets%2F22d5d4e74a9a3f3deb5a92704ae750f3 +0 -0
- data/test/dummy/tmp/cache/assets/D6B/020/sprockets%2Ffba640f8143fc0c24e3e6616e2eb93a9 +0 -0
- data/test/dummy/tmp/cache/assets/D6B/8C0/sprockets%2Fa0dc07225af433e77fd6a9028a8e3c6e +0 -0
- data/test/dummy/tmp/cache/assets/D98/990/sprockets%2F710ede3e7f5ebab14e9772fa88c00c02 +0 -0
- data/test/dummy/tmp/cache/assets/DAD/BA0/sprockets%2F193f81f7e4eae26eaaa7d909c0c8e956 +0 -0
- data/test/dummy/tmp/cache/assets/DD6/010/sprockets%2F15a8fcbaccc97804fce2ee514e371f79 +0 -0
- data/test/dummy/tmp/cache/assets/E2E/350/sprockets%2Fbea81b7c4fdf19664eff44b21ea53dbe +0 -0
- data/test/dummy/tmp/cache/assets/EF1/680/sprockets%2Fed8ede7dea4bd22aacb9584fbe7d6cad +0 -0
- data/test/fixtures/sfx4/global/KB_OBJECTS.yml +0 -46
- data/test/integration/request_test.rb +0 -25
- data/test/performance/browsing_test.rb +0 -9
- data/test/unit/sfx4_solr_search_test.rb +0 -81
- data/test/vcr_cassettes/resolve/fulltext_with_edition_warning.yml +0 -44
- data/test/vcr_cassettes/resolve/manually_entered.yml +0 -84
- data/test/vcr_cassettes/resolve/no_holdings.yml +0 -649
- data/test/vcr_cassettes/resolve/nytimes_by_issn.yml +0 -224
- data/test/vcr_cassettes/sfx4_solr/find_by_group.yml +0 -125
- data/test/vcr_cassettes/sfx4_solr/find_by_title_begins_with.yml +0 -71
- data/test/vcr_cassettes/sfx4_solr/find_by_title_contains.yml +0 -72
- 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.
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
*
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
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
|
-
|
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
|
-
#
|
4
|
-
# connections from each other, so some threads get starved out.
|
3
|
+
# Monkey patch to ActiveRecord to prevent 'implicit' checkouts.
|
5
4
|
#
|
6
|
-
#
|
7
|
-
#
|
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
|
-
#
|
10
|
-
#
|
11
|
-
#
|
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
|
-
#
|
14
|
-
#
|
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
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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
|
-
|
265
|
-
|
266
|
-
|
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
|
-
|
276
|
-
def connected?
|
277
|
-
synchronize { @connections.any? }
|
278
|
-
end
|
36
|
+
msg = "Implicit ActiveRecord checkout attempted when Thread :force_explicit_connections set!"
|
279
37
|
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
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
|
-
|
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
|
-
|
47
|
+
connection_without_forbid_implicit(*args, &block)
|
48
|
+
end
|
49
|
+
alias_method_chain :connection, :forbid_implicit
|
330
50
|
|
331
|
-
|
332
|
-
|
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
|
|