umlaut 3.1.0 → 3.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (189) hide show
  1. data/app/controllers/resolve_controller.rb +15 -1
  2. data/app/controllers/search_methods/sfx4.rb +6 -2
  3. data/app/controllers/search_methods/sfx4_solr/searcher.rb +31 -3
  4. data/app/service_adaptors/bx.rb +1 -3
  5. data/app/service_adaptors/sfx.rb +175 -175
  6. data/lib/umlaut/version.rb +1 -1
  7. data/test/dummy/tmp/cache/assets/BFF/760/sprockets%2Fe00969069e468419c393709f042b4527 +0 -0
  8. data/test/dummy/tmp/cache/assets/C99/040/sprockets%2F84d95490d4855608b8dd8602192f4f9c +0 -0
  9. data/test/dummy/tmp/cache/assets/{DE8/790/sprockets%2Fd1333bde2b9aafcc712d11dd09ab35d8 → C9D/060/sprockets%2F5c8956a1666824a1d214531abd22e2a2} +0 -0
  10. data/test/dummy/tmp/cache/assets/CC7/D80/sprockets%2F62a4c21a1d5bac4064e25082f523f238 +0 -0
  11. data/test/dummy/tmp/cache/assets/CC8/C70/sprockets%2F397590f867a06c2d0595c75ed4269e9b +0 -0
  12. data/test/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
  13. data/test/dummy/tmp/cache/assets/{D9A/2F0/sprockets%2Fbba0f4b972dc53c15ce6c8c1993b82a4 → CE3/1F0/sprockets%2F9a3b0380fe964d77f0013845d3d355fd} +0 -0
  14. data/test/dummy/tmp/cache/assets/{CC7/F10/sprockets%2F939637f806eef3f0f21584659458ab2e → CE7/FA0/sprockets%2F98df08987c1b5c0f643a21538a7182ec} +0 -0
  15. data/test/dummy/tmp/cache/assets/CEA/930/sprockets%2F42ebf67295336dfb5725a8bb12881a98 +0 -0
  16. data/test/dummy/tmp/cache/assets/{C49/730/sprockets%2F212d35831188417b5131e3e693aa69a6 → D02/B30/sprockets%2Fb9332ebd1d306cc9120a386ca986034d} +0 -0
  17. data/test/dummy/tmp/cache/assets/D15/FC0/sprockets%2F8cbf3a8b7acb7fc27a42168846226385 +0 -0
  18. data/test/dummy/tmp/cache/assets/{DF7/960/sprockets%2F99ac6db10b44a64fbba4ee847b35ba8b → D17/BC0/sprockets%2F1ae6578a93a7a3d848319dea314f592d} +0 -0
  19. data/test/dummy/tmp/cache/assets/{E02/C10/sprockets%2F1463cadfce3fc70e61d482f9fcb75ac7 → D2D/240/sprockets%2F6610ec2488ff4a57d54efb798f1a9994} +0 -0
  20. data/test/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  21. data/test/dummy/tmp/cache/assets/D33/2C0/sprockets%2F790e9527eead8b020b92b34dc6a600d2 +0 -0
  22. data/test/dummy/tmp/cache/assets/{BBA/6A0/sprockets%2F2a335471966f33256b321f8324041981 → D38/930/sprockets%2F45cee52fe11df0057793a6751aa65a4c} +0 -0
  23. data/test/dummy/tmp/cache/assets/D39/B30/sprockets%2Fcb7b9f6963b829c678ff9267c63577ce +0 -0
  24. data/test/dummy/tmp/cache/assets/D47/690/sprockets%2Fd92186d33469ff2bd01ba096f33dfd78 +0 -0
  25. data/test/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
  26. data/test/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
  27. data/test/dummy/tmp/cache/assets/{C5A/A80/sprockets%2F2328c7370b56b4151776981a5f6d394e → D5F/690/sprockets%2Febe18c52ead548a955a1f2be191130b3} +0 -0
  28. data/test/dummy/tmp/cache/assets/{C70/4D0/sprockets%2F034ad2036e623081bd352800786dfe80 → D65/0D0/sprockets%2F9fd0b369f009be410bdb0b6e5458b3a6} +0 -0
  29. data/test/dummy/tmp/cache/assets/{E5E/5F0/sprockets%2Feffaeb4d7f9bf4c0cc840ff320fde046 → D65/820/sprockets%2Fae5318865ebb4a2b74e84c0e13fb921a} +0 -0
  30. data/test/dummy/tmp/cache/assets/D6A/A80/sprockets%2F22d5d4e74a9a3f3deb5a92704ae750f3 +0 -0
  31. data/test/dummy/tmp/cache/assets/{D9C/860/sprockets%2Fec2d9f20b270d70e698ff33e53c21fca → D6B/020/sprockets%2Ffba640f8143fc0c24e3e6616e2eb93a9} +0 -0
  32. data/test/dummy/tmp/cache/assets/D6B/8C0/sprockets%2Fa0dc07225af433e77fd6a9028a8e3c6e +0 -0
  33. data/test/dummy/tmp/cache/assets/D72/1E0/sprockets%2Fdee77a9fb00d0a6229fd6b54a8f14197 +0 -0
  34. data/test/dummy/tmp/cache/assets/D98/990/sprockets%2F710ede3e7f5ebab14e9772fa88c00c02 +0 -0
  35. data/test/dummy/tmp/cache/assets/{D6E/CF0/sprockets%2F5661c6e4f0cea86fe4523f27261aade5 → DAB/C70/sprockets%2Ff8ac0db14f84bce083a7c58f965e806f} +0 -0
  36. data/test/dummy/tmp/cache/assets/DAD/BA0/sprockets%2F193f81f7e4eae26eaaa7d909c0c8e956 +0 -0
  37. data/test/dummy/tmp/cache/assets/{D37/2B0/sprockets%2F40834fb07d7318c1fddd5003bd9e04f6 → DCB/620/sprockets%2F2332a294ceeab3ab9b5ee643989dc0eb} +0 -0
  38. data/test/dummy/tmp/cache/assets/{DB6/ED0/sprockets%2Ff4482d9b9f76fb65eef16430bde2f8e6 → DD1/120/sprockets%2Fbee5967b8282dab9fce5c242bcc14c55} +0 -0
  39. data/test/dummy/tmp/cache/assets/DD6/010/sprockets%2F15a8fcbaccc97804fce2ee514e371f79 +0 -0
  40. data/test/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
  41. data/test/dummy/tmp/cache/assets/DEF/A60/sprockets%2F3fddcee3e5dbd24f28de1001e5f3a009 +0 -0
  42. data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  43. data/test/dummy/tmp/cache/assets/{E50/F00/sprockets%2Fec61afdbb1cc4df075e3dad46f0af571 → E2E/350/sprockets%2Fbea81b7c4fdf19664eff44b21ea53dbe} +0 -0
  44. data/test/dummy/tmp/cache/assets/{DA9/BC0/sprockets%2Fcb9062b73291befe5e5bf2a70978dec8 → EF1/680/sprockets%2Fed8ede7dea4bd22aacb9584fbe7d6cad} +0 -0
  45. data/test/dummy/tmp/cache/sass/b43409235ed55124ccf6a0235156711682d0fe98/umlaut.css.scssc +0 -0
  46. data/test/dummy/tmp/cache/sass/{93d65682d6bddb0b2e6788c1232f4849af20a35e → d2b87393a9fcb33d01e765e1c09b76db7f14f647}/bootstrap-responsive.scssc +0 -0
  47. data/test/dummy/tmp/cache/sass/{93d65682d6bddb0b2e6788c1232f4849af20a35e → d2b87393a9fcb33d01e765e1c09b76db7f14f647}/bootstrap.scssc +0 -0
  48. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_accordion.scssc +0 -0
  49. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_alerts.scssc +0 -0
  50. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_breadcrumbs.scssc +0 -0
  51. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_button-groups.scssc +0 -0
  52. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_buttons.scssc +0 -0
  53. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_carousel.scssc +0 -0
  54. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_close.scssc +0 -0
  55. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_code.scssc +0 -0
  56. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_component-animations.scssc +0 -0
  57. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_dropdowns.scssc +0 -0
  58. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_forms.scssc +0 -0
  59. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_grid.scssc +0 -0
  60. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_hero-unit.scssc +0 -0
  61. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_labels-badges.scssc +0 -0
  62. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_layouts.scssc +0 -0
  63. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_media.scssc +0 -0
  64. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_mixins.scssc +0 -0
  65. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_modals.scssc +0 -0
  66. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_navbar.scssc +0 -0
  67. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_navs.scssc +0 -0
  68. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_pager.scssc +0 -0
  69. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_pagination.scssc +0 -0
  70. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_popovers.scssc +0 -0
  71. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_progress-bars.scssc +0 -0
  72. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_reset.scssc +0 -0
  73. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_responsive-1200px-min.scssc +0 -0
  74. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_responsive-767px-max.scssc +0 -0
  75. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_responsive-768px-979px.scssc +0 -0
  76. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_responsive-navbar.scssc +0 -0
  77. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_responsive-utilities.scssc +0 -0
  78. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_scaffolding.scssc +0 -0
  79. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_sprites.scssc +0 -0
  80. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_tables.scssc +0 -0
  81. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_thumbnails.scssc +0 -0
  82. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_tooltip.scssc +0 -0
  83. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_type.scssc +0 -0
  84. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_utilities.scssc +0 -0
  85. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_variables.scssc +0 -0
  86. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/_wells.scssc +0 -0
  87. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/bootstrap.scssc +0 -0
  88. data/test/dummy/tmp/cache/sass/{310d901c169042855feb8cf3903e1e2821d27f13 → db21ae7b0d8da2224e8e1d588985ee0507dc926a}/responsive.scssc +0 -0
  89. data/test/dummy/tmp/cache/sass/{3af72421a0fbed39d3047687ca0ad6e6e5545041 → fc140da5c32e19b5c3f84a23bb2383ebc83fcc20}/_admin.scssc +0 -0
  90. data/test/dummy/tmp/cache/sass/{3af72421a0fbed39d3047687ca0ad6e6e5545041 → fc140da5c32e19b5c3f84a23bb2383ebc83fcc20}/_az.scssc +0 -0
  91. data/test/dummy/tmp/cache/sass/{3af72421a0fbed39d3047687ca0ad6e6e5545041 → fc140da5c32e19b5c3f84a23bb2383ebc83fcc20}/_forms.scssc +0 -0
  92. data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_icons.scssc +0 -0
  93. data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_layout.scssc +0 -0
  94. data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_misc.scssc +0 -0
  95. data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_mixins.scssc +0 -0
  96. data/test/dummy/tmp/cache/sass/{3af72421a0fbed39d3047687ca0ad6e6e5545041 → fc140da5c32e19b5c3f84a23bb2383ebc83fcc20}/_modal.scssc +0 -0
  97. data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_resolve.scssc +0 -0
  98. data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_results.scssc +0 -0
  99. data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_search.scssc +0 -0
  100. data/test/dummy/tmp/cache/sass/{3af72421a0fbed39d3047687ca0ad6e6e5545041 → fc140da5c32e19b5c3f84a23bb2383ebc83fcc20}/_spinner.scssc +0 -0
  101. data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_variables.scssc +0 -0
  102. data/test/fixtures/permalinks.yml +1 -1
  103. data/test/fixtures/referent_values.yml +107 -85
  104. data/test/fixtures/referents.yml +10 -9
  105. data/test/fixtures/requests.yml +10 -14
  106. data/test/fixtures/service_responses.yml +12 -12
  107. data/test/functional/resolve_controller_test.rb +23 -1
  108. data/test/test_helper.rb +1 -0
  109. data/test/unit/README.md +126 -0
  110. data/test/unit/bx_test.rb +39 -0
  111. data/test/unit/collection_test.rb +1 -1
  112. data/test/unit/service_test.rb +1 -1
  113. data/test/unit/sfx4_solr_search_test.rb +9 -5
  114. data/test/unit/sfx_test.rb +1 -0
  115. data/test/vcr_cassettes/bx/article_that_has_recommendations.yml +65 -0
  116. data/test/vcr_cassettes/sfx4_solr/find_by_group.yml +108 -92
  117. data/test/vcr_cassettes/sfx4_solr/find_by_title_begins_with.yml +52 -14
  118. data/test/vcr_cassettes/sfx4_solr/find_by_title_contains.yml +53 -15
  119. data/test/vcr_cassettes/sfx4_solr/find_by_title_exact.yml +17 -13
  120. metadata +536 -566
  121. checksums.yaml +0 -15
  122. data/app/assets/stylesheets/umlaut/_expand_contract.scss +0 -10
  123. data/app/controllers/journal_tocs_controller +0 -90
  124. data/app/models/service_store.rb-NEW +0 -73
  125. data/app/service_adaptors/tr_link.rb +0 -267
  126. data/app/service_adaptors/tr_links.rb +0 -278
  127. data/lib/tasks/Untitled-1 +0 -8
  128. data/test/dummy/config/umlaut_services-JH.yml +0 -223
  129. data/test/dummy/config/umlaut_services-TEST.yml +0 -37
  130. data/test/dummy/tmp/cache/assets/C2A/410/sprockets%2Fd654b74912b4773a2534616863fb6565 +0 -0
  131. data/test/dummy/tmp/cache/assets/C45/A30/sprockets%2F39494895e462697b478d3d0c79298a26 +0 -0
  132. data/test/dummy/tmp/cache/assets/C55/1D0/sprockets%2F5af2f2a3403040f736981863fd278529 +0 -0
  133. data/test/dummy/tmp/cache/assets/C5F/340/sprockets%2F99692920160b7a279b86a80415b79db7 +0 -0
  134. data/test/dummy/tmp/cache/assets/C80/980/sprockets%2Fc94807409c1523d43e18d25f35d93c41 +0 -0
  135. data/test/dummy/tmp/cache/assets/C94/E20/sprockets%2F19579abc248373f419b1c3e287d74598 +0 -0
  136. data/test/dummy/tmp/cache/assets/C98/330/sprockets%2F0c81574ba94abc10657315d4190c201f +0 -0
  137. data/test/dummy/tmp/cache/assets/CA4/440/sprockets%2F0feb4425db6319d7d0582192a503671b +0 -0
  138. data/test/dummy/tmp/cache/assets/CA7/E80/sprockets%2F33310f455a870eaedd6d938e30620714 +0 -0
  139. data/test/dummy/tmp/cache/assets/CB8/3C0/sprockets%2F697cd846490fda9f0e20c558320610f8 +0 -0
  140. data/test/dummy/tmp/cache/assets/CBD/730/sprockets%2F034c1086748b981c36672d5a56e7fed6 +0 -0
  141. data/test/dummy/tmp/cache/assets/CBF/B60/sprockets%2F08ca89671549936265dcb673bf02e36f +0 -0
  142. data/test/dummy/tmp/cache/assets/CC9/9F0/sprockets%2F306166316e2cafd13c15e62b51a2339d +0 -0
  143. data/test/dummy/tmp/cache/assets/CD1/F20/sprockets%2F385e5fb31cf27e262480d1174be1d500 +0 -0
  144. data/test/dummy/tmp/cache/assets/CF7/2B0/sprockets%2F25a7c73655bd3598173b39d9f98bcd46 +0 -0
  145. data/test/dummy/tmp/cache/assets/CF8/DA0/sprockets%2Ff5b8c8499d3da954d392fa57739503c5 +0 -0
  146. data/test/dummy/tmp/cache/assets/CF9/590/sprockets%2F096bcc45cd31b3796fa2121cd203215f +0 -0
  147. data/test/dummy/tmp/cache/assets/CFE/080/sprockets%2F37fe9f4255baddbd549a659914929398 +0 -0
  148. data/test/dummy/tmp/cache/assets/D04/CC0/sprockets%2Fe9c1b92f2e437e1bbbe020d718739220 +0 -0
  149. data/test/dummy/tmp/cache/assets/D0B/090/sprockets%2F58009091c95e3ac328c91c68fca30e0e +0 -0
  150. data/test/dummy/tmp/cache/assets/D16/F90/sprockets%2F5fe3c021048c6f9a6086bed7736d87b1 +0 -0
  151. data/test/dummy/tmp/cache/assets/D1A/B50/sprockets%2F2db5892438129fe94da8429b8be114ec +0 -0
  152. data/test/dummy/tmp/cache/assets/D24/360/sprockets%2F6987b047a96dc685ba3cf39b31477f6d +0 -0
  153. data/test/dummy/tmp/cache/assets/D2D/1A0/sprockets%2F376426b4896a3cff7969ce6c7b387e0e +0 -0
  154. data/test/dummy/tmp/cache/assets/D43/0D0/sprockets%2F682843a8d0795a5fbcfeb2f0c81727d0 +0 -0
  155. data/test/dummy/tmp/cache/assets/D46/F80/sprockets%2Fb15c08e749067d7aad9baf5e9388221c +0 -0
  156. data/test/dummy/tmp/cache/assets/D6C/7D0/sprockets%2F8a05d6981ec0d38c51739bef0b3a9c2b +0 -0
  157. data/test/dummy/tmp/cache/assets/D94/FF0/sprockets%2F3b56a1aa77de0d570c38a4a9d5f4b1d6 +0 -0
  158. data/test/dummy/tmp/cache/assets/D97/6B0/sprockets%2Fb070e8c799d1a4ad5e62e0a1ae3b83e6 +0 -0
  159. data/test/dummy/tmp/cache/assets/DA6/A80/sprockets%2F92e26d8e58d5bcc8b8f6c25d1b05b9c1 +0 -0
  160. data/test/dummy/tmp/cache/assets/DA8/BB0/sprockets%2F0cf1c7e9f966dce425517c0e2a844efe +0 -0
  161. data/test/dummy/tmp/cache/assets/DC0/D20/sprockets%2F1ccf7405cd252dcec4bf23af82e2563a +0 -0
  162. data/test/dummy/tmp/cache/assets/DCF/7B0/sprockets%2Ffaa6a4d1af3261fca7b6ddc987386b90 +0 -0
  163. data/test/dummy/tmp/cache/assets/DD2/D80/sprockets%2Fc66d103807d0f971fbbcf9aa8b8b27ee +0 -0
  164. data/test/dummy/tmp/cache/assets/DFC/040/sprockets%2F15ea81cf915c0cb1dfc9cc04c9fef364 +0 -0
  165. data/test/dummy/tmp/cache/assets/DFD/300/sprockets%2Fabac9489cf7f1db8ef00d72a1571ee1e +0 -0
  166. data/test/dummy/tmp/cache/assets/E38/FE0/sprockets%2Fe1fc875efa817cbb94a5d8de25ea4e6b +0 -0
  167. data/test/dummy/tmp/cache/assets/E5F/960/sprockets%2Fdc007b6cad5c7ef08e33ec28cfff0ef6 +0 -0
  168. data/test/dummy/tmp/cache/sass/310d901c169042855feb8cf3903e1e2821d27f13/_mixins.scssc +0 -0
  169. data/test/dummy/tmp/cache/sass/3af72421a0fbed39d3047687ca0ad6e6e5545041/_base.scssc +0 -0
  170. data/test/dummy/tmp/cache/sass/3af72421a0fbed39d3047687ca0ad6e6e5545041/_icons.scssc +0 -0
  171. data/test/dummy/tmp/cache/sass/3af72421a0fbed39d3047687ca0ad6e6e5545041/_misc.scssc +0 -0
  172. data/test/dummy/tmp/cache/sass/3af72421a0fbed39d3047687ca0ad6e6e5545041/_mixins.scssc +0 -0
  173. data/test/dummy/tmp/cache/sass/3af72421a0fbed39d3047687ca0ad6e6e5545041/_resolve.scssc +0 -0
  174. data/test/dummy/tmp/cache/sass/3af72421a0fbed39d3047687ca0ad6e6e5545041/_results.scssc +0 -0
  175. data/test/dummy/tmp/cache/sass/3af72421a0fbed39d3047687ca0ad6e6e5545041/_search.scssc +0 -0
  176. data/test/dummy/tmp/cache/sass/3af72421a0fbed39d3047687ca0ad6e6e5545041/_variables.scssc +0 -0
  177. data/test/dummy/tmp/cache/sass/fb58c04fd15fcc38a8c4d91b7070bcfeaf1c3799/umlaut.css.scssc +0 -0
  178. data/test/dummy/tmp/performance/BenchmarkerTest#test_puts_foo_gc_runs.csv +0 -2
  179. data/test/dummy/tmp/performance/BenchmarkerTest#test_puts_foo_gc_time.csv +0 -2
  180. data/test/dummy/tmp/performance/BenchmarkerTest#test_puts_foo_memory.csv +0 -2
  181. data/test/dummy/tmp/performance/BenchmarkerTest#test_puts_foo_objects.csv +0 -2
  182. data/test/dummy/tmp/performance/BenchmarkerTest#test_puts_foo_wall_time.csv +0 -2
  183. data/test/dummy/tmp/performance/ProfilerTest#test_puts_foo_process_time_flat.txt +0 -11
  184. data/test/dummy/tmp/performance/ProfilerTest#test_puts_foo_process_time_graph.html +0 -303
  185. data/test/dummy/tmp/performance/ProfilerTest#test_puts_foo_process_time_stack.html +0 -546
  186. data/test/dummy/tmp/performance/ProfilerTest#test_puts_foo_process_time_tree.txt +0 -38
  187. data/test/dummy/tmp/performance/empty.png +0 -0
  188. data/test/dummy/tmp/performance/minus.png +0 -0
  189. data/test/dummy/tmp/performance/plus.png +0 -0
@@ -1,16 +1,16 @@
1
1
  # NOTE: In your SFX Admin, under Menu Configuration / API, you should enable ALL
2
2
  # 'extra' API information for full umlaut functionality.
3
3
  # With the exception of "Include openURL parameter", can't figure out how
4
- # that's useful.
4
+ # that's useful.
5
5
  #
6
6
  # config parameters in services.yml
7
7
  # display name: User displayable name for this service
8
- # base_url: SFX base url.
8
+ # base_url: SFX base url.
9
9
  # click_passthrough: DEPRECATED. Caused problems. Use the SFXBackchannelRecord
10
- # link filter service instead.
10
+ # link filter service instead.
11
11
  # When set to true, Umlaut will send all SFX clicks
12
12
  # through SFX, for SFX to capture statistics. This is currently done
13
- # using a backdoor into the SFX sfxresolve.cgi script. Defaults to false.
13
+ # using a backdoor into the SFX sfxresolve.cgi script. Defaults to false.
14
14
  # Note that
15
15
  # after SFX requests have been removed in the nightly job, the
16
16
  # click passthrough will cause an error! Set sfx_requests_expire_crontab
@@ -18,22 +18,22 @@
18
18
  # try to click passthrough with expired requests.
19
19
  # sfx_requests_expire_crontab: Crontab pattern that the SFX admin is using
20
20
  # to expire SFX requests. Used to refrain from click passthrough with
21
- # expired requests, since that is destined to fail.
22
- # services_of_interest: Optional. over-ride the built in list of what types of
21
+ # expired requests, since that is destined to fail.
22
+ # services_of_interest: Optional. over-ride the built in list of what types of
23
23
  # SFX services we want to grab, and what the corresponding umlaut types are.
24
24
  # hash, with SFX service type name as key, and Umlaut ServiceTypeValue
25
- # name as value.
25
+ # name as value.
26
26
  # extra_targets_of_interest: sfx target_names of targets you want to make
27
27
  # sure to include in umlaut. A hash with target_name as key, and umlaut
28
28
  # ResponseTypeValue name as value.
29
- # really_distant_relationships: An array of relationship type codes from SFX
29
+ # really_distant_relationships: An array of relationship type codes from SFX
30
30
  # "related objects". See Table 18 in SFX 3.0 User's Manual. Related
31
31
  # objects that have only a "really distant relationship" will NOT
32
32
  # be shown as fulltext, but will instead be banished to the see also
33
33
  # "highlighted_link" section. You must have display of related objects
34
34
  # turned ON in SFX display admin, to get related objects at all in
35
35
  # Umlaut. NOTE: This parameter has a default value to a certain set of
36
- # relationships, set to empty array [] to eliminate defaults.
36
+ # relationships, set to empty array [] to eliminate defaults.
37
37
  # sfx_timeout: in seconds, for both open/read timeout value for SFX connection.
38
38
  # Defaults to 8.
39
39
  # roll_up_prefixes: ARRAY of STRINGs, prefixes like "EBSCOHOST_". If multiple
@@ -41,7 +41,7 @@
41
41
  # they will be "rolled up" and collapsed, just the first one included
42
42
  # in response. For TITLE-LEVEL (rather than article-level) requests,
43
43
  # the roll-up algorithm is sensitive to COVERAGES, and will only suppress
44
- # targets that have coverages included in remaining non-suppressed targets.
44
+ # targets that have coverages included in remaining non-suppressed targets.
45
45
  class Sfx < Service
46
46
  require 'uri'
47
47
  require 'htmlentities'
@@ -52,14 +52,14 @@ class Sfx < Service
52
52
  #require 'open_url'
53
53
 
54
54
  required_config_params :base_url
55
-
55
+
56
56
  def initialize(config)
57
57
 
58
58
  # Key is sfx service_type, value is umlaut servicetype string.
59
59
  # These are the SFX service types we will translate to umlaut
60
60
  @services_of_interest = {'getFullTxt' => 'fulltext',
61
61
  'getSelectedFullTxt' => 'fulltext',
62
- 'getDocumentDelivery' => 'document_delivery',
62
+ 'getDocumentDelivery' => 'document_delivery',
63
63
  'getDOI' => 'highlighted_link',
64
64
  'getAbstract' => 'abstract',
65
65
  'getTOC' => 'table_of_contents'}
@@ -69,24 +69,24 @@ class Sfx < Service
69
69
  # These targets will be included even if their sfx service_type doesn't
70
70
  # match our services_of_interest, and the umlaut service ID string given
71
71
  # here will take precedence and be used even if these targets DO match
72
- # services_of_interest. Generally loaded from yml config in super.
72
+ # services_of_interest. Generally loaded from yml config in super.
73
73
  @extra_targets_of_interest = {}
74
74
 
75
75
  @sfx_timeout = 8
76
76
 
77
77
  @really_distant_relationships = ["CONTINUES_IN_PART", "CONTINUED_IN_PART_BY", "ABSORBED_IN_PART", "ABSORBED_BY"]
78
-
78
+
79
79
  # Include a CrossRef credit, becuase SFX uses CrossRef api internally,
80
- # and CrossRef ToS may require us to give credit.
80
+ # and CrossRef ToS may require us to give credit.
81
81
  @credits = {
82
82
  "SFX" => "http://www.exlibrisgroup.com/sfx.htm",
83
83
  "CrossRef" => "http://www.crossref.org/"
84
84
  }
85
-
86
- super(config)
85
+
86
+ super(config)
87
87
  end
88
88
 
89
- # Standard method, used by auto background updater. See Service docs.
89
+ # Standard method, used by auto background updater. See Service docs.
90
90
  def service_types_generated
91
91
  service_strings = []
92
92
  service_strings.concat( @services_of_interest.values() )
@@ -99,7 +99,7 @@ class Sfx < Service
99
99
  def base_url
100
100
  return @base_url
101
101
  end
102
-
102
+
103
103
  def handle(request)
104
104
  client = self.initialize_client(request)
105
105
  begin
@@ -111,12 +111,12 @@ class Sfx < Service
111
111
  return request.dispatched(self, DispatchedService::FailedTemporary, e)
112
112
  end
113
113
  end
114
-
114
+
115
115
  def initialize_client(request)
116
116
  transport = OpenURL::Transport.new(@base_url, nil, :open_timeout => @sfx_timeout, :read_timeout => @sfx_timeout)
117
-
117
+
118
118
  context_object = request.to_context_object
119
-
119
+
120
120
  ## SFX HACK WORKAROUND
121
121
  # SFX will parse private_data/pid/rft_dat containing ERIC, when sid/rfr_id
122
122
  # is CSA. But it only expects an OpenURL 0.1 to do this. We send it a
@@ -126,38 +126,38 @@ class Sfx < Service
126
126
  context_object.referent.private_data != nil)
127
127
  context_object.openurl_ver = ""
128
128
  end
129
-
129
+
130
130
  transport.add_context_object(context_object)
131
131
  transport.extra_args["sfx.response_type"]="multi_obj_xml"
132
-
133
- @get_coverage = false
134
-
135
- metadata = request.referent.metadata
132
+
133
+ @get_coverage = false
134
+
135
+ metadata = request.referent.metadata
136
136
  if ( metadata['date'].blank? &&
137
137
  metadata['year'].blank? &&
138
138
  (! request.referent.identifiers.find {|i| i =~ /^info\:(doi|pmid)/})
139
139
  )
140
- # No article-level metadata, do some special stuff.
140
+ # No article-level metadata, do some special stuff.
141
141
  transport.extra_args["sfx.ignore_date_threshold"]="1"
142
142
  transport.extra_args["sfx.show_availability"]="1"
143
143
  @get_coverage = true
144
144
  end
145
145
  # Workaround to SFX bug, not sure if this is really still neccesary
146
- # I think it's not, but leave it in anyway just in case.
146
+ # I think it's not, but leave it in anyway just in case.
147
147
  if (context_object.referent.identifiers.find {|i| i =~ /^info:doi\// })
148
148
  transport.extra_args['sfx.doi_url']='http://dx.doi.org'
149
149
  end
150
-
150
+
151
151
  return transport
152
152
  end
153
-
153
+
154
154
  def do_request(client)
155
- client.transport_inline
155
+ client.transport_inline
156
156
  return client.response
157
157
  end
158
-
158
+
159
159
  def parse_response(resolver_response, request)
160
- doc = Nokogiri::XML(resolver_response)
160
+ doc = Nokogiri::XML(resolver_response)
161
161
 
162
162
  # Catch an SFX error message (in HTML) that's not an XML
163
163
  # document at all.
@@ -177,67 +177,67 @@ class Sfx < Service
177
177
  #
178
178
  # We only enhance for journal type metadata. For book type
179
179
  # metadata SFX will return something, but it may not be the manifestation
180
- # we want. With journal titles, less of an issue.
180
+ # we want. With journal titles, less of an issue.
181
181
  #
182
182
  # In case of multiple SFX hits, enhance metadata only from the
183
183
  # one that actually had fulltext. If more than one had fulltext, forget it,
184
- # too error prone. If none had full text, just pick the first.
184
+ # too error prone. If none had full text, just pick the first.
185
185
  #
186
186
  # We'll use these variables to keep track of our 'best fit' as
187
- # we loop through em.
187
+ # we loop through em.
188
188
  best_fulltext_ctx = nil
189
189
  best_nofulltext_ctx = nil
190
190
 
191
- # We're going to keep our @really_distant_relationship stuff here.
191
+ # We're going to keep our @really_distant_relationship stuff here.
192
192
  related_titles = {}
193
-
193
+
194
194
  # We organize our responses in a queue, so we can process them
195
- # for collapse function, before actually writing to db.
195
+ # for collapse function, before actually writing to db.
196
196
  response_queue ||= {}
197
-
197
+
198
198
  0.upto(sfx_objs.length - 1 ) do |sfx_obj_index|
199
-
199
+
200
200
  sfx_obj = sfx_objs[sfx_obj_index]
201
201
 
202
202
  # Get out the "perl_data" section, with our actual OpenURL style
203
203
  # context object information. This was XML escaped as a String (actually
204
204
  # double-escaped, weirdly), so
205
205
  # we need to extract the string, unescape it, and then feed it to Nokogiri
206
- # again.
206
+ # again.
207
207
  ctx_obj_atts = sfx_obj.at('./ctx_obj_attributes').inner_text
208
208
 
209
209
  perl_data = Nokogiri::XML( ctx_obj_atts )
210
- # parse it into an OpenURL, we might need it like that.
210
+ # parse it into an OpenURL, we might need it like that.
211
211
  sfx_co = Sfx.parse_perl_data(perl_data)
212
- sfx_metadata = sfx_co.to_hash
212
+ sfx_metadata = sfx_co.to_hash
213
+
213
214
 
214
-
215
215
  # get SFX objectID
216
216
  object_id_node =
217
217
  perl_data.at("./perldata/hash/item[@key='rft.object_id']")
218
218
  object_id = object_id_node ? object_id_node.inner_text : nil
219
219
 
220
220
  # Get SFX requestID
221
- request_id_node =
221
+ request_id_node =
222
222
  perl_data.at("./perldata/hash/item[@key='sfx.request_id']")
223
223
  request_id = request_id_node ? request_id_node.inner_text : nil
224
-
224
+
225
225
  # Get targets service ids
226
226
  sfx_target_service_ids =
227
227
  sfx_obj.search('ctx_obj_targets/target/target_service_id').collect {|e| e.inner_text}
228
228
 
229
229
 
230
-
230
+
231
231
  metadata = request.referent.metadata
232
-
232
+
233
233
  # For each target delivered by SFX
234
- sfx_obj.search("./ctx_obj_targets/target").each_with_index do|target, target_index|
234
+ sfx_obj.search("./ctx_obj_targets/target").each_with_index do|target, target_index|
235
235
  response_data = {}
236
-
236
+
237
237
  # First check @extra_targets_of_interest
238
238
  sfx_target_name = target.at('./target_name').inner_text
239
239
  umlaut_service = @extra_targets_of_interest[sfx_target_name]
240
-
240
+
241
241
  # If not found, look for it in services_of_interest
242
242
  unless ( umlaut_service )
243
243
  sfx_service_type = target.at("./service_type").inner_text
@@ -248,13 +248,13 @@ class Sfx < Service
248
248
  # links for all but the first, to avoid dups. This is a bit messy,
249
249
  # but this whole multiple hits thing is messy.
250
250
  if ( sfx_obj_index > 0 &&
251
- ( umlaut_service == 'document_delivery' ||
252
- umlaut_service == 'export_citation' ||
251
+ ( umlaut_service == 'document_delivery' ||
252
+ umlaut_service == 'export_citation' ||
253
253
  umlaut_service == 'help'))
254
254
  next
255
255
  end
256
-
257
-
256
+
257
+
258
258
  # Okay, keep track of best fit ctx for metadata enhancement
259
259
  if request.referent.format == "journal"
260
260
  if ( umlaut_service == 'fulltext')
@@ -264,30 +264,30 @@ class Sfx < Service
264
264
  best_nofulltext_ctx = perl_data
265
265
  end
266
266
  end
267
-
267
+
268
268
  if ( umlaut_service ) # Okay, it's in services or targets of interest
269
269
  if (target/"./displayer")
270
270
  source = "SFX/"+(target/"./displayer").inner_text
271
271
  else
272
272
  source = "SFX"+URI.parse(self.url).path
273
273
  end
274
-
274
+
275
275
  target_service_id = (target/"./target_service_id").inner_text
276
-
276
+
277
277
  coverage = nil
278
278
  if ( @get_coverage )
279
279
  # Make sure you turn on "Include availability info in text format"
280
- # in the SFX Admin API configuration.
280
+ # in the SFX Admin API configuration.
281
281
  thresholds_str = ""
282
282
  target.search('coverage/coverage_text/threshold_text/coverage_statement').each do | threshold |
283
- thresholds_str += threshold.inner_text.to_s + ".\n";
283
+ thresholds_str += threshold.inner_text.to_s + ".\n";
284
284
  end
285
285
 
286
286
  embargoes_str = "";
287
287
  target.search('coverage/coverage_text/embargo_text/embargo_statement').each do |embargo |
288
288
  embargoes_str += embargo.inner_text.to_s + ".\n";
289
289
  end
290
-
290
+
291
291
  unless ( thresholds_str.blank? && embargoes_str.blank? )
292
292
  coverage = thresholds_str + embargoes_str
293
293
  end
@@ -296,13 +296,13 @@ class Sfx < Service
296
296
 
297
297
  related_note = ""
298
298
  # If this is from a related object, add that on as a note too...
299
- # And maybe skip this entirely!
299
+ # And maybe skip this entirely!
300
300
  if (related_node = target.at('./related_service_info'))
301
301
  relationship = related_node.at('./relation_type').inner_text
302
302
  issn = related_node.at('./related_object_issn').inner_text
303
303
  sfx_object_id = related_node.at('./related_object_id').inner_text
304
304
  title = related_node.at('./related_object_title').inner_text
305
-
305
+
306
306
  if @really_distant_relationships.include?(
307
307
  related_node.at('./relation_type').inner_text)
308
308
  # Show title-level link in see-also instead of full text.
@@ -312,17 +312,17 @@ class Sfx < Service
312
312
  :relationship => relationship,
313
313
  :issn => issn
314
314
  }
315
-
315
+
316
316
  next
317
317
  end
318
-
318
+
319
319
  related_note = "This version provided from related title: <em>" + CGI.unescapeHTML( title ) + "</em>.\n"
320
320
  end
321
-
321
+
322
322
  if ( sfx_service_type == 'getDocumentDelivery' )
323
323
  value_string = request_id
324
324
  else
325
- value_string = (target/"./target_service_id").inner_text
325
+ value_string = (target/"./target_service_id").inner_text
326
326
  end
327
327
 
328
328
  response_data[:url] = CGI.unescapeHTML((target/"./target_url").inner_text)
@@ -332,18 +332,18 @@ class Sfx < Service
332
332
  response_data[:authentication] = CGI.unescapeHTML((target/"./authentication").inner_text)
333
333
  response_data[:source] = source
334
334
  response_data[:coverage] = coverage if coverage
335
-
336
-
337
- # machine actionable coverage elements, used for collapsing
335
+
336
+
337
+ # machine actionable coverage elements, used for collapsing
338
338
  ( response_data[:coverage_begin_date], response_data[:coverage_end_date] ) =
339
339
  determine_coverage_boundaries(target)
340
-
341
-
340
+
341
+
342
342
  # Sfx metadata we want
343
343
  response_data[:sfx_base_url] = @base_url
344
344
  response_data[:sfx_obj_index] = sfx_obj_index + 1 # sfx is 1 indexed
345
345
  response_data[:sfx_target_index] = target_index + 1
346
- # sometimes the sfx.request_id is missing, go figure.
346
+ # sometimes the sfx.request_id is missing, go figure.
347
347
  if request_id = (perl_data/"//hash/item[@key='sfx.request_id']").first
348
348
  response_data[:sfx_request_id] = request_id.inner_text
349
349
  end
@@ -352,31 +352,31 @@ class Sfx < Service
352
352
  # At url-generation time, the request isn't available to us anymore,
353
353
  # so we better store this citation info here now, since we need it
354
354
  # for sfx click passthrough
355
-
355
+
356
356
  # Oops, need to take this from SFX delivered metadata.
357
-
358
- response_data[:citation_year] = sfx_metadata['rft.date'].to_s[0,4] if sfx_metadata['rft.date']
357
+
358
+ response_data[:citation_year] = sfx_metadata['rft.date'].to_s[0,4] if sfx_metadata['rft.date']
359
359
  response_data[:citation_volume] = sfx_metadata['rft.volume'];
360
360
  response_data[:citation_issue] = sfx_metadata['rft.issue']
361
361
  response_data[:citation_spage] = sfx_metadata['rft.spage']
362
362
 
363
363
  # Some debug info
364
364
  response_data[:debug_info] =" Target: #{sfx_target_name} ; SFX object ID: #{object_id}"
365
-
365
+
366
366
  response_data[:display_text] = (target/"./target_public_name").inner_text
367
-
367
+
368
368
  response_data.merge!(
369
- :service => self,
369
+ :service => self,
370
370
  :service_type_value => umlaut_service
371
371
  )
372
-
372
+
373
373
  #request.add_service_response( response_data )
374
374
  # We add the response_data to a list for now, so we can post-process
375
- # for collapse feature before we actually add them.
375
+ # for collapse feature before we actually add them.
376
376
  response_queue[umlaut_service] ||= []
377
377
  response_queue[umlaut_service] << response_data
378
-
379
-
378
+
379
+
380
380
  end
381
381
  end
382
382
  end
@@ -384,39 +384,39 @@ class Sfx < Service
384
384
  if response_queue["fulltext"].present?
385
385
  response_queue["fulltext"] = roll_up_responses(response_queue["fulltext"], :coverage_sensitive => request.title_level_citation? )
386
386
  end
387
-
388
- # Now that they've been post-processed, actually commit them.
387
+
388
+ # Now that they've been post-processed, actually commit them.
389
389
  response_queue.each_pair do |type, list|
390
- list.each do |response|
390
+ list.each do |response|
391
391
  request.add_service_response( response )
392
392
  end
393
393
  end
394
-
394
+
395
395
  # Add in links to our related titles
396
396
  related_titles.each_pair do |issn, hash|
397
- request.add_service_response(
397
+ request.add_service_response(
398
398
  :service => self,
399
399
  :display_text => "#{sfx_relationship_display(hash[:relationship])}: #{hash[:title]}",
400
400
  :notes => "#{ServiceTypeValue['fulltext'].display_name} available",
401
- :related_object_hash => hash,
401
+ :related_object_hash => hash,
402
402
  :service_type_value => "highlighted_link")
403
403
  end
404
-
404
+
405
405
  # Did we find a ctx best fit for enhancement?
406
406
  if best_fulltext_ctx
407
407
  enhance_referent(request, best_fulltext_ctx)
408
408
  elsif best_nofulltext_ctx
409
409
  enhance_referent(request, best_nofulltext_ctx)
410
410
  end
411
-
411
+
412
412
  end
413
413
 
414
- # pass in a nokogiri element for <target>, we'll calculate
414
+ # pass in a nokogiri element for <target>, we'll calculate
415
415
  # ruby Date objects for begin date and end date of coverage,
416
- # passed out as a two-element array [begin, end].
416
+ # passed out as a two-element array [begin, end].
417
417
  #
418
- # taking embargoes into account. nil if unbounded.
419
- def determine_coverage_boundaries(target)
418
+ # taking embargoes into account. nil if unbounded.
419
+ def determine_coverage_boundaries(target)
420
420
  # machine actionable coverage elements, used for collapsing
421
421
  if (in_node = target.at_xpath("./coverage/in"))
422
422
  year = in_node.at_xpath("year").try(:text).try(:to_i)
@@ -425,72 +425,72 @@ class Sfx < Service
425
425
  end_date = Date.new(year, 12, 31)
426
426
  end
427
427
  end
428
-
429
- if (from = target.at_xpath("./coverage/from"))
430
- year = from.at_xpath("year").try(:text).try(:to_i)
428
+
429
+ if (from = target.at_xpath("./coverage/from"))
430
+ year = from.at_xpath("year").try(:text).try(:to_i)
431
431
  # SFX KB does not have month/day, only year, set to begin of year
432
432
  begin_date = Date.new(year, 1, 1) if year && year != 0
433
433
  end
434
-
435
- if (from = target.at_xpath("./coverage/to"))
434
+
435
+ if (from = target.at_xpath("./coverage/to"))
436
436
  year = from.at_xpath("year").try(:text).try(:to_i)
437
437
  # set to end of year
438
438
  end_date = Date.new(year, 12, 31) if year && year != 0
439
439
  end
440
-
441
-
442
-
440
+
441
+
442
+
443
443
  # If there's an embargo too, it may modify existing dates
444
444
  if (embargo = target.at_xpath("./coverage/embargo"))
445
445
  days = embargo.at_xpath("days").try(:text).try(:to_i)
446
446
  days.try do |days|
447
447
  embargo_days = Date.today - days
448
448
  if embargo.at_xpath("availability").try(:text) == "available"
449
- # only most recent X days, at earliest start
450
- begin_date =
451
- [begin_date || embargo_days, embargo_days].max
449
+ # only most recent X days, at earliest start
450
+ begin_date =
451
+ [begin_date || embargo_days, embargo_days].max
452
452
  else # not_available
453
453
  # stops at most recent X days, at latest end
454
- end_date =
454
+ end_date =
455
455
  [end_date || embargo_days, embargo_days].min
456
456
  end
457
457
  end
458
458
  end
459
459
  return [begin_date, end_date]
460
460
  end
461
-
461
+
462
462
  # Pass in a list of hashes for making ServiceResponse's, we will roll up
463
463
  # those that should be rolled up per roll_up_prefixes configuration.
464
464
  #
465
465
  # In :coverage_sensitive => true, will roll up sensitive to overlapping
466
- # coverage to not remove any coverage.
466
+ # coverage to not remove any coverage.
467
467
  #
468
468
  # Does not mutate list passed in, don't try to change it to mutate,
469
- # makes it hard to deal with list changing from underneath you in logic.
469
+ # makes it hard to deal with list changing from underneath you in logic.
470
470
  def roll_up_responses(list, options = {})
471
471
  options = options.reverse_merge(:coverage_sensitive => true)
472
-
472
+
473
473
  prefixes = @roll_up_prefixes
474
-
475
- # If not configured for roll-up, just return it directly.
474
+
475
+ # If not configured for roll-up, just return it directly.
476
476
  return list unless prefixes.present?
477
477
 
478
-
478
+
479
479
  if options[:coverage_sensitive] == true
480
480
  # roll up targets with same prefix only if coverage is a strict
481
- # subset of an existing one. If two are equal, take first.
481
+ # subset of an existing one. If two are equal, take first.
482
482
  list = list.reject.each_with_index do |item, index|
483
- prefix = prefixes.find {|p| item[:sfx_target_name].start_with?(p)}
483
+ prefix = prefixes.find {|p| item[:sfx_target_name].start_with?(p)}
484
484
  bdate = item[:coverage_begin_date] || Date.new(1,1,1)
485
485
  edate = item[:coverage_end_date] || Date.today
486
-
486
+
487
487
  prefix && (
488
488
  # earlier is equal or superset
489
489
  list.slice(0, index).find do |candidate|
490
490
  # nil considered very early or very late, unbounded
491
491
  candidate_bdate = candidate[:coverage_begin_date] || Date.new(1,1,1)
492
492
  candidate_edate = candidate[:coverage_end_date] || Date.today
493
-
493
+
494
494
  candidate[:sfx_target_name].start_with?(prefix) &&
495
495
  (candidate_bdate <= bdate) && (candidate_edate >= edate)
496
496
  end ||
@@ -498,44 +498,44 @@ class Sfx < Service
498
498
  list.slice(index+1, list.length).find do |candidate|
499
499
  candidate_bdate = (candidate[:coverage_begin_date] || Date.new(1,1,1))
500
500
  candidate_edate = (candidate[:coverage_end_date] || Date.today)
501
-
501
+
502
502
  candidate[:sfx_target_name].start_with?(prefix) &&
503
503
  (candidate_bdate <= bdate) && (candidate_edate >= edate) &&
504
504
  (! (bdate == candidate_bdate && edate == candidate_edate))
505
505
  end
506
506
  )
507
- end
507
+ end
508
508
  else # not coverage_sensitive
509
509
  # Just roll up to FIRST of each prefix
510
510
  list = list.reject.each_with_index do |item, index|
511
511
  prefix = prefixes.find {|p| item[:sfx_target_name].start_with?(p)}
512
-
512
+
513
513
  prefix && list.slice(0,index).find do |candidate|
514
514
  candidate[:sfx_target_name].start_with?(prefix)
515
- end
515
+ end
516
516
  end
517
517
  end
518
-
519
-
518
+
519
+
520
520
  return list
521
521
  end
522
-
523
-
522
+
523
+
524
524
  def sfx_click_passthrough
525
- # From config, or default to false.
525
+ # From config, or default to false.
526
526
  return @click_passthrough || false;
527
527
  end
528
528
 
529
529
  # Using the value of sfx_request_expire_crontab, determine if the
530
530
  # umlaut service response is so old that we can't use it for
531
- # sfx click passthrough anymore.
531
+ # sfx click passthrough anymore.
532
532
  def expired_sfx_request(response)
533
533
  require 'cron_tab'
534
534
 
535
535
  crontab_str = @sfx_requests_expire_crontab
536
536
 
537
537
  return false unless crontab_str # no param, no determination possible
538
-
538
+
539
539
  crontab = CronTab.new( crontab_str )
540
540
 
541
541
  time_of_response = response.created_at
@@ -545,21 +545,21 @@ class Sfx < Service
545
545
  expire_time = crontab.nexttime( time_of_response )
546
546
 
547
547
  # Give an extra five minutes of time, in case the expire
548
- # process takes up to five minutes to finish.
549
- return( Time.now > (expire_time + 5.minutes) )
548
+ # process takes up to five minutes to finish.
549
+ return( Time.now > (expire_time + 5.minutes) )
550
550
  end
551
551
 
552
552
  # Try to provide a weird reverse-engineered url to take the user THROUGH
553
553
  # sfx to their destination, so sfx will capture for statistics.
554
554
  # This relies on certain information from the orignal sfx response
555
555
  # being stored in the Response object at that point. Used by
556
- # sfx_backchannel_record service.
556
+ # sfx_backchannel_record service.
557
557
  def self.pass_through_url(response)
558
- base_url = response[:sfx_base_url]
559
-
560
- sfx_resolver_cgi_url = base_url + "/cgi/core/sfxresolver.cgi"
558
+ base_url = response[:sfx_base_url]
559
+
560
+ sfx_resolver_cgi_url = base_url + "/cgi/core/sfxresolver.cgi"
561
+
561
562
 
562
-
563
563
  dataString = "?tmp_ctx_svc_id=#{response[:sfx_target_index]}"
564
564
  dataString += "&tmp_ctx_obj_id=#{response[:sfx_obj_index]}"
565
565
 
@@ -568,9 +568,9 @@ class Sfx < Service
568
568
  # Really have no idea when it would need to be something other
569
569
  # than 1.
570
570
  # Nope, sad to say it does mess up cases where it is not neccesary.
571
- # Grr.
571
+ # Grr.
572
572
  #dataString += "&tmp_parent_ctx_obj_id=1"
573
-
573
+
574
574
  dataString += "&service_id=#{response[:sfx_target_service_id]}"
575
575
  dataString += "&request_id=#{response[:sfx_request_id]}"
576
576
  dataString += "&rft.year="
@@ -581,29 +581,29 @@ class Sfx < Service
581
581
  dataString += URI.escape(response[:citation_issue].to_s) if response[:citation_issue]
582
582
  dataString += "&rft.spage="
583
583
  dataString += URI.escape(response[:citation_spage]).to_s if response[:citation_spage]
584
-
585
- return sfx_resolver_cgi_url + dataString
584
+
585
+ return sfx_resolver_cgi_url + dataString
586
586
  end
587
587
 
588
588
  # Class method to parse a perl_data block as XML in String
589
589
  # into a ContextObject. Argument is Nokogiri doc containing
590
- # the SFX <perldata> element and children.
591
- def self.parse_perl_data(doc)
590
+ # the SFX <perldata> element and children.
591
+ def self.parse_perl_data(doc)
592
592
 
593
593
  co = OpenURL::ContextObject.new
594
594
  co.referent.set_format('journal') # default
595
595
 
596
- html_ent_coder = HTMLEntities.new
597
-
596
+ html_ent_coder = HTMLEntities.new
597
+
598
598
  doc.search('perldata/hash/item').each do |item|
599
599
  key = item['key'].to_s
600
-
600
+
601
601
  value = item.inner_text
602
-
602
+
603
603
  # SFX sometimes returns invalid UTF8 (is it really ISO 8859? Is it
604
604
  # predictable? Who knows. If it's not valid, it'll cause all
605
605
  # sorts of problems later. So if it's not valid, we're just
606
- # going to ignore it, sorry.
606
+ # going to ignore it, sorry.
607
607
  next unless value.valid_encoding?
608
608
 
609
609
  # Some normalization. SFX uses rft.year, which is not actually
@@ -611,30 +611,30 @@ class Sfx < Service
611
611
  key = "rft.date" if key == "rft.year"
612
612
 
613
613
  prefix, stripped = key.split('.')
614
-
614
+
615
615
  # The auinit1 value is COMPLETELY messed up for reasons I do not know.
616
616
  # Double encoded in bizarre ways.
617
617
  next if key == '@rft.auinit1' || key == '@rft.auinit'
618
618
 
619
619
 
620
620
 
621
-
621
+
622
622
  # Darn multi-value SFX hackery, indicated with keys beginning
623
623
  # with '@'. Just take the first one,
624
624
  # our context object can't store more than one. Then regularize the
625
- # key name.
625
+ # key name.
626
626
  if (prefix == '@rft')
627
627
  array_items = item.search("array/item")
628
628
  array_i = array_items[0] unless array_items.blank?
629
-
629
+
630
630
  prefix = prefix.slice(1, prefix.length)
631
- value = array_i ? array_i.inner_text : nil
631
+ value = array_i ? array_i.inner_text : nil
632
632
  end
633
-
633
+
634
634
  # But this still has HTML entities in it sometimes. Now we've
635
635
  # got to decode THAT.
636
636
  # TODO: Are we sure we need to do this? We need an example
637
- # from SFX result to test, it's potentially expensive.
637
+ # from SFX result to test, it's potentially expensive.
638
638
  value = html_ent_coder.decode(value)
639
639
 
640
640
  # object_type? Fix that to be the right way.
@@ -642,7 +642,7 @@ class Sfx < Service
642
642
  co.referent.set_format( value.downcase )
643
643
  next
644
644
  end
645
-
645
+
646
646
  if (prefix == 'rft' && value)
647
647
  co.referent.set_metadata(stripped, value)
648
648
  end
@@ -663,33 +663,33 @@ class Sfx < Service
663
663
  return co
664
664
  end
665
665
 
666
- # Custom url generation for the weird case
666
+ # Custom url generation for the weird case
667
667
  def response_url(service_response, submitted_params)
668
668
  if (related_object = service_response.data_values[:related_object_hash])
669
669
  {:controller => 'resolve', "rft.issn" => related_object[:issn], "rft.title" => related_object[:title], "rft.object_id" => related_object[:sfx_object_id] }
670
670
  else
671
671
  service_response['url']
672
- end
672
+ end
673
673
  end
674
-
674
+
675
675
  protected
676
676
  # Second argument is a Nokogiri element representing the <perldata>
677
- # tag and children.
677
+ # tag and children.
678
678
  def enhance_referent(request, perl_data)
679
679
  ActiveRecord::Base.connection_pool.with_connection do
680
680
  metadata = request.referent.metadata
681
-
681
+
682
682
  sfx_co = Sfx.parse_perl_data(perl_data)
683
-
683
+
684
684
  sfx_metadata = sfx_co.referent.metadata
685
685
  # Do NOT enhance for metadata type 'BOOK', unreliable matching from
686
686
  # SFX!
687
687
  return if sfx_metadata["object_type"] == "BOOK" || sfx_metadata["genre"] == "book"
688
-
688
+
689
689
  # If we already had metadata for journal title and the SFX one
690
690
  # differs, we want to over-write it. This is good for ambiguous
691
691
  # incoming OpenURLs, among other things.
692
-
692
+
693
693
  if request.referent.format == 'journal'
694
694
  request.referent.enhance_referent("jtitle", sfx_metadata['jtitle'])
695
695
  end
@@ -697,27 +697,27 @@ class Sfx < Service
697
697
  if request.referent.format == 'journal' && ! sfx_metadata['issn'].blank?
698
698
  request.referent.enhance_referent('issn', sfx_metadata['issn'])
699
699
  end
700
-
701
-
700
+
701
+
702
702
  # The rest, we write only if blank, we don't over-write
703
703
  sfx_metadata.each do |key, value|
704
704
  if (metadata[key].blank?)
705
-
706
- # watch out for SFX's weird array values.
705
+
706
+ # watch out for SFX's weird array values.
707
707
  request.referent.enhance_referent(key, value)
708
708
  end
709
709
  end
710
- end
710
+ end
711
711
  end
712
712
 
713
713
 
714
-
715
- # From Table 18 in SFX General User's Guide 3.0.
714
+
715
+ # From Table 18 in SFX General User's Guide 3.0.
716
716
  def sfx_relationship_display(sfx_code)
717
717
  sfx_code = sfx_code.to_s
718
718
  # Most can simply be #humanized, a couple of over-rides
719
719
  @sfx_relationship_display ||= {
720
- "TRANSLATION_ENTRY" => "Translation",
720
+ "TRANSLATION_ENTRY" => "Translation",
721
721
  }
722
722
 
723
723
  display = @sfx_relationship_display[sfx_code]
@@ -725,6 +725,6 @@ class Sfx < Service
725
725
 
726
726
  return display
727
727
  end
728
-
728
+
729
729
  end
730
-
730
+