umlaut 3.3.1 → 4.0.0.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +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
|
|